annotate vendor/gems/coderay-1.0.0/lib/coderay/scanners/erb.rb @ 1481:93934eec7b56 issue_540

Close obsolete branch issue_540
author Chris Cannam
date Sat, 24 Nov 2012 17:53:51 +0000
parents cbb26bc654de
children
rev   line source
Chris@909 1 module CodeRay
Chris@909 2 module Scanners
Chris@909 3
Chris@909 4 load :html
Chris@909 5 load :ruby
Chris@909 6
Chris@909 7 # Scanner for HTML ERB templates.
Chris@909 8 class ERB < Scanner
Chris@909 9
Chris@909 10 register_for :erb
Chris@909 11 title 'HTML ERB Template'
Chris@909 12
Chris@909 13 KINDS_NOT_LOC = HTML::KINDS_NOT_LOC
Chris@909 14
Chris@909 15 ERB_RUBY_BLOCK = /
Chris@909 16 (<%(?!%)[-=\#]?)
Chris@909 17 ((?>
Chris@909 18 [^\-%]* # normal*
Chris@909 19 (?> # special
Chris@909 20 (?: %(?!>) | -(?!%>) )
Chris@909 21 [^\-%]* # normal*
Chris@909 22 )*
Chris@909 23 ))
Chris@909 24 ((?: -?%> )?)
Chris@909 25 /x # :nodoc:
Chris@909 26
Chris@909 27 START_OF_ERB = /
Chris@909 28 <%(?!%)
Chris@909 29 /x # :nodoc:
Chris@909 30
Chris@909 31 protected
Chris@909 32
Chris@909 33 def setup
Chris@909 34 @ruby_scanner = CodeRay.scanner :ruby, :tokens => @tokens, :keep_tokens => true
Chris@909 35 @html_scanner = CodeRay.scanner :html, :tokens => @tokens, :keep_tokens => true, :keep_state => true
Chris@909 36 end
Chris@909 37
Chris@909 38 def reset_instance
Chris@909 39 super
Chris@909 40 @html_scanner.reset
Chris@909 41 end
Chris@909 42
Chris@909 43 def scan_tokens encoder, options
Chris@909 44
Chris@909 45 until eos?
Chris@909 46
Chris@909 47 if (match = scan_until(/(?=#{START_OF_ERB})/o) || scan_rest) and not match.empty?
Chris@909 48 @html_scanner.tokenize match, :tokens => encoder
Chris@909 49
Chris@909 50 elsif match = scan(/#{ERB_RUBY_BLOCK}/o)
Chris@909 51 start_tag = self[1]
Chris@909 52 code = self[2]
Chris@909 53 end_tag = self[3]
Chris@909 54
Chris@909 55 encoder.begin_group :inline
Chris@909 56 encoder.text_token start_tag, :inline_delimiter
Chris@909 57
Chris@909 58 if start_tag == '<%#'
Chris@909 59 encoder.text_token code, :comment
Chris@909 60 else
Chris@909 61 @ruby_scanner.tokenize code, :tokens => encoder
Chris@909 62 end unless code.empty?
Chris@909 63
Chris@909 64 encoder.text_token end_tag, :inline_delimiter unless end_tag.empty?
Chris@909 65 encoder.end_group :inline
Chris@909 66
Chris@909 67 else
Chris@909 68 raise_inspect 'else-case reached!', encoder
Chris@909 69
Chris@909 70 end
Chris@909 71
Chris@909 72 end
Chris@909 73
Chris@909 74 encoder
Chris@909 75
Chris@909 76 end
Chris@909 77
Chris@909 78 end
Chris@909 79
Chris@909 80 end
Chris@909 81 end