Commit fe78984f authored by Douwe Maan's avatar Douwe Maan

Actually ignore references in code blocks etc.

parent 5a1aa49b
...@@ -41,29 +41,26 @@ module GitlabMarkdownHelper ...@@ -41,29 +41,26 @@ module GitlabMarkdownHelper
fragment.to_html.html_safe fragment.to_html.html_safe
end end
MARKDOWN_OPTIONS = {
no_intra_emphasis: true,
tables: true,
fenced_code_blocks: true,
strikethrough: true,
lax_spacing: true,
space_after_headers: true,
superscript: true,
footnotes: true
}.freeze
def markdown(text, options={}) def markdown(text, options={})
unless @markdown && options == @options unless @markdown && options == @options
@options = options @options = options
options.merge!(
# Handled further down the line by Gitlab::Markdown::SanitizationFilter
escape_html: false
)
# see https://github.com/vmg/redcarpet#darling-i-packed-you-a-couple-renderers-for-lunch # see https://github.com/vmg/redcarpet#darling-i-packed-you-a-couple-renderers-for-lunch
rend = Redcarpet::Render::GitlabHTML.new(self, user_color_scheme_class, options) rend = Redcarpet::Render::GitlabHTML.new(self, user_color_scheme_class, options)
# see https://github.com/vmg/redcarpet#and-its-like-really-simple-to-use # see https://github.com/vmg/redcarpet#and-its-like-really-simple-to-use
@markdown = Redcarpet::Markdown.new(rend, @markdown = Redcarpet::Markdown.new(rend, MARKDOWN_OPTIONS)
no_intra_emphasis: true,
tables: true,
fenced_code_blocks: true,
strikethrough: true,
lax_spacing: true,
space_after_headers: true,
superscript: true,
footnotes: true
)
end end
@markdown.render(text).html_safe @markdown.render(text).html_safe
......
module Gitlab module Gitlab
# Extract possible GFM references from an arbitrary String for further processing. # Extract possible GFM references from an arbitrary String for further processing.
class ReferenceExtractor class ReferenceExtractor
attr_accessor :project, :current_user, :references attr_accessor :project, :current_user
def initialize(project, current_user = nil) def initialize(project, current_user = nil)
@project = project @project = project
...@@ -9,48 +9,31 @@ module Gitlab ...@@ -9,48 +9,31 @@ module Gitlab
end end
def analyze(text) def analyze(text)
@_text = text.dup references.clear
@text = markdown.render(text.dup)
end end
def users %i(user label issue merge_request snippet commit commit_range).each do |type|
result = pipeline_result(:user) define_method("#{type}s") do
result.uniq references[type]
end
end end
def labels private
result = pipeline_result(:label)
result.uniq
end
def issues
# TODO (rspeicher): What about external issues?
result = pipeline_result(:issue)
result.uniq
end
def merge_requests
result = pipeline_result(:merge_request)
result.uniq
end
def snippets def markdown
result = pipeline_result(:snippet) @markdown ||= Redcarpet::Markdown.new(Redcarpet::Render::HTML, GitlabMarkdownHelper::MARKDOWN_OPTIONS)
result.uniq
end end
def commits def references
result = pipeline_result(:commit) @references ||= Hash.new do |references, type|
result.uniq type = type.to_sym
end return references[type] if references.has_key?(type)
def commit_ranges references[type] = pipeline_result(type).uniq
result = pipeline_result(:commit_range) end
result.uniq
end end
private
# Instantiate and call HTML::Pipeline with a single reference filter type, # Instantiate and call HTML::Pipeline with a single reference filter type,
# returning the result # returning the result
# #
...@@ -69,7 +52,7 @@ module Gitlab ...@@ -69,7 +52,7 @@ module Gitlab
} }
pipeline = HTML::Pipeline.new([filter], context) pipeline = HTML::Pipeline.new([filter], context)
result = pipeline.call(@_text) result = pipeline.call(@text)
result[:references][filter_type] result[:references][filter_type]
end end
......
...@@ -10,6 +10,8 @@ class Redcarpet::Render::GitlabHTML < Redcarpet::Render::HTML ...@@ -10,6 +10,8 @@ class Redcarpet::Render::GitlabHTML < Redcarpet::Render::HTML
@options = options.dup @options = options.dup
@options.reverse_merge!( @options.reverse_merge!(
# Handled further down the line by Gitlab::Markdown::SanitizationFilter
escape_html: false
project: @template.instance_variable_get("@project") project: @template.instance_variable_get("@project")
) )
......
...@@ -16,6 +16,26 @@ describe Gitlab::ReferenceExtractor do ...@@ -16,6 +16,26 @@ describe Gitlab::ReferenceExtractor do
expect(subject.users).to eq([@u_foo, @u_bar, @u_offteam]) expect(subject.users).to eq([@u_foo, @u_bar, @u_offteam])
end end
it 'ignores user mentions inside specific elements' do
@u_foo = create(:user, username: 'foo')
@u_bar = create(:user, username: 'bar')
@u_offteam = create(:user, username: 'offteam')
project.team << [@u_foo, :reporter]
project.team << [@u_bar, :guest]
subject.analyze(%Q{
Inline code: `@foo`
Code block:
```
@bar
```
})
expect(subject.users).to eq([])
end
it 'accesses valid issue objects' do it 'accesses valid issue objects' do
@i0 = create(:issue, project: project) @i0 = create(:issue, project: project)
@i1 = create(:issue, project: project) @i1 = create(:issue, project: project)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment