123456789_123456789_123456789_123456789_123456789_

Class: SyntaxSuggest::DisplayCodeWithLineNumbers

Relationships & Source Files
Inherits: Object
Defined in: lib/syntax_suggest/display_code_with_line_numbers.rb

Overview

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

Constant Summary

Class Method Summary

Instance Method Summary

Constructor Details

.new(lines:, highlight_lines: [], terminal: false) ⇒ DisplayCodeWithLineNumbers

[ GitHub ]

  
# 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

Instance Method Details

#call

[ GitHub ]

  
# File 'lib/syntax_suggest/display_code_with_line_numbers.rb', line 32

def call
  @lines.map do |line|
    format_line(line)
  end.join
end

#format(contents:, number:, empty:, highlight: false) (private)

[ GitHub ]

  
# File 'lib/syntax_suggest/display_code_with_line_numbers.rb', line 50

private 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) (private)

[ GitHub ]

  
# File 'lib/syntax_suggest/display_code_with_line_numbers.rb', line 38

private 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