Mercurial > hg > soundsoftware-site
comparison vendor/gems/coderay-1.0.0/lib/coderay/scanners/haml.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 :ruby | |
5 load :html | |
6 load :java_script | |
7 | |
8 class HAML < Scanner | |
9 | |
10 register_for :haml | |
11 title 'HAML Template' | |
12 | |
13 KINDS_NOT_LOC = HTML::KINDS_NOT_LOC | |
14 | |
15 protected | |
16 | |
17 def setup | |
18 super | |
19 @ruby_scanner = CodeRay.scanner :ruby, :tokens => @tokens, :keep_tokens => true | |
20 @embedded_ruby_scanner = CodeRay.scanner :ruby, :tokens => @tokens, :keep_tokens => true, :state => @ruby_scanner.interpreted_string_state | |
21 @html_scanner = CodeRay.scanner :html, :tokens => @tokens, :keep_tokens => true | |
22 end | |
23 | |
24 def scan_tokens encoder, options | |
25 | |
26 match = nil | |
27 code = '' | |
28 | |
29 until eos? | |
30 | |
31 if bol? | |
32 if match = scan(/!!!.*/) | |
33 encoder.text_token match, :doctype | |
34 next | |
35 end | |
36 | |
37 if match = scan(/(?>( *)(\/(?!\[if)|-\#|:javascript|:ruby|:\w+) *)(?=\n)/) | |
38 encoder.text_token match, :comment | |
39 | |
40 code = self[2] | |
41 if match = scan(/(?:\n+#{self[1]} .*)+/) | |
42 case code | |
43 when '/', '-#' | |
44 encoder.text_token match, :comment | |
45 when ':javascript' | |
46 # TODO: recognize #{...} snippets inside JavaScript | |
47 @java_script_scanner ||= CodeRay.scanner :java_script, :tokens => @tokens, :keep_tokens => true | |
48 @java_script_scanner.tokenize match, :tokens => encoder | |
49 when ':ruby' | |
50 @ruby_scanner.tokenize match, :tokens => encoder | |
51 when /:\w+/ | |
52 encoder.text_token match, :comment | |
53 else | |
54 raise 'else-case reached: %p' % [code] | |
55 end | |
56 end | |
57 end | |
58 | |
59 if match = scan(/ +/) | |
60 encoder.text_token match, :space | |
61 end | |
62 | |
63 if match = scan(/\/.*/) | |
64 encoder.text_token match, :comment | |
65 next | |
66 end | |
67 | |
68 if match = scan(/\\/) | |
69 encoder.text_token match, :plain | |
70 if match = scan(/.+/) | |
71 @html_scanner.tokenize match, :tokens => encoder | |
72 end | |
73 next | |
74 end | |
75 | |
76 tag = false | |
77 | |
78 if match = scan(/%[\w:]+\/?/) | |
79 encoder.text_token match, :tag | |
80 # if match = scan(/( +)(.+)/) | |
81 # encoder.text_token self[1], :space | |
82 # @embedded_ruby_scanner.tokenize self[2], :tokens => encoder | |
83 # end | |
84 tag = true | |
85 end | |
86 | |
87 while match = scan(/([.#])[-\w]*\w/) | |
88 encoder.text_token match, self[1] == '#' ? :constant : :class | |
89 tag = true | |
90 end | |
91 | |
92 if tag && match = scan(/(\()([^)]+)?(\))?/) | |
93 # TODO: recognize title=@title, class="widget_#{@widget.number}" | |
94 encoder.text_token self[1], :plain | |
95 @html_scanner.tokenize self[2], :tokens => encoder, :state => :attribute if self[2] | |
96 encoder.text_token self[3], :plain if self[3] | |
97 end | |
98 | |
99 if tag && match = scan(/\{/) | |
100 encoder.text_token match, :plain | |
101 | |
102 code = '' | |
103 level = 1 | |
104 while true | |
105 code << scan(/([^\{\},\n]|, *\n?)*/) | |
106 case match = getch | |
107 when '{' | |
108 level += 1 | |
109 code << match | |
110 when '}' | |
111 level -= 1 | |
112 if level > 0 | |
113 code << match | |
114 else | |
115 break | |
116 end | |
117 when "\n", ",", nil | |
118 break | |
119 end | |
120 end | |
121 @ruby_scanner.tokenize code, :tokens => encoder unless code.empty? | |
122 | |
123 encoder.text_token match, :plain if match | |
124 end | |
125 | |
126 if tag && match = scan(/(\[)([^\]\n]+)?(\])?/) | |
127 encoder.text_token self[1], :plain | |
128 @ruby_scanner.tokenize self[2], :tokens => encoder if self[2] | |
129 encoder.text_token self[3], :plain if self[3] | |
130 end | |
131 | |
132 if tag && match = scan(/\//) | |
133 encoder.text_token match, :tag | |
134 end | |
135 | |
136 if scan(/(>?<?[-=]|[&!]=|(& |!)|~)( *)([^,\n\|]+(?:(, *|\|(?=.|\n.*\|$))\n?[^,\n\|]*)*)?/) | |
137 encoder.text_token self[1] + self[3], :plain | |
138 if self[4] | |
139 if self[2] | |
140 @embedded_ruby_scanner.tokenize self[4], :tokens => encoder | |
141 else | |
142 @ruby_scanner.tokenize self[4], :tokens => encoder | |
143 end | |
144 end | |
145 elsif match = scan(/((?:<|><?)(?![!?\/\w]))?(.+)?/) | |
146 encoder.text_token self[1], :plain if self[1] | |
147 # TODO: recognize #{...} snippets | |
148 @html_scanner.tokenize self[2], :tokens => encoder if self[2] | |
149 end | |
150 | |
151 elsif match = scan(/.+/) | |
152 @html_scanner.tokenize match, :tokens => encoder | |
153 | |
154 end | |
155 | |
156 if match = scan(/\n/) | |
157 encoder.text_token match, :space | |
158 end | |
159 end | |
160 | |
161 encoder | |
162 | |
163 end | |
164 | |
165 end | |
166 | |
167 end | |
168 end |