def scan
new_line = true
stag_reg = /(.*?)(<%%|<%=|<%#|<%-|<%|\n|\z)/
etag_reg = /(.*?)(%%>|-%>|%>|\n|\z)/
scanner = StringScanner.new(@src)
while ! scanner.eos?
if new_line && @stag.nil? && scanner.scan(/[ \t]*<%-/)
yield('<%')
new_line = false
next
end
scanner.scan(@stag ? etag_reg : stag_reg)
text = scanner[1]
elem = scanner[2]
new_line = (elem == "\n")
yield(text) unless text.empty?
if elem == '-%>'
yield('%>')
if scanner.scan(/(\n|\z)/)
yield(:cr)
new_line = true
end
elsif elem == '<%-'
yield('<%')
else
yield(elem) unless elem.empty?
end
end
end