diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/gitlab/highlight.rb | 5 | ||||
-rw-r--r-- | lib/rouge/formatters/html_gitlab.rb | 81 |
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 |