module GitlabMarkdownHelper # Replaces references (i.e. @abc, #123, !456, ...) in the text with links to # the appropriate items in GitLab. # # text - the source text # html_options - extra options for the reference links as given to link_to # # note: reference links will only be generated if @project is set # # see Gitlab::Markdown for details on the supported syntax def gfm(text, html_options = {}) return text if text.nil? return text if @project.nil? # Extract pre blocks so they are not altered # from http://github.github.com/github-flavored-markdown/ extractions = {} text.gsub!(%r{
.*?
|.*?}m) do |match| md5 = Digest::MD5.hexdigest(match) extractions[md5] = match "{gfm-extraction-#{md5}}" end # TODO: add popups with additional information parser = Gitlab::Markdown.new(@project, html_options) text = parser.parse(text) # Insert pre block extractions text.gsub!(/\{gfm-extraction-(\h{32})\}/) do extractions[$1] end sanitize text.html_safe, attributes: ActionView::Base.sanitized_allowed_attributes + %w(id class ) end # Use this in places where you would normally use link_to(gfm(...), ...). # # It solves a problem occurring with nested links (i.e. # "outer text gfm ref more outer text"). This will not be # interpreted as intended. Browsers will parse something like # "outer text gfm ref more outer text" (notice the last part is # not linked any more). link_to_gfm corrects that. It wraps all parts to # explicitly produce the correct linking behavior (i.e. # "outer text gfm ref more outer text"). def link_to_gfm(body, url, html_options = {}) gfm_body = gfm(body, html_options) gfm_body.gsub!(%r{.*?}m) do |match| "#{match}#{link_to("", url, html_options)[0..-5]}" # "".length +1 end link_to(gfm_body.html_safe, url, html_options) end def markdown(text) unless @markdown gitlab_renderer = Redcarpet::Render::GitlabHTML.new(self, # see https://github.com/vmg/redcarpet#darling-i-packed-you-a-couple-renderers-for-lunch- filter_html: true, with_toc_data: true, hard_wrap: true) @markdown ||= Redcarpet::Markdown.new(gitlab_renderer, # see https://github.com/vmg/redcarpet#and-its-like-really-simple-to-use no_intra_emphasis: true, tables: true, fenced_code_blocks: true, autolink: true, strikethrough: true, lax_html_blocks: true, space_after_headers: true, superscript: true) end @markdown.render(text).html_safe end end