module RailsRouteChecker::Parsers::ErbParser

Public Class Methods

run(filename, **opts) click to toggle source
# File lib/rails-route-checker/parsers/erb_parser.rb, line 7
def run(filename, **opts)
  file_source = opts[:source] || File.read(filename)

  opts.merge!(process_file(file_source))

  RailsRouteChecker::Parsers::RubyParser.run(filename, **opts)
end

Private Class Methods

process_file(source) click to toggle source
# File lib/rails-route-checker/parsers/erb_parser.rb, line 36
def process_file(source)
  next_ruby_source_line_num = 1
  ruby_source = ''
  source_map = {}

  source.split("\n").each_with_index do |line, line_num|
    ruby_lines = process_line(line)
    next unless ruby_lines.any?

    ruby_source += ruby_lines.join("\n") + "\n"
    ruby_lines.length.times do |i|
      source_map[next_ruby_source_line_num + i] = line_num + 1
    end
    next_ruby_source_line_num += ruby_lines.length
  end

  {
    source: ruby_source,
    source_map: source_map
  }
end
process_line(line) click to toggle source
# File lib/rails-route-checker/parsers/erb_parser.rb, line 17
def process_line(line)
  lookup_index = 0
  ruby_lines = []

  while lookup_index < line.length
    opening = line.index('<%=', lookup_index)
    is_write_opening = opening
    opening ||= line.index('<%', lookup_index)
    break unless opening

    closing = line.index('%>', opening + 2)
    break unless closing

    ruby_lines << line[(opening + (is_write_opening ? 3 : 2))..(closing - 1)]
    lookup_index = closing + 2
  end
  ruby_lines
end