Mercurial > hg > soundsoftware-site
annotate vendor/plugins/coderay-0.9.2/lib/coderay/scanners/rhtml.rb @ 889:e124b1258c0b bug_83
Close obsolete branch bug_83
author | Chris Cannam |
---|---|
date | Sat, 19 Feb 2011 09:58:02 +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 |