class RailsInfo::CodePresenter < ::RailsInfo::Presenter
def initialize(subject, options = {})
super(subject, options)
@code = options[:text]
@line_number = options[:number]
@line_numbers = options[:line_numbers]
@highlighted_line_numbers = options[:highlighted_line_numbers] || []
@highlighted_line_numbers = @highlighted_line_numbers.is_a?(Array) ? @highlighted_line_numbers : [@highlighted_line_numbers]
@highlighted_number_name = options[:highlighted_number_name]
end
def table
outer_html = ''
unless @line_numbers.include?(@line_number)
outer_html = content_tag(:p) do
content_tag :strong do
raw(
"Line number #{@line_number.inspect} is either an empty line or not included (anymore).
" +
"So highlighting the nearest line."
)
end
end
end
outer_html + content_tag(:table, cellspacing: 0, cellpadding: 0) do
html, visible_line_number = '', 1
@line_numbers.each do |line_number|
html += content_tag :tr do
tr_html = ''
if @highlighted_line_numbers.include?(visible_line_number)
#line_number_link = link_to line_number.to_s, "#top", name: @highlighted_number_name.parameterize
tr_html = content_tag :td, line_number, class: 'hll'
else
tr_html = content_tag :td, line_number
end
if line_number == @line_numbers.first
options = @highlighted_line_numbers ? {hl_lines: @highlighted_line_numbers } : {}
# 1) This Ruby wrapped Python code can cause Ruby segmentation faults.
# If you can abandon syntax highlighting deactivate 1) and use 2) instead
code = ::Pygments.highlight(@code, lexer: 'ruby', options: options) rescue @code.gsub(/\n/, '
').gsub(' ', ' ')
# 2)
# code = @code.gsub(/\n/, '
').gsub(' ', ' ')
tr_html += content_tag :td, raw(code), rowspan: @line_numbers.length
end
raw tr_html
end
visible_line_number += 1
end
raw html
end
end
end