snippets_helper.rb 2.9 KB
Newer Older
G
gitlabhq 已提交
1
module SnippetsHelper
N
Nihad Abbasov 已提交
2
  def lifetime_select_options
N
Nihad Abbasov 已提交
3 4
    options = [
        ['forever', nil],
N
Nihad Abbasov 已提交
5 6 7
        ['1 day',   "#{Date.current + 1.day}"],
        ['1 week',  "#{Date.current + 1.week}"],
        ['1 month', "#{Date.current + 1.month}"]
N
Nihad Abbasov 已提交
8 9 10
    ]
    options_for_select(options)
  end
D
Dmitriy Zaporozhets 已提交
11 12 13

  def reliable_snippet_path(snippet)
    if snippet.project_id?
V
Vinnie Okada 已提交
14 15
      namespace_project_snippet_path(snippet.project.namespace,
                                     snippet.project, snippet)
D
Dmitriy Zaporozhets 已提交
16 17 18 19
    else
      snippet_path(snippet)
    end
  end
V
Valery Sizov 已提交
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

  # Get an array of line numbers surrounding a matching
  # line, bounded by min/max.
  #
  # @returns Array of line numbers
  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

  # Returns a sorted set of lines to be included in a snippet preview.
  # This ensures matching adjacent lines do not display duplicated
  # surrounding code.
  #
  # @returns Array, unique and sorted.
V
Valery Sizov 已提交
36
  def matching_lines(lined_content, surrounding_lines, query)
V
Valery Sizov 已提交
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
    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

  # 'Chunkify' entire snippet.  Splits the snippet data into matching lines +
  # surrounding_lines() worth of unmatching lines.
  #
  # @returns a hash with {snippet_object, snippet_chunks:{data,start_line}}
V
Valery Sizov 已提交
54
  def chunk_snippet(snippet, query, surrounding_lines = 3)
V
Valery Sizov 已提交
55
    lined_content = snippet.content.split("\n")
V
Valery Sizov 已提交
56
    used_lines = matching_lines(lined_content, surrounding_lines, query)
V
Valery Sizov 已提交
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 85 86 87 88 89 90 91 92 93 94

    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
G
gitlabhq 已提交
95
end