./lib/dolt/view/markup.rb in dolt-0.5.0 vs ./lib/dolt/view/markup.rb in dolt-0.5.1

- old
+ new

@@ -19,19 +19,89 @@ module Dolt module View module Markup def render_markup(path, content) + content = highlight_code_blocks(path, content) markup = GitHub::Markup.render(path, content) "<div class=\"gts-markup\">#{markup}</div>" end def supported_markup_format?(path) GitHub::Markup.can_render?(path) end def format_text_blob(path, code, repo = nil, ref = nil) render_markup(path, code) + end + + def highlight_code_blocks(path, markup) + return markup unless path =~ /\.(md|mkdn?|mdwn|mdown|markdown)$/ + can_highlight = respond_to?(:highlight) + CodeBlockParser.parse(markup) do |lexer, code| + code = can_highlight ? highlight(path, code, { :lexer => lexer }) : code + l = can_highlight ? Pygments::Lexer.find(lexer) : nil + "<pre class=\"#{l && l.aliases.first} prettyprint\">#{code}</pre>" + end + end + end + + class CodeBlockParser + attr_reader :lines + + def self.parse(markup, &block) + new(markup).parse(&block) + end + + def initialize(markup) + @lines = markup.split("\n") + @current_code_bock = nil + end + + def parse(&block) + result = [] + + while line = @lines.shift + if closes_code_block?(line) + result << block.call(*close_active_code_block) + elsif active_code_block? + append_active_code_block(line) + elsif starts_code_block?(line) + start_code_block(line) + else + result << line + end + end + + result.join("\n") + end + + def active_code_block? + !@current_code_bock.nil? + end + + def starts_code_block?(line) + line.match(/^```.*/) + end + + def closes_code_block?(line) + active_code_block? && line == "```" + end + + def start_code_block(line) + m = line.match(/```([^\s]+)/) + @current_code_bock = [m && m[1], []] + end + + def append_active_code_block(line) + @current_code_bock[1] << line + end + + def close_active_code_block + lexer = @current_code_bock[0] + code = @current_code_bock[1].join("\n") + @current_code_bock = nil + [lexer, code] end end end end