Commit e1824aa1 authored by http://jneen.net/'s avatar http://jneen.net/

use the new token_lines interface to format lines

parent 34a3d2a3
...@@ -47,10 +47,7 @@ module Gitlab ...@@ -47,10 +47,7 @@ module Gitlab
end end
def rouge_formatter(options = {}) def rouge_formatter(options = {})
Rouge::Formatters::HTMLGitlab.new( Rouge::Formatters::HTMLGitlab.new
lineanchors: true,
lineanchorsid: 'LC'
)
end end
end end
end end
...@@ -2,83 +2,24 @@ require 'cgi' ...@@ -2,83 +2,24 @@ require 'cgi'
module Rouge module Rouge
module Formatters module Formatters
class HTMLGitlab < Rouge::Formatter class HTMLGitlab < Rouge::Formatters::HTML
tag 'html_gitlab' tag 'html_gitlab'
# Creates a new <tt>Rouge::Formatter::HTMLGitlab</tt> instance. # Creates a new <tt>Rouge::Formatter::HTMLGitlab</tt> instance.
# #
# [+cssclass+] CSS class for the wrapping <tt><div></tt> tag # [+linenostart+] The line number for the first line (default: 1).
# (default: 'highlight'). def initialize(linenostart: 1)
# [+lineanchors+] If set to true the formatter will wrap each output @linenostart = linenostart
# line in an anchor tag with a name of L-linenumber. @line_number = linenostart
# This allows easy linking to certain lines
# (default: false).
# [+lineanchorsid+] If lineanchors is true the name of the anchors can
# be changed with lineanchorsid to e.g. foo-linenumber
# (default: 'L').
def initialize(
lineanchors: false,
lineanchorsid: 'L'
)
@lineanchors = lineanchors
@lineanchorsid = lineanchorsid
end end
def render(tokens) def stream(tokens, &b)
data = process_tokens(tokens) token_lines(tokens) do |line|
yield %<<span id="LC#{@line_number}" class="line">>
line.each { |token, value| yield span(token, value) }
yield %<</span>\n>
wrap_lines(data[:code]) @line_number += 1
end
alias_method :format, :render
private
def process_tokens(tokens)
rendered = []
current_line = ''
tokens.each do |tok, val|
# In the case of multi-line values (e.g. comments), we need to apply
# styling to each line since span elements are inline.
val.lines.each do |line|
stripped = line.chomp
current_line << span(tok, stripped)
if line.end_with?("\n")
rendered << current_line
current_line = ''
end
end
end
# Add leftover text
rendered << current_line if current_line.present?
{ code: rendered }
end
def wrap_lines(lines)
if @lineanchors
lines = lines.each_with_index.map do |line, index|
number = index + @linenostart
"<span id=\"#{@lineanchorsid}#{number}\" class=\"line\">#{line}" \
'</span>'
end
end
lines.join("\n")
end
def span(tok, val)
# http://stackoverflow.com/a/1600584/2587286
val = CGI.escapeHTML(val)
if tok.shortname.empty?
val
else
"<span class=\"#{tok.shortname}\">#{val}</span>"
end end
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment