summaryrefslogtreecommitdiff
path: root/lib/coderay/scanners/nitro_xhtml.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/coderay/scanners/nitro_xhtml.rb')
-rw-r--r--lib/coderay/scanners/nitro_xhtml.rb78
1 files changed, 39 insertions, 39 deletions
diff --git a/lib/coderay/scanners/nitro_xhtml.rb b/lib/coderay/scanners/nitro_xhtml.rb
index fe6b303..ba8ee71 100644
--- a/lib/coderay/scanners/nitro_xhtml.rb
+++ b/lib/coderay/scanners/nitro_xhtml.rb
@@ -1,14 +1,14 @@
module CodeRay
module Scanners
-
+
load :html
load :ruby
-
+
# Nitro XHTML Scanner
#
# Alias: +nitro+
class NitroXHTML < Scanner
-
+
include Streamable
register_for :nitro_xhtml
file_extension :xhtml
@@ -38,7 +38,7 @@ module Scanners
)
(?: %> )?
/mx # :nodoc:
-
+
NITRO_VALUE_BLOCK = /
\#
(?:
@@ -55,83 +55,83 @@ module Scanners
| \\ [^\\]* \\?
)
/x # :nodoc:
-
+
NITRO_ENTITY = /
% (?: \#\d+ | \w+ ) ;
/ # :nodoc:
-
+
START_OF_RUBY = /
(?=[<\#%])
< (?: \?r | % | ruby> )
| \# [{(|]
| % (?: \#\d+ | \w+ ) ;
/x # :nodoc:
-
+
CLOSING_PAREN = Hash.new { |h, p| h[p] = p } # :nodoc:
CLOSING_PAREN.update( {
'(' => ')',
'[' => ']',
'{' => '}',
} )
-
+
protected
-
+
def setup
@ruby_scanner = CodeRay.scanner :ruby, :tokens => @tokens, :keep_tokens => true
@html_scanner = CodeRay.scanner :html, :tokens => @tokens, :keep_tokens => true, :keep_state => true
end
-
+
def reset_instance
super
@html_scanner.reset
end
-
- def scan_tokens tokens, options
-
+
+ def scan_tokens encoder, options
+
until eos?
-
- if (match = scan_until(/(?=#{START_OF_RUBY})/o) || scan_until(/\z/)) and not match.empty?
+
+ if (match = scan_until(/(?=#{START_OF_RUBY})/o) || match = scan_until(/\z/)) and not match.empty?
@html_scanner.tokenize match
-
+
elsif match = scan(/#{NITRO_VALUE_BLOCK}/o)
start_tag = match[0,2]
delimiter = CLOSING_PAREN[start_tag[1,1]]
end_tag = match[-1,1] == delimiter ? delimiter : ''
- tokens << [:open, :inline]
- tokens << [start_tag, :inline_delimiter]
+ encoder.begin_group :inline
+ encoder.text_token start_tag, :inline_delimiter
code = match[start_tag.size .. -1 - end_tag.size]
- @ruby_scanner.tokenize code
- tokens << [end_tag, :inline_delimiter] unless end_tag.empty?
- tokens << [:close, :inline]
-
+ @ruby_scanner.tokenize code, :tokens => encoder
+ encoder.text_token end_tag, :inline_delimiter unless end_tag.empty?
+ encoder.end_group :inline
+
elsif match = scan(/#{NITRO_RUBY_BLOCK}/o)
start_tag = '<?r'
end_tag = match[-2,2] == '?>' ? '?>' : ''
- tokens << [:open, :inline]
- tokens << [start_tag, :inline_delimiter]
+ encoder.begin_group :inline
+ encoder.text_token start_tag, :inline_delimiter
code = match[start_tag.size .. -(end_tag.size)-1]
- @ruby_scanner.tokenize code
- tokens << [end_tag, :inline_delimiter] unless end_tag.empty?
- tokens << [:close, :inline]
-
+ @ruby_scanner.tokenize code, :tokens => encoder
+ encoder.text_token end_tag, :inline_delimiter unless end_tag.empty?
+ encoder.end_group :inline
+
elsif entity = scan(/#{NITRO_ENTITY}/o)
- tokens << [entity, :entity]
-
+ encoder.text_token entity, :entity
+
elsif scan(/%/)
- tokens << [matched, :error]
-
+ encoder.text_token matched, :error
+
else
- raise_inspect 'else-case reached!', tokens
+ raise_inspect 'else-case reached!', encoder
end
-
+
end
-
- tokens
-
+
+ encoder
+
end
-
+
end
-
+
end
end