lib/lecter/html_generator.rb
# frozen_string_literal: true
module Lecter
class HtmlGenerator
COUNT_LINES_AROUND_RUNNING_ROW = 5
ELLIPSIS = '...'
NEW_LINE = "\n"
def initialize(data)
@data = data
end
def call
@data.each.map do |item|
@file_path = item.keys.first
@executable_row_numbers = item.values.flatten
previous_row_is_empty = false
html_rows = file_context.each_with_index.map do |file_row, file_row_index|
@file_row_index = file_row_index
row_executable = executable_row_numbers.include?(file_row_index + 1)
if row_executable || file_row_in_showing_range?(file_row_index)
previous_row_is_empty = false
Lecter::HtmlRow.new(
file_row,
file_row_index + 1,
row_executable,
executable_row_numbers
).create
elsif !previous_row_is_empty
previous_row_is_empty = true
ELLIPSIS + NEW_LINE
end
end
FileListing.new(file_path, html_rows)
end
end
private
attr_accessor :executable_row_numbers, :file_row_index, :file_path
def file_row_in_showing_range?(_index)
executable_row_numbers.reduce(false) do |memo, row_number|
memo ||
(row_number - COUNT_LINES_AROUND_RUNNING_ROW - 1..
row_number + COUNT_LINES_AROUND_RUNNING_ROW - 1).include?(file_row_index)
end
end
def file_context
File.open(file_path, 'r').read.split(NEW_LINE)
end
end
class FileListing
attr_reader :file_path, :html_rows
def initialize(file_path, html_rows)
@file_path = file_path
@html_rows = html_rows
end
end
end