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