class Lookbook::FileSource::Component
def end_line
def end_line line_count = source_lines.size if lines_around_highlight && @highlight_lines.any? last = @highlight_lines.last + lines_around_highlight (last <= line_count) ? last : line_count else (@end_line && (@end_line <= line_count)) ? @end_line : line_count end end
def highlight_lines
def highlight_lines @highlight_lines.map { |num| num - start_line + 1 } end
def initialize(file_path:, source: nil, highlight_lines: [], lines_around_highlight: nil,
def initialize(file_path:, source: nil, highlight_lines: [], lines_around_highlight: nil, start_line: 1, end_line: nil, start_line_number: nil, **html_attrs) @file_path = file_path @source = source @highlight_lines = highlight_lines.map(&:to_i) @start_line = start_line @end_line = end_line @start_line_number = start_line_number @lines_around_highlight = lines_around_highlight super(**html_attrs) end
def render?
def render? source.present? end
def source
def source return @source if @source.present? @_source ||= File.read(file_path) rescue nil end
def source_lang
def source_lang lang = Lang.guess(file_path) lang.present? ? lang[:name] : "plaintext" end
def source_lines
def source_lines @_source_lines ||= source&.split("\n") end
def start_line
def start_line if lines_around_highlight && @highlight_lines.any? start = @highlight_lines.first - lines_around_highlight (start > 0) ? start : 1 else @start_line end end
def start_line_number
def start_line_number @start_line_number || start_line end
def trimmed_source
def trimmed_source return unless source.present? from = start_line - 1 to = end_line - 1 source_lines[from..to].join("\n") end