Class: Codeqa::ErbSanitizer::Compiler

Inherits:
ERB::Compiler
  • Object
show all
Defined in:
lib/codeqa/utils/erb_sanitizer.rb

Instance Method Summary collapse

Instance Method Details

#compile(s) ⇒ Object

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

Raises:

  • (ArgumentError)


14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# 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