Module: SnippetsHelper

Included in:
Gitlab::SnippetSearchResults
Defined in:
app/helpers/snippets_helper.rb

Instance Method Summary collapse

Instance Method Details

#bounded_line_numbers(line, min, max, surrounding_lines) ⇒ Object

Get an array of line numbers surrounding a matching line, bounded by min/max.


15
16
17
18
19
# File 'app/helpers/snippets_helper.rb', line 15

def bounded_line_numbers(line, min, max, surrounding_lines)
  lower = line - surrounding_lines > min ? line - surrounding_lines : min
  upper = line + surrounding_lines < max ? line + surrounding_lines : max
  (lower..upper).to_a
end

#chunk_snippet(snippet, query, surrounding_lines = 3) ⇒ Object

'Chunkify' entire snippet. Splits the snippet data into matching lines + surrounding_lines() worth of unmatching lines.


44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'app/helpers/snippets_helper.rb', line 44

def chunk_snippet(snippet, query, surrounding_lines = 3)
  lined_content = snippet.content.split("\n")
  used_lines = matching_lines(lined_content, surrounding_lines, query)

  snippet_chunk = []
  snippet_chunks = []
  snippet_start_line = 0
  last_line = -1

  # Go through each used line, and add consecutive lines as a single chunk
  # to the snippet chunk array.
  used_lines.each do |line_number|
    if last_line < 0
      # Start a new chunk.
      snippet_start_line = line_number
      snippet_chunk << lined_content[line_number]
    elsif last_line == line_number - 1
      # Consecutive line, continue chunk.
      snippet_chunk << lined_content[line_number]
    else
      # Non-consecutive line, add chunk to chunk array.
      snippet_chunks << {
        data: snippet_chunk.join("\n"),
        start_line: snippet_start_line + 1
      }

      # Start a new chunk.
      snippet_chunk = [lined_content[line_number]]
      snippet_start_line = line_number
    end
    last_line = line_number
  end
  # Add final chunk to chunk array
  snippet_chunks << {
    data: snippet_chunk.join("\n"),
    start_line: snippet_start_line + 1
  }

  # Return snippet with chunk array
  { snippet_object: snippet, snippet_chunks: snippet_chunks }
end

#matching_lines(lined_content, surrounding_lines, query) ⇒ Object

Returns a sorted set of lines to be included in a snippet preview. This ensures matching adjacent lines do not display duplicated surrounding code.


26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'app/helpers/snippets_helper.rb', line 26

def matching_lines(lined_content, surrounding_lines, query)
  used_lines = []
  lined_content.each_with_index do |line, line_number|
    used_lines.concat bounded_line_numbers(
      line_number,
      0,
      lined_content.size,
      surrounding_lines
    ) if line.include?(query)
  end

  used_lines.uniq.sort
end

#reliable_snippet_path(snippet) ⇒ Object


2
3
4
5
6
7
8
9
# File 'app/helpers/snippets_helper.rb', line 2

def reliable_snippet_path(snippet)
  if snippet.project_id?
    namespace_project_snippet_path(snippet.project.namespace,
                                   snippet.project, snippet)
  else
    snippet_path(snippet)
  end
end