summaryrefslogtreecommitdiff
path: root/lib/coderay/scanners/erb.rb
diff options
context:
space:
mode:
authorKornelius Kalnbach <murphy@rubychan.de>2011-08-19 03:09:35 +0200
committerKornelius Kalnbach <murphy@rubychan.de>2011-08-19 03:09:35 +0200
commit75bc5455af8c3c3381066aac3d5fff42264cac6f (patch)
tree589d2c912ddd94c517eb794bcdf3257f8348f3c0 /lib/coderay/scanners/erb.rb
parentfdd17b6a09efb275238a3baef275465d31452f2a (diff)
downloadcoderay-75bc5455af8c3c3381066aac3d5fff42264cac6f.tar.gz
Major rewrite of encoders to support IO output; fixed some minor scanner bugs; cleanups; dropped NitroXHTML scanner; improved tests
Diffstat (limited to 'lib/coderay/scanners/erb.rb')
-rw-r--r--lib/coderay/scanners/erb.rb77
1 files changed, 77 insertions, 0 deletions
diff --git a/lib/coderay/scanners/erb.rb b/lib/coderay/scanners/erb.rb
new file mode 100644
index 0000000..eaf3bba
--- /dev/null
+++ b/lib/coderay/scanners/erb.rb
@@ -0,0 +1,77 @@
+module CodeRay
+module Scanners
+
+ load :html
+ load :ruby
+
+ # Scanner for HTML ERB templates.
+ class ERB < Scanner
+
+ register_for :erb
+ title 'HTML ERB Template'
+
+ KINDS_NOT_LOC = HTML::KINDS_NOT_LOC
+
+ ERB_RUBY_BLOCK = /
+ <%(?!%)[=-]?
+ (?>
+ [^\-%]* # normal*
+ (?> # special
+ (?: %(?!>) | -(?!%>) )
+ [^\-%]* # normal*
+ )*
+ )
+ (?: -?%> )?
+ /x # :nodoc:
+
+ START_OF_ERB = /
+ <%(?!%)
+ /x # :nodoc:
+
+ 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 encoder, options
+
+ until eos?
+
+ if (match = scan_until(/(?=#{START_OF_ERB})/o) || scan_rest) and not match.empty?
+ @html_scanner.tokenize match, :tokens => encoder
+
+ elsif match = scan(/#{ERB_RUBY_BLOCK}/o)
+ start_tag = match[/\A<%[-=#]?/]
+ end_tag = match[/-?%?>?\z/]
+ encoder.begin_group :inline
+ encoder.text_token start_tag, :inline_delimiter
+ code = match[start_tag.size .. -1 - end_tag.size]
+ if start_tag[/\A<%#/]
+ encoder.text_token code, :comment
+ else
+ @ruby_scanner.tokenize code, :tokens => encoder
+ end unless code.empty?
+ encoder.text_token end_tag, :inline_delimiter unless end_tag.empty?
+ encoder.end_group :inline
+
+ else
+ raise_inspect 'else-case reached!', encoder
+ end
+
+ end
+
+ encoder
+
+ end
+
+ end
+
+end
+end