Mercurial > hg > soundsoftware-site
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 |