Mercurial > hg > soundsoftware-site
annotate vendor/gems/coderay-1.0.0/lib/coderay/scanners/erb.rb @ 1169:492ff72268e3 bug_521
Close obsolete branch bug_521
author | Chris Cannam |
---|---|
date | Thu, 18 Oct 2012 10:42:48 +0100 |
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 |