summaryrefslogtreecommitdiff
path: root/lib/redcarpet/render/gitlab_html.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/redcarpet/render/gitlab_html.rb')
-rw-r--r--lib/redcarpet/render/gitlab_html.rb60
1 files changed, 38 insertions, 22 deletions
diff --git a/lib/redcarpet/render/gitlab_html.rb b/lib/redcarpet/render/gitlab_html.rb
index c3378d6a18f..10efff2ae9f 100644
--- a/lib/redcarpet/render/gitlab_html.rb
+++ b/lib/redcarpet/render/gitlab_html.rb
@@ -3,30 +3,47 @@ class Redcarpet::Render::GitlabHTML < Redcarpet::Render::HTML
attr_reader :template
alias_method :h, :template
- def initialize(template, options = {})
+ def initialize(template, color_scheme, options = {})
@template = template
+ @color_scheme = color_scheme
@project = @template.instance_variable_get("@project")
@options = options.dup
super options
end
+ def preprocess(full_document)
+ # Redcarpet doesn't allow SMB links when `safe_links_only` is enabled.
+ # FTP links are allowed, so we trick Redcarpet.
+ full_document.gsub("smb://", "ftp://smb:")
+ end
+
+ # If project has issue number 39, apostrophe will be linked in
+ # regular text to the issue as Redcarpet will convert apostrophe to
+ # #39;
+ # We replace apostrophe with right single quote before Redcarpet
+ # does the processing and put the apostrophe back in postprocessing.
+ # This only influences regular text, code blocks are untouched.
+ def normal_text(text)
+ return text unless text.present?
+ text.gsub("'", "&rsquo;")
+ end
+
+ # Stolen from Rugments::Plugins::Redcarpet as this module is not required
+ # from Rugments's gem root.
def block_code(code, language)
- # New lines are placed to fix an rendering issue
- # with code wrapped inside <h1> tag for next case:
- #
- # # Title kinda h1
- #
- # ruby code here
- #
- <<-HTML
-
-<div class="highlighted-data #{h.user_color_scheme_class}">
- <div class="highlight">
- <pre><code class="#{language}">#{h.send(:html_escape, code)}</code></pre>
- </div>
-</div>
-
- HTML
+ lexer = Rugments::Lexer.find_fancy(language, code) || Rugments::Lexers::PlainText
+
+ # XXX HACK: Redcarpet strips hard tabs out of code blocks,
+ # so we assume you're not using leading spaces that aren't tabs,
+ # and just replace them here.
+ if lexer.tag == 'make'
+ code.gsub! /^ /, "\t"
+ end
+
+ formatter = Rugments::Formatters::HTML.new(
+ cssclass: "code highlight #{@color_scheme} #{lexer.tag}"
+ )
+ formatter.format(lexer.lex(code))
end
def link(link, title, content)
@@ -44,13 +61,12 @@ class Redcarpet::Render::GitlabHTML < Redcarpet::Render::HTML
end
def postprocess(full_document)
+ full_document.gsub!("ftp://smb:", "smb://")
+
+ full_document.gsub!("&rsquo;", "'")
unless @template.instance_variable_get("@project_wiki") || @project.nil?
full_document = h.create_relative_links(full_document)
end
- if @options[:parse_tasks]
- h.gfm_with_tasks(full_document)
- else
- h.gfm(full_document)
- end
+ h.gfm_with_options(full_document, @options)
end
end