Before replacing tags, ensure the SHA1 is not within preformatted content.

This commit is contained in:
Jonathan Roes
2012-05-12 17:29:23 -04:00
parent eb37b17486
commit f9899033aa
2 changed files with 26 additions and 13 deletions
+20 -13
View File
@@ -54,10 +54,8 @@ module Gollum
data = process_tags(data)
data = process_code(data, encoding)
doc = Nokogiri::HTML::DocumentFragment.parse(data)
doc = remove_links_in_code(doc)
if sanitize || block_given?
doc = Nokogiri::HTML::DocumentFragment.parse(data)
doc = sanitize.clean_node!(doc) if sanitize
yield doc if block_given?
data = doc.to_html
@@ -156,11 +154,29 @@ module Gollum
# Returns the marked up String data.
def process_tags(data)
@tagmap.each do |id, tag|
data.gsub!(id, process_tag(tag))
# If it's preformatted, just put the tag back
if is_preformatted?(data, id)
data.gsub!(id, "[[#{tag}]]")
else
data.gsub!(id, process_tag(tag))
end
end
data
end
# Find `id` within `data` and determine if it's within
# preformatted tags.
#
# data - The String data (with placeholders).
# id - The String SHA1 hash.
PREFORMATTED_TAGS = %w(code tt)
def is_preformatted?(data, id)
doc = Nokogiri::HTML::DocumentFragment.parse(data)
node = doc.search("[text()*='#{id}']").first
node && (PREFORMATTED_TAGS.include?(node.name) ||
node.ancestors.any? { |a| PREFORMATTED_TAGS.include?(a.name) })
end
# Process a single tag into its final HTML form.
#
# tag - The String tag contents (the stuff inside the double
@@ -356,15 +372,6 @@ module Gollum
end
end
def remove_links_in_code(doc)
doc.css('code > a').each do |link|
link.before("[[#{link.content}]]")
link.remove
end
doc
end
#########################################################################
#
# Code