annotate vendor/plugins/coderay-0.9.2/lib/coderay/scanners/rhtml.rb @ 882:9e27d0747c77 bug_97

Close obsolete branch bug_97
author Chris Cannam
date Fri, 25 Mar 2011 13:58:03 +0000
parents 513646585e45
children
rev   line source
Chris@0 1 module CodeRay
Chris@0 2 module Scanners
Chris@0 3
Chris@0 4 load :html
Chris@0 5 load :ruby
Chris@0 6
Chris@0 7 # RHTML Scanner
Chris@0 8 class RHTML < Scanner
Chris@0 9
Chris@0 10 include Streamable
Chris@0 11 register_for :rhtml
Chris@0 12 title 'HTML ERB Template'
Chris@0 13
Chris@0 14 KINDS_NOT_LOC = HTML::KINDS_NOT_LOC
Chris@0 15
Chris@0 16 ERB_RUBY_BLOCK = /
Chris@0 17 <%(?!%)[=-]?
Chris@0 18 (?>
Chris@0 19 [^\-%]* # normal*
Chris@0 20 (?> # special
Chris@0 21 (?: %(?!>) | -(?!%>) )
Chris@0 22 [^\-%]* # normal*
Chris@0 23 )*
Chris@0 24 )
Chris@0 25 (?: -?%> )?
Chris@0 26 /x
Chris@0 27
Chris@0 28 START_OF_ERB = /
Chris@0 29 <%(?!%)
Chris@0 30 /x
Chris@0 31
Chris@0 32 private
Chris@0 33
Chris@0 34 def setup
Chris@0 35 @ruby_scanner = CodeRay.scanner :ruby, :tokens => @tokens, :keep_tokens => true
Chris@0 36 @html_scanner = CodeRay.scanner :html, :tokens => @tokens, :keep_tokens => true, :keep_state => true
Chris@0 37 end
Chris@0 38
Chris@0 39 def reset_instance
Chris@0 40 super
Chris@0 41 @html_scanner.reset
Chris@0 42 end
Chris@0 43
Chris@0 44 def scan_tokens tokens, options
Chris@0 45
Chris@0 46 until eos?
Chris@0 47
Chris@0 48 if (match = scan_until(/(?=#{START_OF_ERB})/o) || scan_until(/\z/)) and not match.empty?
Chris@0 49 @html_scanner.tokenize match
Chris@0 50
Chris@0 51 elsif match = scan(/#{ERB_RUBY_BLOCK}/o)
Chris@0 52 start_tag = match[/\A<%[-=]?/]
Chris@0 53 end_tag = match[/-?%?>?\z/]
Chris@0 54 tokens << [:open, :inline]
Chris@0 55 tokens << [start_tag, :inline_delimiter]
Chris@0 56 code = match[start_tag.size .. -1 - end_tag.size]
Chris@0 57 @ruby_scanner.tokenize code
Chris@0 58 tokens << [end_tag, :inline_delimiter] unless end_tag.empty?
Chris@0 59 tokens << [:close, :inline]
Chris@0 60
Chris@0 61 else
Chris@0 62 raise_inspect 'else-case reached!', tokens
Chris@0 63 end
Chris@0 64
Chris@0 65 end
Chris@0 66
Chris@0 67 tokens
Chris@0 68
Chris@0 69 end
Chris@0 70
Chris@0 71 end
Chris@0 72
Chris@0 73 end
Chris@0 74 end