annotate vendor/gems/coderay-0.9.7/lib/coderay/scanners/rhtml.rb @ 855:7294e8db2515 bug_162

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