1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
# -*- coding: utf-8 -*- #
# frozen_string_literal: true
module Rouge
module Formatters
class HTMLTable < Formatter
tag 'html_table'
def initialize(inner, opts={})
@inner = inner
@start_line = opts.fetch(:start_line, 1)
@line_format = opts.fetch(:line_format, '%i')
@table_class = opts.fetch(:table_class, 'rouge-table')
@gutter_class = opts.fetch(:gutter_class, 'rouge-gutter')
@code_class = opts.fetch(:code_class, 'rouge-code')
end
def style(scope)
yield %(#{scope} .rouge-table { border-spacing: 0 })
yield %(#{scope} .rouge-gutter { text-align: right })
end
def stream(tokens, &b)
last_val = nil
num_lines = tokens.reduce(0) {|count, (_, val)| count + (last_val = val).count(?\n) }
formatted = @inner.format(tokens)
unless last_val && last_val.end_with?(?\n)
num_lines += 1
formatted << ?\n
end
# generate a string of newline-separated line numbers for the gutter>
formatted_line_numbers = (@start_line..(@start_line + num_lines - 1)).map do |i|
sprintf(@line_format, i)
end.join(?\n) << ?\n
buffer = [%(<table class="#@table_class"><tbody><tr>)]
# the "gl" class applies the style for Generic.Lineno
buffer << %(<td class="#@gutter_class gl">)
buffer << %(<pre class="lineno">#{formatted_line_numbers}</pre>)
buffer << '</td>'
buffer << %(<td class="#@code_class"><pre>)
buffer << formatted
buffer << '</pre></td>'
buffer << '</tr></tbody></table>'
yield buffer.join
end
end
end
end
|