summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhttp://jneen.net/ <jneen@jneen.net>2016-06-15 12:32:55 -0700
committerhttp://jneen.net/ <jneen@jneen.net>2016-07-14 10:08:15 -0700
commite1824aa101a2181fe7e5ce080582cfa188d19da8 (patch)
tree2cd8c031e7c86fa06f10357e1f124eeccefe125e
parent34a3d2a340b5d235da3958176bca6e0de6679a0f (diff)
downloadgitlab-ce-e1824aa101a2181fe7e5ce080582cfa188d19da8.tar.gz
use the new token_lines interface to format lines
-rw-r--r--lib/gitlab/highlight.rb5
-rw-r--r--lib/rouge/formatters/html_gitlab.rb81
2 files changed, 12 insertions, 74 deletions
diff --git a/lib/gitlab/highlight.rb b/lib/gitlab/highlight.rb
index aaef569d870..ba157cc98cc 100644
--- a/lib/gitlab/highlight.rb
+++ b/lib/gitlab/highlight.rb
@@ -47,10 +47,7 @@ module Gitlab
end
def rouge_formatter(options = {})
- Rouge::Formatters::HTMLGitlab.new(
- lineanchors: true,
- lineanchorsid: 'LC'
- )
+ Rouge::Formatters::HTMLGitlab.new
end
end
end
diff --git a/lib/rouge/formatters/html_gitlab.rb b/lib/rouge/formatters/html_gitlab.rb
index b9e3272e0b5..723bac574dd 100644
--- a/lib/rouge/formatters/html_gitlab.rb
+++ b/lib/rouge/formatters/html_gitlab.rb
@@ -2,83 +2,24 @@ require 'cgi'
module Rouge
module Formatters
- class HTMLGitlab < Rouge::Formatter
+ class HTMLGitlab < Rouge::Formatters::HTML
tag 'html_gitlab'
# Creates a new <tt>Rouge::Formatter::HTMLGitlab</tt> instance.
#
- # [+cssclass+] CSS class for the wrapping <tt><div></tt> tag
- # (default: 'highlight').
- # [+lineanchors+] If set to true the formatter will wrap each output
- # line in an anchor tag with a name of L-linenumber.
- # 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
+ # [+linenostart+] The line number for the first line (default: 1).
+ def initialize(linenostart: 1)
+ @linenostart = linenostart
+ @line_number = linenostart
end
- def render(tokens)
- data = process_tokens(tokens)
+ def stream(tokens, &b)
+ 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])
- 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>"
+ @line_number += 1
end
end
end