class Codeqa::ErbSanitizer::Compiler

Public Instance Methods

compile(s) click to toggle source

Compiles an ERB template into Ruby code. Returns an array of the code and encoding like [“code”, Encoding]. rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength

# File lib/codeqa/utils/erb_sanitizer.rb, line 14
def compile(s)
  enc = s.encoding
  raise ArgumentError, "#{enc} is not ASCII compatible" if enc.dummy?
  s = s.b # see String#b
  enc = detect_magic_comment(s) || enc
  out = Buffer.new(self, enc)

  content = ''
  scanner = make_scanner(s)
  scanner.scan do |token|
    next if token.nil?
    next if token == ''
    if scanner.stag.nil?
      case token
      when PercentLine
        add_put_cmd(out, content) if content.size > 0
        content = ''
        out.push(token.to_s)
        out.cr
      when :cr
        out.cr
      when '<%', '<%=', '<%#'
        scanner.stag = token
        add_put_cmd(out, content) if content.size > 0
        content = ''
      when "\n"
        content << "\n"
        add_put_cmd(out, content)
        content = ''
      when '<%%'
        content << '<%'
      else
        content << token
      end
    else
      case token
      when '%>'
        # in here we deal with the content of a erb tag
        content.scan("\n").count.times do
          add_put_cmd(out, "\n")
        end
        # case scanner.stag
        # when '<%'
        #   if content[-1] == ?\n
        #     content.chop!
        #     out.push(content)
        #     out.cr
        #   else
        #     out.push(content)
        #   end
        # when '<%='
        #   add_insert_cmd(out, content)
        # when '<%#'
        #   # out.push("# #{content_dump(content)}")
        # end
        scanner.stag = nil
        content = ''
      when '%%>'
        content << '%>'
      else
        content << token
      end
    end
  end
  add_put_cmd(out, content) if content.size > 0
  out.close
  [out.script, enc]
end