Sha256: 0591f4623f416f7080f4273786df2c58964501ae125faffb1724357bf6c57867
Contents?: true
Size: 1.8 KB
Versions: 1
Compression:
Stored size: 1.8 KB
Contents
module Erbse class Parser # ERB_EXPR = /<%(=|\#)?(.*?)%>(\n)*/m # this is the desired pattern. ERB_EXPR = /<%(=+|-|\#|%)?(.*?)[-=]?%>(\n)*/m # this is for backward-compatibility. # BLOCK_EXPR = /\s*((\s+|\))do|\{)(\s*\|[^|]*\|)?\s*\Z/ BLOCK_EXPR = /\b(if|unless)\b|\bdo\b/ def initialize(*) end def call(str) pos = 0 buffers = [] result = [:multi] buffers << result match = nil str.scan(ERB_EXPR) do |indicator, code, newlines| match = Regexp.last_match len = match.begin(0) - pos text = str[pos, len] pos = match.end(0) ch = indicator ? indicator[0] : nil if text and !text.strip.empty? # text buffers.last << [:static, text] end if ch == ?= # <%= %> if code =~ BLOCK_EXPR buffers.last << [:erb, :block, code, block = [:multi]] # picked up by our own BlockFilter. buffers << block else buffers.last << [:dynamic, code] end elsif code =~ /\bend\b/ # <% end %> buffers.pop elsif ch =~ /#/ # DISCUSS: doesn't catch <% # this %> newlines = code.count("\n") buffers.last.concat [[:newline]] * newlines if newlines > 0 else # <% %> if code =~ BLOCK_EXPR buffers.last << [:block, code, block = [:multi]] # picked up by Temple's ControlFlow filter. buffers << block else buffers.last << [:code, code] end end # FIXME: only adds one newline. # TODO: does that influence speed? buffers.last << [:newline] if newlines end # add text after last/none ERB tag. buffers.last << [:static, str[pos..str.length]] if pos < str.length buffers.last end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
erbse-0.1.0 | lib/erbse/parser.rb |