summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDouwe Maan <douwe@gitlab.com>2016-01-15 14:39:43 +0100
committerDouwe Maan <douwe@gitlab.com>2016-01-15 14:39:43 +0100
commit13f10efcf120f2d5244bf6abe934dc7c026834ef (patch)
tree0e3265ef2bcaaf2a844ad8039bf5eb2a8eece1e6 /lib
parent7d31f372191c38e5676cd6ec746721eb64b4a634 (diff)
downloadgitlab-ce-13f10efcf120f2d5244bf6abe934dc7c026834ef.tar.gz
Move inline diff marker logic to its own class
Diffstat (limited to 'lib')
-rw-r--r--lib/gitlab/diff/highlight.rb106
1 files changed, 11 insertions, 95 deletions
diff --git a/lib/gitlab/diff/highlight.rb b/lib/gitlab/diff/highlight.rb
index f89121e184b..b6875f07279 100644
--- a/lib/gitlab/diff/highlight.rb
+++ b/lib/gitlab/diff/highlight.rb
@@ -12,32 +12,24 @@ module Gitlab
end
def highlight
- return [] if @diff_lines.empty?
-
- find_inline_diffs
-
- process_lines
-
- @diff_lines
- end
-
- private
-
- def find_inline_diffs
- @inline_diffs = InlineDiff.new(@raw_lines).inline_diffs
- end
-
- def process_lines
@diff_lines.each_with_index do |diff_line, i|
# ignore highlighting for "match" lines
next if diff_line.type == 'match'
rich_line = highlight_line(diff_line, i)
- rich_line = mark_inline_diffs(rich_line, diff_line, i)
+
+ if line_inline_diffs = inline_diffs[i]
+ rich_line = InlineDiffMarker.new(diff_line.text, rich_line).mark(line_inline_diffs)
+ end
+
diff_line.text = rich_line.html_safe
end
+
+ @diff_lines
end
+ private
+
def highlight_line(diff_line, index)
line_prefix = diff_line.text.match(/\A([+-])/) ? $1 : ' '
@@ -53,50 +45,8 @@ module Gitlab
rich_line ? line_prefix + rich_line : diff_line.text
end
- def mark_inline_diffs(rich_line, diff_line, index)
- line_inline_diffs = @inline_diffs[index]
- return rich_line unless line_inline_diffs
-
- raw_line = diff_line.text
- position_mapping = map_character_positions(raw_line, rich_line)
-
- offset = 0
- line_inline_diffs.each do |inline_diff_range|
- inline_diff_positions = position_mapping[inline_diff_range]
- marker_ranges = collapse_ranges(inline_diff_positions)
-
- marker_ranges.each do |range|
- offset = insert_around_range(rich_line, range, "<span class='idiff'>", "</span>", offset)
- end
- end
-
- rich_line
- end
-
- def map_character_positions(raw_line, rich_line)
- mapping = []
- raw_pos = 0
- rich_pos = 0
- (0..raw_line.length).each do |raw_pos|
- raw_char = raw_line[raw_pos]
- rich_char = rich_line[rich_pos]
-
- while rich_char == '<'
- until rich_char == '>'
- rich_pos += 1
- rich_char = rich_line[rich_pos]
- end
-
- rich_pos += 1
- rich_char = rich_line[rich_pos]
- end
-
- mapping[raw_pos] = rich_pos
-
- rich_pos += 1
- end
-
- mapping
+ def inline_diffs
+ @inline_diffs ||= InlineDiff.new(@raw_lines).inline_diffs
end
def old_lines
@@ -107,40 +57,6 @@ module Gitlab
@new_lines ||= Gitlab::Highlight.highlight_lines(*processing_args(:new))
end
- def collapse_ranges(positions)
- return [] if positions.empty?
- ranges = []
-
- start = prev = positions[0]
- range = start..prev
- positions[1..-1].each do |pos|
- if pos == prev + 1
- range = start..pos
- prev = pos
- else
- ranges << range
- start = prev = pos
- range = start..prev
- end
- end
- ranges << range
-
- ranges
- end
-
- def insert_around_range(text, range, before, after, offset = 0)
- from = range.begin
- to = range.end
-
- text.insert(offset + from, before)
- offset += before.length
-
- text.insert(offset + to + 1, after)
- offset += after.length
-
- offset
- end
-
def processing_args(version)
ref = send("diff_#{version}_ref")
path = send("diff_#{version}_path")