1 2 3 4 5 6 7 8 9 10 11 12 13 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
|
# frozen_string_literal: true
module Temple
module ERB
# Example ERB parser
#
# @api public
class Parser < Temple::Parser
ERB_PATTERN = /(\n|<%%|%%>)|<%(==?|\#)?(.*?)?-?%>/m
def call(input)
result = [:multi]
pos = 0
input.scan(ERB_PATTERN) do |token, indicator, code|
text = input[pos...$~.begin(0)]
pos = $~.end(0)
if token
case token
when "\n"
result << [:static, "#{text}\n"] << [:newline]
when '<%%', '%%>'
result << [:static, text] unless text.empty?
token.slice!(1)
result << [:static, token]
end
else
result << [:static, text] unless text.empty?
case indicator
when '#'
result << [:code, "\n" * code.count("\n")]
when /=/
result << [:escape, indicator.size == 2, [:dynamic, code]]
else
result << [:code, code]
end
end
end
result << [:static, input[pos..-1]]
end
end
end
end
|