Commit d993f666 authored by Robert Speicher's avatar Robert Speicher

Fix HTML entities being parsed in GFM

Also fixes the spec so that it actually tests the thing it says it's
testing. Hooray!

Closes #1308
parent 85def2d6
...@@ -26,13 +26,13 @@ module Gitlab ...@@ -26,13 +26,13 @@ module Gitlab
# => "<img alt=\":trollface:\" class=\"emoji\" src=\"/images/trollface.png" title=\":trollface:\" /> # => "<img alt=\":trollface:\" class=\"emoji\" src=\"/images/trollface.png" title=\":trollface:\" />
module Markdown module Markdown
REFERENCE_PATTERN = %r{ REFERENCE_PATTERN = %r{
([^\w&;])? # Prefix (1) (\W)? # Prefix (1)
( # Reference (2) ( # Reference (2)
@([\w\._]+) # User name (3) @([\w\._]+) # User name (3)
|[#!$](\d+) # Issue/MR/Snippet ID (4) |[#!$](\d+) # Issue/MR/Snippet ID (4)
|([\h]{6,40}) # Commit ID (5) |([\h]{6,40}) # Commit ID (5)
) )
([^\w&;])? # Suffix (6) (\W)? # Suffix (6)
}x.freeze }x.freeze
EMOJI_PATTERN = %r{(:(\S+):)}.freeze EMOJI_PATTERN = %r{(:(\S+):)}.freeze
...@@ -84,6 +84,13 @@ module Gitlab ...@@ -84,6 +84,13 @@ module Gitlab
# #
# Returns parsed text # Returns parsed text
def parse(text) def parse(text)
parse_references(text) if @project
parse_emoji(text)
text
end
def parse_references(text)
# parse reference links # parse reference links
text.gsub!(REFERENCE_PATTERN) do |match| text.gsub!(REFERENCE_PATTERN) do |match|
prefix = $1 || '' prefix = $1 || ''
...@@ -91,13 +98,18 @@ module Gitlab ...@@ -91,13 +98,18 @@ module Gitlab
identifier = $3 || $4 || $5 identifier = $3 || $4 || $5
suffix = $6 || '' suffix = $6 || ''
if ref_link = reference_link(reference, identifier) # Avoid HTML entities
if prefix.ends_with?('&') || suffix.starts_with?(';')
match
elsif ref_link = reference_link(reference, identifier)
prefix + ref_link + suffix prefix + ref_link + suffix
else else
match match
end end
end if @project end
end
def parse_emoji(text)
# parse emoji # parse emoji
text.gsub!(EMOJI_PATTERN) do |match| text.gsub!(EMOJI_PATTERN) do |match|
if valid_emoji?($2) if valid_emoji?($2)
...@@ -106,8 +118,6 @@ module Gitlab ...@@ -106,8 +118,6 @@ module Gitlab
match match
end end
end end
text
end end
# Private: Checks if an emoji icon exists in the image asset directory # Private: Checks if an emoji icon exists in the image asset directory
......
...@@ -31,6 +31,7 @@ describe GitlabMarkdownHelper do ...@@ -31,6 +31,7 @@ describe GitlabMarkdownHelper do
end end
it "should not touch HTML entities" do it "should not touch HTML entities" do
@project.issues.stub(:where).with(id: '39').and_return([issue])
actual = expected = "We&#39;ll accept good pull requests." actual = expected = "We&#39;ll accept good pull requests."
gfm(actual).should == expected gfm(actual).should == expected
end end
......
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