summaryrefslogtreecommitdiff
path: root/lib/gitlab/diff/inline_diff_marker.rb
diff options
context:
space:
mode:
authorDouwe Maan <douwe@selenight.nl>2016-01-20 15:26:44 +0100
committerDouwe Maan <douwe@selenight.nl>2016-01-20 15:26:44 +0100
commita010db5db243a532cb8d1c2d5ac787e90da0044f (patch)
treeaa7ab255b019bbd5412c34315118616a3a86f81a /lib/gitlab/diff/inline_diff_marker.rb
parent88bd13851300b98c9d0290cfac5ad1f14673b34d (diff)
downloadgitlab-ce-a010db5db243a532cb8d1c2d5ac787e90da0044f.tar.gz
Properly handle HTML entities with inline diffs
Diffstat (limited to 'lib/gitlab/diff/inline_diff_marker.rb')
-rw-r--r--lib/gitlab/diff/inline_diff_marker.rb16
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/gitlab/diff/inline_diff_marker.rb b/lib/gitlab/diff/inline_diff_marker.rb
index 8998ccba5ce..c31149d374e 100644
--- a/lib/gitlab/diff/inline_diff_marker.rb
+++ b/lib/gitlab/diff/inline_diff_marker.rb
@@ -12,7 +12,7 @@ module Gitlab
offset = 0
line_inline_diffs.each do |inline_diff_range|
# Map the inline-diff range based on the raw line to character positions in the rich line
- inline_diff_positions = position_mapping[inline_diff_range]
+ inline_diff_positions = position_mapping[inline_diff_range].flatten
# Turn the array of character positions into ranges
marker_ranges = collapse_ranges(inline_diff_positions)
@@ -47,7 +47,19 @@ module Gitlab
rich_char = rich_line[rich_pos]
end
- mapping[raw_pos] = rich_pos
+ # multi-char HTML entities in the rich line correspond to a single character in the raw line
+ if rich_char == '&'
+ multichar_mapping = [rich_pos]
+ until rich_char == ';'
+ rich_pos += 1
+ multichar_mapping << rich_pos
+ rich_char = rich_line[rich_pos]
+ end
+
+ mapping[raw_pos] = multichar_mapping
+ else
+ mapping[raw_pos] = rich_pos
+ end
rich_pos += 1
end