comparison vendor/gems/coderay-1.0.0/lib/coderay/scanners/erb.rb @ 909:cbb26bc654de redmine-1.3

Update to Redmine 1.3-stable branch (Redmine SVN rev 8964)
author Chris Cannam
date Fri, 24 Feb 2012 19:09:32 +0000
parents
children
comparison
equal deleted inserted replaced
908:c6c2cbd0afee 909:cbb26bc654de
1 module CodeRay
2 module Scanners
3
4 load :html
5 load :ruby
6
7 # Scanner for HTML ERB templates.
8 class ERB < Scanner
9
10 register_for :erb
11 title 'HTML ERB Template'
12
13 KINDS_NOT_LOC = HTML::KINDS_NOT_LOC
14
15 ERB_RUBY_BLOCK = /
16 (<%(?!%)[-=\#]?)
17 ((?>
18 [^\-%]* # normal*
19 (?> # special
20 (?: %(?!>) | -(?!%>) )
21 [^\-%]* # normal*
22 )*
23 ))
24 ((?: -?%> )?)
25 /x # :nodoc:
26
27 START_OF_ERB = /
28 <%(?!%)
29 /x # :nodoc:
30
31 protected
32
33 def setup
34 @ruby_scanner = CodeRay.scanner :ruby, :tokens => @tokens, :keep_tokens => true
35 @html_scanner = CodeRay.scanner :html, :tokens => @tokens, :keep_tokens => true, :keep_state => true
36 end
37
38 def reset_instance
39 super
40 @html_scanner.reset
41 end
42
43 def scan_tokens encoder, options
44
45 until eos?
46
47 if (match = scan_until(/(?=#{START_OF_ERB})/o) || scan_rest) and not match.empty?
48 @html_scanner.tokenize match, :tokens => encoder
49
50 elsif match = scan(/#{ERB_RUBY_BLOCK}/o)
51 start_tag = self[1]
52 code = self[2]
53 end_tag = self[3]
54
55 encoder.begin_group :inline
56 encoder.text_token start_tag, :inline_delimiter
57
58 if start_tag == '<%#'
59 encoder.text_token code, :comment
60 else
61 @ruby_scanner.tokenize code, :tokens => encoder
62 end unless code.empty?
63
64 encoder.text_token end_tag, :inline_delimiter unless end_tag.empty?
65 encoder.end_group :inline
66
67 else
68 raise_inspect 'else-case reached!', encoder
69
70 end
71
72 end
73
74 encoder
75
76 end
77
78 end
79
80 end
81 end