annotate vendor/plugins/coderay-0.9.2/lib/coderay/scanners/rhtml.rb @ 209:ff5112f823e5
feature_73
Merge from branch "feature_72", to provide just enough of the site support for external repos to permit testing while developing the conversion code
author |
Chris Cannam |
date |
Tue, 08 Feb 2011 13:24:51 +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
|