class SyntaxSuggest::DisplayCodeWithLineNumbers

Outputs code with highlighted lines

Whatever is passed to this class will be rendered even if it is “marked invisible” any filtering of output should be done before calling this class.

DisplayCodeWithLineNumbers.new(
  lines: lines,
  highlight_lines: [lines[2], lines[3]]
).call
# =>
    1
    2  def cat
  > 3    Dir.chdir
  > 4    end
    5  end
    6

Constants

TERMINAL_END
TERMINAL_HIGHLIGHT

Public Class Methods

new(lines:, highlight_lines: [], terminal: false) click to toggle source
# File lib/syntax_suggest/display_code_with_line_numbers.rb, line 25
def initialize(lines:, highlight_lines: [], terminal: false)
  @lines = Array(lines).sort
  @terminal = terminal
  @highlight_line_hash = Array(highlight_lines).each_with_object({}) { |line, h| h[line] = true }
  @digit_count = @lines.last&.line_number.to_s.length
end

Public Instance Methods

call() click to toggle source
# File lib/syntax_suggest/display_code_with_line_numbers.rb, line 32
def call
  @lines.map do |line|
    format_line(line)
  end.join
end

Private Instance Methods

format(contents:, number:, empty:, highlight: false) click to toggle source
# File lib/syntax_suggest/display_code_with_line_numbers.rb, line 50
        def format(contents:, number:, empty:, highlight: false)
  string = +""
  string << if highlight
    "> "
  else
    "  "
  end

  string << number.rjust(@digit_count).to_s
  if empty
    string << contents
  else
    string << "  "
    string << TERMINAL_HIGHLIGHT if @terminal && highlight
    string << contents
    string << TERMINAL_END if @terminal
  end
  string
end
format_line(code_line) click to toggle source
# File lib/syntax_suggest/display_code_with_line_numbers.rb, line 38
        def format_line(code_line)
  # Handle trailing slash lines
  code_line.original.lines.map.with_index do |contents, i|
    format(
      empty: code_line.empty?,
      number: (code_line.number + i).to_s,
      contents: contents,
      highlight: @highlight_line_hash[code_line]
    )
  end.join
end