summaryrefslogtreecommitdiff
path: root/lib/coderay/scanners/rhtml.rb
diff options
context:
space:
mode:
authormurphy <murphy@rubychan.de>2006-04-10 03:06:50 +0000
committermurphy <murphy@rubychan.de>2006-04-10 03:06:50 +0000
commit5ee15661dbc2da70927f588e310315233aff6eea (patch)
tree08c959a52080e4cbcc873b49c8e5f1ed42a75ccf /lib/coderay/scanners/rhtml.rb
parent132b75e58dba4c93278721d60f177cfbee7d0e46 (diff)
downloadcoderay-5ee15661dbc2da70927f588e310315233aff6eea.tar.gz
Large update: Scanners for HTML, RHTML and Nitro-XHTML added.
CSS style changes/enhancments (mainly the new background color for inline code, affects all Ruby code.) Demos and tests adjusted. Plugin: new PluginHost::default method. Scanner: - New setup method - ability to re-use a scanner - ability to keep the tokens - minor changes to token caching and string flattening Encoder: Error if token content is neither String nor Symbol. HTML encoder: - more warnings for unclosed tokens - output now UTF-8 Ruby Scanner: - bug: symbols before => now do not include =; {:foo=>bar} is valid Ruby code - try to close all open tokens - constants now all with specific namespace (for speed, I hope) Styles: new :entity/en class. Test suite now gives hinted HTML output.
Diffstat (limited to 'lib/coderay/scanners/rhtml.rb')
-rw-r--r--lib/coderay/scanners/rhtml.rb63
1 files changed, 63 insertions, 0 deletions
diff --git a/lib/coderay/scanners/rhtml.rb b/lib/coderay/scanners/rhtml.rb
new file mode 100644
index 0000000..77a4366
--- /dev/null
+++ b/lib/coderay/scanners/rhtml.rb
@@ -0,0 +1,63 @@
+module CodeRay module Scanners
+
+ load :html
+ load :ruby
+
+ # RHTML Scanner
+ #
+ # $Id$
+ class RHTML < Scanner
+
+ include Streamable
+ register_for :rhtml
+
+ ERB_RUBY_BLOCK = /
+ <%(?!%)[=-]?
+ (?>
+ [^%]*
+ (?> %(?!>) [^%]* )*
+ )
+ (?: %> )?
+ /x
+
+ START_OF_ERB = /
+ <%(?!%)
+ /x
+
+ private
+
+ 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 scan_tokens tokens, options
+
+ until eos?
+
+ if (match = scan_until(/(?=#{START_OF_ERB})/o) || scan_until(/\z/)) and not match.empty?
+ @html_scanner.tokenize match
+
+ elsif match = scan(/#{ERB_RUBY_BLOCK}/o)
+ start_tag = match[/\A<%[-=]?/]
+ end_tag = match[/%?>?\z/]
+ tokens << [:open, :inline]
+ tokens << [start_tag, :delimiter]
+ code = match[start_tag.size .. -1 - end_tag.size]
+ @ruby_scanner.tokenize code
+ tokens << [end_tag, :delimiter] unless end_tag.empty?
+ tokens << [:close, :inline]
+
+ else
+ raise_inspect 'else-case reached!', tokens
+ end
+
+ end
+
+ tokens
+
+ end
+
+ end
+
+end end