FIX: When mutating a string to build a diff. Duplicate it first (#7482)

This commit is contained in:
Roman Rizzi
2019-05-06 13:20:10 -03:00
committed by GitHub
parent e67ba8517d
commit 20d4093a67

View File

@ -176,24 +176,25 @@ class DiscourseDiff
end end
def add_class_or_wrap_in_tags(html_or_text, klass) def add_class_or_wrap_in_tags(html_or_text, klass)
index_of_next_chevron = html_or_text.index(">") dupped_html_or_text = html_or_text.dup
if html_or_text.length > 0 && html_or_text[0] == '<' && index_of_next_chevron index_of_next_chevron = dupped_html_or_text.index(">")
index_of_class = html_or_text.index("class=") if dupped_html_or_text.length > 0 && dupped_html_or_text[0] == '<' && index_of_next_chevron
index_of_class = dupped_html_or_text.index("class=")
if index_of_class.nil? || index_of_class > index_of_next_chevron if index_of_class.nil? || index_of_class > index_of_next_chevron
# we do not have a class for the current tag # we do not have a class for the current tag
# add it right before the ">" # add it right before the ">"
html_or_text.insert(index_of_next_chevron, " class=\"diff-#{klass}\"") dupped_html_or_text.insert(index_of_next_chevron, " class=\"diff-#{klass}\"")
else else
# we have a class, insert it at the beginning if not already present # we have a class, insert it at the beginning if not already present
classes = html_or_text[/class=(["'])([^\1]*)\1/, 2] classes = dupped_html_or_text[/class=(["'])([^\1]*)\1/, 2]
if classes.include?("diff-#{klass}") if classes.include?("diff-#{klass}")
html_or_text dupped_html_or_text
else else
html_or_text.insert(index_of_class + "class=".length + 1, "diff-#{klass} ") dupped_html_or_text.insert(index_of_class + "class=".length + 1, "diff-#{klass} ")
end end
end end
else else
"<#{klass}>#{html_or_text}</#{klass}>" "<#{klass}>#{dupped_html_or_text}</#{klass}>"
end end
end end