coderay 0.9.8 → 1.0.0

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 (87) hide show
  1. data/{lib/README → README_INDEX.rdoc} +10 -21
  2. data/Rakefile +6 -6
  3. data/bin/coderay +193 -64
  4. data/lib/coderay.rb +61 -105
  5. data/lib/coderay/duo.rb +17 -21
  6. data/lib/coderay/encoder.rb +100 -112
  7. data/lib/coderay/encoders/_map.rb +12 -7
  8. data/lib/coderay/encoders/comment_filter.rb +12 -30
  9. data/lib/coderay/encoders/count.rb +29 -11
  10. data/lib/coderay/encoders/debug.rb +32 -20
  11. data/lib/coderay/encoders/div.rb +13 -9
  12. data/lib/coderay/encoders/filter.rb +34 -51
  13. data/lib/coderay/encoders/html.rb +155 -161
  14. data/lib/coderay/encoders/html/css.rb +4 -9
  15. data/lib/coderay/encoders/html/numbering.rb +115 -0
  16. data/lib/coderay/encoders/html/output.rb +22 -70
  17. data/lib/coderay/encoders/json.rb +59 -45
  18. data/lib/coderay/encoders/lines_of_code.rb +12 -57
  19. data/lib/coderay/encoders/null.rb +6 -14
  20. data/lib/coderay/encoders/page.rb +13 -9
  21. data/lib/coderay/encoders/span.rb +13 -9
  22. data/lib/coderay/encoders/statistic.rb +58 -39
  23. data/lib/coderay/encoders/terminal.rb +179 -0
  24. data/lib/coderay/encoders/text.rb +31 -17
  25. data/lib/coderay/encoders/token_kind_filter.rb +111 -0
  26. data/lib/coderay/encoders/xml.rb +19 -18
  27. data/lib/coderay/encoders/yaml.rb +37 -9
  28. data/lib/coderay/for_redcloth.rb +4 -4
  29. data/lib/coderay/helpers/file_type.rb +127 -246
  30. data/lib/coderay/helpers/gzip.rb +41 -0
  31. data/lib/coderay/helpers/plugin.rb +241 -306
  32. data/lib/coderay/helpers/word_list.rb +65 -126
  33. data/lib/coderay/scanner.rb +173 -156
  34. data/lib/coderay/scanners/_map.rb +18 -17
  35. data/lib/coderay/scanners/c.rb +63 -77
  36. data/lib/coderay/scanners/clojure.rb +217 -0
  37. data/lib/coderay/scanners/cpp.rb +71 -84
  38. data/lib/coderay/scanners/css.rb +103 -120
  39. data/lib/coderay/scanners/debug.rb +47 -44
  40. data/lib/coderay/scanners/delphi.rb +70 -76
  41. data/lib/coderay/scanners/diff.rb +141 -50
  42. data/lib/coderay/scanners/erb.rb +81 -0
  43. data/lib/coderay/scanners/groovy.rb +104 -113
  44. data/lib/coderay/scanners/haml.rb +168 -0
  45. data/lib/coderay/scanners/html.rb +181 -110
  46. data/lib/coderay/scanners/java.rb +73 -75
  47. data/lib/coderay/scanners/java/builtin_types.rb +2 -0
  48. data/lib/coderay/scanners/java_script.rb +90 -101
  49. data/lib/coderay/scanners/json.rb +40 -53
  50. data/lib/coderay/scanners/php.rb +123 -147
  51. data/lib/coderay/scanners/python.rb +93 -91
  52. data/lib/coderay/scanners/raydebug.rb +66 -0
  53. data/lib/coderay/scanners/ruby.rb +343 -326
  54. data/lib/coderay/scanners/ruby/patterns.rb +40 -106
  55. data/lib/coderay/scanners/ruby/string_state.rb +71 -0
  56. data/lib/coderay/scanners/sql.rb +80 -66
  57. data/lib/coderay/scanners/text.rb +26 -0
  58. data/lib/coderay/scanners/xml.rb +1 -1
  59. data/lib/coderay/scanners/yaml.rb +74 -73
  60. data/lib/coderay/style.rb +10 -7
  61. data/lib/coderay/styles/_map.rb +3 -3
  62. data/lib/coderay/styles/alpha.rb +143 -0
  63. data/lib/coderay/token_kinds.rb +90 -0
  64. data/lib/coderay/tokens.rb +102 -277
  65. data/lib/coderay/tokens_proxy.rb +55 -0
  66. data/lib/coderay/version.rb +3 -0
  67. data/test/functional/basic.rb +200 -18
  68. data/test/functional/examples.rb +130 -0
  69. data/test/functional/for_redcloth.rb +15 -8
  70. data/test/functional/suite.rb +9 -6
  71. metadata +103 -123
  72. data/FOLDERS +0 -53
  73. data/bin/coderay_stylesheet +0 -4
  74. data/lib/coderay/encoders/html/numerization.rb +0 -133
  75. data/lib/coderay/encoders/term.rb +0 -158
  76. data/lib/coderay/encoders/token_class_filter.rb +0 -84
  77. data/lib/coderay/helpers/gzip_simple.rb +0 -123
  78. data/lib/coderay/scanners/nitro_xhtml.rb +0 -136
  79. data/lib/coderay/scanners/plaintext.rb +0 -20
  80. data/lib/coderay/scanners/rhtml.rb +0 -78
  81. data/lib/coderay/scanners/scheme.rb +0 -145
  82. data/lib/coderay/styles/cycnus.rb +0 -152
  83. data/lib/coderay/styles/murphy.rb +0 -134
  84. data/lib/coderay/token_classes.rb +0 -86
  85. data/test/functional/load_plugin_scanner.rb +0 -11
  86. data/test/functional/vhdl.rb +0 -126
  87. data/test/functional/word_list.rb +0 -79
@@ -1,57 +1,45 @@
1
1
  = CodeRay
2
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.) -]
3
+ Tired of blue'n'gray? Try the original version of this documentation on
4
+ coderay.rubychan.de[http://coderay.rubychan.de/doc/] :-)
5
5
 
6
6
  == About
7
+
7
8
  CodeRay is a Ruby library for syntax highlighting.
8
9
 
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.
10
+ You put your code in, and you get it back colored; Keywords, strings,
11
+ floats, comments - all in different colors. And with line numbers.
12
12
 
13
13
  *Syntax* *Highlighting*...
14
14
  * makes code easier to read and maintain
15
15
  * lets you detect syntax errors faster
16
16
  * helps you to understand the syntax of a language
17
17
  * looks nice
18
- * is what everybody should have on their website
18
+ * is what everybody wants to have on their website
19
19
  * solves all your problems and makes the girls run after you
20
20
 
21
- Version: 0.9.8
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
21
 
27
22
  == Installation
28
23
 
29
- You need RubyGems[http://rubyforge.org/frs/?group_id=126].
30
-
31
24
  % gem install coderay
32
25
 
33
26
 
34
27
  === Dependencies
35
28
 
36
- CodeRay needs Ruby 1.8.6 or later. It also runs with Ruby 1.9.1+ and JRuby 1.1+.
29
+ CodeRay needs Ruby 1.8.7+ or 1.9.2+. It also runs on Rubinius and JRuby.
37
30
 
38
31
 
39
32
  == Example Usage
40
- (Forgive me, but this is not highlighted.)
41
33
 
42
34
  require 'coderay'
43
35
 
44
- tokens = CodeRay.scan "puts 'Hello, world!'", :ruby
45
- page = tokens.html :line_numbers => :inline, :wrap => :page
46
- puts page
36
+ html = CodeRay.scan("puts 'Hello, world!'", :ruby).div(:line_numbers => :table)
47
37
 
48
38
 
49
39
  == Documentation
50
40
 
51
41
  See CodeRay.
52
42
 
53
- Please report errors in this documentation to <murphy rubychan de>.
54
-
55
43
 
56
44
  == Credits
57
45
 
@@ -94,7 +82,6 @@ Please report errors in this documentation to <murphy rubychan de>.
94
82
  * Rob Aldred for the terminal encoder
95
83
  * Trans for pointing out $DEBUG dependencies
96
84
  * Flameeyes for finding that Term::ANSIColor was obsolete
97
- * Etienne Massip for reporting a serious bug in JavaScript scanner
98
85
  * matz and all Ruby gods and gurus
99
86
  * The inventors of: the computer, the internet, the true color display, HTML &
100
87
  CSS, VIM, Ruby, pizza, microwaves, guitars, scouting, programming, anime,
@@ -124,6 +111,8 @@ Where would we be without all those people?
124
111
  less useless
125
112
  * Term::ANSIColor[http://term-ansicolor.rubyforge.org/]
126
113
  * PLEAC[http://pleac.sourceforge.net/] code examples
114
+ * Github
115
+ * Travis CI (http://travis-ci.org/rubychan/github)
127
116
 
128
117
  === Free
129
118
 
data/Rakefile CHANGED
@@ -1,8 +1,7 @@
1
- require 'rake/rdoctask'
1
+ $:.unshift File.dirname(__FILE__) unless $:.include? '.'
2
2
 
3
3
  ROOT = '.'
4
4
  LIB_ROOT = File.join ROOT, 'lib'
5
- EXTRA_RDOC_FILES = %w(lib/README FOLDERS)
6
5
 
7
6
  task :default => :test
8
7
 
@@ -15,20 +14,21 @@ if File.directory? 'rake_tasks'
15
14
 
16
15
  else
17
16
 
18
- # fallback tasks when rake_tasks folder is not present
17
+ # fallback tasks when rake_tasks folder is not present (eg. in the distribution package)
19
18
  desc 'Run CodeRay tests (basic)'
20
19
  task :test do
21
20
  ruby './test/functional/suite.rb'
22
21
  ruby './test/functional/for_redcloth.rb'
23
22
  end
24
23
 
24
+ gem 'rdoc' if defined? gem
25
+ require 'rdoc/task'
25
26
  desc 'Generate documentation for CodeRay'
26
27
  Rake::RDocTask.new :doc do |rd|
27
28
  rd.title = 'CodeRay Documentation'
28
- rd.main = 'lib/README'
29
+ rd.main = 'README_INDEX.rdoc'
29
30
  rd.rdoc_files.add Dir['lib']
30
- rd.rdoc_files.add 'lib/README'
31
- rd.rdoc_files.add 'FOLDERS'
31
+ rd.rdoc_files.add rd.main
32
32
  rd.rdoc_dir = 'doc'
33
33
  end
34
34
 
@@ -1,86 +1,215 @@
1
1
  #!/usr/bin/env ruby
2
- # CodeRay Executable
3
- #
4
- # Version: 0.2
5
- # Author: murphy
6
-
7
2
  require 'coderay'
8
3
 
9
- if ARGV.empty?
10
- $stderr.puts <<-USAGE
11
- CodeRay #{CodeRay::VERSION} (http://coderay.rubychan.de)
4
+ $options, args = ARGV.partition { |arg| arg[/^-[hv]$|--\w+/] }
5
+ subcommand = args.first if /^\w/ === args.first
6
+ subcommand = nil if subcommand && File.exist?(subcommand)
7
+ args.delete subcommand
12
8
 
13
- Usage:
14
- coderay file [-<format>]
15
- coderay -<lang> [-<format>] [< file] [> output]
9
+ def option? *options
10
+ !($options & options).empty?
11
+ end
16
12
 
17
- Defaults:
18
- lang: based on file extension
19
- format: ANSI colorized output for terminal, HTML page for files
13
+ def tty?
14
+ $stdout.tty? || option?('--tty')
15
+ end
20
16
 
21
- Examples:
22
- coderay foo.rb # colorized output to terminal, based on file extension
23
- coderay foo.rb -loc # print LOC count, based on file extension and format
24
- coderay foo.rb > foo.html # HTML page output to file, based on extension
25
- coderay -ruby < foo.rb # colorized output to terminal, based on lang
26
- coderay -ruby -loc < foo.rb # print LOC count, based on lang
27
- coderay -ruby -page foo.rb # HTML page output to terminal, based on lang and format
28
- coderay -ruby -page foo.rb > foo.html # HTML page output to file, based on lang and format
17
+ def version
18
+ puts <<-USAGE
19
+ CodeRay #{CodeRay::VERSION}
29
20
  USAGE
30
21
  end
31
22
 
32
- first, second = ARGV
23
+ def help
24
+ puts <<-HELP
25
+ This is CodeRay #{CodeRay::VERSION}, a syntax highlighting tool for selected languages.
33
26
 
34
- def read
35
- file = ARGV.grep(/^(?!-)/).last
36
- if file
37
- if File.exist?(file)
38
- File.read file
39
- else
40
- $stderr.puts "No such file: #{file}"
41
- end
42
- else
43
- $stdin.read
44
- end
27
+ usage:
28
+ coderay [-language] [input] [-format] [output]
29
+
30
+ defaults:
31
+ language detect from input file name or shebang; fall back to plain text
32
+ input STDIN
33
+ format detect from output file name or use terminal; fall back to HTML
34
+ output STDOUT
35
+
36
+ common:
37
+ coderay file.rb # highlight file to terminal
38
+ coderay file.rb > file.html # highlight file to HTML page
39
+ coderay file.rb -div > file.html # highlight file to HTML snippet
40
+
41
+ configure output:
42
+ coderay file.py output.json # output tokens as JSON
43
+ coderay file.py -loc # count lines of code in Python file
44
+
45
+ configure input:
46
+ coderay -python file # specify the input language
47
+ coderay -ruby # take input from STDIN
48
+
49
+ more:
50
+ coderay stylesheet [style] # print CSS stylesheet
51
+ HELP
45
52
  end
46
53
 
47
- if first
48
- if first[/-(\w+)/] == first
49
- lang = $1
50
- input = read
51
- tokens = :scan
52
- else
53
- file = first
54
- unless File.exist? file
55
- $stderr.puts "No such file: #{file}"
56
- exit 2
54
+ def commands
55
+ puts <<-COMMANDS
56
+ general:
57
+ highlight code highlighting (default command, optional)
58
+ stylesheet print the CSS stylesheet with the given name (aliases: style, css)
59
+
60
+ about:
61
+ list [of] list all available plugins (or just the scanners|encoders|styles|filetypes)
62
+ commands print this list
63
+ help show some help
64
+ version print CodeRay version
65
+ COMMANDS
66
+ end
67
+
68
+ def print_list_of plugin_host
69
+ plugins = plugin_host.all_plugins.map do |plugin|
70
+ info = " #{plugin.plugin_id}: #{plugin.title}"
71
+
72
+ aliases = (plugin.aliases - [:default]).map { |key| "-#{key}" }.sort_by { |key| key.size }
73
+ if plugin.respond_to?(:file_extension) || !aliases.empty?
74
+ additional_info = []
75
+ additional_info << aliases.join(', ') unless aliases.empty?
76
+ info << " (#{additional_info.join('; ')})"
57
77
  end
58
- tokens = CodeRay.scan_file file
78
+
79
+ info << ' <-- default' if plugin.aliases.include? :default
80
+
81
+ info
59
82
  end
60
- else
61
- $stderr.puts 'No lang/file given.'
62
- exit 1
83
+ puts plugins.sort
84
+ end
85
+
86
+ if option? '-v', '--version'
87
+ version
88
+ end
89
+
90
+ if option? '-h', '--help'
91
+ help
63
92
  end
64
93
 
65
- if second
66
- if second[/-(\w+)/] == second
67
- format = $1.to_sym
94
+ case subcommand
95
+ when 'highlight', nil
96
+ if ARGV.empty?
97
+ version
98
+ help
68
99
  else
69
- raise 'invalid format (must be -xxx)'
100
+ signature = args.map { |arg| arg[/^-/] ? '-' : 'f' }.join
101
+ names = args.map { |arg| arg.sub(/^-/, '') }
102
+ case signature
103
+ when /^$/
104
+ exit
105
+ when /^ff?$/
106
+ input_file, output_file, = *names
107
+ when /^f-f?$/
108
+ input_file, output_format, output_file, = *names
109
+ when /^-ff?$/
110
+ input_lang, input_file, output_file, = *names
111
+ when /^-f-f?$/
112
+ input_lang, input_file, output_format, output_file, = *names
113
+ when /^--?f?$/
114
+ input_lang, output_format, output_file, = *names
115
+ else
116
+ $stdout = $stderr
117
+ help
118
+ puts
119
+ puts "Unknown parameter order: #{args.join ' '}, expected: [-language] [input] [-format] [output]"
120
+ exit 1
121
+ end
122
+
123
+ if input_file
124
+ input_lang ||= CodeRay::FileType.fetch input_file, :text, true
125
+ end
126
+
127
+ if output_file
128
+ output_format ||= CodeRay::FileType[output_file]
129
+ else
130
+ output_format ||= :terminal
131
+ end
132
+
133
+ output_format = :page if output_format.to_s == 'html'
134
+
135
+ if input_file
136
+ input = File.read input_file
137
+ else
138
+ input = $stdin.read
139
+ end
140
+
141
+ begin
142
+ file =
143
+ if output_file
144
+ File.open output_file, 'w'
145
+ else
146
+ $stdout.sync = true
147
+ $stdout
148
+ end
149
+ CodeRay.encode(input, input_lang, output_format, :out => file)
150
+ file.puts
151
+ rescue CodeRay::PluginHost::PluginNotFound => boom
152
+ $stdout = $stderr
153
+ if boom.message[/CodeRay::(\w+)s could not load plugin :?(.*?): /]
154
+ puts "I don't know the #$1 \"#$2\"."
155
+ else
156
+ puts boom.message
157
+ end
158
+ # puts "I don't know this plugin: #{boom.message[/Could not load plugin (.*?): /, 1]}."
159
+ rescue CodeRay::Scanners::Scanner::ScanError # FIXME: rescue Errno::EPIPE
160
+ # this is sometimes raised by pagers; ignore [TODO: wtf?]
161
+ ensure
162
+ file.close if output_file
163
+ end
164
+ end
165
+ when 'li', 'list'
166
+ arg = args.first && args.first.downcase
167
+ if [nil, 's', 'sc', 'scanner', 'scanners'].include? arg
168
+ puts 'input languages (Scanners):'
169
+ print_list_of CodeRay::Scanners
170
+ end
171
+
172
+ if [nil, 'e', 'en', 'enc', 'encoder', 'encoders'].include? arg
173
+ puts 'output formats (Encoders):'
174
+ print_list_of CodeRay::Encoders
70
175
  end
176
+
177
+ if [nil, 'st', 'style', 'styles'].include? arg
178
+ puts 'CSS themes for HTML output (Styles):'
179
+ print_list_of CodeRay::Styles
180
+ end
181
+
182
+ if [nil, 'f', 'ft', 'file', 'filetype', 'filetypes'].include? arg
183
+ puts 'recognized file types:'
184
+
185
+ filetypes = Hash.new { |h, k| h[k] = [] }
186
+ CodeRay::FileType::TypeFromExt.inject filetypes do |types, (ext, type)|
187
+ types[type.to_s] << ".#{ext}"
188
+ types
189
+ end
190
+ CodeRay::FileType::TypeFromName.inject filetypes do |types, (name, type)|
191
+ types[type.to_s] << name
192
+ types
193
+ end
194
+
195
+ filetypes.sort.each do |type, exts|
196
+ puts " #{type}: #{exts.sort_by { |ext| ext.size }.join(', ')}"
197
+ end
198
+ end
199
+ when 'stylesheet', 'style', 'css'
200
+ puts CodeRay::Encoders[:html]::CSS.new(args.first).stylesheet
201
+ when 'commands'
202
+ commands
203
+ when 'help'
204
+ help
71
205
  else
72
- if $stdout.tty?
73
- format = :term
206
+ $stdout = $stderr
207
+ help
208
+ puts
209
+ if subcommand[/\A\w+\z/]
210
+ puts "Unknown command: #{subcommand}"
74
211
  else
75
- $stderr.puts 'No format given; setting to default (HTML Page).'
76
- format = :page
212
+ puts "File not found: #{subcommand}"
77
213
  end
214
+ exit 1
78
215
  end
79
-
80
- if tokens == :scan
81
- output = CodeRay::Duo[lang => format].highlight input
82
- else
83
- output = tokens.encode format
84
- end
85
- out = $stdout
86
- out.puts output
@@ -1,16 +1,21 @@
1
+ # encoding: utf-8
2
+ # Encoding.default_internal = 'UTF-8'
3
+
1
4
  # = CodeRay Library
2
5
  #
3
6
  # CodeRay is a Ruby library for syntax highlighting.
4
7
  #
5
- # I try to make CodeRay easy to use and intuitive, but at the same time fully featured, complete,
6
- # fast and efficient.
8
+ # I try to make CodeRay easy to use and intuitive, but at the same time fully
9
+ # featured, complete, fast and efficient.
7
10
  #
8
11
  # See README.
9
12
  #
10
13
  # It consists mainly of
11
- # * the main engine: CodeRay (Scanners::Scanner, Tokens/TokenStream, Encoders::Encoder), PluginHost
14
+ # * the main engine: CodeRay (Scanners::Scanner, Tokens, Encoders::Encoder)
15
+ # * the plugin system: PluginHost, Plugin
12
16
  # * the scanners in CodeRay::Scanners
13
17
  # * the encoders in CodeRay::Encoders
18
+ # * the styles in CodeRay::Styles
14
19
  #
15
20
  # Here's a fancy graphic to light up this gray docu:
16
21
  #
@@ -22,8 +27,8 @@
22
27
  #
23
28
  # == Usage
24
29
  #
25
- # Remember you need RubyGems to use CodeRay, unless you have it in your load path. Run Ruby with
26
- # -rubygems option if required.
30
+ # Remember you need RubyGems to use CodeRay, unless you have it in your load
31
+ # path. Run Ruby with -rubygems option if required.
27
32
  #
28
33
  # === Highlight Ruby code in a string as html
29
34
  #
@@ -98,13 +103,6 @@
98
103
  # CodeRay.encode_tokens:: Encode the given tokens.
99
104
  # CodeRay.encode_file:: Scan a file, guess the language using FileType and encode it.
100
105
  #
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
106
  # == All-in-One Encoding
109
107
  #
110
108
  # CodeRay.encode:: Highlight a string with a given input and output format.
@@ -129,23 +127,30 @@ module CodeRay
129
127
 
130
128
  $CODERAY_DEBUG ||= false
131
129
 
132
- # Version: Major.Minor.Teeny[.Revision]
133
- # Major: 0 for pre-stable, 1 for stable
134
- # Minor: feature milestone
135
- # Teeny: development state, 0 for pre-release
136
- # Revision: Subversion Revision number (generated on rake gem:make)
137
- VERSION = '0.9.8'
138
-
139
- require 'coderay/tokens'
140
- require 'coderay/token_classes'
141
- require 'coderay/scanner'
142
- require 'coderay/encoder'
143
- require 'coderay/duo'
144
- require 'coderay/style'
145
-
146
-
130
+ require 'coderay/version'
131
+
132
+ # helpers
133
+ autoload :FileType, 'coderay/helpers/file_type'
134
+
135
+ # Tokens
136
+ autoload :Tokens, 'coderay/tokens'
137
+ autoload :TokensProxy, 'coderay/tokens_proxy'
138
+ autoload :TokenKinds, 'coderay/token_kinds'
139
+
140
+ # Plugin system
141
+ autoload :PluginHost, 'coderay/helpers/plugin'
142
+ autoload :Plugin, 'coderay/helpers/plugin'
143
+
144
+ # Plugins
145
+ autoload :Scanners, 'coderay/scanner'
146
+ autoload :Encoders, 'coderay/encoder'
147
+ autoload :Styles, 'coderay/style'
148
+
149
+ # Convenience access and reusable Encoder/Scanner pair
150
+ autoload :Duo, 'coderay/duo'
151
+
147
152
  class << self
148
-
153
+
149
154
  # Scans the given +code+ (a String) with the Scanner for +lang+.
150
155
  #
151
156
  # This is a simple way to use CodeRay. Example:
@@ -154,15 +159,15 @@ module CodeRay
154
159
  #
155
160
  # See also demo/demo_simple.
156
161
  def scan code, lang, options = {}, &block
157
- scanner = Scanners[lang].new code, options, &block
158
- scanner.tokenize
162
+ # FIXME: return a proxy for direct-stream encoding
163
+ TokensProxy.new code, lang, options, block
159
164
  end
160
-
165
+
161
166
  # Scans +filename+ (a path to a code file) with the Scanner for +lang+.
162
167
  #
163
168
  # If +lang+ is :auto or omitted, the CodeRay::FileType module is used to
164
169
  # determine it. If it cannot find out what type it is, it uses
165
- # CodeRay::Scanners::Plaintext.
170
+ # CodeRay::Scanners::Text.
166
171
  #
167
172
  # Calls CodeRay.scan.
168
173
  #
@@ -170,56 +175,22 @@ module CodeRay
170
175
  # require 'coderay'
171
176
  # page = CodeRay.scan_file('some_c_code.c').html
172
177
  def scan_file filename, lang = :auto, options = {}, &block
173
- file = IO.read filename
174
- if lang == :auto
175
- require 'coderay/helpers/file_type'
176
- lang = FileType.fetch filename, :plaintext, true
177
- end
178
- scan file, lang, options = {}, &block
179
- end
180
-
181
- # Scan the +code+ (a string) with the scanner for +lang+.
182
- #
183
- # Calls scan.
184
- #
185
- # See CodeRay.scan.
186
- def scan_stream code, lang, options = {}, &block
187
- options[:stream] = true
178
+ lang = FileType.fetch filename, :text, true if lang == :auto
179
+ code = File.read filename
188
180
  scan code, lang, options, &block
189
181
  end
190
-
191
- # Encode a string in Streaming mode.
192
- #
193
- # This starts scanning +code+ with the the Scanner for +lang+
194
- # while encodes the output with the Encoder for +format+.
195
- # +options+ will be passed to the Encoder.
196
- #
197
- # See CodeRay::Encoder.encode_stream
198
- def encode_stream code, lang, format, options = {}
199
- encoder(format, options).encode_stream code, lang, options
200
- end
201
-
182
+
202
183
  # Encode a string.
203
184
  #
204
185
  # This scans +code+ with the the Scanner for +lang+ and then
205
186
  # encodes it with the Encoder for +format+.
206
187
  # +options+ will be passed to the Encoder.
207
188
  #
208
- # See CodeRay::Encoder.encode
189
+ # See CodeRay::Encoder.encode.
209
190
  def encode code, lang, format, options = {}
210
191
  encoder(format, options).encode code, lang, options
211
192
  end
212
-
213
- # Highlight a string into a HTML <div>.
214
- #
215
- # CSS styles use classes, so you have to include a stylesheet
216
- # in your output.
217
- #
218
- # See encode.
219
- def highlight code, lang, options = { :css => :class }, format = :div
220
- encode code, lang, format, options
221
- end
222
-
193
+
223
194
  # Encode pre-scanned Tokens.
224
195
  # Use this together with CodeRay.scan:
225
196
  #
@@ -232,7 +203,7 @@ module CodeRay
232
203
  def encode_tokens tokens, format, options = {}
233
204
  encoder(format, options).encode_tokens tokens, options
234
205
  end
235
-
206
+
236
207
  # Encodes +filename+ (a path to a code file) with the Scanner for +lang+.
237
208
  #
238
209
  # See CodeRay.scan_file.
@@ -245,7 +216,17 @@ module CodeRay
245
216
  tokens = scan_file filename, :auto, get_scanner_options(options)
246
217
  encode_tokens tokens, format, options
247
218
  end
248
-
219
+
220
+ # Highlight a string into a HTML <div>.
221
+ #
222
+ # CSS styles use classes, so you have to include a stylesheet
223
+ # in your output.
224
+ #
225
+ # See encode.
226
+ def highlight code, lang, options = { :css => :class }, format = :div
227
+ encode code, lang, format, options
228
+ end
229
+
249
230
  # Highlight a file into a HTML <div>.
250
231
  #
251
232
  # CSS styles use classes, so you have to include a stylesheet
@@ -255,7 +236,7 @@ module CodeRay
255
236
  def highlight_file filename, options = { :css => :class }, format = :div
256
237
  encode_file filename, format, options
257
238
  end
258
-
239
+
259
240
  # Finds the Encoder class for +format+ and creates an instance, passing
260
241
  # +options+ to it.
261
242
  #
@@ -273,15 +254,15 @@ module CodeRay
273
254
  def encoder format, options = {}
274
255
  Encoders[format].new options
275
256
  end
276
-
257
+
277
258
  # Finds the Scanner class for +lang+ and creates an instance, passing
278
259
  # +options+ to it.
279
260
  #
280
261
  # See Scanner.new.
281
- def scanner lang, options = {}
282
- Scanners[lang].new '', options
262
+ def scanner lang, options = {}, &block
263
+ Scanners[lang].new '', options, &block
283
264
  end
284
-
265
+
285
266
  # Extract the options for the scanner from the +options+ hash.
286
267
  #
287
268
  # Returns an empty Hash if <tt>:scanner_options</tt> is not set.
@@ -291,32 +272,7 @@ module CodeRay
291
272
  def get_scanner_options options
292
273
  options.fetch :scanner_options, {}
293
274
  end
294
-
275
+
295
276
  end
296
-
297
- # This Exception is raised when you try to stream with something that is not
298
- # capable of streaming.
299
- class NotStreamableError < Exception
300
- def initialize obj
301
- @obj = obj
302
- end
303
-
304
- def to_s
305
- '%s is not Streamable!' % @obj.class
306
- end
307
- end
308
-
309
- # A dummy module that is included by subclasses of CodeRay::Scanner an CodeRay::Encoder
310
- # to show that they are able to handle streams.
311
- module Streamable
312
- end
313
-
314
- end
315
-
316
- # Run a test script.
317
- if $0 == __FILE__
318
- $stderr.print 'Press key to print demo.'; gets
319
- # Just use this file as an example of Ruby code.
320
- code = File.read(__FILE__)[/module CodeRay.*/m]
321
- print CodeRay.scan(code, :ruby).html
277
+
322
278
  end