diff options
author | Douwe Maan <douwe@selenight.nl> | 2016-01-20 15:26:44 +0100 |
---|---|---|
committer | Douwe Maan <douwe@selenight.nl> | 2016-01-20 15:26:44 +0100 |
commit | a010db5db243a532cb8d1c2d5ac787e90da0044f (patch) | |
tree | aa7ab255b019bbd5412c34315118616a3a86f81a /lib/gitlab/diff/inline_diff_marker.rb | |
parent | 88bd13851300b98c9d0290cfac5ad1f14673b34d (diff) | |
download | gitlab-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.rb | 16 |
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 |