coderay-beta 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. data/FOLDERS +53 -0
  2. data/LICENSE +504 -0
  3. data/bin/coderay +82 -0
  4. data/bin/coderay_stylesheet +4 -0
  5. data/lib/README +129 -0
  6. data/lib/coderay.rb +320 -0
  7. data/lib/coderay/duo.rb +85 -0
  8. data/lib/coderay/encoder.rb +213 -0
  9. data/lib/coderay/encoders/_map.rb +11 -0
  10. data/lib/coderay/encoders/comment_filter.rb +43 -0
  11. data/lib/coderay/encoders/count.rb +21 -0
  12. data/lib/coderay/encoders/debug.rb +49 -0
  13. data/lib/coderay/encoders/div.rb +19 -0
  14. data/lib/coderay/encoders/filter.rb +75 -0
  15. data/lib/coderay/encoders/html.rb +305 -0
  16. data/lib/coderay/encoders/html/css.rb +70 -0
  17. data/lib/coderay/encoders/html/numerization.rb +133 -0
  18. data/lib/coderay/encoders/html/output.rb +206 -0
  19. data/lib/coderay/encoders/json.rb +69 -0
  20. data/lib/coderay/encoders/lines_of_code.rb +90 -0
  21. data/lib/coderay/encoders/null.rb +26 -0
  22. data/lib/coderay/encoders/page.rb +20 -0
  23. data/lib/coderay/encoders/span.rb +19 -0
  24. data/lib/coderay/encoders/statistic.rb +77 -0
  25. data/lib/coderay/encoders/term.rb +137 -0
  26. data/lib/coderay/encoders/text.rb +32 -0
  27. data/lib/coderay/encoders/token_class_filter.rb +84 -0
  28. data/lib/coderay/encoders/xml.rb +71 -0
  29. data/lib/coderay/encoders/yaml.rb +22 -0
  30. data/lib/coderay/for_redcloth.rb +85 -0
  31. data/lib/coderay/helpers/file_type.rb +240 -0
  32. data/lib/coderay/helpers/gzip_simple.rb +123 -0
  33. data/lib/coderay/helpers/plugin.rb +349 -0
  34. data/lib/coderay/helpers/word_list.rb +138 -0
  35. data/lib/coderay/scanner.rb +284 -0
  36. data/lib/coderay/scanners/_map.rb +23 -0
  37. data/lib/coderay/scanners/c.rb +203 -0
  38. data/lib/coderay/scanners/cpp.rb +228 -0
  39. data/lib/coderay/scanners/css.rb +210 -0
  40. data/lib/coderay/scanners/debug.rb +62 -0
  41. data/lib/coderay/scanners/delphi.rb +150 -0
  42. data/lib/coderay/scanners/diff.rb +105 -0
  43. data/lib/coderay/scanners/groovy.rb +263 -0
  44. data/lib/coderay/scanners/html.rb +182 -0
  45. data/lib/coderay/scanners/java.rb +176 -0
  46. data/lib/coderay/scanners/java/builtin_types.rb +419 -0
  47. data/lib/coderay/scanners/java_script.rb +224 -0
  48. data/lib/coderay/scanners/json.rb +112 -0
  49. data/lib/coderay/scanners/nitro_xhtml.rb +136 -0
  50. data/lib/coderay/scanners/php.rb +526 -0
  51. data/lib/coderay/scanners/plaintext.rb +21 -0
  52. data/lib/coderay/scanners/python.rb +285 -0
  53. data/lib/coderay/scanners/rhtml.rb +74 -0
  54. data/lib/coderay/scanners/ruby.rb +404 -0
  55. data/lib/coderay/scanners/ruby/patterns.rb +238 -0
  56. data/lib/coderay/scanners/scheme.rb +145 -0
  57. data/lib/coderay/scanners/sql.rb +162 -0
  58. data/lib/coderay/scanners/xml.rb +17 -0
  59. data/lib/coderay/scanners/yaml.rb +144 -0
  60. data/lib/coderay/style.rb +20 -0
  61. data/lib/coderay/styles/_map.rb +7 -0
  62. data/lib/coderay/styles/cycnus.rb +151 -0
  63. data/lib/coderay/styles/murphy.rb +132 -0
  64. data/lib/coderay/token_classes.rb +86 -0
  65. data/lib/coderay/tokens.rb +391 -0
  66. data/lib/term/ansicolor.rb +220 -0
  67. metadata +123 -0
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env ruby
2
+ # CodeRay Executable
3
+ #
4
+ # Version: 0.1
5
+ # Author: murphy
6
+
7
+ def err msg
8
+ $stderr.puts msg
9
+ end
10
+
11
+ begin
12
+ require 'coderay'
13
+
14
+ if ARGV.empty?
15
+ puts <<-USAGE
16
+ CodeRay #{CodeRay::VERSION} (http://coderay.rubychan.de)
17
+ Usage:
18
+ coderay -<lang> [-<format>] < file > output
19
+ coderay file [-<format>]
20
+ Example:
21
+ coderay -ruby -statistic < foo.rb
22
+ coderay codegen.c # generates codegen.c.html
23
+ USAGE
24
+ end
25
+
26
+ first, second = ARGV
27
+
28
+ if first
29
+ if first[/-(\w+)/] == first
30
+ lang = $1
31
+ input = $stdin.read
32
+ tokens = :scan
33
+ elsif first == '-'
34
+ lang = $1
35
+ input = $stdin.read
36
+ tokens = :scan
37
+ else
38
+ file = first
39
+ tokens = CodeRay.scan_file file
40
+ output_filename, output_ext = file, /#{Regexp.escape(File.extname(file))}$/
41
+ end
42
+ else
43
+ puts 'No lang/file given.'
44
+ exit 1
45
+ end
46
+
47
+ if second
48
+ if second[/-(\w+)/] == second
49
+ format = $1
50
+ else
51
+ raise 'Invalid format (must be -xxx).'
52
+ end
53
+ else
54
+ $stderr.puts 'No format given; setting to default (HTML Page)'
55
+ format = :page
56
+ end
57
+
58
+ # TODO: allow streaming
59
+ if tokens == :scan
60
+ output = CodeRay::Duo[lang => format].highlight input #, :stream => true
61
+ else
62
+ output = tokens.encode format
63
+ end
64
+ out = $stdout
65
+ if output_filename
66
+ output_filename += '.' + CodeRay::Encoders[format]::FILE_EXTENSION
67
+ if File.exist? output_filename
68
+ err 'File %s already exists.' % output_filename
69
+ exit
70
+ else
71
+ out = File.open output_filename, 'w'
72
+ end
73
+ end
74
+ out.print output
75
+
76
+ rescue => boom
77
+ err "Error: #{boom.message}\n"
78
+ err boom.backtrace
79
+ err '-' * 50
80
+ err ARGV
81
+ exit 1
82
+ end
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require 'coderay'
3
+
4
+ puts CodeRay::Encoders[:html]::CSS.new.stylesheet
@@ -0,0 +1,129 @@
1
+ = CodeRay
2
+
3
+ [- Tired of blue'n'gray? Try the original version of this documentation on
4
+ coderay.rubychan.de[http://coderay.rubychan.de/doc/] (use Ctrl+Click to open it in its own frame.) -]
5
+
6
+ == About
7
+ CodeRay is a Ruby library for syntax highlighting.
8
+
9
+ Syntax highlighting means: You put your code in, and you get it back colored;
10
+ Keywords, strings, floats, comments - all in different colors.
11
+ And with line numbers.
12
+
13
+ *Syntax* *Highlighting*...
14
+ * makes code easier to read and maintain
15
+ * lets you detect syntax errors faster
16
+ * helps you to understand the syntax of a language
17
+ * looks nice
18
+ * is what everybody should have on their website
19
+ * solves all your problems and makes the girls run after you
20
+
21
+ Version: 0.9.1
22
+ Author:: murphy (Kornelius Kalnbach)
23
+ Contact:: murphy rubychan de
24
+ Website:: coderay.rubychan.de[http://coderay.rubychan.de]
25
+ License:: GNU LGPL; see LICENSE file in the main directory.
26
+
27
+ == Installation
28
+
29
+ You need RubyGems[http://rubyforge.org/frs/?group_id=126].
30
+
31
+ % gem install coderay
32
+
33
+
34
+ === Dependencies
35
+
36
+ CodeRay needs Ruby 1.8.6 or later. It also runs with Ruby 1.9.1+ and JRuby 1.1+.
37
+
38
+
39
+ == Example Usage
40
+ (Forgive me, but this is not highlighted.)
41
+
42
+ require 'coderay'
43
+
44
+ tokens = CodeRay.scan "puts 'Hello, world!'", :ruby
45
+ page = tokens.html :line_numbers => :inline, :wrap => :page
46
+ puts page
47
+
48
+
49
+ == Documentation
50
+
51
+ See CodeRay.
52
+
53
+ Please report errors in this documentation to <murphy rubychan de>.
54
+
55
+
56
+ == Credits
57
+
58
+ === Special Thanks to
59
+
60
+ * licenser (Heinz N. Gies) for ending my QBasic career, inventing the Coder
61
+ project and the input/output plugin system.
62
+ CodeRay would not exist without him.
63
+ * bovi (Daniel Bovensiepen) for helping me out on various occasions.
64
+
65
+ === Thanks to
66
+
67
+ * Caleb Clausen for writing RubyLexer (see
68
+ http://rubyforge.org/projects/rubylexer) and lots of very interesting mail
69
+ traffic
70
+ * birkenfeld (Georg Brandl) and mitsuhiku (Arnim Ronacher) for PyKleur, now pygments.
71
+ You guys rock!
72
+ * Jamis Buck for writing Syntax (see http://rubyforge.org/projects/syntax)
73
+ I got some useful ideas from it.
74
+ * Doug Kearns and everyone else who worked on ruby.vim - it not only helped me
75
+ coding CodeRay, but also gave me a wonderful target to reach for the Ruby
76
+ scanner.
77
+ * everyone who uses CodeBB on http://www.rubyforen.de and http://www.python-forum.de
78
+ * iGEL, magichisoka, manveru, WoNáDo and everyone I forgot from rubyforen.de
79
+ * Dethix from ruby-mine.de
80
+ * zickzackw
81
+ * Dookie (who is no longer with us...) and Leonidas from http://www.python-forum.de
82
+ * Andreas Schwarz for finding out that CaseIgnoringWordList was not case
83
+ ignoring! Such things really make you write tests.
84
+ * closure for the first version of the Scheme scanner.
85
+ * Stefan Walk for the first version of the JavaScript scanner.
86
+ * Josh Goebel for another version of the JavaScript scanner and a Diff scanner.
87
+ * Jonathan Younger for pointing out the licence confusion caused by wrong LICENSE file.
88
+ * Jeremy Hinegardner for finding the shebang-on-empty-file bug in FileType.
89
+ * Charles Oliver Nutter and Yehuda Katz for helping me benchmark CodeRay on JRuby.
90
+ * Andreas Neuhaus for pointing out a markup bug in coderay/for_redcloth.
91
+ * 0xf30fc7 for the FileType patch concerning Delphi file extensions.
92
+ * The folks at redmine.org - thank you for using and fixing CodeRay!
93
+ * matz and all Ruby gods and gurus
94
+ * The inventors of: the computer, the internet, the true color display, HTML &
95
+ CSS, VIM, Ruby, pizza, microwaves, guitars, scouting, programming, anime,
96
+ manga, coke and green ice tea.
97
+
98
+ Where would we be without all those people?
99
+
100
+ === Created using
101
+
102
+ * Ruby[http://ruby-lang.org/]
103
+ * Chihiro (my Sony VAIO laptop); Henrietta (my old MacBook);
104
+ Triella, born Rico (my new MacBook); as well as
105
+ Seras and Hikari (my PCs)
106
+ * RDE[http://homepage2.nifty.com/sakazuki/rde_e.html],
107
+ VIM[http://vim.org] and TextMate[http://macromates.com]
108
+ * Subversion[http://subversion.tigris.org/]
109
+ * Redmine[http://redmine.org/]
110
+ * Firefox[http://www.mozilla.org/products/firefox/],
111
+ Firebug[http://getfirebug.com/], Safari[http://www.apple.com/safari/], and
112
+ Thunderbird[http://www.mozilla.org/products/thunderbird/]
113
+ * RubyGems[http://docs.rubygems.org/] and Rake[http://rake.rubyforge.org/]
114
+ * TortoiseSVN[http://tortoisesvn.tigris.org/] using Apache via
115
+ XAMPP[http://www.apachefriends.org/en/xampp.html]
116
+ * RDoc (though I'm quite unsatisfied with it)
117
+ * Microsoft Windows (yes, I confess!) and MacOS X
118
+ * GNUWin32, MinGW and some other tools to make the shell under windows a bit
119
+ less useless
120
+ * Term::ANSIColor[http://term-ansicolor.rubyforge.org/]
121
+ * PLEAC[http://pleac.sourceforge.net/] code examples
122
+
123
+ === Free
124
+
125
+ * As you can see, CodeRay was created under heavy use of *free* software.
126
+ * So CodeRay is also *free*.
127
+ * If you use CodeRay to create software, think about making this software
128
+ *free*, too.
129
+ * Thanks :)
@@ -0,0 +1,320 @@
1
+ # = CodeRay Library
2
+ #
3
+ # CodeRay is a Ruby library for syntax highlighting.
4
+ #
5
+ # I try to make CodeRay easy to use and intuitive, but at the same time fully featured, complete,
6
+ # fast and efficient.
7
+ #
8
+ # See README.
9
+ #
10
+ # It consists mainly of
11
+ # * the main engine: CodeRay (Scanners::Scanner, Tokens/TokenStream, Encoders::Encoder), PluginHost
12
+ # * the scanners in CodeRay::Scanners
13
+ # * the encoders in CodeRay::Encoders
14
+ #
15
+ # Here's a fancy graphic to light up this gray docu:
16
+ #
17
+ # http://rd.cYcnus.de/coderay/scheme.png
18
+ #
19
+ # == Documentation
20
+ #
21
+ # See CodeRay, Encoders, Scanners, Tokens.
22
+ #
23
+ # == Usage
24
+ #
25
+ # Remember you need RubyGems to use CodeRay, unless you have it in your load path. Run Ruby with
26
+ # -rubygems option if required.
27
+ #
28
+ # === Highlight Ruby code in a string as html
29
+ #
30
+ # require 'coderay'
31
+ # print CodeRay.scan('puts "Hello, world!"', :ruby).html
32
+ #
33
+ # # prints something like this:
34
+ # puts <span class="s">&quot;Hello, world!&quot;</span>
35
+ #
36
+ #
37
+ # === Highlight C code from a file in a html div
38
+ #
39
+ # require 'coderay'
40
+ # print CodeRay.scan(File.read('ruby.h'), :c).div
41
+ # print CodeRay.scan_file('ruby.h').html.div
42
+ #
43
+ # You can include this div in your page. The used CSS styles can be printed with
44
+ #
45
+ # % coderay_stylesheet
46
+ #
47
+ # === Highlight without typing too much
48
+ #
49
+ # If you are one of the hasty (or lazy, or extremely curious) people, just run this file:
50
+ #
51
+ # % ruby -rubygems /path/to/coderay/coderay.rb > example.html
52
+ #
53
+ # and look at the file it created in your browser.
54
+ #
55
+ # = CodeRay Module
56
+ #
57
+ # The CodeRay module provides convenience methods for the engine.
58
+ #
59
+ # * The +lang+ and +format+ arguments select Scanner and Encoder to use. These are
60
+ # simply lower-case symbols, like <tt>:python</tt> or <tt>:html</tt>.
61
+ # * All methods take an optional hash as last parameter, +options+, that is send to
62
+ # the Encoder / Scanner.
63
+ # * Input and language are always sorted in this order: +code+, +lang+.
64
+ # (This is in alphabetical order, if you need a mnemonic ;)
65
+ #
66
+ # You should be able to highlight everything you want just using these methods;
67
+ # so there is no need to dive into CodeRay's deep class hierarchy.
68
+ #
69
+ # The examples in the demo directory demonstrate common cases using this interface.
70
+ #
71
+ # = Basic Access Ways
72
+ #
73
+ # Read this to get a general view what CodeRay provides.
74
+ #
75
+ # == Scanning
76
+ #
77
+ # Scanning means analysing an input string, splitting it up into Tokens.
78
+ # Each Token knows about what type it is: string, comment, class name, etc.
79
+ #
80
+ # Each +lang+ (language) has its own Scanner; for example, <tt>:ruby</tt> code is
81
+ # handled by CodeRay::Scanners::Ruby.
82
+ #
83
+ # CodeRay.scan:: Scan a string in a given language into Tokens.
84
+ # This is the most common method to use.
85
+ # CodeRay.scan_file:: Scan a file and guess the language using FileType.
86
+ #
87
+ # The Tokens object you get from these methods can encode itself; see Tokens.
88
+ #
89
+ # == Encoding
90
+ #
91
+ # Encoding means compiling Tokens into an output. This can be colored HTML or
92
+ # LaTeX, a textual statistic or just the number of non-whitespace tokens.
93
+ #
94
+ # Each Encoder provides output in a specific +format+, so you select Encoders via
95
+ # formats like <tt>:html</tt> or <tt>:statistic</tt>.
96
+ #
97
+ # CodeRay.encode:: Scan and encode a string in a given language.
98
+ # CodeRay.encode_tokens:: Encode the given tokens.
99
+ # CodeRay.encode_file:: Scan a file, guess the language using FileType and encode it.
100
+ #
101
+ # == Streaming
102
+ #
103
+ # Streaming saves RAM by running Scanner and Encoder in some sort of
104
+ # pipe mode; see TokenStream.
105
+ #
106
+ # CodeRay.scan_stream:: Scan in stream mode.
107
+ #
108
+ # == All-in-One Encoding
109
+ #
110
+ # CodeRay.encode:: Highlight a string with a given input and output format.
111
+ #
112
+ # == Instanciating
113
+ #
114
+ # You can use an Encoder instance to highlight multiple inputs. This way, the setup
115
+ # for this Encoder must only be done once.
116
+ #
117
+ # CodeRay.encoder:: Create an Encoder instance with format and options.
118
+ # CodeRay.scanner:: Create an Scanner instance for lang, with '' as default code.
119
+ #
120
+ # To make use of CodeRay.scanner, use CodeRay::Scanner::code=.
121
+ #
122
+ # The scanning methods provide more flexibility; we recommend to use these.
123
+ #
124
+ # == Reusing Scanners and Encoders
125
+ #
126
+ # If you want to re-use scanners and encoders (because that is faster), see
127
+ # CodeRay::Duo for the most convenient (and recommended) interface.
128
+ module CodeRay
129
+
130
+ # Version: Major.Minor.Teeny[.Revision]
131
+ # Major: 0 for pre-stable, 1 for stable
132
+ # Minor: feature milestone
133
+ # Teeny: development state, 0 for pre-release
134
+ # Revision: Subversion Revision number (generated on rake gem:make)
135
+ VERSION = '0.9.1'
136
+
137
+ require 'coderay/tokens'
138
+ require 'coderay/token_classes'
139
+ require 'coderay/scanner'
140
+ require 'coderay/encoder'
141
+ require 'coderay/duo'
142
+ require 'coderay/style'
143
+
144
+
145
+ class << self
146
+
147
+ # Scans the given +code+ (a String) with the Scanner for +lang+.
148
+ #
149
+ # This is a simple way to use CodeRay. Example:
150
+ # require 'coderay'
151
+ # page = CodeRay.scan("puts 'Hello, world!'", :ruby).html
152
+ #
153
+ # See also demo/demo_simple.
154
+ def scan code, lang, options = {}, &block
155
+ scanner = Scanners[lang].new code, options, &block
156
+ scanner.tokenize
157
+ end
158
+
159
+ # Scans +filename+ (a path to a code file) with the Scanner for +lang+.
160
+ #
161
+ # If +lang+ is :auto or omitted, the CodeRay::FileType module is used to
162
+ # determine it. If it cannot find out what type it is, it uses
163
+ # CodeRay::Scanners::Plaintext.
164
+ #
165
+ # Calls CodeRay.scan.
166
+ #
167
+ # Example:
168
+ # require 'coderay'
169
+ # page = CodeRay.scan_file('some_c_code.c').html
170
+ def scan_file filename, lang = :auto, options = {}, &block
171
+ file = IO.read filename
172
+ if lang == :auto
173
+ require 'coderay/helpers/file_type'
174
+ lang = FileType.fetch filename, :plaintext, true
175
+ end
176
+ scan file, lang, options = {}, &block
177
+ end
178
+
179
+ # Scan the +code+ (a string) with the scanner for +lang+.
180
+ #
181
+ # Calls scan.
182
+ #
183
+ # See CodeRay.scan.
184
+ def scan_stream code, lang, options = {}, &block
185
+ options[:stream] = true
186
+ scan code, lang, options, &block
187
+ end
188
+
189
+ # Encode a string in Streaming mode.
190
+ #
191
+ # This starts scanning +code+ with the the Scanner for +lang+
192
+ # while encodes the output with the Encoder for +format+.
193
+ # +options+ will be passed to the Encoder.
194
+ #
195
+ # See CodeRay::Encoder.encode_stream
196
+ def encode_stream code, lang, format, options = {}
197
+ encoder(format, options).encode_stream code, lang, options
198
+ end
199
+
200
+ # Encode a string.
201
+ #
202
+ # This scans +code+ with the the Scanner for +lang+ and then
203
+ # encodes it with the Encoder for +format+.
204
+ # +options+ will be passed to the Encoder.
205
+ #
206
+ # See CodeRay::Encoder.encode
207
+ def encode code, lang, format, options = {}
208
+ encoder(format, options).encode code, lang, options
209
+ end
210
+
211
+ # Highlight a string into a HTML <div>.
212
+ #
213
+ # CSS styles use classes, so you have to include a stylesheet
214
+ # in your output.
215
+ #
216
+ # See encode.
217
+ def highlight code, lang, options = { :css => :class }, format = :div
218
+ encode code, lang, format, options
219
+ end
220
+
221
+ # Encode pre-scanned Tokens.
222
+ # Use this together with CodeRay.scan:
223
+ #
224
+ # require 'coderay'
225
+ #
226
+ # # Highlight a short Ruby code example in a HTML span
227
+ # tokens = CodeRay.scan '1 + 2', :ruby
228
+ # puts CodeRay.encode_tokens(tokens, :span)
229
+ #
230
+ def encode_tokens tokens, format, options = {}
231
+ encoder(format, options).encode_tokens tokens, options
232
+ end
233
+
234
+ # Encodes +filename+ (a path to a code file) with the Scanner for +lang+.
235
+ #
236
+ # See CodeRay.scan_file.
237
+ # Notice that the second argument is the output +format+, not the input language.
238
+ #
239
+ # Example:
240
+ # require 'coderay'
241
+ # page = CodeRay.encode_file 'some_c_code.c', :html
242
+ def encode_file filename, format, options = {}
243
+ tokens = scan_file filename, :auto, get_scanner_options(options)
244
+ encode_tokens tokens, format, options
245
+ end
246
+
247
+ # Highlight a file into a HTML <div>.
248
+ #
249
+ # CSS styles use classes, so you have to include a stylesheet
250
+ # in your output.
251
+ #
252
+ # See encode.
253
+ def highlight_file filename, options = { :css => :class }, format = :div
254
+ encode_file filename, format, options
255
+ end
256
+
257
+ # Finds the Encoder class for +format+ and creates an instance, passing
258
+ # +options+ to it.
259
+ #
260
+ # Example:
261
+ # require 'coderay'
262
+ #
263
+ # stats = CodeRay.encoder(:statistic)
264
+ # stats.encode("puts 17 + 4\n", :ruby)
265
+ #
266
+ # puts '%d out of %d tokens have the kind :integer.' % [
267
+ # stats.type_stats[:integer].count,
268
+ # stats.real_token_count
269
+ # ]
270
+ # #-> 2 out of 4 tokens have the kind :integer.
271
+ def encoder format, options = {}
272
+ Encoders[format].new options
273
+ end
274
+
275
+ # Finds the Scanner class for +lang+ and creates an instance, passing
276
+ # +options+ to it.
277
+ #
278
+ # See Scanner.new.
279
+ def scanner lang, options = {}
280
+ Scanners[lang].new '', options
281
+ end
282
+
283
+ # Extract the options for the scanner from the +options+ hash.
284
+ #
285
+ # Returns an empty Hash if <tt>:scanner_options</tt> is not set.
286
+ #
287
+ # This is used if a method like CodeRay.encode has to provide options
288
+ # for Encoder _and_ scanner.
289
+ def get_scanner_options options
290
+ options.fetch :scanner_options, {}
291
+ end
292
+
293
+ end
294
+
295
+ # This Exception is raised when you try to stream with something that is not
296
+ # capable of streaming.
297
+ class NotStreamableError < Exception
298
+ def initialize obj
299
+ @obj = obj
300
+ end
301
+
302
+ def to_s
303
+ '%s is not Streamable!' % @obj.class
304
+ end
305
+ end
306
+
307
+ # A dummy module that is included by subclasses of CodeRay::Scanner an CodeRay::Encoder
308
+ # to show that they are able to handle streams.
309
+ module Streamable
310
+ end
311
+
312
+ end
313
+
314
+ # Run a test script.
315
+ if $0 == __FILE__
316
+ $stderr.print 'Press key to print demo.'; gets
317
+ # Just use this file as an example of Ruby code.
318
+ code = File.read(__FILE__)[/module CodeRay.*/m]
319
+ print CodeRay.scan(code, :ruby).html
320
+ end