summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormurphy <murphy@rubychan.de>2006-10-17 09:44:47 +0000
committermurphy <murphy@rubychan.de>2006-10-17 09:44:47 +0000
commit70690604e7ea6fd6b89c256a52d65a308ad0fe77 (patch)
tree8f681315abf127e16019b3de92e16899517e3db4
parent3078dddb4cb2c5f09ff92bcd56401f75b79a13d1 (diff)
downloadcoderay-70690604e7ea6fd6b89c256a52d65a308ad0fe77.tar.gz
Moved demos to sample/.
-rw-r--r--demo/coderay_demos.tar.gzbin9620 -> 0 bytes
-rw-r--r--rake_tasks/test.rake6
-rw-r--r--sample/demo_cache.computed2
-rw-r--r--sample/demo_cache.out (renamed from demo/demo_cache.out)0
-rw-r--r--sample/demo_cache.rb (renamed from demo/demo_cache.rb)0
-rw-r--r--sample/demo_count.computed1
-rw-r--r--sample/demo_count.out (renamed from demo/demo_count.out)0
-rw-r--r--sample/demo_count.rb (renamed from demo/demo_count.rb)0
-rw-r--r--sample/demo_css.computed104
-rw-r--r--sample/demo_css.out (renamed from demo/demo_css.out)0
-rw-r--r--sample/demo_css.rb (renamed from demo/demo_css.rb)0
-rw-r--r--sample/demo_div.computed17
-rw-r--r--sample/demo_div.out (renamed from demo/demo_div.out)0
-rw-r--r--sample/demo_div.rb (renamed from demo/demo_div.rb)0
-rw-r--r--sample/demo_dump.computed21
-rw-r--r--sample/demo_dump.out (renamed from demo/demo_dump.out)0
-rw-r--r--sample/demo_dump.rb (renamed from demo/demo_dump.rb)0
-rw-r--r--sample/demo_encoder.computed73
-rw-r--r--sample/demo_encoder.out (renamed from demo/demo_encoder.out)0
-rw-r--r--sample/demo_encoder.rb (renamed from demo/demo_encoder.rb)0
-rw-r--r--sample/demo_global_vars.computed3
-rw-r--r--sample/demo_global_vars.out (renamed from demo/demo_global_vars.out)0
-rw-r--r--sample/demo_global_vars.rb (renamed from demo/demo_global_vars.rb)0
-rw-r--r--sample/demo_global_vars2.computed10
-rw-r--r--sample/demo_global_vars2.out (renamed from demo/demo_global_vars2.out)0
-rw-r--r--sample/demo_global_vars2.rb (renamed from demo/demo_global_vars2.rb)0
-rw-r--r--sample/demo_highlight.computed149
-rw-r--r--sample/demo_highlight.out (renamed from demo/demo_highlight.out)0
-rw-r--r--sample/demo_highlight.rb (renamed from demo/demo_highlight.rb)0
-rw-r--r--sample/demo_html.computed893
-rw-r--r--sample/demo_html.out (renamed from demo/demo_html.out)0
-rw-r--r--sample/demo_html.rb (renamed from demo/demo_html.rb)0
-rw-r--r--sample/demo_html2.computed159
-rw-r--r--sample/demo_html2.out (renamed from demo/demo_html2.out)0
-rw-r--r--sample/demo_html2.rb (renamed from demo/demo_html2.rb)0
-rw-r--r--sample/demo_html_list.computed134
-rw-r--r--sample/demo_html_list.out (renamed from demo/demo_html_list.out)0
-rw-r--r--sample/demo_html_list.rb (renamed from demo/demo_html_list.rb)0
-rw-r--r--sample/demo_load_encoder.computed8
-rw-r--r--sample/demo_load_encoder.out (renamed from demo/demo_load_encoder.out)0
-rw-r--r--sample/demo_load_encoder.rb (renamed from demo/demo_load_encoder.rb)0
-rw-r--r--sample/demo_load_scanner.computed8
-rw-r--r--sample/demo_load_scanner.out (renamed from demo/demo_load_scanner.out)0
-rw-r--r--sample/demo_load_scanner.rb (renamed from demo/demo_load_scanner.rb)0
-rw-r--r--sample/demo_more.computed2
-rw-r--r--sample/demo_more.out (renamed from demo/demo_more.out)0
-rw-r--r--sample/demo_more.rb (renamed from demo/demo_more.rb)0
-rw-r--r--sample/demo_scanner.computed16
-rw-r--r--sample/demo_scanner.out (renamed from demo/demo_scanner.out)0
-rw-r--r--sample/demo_scanner.rb (renamed from demo/demo_scanner.rb)0
-rw-r--r--sample/demo_server.rb (renamed from demo/demo_server.rb)2
-rw-r--r--sample/demo_simple.computed1
-rw-r--r--sample/demo_simple.out (renamed from demo/demo_simple.out)0
-rw-r--r--sample/demo_simple.rb (renamed from demo/demo_simple.rb)0
-rw-r--r--sample/demo_stream.rb (renamed from demo/demo_stream.rb)0
-rw-r--r--sample/demo_stream2.computed2
-rw-r--r--sample/demo_stream2.out (renamed from demo/demo_stream2.out)0
-rw-r--r--sample/demo_stream2.rb (renamed from demo/demo_stream2.rb)0
-rw-r--r--sample/demo_tokens.computed14
-rw-r--r--sample/demo_tokens.out (renamed from demo/demo_tokens.out)0
-rw-r--r--sample/demo_tokens.rb (renamed from demo/demo_tokens.rb)0
-rw-r--r--sample/suite.rb (renamed from demo/suite.rb)2
-rw-r--r--sample/test.html543
63 files changed, 2165 insertions, 5 deletions
diff --git a/demo/coderay_demos.tar.gz b/demo/coderay_demos.tar.gz
deleted file mode 100644
index f1b3a93..0000000
--- a/demo/coderay_demos.tar.gz
+++ /dev/null
Binary files differ
diff --git a/rake_tasks/test.rake b/rake_tasks/test.rake
index 20bcf43..2a3d48e 100644
--- a/rake_tasks/test.rake
+++ b/rake_tasks/test.rake
@@ -1,7 +1,7 @@
namespace :test do
desc 'Test CodeRay Demos'
- task :demos do
- system 'ruby -wd ./demo/suite.rb'
+ task :samples do
+ system 'ruby -wd ./sample/suite.rb'
end
desc 'Test CodeRay'
@@ -18,4 +18,4 @@ namespace :test do
end
task :test => %w( test:scanners )
-task :demos => 'test:demos'
+task :samples => 'test:samples'
diff --git a/sample/demo_cache.computed b/sample/demo_cache.computed
new file mode 100644
index 0000000..f815e88
--- /dev/null
+++ b/sample/demo_cache.computed
@@ -0,0 +1,2 @@
+test &lt;test&gt;
+test <span class="ta">&lt;test&gt;</span>
diff --git a/demo/demo_cache.out b/sample/demo_cache.out
index 4dee329..4dee329 100644
--- a/demo/demo_cache.out
+++ b/sample/demo_cache.out
diff --git a/demo/demo_cache.rb b/sample/demo_cache.rb
index 0c0b847..0c0b847 100644
--- a/demo/demo_cache.rb
+++ b/sample/demo_cache.rb
diff --git a/sample/demo_count.computed b/sample/demo_count.computed
new file mode 100644
index 0000000..7f493b6
--- /dev/null
+++ b/sample/demo_count.computed
@@ -0,0 +1 @@
+2 out of 4 tokens have the kind :integer.
diff --git a/demo/demo_count.out b/sample/demo_count.out
index 68c2349..68c2349 100644
--- a/demo/demo_count.out
+++ b/sample/demo_count.out
diff --git a/demo/demo_count.rb b/sample/demo_count.rb
index bcb7c2d..bcb7c2d 100644
--- a/demo/demo_count.rb
+++ b/sample/demo_count.rb
diff --git a/sample/demo_css.computed b/sample/demo_css.computed
new file mode 100644
index 0000000..713e3e7
--- /dev/null
+++ b/sample/demo_css.computed
@@ -0,0 +1,104 @@
+.CodeRay {
+ background-color: #f8f8f8;
+ border: 1px solid silver;
+ font-family: 'Courier New', 'Terminal', monospace;
+ color: #100;
+}
+.CodeRay pre { margin: 0px }
+
+div.CodeRay { }
+
+span.CodeRay { white-space: pre; border: 0px; padding: 2px }
+
+table.CodeRay { border-collapse: collapse; width: 100%; padding: 2px }
+table.CodeRay td { padding: 2px 4px; vertical-align: top }
+
+.CodeRay .line_numbers, .CodeRay .no {
+ background-color: #def;
+ color: gray;
+ text-align: right;
+}
+.CodeRay .line_numbers tt { font-weight: bold }
+.CodeRay .no { padding: 0px 4px }
+.CodeRay .code { width: 100% }
+
+ol.CodeRay { font-size: 10pt }
+ol.CodeRay li { white-space: pre }
+
+.CodeRay .code pre { overflow: auto }
+
+.CodeRay .af { color:#00C }
+.CodeRay .an { color:#007 }
+.CodeRay .av { color:#700 }
+.CodeRay .aw { color:#C00 }
+.CodeRay .bi { color:#509; font-weight:bold }
+.CodeRay .c { color:#888 }
+
+.CodeRay .ch { color:#04D }
+.CodeRay .ch .k { color:#04D }
+.CodeRay .ch .dl { color:#039 }
+
+.CodeRay .cl { color:#B06; font-weight:bold }
+.CodeRay .co { color:#036; font-weight:bold }
+.CodeRay .cr { color:#0A0 }
+.CodeRay .cv { color:#369 }
+.CodeRay .df { color:#099; font-weight:bold }
+.CodeRay .di { color:#088; font-weight:bold }
+.CodeRay .dl { color:black }
+.CodeRay .do { color:#970 }
+.CodeRay .ds { color:#D42; font-weight:bold }
+.CodeRay .e { color:#666; font-weight:bold }
+.CodeRay .en { color:#800; font-weight:bold }
+.CodeRay .er { color:#F00; background-color:#FAA }
+.CodeRay .ex { color:#F00; font-weight:bold }
+.CodeRay .fl { color:#60E; font-weight:bold }
+.CodeRay .fu { color:#06B; font-weight:bold }
+.CodeRay .gv { color:#d70; font-weight:bold }
+.CodeRay .hx { color:#058; font-weight:bold }
+.CodeRay .i { color:#00D; font-weight:bold }
+.CodeRay .ic { color:#B44; font-weight:bold }
+
+.CodeRay .il { background: #eee }
+.CodeRay .il .il { background: #ddd }
+.CodeRay .il .il .il { background: #ccc }
+.CodeRay .il .dl { font-weight: bold ! important; color: #888 ! important }
+
+.CodeRay .in { color:#B2B; font-weight:bold }
+.CodeRay .iv { color:#33B }
+.CodeRay .la { color:#970; font-weight:bold }
+.CodeRay .lv { color:#963 }
+.CodeRay .oc { color:#40E; font-weight:bold }
+.CodeRay .on { color:#000; font-weight:bold }
+.CodeRay .op { }
+.CodeRay .pc { color:#038; font-weight:bold }
+.CodeRay .pd { color:#369; font-weight:bold }
+.CodeRay .pp { color:#579 }
+.CodeRay .pt { color:#339; font-weight:bold }
+.CodeRay .r { color:#080; font-weight:bold }
+
+.CodeRay .rx { background-color:#fff0ff }
+.CodeRay .rx .k { color:#808 }
+.CodeRay .rx .dl { color:#404 }
+.CodeRay .rx .mod { color:#C2C }
+.CodeRay .rx .fu { color:#404; font-weight: bold }
+
+.CodeRay .s { background-color:#fff0f0 }
+.CodeRay .s .s { background-color:#ffe0e0 }
+.CodeRay .s .s .s { background-color:#ffd0d0 }
+.CodeRay .s .k { color:#D20 }
+.CodeRay .s .dl { color:#710 }
+
+.CodeRay .sh { background-color:#f0fff0 }
+.CodeRay .sh .k { color:#2B2 }
+.CodeRay .sh .dl { color:#161 }
+
+.CodeRay .sy { color:#A60 }
+.CodeRay .sy .k { color:#A60 }
+.CodeRay .sy .dl { color:#630 }
+
+.CodeRay .ta { color:#070 }
+.CodeRay .tf { color:#070; font-weight:bold }
+.CodeRay .ts { color:#D70; font-weight:bold }
+.CodeRay .ty { color:#339; font-weight:bold }
+.CodeRay .v { color:#036 }
+.CodeRay .xt { color:#444 }
diff --git a/demo/demo_css.out b/sample/demo_css.out
index b3b7a84..b3b7a84 100644
--- a/demo/demo_css.out
+++ b/sample/demo_css.out
diff --git a/demo/demo_css.rb b/sample/demo_css.rb
index 52e4bcc..52e4bcc 100644
--- a/demo/demo_css.rb
+++ b/sample/demo_css.rb
diff --git a/sample/demo_div.computed b/sample/demo_div.computed
new file mode 100644
index 0000000..ec9676d
--- /dev/null
+++ b/sample/demo_div.computed
@@ -0,0 +1,17 @@
+<div class="CodeRay">
+ <div class="code"><pre><span style="color:#080; font-weight:bold">for</span> a <span style="color:#080; font-weight:bold">in</span> <span style="color:#00D; font-weight:bold">0</span>..<span style="color:#00D; font-weight:bold">255</span>
+ a = a.chr
+ <span style="color:#080; font-weight:bold">begin</span>
+ x = eval(<span style="background-color:#fff0f0"><span style="color:#710">&quot;</span><span style="color:#D20">?</span><span style="color:#04D">\\</span><span style="background-color:#fff0f0"><span style="color:#710">#{</span>a<span style="color:#710">}</span></span><span style="color:#710">&quot;</span></span>)
+ <span style="color:#080; font-weight:bold">if</span> x == a[<span style="color:#00D; font-weight:bold">0</span>]
+ <span style="color:#080; font-weight:bold">next</span>
+ <span style="color:#080; font-weight:bold">else</span>
+ print <span style="background-color:#fff0f0"><span style="color:#710">&quot;</span><span style="background-color:#fff0f0"><span style="color:#710">#{</span>a<span style="color:#710">}</span></span><span style="color:#D20">: </span><span style="background-color:#fff0f0"><span style="color:#710">#{</span>x<span style="color:#710">}</span></span><span style="color:#710">&quot;</span></span>
+ <span style="color:#080; font-weight:bold">end</span>
+ <span style="color:#080; font-weight:bold">rescue</span> <span style="color:#036; font-weight:bold">SyntaxError</span> =&gt; boom
+ print <span style="background-color:#fff0f0"><span style="color:#710">&quot;</span><span style="background-color:#fff0f0"><span style="color:#710">#{</span>a<span style="color:#710">}</span></span><span style="color:#D20">: error</span><span style="color:#710">&quot;</span></span>
+ <span style="color:#080; font-weight:bold">end</span>
+ puts
+<span style="color:#080; font-weight:bold">end</span>
+</pre></div>
+</div>
diff --git a/demo/demo_div.out b/sample/demo_div.out
index 2d4317e..2d4317e 100644
--- a/demo/demo_div.out
+++ b/sample/demo_div.out
diff --git a/demo/demo_div.rb b/sample/demo_div.rb
index 27b6f32..27b6f32 100644
--- a/demo/demo_div.rb
+++ b/sample/demo_div.rb
diff --git a/sample/demo_dump.computed b/sample/demo_dump.computed
new file mode 100644
index 0000000..2c24962
--- /dev/null
+++ b/sample/demo_dump.computed
@@ -0,0 +1,21 @@
+YAML: 2358 bytes
+Dump: 1058 bytes
+undumped:
+<div class="CodeRay">
+ <div class="code"><pre>require <span class="s"><span class="dl">'</span><span class="k">coderay</span><span class="dl">'</span></span>
+
+<span class="c"># scan some code</span>
+tokens = <span class="co">CodeRay</span>.scan(<span class="co">File</span>.read(<span class="gv">$0</span>), <span class="sy">:ruby</span>)
+
+<span class="c"># dump using YAML</span>
+yaml = tokens.yaml
+puts <span class="s"><span class="dl">'</span><span class="k">YAML: %4d bytes</span><span class="dl">'</span></span> % yaml.size
+
+<span class="c"># dump using Marshal</span>
+dump = tokens.dump(<span class="i">0</span>)
+puts <span class="s"><span class="dl">'</span><span class="k">Dump: %4d bytes</span><span class="dl">'</span></span> % dump.size
+
+<span class="c"># undump and encode</span>
+puts <span class="s"><span class="dl">'</span><span class="k">undumped:</span><span class="dl">'</span></span>, dump.undump.div(<span class="sy">:css</span> =&gt; <span class="sy">:class</span>)
+</pre></div>
+</div>
diff --git a/demo/demo_dump.out b/sample/demo_dump.out
index 5e3a64b..5e3a64b 100644
--- a/demo/demo_dump.out
+++ b/sample/demo_dump.out
diff --git a/demo/demo_dump.rb b/sample/demo_dump.rb
index cd68dc8..cd68dc8 100644
--- a/demo/demo_dump.rb
+++ b/sample/demo_dump.rb
diff --git a/sample/demo_encoder.computed b/sample/demo_encoder.computed
new file mode 100644
index 0000000..c221d25
--- /dev/null
+++ b/sample/demo_encoder.computed
@@ -0,0 +1,73 @@
+Encoders Demo: puts 17 + 4
+
+Statistic:
+
+Code Statistics
+
+Tokens 8
+ Non-Whitespace 4
+Bytes Total 12
+
+Token Types (4):
+ type count ratio size (average)
+-------------------------------------------------------------
+ TOTAL 8 100.00 % 1.5
+ space 4 50.00 % 1.0
+ integer 2 25.00 % 1.5
+ ident 1 12.50 % 4.0
+ operator 1 12.50 % 1.0
+
+
+Original text:
+ident puts
+space
+integer 17
+space
+operator +
+space
+integer 4
+space \
+
+
+YAML:
+---
+- - puts
+ - :ident
+- - " "
+ - :space
+- - "17"
+ - :integer
+- - " "
+ - :space
+- - +
+ - :operator
+- - " "
+ - :space
+- - "4"
+ - :integer
+- - |
+
+
+ - :space
+
+Dump:
+"x\332\355\314;\n\302@\024\205aP\311c\320\316\005\004[+A\020\356\224\331\201\330\245\n\346\"A\230\0312c\341\356M\"\242k\220\277\272\217\303wVE-\333\332wzn\237\"\027\177W\027\233E\265l\362]\031\036)\212\351;ui<\263JL\f\355U\307=?\234d\335\273\2447\035\346\310\346\323\330\313\306\a\035\332\344\177\277G[L\303\314\327\\j\263o<V\275\363O\207-\261X,\026\213\305b\261X,\026\213\305b\261X,\026\213\375{\373\002\212L\274o"
+compressed: 150 byte < 1200 byte
+
+Undump:
+
+Code Statistics
+
+Tokens 800
+ Non-Whitespace 400
+Bytes Total 1200
+
+Token Types (4):
+ type count ratio size (average)
+-------------------------------------------------------------
+ TOTAL 800 100.00 % 1.5
+ space 400 50.00 % 1.0
+ integer 200 25.00 % 1.5
+ ident 100 12.50 % 4.0
+ operator 100 12.50 % 1.0
+
diff --git a/demo/demo_encoder.out b/sample/demo_encoder.out
index aa35a61..aa35a61 100644
--- a/demo/demo_encoder.out
+++ b/sample/demo_encoder.out
diff --git a/demo/demo_encoder.rb b/sample/demo_encoder.rb
index 267676b..267676b 100644
--- a/demo/demo_encoder.rb
+++ b/sample/demo_encoder.rb
diff --git a/sample/demo_global_vars.computed b/sample/demo_global_vars.computed
new file mode 100644
index 0000000..0dc13c8
--- /dev/null
+++ b/sample/demo_global_vars.computed
@@ -0,0 +1,3 @@
+<--$IE-->.TEXT_FIELD(:NAME, "PANFRAGE OHNE $GV UND MIT #{<--$GV-->}").SET ARTIKEL
+ODER
+TEXT = <--$BLA-->.TEST(...) \ No newline at end of file
diff --git a/demo/demo_global_vars.out b/sample/demo_global_vars.out
index 10b9f84..10b9f84 100644
--- a/demo/demo_global_vars.out
+++ b/sample/demo_global_vars.out
diff --git a/demo/demo_global_vars.rb b/sample/demo_global_vars.rb
index 8066d67..8066d67 100644
--- a/demo/demo_global_vars.rb
+++ b/sample/demo_global_vars.rb
diff --git a/sample/demo_global_vars2.computed b/sample/demo_global_vars2.computed
new file mode 100644
index 0000000..964cf50
--- /dev/null
+++ b/sample/demo_global_vars2.computed
@@ -0,0 +1,10 @@
+<html>
+<head>
+<style>span.glob-var { color: green; font-weight: bold; }</style>
+</head>
+<body>
+<span class="glob-var">$ie</span>.text_field(:name, &quot;pAnfrage ohne $gV und mit #{<span class="glob-var">$gv</span>}&quot;).set artikel
+oder
+text = <span class="glob-var">$bla</span>.test(...)
+</body>
+</html>
diff --git a/demo/demo_global_vars2.out b/sample/demo_global_vars2.out
index bd9f05f..bd9f05f 100644
--- a/demo/demo_global_vars2.out
+++ b/sample/demo_global_vars2.out
diff --git a/demo/demo_global_vars2.rb b/sample/demo_global_vars2.rb
index 7646890..7646890 100644
--- a/demo/demo_global_vars2.rb
+++ b/sample/demo_global_vars2.rb
diff --git a/sample/demo_highlight.computed b/sample/demo_highlight.computed
new file mode 100644
index 0000000..7b50566
--- /dev/null
+++ b/sample/demo_highlight.computed
@@ -0,0 +1,149 @@
+<div class="CodeRay">
+ <div class="code"><pre>puts <span class="s"><span class="dl">&quot;</span><span class="k">Hello, World!</span><span class="dl">&quot;</span></span></pre></div>
+</div>
+<html>
+<head>
+<style type="text/css">
+.CodeRay {
+ background-color: #f8f8f8;
+ border: 1px solid silver;
+ font-family: 'Courier New', 'Terminal', monospace;
+ color: #100;
+}
+.CodeRay pre { margin: 0px }
+
+div.CodeRay { }
+
+span.CodeRay { white-space: pre; border: 0px; padding: 2px }
+
+table.CodeRay { border-collapse: collapse; width: 100%; padding: 2px }
+table.CodeRay td { padding: 2px 4px; vertical-align: top }
+
+.CodeRay .line_numbers, .CodeRay .no {
+ background-color: #def;
+ color: gray;
+ text-align: right;
+}
+.CodeRay .line_numbers tt { font-weight: bold }
+.CodeRay .no { padding: 0px 4px }
+.CodeRay .code { width: 100% }
+
+ol.CodeRay { font-size: 10pt }
+ol.CodeRay li { white-space: pre }
+
+.CodeRay .code pre { overflow: auto }
+
+.CodeRay .af { color:#00C }
+.CodeRay .an { color:#007 }
+.CodeRay .av { color:#700 }
+.CodeRay .aw { color:#C00 }
+.CodeRay .bi { color:#509; font-weight:bold }
+.CodeRay .c { color:#888 }
+
+.CodeRay .ch { color:#04D }
+.CodeRay .ch .k { color:#04D }
+.CodeRay .ch .dl { color:#039 }
+
+.CodeRay .cl { color:#B06; font-weight:bold }
+.CodeRay .co { color:#036; font-weight:bold }
+.CodeRay .cr { color:#0A0 }
+.CodeRay .cv { color:#369 }
+.CodeRay .df { color:#099; font-weight:bold }
+.CodeRay .di { color:#088; font-weight:bold }
+.CodeRay .dl { color:black }
+.CodeRay .do { color:#970 }
+.CodeRay .ds { color:#D42; font-weight:bold }
+.CodeRay .e { color:#666; font-weight:bold }
+.CodeRay .en { color:#800; font-weight:bold }
+.CodeRay .er { color:#F00; background-color:#FAA }
+.CodeRay .ex { color:#F00; font-weight:bold }
+.CodeRay .fl { color:#60E; font-weight:bold }
+.CodeRay .fu { color:#06B; font-weight:bold }
+.CodeRay .gv { color:#d70; font-weight:bold }
+.CodeRay .hx { color:#058; font-weight:bold }
+.CodeRay .i { color:#00D; font-weight:bold }
+.CodeRay .ic { color:#B44; font-weight:bold }
+
+.CodeRay .il { background: #eee }
+.CodeRay .il .il { background: #ddd }
+.CodeRay .il .il .il { background: #ccc }
+.CodeRay .il .dl { font-weight: bold ! important; color: #888 ! important }
+
+.CodeRay .in { color:#B2B; font-weight:bold }
+.CodeRay .iv { color:#33B }
+.CodeRay .la { color:#970; font-weight:bold }
+.CodeRay .lv { color:#963 }
+.CodeRay .oc { color:#40E; font-weight:bold }
+.CodeRay .on { color:#000; font-weight:bold }
+.CodeRay .op { }
+.CodeRay .pc { color:#038; font-weight:bold }
+.CodeRay .pd { color:#369; font-weight:bold }
+.CodeRay .pp { color:#579 }
+.CodeRay .pt { color:#339; font-weight:bold }
+.CodeRay .r { color:#080; font-weight:bold }
+
+.CodeRay .rx { background-color:#fff0ff }
+.CodeRay .rx .k { color:#808 }
+.CodeRay .rx .dl { color:#404 }
+.CodeRay .rx .mod { color:#C2C }
+.CodeRay .rx .fu { color:#404; font-weight: bold }
+
+.CodeRay .s { background-color:#fff0f0 }
+.CodeRay .s .s { background-color:#ffe0e0 }
+.CodeRay .s .s .s { background-color:#ffd0d0 }
+.CodeRay .s .k { color:#D20 }
+.CodeRay .s .dl { color:#710 }
+
+.CodeRay .sh { background-color:#f0fff0 }
+.CodeRay .sh .k { color:#2B2 }
+.CodeRay .sh .dl { color:#161 }
+
+.CodeRay .sy { color:#A60 }
+.CodeRay .sy .k { color:#A60 }
+.CodeRay .sy .dl { color:#630 }
+
+.CodeRay .ta { color:#070 }
+.CodeRay .tf { color:#070; font-weight:bold }
+.CodeRay .ts { color:#D70; font-weight:bold }
+.CodeRay .ty { color:#339; font-weight:bold }
+.CodeRay .v { color:#036 }
+.CodeRay .xt { color:#444 }
+
+</style>
+
+<body>
+<table class="CodeRay"><tr>
+ <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt>
+</tt>2<tt>
+</tt>3<tt>
+</tt>4<tt>
+</tt>5<tt>
+</tt>6<tt>
+</tt>7<tt>
+</tt>8<tt>
+</tt>9<tt>
+</tt><strong>10</strong><tt>
+</tt>11<tt>
+</tt>12<tt>
+</tt>13<tt>
+</tt>14<tt>
+</tt></pre></td>
+ <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">require <span style="background-color:#fff0f0"><span style="color:#710">'</span><span style="color:#D20">coderay</span><span style="color:#710">'</span></span><tt>
+</tt><tt>
+</tt>puts <span style="color:#036; font-weight:bold">CodeRay</span>.highlight(<span style="background-color:#fff0f0"><span style="color:#710">'</span><span style="color:#D20">puts &quot;Hello, World!&quot;</span><span style="color:#710">'</span></span>, <span style="color:#A60">:ruby</span>)<tt>
+</tt><tt>
+</tt>output = <span style="color:#036; font-weight:bold">CodeRay</span>.highlight_file(<span style="color:#d70; font-weight:bold">$0</span>, <span style="color:#A60">:line_numbers</span> =&gt; <span style="color:#A60">:table</span>)<tt>
+</tt>puts <span style="background-color:#fff0f0"><span style="color:#710">&lt;&lt;HTML</span></span><span style="background-color:#fff0f0"><span style="color:#D20"><tt>
+</tt>&lt;html&gt;<tt>
+</tt>&lt;head&gt;<tt>
+</tt></span><span style="background-color:#fff0f0"><span style="color:#710">#{</span>output.stylesheet <span style="color:#038; font-weight:bold">true</span><span style="color:#710">}</span></span><span style="color:#D20"><tt>
+</tt>&lt;body&gt;<tt>
+</tt></span><span style="background-color:#fff0f0"><span style="color:#710">#{</span>output<span style="color:#710">}</span></span><span style="color:#D20"><tt>
+</tt>&lt;/body&gt;<tt>
+</tt>&lt;/html&gt;</span><span style="color:#710"><tt>
+</tt>HTML</span></span><tt>
+</tt></pre></td>
+</tr></table>
+
+</body>
+</html>
diff --git a/demo/demo_highlight.out b/sample/demo_highlight.out
index 60738e7..60738e7 100644
--- a/demo/demo_highlight.out
+++ b/sample/demo_highlight.out
diff --git a/demo/demo_highlight.rb b/sample/demo_highlight.rb
index 846efa4..846efa4 100644
--- a/demo/demo_highlight.rb
+++ b/sample/demo_highlight.rb
diff --git a/sample/demo_html.computed b/sample/demo_html.computed
new file mode 100644
index 0000000..1e29612
--- /dev/null
+++ b/sample/demo_html.computed
@@ -0,0 +1,893 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="de">
+<head>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+ <title>CodeRay HTML Encoder Example</title>
+ <style type="text/css">
+.CodeRay {
+ background-color: #f8f8f8;
+ border: 1px solid silver;
+ font-family: 'Courier New', 'Terminal', monospace;
+ color: #100;
+}
+.CodeRay pre { margin: 0px }
+
+div.CodeRay { }
+
+span.CodeRay { white-space: pre; border: 0px; padding: 2px }
+
+table.CodeRay { border-collapse: collapse; width: 100%; padding: 2px }
+table.CodeRay td { padding: 2px 4px; vertical-align: top }
+
+.CodeRay .line_numbers, .CodeRay .no {
+ background-color: #def;
+ color: gray;
+ text-align: right;
+}
+.CodeRay .line_numbers tt { font-weight: bold }
+.CodeRay .no { padding: 0px 4px }
+.CodeRay .code { width: 100% }
+
+ol.CodeRay { font-size: 10pt }
+ol.CodeRay li { white-space: pre }
+
+.CodeRay .code pre { overflow: auto }
+
+.CodeRay .af { color:#00C }
+.CodeRay .an { color:#007 }
+.CodeRay .av { color:#700 }
+.CodeRay .aw { color:#C00 }
+.CodeRay .bi { color:#509; font-weight:bold }
+.CodeRay .c { color:#888 }
+
+.CodeRay .ch { color:#04D }
+.CodeRay .ch .k { color:#04D }
+.CodeRay .ch .dl { color:#039 }
+
+.CodeRay .cl { color:#B06; font-weight:bold }
+.CodeRay .co { color:#036; font-weight:bold }
+.CodeRay .cr { color:#0A0 }
+.CodeRay .cv { color:#369 }
+.CodeRay .df { color:#099; font-weight:bold }
+.CodeRay .di { color:#088; font-weight:bold }
+.CodeRay .dl { color:black }
+.CodeRay .do { color:#970 }
+.CodeRay .ds { color:#D42; font-weight:bold }
+.CodeRay .e { color:#666; font-weight:bold }
+.CodeRay .en { color:#800; font-weight:bold }
+.CodeRay .er { color:#F00; background-color:#FAA }
+.CodeRay .ex { color:#F00; font-weight:bold }
+.CodeRay .fl { color:#60E; font-weight:bold }
+.CodeRay .fu { color:#06B; font-weight:bold }
+.CodeRay .gv { color:#d70; font-weight:bold }
+.CodeRay .hx { color:#058; font-weight:bold }
+.CodeRay .i { color:#00D; font-weight:bold }
+.CodeRay .ic { color:#B44; font-weight:bold }
+
+.CodeRay .il { background: #eee }
+.CodeRay .il .il { background: #ddd }
+.CodeRay .il .il .il { background: #ccc }
+.CodeRay .il .dl { font-weight: bold ! important; color: #888 ! important }
+
+.CodeRay .in { color:#B2B; font-weight:bold }
+.CodeRay .iv { color:#33B }
+.CodeRay .la { color:#970; font-weight:bold }
+.CodeRay .lv { color:#963 }
+.CodeRay .oc { color:#40E; font-weight:bold }
+.CodeRay .on { color:#000; font-weight:bold }
+.CodeRay .op { }
+.CodeRay .pc { color:#038; font-weight:bold }
+.CodeRay .pd { color:#369; font-weight:bold }
+.CodeRay .pp { color:#579 }
+.CodeRay .pt { color:#339; font-weight:bold }
+.CodeRay .r { color:#080; font-weight:bold }
+
+.CodeRay .rx { background-color:#fff0ff }
+.CodeRay .rx .k { color:#808 }
+.CodeRay .rx .dl { color:#404 }
+.CodeRay .rx .mod { color:#C2C }
+.CodeRay .rx .fu { color:#404; font-weight: bold }
+
+.CodeRay .s { background-color:#fff0f0 }
+.CodeRay .s .s { background-color:#ffe0e0 }
+.CodeRay .s .s .s { background-color:#ffd0d0 }
+.CodeRay .s .k { color:#D20 }
+.CodeRay .s .dl { color:#710 }
+
+.CodeRay .sh { background-color:#f0fff0 }
+.CodeRay .sh .k { color:#2B2 }
+.CodeRay .sh .dl { color:#161 }
+
+.CodeRay .sy { color:#A60 }
+.CodeRay .sy .k { color:#A60 }
+.CodeRay .sy .dl { color:#630 }
+
+.CodeRay .ta { color:#070 }
+.CodeRay .tf { color:#070; font-weight:bold }
+.CodeRay .ts { color:#D70; font-weight:bold }
+.CodeRay .ty { color:#339; font-weight:bold }
+.CodeRay .v { color:#036 }
+.CodeRay .xt { color:#444 }
+
+ </style>
+</head>
+<body style="background-color: white;">
+
+<table class="CodeRay"><tr>
+ <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt>
+</tt>2<tt>
+</tt>3<tt>
+</tt>4<tt>
+</tt>5<tt>
+</tt>6<tt>
+</tt>7<tt>
+</tt>8<tt>
+</tt>9<tt>
+</tt><strong>10</strong><tt>
+</tt>11<tt>
+</tt>12<tt>
+</tt>13<tt>
+</tt>14<tt>
+</tt>15<tt>
+</tt>16<tt>
+</tt>17<tt>
+</tt>18<tt>
+</tt>19<tt>
+</tt><strong>20</strong><tt>
+</tt>21<tt>
+</tt>22<tt>
+</tt>23<tt>
+</tt>24<tt>
+</tt>25<tt>
+</tt>26<tt>
+</tt>27<tt>
+</tt>28<tt>
+</tt>29<tt>
+</tt><strong>30</strong><tt>
+</tt>31<tt>
+</tt>32<tt>
+</tt>33<tt>
+</tt>34<tt>
+</tt>35<tt>
+</tt>36<tt>
+</tt>37<tt>
+</tt>38<tt>
+</tt>39<tt>
+</tt><strong>40</strong><tt>
+</tt>41<tt>
+</tt>42<tt>
+</tt>43<tt>
+</tt>44<tt>
+</tt>45<tt>
+</tt>46<tt>
+</tt>47<tt>
+</tt>48<tt>
+</tt>49<tt>
+</tt><strong>50</strong><tt>
+</tt>51<tt>
+</tt>52<tt>
+</tt>53<tt>
+</tt>54<tt>
+</tt>55<tt>
+</tt>56<tt>
+</tt>57<tt>
+</tt>58<tt>
+</tt>59<tt>
+</tt><strong>60</strong><tt>
+</tt>61<tt>
+</tt>62<tt>
+</tt>63<tt>
+</tt>64<tt>
+</tt>65<tt>
+</tt>66<tt>
+</tt>67<tt>
+</tt>68<tt>
+</tt>69<tt>
+</tt><strong>70</strong><tt>
+</tt>71<tt>
+</tt>72<tt>
+</tt>73<tt>
+</tt>74<tt>
+</tt>75<tt>
+</tt>76<tt>
+</tt>77<tt>
+</tt>78<tt>
+</tt>79<tt>
+</tt><strong>80</strong><tt>
+</tt>81<tt>
+</tt>82<tt>
+</tt>83<tt>
+</tt>84<tt>
+</tt>85<tt>
+</tt>86<tt>
+</tt>87<tt>
+</tt>88<tt>
+</tt>89<tt>
+</tt><strong>90</strong><tt>
+</tt>91<tt>
+</tt>92<tt>
+</tt>93<tt>
+</tt>94<tt>
+</tt>95<tt>
+</tt>96<tt>
+</tt>97<tt>
+</tt>98<tt>
+</tt>99<tt>
+</tt><strong>100</strong><tt>
+</tt>101<tt>
+</tt>102<tt>
+</tt>103<tt>
+</tt>104<tt>
+</tt>105<tt>
+</tt>106<tt>
+</tt>107<tt>
+</tt>108<tt>
+</tt>109<tt>
+</tt><strong>110</strong><tt>
+</tt>111<tt>
+</tt>112<tt>
+</tt>113<tt>
+</tt>114<tt>
+</tt>115<tt>
+</tt>116<tt>
+</tt>117<tt>
+</tt>118<tt>
+</tt>119<tt>
+</tt><strong>120</strong><tt>
+</tt>121<tt>
+</tt>122<tt>
+</tt>123<tt>
+</tt>124<tt>
+</tt>125<tt>
+</tt>126<tt>
+</tt>127<tt>
+</tt>128<tt>
+</tt>129<tt>
+</tt><strong>130</strong><tt>
+</tt>131<tt>
+</tt>132<tt>
+</tt>133<tt>
+</tt>134<tt>
+</tt>135<tt>
+</tt>136<tt>
+</tt>137<tt>
+</tt>138<tt>
+</tt>139<tt>
+</tt><strong>140</strong><tt>
+</tt>141<tt>
+</tt>142<tt>
+</tt>143<tt>
+</tt>144<tt>
+</tt>145<tt>
+</tt>146<tt>
+</tt>147<tt>
+</tt>148<tt>
+</tt>149<tt>
+</tt><strong>150</strong><tt>
+</tt>151<tt>
+</tt>152<tt>
+</tt>153<tt>
+</tt>154<tt>
+</tt>155<tt>
+</tt>156<tt>
+</tt>157<tt>
+</tt>158<tt>
+</tt>159<tt>
+</tt><strong>160</strong><tt>
+</tt>161<tt>
+</tt>162<tt>
+</tt>163<tt>
+</tt>164<tt>
+</tt>165<tt>
+</tt>166<tt>
+</tt>167<tt>
+</tt>168<tt>
+</tt>169<tt>
+</tt><strong>170</strong><tt>
+</tt>171<tt>
+</tt>172<tt>
+</tt>173<tt>
+</tt>174<tt>
+</tt>175<tt>
+</tt>176<tt>
+</tt>177<tt>
+</tt>178<tt>
+</tt>179<tt>
+</tt><strong>180</strong><tt>
+</tt>181<tt>
+</tt>182<tt>
+</tt>183<tt>
+</tt>184<tt>
+</tt>185<tt>
+</tt>186<tt>
+</tt>187<tt>
+</tt>188<tt>
+</tt>189<tt>
+</tt><strong>190</strong><tt>
+</tt>191<tt>
+</tt>192<tt>
+</tt>193<tt>
+</tt>194<tt>
+</tt>195<tt>
+</tt>196<tt>
+</tt>197<tt>
+</tt>198<tt>
+</tt>199<tt>
+</tt><strong>200</strong><tt>
+</tt>201<tt>
+</tt>202<tt>
+</tt>203<tt>
+</tt>204<tt>
+</tt>205<tt>
+</tt>206<tt>
+</tt>207<tt>
+</tt>208<tt>
+</tt>209<tt>
+</tt><strong>210</strong><tt>
+</tt>211<tt>
+</tt>212<tt>
+</tt>213<tt>
+</tt>214<tt>
+</tt>215<tt>
+</tt>216<tt>
+</tt>217<tt>
+</tt>218<tt>
+</tt>219<tt>
+</tt><strong>220</strong><tt>
+</tt>221<tt>
+</tt>222<tt>
+</tt>223<tt>
+</tt>224<tt>
+</tt>225<tt>
+</tt>226<tt>
+</tt>227<tt>
+</tt>228<tt>
+</tt>229<tt>
+</tt><strong>230</strong><tt>
+</tt>231<tt>
+</tt>232<tt>
+</tt>233<tt>
+</tt>234<tt>
+</tt>235<tt>
+</tt>236<tt>
+</tt>237<tt>
+</tt>238<tt>
+</tt>239<tt>
+</tt><strong>240</strong><tt>
+</tt>241<tt>
+</tt>242<tt>
+</tt>243<tt>
+</tt>244<tt>
+</tt>245<tt>
+</tt>246<tt>
+</tt>247<tt>
+</tt>248<tt>
+</tt>249<tt>
+</tt><strong>250</strong><tt>
+</tt>251<tt>
+</tt>252<tt>
+</tt>253<tt>
+</tt>254<tt>
+</tt>255<tt>
+</tt>256<tt>
+</tt>257<tt>
+</tt>258<tt>
+</tt>259<tt>
+</tt><strong>260</strong><tt>
+</tt>261<tt>
+</tt>262<tt>
+</tt>263<tt>
+</tt>264<tt>
+</tt>265<tt>
+</tt>266<tt>
+</tt>267<tt>
+</tt>268<tt>
+</tt>269<tt>
+</tt><strong>270</strong><tt>
+</tt>271<tt>
+</tt>272<tt>
+</tt>273<tt>
+</tt>274<tt>
+</tt>275<tt>
+</tt>276<tt>
+</tt>277<tt>
+</tt>278<tt>
+</tt>279<tt>
+</tt><strong>280</strong><tt>
+</tt>281<tt>
+</tt>282<tt>
+</tt>283<tt>
+</tt>284<tt>
+</tt>285<tt>
+</tt>286<tt>
+</tt>287<tt>
+</tt>288<tt>
+</tt>289<tt>
+</tt><strong>290</strong><tt>
+</tt>291<tt>
+</tt>292<tt>
+</tt>293<tt>
+</tt>294<tt>
+</tt>295<tt>
+</tt>296<tt>
+</tt>297<tt>
+</tt>298<tt>
+</tt>299<tt>
+</tt><strong>300</strong><tt>
+</tt>301<tt>
+</tt>302<tt>
+</tt>303<tt>
+</tt>304<tt>
+</tt>305<tt>
+</tt>306<tt>
+</tt>307<tt>
+</tt>308<tt>
+</tt>309<tt>
+</tt><strong>310</strong><tt>
+</tt>311<tt>
+</tt>312<tt>
+</tt>313<tt>
+</tt>314<tt>
+</tt>315<tt>
+</tt>316<tt>
+</tt>317<tt>
+</tt>318<tt>
+</tt>319<tt>
+</tt><strong>320</strong><tt>
+</tt>321<tt>
+</tt>322<tt>
+</tt>323<tt>
+</tt>324<tt>
+</tt>325<tt>
+</tt>326<tt>
+</tt>327<tt>
+</tt>328<tt>
+</tt>329<tt>
+</tt><strong>330</strong><tt>
+</tt>331<tt>
+</tt>332<tt>
+</tt>333<tt>
+</tt>334<tt>
+</tt>335<tt>
+</tt>336<tt>
+</tt>337<tt>
+</tt>338<tt>
+</tt>339<tt>
+</tt><strong>340</strong><tt>
+</tt>341<tt>
+</tt>342<tt>
+</tt>343<tt>
+</tt>344<tt>
+</tt>345<tt>
+</tt>346<tt>
+</tt>347<tt>
+</tt>348<tt>
+</tt>349<tt>
+</tt><strong>350</strong><tt>
+</tt>351<tt>
+</tt>352<tt>
+</tt>353<tt>
+</tt>354<tt>
+</tt>355<tt>
+</tt>356<tt>
+</tt>357<tt>
+</tt>358<tt>
+</tt>359<tt>
+</tt><strong>360</strong><tt>
+</tt>361<tt>
+</tt>362<tt>
+</tt>363<tt>
+</tt>364<tt>
+</tt>365<tt>
+</tt>366<tt>
+</tt>367<tt>
+</tt>368<tt>
+</tt>369<tt>
+</tt><strong>370</strong><tt>
+</tt>371<tt>
+</tt>372<tt>
+</tt>373<tt>
+</tt>374<tt>
+</tt>375<tt>
+</tt>376<tt>
+</tt>377<tt>
+</tt>378<tt>
+</tt>379<tt>
+</tt><strong>380</strong><tt>
+</tt>381<tt>
+</tt>382<tt>
+</tt>383<tt>
+</tt>384<tt>
+</tt>385<tt>
+</tt></pre></td>
+ <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">require <span class="s"><span class="dl">'</span><span class="k">scanner</span><span class="dl">'</span></span><tt>
+</tt><tt>
+</tt><span class="r">module</span> <span class="cl">CodeRay</span><tt>
+</tt> <tt>
+</tt> <span class="r">class</span> <span class="cl">RubyScanner</span> &lt; <span class="co">Scanner</span><tt>
+</tt> <tt>
+</tt> <span class="co">RESERVED_WORDS</span> = [<tt>
+</tt> <span class="s"><span class="dl">'</span><span class="k">and</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">def</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">end</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">in</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">or</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">unless</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">begin</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="s"><span class="dl">'</span><span class="k">defined?</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">ensure</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">module</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">redo</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">super</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">until</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="s"><span class="dl">'</span><span class="k">BEGIN</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">break</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">do</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">next</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">rescue</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">then</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="s"><span class="dl">'</span><span class="k">when</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">END</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">case</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">else</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">for</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">retry</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="s"><span class="dl">'</span><span class="k">while</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">alias</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">class</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">elsif</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">if</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">not</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">return</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="s"><span class="dl">'</span><span class="k">undef</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">yield</span><span class="dl">'</span></span>,<tt>
+</tt> ]<tt>
+</tt><tt>
+</tt> <span class="co">DEF_KEYWORDS</span> = [<span class="s"><span class="dl">'</span><span class="k">def</span><span class="dl">'</span></span>]<tt>
+</tt> <span class="co">MODULE_KEYWORDS</span> = [<span class="s"><span class="dl">'</span><span class="k">class</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">module</span><span class="dl">'</span></span>]<tt>
+</tt> <span class="co">DEF_NEW_STATE</span> = <span class="co">WordList</span>.new(<span class="sy">:initial</span>).<tt>
+</tt> add(<span class="co">DEF_KEYWORDS</span>, <span class="sy">:def_expected</span>).<tt>
+</tt> add(<span class="co">MODULE_KEYWORDS</span>, <span class="sy">:module_expected</span>)<tt>
+</tt><tt>
+</tt> <span class="co">WORDS_ALLOWING_REGEXP</span> = [<tt>
+</tt> <span class="s"><span class="dl">'</span><span class="k">and</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">or</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">not</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">while</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">until</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">unless</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">if</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">elsif</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">when</span><span class="dl">'</span></span><tt>
+</tt> ]<tt>
+</tt> <span class="co">REGEXP_ALLOWED</span> = <span class="co">WordList</span>.new(<span class="pc">false</span>).<tt>
+</tt> add(<span class="co">WORDS_ALLOWING_REGEXP</span>, <span class="sy">:set</span>)<tt>
+</tt> <tt>
+</tt> <span class="co">PREDEFINED_CONSTANTS</span> = [<tt>
+</tt> <span class="s"><span class="dl">'</span><span class="k">nil</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">true</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">false</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">self</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="s"><span class="dl">'</span><span class="k">DATA</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">ARGV</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">ARGF</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">__FILE__</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">__LINE__</span><span class="dl">'</span></span>,<tt>
+</tt> ]<tt>
+</tt><tt>
+</tt> <span class="co">IDENT_KIND</span> = <span class="co">WordList</span>.new(<span class="sy">:ident</span>).<tt>
+</tt> add(<span class="co">RESERVED_WORDS</span>, <span class="sy">:reserved</span>).<tt>
+</tt> add(<span class="co">PREDEFINED_CONSTANTS</span>, <span class="sy">:pre_constant</span>)<tt>
+</tt><tt>
+</tt> <span class="co">METHOD_NAME</span> = <span class="rx"><span class="dl">/</span><span class="k"> </span><span class="il"><span class="dl">#{</span><span class="co">IDENT</span><span class="dl">}</span></span><span class="k"> [?!]? </span><span class="dl">/</span><span class="mod">xo</span></span><tt>
+</tt> <span class="co">METHOD_NAME_EX</span> = <span class="rx"><span class="dl">/</span><span class="k"><tt>
+</tt> </span><span class="il"><span class="dl">#{</span><span class="co">METHOD_NAME</span><span class="dl">}</span></span><span class="k"> # common methods: split, foo=, empty?, gsub!<tt>
+</tt> | </span><span class="ch">\*</span><span class="ch">\*</span><span class="k">? # multiplication and power<tt>
+</tt> | [-+~]@? # plus, minus<tt>
+</tt> | [</span><span class="ch">\/</span><span class="k">%&amp;|^`] # division, modulo or format strings, &amp;and, |or, ^xor, `system`<tt>
+</tt> | </span><span class="ch">\[</span><span class="ch">\]</span><span class="k">=? # array getter and setter<tt>
+</tt> | &lt;=?&gt;? | &gt;=? # comparison, rocket operator<tt>
+</tt> | &lt;&lt; | &gt;&gt; # append or shift left, shift right<tt>
+</tt> | ===? # simple equality and case equality<tt>
+</tt> </span><span class="dl">/</span><span class="mod">ox</span></span><tt>
+</tt> <span class="co">GLOBAL_VARIABLE</span> = <span class="rx"><span class="dl">/</span><span class="k"> </span><span class="ch">\$</span><span class="k"> (?: </span><span class="il"><span class="dl">#{</span><span class="co">IDENT</span><span class="dl">}</span></span><span class="k"> | </span><span class="ch">\d</span><span class="k">+ | [~&amp;+`'=</span><span class="ch">\/</span><span class="k">,;_.&lt;&gt;!@0$?*&quot;:F</span><span class="ch">\\</span><span class="k">] | -[a-zA-Z_0-9] ) </span><span class="dl">/</span><span class="mod">ox</span></span><tt>
+</tt><tt>
+</tt> <span class="co">DOUBLEQ</span> = <span class="rx"><span class="dl">/</span><span class="k"> &quot; [^&quot;</span><span class="ch">\#</span><span class="ch">\\</span><span class="k">]* (?: (?: </span><span class="ch">\#</span><span class="ch">\{</span><span class="k">.*?</span><span class="ch">\}</span><span class="k"> | </span><span class="ch">\#</span><span class="k">(?:$&quot;)? | </span><span class="ch">\\</span><span class="k">. ) [^&quot;</span><span class="ch">\#</span><span class="ch">\\</span><span class="k">]* )* &quot;? </span><span class="dl">/</span><span class="mod">ox</span></span><tt>
+</tt> <span class="co">SINGLEQ</span> = <span class="rx"><span class="dl">/</span><span class="k"> ' [^'</span><span class="ch">\\</span><span class="k">]* (?: </span><span class="ch">\\</span><span class="k">. [^'</span><span class="ch">\\</span><span class="k">]* )* '? </span><span class="dl">/</span><span class="mod">ox</span></span><tt>
+</tt> <span class="co">STRING</span> = <span class="rx"><span class="dl">/</span><span class="k"> </span><span class="il"><span class="dl">#{</span><span class="co">SINGLEQ</span><span class="dl">}</span></span><span class="k"> | </span><span class="il"><span class="dl">#{</span><span class="co">DOUBLEQ</span><span class="dl">}</span></span><span class="k"> </span><span class="dl">/</span><span class="mod">ox</span></span><tt>
+</tt> <span class="co">SHELL</span> = <span class="rx"><span class="dl">/</span><span class="k"> ` [^`</span><span class="ch">\#</span><span class="ch">\\</span><span class="k">]* (?: (?: </span><span class="ch">\#</span><span class="ch">\{</span><span class="k">.*?</span><span class="ch">\}</span><span class="k"> | </span><span class="ch">\#</span><span class="k">(?:$`)? | </span><span class="ch">\\</span><span class="k">. ) [^`</span><span class="ch">\#</span><span class="ch">\\</span><span class="k">]* )* `? </span><span class="dl">/</span><span class="mod">ox</span></span><tt>
+</tt> <span class="co">REGEXP</span> = <span class="rx"><span class="dl">/</span><span class="k"> </span><span class="ch">\/</span><span class="k"> [^</span><span class="ch">\/</span><span class="ch">\#</span><span class="ch">\\</span><span class="k">]* (?: (?: </span><span class="ch">\#</span><span class="ch">\{</span><span class="k">.*?</span><span class="ch">\}</span><span class="k"> | </span><span class="ch">\#</span><span class="k">(?:$</span><span class="ch">\/</span><span class="k">)? | </span><span class="ch">\\</span><span class="k">. ) [^</span><span class="ch">\/</span><span class="ch">\#</span><span class="ch">\\</span><span class="k">]* )* </span><span class="ch">\/</span><span class="k">? </span><span class="dl">/</span><span class="mod">ox</span></span><tt>
+</tt> <tt>
+</tt> <span class="co">DECIMAL</span> = <span class="rx"><span class="dl">/</span><span class="ch">\d</span><span class="k">+(?:_</span><span class="ch">\d</span><span class="k">+)*</span><span class="dl">/</span></span> <span class="c"># doesn't recognize 09 as octal error</span><tt>
+</tt> <span class="co">OCTAL</span> = <span class="rx"><span class="dl">/</span><span class="k">0_?[0-7]+(?:_[0-7]+)*</span><span class="dl">/</span></span><tt>
+</tt> <span class="co">HEXADECIMAL</span> = <span class="rx"><span class="dl">/</span><span class="k">0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*</span><span class="dl">/</span></span><tt>
+</tt> <span class="co">BINARY</span> = <span class="rx"><span class="dl">/</span><span class="k">0b[01]+(?:_[01]+)*</span><span class="dl">/</span></span><tt>
+</tt><tt>
+</tt> <span class="co">EXPONENT</span> = <span class="rx"><span class="dl">/</span><span class="k"> [eE] [+-]? </span><span class="il"><span class="dl">#{</span><span class="co">DECIMAL</span><span class="dl">}</span></span><span class="k"> </span><span class="dl">/</span><span class="mod">ox</span></span><tt>
+</tt> <span class="co">FLOAT</span> = <span class="rx"><span class="dl">/</span><span class="k"> </span><span class="il"><span class="dl">#{</span><span class="co">DECIMAL</span><span class="dl">}</span></span><span class="k"> (?: </span><span class="il"><span class="dl">#{</span><span class="co">EXPONENT</span><span class="dl">}</span></span><span class="k"> | </span><span class="ch">\.</span><span class="k"> </span><span class="il"><span class="dl">#{</span><span class="co">DECIMAL</span><span class="dl">}</span></span><span class="k"> </span><span class="il"><span class="dl">#{</span><span class="co">EXPONENT</span><span class="dl">}</span></span><span class="k">? ) </span><span class="dl">/</span></span><tt>
+</tt> <span class="co">INTEGER</span> = <span class="rx"><span class="dl">/</span><span class="il"><span class="dl">#{</span><span class="co">OCTAL</span><span class="dl">}</span></span><span class="k">|</span><span class="il"><span class="dl">#{</span><span class="co">HEXADECIMAL</span><span class="dl">}</span></span><span class="k">|</span><span class="il"><span class="dl">#{</span><span class="co">BINARY</span><span class="dl">}</span></span><span class="k">|</span><span class="il"><span class="dl">#{</span><span class="co">DECIMAL</span><span class="dl">}</span></span><span class="dl">/</span></span><tt>
+</tt> <tt>
+</tt> <span class="r">def</span> <span class="fu">reset</span><tt>
+</tt> <span class="r">super</span><tt>
+</tt> <span class="iv">@regexp_allowed</span> = <span class="pc">false</span><tt>
+</tt> <span class="r">end</span><tt>
+</tt> <tt>
+</tt> <span class="r">def</span> <span class="fu">next_token</span><tt>
+</tt> <span class="r">return</span> <span class="r">if</span> <span class="iv">@scanner</span>.eos?<tt>
+</tt><tt>
+</tt> kind = <span class="sy">:error</span><tt>
+</tt> <span class="r">if</span> <span class="iv">@scanner</span>.scan(<span class="rx"><span class="dl">/</span><span class="ch">\s</span><span class="k">+</span><span class="dl">/</span></span>) <span class="c"># in every state</span><tt>
+</tt> kind = <span class="sy">:space</span><tt>
+</tt> <span class="iv">@regexp_allowed</span> = <span class="sy">:set</span> <span class="r">if</span> <span class="iv">@regexp_allowed</span> <span class="r">or</span> <span class="iv">@scanner</span>.matched.index(<span class="i">?\n</span>) <span class="c"># delayed flag setting</span><tt>
+</tt><tt>
+</tt> <span class="r">elsif</span> <span class="iv">@state</span> == <span class="sy">:def_expected</span><tt>
+</tt> <span class="r">if</span> <span class="iv">@scanner</span>.scan(<span class="rx"><span class="dl">/</span><span class="k"> (?: (?:</span><span class="il"><span class="dl">#{</span><span class="co">IDENT</span><span class="dl">}</span></span><span class="k">(?:</span><span class="ch">\.</span><span class="k">|::))* | (?:@@?|$)? </span><span class="il"><span class="dl">#{</span><span class="co">IDENT</span><span class="dl">}</span></span><span class="k">(?:</span><span class="ch">\.</span><span class="k">|::) ) </span><span class="il"><span class="dl">#{</span><span class="co">METHOD_NAME_EX</span><span class="dl">}</span></span><span class="k"> </span><span class="dl">/</span><span class="mod">ox</span></span>)<tt>
+</tt> kind = <span class="sy">:method</span><tt>
+</tt> <span class="iv">@state</span> = <span class="sy">:initial</span><tt>
+</tt> <span class="r">else</span><tt>
+</tt> <span class="iv">@scanner</span>.scan(<span class="rx"><span class="dl">/</span><span class="k">.</span><span class="dl">/</span></span>)<tt>
+</tt> kind = <span class="sy">:error</span><tt>
+</tt> <span class="r">end</span><tt>
+</tt> <span class="iv">@state</span> = <span class="sy">:initial</span><tt>
+</tt> <tt>
+</tt> <span class="r">elsif</span> <span class="iv">@state</span> == <span class="sy">:module_expected</span><tt>
+</tt> <span class="r">if</span> <span class="iv">@scanner</span>.scan(<span class="rx"><span class="dl">/</span><span class="k">&lt;&lt;</span><span class="dl">/</span></span>)<tt>
+</tt> kind = <span class="sy">:operator</span><tt>
+</tt> <span class="r">else</span><tt>
+</tt> <span class="r">if</span> <span class="iv">@scanner</span>.scan(<span class="rx"><span class="dl">/</span><span class="k"> (?: </span><span class="il"><span class="dl">#{</span><span class="co">IDENT</span><span class="dl">}</span></span><span class="k"> (?:</span><span class="ch">\.</span><span class="k">|::))* </span><span class="il"><span class="dl">#{</span><span class="co">IDENT</span><span class="dl">}</span></span><span class="k"> </span><span class="dl">/</span><span class="mod">ox</span></span>)<tt>
+</tt> kind = <span class="sy">:method</span><tt>
+</tt> <span class="r">else</span><tt>
+</tt> <span class="iv">@scanner</span>.scan(<span class="rx"><span class="dl">/</span><span class="k">.</span><span class="dl">/</span></span>)<tt>
+</tt> kind = <span class="sy">:error</span><tt>
+</tt> <span class="r">end</span><tt>
+</tt> <span class="iv">@state</span> = <span class="sy">:initial</span><tt>
+</tt> <span class="r">end</span><tt>
+</tt> <tt>
+</tt> <span class="r">elsif</span> <span class="c"># state == :initial</span><tt>
+</tt> <span class="c"># IDENTIFIERS, KEYWORDS</span><tt>
+</tt> <span class="r">if</span> <span class="iv">@scanner</span>.scan(<span class="co">GLOBAL_VARIABLE</span>)<tt>
+</tt> kind = <span class="sy">:global_variable</span><tt>
+</tt> <span class="r">elsif</span> <span class="iv">@scanner</span>.scan(<span class="rx"><span class="dl">/</span><span class="k"> @@ </span><span class="il"><span class="dl">#{</span><span class="co">IDENT</span><span class="dl">}</span></span><span class="k"> </span><span class="dl">/</span><span class="mod">ox</span></span>)<tt>
+</tt> kind = <span class="sy">:class_variable</span><tt>
+</tt> <span class="r">elsif</span> <span class="iv">@scanner</span>.scan(<span class="rx"><span class="dl">/</span><span class="k"> @ </span><span class="il"><span class="dl">#{</span><span class="co">IDENT</span><span class="dl">}</span></span><span class="k"> </span><span class="dl">/</span><span class="mod">ox</span></span>)<tt>
+</tt> kind = <span class="sy">:instance_variable</span><tt>
+</tt> <span class="r">elsif</span> <span class="iv">@scanner</span>.scan(<span class="rx"><span class="dl">/</span><span class="k"> __END__</span><span class="ch">\n</span><span class="k"> ( (?!</span><span class="ch">\#</span><span class="k">CODE</span><span class="ch">\#</span><span class="k">) .* )? | </span><span class="ch">\#</span><span class="k">[^</span><span class="ch">\n</span><span class="k">]* | =begin(?=</span><span class="ch">\s</span><span class="k">).*? </span><span class="ch">\n</span><span class="k">=end(?=</span><span class="ch">\s</span><span class="k">|</span><span class="ch">\z</span><span class="k">)(?:[^</span><span class="ch">\n</span><span class="k">]*)? </span><span class="dl">/</span><span class="mod">x</span></span>)<tt>
+</tt> kind = <span class="sy">:comment</span><tt>
+</tt> <span class="r">elsif</span> <span class="iv">@scanner</span>.scan(<span class="co">METHOD_NAME</span>)<tt>
+</tt> <span class="r">if</span> <span class="iv">@last_token_dot</span><tt>
+</tt> kind = <span class="sy">:ident</span><tt>
+</tt> <span class="r">else</span><tt>
+</tt> matched = <span class="iv">@scanner</span>.matched<tt>
+</tt> kind = <span class="co">IDENT_KIND</span>[matched]<tt>
+</tt> <span class="r">if</span> kind == <span class="sy">:ident</span> <span class="r">and</span> matched =~ <span class="rx"><span class="dl">/</span><span class="k">^[A-Z]</span><span class="dl">/</span></span><tt>
+</tt> kind = <span class="sy">:constant</span><tt>
+</tt> <span class="r">elsif</span> kind == <span class="sy">:reserved</span><tt>
+</tt> <span class="iv">@state</span> = <span class="co">DEF_NEW_STATE</span>[matched]<tt>
+</tt> <span class="iv">@regexp_allowed</span> = <span class="co">REGEXP_ALLOWED</span>[matched]<tt>
+</tt> <span class="r">end</span><tt>
+</tt> <span class="r">end</span><tt>
+</tt> <tt>
+</tt> <span class="r">elsif</span> <span class="iv">@scanner</span>.scan(<span class="co">STRING</span>)<tt>
+</tt> kind = <span class="sy">:string</span><tt>
+</tt> <span class="r">elsif</span> <span class="iv">@scanner</span>.scan(<span class="co">SHELL</span>)<tt>
+</tt> kind = <span class="sy">:shell</span><tt>
+</tt> <span class="c">## HEREDOCS</span><tt>
+</tt> <span class="r">elsif</span> <span class="iv">@scanner</span>.scan(<span class="rx"><span class="dl">/</span><span class="ch">\/</span><span class="dl">/</span></span>) <span class="r">and</span> <span class="iv">@regexp_allowed</span><tt>
+</tt> <span class="iv">@scanner</span>.unscan<tt>
+</tt> <span class="iv">@scanner</span>.scan(<span class="co">REGEXP</span>)<tt>
+</tt> kind = <span class="sy">:regexp</span><tt>
+</tt> <span class="c">## %strings</span><tt>
+</tt> <span class="r">elsif</span> <span class="iv">@scanner</span>.scan(<span class="rx"><span class="dl">/</span><span class="k">:(?:</span><span class="il"><span class="dl">#{</span><span class="co">GLOBAL_VARIABLE</span><span class="dl">}</span></span><span class="k">|</span><span class="il"><span class="dl">#{</span><span class="co">METHOD_NAME_EX</span><span class="dl">}</span></span><span class="k">|</span><span class="il"><span class="dl">#{</span><span class="co">STRING</span><span class="dl">}</span></span><span class="k">)</span><span class="dl">/</span><span class="mod">ox</span></span>)<tt>
+</tt> kind = <span class="sy">:global_variable</span><tt>
+</tt> <span class="r">elsif</span> <span class="iv">@scanner</span>.scan(<span class="rx"><span class="dl">/</span><span class="k"><tt>
+</tt> </span><span class="ch">\?</span><span class="k"> (?:<tt>
+</tt> [^</span><span class="ch">\s</span><span class="ch">\\</span><span class="k">]<tt>
+</tt> | <tt>
+</tt> </span><span class="ch">\\</span><span class="k"> (?:M-</span><span class="ch">\\</span><span class="k">C-|C-</span><span class="ch">\\</span><span class="k">M-|M-</span><span class="ch">\\</span><span class="k">c|c</span><span class="ch">\\</span><span class="k">M-|c|C-|M-))? (?: </span><span class="ch">\\</span><span class="k"> (?: . | [0-7]{3} | x[0-9A-Fa-f][0-9A-Fa-f] )<tt>
+</tt> )<tt>
+</tt> </span><span class="dl">/</span><span class="mod">ox</span></span>)<tt>
+</tt> kind = <span class="sy">:integer</span><tt>
+</tt> <tt>
+</tt> <span class="r">elsif</span> <span class="iv">@scanner</span>.scan(<span class="rx"><span class="dl">/</span><span class="k"> [-+*</span><span class="ch">\/</span><span class="k">%=&lt;&gt;;,|&amp;!()</span><span class="ch">\[</span><span class="ch">\]</span><span class="k">{}~?] | </span><span class="ch">\.</span><span class="ch">\.</span><span class="k">?</span><span class="ch">\.</span><span class="k">? | ::? </span><span class="dl">/</span><span class="mod">x</span></span>)<tt>
+</tt> kind = <span class="sy">:operator</span><tt>
+</tt> <span class="iv">@regexp_allowed</span> = <span class="sy">:set</span> <span class="r">if</span> <span class="iv">@scanner</span>.matched[<span class="i">-1</span>,<span class="i">1</span>] =~ <span class="rx"><span class="dl">/</span><span class="k">[~=!&lt;&gt;|&amp;^,</span><span class="ch">\(</span><span class="ch">\[</span><span class="k">+</span><span class="ch">\-</span><span class="ch">\/</span><span class="ch">\*</span><span class="k">%]</span><span class="ch">\z</span><span class="dl">/</span></span><tt>
+</tt> <span class="r">elsif</span> <span class="iv">@scanner</span>.scan(<span class="co">FLOAT</span>)<tt>
+</tt> kind = <span class="sy">:float</span><tt>
+</tt> <span class="r">elsif</span> <span class="iv">@scanner</span>.scan(<span class="co">INTEGER</span>)<tt>
+</tt> kind = <span class="sy">:integer</span><tt>
+</tt> <span class="r">elsif</span> <span class="iv">@scanner</span>.scan(<span class="rx"><span class="dl">/</span><span class="k">:(?:</span><span class="il"><span class="dl">#{</span><span class="co">GLOBAL_VARIABLE</span><span class="dl">}</span></span><span class="k">|</span><span class="il"><span class="dl">#{</span><span class="co">METHOD_NAME_EX</span><span class="dl">}</span></span><span class="k">|</span><span class="il"><span class="dl">#{</span><span class="co">STRING</span><span class="dl">}</span></span><span class="k">)</span><span class="dl">/</span><span class="mod">ox</span></span>)<tt>
+</tt> kind = <span class="sy">:global_variable</span><tt>
+</tt> <span class="r">else</span><tt>
+</tt> <span class="iv">@scanner</span>.scan(<span class="rx"><span class="dl">/</span><span class="k">.</span><span class="dl">/</span><span class="mod">m</span></span>)<tt>
+</tt> <span class="r">end</span><tt>
+</tt> <span class="r">end</span><tt>
+</tt> <tt>
+</tt> token = <span class="co">Token</span>.new <span class="iv">@scanner</span>.matched, kind<tt>
+</tt><tt>
+</tt> <span class="r">if</span> kind == <span class="sy">:regexp</span><tt>
+</tt> token.text &lt;&lt; <span class="iv">@scanner</span>.scan(<span class="rx"><span class="dl">/</span><span class="k">[eimnosux]*</span><span class="dl">/</span></span>)<tt>
+</tt> <span class="r">end</span><tt>
+</tt> <tt>
+</tt> <span class="iv">@regexp_allowed</span> = (<span class="iv">@regexp_allowed</span> == <span class="sy">:set</span>) <span class="c"># delayed flag setting</span><tt>
+</tt><tt>
+</tt> token<tt>
+</tt> <span class="r">end</span><tt>
+</tt> <span class="r">end</span><tt>
+</tt> <tt>
+</tt> <span class="co">ScannerList</span>.register <span class="co">RubyScanner</span>, <span class="s"><span class="dl">'</span><span class="k">ruby</span><span class="dl">'</span></span><tt>
+</tt><tt>
+</tt><span class="r">end</span><tt>
+</tt><tt>
+</tt><span class="r">module</span> <span class="cl">CodeRay</span><tt>
+</tt> require <span class="s"><span class="dl">'</span><span class="k">scanner</span><span class="dl">'</span></span><tt>
+</tt><tt>
+</tt> <span class="r">class</span> <span class="cl">Highlighter</span><tt>
+</tt><tt>
+</tt> <span class="r">def</span> <span class="fu">initialize</span> lang<tt>
+</tt> <span class="iv">@scanner</span> = <span class="co">Scanner</span>[lang].new<tt>
+</tt> <span class="r">end</span><tt>
+</tt><tt>
+</tt> <span class="r">def</span> <span class="fu">highlight</span> code<tt>
+</tt> <span class="iv">@scanner</span>.feed code<tt>
+</tt> <span class="iv">@scanner</span>.all_tokens.map { |t| t.inspect }.join <span class="s"><span class="dl">&quot;</span><span class="ch">\n</span><span class="dl">&quot;</span></span><tt>
+</tt> <span class="r">end</span><tt>
+</tt><tt>
+</tt> <span class="r">end</span><tt>
+</tt><tt>
+</tt> <span class="r">class</span> <span class="cl">HTMLHighlighter</span> &lt; <span class="co">Highlighter</span><tt>
+</tt> <tt>
+</tt> <span class="co">ClassOfKind</span> = {<tt>
+</tt> <span class="sy">:attribute_name</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">an</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:attribute_name_fat</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">af</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:attribute_value</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">av</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:attribute_value_fat</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">aw</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:bin</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">bi</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:char</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">ch</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:class</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">cl</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:class_variable</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">cv</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:color</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">cr</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:comment</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">c</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:constant</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">co</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:definition</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">df</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:directive</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">di</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:doc</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">do</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:doc_string</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">ds</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:exception</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">ex</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:error</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">er</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:float</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">fl</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:function</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">fu</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:global_variable</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">gv</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:hex</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">hx</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:include</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">ic</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:instance_variable</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">iv</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:integer</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">i</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:interpreted</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">in</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:label</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">la</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:local_variable</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">lv</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:oct</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">oc</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:operator_name</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">on</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:pre_constant</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">pc</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:pre_type</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">pt</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:predefined</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">pd</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:preprocessor</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">pp</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:regexp</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">rx</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:reserved</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">r</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:shell</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">sh</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:string</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">s</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:symbol</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">sy</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:tag</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">ta</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:tag_fat</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">tf</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:tag_special</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">ts</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:type</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">ty</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:variable</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">v</span><span class="dl">'</span></span>,<tt>
+</tt> <span class="sy">:xml_text</span> =&gt; <span class="s"><span class="dl">'</span><span class="k">xt</span><span class="dl">'</span></span>,<tt>
+</tt><tt>
+</tt> <span class="sy">:ident</span> =&gt; <span class="sy">:NO_HIGHLIGHT</span>,<tt>
+</tt> <span class="sy">:operator</span> =&gt; <span class="sy">:NO_HIGHLIGHT</span>,<tt>
+</tt> <span class="sy">:space</span> =&gt; <span class="sy">:NO_HIGHLIGHT</span>,<tt>
+</tt> }<tt>
+</tt> <span class="co">ClassOfKind</span>[<span class="sy">:procedure</span>] = <span class="co">ClassOfKind</span>[<span class="sy">:method</span>] = <span class="co">ClassOfKind</span>[<span class="sy">:function</span>]<tt>
+</tt> <span class="co">ClassOfKind</span>.default = <span class="co">ClassOfKind</span>[<span class="sy">:error</span>] <span class="r">or</span> raise <span class="s"><span class="dl">'</span><span class="k">no class found for :error!</span><span class="dl">'</span></span><tt>
+</tt> <tt>
+</tt> <span class="r">def</span> <span class="fu">initialize</span> lang, options = {}<tt>
+</tt> <span class="r">super</span> lang<tt>
+</tt> <tt>
+</tt> <span class="iv">@HTML_TAB</span> = <span class="s"><span class="dl">'</span><span class="k"> </span><span class="dl">'</span></span> * options.fetch(<span class="sy">:tabs2space</span>, <span class="i">8</span>)<tt>
+</tt> <span class="r">case</span> level = options.fetch(<span class="sy">:level</span>, <span class="s"><span class="dl">'</span><span class="k">xhtml</span><span class="dl">'</span></span>)<tt>
+</tt> <span class="r">when</span> <span class="s"><span class="dl">'</span><span class="k">html</span><span class="dl">'</span></span><tt>
+</tt> <span class="iv">@HTML_BR</span> = <span class="s"><span class="dl">&quot;</span><span class="k">&lt;BR&gt;</span><span class="ch">\n</span><span class="dl">&quot;</span></span><tt>
+</tt> <span class="r">when</span> <span class="s"><span class="dl">'</span><span class="k">xhtml</span><span class="dl">'</span></span><tt>
+</tt> <span class="iv">@HTML_BR</span> = <span class="s"><span class="dl">&quot;</span><span class="k">&lt;br /&gt;</span><span class="ch">\n</span><span class="dl">&quot;</span></span><tt>
+</tt> <span class="r">else</span><tt>
+</tt> raise <span class="s"><span class="dl">&quot;</span><span class="k">Unknown HTML level: </span><span class="il"><span class="dl">#{</span>level<span class="dl">}</span></span><span class="dl">&quot;</span></span><tt>
+</tt> <span class="r">end</span><tt>
+</tt> <span class="r">end</span><tt>
+</tt><tt>
+</tt> <span class="r">def</span> <span class="fu">highlight</span> code<tt>
+</tt> <span class="iv">@scanner</span>.feed code<tt>
+</tt> <tt>
+</tt> out = <span class="s"><span class="dl">'</span><span class="dl">'</span></span><tt>
+</tt> <span class="r">while</span> t = <span class="iv">@scanner</span>.next_token<tt>
+</tt> warn t.inspect <span class="r">if</span> t.text.nil?<tt>
+</tt> out &lt;&lt; to_html(t)<tt>
+</tt> <span class="r">end</span><tt>
+</tt> <span class="co">TEMPLATE</span> =~ <span class="rx"><span class="dl">/</span><span class="k">&lt;%CONTENT%&gt;</span><span class="dl">/</span></span><tt>
+</tt> <span class="gv">$`</span> + out + <span class="gv">$'</span><tt>
+</tt> <span class="r">end</span><tt>
+</tt> <tt>
+</tt> private<tt>
+</tt> <span class="r">def</span> <span class="fu">to_html</span> token<tt>
+</tt> css_class = <span class="co">ClassOfKind</span>[token.kind]<tt>
+</tt> <span class="r">if</span> <span class="r">defined?</span> ::<span class="co">DEBUG</span> <span class="r">and</span> <span class="r">not</span> <span class="co">ClassOfKind</span>.has_key? token.kind<tt>
+</tt> warn <span class="s"><span class="dl">&quot;</span><span class="k">no token class found for :</span><span class="il"><span class="dl">#{</span>token.kind<span class="dl">}</span></span><span class="dl">&quot;</span></span><tt>
+</tt> <span class="r">end</span><tt>
+</tt> <tt>
+</tt> text = text_to_html token.text<tt>
+</tt> <span class="r">if</span> css_class == <span class="sy">:NO_HIGHLIGHT</span><tt>
+</tt> text<tt>
+</tt> <span class="r">else</span><tt>
+</tt> <span class="s"><span class="dl">&quot;</span><span class="k">&lt;span class=</span><span class="ch">\&quot;</span><span class="il"><span class="dl">#{</span>css_class<span class="dl">}</span></span><span class="ch">\&quot;</span><span class="k">&gt;</span><span class="il"><span class="dl">#{</span>text<span class="dl">}</span></span><span class="k">&lt;/span&gt;</span><span class="dl">&quot;</span></span><tt>
+</tt> <span class="r">end</span><tt>
+</tt> <span class="r">end</span><tt>
+</tt> <tt>
+</tt> <span class="r">def</span> <span class="fu">text_to_html</span> text<tt>
+</tt> <span class="r">return</span> <span class="s"><span class="dl">'</span><span class="dl">'</span></span> <span class="r">if</span> text.empty?<tt>
+</tt> text = text.dup <span class="c"># important</span><tt>
+</tt> <span class="r">if</span> text.index(<span class="rx"><span class="dl">/</span><span class="k">[&quot;&gt;&lt;&amp;]</span><span class="dl">/</span></span>)<tt>
+</tt> text.gsub!(<span class="s"><span class="dl">'</span><span class="k">&amp;</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">&amp;amp;</span><span class="dl">'</span></span>)<tt>
+</tt> text.gsub!(<span class="s"><span class="dl">'</span><span class="k">&quot;</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">&amp;quot;</span><span class="dl">'</span></span>)<tt>
+</tt> text.gsub!(<span class="s"><span class="dl">'</span><span class="k">&gt;</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">&amp;gt;</span><span class="dl">'</span></span>)<tt>
+</tt> text.gsub!(<span class="s"><span class="dl">'</span><span class="k">&lt;</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">&amp;lt;</span><span class="dl">'</span></span>)<tt>
+</tt> <span class="r">end</span><tt>
+</tt> <span class="r">if</span> text.index(<span class="rx"><span class="dl">/</span><span class="ch">\s</span><span class="dl">/</span></span>)<tt>
+</tt> text.gsub!(<span class="s"><span class="dl">&quot;</span><span class="ch">\n</span><span class="dl">&quot;</span></span>, <span class="iv">@HTML_BR</span>)<tt>
+</tt> text.gsub!(<span class="s"><span class="dl">&quot;</span><span class="ch">\t</span><span class="dl">&quot;</span></span>, <span class="iv">@HTML_TAB</span>)<tt>
+</tt> text.gsub!(<span class="rx"><span class="dl">/</span><span class="k">^ </span><span class="dl">/</span></span>, <span class="s"><span class="dl">'</span><span class="k">&amp;nbsp;</span><span class="dl">'</span></span>)<tt>
+</tt> text.gsub!(<span class="s"><span class="dl">'</span><span class="k"> </span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k"> &amp;nbsp;</span><span class="dl">'</span></span>)<tt>
+</tt> <span class="r">end</span><tt>
+</tt> text<tt>
+</tt> <span class="r">end</span><tt>
+</tt> <tt>
+</tt> <span class="co">TEMPLATE</span> = <span class="s"><span class="dl">&lt;&lt;-'TEMPLATE'</span></span><span class="s"><span class="k"><tt>
+</tt>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01//EN&quot; &quot;http://www.w3.org/TR/html4/strict.dtd&quot;&gt;<tt>
+</tt>&lt;html dir=&quot;ltr&quot;&gt;<tt>
+</tt>&lt;head&gt;<tt>
+</tt>&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=iso-8859-1&quot;&gt;<tt>
+</tt>&lt;meta http-equiv=&quot;Content-Style-Type&quot; content=&quot;text/css&quot;&gt;<tt>
+</tt><tt>
+</tt>&lt;title&gt;RubyBB BBCode&lt;/title&gt;<tt>
+</tt>&lt;style type=&quot;text/css&quot;&gt;<tt>
+</tt>.code {<tt>
+</tt> width: 100%;<tt>
+</tt> background-color: #FAFAFA;<tt>
+</tt> border: 1px solid #D1D7DC;<tt>
+</tt> font-family: 'Courier New', 'Terminal', monospace;<tt>
+</tt> font-size: 10pt;<tt>
+</tt> color: black;<tt>
+</tt> vertical-align: top;<tt>
+</tt> text-align: left;<tt>
+</tt>}<tt>
+</tt>.code .af { color:#00C; }<tt>
+</tt>.code .an { color:#007; }<tt>
+</tt>.code .av { color:#700; }<tt>
+</tt>.code .aw { color:#C00; }<tt>
+</tt>.code .bi { color:#509; font-weight:bold; }<tt>
+</tt>.code .c { color:#888; }<tt>
+</tt>.code .ch { color:#C28; font-weight:bold; }<tt>
+</tt>.code .cl { color:#B06; font-weight:bold; }<tt>
+</tt>.code .co { color:#036; font-weight:bold; }<tt>
+</tt>.code .cr { color:#0A0; }<tt>
+</tt>.code .cv { color:#369; }<tt>
+</tt>.code .df { color:#099; font-weight:bold; }<tt>
+</tt>.code .di { color:#088; font-weight:bold; }<tt>
+</tt>.code .do { color:#970; }<tt>
+</tt>.code .ds { color:#D42; font-weight:bold; }<tt>
+</tt>.code .er { color:#F00; background-color:#FAA; }<tt>
+</tt>.code .ex { color:#F00; font-weight:bold; }<tt>
+</tt>.code .fl { color:#60E; font-weight:bold; }<tt>
+</tt>.code .fu { color:#06B; font-weight:bold; }<tt>
+</tt>.code .gv { color:#800; font-weight:bold; }<tt>
+</tt>.code .hx { color:#058; font-weight:bold; }<tt>
+</tt>.code .i { color:#00D; font-weight:bold; }<tt>
+</tt>.code .ic { color:#B44; font-weight:bold; }<tt>
+</tt>.code .in { color:#B2B; font-weight:bold; }<tt>
+</tt>.code .iv { color:#33B; }<tt>
+</tt>.code .la { color:#970; font-weight:bold; }<tt>
+</tt>.code .lv { color:#963; }<tt>
+</tt>.code .oc { color:#40E; font-weight:bold; }<tt>
+</tt>.code .on { color:#000; font-weight:bold; }<tt>
+</tt>.code .pc { color:#038; font-weight:bold; }<tt>
+</tt>.code .pd { color:#369; font-weight:bold; }<tt>
+</tt>.code .pp { color:#579; }<tt>
+</tt>.code .pt { color:#339; font-weight:bold; }<tt>
+</tt>.code .r { color:#080; font-weight:bold; }<tt>
+</tt>.code .rx { color:#927; font-weight:bold; }<tt>
+</tt>.code .s { color:#D42; font-weight:bold; }<tt>
+</tt>.code .sh { color:#B2B; font-weight:bold; }<tt>
+</tt>.code .sy { color:#A60; }<tt>
+</tt>.code .ta { color:#070; }<tt>
+</tt>.code .tf { color:#070; font-weight:bold; }<tt>
+</tt>.code .ts { color:#D70; font-weight:bold; }<tt>
+</tt>.code .ty { color:#339; font-weight:bold; }<tt>
+</tt>.code .v { color:#036; }<tt>
+</tt>.code .xt { color:#444; }<tt>
+</tt>&lt;/style&gt;<tt>
+</tt>&lt;/head&gt;<tt>
+</tt>&lt;body&gt;<tt>
+</tt>&lt;div class=&quot;code&quot;&gt;<tt>
+</tt>&lt;%CONTENT%&gt;<tt>
+</tt>&lt;/div&gt;<tt>
+</tt>&lt;div class=&quot;validators&quot;&gt;<tt>
+</tt>&lt;a href=&quot;http://validator.w3.org/check?uri=referer&quot;&gt;&lt;img src=&quot;http://www.w3.org/Icons/valid-html401&quot; alt=&quot;Valid HTML 4.01!&quot; height=&quot;31&quot; width=&quot;88&quot; style=&quot;border:none;&quot;&gt;&lt;/a&gt;<tt>
+</tt>&lt;img style=&quot;border:0&quot; src=&quot;http://jigsaw.w3.org/css-validator/images/vcss&quot; alt=&quot;Valid CSS!&quot; &gt;<tt>
+</tt>&lt;/div&gt; <tt>
+</tt>&lt;/body&gt;<tt>
+</tt>&lt;/html&gt;</span><span class="dl"><tt>
+</tt> TEMPLATE</span></span><tt>
+</tt><tt>
+</tt> <span class="r">end</span><tt>
+</tt><tt>
+</tt><span class="r">end</span><tt>
+</tt></pre></td>
+</tr></table>
+
+</body>
+</html>
diff --git a/demo/demo_html.out b/sample/demo_html.out
index b9b2a2b..b9b2a2b 100644
--- a/demo/demo_html.out
+++ b/sample/demo_html.out
diff --git a/demo/demo_html.rb b/sample/demo_html.rb
index c854635..c854635 100644
--- a/demo/demo_html.rb
+++ b/sample/demo_html.rb
diff --git a/sample/demo_html2.computed b/sample/demo_html2.computed
new file mode 100644
index 0000000..ead61b2
--- /dev/null
+++ b/sample/demo_html2.computed
@@ -0,0 +1,159 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="de">
+<head>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+ <title>CodeRay HTML Encoder Example</title>
+ <style type="text/css">
+.CodeRay {
+ background-color: #f8f8f8;
+ border: 1px solid silver;
+ font-family: 'Courier New', 'Terminal', monospace;
+ color: #100;
+}
+.CodeRay pre { margin: 0px }
+
+div.CodeRay { }
+
+span.CodeRay { white-space: pre; border: 0px; padding: 2px }
+
+table.CodeRay { border-collapse: collapse; width: 100%; padding: 2px }
+table.CodeRay td { padding: 2px 4px; vertical-align: top }
+
+.CodeRay .line_numbers, .CodeRay .no {
+ background-color: #def;
+ color: gray;
+ text-align: right;
+}
+.CodeRay .line_numbers tt { font-weight: bold }
+.CodeRay .no { padding: 0px 4px }
+.CodeRay .code { width: 100% }
+
+ol.CodeRay { font-size: 10pt }
+ol.CodeRay li { white-space: pre }
+
+.CodeRay .code pre { overflow: auto }
+
+.CodeRay .af { color:#00C }
+.CodeRay .an { color:#007 }
+.CodeRay .av { color:#700 }
+.CodeRay .aw { color:#C00 }
+.CodeRay .bi { color:#509; font-weight:bold }
+.CodeRay .c { color:#888 }
+
+.CodeRay .ch { color:#04D }
+.CodeRay .ch .k { color:#04D }
+.CodeRay .ch .dl { color:#039 }
+
+.CodeRay .cl { color:#B06; font-weight:bold }
+.CodeRay .co { color:#036; font-weight:bold }
+.CodeRay .cr { color:#0A0 }
+.CodeRay .cv { color:#369 }
+.CodeRay .df { color:#099; font-weight:bold }
+.CodeRay .di { color:#088; font-weight:bold }
+.CodeRay .dl { color:black }
+.CodeRay .do { color:#970 }
+.CodeRay .ds { color:#D42; font-weight:bold }
+.CodeRay .e { color:#666; font-weight:bold }
+.CodeRay .en { color:#800; font-weight:bold }
+.CodeRay .er { color:#F00; background-color:#FAA }
+.CodeRay .ex { color:#F00; font-weight:bold }
+.CodeRay .fl { color:#60E; font-weight:bold }
+.CodeRay .fu { color:#06B; font-weight:bold }
+.CodeRay .gv { color:#d70; font-weight:bold }
+.CodeRay .hx { color:#058; font-weight:bold }
+.CodeRay .i { color:#00D; font-weight:bold }
+.CodeRay .ic { color:#B44; font-weight:bold }
+
+.CodeRay .il { background: #eee }
+.CodeRay .il .il { background: #ddd }
+.CodeRay .il .il .il { background: #ccc }
+.CodeRay .il .dl { font-weight: bold ! important; color: #888 ! important }
+
+.CodeRay .in { color:#B2B; font-weight:bold }
+.CodeRay .iv { color:#33B }
+.CodeRay .la { color:#970; font-weight:bold }
+.CodeRay .lv { color:#963 }
+.CodeRay .oc { color:#40E; font-weight:bold }
+.CodeRay .on { color:#000; font-weight:bold }
+.CodeRay .op { }
+.CodeRay .pc { color:#038; font-weight:bold }
+.CodeRay .pd { color:#369; font-weight:bold }
+.CodeRay .pp { color:#579 }
+.CodeRay .pt { color:#339; font-weight:bold }
+.CodeRay .r { color:#080; font-weight:bold }
+
+.CodeRay .rx { background-color:#fff0ff }
+.CodeRay .rx .k { color:#808 }
+.CodeRay .rx .dl { color:#404 }
+.CodeRay .rx .mod { color:#C2C }
+.CodeRay .rx .fu { color:#404; font-weight: bold }
+
+.CodeRay .s { background-color:#fff0f0 }
+.CodeRay .s .s { background-color:#ffe0e0 }
+.CodeRay .s .s .s { background-color:#ffd0d0 }
+.CodeRay .s .k { color:#D20 }
+.CodeRay .s .dl { color:#710 }
+
+.CodeRay .sh { background-color:#f0fff0 }
+.CodeRay .sh .k { color:#2B2 }
+.CodeRay .sh .dl { color:#161 }
+
+.CodeRay .sy { color:#A60 }
+.CodeRay .sy .k { color:#A60 }
+.CodeRay .sy .dl { color:#630 }
+
+.CodeRay .ta { color:#070 }
+.CodeRay .tf { color:#070; font-weight:bold }
+.CodeRay .ts { color:#D70; font-weight:bold }
+.CodeRay .ty { color:#339; font-weight:bold }
+.CodeRay .v { color:#036 }
+.CodeRay .xt { color:#444 }
+
+ </style>
+</head>
+<body style="background-color: white;">
+
+<table class="CodeRay"><tr>
+ <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt>
+</tt>2<tt>
+</tt>3<tt>
+</tt>4<tt>
+</tt>5<tt>
+</tt>6<tt>
+</tt>7<tt>
+</tt>8<tt>
+</tt>9<tt>
+</tt><strong>10</strong><tt>
+</tt>11<tt>
+</tt></pre></td>
+ <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">require <span style="background-color:#fff0f0"><span style="color:#710">'</span><span style="color:#D20">coderay</span><span style="color:#710">'</span></span><tt>
+</tt><tt>
+</tt><span style="color:#888"># scan this file</span><tt>
+</tt>tokens = <span style="color:#036; font-weight:bold">CodeRay</span>.scan(<span style="color:#036; font-weight:bold">File</span>.read(<span style="color:#d70; font-weight:bold">$0</span>) * <span style="color:#00D; font-weight:bold">1</span>, <span style="color:#A60">:ruby</span>)<tt>
+</tt><tt>
+</tt><span style="color:#888"># output it with two styles of line numbers</span><tt>
+</tt>out = tokens.div(<span style="color:#A60">:line_numbers</span> =&gt; <span style="color:#A60">:table</span>)<tt>
+</tt>out &lt;&lt; <span style="background-color:#fff0f0"><span style="color:#710">'</span><span style="color:#D20">&lt;hr /&gt;</span><span style="color:#710">'</span></span><tt>
+</tt>out &lt;&lt; tokens.div(<span style="color:#A60">:line_numbers</span> =&gt; <span style="color:#A60">:inline</span>, <span style="color:#A60">:line_number_start</span> =&gt; <span style="color:#00D; font-weight:bold">8</span>)<tt>
+</tt><tt>
+</tt>puts out.page<tt>
+</tt></pre></td>
+</tr></table>
+<hr /><div class="CodeRay">
+ <div class="code"><pre><span class="no"> 8</span> require <span style="background-color:#fff0f0"><span style="color:#710">'</span><span style="color:#D20">coderay</span><span style="color:#710">'</span></span>
+<span class="no"> 9</span>
+<span class="no"><strong>10</strong></span> <span style="color:#888"># scan this file</span>
+<span class="no">11</span> tokens = <span style="color:#036; font-weight:bold">CodeRay</span>.scan(<span style="color:#036; font-weight:bold">File</span>.read(<span style="color:#d70; font-weight:bold">$0</span>) * <span style="color:#00D; font-weight:bold">1</span>, <span style="color:#A60">:ruby</span>)
+<span class="no">12</span>
+<span class="no">13</span> <span style="color:#888"># output it with two styles of line numbers</span>
+<span class="no">14</span> out = tokens.div(<span style="color:#A60">:line_numbers</span> =&gt; <span style="color:#A60">:table</span>)
+<span class="no">15</span> out &lt;&lt; <span style="background-color:#fff0f0"><span style="color:#710">'</span><span style="color:#D20">&lt;hr /&gt;</span><span style="color:#710">'</span></span>
+<span class="no">16</span> out &lt;&lt; tokens.div(<span style="color:#A60">:line_numbers</span> =&gt; <span style="color:#A60">:inline</span>, <span style="color:#A60">:line_number_start</span> =&gt; <span style="color:#00D; font-weight:bold">8</span>)
+<span class="no">17</span>
+<span class="no">18</span> puts out.page
+</pre></div>
+</div>
+
+</body>
+</html>
diff --git a/demo/demo_html2.out b/sample/demo_html2.out
index eb74188..eb74188 100644
--- a/demo/demo_html2.out
+++ b/sample/demo_html2.out
diff --git a/demo/demo_html2.rb b/sample/demo_html2.rb
index 7ce9d60..7ce9d60 100644
--- a/demo/demo_html2.rb
+++ b/sample/demo_html2.rb
diff --git a/sample/demo_html_list.computed b/sample/demo_html_list.computed
new file mode 100644
index 0000000..aec2cf5
--- /dev/null
+++ b/sample/demo_html_list.computed
@@ -0,0 +1,134 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="de">
+<head>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+ <title>CodeRay HTML Encoder Example</title>
+ <style type="text/css">
+.CodeRay {
+ background-color: #f8f8f8;
+ border: 1px solid silver;
+ font-family: 'Courier New', 'Terminal', monospace;
+ color: #100;
+}
+.CodeRay pre { margin: 0px }
+
+div.CodeRay { }
+
+span.CodeRay { white-space: pre; border: 0px; padding: 2px }
+
+table.CodeRay { border-collapse: collapse; width: 100%; padding: 2px }
+table.CodeRay td { padding: 2px 4px; vertical-align: top }
+
+.CodeRay .line_numbers, .CodeRay .no {
+ background-color: #def;
+ color: gray;
+ text-align: right;
+}
+.CodeRay .line_numbers tt { font-weight: bold }
+.CodeRay .no { padding: 0px 4px }
+.CodeRay .code { width: 100% }
+
+ol.CodeRay { font-size: 10pt }
+ol.CodeRay li { white-space: pre }
+
+.CodeRay .code pre { overflow: auto }
+
+.CodeRay .af { color:#00C }
+.CodeRay .an { color:#007 }
+.CodeRay .av { color:#700 }
+.CodeRay .aw { color:#C00 }
+.CodeRay .bi { color:#509; font-weight:bold }
+.CodeRay .c { color:#888 }
+
+.CodeRay .ch { color:#04D }
+.CodeRay .ch .k { color:#04D }
+.CodeRay .ch .dl { color:#039 }
+
+.CodeRay .cl { color:#B06; font-weight:bold }
+.CodeRay .co { color:#036; font-weight:bold }
+.CodeRay .cr { color:#0A0 }
+.CodeRay .cv { color:#369 }
+.CodeRay .df { color:#099; font-weight:bold }
+.CodeRay .di { color:#088; font-weight:bold }
+.CodeRay .dl { color:black }
+.CodeRay .do { color:#970 }
+.CodeRay .ds { color:#D42; font-weight:bold }
+.CodeRay .e { color:#666; font-weight:bold }
+.CodeRay .en { color:#800; font-weight:bold }
+.CodeRay .er { color:#F00; background-color:#FAA }
+.CodeRay .ex { color:#F00; font-weight:bold }
+.CodeRay .fl { color:#60E; font-weight:bold }
+.CodeRay .fu { color:#06B; font-weight:bold }
+.CodeRay .gv { color:#d70; font-weight:bold }
+.CodeRay .hx { color:#058; font-weight:bold }
+.CodeRay .i { color:#00D; font-weight:bold }
+.CodeRay .ic { color:#B44; font-weight:bold }
+
+.CodeRay .il { background: #eee }
+.CodeRay .il .il { background: #ddd }
+.CodeRay .il .il .il { background: #ccc }
+.CodeRay .il .dl { font-weight: bold ! important; color: #888 ! important }
+
+.CodeRay .in { color:#B2B; font-weight:bold }
+.CodeRay .iv { color:#33B }
+.CodeRay .la { color:#970; font-weight:bold }
+.CodeRay .lv { color:#963 }
+.CodeRay .oc { color:#40E; font-weight:bold }
+.CodeRay .on { color:#000; font-weight:bold }
+.CodeRay .op { }
+.CodeRay .pc { color:#038; font-weight:bold }
+.CodeRay .pd { color:#369; font-weight:bold }
+.CodeRay .pp { color:#579 }
+.CodeRay .pt { color:#339; font-weight:bold }
+.CodeRay .r { color:#080; font-weight:bold }
+
+.CodeRay .rx { background-color:#fff0ff }
+.CodeRay .rx .k { color:#808 }
+.CodeRay .rx .dl { color:#404 }
+.CodeRay .rx .mod { color:#C2C }
+.CodeRay .rx .fu { color:#404; font-weight: bold }
+
+.CodeRay .s { background-color:#fff0f0 }
+.CodeRay .s .s { background-color:#ffe0e0 }
+.CodeRay .s .s .s { background-color:#ffd0d0 }
+.CodeRay .s .k { color:#D20 }
+.CodeRay .s .dl { color:#710 }
+
+.CodeRay .sh { background-color:#f0fff0 }
+.CodeRay .sh .k { color:#2B2 }
+.CodeRay .sh .dl { color:#161 }
+
+.CodeRay .sy { color:#A60 }
+.CodeRay .sy .k { color:#A60 }
+.CodeRay .sy .dl { color:#630 }
+
+.CodeRay .ta { color:#070 }
+.CodeRay .tf { color:#070; font-weight:bold }
+.CodeRay .ts { color:#D70; font-weight:bold }
+.CodeRay .ty { color:#339; font-weight:bold }
+.CodeRay .v { color:#036 }
+.CodeRay .xt { color:#444 }
+
+ </style>
+</head>
+<body style="background-color: white;">
+
+<div class="CodeRay">
+ <div class="code"><pre><span class="no">-1</span> <span class="gv">$:</span> &lt;&lt; <span class="s"><span class="dl">'</span><span class="k">..</span><span class="dl">'</span></span>
+<span class="no"> <strong>0</strong></span> require <span class="s"><span class="dl">'</span><span class="k">coderay</span><span class="dl">'</span></span>
+<span class="no"> 1</span>
+<span class="no"> 2</span> tokens = <span class="co">CodeRay</span>.scan <span class="co">File</span>.read(<span class="pc">__FILE__</span>), <span class="sy">:ruby</span>
+<span class="no"> 3</span> html = tokens.html(<span class="sy">:tab_width</span> =&gt; <span class="i">2</span>, <span class="sy">:line_numbers</span> =&gt; <span class="sy">:inline</span>, <span class="sy">:line_number_start</span> =&gt; <span class="i">-1</span>)
+<span class="no"> 4</span>
+<span class="no"> 5</span> puts html.page
+<span class="no"> 6</span>
+<span class="no"> 7</span> commment = <span class="s"><span class="dl">&lt;&lt;_</span></span><span class="s"><span class="k">
+<span class="no"> 8</span> This code must be &gt; 10 lines
+<span class="no"> 9</span> because I want to test the correct adjustment of the line numbers.</span><span class="dl">
+<span class="no"><strong>10</strong></span> _</span></span>
+</pre></div>
+</div>
+
+</body>
+</html>
diff --git a/demo/demo_html_list.out b/sample/demo_html_list.out
index e68ac54..e68ac54 100644
--- a/demo/demo_html_list.out
+++ b/sample/demo_html_list.out
diff --git a/demo/demo_html_list.rb b/sample/demo_html_list.rb
index 97724f2..97724f2 100644
--- a/demo/demo_html_list.rb
+++ b/sample/demo_html_list.rb
diff --git a/sample/demo_load_encoder.computed b/sample/demo_load_encoder.computed
new file mode 100644
index 0000000..1cff356
--- /dev/null
+++ b/sample/demo_load_encoder.computed
@@ -0,0 +1,8 @@
+CodeRay::Encoders::YAML is not defined; you must load it first.
+Now it is loaded: CodeRay::Encoders::YAML
+See?
+Require is also possible: CodeRay::Encoders::Tokens
+See?
+Now load some mapped encoders: stats and plain.
+Require all Encoders:
+[[:count, CodeRay::Encoders::Count], [:debug, CodeRay::Encoders::Debug], [:div, CodeRay::Encoders::Div], [:html, CodeRay::Encoders::HTML], [:null, CodeRay::Encoders::Null], [:page, CodeRay::Encoders::Page], [:plain, :text], [:span, CodeRay::Encoders::Span], [:statistic, CodeRay::Encoders::Statistic], [:stats, CodeRay::Encoders::Statistic], [:text, CodeRay::Encoders::Text], [:tokens, CodeRay::Encoders::Tokens], [:xml, CodeRay::Encoders::XML], [:yaml, CodeRay::Encoders::YAML]]
diff --git a/demo/demo_load_encoder.out b/sample/demo_load_encoder.out
index 7144456..7144456 100644
--- a/demo/demo_load_encoder.out
+++ b/sample/demo_load_encoder.out
diff --git a/demo/demo_load_encoder.rb b/sample/demo_load_encoder.rb
index 39d310d..39d310d 100644
--- a/demo/demo_load_encoder.rb
+++ b/sample/demo_load_encoder.rb
diff --git a/sample/demo_load_scanner.computed b/sample/demo_load_scanner.computed
new file mode 100644
index 0000000..a2d200d
--- /dev/null
+++ b/sample/demo_load_scanner.computed
@@ -0,0 +1,8 @@
+CodeRay::Encoders::Ruby is not defined; you must load it first.
+Now it is loaded: CodeRay::Scanners::Ruby
+See?
+Require is also possible: CodeRay::Scanners::C
+See?
+Now load some mapped scanners: cpp and plain.
+Require all Scanners:
+[[nil, :plain], [:c, CodeRay::Scanners::C], [:cpp, :c], [:delphi, CodeRay::Scanners::Delphi], [:html, CodeRay::Scanners::HTML], [:irb, :ruby], [:nitro, :nitro_xhtml], [:nitro_xhtml, CodeRay::Scanners::NitroXHTML], [:pascal, :delphi], [:plain, CodeRay::Scanners::Plaintext], [:plaintext, CodeRay::Scanners::Plaintext], [:rhtml, CodeRay::Scanners::RHTML], [:ruby, CodeRay::Scanners::Ruby], [:xhtml, :nitro_xhtml], [:xml, :html]]
diff --git a/demo/demo_load_scanner.out b/sample/demo_load_scanner.out
index ea374f9..ea374f9 100644
--- a/demo/demo_load_scanner.out
+++ b/sample/demo_load_scanner.out
diff --git a/demo/demo_load_scanner.rb b/sample/demo_load_scanner.rb
index 5e503f0..5e503f0 100644
--- a/demo/demo_load_scanner.rb
+++ b/sample/demo_load_scanner.rb
diff --git a/sample/demo_more.computed b/sample/demo_more.computed
new file mode 100644
index 0000000..aa26e61
--- /dev/null
+++ b/sample/demo_more.computed
@@ -0,0 +1,2 @@
+Input: 4983B, Output: 22546B
+Take a look with your browser.
diff --git a/demo/demo_more.out b/sample/demo_more.out
index c9a3cfd..c9a3cfd 100644
--- a/demo/demo_more.out
+++ b/sample/demo_more.out
diff --git a/demo/demo_more.rb b/sample/demo_more.rb
index 0db7ba4..0db7ba4 100644
--- a/demo/demo_more.rb
+++ b/sample/demo_more.rb
diff --git a/sample/demo_scanner.computed b/sample/demo_scanner.computed
new file mode 100644
index 0000000..d35a06d
--- /dev/null
+++ b/sample/demo_scanner.computed
@@ -0,0 +1,16 @@
+C Code: if (*p == '{') nest++;
+
+> print only operators:
+(*==)++;
+------------------------------
+
+Ruby Code: ruby_code(:can, BE, %r[q[ui]te #{ /comple/x },] => $-s, &?\xee)
+
+> has a string?
+false
+
+> number of regexps?
+2
+
+> has a string?
+"ruby_code" (ident), "(" (operator), ":can" (symbol), "," (operator), " " (space), "BE" (constant), "," (operator), " " (space), "%r[" (delimiter), "q" (content), "[" (nesting_delimiter), "ui" (content), "]" (nesting_delimiter), "te " (content), "#{" (delimiter), " " (space), "/" (delimiter), "comple" (content), "/" (delimiter), "x" (modifier), " " (space), "}" (delimiter), "," (content), "]" (delimiter), " " (space), "=" (operator), ">" (operator), " " (space), "$-s" (global_variable), "," (operator), " " (space), "&" (operator), "?\xee" (integer), ")" (operator)
diff --git a/demo/demo_scanner.out b/sample/demo_scanner.out
index 7ee911c..7ee911c 100644
--- a/demo/demo_scanner.out
+++ b/sample/demo_scanner.out
diff --git a/demo/demo_scanner.rb b/sample/demo_scanner.rb
index 6a0245e..6a0245e 100644
--- a/demo/demo_scanner.rb
+++ b/sample/demo_scanner.rb
diff --git a/demo/demo_server.rb b/sample/demo_server.rb
index fc44818..ccdff32 100644
--- a/demo/demo_server.rb
+++ b/sample/demo_server.rb
@@ -3,7 +3,7 @@
unless ARGV.grep(/-[hv]|--(help|version)/).empty?
puts <<-USAGE
CodeRay Server 0.5
-$Id$
+$Id: demo_server.rb 113 2006-03-15 23:24:37Z murphy $
Usage:
1) Start this and your browser.
diff --git a/sample/demo_simple.computed b/sample/demo_simple.computed
new file mode 100644
index 0000000..7e9206a
--- /dev/null
+++ b/sample/demo_simple.computed
@@ -0,0 +1 @@
+<span class="CodeRay">puts <span style="background-color:#fff0f0"><span style="color:#710">'</span><span style="color:#D20">Hello, world!</span><span style="color:#710">'</span></span></span>
diff --git a/demo/demo_simple.out b/sample/demo_simple.out
index a033139..a033139 100644
--- a/demo/demo_simple.out
+++ b/sample/demo_simple.out
diff --git a/demo/demo_simple.rb b/sample/demo_simple.rb
index a3129b0..a3129b0 100644
--- a/demo/demo_simple.rb
+++ b/sample/demo_simple.rb
diff --git a/demo/demo_stream.rb b/sample/demo_stream.rb
index 7ed8a22..7ed8a22 100644
--- a/demo/demo_stream.rb
+++ b/sample/demo_stream.rb
diff --git a/sample/demo_stream2.computed b/sample/demo_stream2.computed
new file mode 100644
index 0000000..83aee98
--- /dev/null
+++ b/sample/demo_stream2.computed
@@ -0,0 +1,2 @@
+kind: regexp, text size: 5.
+kind: space, text size: 1.
diff --git a/demo/demo_stream2.out b/sample/demo_stream2.out
index 95f37b6..95f37b6 100644
--- a/demo/demo_stream2.out
+++ b/sample/demo_stream2.out
diff --git a/demo/demo_stream2.rb b/sample/demo_stream2.rb
index d43cc9a..d43cc9a 100644
--- a/demo/demo_stream2.rb
+++ b/sample/demo_stream2.rb
diff --git a/sample/demo_tokens.computed b/sample/demo_tokens.computed
new file mode 100644
index 0000000..bbc2b94
--- /dev/null
+++ b/sample/demo_tokens.computed
@@ -0,0 +1,14 @@
+ident puts
+space
+integer 3
+space
+operator +
+space
+integer 4
+operator ,
+space
+:open string
+delimiter '
+content 3 + 4
+delimiter '
+:close string
diff --git a/demo/demo_tokens.out b/sample/demo_tokens.out
index daa34b8..daa34b8 100644
--- a/demo/demo_tokens.out
+++ b/sample/demo_tokens.out
diff --git a/demo/demo_tokens.rb b/sample/demo_tokens.rb
index eb8d448..eb8d448 100644
--- a/demo/demo_tokens.rb
+++ b/sample/demo_tokens.rb
diff --git a/demo/suite.rb b/sample/suite.rb
index c0be470..3df432d 100644
--- a/demo/suite.rb
+++ b/sample/suite.rb
@@ -36,7 +36,7 @@ class CodeRaySuite < TestCase
computed = output.sub('.out', '.computed')
unless ok
File.open(computed, 'w') { |f| f.write result }
- print `gvimdiff #{output} #{computed}` if $DEBUG
+ print `diff #{output} #{computed}` if $DEBUG
end
assert(ok, "Output error: #{computed} != #{output}") unless $DEBUG
else
diff --git a/sample/test.html b/sample/test.html
new file mode 100644
index 0000000..2e4e599
--- /dev/null
+++ b/sample/test.html
@@ -0,0 +1,543 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="de">
+<head>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+ <title>CodeRay HTML Encoder Example</title>
+ <style type="text/css">
+.CodeRay {
+ background-color: #f8f8f8;
+ border: 1px solid silver;
+ font-family: 'Courier New', 'Terminal', monospace;
+ color: #100;
+}
+.CodeRay pre { margin: 0px }
+
+div.CodeRay { }
+
+span.CodeRay { white-space: pre; border: 0px; padding: 2px }
+
+table.CodeRay { border-collapse: collapse; width: 100%; padding: 2px }
+table.CodeRay td { padding: 2px 4px; vertical-align: top }
+
+.CodeRay .line_numbers, .CodeRay .no {
+ background-color: #def;
+ color: gray;
+ text-align: right;
+}
+.CodeRay .line_numbers tt { font-weight: bold }
+.CodeRay .no { padding: 0px 4px }
+.CodeRay .code { width: 100% }
+
+ol.CodeRay { font-size: 10pt }
+ol.CodeRay li { white-space: pre }
+
+.CodeRay .code pre { overflow: auto }
+
+.CodeRay .af { color:#00C }
+.CodeRay .an { color:#007 }
+.CodeRay .av { color:#700 }
+.CodeRay .aw { color:#C00 }
+.CodeRay .bi { color:#509; font-weight:bold }
+.CodeRay .c { color:#888 }
+
+.CodeRay .ch { color:#04D }
+.CodeRay .ch .k { color:#04D }
+.CodeRay .ch .dl { color:#039 }
+
+.CodeRay .cl { color:#B06; font-weight:bold }
+.CodeRay .co { color:#036; font-weight:bold }
+.CodeRay .cr { color:#0A0 }
+.CodeRay .cv { color:#369 }
+.CodeRay .df { color:#099; font-weight:bold }
+.CodeRay .di { color:#088; font-weight:bold }
+.CodeRay .dl { color:black }
+.CodeRay .do { color:#970 }
+.CodeRay .ds { color:#D42; font-weight:bold }
+.CodeRay .e { color:#666; font-weight:bold }
+.CodeRay .en { color:#800; font-weight:bold }
+.CodeRay .er { color:#F00; background-color:#FAA }
+.CodeRay .ex { color:#F00; font-weight:bold }
+.CodeRay .fl { color:#60E; font-weight:bold }
+.CodeRay .fu { color:#06B; font-weight:bold }
+.CodeRay .gv { color:#d70; font-weight:bold }
+.CodeRay .hx { color:#058; font-weight:bold }
+.CodeRay .i { color:#00D; font-weight:bold }
+.CodeRay .ic { color:#B44; font-weight:bold }
+
+.CodeRay .il { background: #eee }
+.CodeRay .il .il { background: #ddd }
+.CodeRay .il .il .il { background: #ccc }
+.CodeRay .il .dl { font-weight: bold ! important; color: #888 ! important }
+
+.CodeRay .in { color:#B2B; font-weight:bold }
+.CodeRay .iv { color:#33B }
+.CodeRay .la { color:#970; font-weight:bold }
+.CodeRay .lv { color:#963 }
+.CodeRay .oc { color:#40E; font-weight:bold }
+.CodeRay .on { color:#000; font-weight:bold }
+.CodeRay .op { }
+.CodeRay .pc { color:#038; font-weight:bold }
+.CodeRay .pd { color:#369; font-weight:bold }
+.CodeRay .pp { color:#579 }
+.CodeRay .pt { color:#339; font-weight:bold }
+.CodeRay .r { color:#080; font-weight:bold }
+
+.CodeRay .rx { background-color:#fff0ff }
+.CodeRay .rx .k { color:#808 }
+.CodeRay .rx .dl { color:#404 }
+.CodeRay .rx .mod { color:#C2C }
+.CodeRay .rx .fu { color:#404; font-weight: bold }
+
+.CodeRay .s { background-color:#fff0f0 }
+.CodeRay .s .s { background-color:#ffe0e0 }
+.CodeRay .s .s .s { background-color:#ffd0d0 }
+.CodeRay .s .k { color:#D20 }
+.CodeRay .s .dl { color:#710 }
+
+.CodeRay .sh { background-color:#f0fff0 }
+.CodeRay .sh .k { color:#2B2 }
+.CodeRay .sh .dl { color:#161 }
+
+.CodeRay .sy { color:#A60 }
+.CodeRay .sy .k { color:#A60 }
+.CodeRay .sy .dl { color:#630 }
+
+.CodeRay .ta { color:#070 }
+.CodeRay .tf { color:#070; font-weight:bold }
+.CodeRay .ts { color:#D70; font-weight:bold }
+.CodeRay .ty { color:#339; font-weight:bold }
+.CodeRay .v { color:#036 }
+.CodeRay .xt { color:#444 }
+
+ </style>
+</head>
+<body style="background-color: white;">
+
+<h1>C</h1>
+<table class="CodeRay"><tr>
+ <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt>
+</tt>2<tt>
+</tt>3<tt>
+</tt>4<tt>
+</tt>5<tt>
+</tt>6<tt>
+</tt>7<tt>
+</tt>8<tt>
+</tt>9<tt>
+</tt><strong>10</strong><tt>
+</tt>11<tt>
+</tt>12<tt>
+</tt>13<tt>
+</tt>14<tt>
+</tt>15<tt>
+</tt>16<tt>
+</tt>17<tt>
+</tt>18<tt>
+</tt>19<tt>
+</tt><strong>20</strong><tt>
+</tt>21<tt>
+</tt>22<tt>
+</tt>23<tt>
+</tt>24<tt>
+</tt>25<tt>
+</tt>26<tt>
+</tt>27<tt>
+</tt>28<tt>
+</tt>29<tt>
+</tt><strong>30</strong><tt>
+</tt>31<tt>
+</tt>32<tt>
+</tt>33<tt>
+</tt>34<tt>
+</tt>35<tt>
+</tt>36<tt>
+</tt>37<tt>
+</tt>38<tt>
+</tt>39<tt>
+</tt><strong>40</strong><tt>
+</tt>41<tt>
+</tt>42<tt>
+</tt>43<tt>
+</tt>44<tt>
+</tt></pre></td>
+ <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><span class="c">/**********************************************************************<tt>
+</tt><tt>
+</tt> version.c -<tt>
+</tt><tt>
+</tt> $Author: nobu $<tt>
+</tt> $Date: 2004/03/25 12:01:40 $<tt>
+</tt> created at: Thu Sep 30 20:08:01 JST 1993<tt>
+</tt><tt>
+</tt> Copyright (C) 1993-2003 Yukihiro Matsumoto<tt>
+</tt><tt>
+</tt>**********************************************************************/</span><tt>
+</tt><tt>
+</tt><span class="pp">#include</span> <span class="ic">&quot;ruby.h&quot;</span><tt>
+</tt><span class="pp">#include</span> <span class="ic">&quot;version.h&quot;</span><tt>
+</tt><span class="pp">#include</span> <span class="ic">&lt;stdio.h&gt;</span><tt>
+</tt><tt>
+</tt><span class="r">const</span> <span class="pt">char</span> ruby_version[] = RUBY_VERSION;<tt>
+</tt><span class="r">const</span> <span class="pt">char</span> ruby_release_date[] = RUBY_RELEASE_DATE;<tt>
+</tt><span class="r">const</span> <span class="pt">char</span> ruby_platform[] = RUBY_PLATFORM;<tt>
+</tt><tt>
+</tt><span class="pt">void</span><tt>
+</tt>Init_version()<tt>
+</tt>{<tt>
+</tt> VALUE v = rb_obj_freeze(rb_str_new2(ruby_version));<tt>
+</tt> VALUE d = rb_obj_freeze(rb_str_new2(ruby_release_date));<tt>
+</tt> VALUE p = rb_obj_freeze(rb_str_new2(ruby_platform));<tt>
+</tt><tt>
+</tt> rb_define_global_const(<span class="s"><span class="dl">&quot;</span><span class="k">RUBY_VERSION</span><span class="dl">&quot;</span></span>, v);<tt>
+</tt> rb_define_global_const(<span class="s"><span class="dl">&quot;</span><span class="k">RUBY_RELEASE_DATE</span><span class="dl">&quot;</span></span>, d);<tt>
+</tt> rb_define_global_const(<span class="s"><span class="dl">&quot;</span><span class="k">RUBY_PLATFORM</span><span class="dl">&quot;</span></span>, p);<tt>
+</tt>}<tt>
+</tt><tt>
+</tt><span class="pt">void</span><tt>
+</tt>ruby_show_version()<tt>
+</tt>{<tt>
+</tt> printf(<span class="s"><span class="dl">&quot;</span><span class="k">ruby %s (%s) [%s]</span><span class="ch">\n</span><span class="dl">&quot;</span></span>, RUBY_VERSION, RUBY_RELEASE_DATE, RUBY_PLATFORM);<tt>
+</tt>}<tt>
+</tt><tt>
+</tt><span class="pt">void</span><tt>
+</tt>ruby_show_copyright()<tt>
+</tt>{<tt>
+</tt> printf(<span class="s"><span class="dl">&quot;</span><span class="k">ruby - Copyright (C) 1993-%d Yukihiro Matsumoto</span><span class="ch">\n</span><span class="dl">&quot;</span></span>, RUBY_RELEASE_YEAR);<tt>
+</tt> exit(<span class="i">0</span>);<tt>
+</tt>}<tt>
+</tt></pre></td>
+</tr></table>
+<h1>Ruby</h1>
+<table class="CodeRay"><tr>
+ <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt>
+</tt>2<tt>
+</tt>3<tt>
+</tt>4<tt>
+</tt>5<tt>
+</tt>6<tt>
+</tt>7<tt>
+</tt>8<tt>
+</tt>9<tt>
+</tt><strong>10</strong><tt>
+</tt>11<tt>
+</tt>12<tt>
+</tt>13<tt>
+</tt>14<tt>
+</tt>15<tt>
+</tt>16<tt>
+</tt>17<tt>
+</tt>18<tt>
+</tt>19<tt>
+</tt><strong>20</strong><tt>
+</tt>21<tt>
+</tt>22<tt>
+</tt>23<tt>
+</tt>24<tt>
+</tt>25<tt>
+</tt>26<tt>
+</tt>27<tt>
+</tt>28<tt>
+</tt>29<tt>
+</tt><strong>30</strong><tt>
+</tt>31<tt>
+</tt>32<tt>
+</tt>33<tt>
+</tt>34<tt>
+</tt>35<tt>
+</tt>36<tt>
+</tt>37<tt>
+</tt>38<tt>
+</tt>39<tt>
+</tt><strong>40</strong><tt>
+</tt>41<tt>
+</tt>42<tt>
+</tt>43<tt>
+</tt>44<tt>
+</tt>45<tt>
+</tt>46<tt>
+</tt>47<tt>
+</tt>48<tt>
+</tt>49<tt>
+</tt><strong>50</strong><tt>
+</tt>51<tt>
+</tt>52<tt>
+</tt>53<tt>
+</tt>54<tt>
+</tt>55<tt>
+</tt>56<tt>
+</tt>57<tt>
+</tt>58<tt>
+</tt>59<tt>
+</tt><strong>60</strong><tt>
+</tt>61<tt>
+</tt>62<tt>
+</tt>63<tt>
+</tt>64<tt>
+</tt>65<tt>
+</tt>66<tt>
+</tt>67<tt>
+</tt>68<tt>
+</tt>69<tt>
+</tt><strong>70</strong><tt>
+</tt>71<tt>
+</tt>72<tt>
+</tt>73<tt>
+</tt>74<tt>
+</tt>75<tt>
+</tt>76<tt>
+</tt>77<tt>
+</tt>78<tt>
+</tt>79<tt>
+</tt><strong>80</strong><tt>
+</tt>81<tt>
+</tt>82<tt>
+</tt>83<tt>
+</tt>84<tt>
+</tt>85<tt>
+</tt>86<tt>
+</tt>87<tt>
+</tt>88<tt>
+</tt>89<tt>
+</tt><strong>90</strong><tt>
+</tt>91<tt>
+</tt>92<tt>
+</tt>93<tt>
+</tt>94<tt>
+</tt>95<tt>
+</tt>96<tt>
+</tt>97<tt>
+</tt>98<tt>
+</tt>99<tt>
+</tt><strong>100</strong><tt>
+</tt>101<tt>
+</tt>102<tt>
+</tt>103<tt>
+</tt>104<tt>
+</tt>105<tt>
+</tt>106<tt>
+</tt>107<tt>
+</tt>108<tt>
+</tt>109<tt>
+</tt><strong>110</strong><tt>
+</tt>111<tt>
+</tt>112<tt>
+</tt>113<tt>
+</tt>114<tt>
+</tt>115<tt>
+</tt>116<tt>
+</tt>117<tt>
+</tt>118<tt>
+</tt>119<tt>
+</tt><strong>120</strong><tt>
+</tt>121<tt>
+</tt>122<tt>
+</tt>123<tt>
+</tt>124<tt>
+</tt>125<tt>
+</tt>126<tt>
+</tt>127<tt>
+</tt>128<tt>
+</tt></pre></td>
+ <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><tt>
+</tt><span class="c">#</span><tt>
+</tt><span class="c"># = ostruct.rb: OpenStruct implementation</span><tt>
+</tt><span class="c">#</span><tt>
+</tt><span class="c"># Author:: Yukihiro Matsumoto</span><tt>
+</tt><span class="c"># Documentation:: Gavin Sinclair</span><tt>
+</tt><span class="c">#</span><tt>
+</tt><span class="c"># OpenStruct allows the creation of data objects with arbitrary attributes.</span><tt>
+</tt><span class="c"># See OpenStruct for an example.</span><tt>
+</tt><span class="c">#</span><tt>
+</tt><tt>
+</tt><span class="c">#</span><tt>
+</tt><span class="c"># OpenStruct allows you to create data objects and set arbitrary attributes.</span><tt>
+</tt><span class="c"># For example:</span><tt>
+</tt><span class="c">#</span><tt>
+</tt><span class="c"># require 'ostruct' </span><tt>
+</tt><span class="c">#</span><tt>
+</tt><span class="c"># record = OpenStruct.new</span><tt>
+</tt><span class="c"># record.name = &quot;John Smith&quot;</span><tt>
+</tt><span class="c"># record.age = 70</span><tt>
+</tt><span class="c"># record.pension = 300</span><tt>
+</tt><span class="c"># </span><tt>
+</tt><span class="c"># puts record.name # -&gt; &quot;John Smith&quot;</span><tt>
+</tt><span class="c"># puts record.address # -&gt; nil</span><tt>
+</tt><span class="c">#</span><tt>
+</tt><span class="c"># It is like a hash with a different way to access the data. In fact, it is</span><tt>
+</tt><span class="c"># implemented with a hash, and you can initialize it with one.</span><tt>
+</tt><span class="c">#</span><tt>
+</tt><span class="c"># hash = { &quot;country&quot; =&gt; &quot;Australia&quot;, :population =&gt; 20_000_000 }</span><tt>
+</tt><span class="c"># data = OpenStruct.new(hash)</span><tt>
+</tt><span class="c">#</span><tt>
+</tt><span class="c"># p data # -&gt; &lt;OpenStruct country=&quot;Australia&quot; population=20000000&gt;</span><tt>
+</tt><span class="c">#</span><tt>
+</tt><span class="r">class</span> <span class="cl">OpenStruct</span><tt>
+</tt> <span class="c">#</span><tt>
+</tt> <span class="c"># Create a new OpenStruct object. The optional +hash+, if given, will</span><tt>
+</tt> <span class="c"># generate attributes and values. For example.</span><tt>
+</tt> <span class="c">#</span><tt>
+</tt> <span class="c"># require 'ostruct'</span><tt>
+</tt> <span class="c"># hash = { &quot;country&quot; =&gt; &quot;Australia&quot;, :population =&gt; 20_000_000 }</span><tt>
+</tt> <span class="c"># data = OpenStruct.new(hash)</span><tt>
+</tt> <span class="c">#</span><tt>
+</tt> <span class="c"># p data # -&gt; &lt;OpenStruct country=&quot;Australia&quot; population=20000000&gt;</span><tt>
+</tt> <span class="c">#</span><tt>
+</tt> <span class="c"># By default, the resulting OpenStruct object will have no attributes. </span><tt>
+</tt> <span class="c">#</span><tt>
+</tt> <span class="r">def</span> <span class="fu">initialize</span>(hash=<span class="pc">nil</span>)<tt>
+</tt> <span class="iv">@table</span> = {}<tt>
+</tt> <span class="r">if</span> hash<tt>
+</tt> <span class="r">for</span> k,v <span class="r">in</span> hash<tt>
+</tt> <span class="iv">@table</span>[k.to_sym] = v<tt>
+</tt> new_ostruct_member(k)<tt>
+</tt> <span class="r">end</span><tt>
+</tt> <span class="r">end</span><tt>
+</tt> <span class="r">end</span><tt>
+</tt><tt>
+</tt> <span class="c"># Duplicate an OpenStruct object members. </span><tt>
+</tt> <span class="r">def</span> <span class="fu">initialize_copy</span>(orig)<tt>
+</tt> <span class="r">super</span><tt>
+</tt> <span class="iv">@table</span> = <span class="iv">@table</span>.dup<tt>
+</tt> <span class="r">end</span><tt>
+</tt><tt>
+</tt> <span class="r">def</span> <span class="fu">marshal_dump</span><tt>
+</tt> <span class="iv">@table</span><tt>
+</tt> <span class="r">end</span><tt>
+</tt> <span class="r">def</span> <span class="fu">marshal_load</span>(x)<tt>
+</tt> <span class="iv">@table</span> = x<tt>
+</tt> <span class="iv">@table</span>.each_key{|key| new_ostruct_member(key)}<tt>
+</tt> <span class="r">end</span><tt>
+</tt><tt>
+</tt> <span class="r">def</span> <span class="fu">new_ostruct_member</span>(name)<tt>
+</tt> <span class="r">unless</span> <span class="pc">self</span>.respond_to?(name)<tt>
+</tt> <span class="pc">self</span>.instance_eval <span class="s"><span class="dl">%{</span><span class="k"><tt>
+</tt> def </span><span class="il"><span class="dl">#{</span>name<span class="dl">}</span></span><span class="k">; @table[:</span><span class="il"><span class="dl">#{</span>name<span class="dl">}</span></span><span class="k">]; end<tt>
+</tt> def </span><span class="il"><span class="dl">#{</span>name<span class="dl">}</span></span><span class="k">=(x); @table[:</span><span class="il"><span class="dl">#{</span>name<span class="dl">}</span></span><span class="k">] = x; end<tt>
+</tt> </span><span class="dl">}</span></span><tt>
+</tt> <span class="r">end</span><tt>
+</tt> <span class="r">end</span><tt>
+</tt><tt>
+</tt> <span class="r">def</span> <span class="fu">method_missing</span>(mid, *args) <span class="c"># :nodoc:</span><tt>
+</tt> mname = mid.id2name<tt>
+</tt> len = args.length<tt>
+</tt> <span class="r">if</span> mname =~ <span class="rx"><span class="dl">/</span><span class="k">=$</span><span class="dl">/</span></span><tt>
+</tt> <span class="r">if</span> len != <span class="i">1</span><tt>
+</tt> raise <span class="co">ArgumentError</span>, <span class="s"><span class="dl">&quot;</span><span class="k">wrong number of arguments (</span><span class="il"><span class="dl">#{</span>len<span class="dl">}</span></span><span class="k"> for 1)</span><span class="dl">&quot;</span></span>, caller(<span class="i">1</span>)<tt>
+</tt> <span class="r">end</span><tt>
+</tt> <span class="r">if</span> <span class="pc">self</span>.frozen?<tt>
+</tt> raise <span class="co">TypeError</span>, <span class="s"><span class="dl">&quot;</span><span class="k">can't modify frozen </span><span class="il"><span class="dl">#{</span><span class="pc">self</span>.class<span class="dl">}</span></span><span class="dl">&quot;</span></span>, caller(<span class="i">1</span>)<tt>
+</tt> <span class="r">end</span><tt>
+</tt> mname.chop!<tt>
+</tt> <span class="iv">@table</span>[mname.intern] = args[<span class="i">0</span>]<tt>
+</tt> <span class="pc">self</span>.new_ostruct_member(mname)<tt>
+</tt> <span class="r">elsif</span> len == <span class="i">0</span><tt>
+</tt> <span class="iv">@table</span>[mid]<tt>
+</tt> <span class="r">else</span><tt>
+</tt> raise <span class="co">NoMethodError</span>, <span class="s"><span class="dl">&quot;</span><span class="k">undefined method `</span><span class="il"><span class="dl">#{</span>mname<span class="dl">}</span></span><span class="k">' for </span><span class="il"><span class="dl">#{</span><span class="pc">self</span><span class="dl">}</span></span><span class="dl">&quot;</span></span>, caller(<span class="i">1</span>)<tt>
+</tt> <span class="r">end</span><tt>
+</tt> <span class="r">end</span><tt>
+</tt><tt>
+</tt> <span class="c">#</span><tt>
+</tt> <span class="c"># Remove the named field from the object.</span><tt>
+</tt> <span class="c">#</span><tt>
+</tt> <span class="r">def</span> <span class="fu">delete_field</span>(name)<tt>
+</tt> <span class="iv">@table</span>.delete name.to_sym<tt>
+</tt> <span class="r">end</span><tt>
+</tt><tt>
+</tt> <span class="c">#</span><tt>
+</tt> <span class="c"># Returns a string containing a detailed summary of the keys and values.</span><tt>
+</tt> <span class="c">#</span><tt>
+</tt> <span class="r">def</span> <span class="fu">inspect</span><tt>
+</tt> str = <span class="s"><span class="dl">&quot;</span><span class="k">&lt;</span><span class="il"><span class="dl">#{</span><span class="pc">self</span>.class<span class="dl">}</span></span><span class="dl">&quot;</span></span><tt>
+</tt> <span class="r">for</span> k,v <span class="r">in</span> <span class="iv">@table</span><tt>
+</tt> str &lt;&lt; <span class="s"><span class="dl">&quot;</span><span class="k"> </span><span class="il"><span class="dl">#{</span>k<span class="dl">}</span></span><span class="k">=</span><span class="il"><span class="dl">#{</span>v.inspect<span class="dl">}</span></span><span class="dl">&quot;</span></span><tt>
+</tt> <span class="r">end</span><tt>
+</tt> str &lt;&lt; <span class="s"><span class="dl">&quot;</span><span class="k">&gt;</span><span class="dl">&quot;</span></span><tt>
+</tt> <span class="r">end</span><tt>
+</tt><tt>
+</tt> attr_reader <span class="sy">:table</span> <span class="c"># :nodoc:</span><tt>
+</tt> protected <span class="sy">:table</span><tt>
+</tt><tt>
+</tt> <span class="c">#</span><tt>
+</tt> <span class="c"># Compare this object and +other+ for equality.</span><tt>
+</tt> <span class="c">#</span><tt>
+</tt> <span class="r">def</span> <span class="fu">==</span>(other)<tt>
+</tt> <span class="r">return</span> <span class="pc">false</span> <span class="r">unless</span>(other.kind_of?(<span class="co">OpenStruct</span>))<tt>
+</tt> <span class="r">return</span> <span class="iv">@table</span> == other.table<tt>
+</tt> <span class="r">end</span><tt>
+</tt><span class="r">end</span><tt>
+</tt></pre></td>
+</tr></table>
+<h1>Genereated by</h1>
+<table class="CodeRay"><tr>
+ <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt>
+</tt>2<tt>
+</tt>3<tt>
+</tt>4<tt>
+</tt>5<tt>
+</tt>6<tt>
+</tt>7<tt>
+</tt>8<tt>
+</tt>9<tt>
+</tt><strong>10</strong><tt>
+</tt>11<tt>
+</tt>12<tt>
+</tt>13<tt>
+</tt>14<tt>
+</tt>15<tt>
+</tt>16<tt>
+</tt>17<tt>
+</tt>18<tt>
+</tt>19<tt>
+</tt><strong>20</strong><tt>
+</tt>21<tt>
+</tt>22<tt>
+</tt>23<tt>
+</tt>24<tt>
+</tt>25<tt>
+</tt>26<tt>
+</tt>27<tt>
+</tt>28<tt>
+</tt>29<tt>
+</tt><strong>30</strong><tt>
+</tt>31<tt>
+</tt>32<tt>
+</tt>33<tt>
+</tt></pre></td>
+ <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">require <span class="s"><span class="dl">'</span><span class="k">coderay</span><span class="dl">'</span></span><tt>
+</tt><tt>
+</tt>c, ruby = <span class="pc">DATA</span>.read.split(<span class="rx"><span class="dl">/</span><span class="k">^---$</span><span class="dl">/</span></span>)<tt>
+</tt><span class="pc">DATA</span>.rewind<tt>
+</tt>me = <span class="pc">DATA</span>.read[<span class="rx"><span class="dl">/</span><span class="k">.*^__END__$</span><span class="dl">/</span><span class="mod">m</span></span>]<tt>
+</tt><span class="gv">$input</span> = c + ruby + me<tt>
+</tt><tt>
+</tt>require <span class="s"><span class="dl">'</span><span class="k">benchmark</span><span class="dl">'</span></span><tt>
+</tt>time = <span class="co">Benchmark</span>.realtime <span class="r">do</span><tt>
+</tt><tt>
+</tt> <span class="c"># here CodeRay comes to play</span><tt>
+</tt> hl = <span class="co">CodeRay</span>.encoder(<span class="sy">:html</span>, <span class="sy">:tab_width</span> =&gt; <span class="i">2</span>, <span class="sy">:line_numbers</span> =&gt; <span class="sy">:table</span>, <span class="sy">:wrap</span> =&gt; <span class="sy">:div</span>)<tt>
+</tt> c = hl.highlight c, <span class="sy">:c</span><tt>
+</tt> ruby = hl.highlight ruby, <span class="sy">:ruby</span><tt>
+</tt> me = hl.highlight me, <span class="sy">:ruby</span><tt>
+</tt><tt>
+</tt> body = <span class="s"><span class="dl">%w[</span><span class="k">C Ruby Genereated</span><span class="k">\ </span><span class="k">by</span><span class="dl">]</span></span>.zip([c, ruby, me]).map <span class="r">do</span> |title, code|<tt>
+</tt> <span class="s"><span class="dl">&quot;</span><span class="k">&lt;h1&gt;</span><span class="il"><span class="dl">#{</span>title<span class="dl">}</span></span><span class="k">&lt;/h1&gt;</span><span class="ch">\n</span><span class="il"><span class="dl">#{</span>code<span class="dl">}</span></span><span class="dl">&quot;</span></span><tt>
+</tt> <span class="r">end</span>.join<tt>
+</tt> body = hl.class::<span class="co">Output</span>.new(body, hl.css, <span class="sy">:div</span>).page!<tt>
+</tt><tt>
+</tt> <span class="c"># CodeRay also provides a simple page generator</span><tt>
+</tt> <span class="gv">$output</span> = body <span class="c">#hl.class.wrap_in_page body</span><tt>
+</tt><span class="r">end</span><tt>
+</tt><tt>
+</tt><span class="co">File</span>.open(<span class="s"><span class="dl">'</span><span class="k">test.html</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">w</span><span class="dl">'</span></span>) <span class="r">do</span> |f|<tt>
+</tt> f.write <span class="gv">$output</span><tt>
+</tt><span class="r">end</span><tt>
+</tt>puts <span class="s"><span class="dl">'</span><span class="k">Input: %dB, Output: %dB</span><span class="dl">'</span></span> % [<span class="gv">$input</span>.size, <span class="gv">$output</span>.size]<tt>
+</tt><span class="c">#puts 'Created &quot;test.html&quot; in %0.3f seconds (%d KB/s).' % [time, $input.size / 1024.0 / time]</span><tt>
+</tt>puts <span class="s"><span class="dl">'</span><span class="k">Take a look with your browser.</span><span class="dl">'</span></span><tt>
+</tt><tt>
+</tt><span class="c">__END__</span></pre></td>
+</tr></table>
+
+</body>
+</html>