coderay 0.9.8 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/{lib/README → README_INDEX.rdoc} +10 -21
- data/Rakefile +6 -6
- data/bin/coderay +193 -64
- data/lib/coderay.rb +61 -105
- data/lib/coderay/duo.rb +17 -21
- data/lib/coderay/encoder.rb +100 -112
- data/lib/coderay/encoders/_map.rb +12 -7
- data/lib/coderay/encoders/comment_filter.rb +12 -30
- data/lib/coderay/encoders/count.rb +29 -11
- data/lib/coderay/encoders/debug.rb +32 -20
- data/lib/coderay/encoders/div.rb +13 -9
- data/lib/coderay/encoders/filter.rb +34 -51
- data/lib/coderay/encoders/html.rb +155 -161
- data/lib/coderay/encoders/html/css.rb +4 -9
- data/lib/coderay/encoders/html/numbering.rb +115 -0
- data/lib/coderay/encoders/html/output.rb +22 -70
- data/lib/coderay/encoders/json.rb +59 -45
- data/lib/coderay/encoders/lines_of_code.rb +12 -57
- data/lib/coderay/encoders/null.rb +6 -14
- data/lib/coderay/encoders/page.rb +13 -9
- data/lib/coderay/encoders/span.rb +13 -9
- data/lib/coderay/encoders/statistic.rb +58 -39
- data/lib/coderay/encoders/terminal.rb +179 -0
- data/lib/coderay/encoders/text.rb +31 -17
- data/lib/coderay/encoders/token_kind_filter.rb +111 -0
- data/lib/coderay/encoders/xml.rb +19 -18
- data/lib/coderay/encoders/yaml.rb +37 -9
- data/lib/coderay/for_redcloth.rb +4 -4
- data/lib/coderay/helpers/file_type.rb +127 -246
- data/lib/coderay/helpers/gzip.rb +41 -0
- data/lib/coderay/helpers/plugin.rb +241 -306
- data/lib/coderay/helpers/word_list.rb +65 -126
- data/lib/coderay/scanner.rb +173 -156
- data/lib/coderay/scanners/_map.rb +18 -17
- data/lib/coderay/scanners/c.rb +63 -77
- data/lib/coderay/scanners/clojure.rb +217 -0
- data/lib/coderay/scanners/cpp.rb +71 -84
- data/lib/coderay/scanners/css.rb +103 -120
- data/lib/coderay/scanners/debug.rb +47 -44
- data/lib/coderay/scanners/delphi.rb +70 -76
- data/lib/coderay/scanners/diff.rb +141 -50
- data/lib/coderay/scanners/erb.rb +81 -0
- data/lib/coderay/scanners/groovy.rb +104 -113
- data/lib/coderay/scanners/haml.rb +168 -0
- data/lib/coderay/scanners/html.rb +181 -110
- data/lib/coderay/scanners/java.rb +73 -75
- data/lib/coderay/scanners/java/builtin_types.rb +2 -0
- data/lib/coderay/scanners/java_script.rb +90 -101
- data/lib/coderay/scanners/json.rb +40 -53
- data/lib/coderay/scanners/php.rb +123 -147
- data/lib/coderay/scanners/python.rb +93 -91
- data/lib/coderay/scanners/raydebug.rb +66 -0
- data/lib/coderay/scanners/ruby.rb +343 -326
- data/lib/coderay/scanners/ruby/patterns.rb +40 -106
- data/lib/coderay/scanners/ruby/string_state.rb +71 -0
- data/lib/coderay/scanners/sql.rb +80 -66
- data/lib/coderay/scanners/text.rb +26 -0
- data/lib/coderay/scanners/xml.rb +1 -1
- data/lib/coderay/scanners/yaml.rb +74 -73
- data/lib/coderay/style.rb +10 -7
- data/lib/coderay/styles/_map.rb +3 -3
- data/lib/coderay/styles/alpha.rb +143 -0
- data/lib/coderay/token_kinds.rb +90 -0
- data/lib/coderay/tokens.rb +102 -277
- data/lib/coderay/tokens_proxy.rb +55 -0
- data/lib/coderay/version.rb +3 -0
- data/test/functional/basic.rb +200 -18
- data/test/functional/examples.rb +130 -0
- data/test/functional/for_redcloth.rb +15 -8
- data/test/functional/suite.rb +9 -6
- metadata +103 -123
- data/FOLDERS +0 -53
- data/bin/coderay_stylesheet +0 -4
- data/lib/coderay/encoders/html/numerization.rb +0 -133
- data/lib/coderay/encoders/term.rb +0 -158
- data/lib/coderay/encoders/token_class_filter.rb +0 -84
- data/lib/coderay/helpers/gzip_simple.rb +0 -123
- data/lib/coderay/scanners/nitro_xhtml.rb +0 -136
- data/lib/coderay/scanners/plaintext.rb +0 -20
- data/lib/coderay/scanners/rhtml.rb +0 -78
- data/lib/coderay/scanners/scheme.rb +0 -145
- data/lib/coderay/styles/cycnus.rb +0 -152
- data/lib/coderay/styles/murphy.rb +0 -134
- data/lib/coderay/token_classes.rb +0 -86
- data/test/functional/load_plugin_scanner.rb +0 -11
- data/test/functional/vhdl.rb +0 -126
- data/test/functional/word_list.rb +0 -79
@@ -0,0 +1,55 @@
|
|
1
|
+
module CodeRay
|
2
|
+
|
3
|
+
# The result of a scan operation is a TokensProxy, but should act like Tokens.
|
4
|
+
#
|
5
|
+
# This proxy makes it possible to use the classic CodeRay.scan.encode API
|
6
|
+
# while still providing the benefits of direct streaming.
|
7
|
+
class TokensProxy
|
8
|
+
|
9
|
+
attr_accessor :input, :lang, :options, :block
|
10
|
+
|
11
|
+
# Create a new TokensProxy with the arguments of CodeRay.scan.
|
12
|
+
def initialize input, lang, options = {}, block = nil
|
13
|
+
@input = input
|
14
|
+
@lang = lang
|
15
|
+
@options = options
|
16
|
+
@block = block
|
17
|
+
end
|
18
|
+
|
19
|
+
# Call CodeRay.encode if +encoder+ is a Symbol;
|
20
|
+
# otherwise, convert the receiver to tokens and call encoder.encode_tokens.
|
21
|
+
def encode encoder, options = {}
|
22
|
+
if encoder.respond_to? :to_sym
|
23
|
+
CodeRay.encode(input, lang, encoder, options)
|
24
|
+
else
|
25
|
+
encoder.encode_tokens tokens, options
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Tries to call encode;
|
30
|
+
# delegates to tokens otherwise.
|
31
|
+
def method_missing method, *args, &blk
|
32
|
+
encode method.to_sym, *args
|
33
|
+
rescue PluginHost::PluginNotFound
|
34
|
+
tokens.send(method, *args, &blk)
|
35
|
+
end
|
36
|
+
|
37
|
+
# The (cached) result of the tokenized input; a Tokens instance.
|
38
|
+
def tokens
|
39
|
+
@tokens ||= scanner.tokenize(input)
|
40
|
+
end
|
41
|
+
|
42
|
+
# A (cached) scanner instance to use for the scan task.
|
43
|
+
def scanner
|
44
|
+
@scanner ||= CodeRay.scanner(lang, options, &block)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Overwrite Struct#each.
|
48
|
+
def each *args, &blk
|
49
|
+
tokens.each(*args, &blk)
|
50
|
+
self
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
data/test/functional/basic.rb
CHANGED
@@ -1,11 +1,15 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
require 'test/unit'
|
3
|
+
require File.expand_path('../../lib/assert_warning', __FILE__)
|
4
|
+
|
5
|
+
$:.unshift File.expand_path('../../../lib', __FILE__)
|
2
6
|
require 'coderay'
|
3
7
|
|
4
8
|
class BasicTest < Test::Unit::TestCase
|
5
9
|
|
6
10
|
def test_version
|
7
11
|
assert_nothing_raised do
|
8
|
-
assert_match(/\A\d\.\d\.\d
|
12
|
+
assert_match(/\A\d\.\d\.\d?\z/, CodeRay::VERSION)
|
9
13
|
end
|
10
14
|
end
|
11
15
|
|
@@ -14,36 +18,60 @@ class BasicTest < Test::Unit::TestCase
|
|
14
18
|
RUBY_TEST_TOKENS = [
|
15
19
|
['puts', :ident],
|
16
20
|
[' ', :space],
|
17
|
-
[:
|
21
|
+
[:begin_group, :string],
|
18
22
|
['"', :delimiter],
|
19
23
|
['Hello, World!', :content],
|
20
24
|
['"', :delimiter],
|
21
|
-
[:
|
22
|
-
]
|
25
|
+
[:end_group, :string]
|
26
|
+
].flatten
|
23
27
|
def test_simple_scan
|
24
28
|
assert_nothing_raised do
|
25
|
-
assert_equal RUBY_TEST_TOKENS, CodeRay.scan(RUBY_TEST_CODE, :ruby).
|
29
|
+
assert_equal RUBY_TEST_TOKENS, CodeRay.scan(RUBY_TEST_CODE, :ruby).tokens
|
26
30
|
end
|
27
31
|
end
|
28
32
|
|
29
|
-
RUBY_TEST_HTML = 'puts <span class="
|
30
|
-
'<span class="
|
33
|
+
RUBY_TEST_HTML = 'puts <span class="string"><span class="delimiter">"</span>' +
|
34
|
+
'<span class="content">Hello, World!</span><span class="delimiter">"</span></span>'
|
31
35
|
def test_simple_highlight
|
32
36
|
assert_nothing_raised do
|
33
37
|
assert_equal RUBY_TEST_HTML, CodeRay.scan(RUBY_TEST_CODE, :ruby).html
|
34
38
|
end
|
35
39
|
end
|
36
40
|
|
41
|
+
def test_scan_file
|
42
|
+
CodeRay.scan_file __FILE__
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_encode
|
46
|
+
assert_equal 1, CodeRay.encode('test', :python, :count)
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_encode_tokens
|
50
|
+
assert_equal 1, CodeRay.encode_tokens(CodeRay::Tokens['test', :string], :count)
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_encode_file
|
54
|
+
assert_equal File.read(__FILE__), CodeRay.encode_file(__FILE__, :text)
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_highlight
|
58
|
+
assert_match '<pre>test</pre>', CodeRay.highlight('test', :python)
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_highlight_file
|
62
|
+
assert_match "require <span class=\"string\"><span class=\"delimiter\">'</span><span class=\"content\">test/unit</span><span class=\"delimiter\">'</span></span>\n", CodeRay.highlight_file(__FILE__)
|
63
|
+
end
|
64
|
+
|
37
65
|
def test_duo
|
38
66
|
assert_equal(RUBY_TEST_CODE,
|
39
|
-
CodeRay::Duo[:plain, :
|
67
|
+
CodeRay::Duo[:plain, :text].highlight(RUBY_TEST_CODE))
|
40
68
|
assert_equal(RUBY_TEST_CODE,
|
41
|
-
CodeRay::Duo[:plain => :
|
69
|
+
CodeRay::Duo[:plain => :text].highlight(RUBY_TEST_CODE))
|
42
70
|
end
|
43
71
|
|
44
72
|
def test_duo_stream
|
45
73
|
assert_equal(RUBY_TEST_CODE,
|
46
|
-
CodeRay::Duo[:plain, :
|
74
|
+
CodeRay::Duo[:plain, :text].highlight(RUBY_TEST_CODE, :stream => true))
|
47
75
|
end
|
48
76
|
|
49
77
|
def test_comment_filter
|
@@ -98,25 +126,179 @@ more code # and another comment, in-line.
|
|
98
126
|
assert_equal 0, CodeRay.scan(rHTML, :html).lines_of_code
|
99
127
|
assert_equal 0, CodeRay.scan(rHTML, :php).lines_of_code
|
100
128
|
assert_equal 0, CodeRay.scan(rHTML, :yaml).lines_of_code
|
101
|
-
assert_equal 4, CodeRay.scan(rHTML, :
|
129
|
+
assert_equal 4, CodeRay.scan(rHTML, :erb).lines_of_code
|
102
130
|
end
|
103
131
|
|
104
|
-
def test_rubygems_not_loaded
|
105
|
-
assert_equal nil, defined? Gem
|
106
|
-
end if ENV['check_rubygems'] && RUBY_VERSION < '1.9'
|
107
|
-
|
108
132
|
def test_list_of_encoders
|
109
133
|
assert_kind_of(Array, CodeRay::Encoders.list)
|
110
|
-
assert CodeRay::Encoders.list.include?(
|
134
|
+
assert CodeRay::Encoders.list.include?(:count)
|
111
135
|
end
|
112
136
|
|
113
137
|
def test_list_of_scanners
|
114
138
|
assert_kind_of(Array, CodeRay::Scanners.list)
|
115
|
-
assert CodeRay::Scanners.list.include?(
|
139
|
+
assert CodeRay::Scanners.list.include?(:text)
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_token_kinds
|
143
|
+
assert_kind_of Hash, CodeRay::TokenKinds
|
144
|
+
for kind, css_class in CodeRay::TokenKinds
|
145
|
+
assert_kind_of Symbol, kind
|
146
|
+
if css_class != false
|
147
|
+
assert_kind_of String, css_class, "TokenKinds[%p] == %p" % [kind, css_class]
|
148
|
+
end
|
149
|
+
end
|
150
|
+
assert_equal 'reserved', CodeRay::TokenKinds[:reserved]
|
151
|
+
assert_warning 'Undefined Token kind: :shibboleet' do
|
152
|
+
assert_equal false, CodeRay::TokenKinds[:shibboleet]
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
class Milk < CodeRay::Encoders::Encoder
|
157
|
+
FILE_EXTENSION = 'cocoa'
|
158
|
+
end
|
159
|
+
|
160
|
+
class HoneyBee < CodeRay::Encoders::Encoder
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_encoder_file_extension
|
164
|
+
assert_nothing_raised do
|
165
|
+
assert_equal 'html', CodeRay::Encoders::Page::FILE_EXTENSION
|
166
|
+
assert_equal 'cocoa', Milk::FILE_EXTENSION
|
167
|
+
assert_equal 'cocoa', Milk.new.file_extension
|
168
|
+
assert_equal 'honeybee', HoneyBee::FILE_EXTENSION
|
169
|
+
assert_equal 'honeybee', HoneyBee.new.file_extension
|
170
|
+
end
|
171
|
+
assert_raise NameError do
|
172
|
+
HoneyBee::MISSING_CONSTANT
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_encoder_tokens
|
177
|
+
encoder = CodeRay::Encoders::Encoder.new
|
178
|
+
encoder.send :setup, {}
|
179
|
+
assert_raise(ArgumentError) { encoder.token :strange, '' }
|
180
|
+
encoder.token 'test', :debug
|
181
|
+
end
|
182
|
+
|
183
|
+
def test_encoder_deprecated_interface
|
184
|
+
encoder = CodeRay::Encoders::Encoder.new
|
185
|
+
encoder.send :setup, {}
|
186
|
+
assert_warning 'Using old Tokens#<< interface.' do
|
187
|
+
encoder << ['test', :content]
|
188
|
+
end
|
189
|
+
assert_raise ArgumentError do
|
190
|
+
encoder << [:strange, :input]
|
191
|
+
end
|
192
|
+
assert_raise ArgumentError do
|
193
|
+
encoder.encode_tokens [['test', :token]]
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def encoder_token_interface_deprecation_warning_given
|
198
|
+
CodeRay::Encoders::Encoder.send :class_variable_get, :@@CODERAY_TOKEN_INTERFACE_DEPRECATION_WARNING_GIVEN
|
199
|
+
end
|
200
|
+
|
201
|
+
def test_scanner_file_extension
|
202
|
+
assert_equal 'rb', CodeRay::Scanners::Ruby.file_extension
|
203
|
+
assert_equal 'rb', CodeRay::Scanners::Ruby.new.file_extension
|
204
|
+
assert_equal 'java', CodeRay::Scanners::Java.file_extension
|
205
|
+
assert_equal 'java', CodeRay::Scanners::Java.new.file_extension
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_scanner_lang
|
209
|
+
assert_equal :ruby, CodeRay::Scanners::Ruby.lang
|
210
|
+
assert_equal :ruby, CodeRay::Scanners::Ruby.new.lang
|
211
|
+
assert_equal :java, CodeRay::Scanners::Java.lang
|
212
|
+
assert_equal :java, CodeRay::Scanners::Java.new.lang
|
213
|
+
end
|
214
|
+
|
215
|
+
def test_scanner_tokenize
|
216
|
+
assert_equal ['foo', :plain], CodeRay::Scanners::Plain.new.tokenize('foo')
|
217
|
+
assert_equal [['foo', :plain], ['bar', :plain]], CodeRay::Scanners::Plain.new.tokenize(['foo', 'bar'])
|
218
|
+
CodeRay::Scanners::Plain.new.tokenize 42
|
219
|
+
end
|
220
|
+
|
221
|
+
def test_scanner_tokens
|
222
|
+
scanner = CodeRay::Scanners::Plain.new
|
223
|
+
scanner.tokenize('foo')
|
224
|
+
assert_equal ['foo', :plain], scanner.tokens
|
225
|
+
scanner.string = ''
|
226
|
+
assert_equal ['', :plain], scanner.tokens
|
227
|
+
end
|
228
|
+
|
229
|
+
def test_scanner_line_and_column
|
230
|
+
scanner = CodeRay::Scanners::Plain.new "foo\nbär+quux"
|
231
|
+
assert_equal 0, scanner.pos
|
232
|
+
assert_equal 1, scanner.line
|
233
|
+
assert_equal 1, scanner.column
|
234
|
+
scanner.scan(/foo/)
|
235
|
+
assert_equal 3, scanner.pos
|
236
|
+
assert_equal 1, scanner.line
|
237
|
+
assert_equal 4, scanner.column
|
238
|
+
scanner.scan(/\n/)
|
239
|
+
assert_equal 4, scanner.pos
|
240
|
+
assert_equal 2, scanner.line
|
241
|
+
assert_equal 1, scanner.column
|
242
|
+
scanner.scan(/b/)
|
243
|
+
assert_equal 5, scanner.pos
|
244
|
+
assert_equal 2, scanner.line
|
245
|
+
assert_equal 2, scanner.column
|
246
|
+
scanner.scan(/a/)
|
247
|
+
assert_equal 5, scanner.pos
|
248
|
+
assert_equal 2, scanner.line
|
249
|
+
assert_equal 2, scanner.column
|
250
|
+
scanner.scan(/ä/)
|
251
|
+
assert_equal 7, scanner.pos
|
252
|
+
assert_equal 2, scanner.line
|
253
|
+
assert_equal 4, scanner.column
|
254
|
+
scanner.scan(/r/)
|
255
|
+
assert_equal 8, scanner.pos
|
256
|
+
assert_equal 2, scanner.line
|
257
|
+
assert_equal 5, scanner.column
|
258
|
+
end
|
259
|
+
|
260
|
+
def test_scanner_use_subclasses
|
261
|
+
assert_raise NotImplementedError do
|
262
|
+
CodeRay::Scanners::Scanner.new
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
class InvalidScanner < CodeRay::Scanners::Scanner
|
267
|
+
end
|
268
|
+
|
269
|
+
def test_scanner_scan_tokens
|
270
|
+
assert_raise NotImplementedError do
|
271
|
+
InvalidScanner.new.tokenize ''
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
class RaisingScanner < CodeRay::Scanners::Scanner
|
276
|
+
def scan_tokens encoder, options
|
277
|
+
raise_inspect 'message', [], :initial
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
def test_scanner_raise_inspect
|
282
|
+
assert_raise CodeRay::Scanners::Scanner::ScanError do
|
283
|
+
RaisingScanner.new.tokenize ''
|
284
|
+
end
|
116
285
|
end
|
117
286
|
|
118
287
|
def test_scan_a_frozen_string
|
119
|
-
|
288
|
+
assert_nothing_raised do
|
289
|
+
CodeRay.scan RUBY_VERSION, :ruby
|
290
|
+
CodeRay.scan RUBY_VERSION, :plain
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
def test_scan_a_non_string
|
295
|
+
assert_nothing_raised do
|
296
|
+
CodeRay.scan 42, :ruby
|
297
|
+
CodeRay.scan nil, :ruby
|
298
|
+
CodeRay.scan self, :ruby
|
299
|
+
CodeRay.encode ENV.to_hash, :ruby, :page
|
300
|
+
CodeRay.highlight CodeRay, :plain
|
301
|
+
end
|
120
302
|
end
|
121
303
|
|
122
304
|
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
|
3
|
+
$:.unshift File.expand_path('../../../lib', __FILE__)
|
4
|
+
require 'coderay'
|
5
|
+
|
6
|
+
class ExamplesTest < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def test_examples
|
9
|
+
# output as HTML div (using inline CSS styles)
|
10
|
+
div = CodeRay.scan('puts "Hello, world!"', :ruby).div
|
11
|
+
assert_equal <<-DIV, div
|
12
|
+
<div class="CodeRay">
|
13
|
+
<div class="code"><pre>puts <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">"</span><span style="color:#D20">Hello, world!</span><span style="color:#710">"</span></span></pre></div>
|
14
|
+
</div>
|
15
|
+
DIV
|
16
|
+
|
17
|
+
# ...with line numbers
|
18
|
+
div = CodeRay.scan(<<-CODE.chomp, :ruby).div(:line_numbers => :table)
|
19
|
+
5.times do
|
20
|
+
puts 'Hello, world!'
|
21
|
+
end
|
22
|
+
CODE
|
23
|
+
assert_equal <<-DIV, div
|
24
|
+
<table class="CodeRay"><tr>
|
25
|
+
<td class="line-numbers" title="double click to toggle" ondblclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre><a href="#n1" name="n1">1</a>
|
26
|
+
<a href="#n2" name="n2">2</a>
|
27
|
+
<a href="#n3" name="n3">3</a>
|
28
|
+
</pre></td>
|
29
|
+
<td class="code"><pre><span style="color:#00D">5</span>.times <span style="color:#080;font-weight:bold">do</span>
|
30
|
+
puts <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">Hello, world!</span><span style="color:#710">'</span></span>
|
31
|
+
<span style="color:#080;font-weight:bold">end</span></pre></td>
|
32
|
+
</tr></table>
|
33
|
+
DIV
|
34
|
+
|
35
|
+
# output as standalone HTML page (using CSS classes)
|
36
|
+
page = CodeRay.scan('puts "Hello, world!"', :ruby).page
|
37
|
+
assert page[<<-PAGE]
|
38
|
+
<body style="background-color: white;">
|
39
|
+
|
40
|
+
<table class="CodeRay"><tr>
|
41
|
+
<td class="line-numbers" title="double click to toggle" ondblclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>
|
42
|
+
</pre></td>
|
43
|
+
<td class="code"><pre>puts <span class="string"><span class="delimiter">"</span><span class="content">Hello, world!</span><span class="delimiter">"</span></span></pre></td>
|
44
|
+
</tr></table>
|
45
|
+
|
46
|
+
</body>
|
47
|
+
PAGE
|
48
|
+
|
49
|
+
# keep scanned tokens for later use
|
50
|
+
tokens = CodeRay.scan('{ "just": "an", "example": 42 }', :json)
|
51
|
+
assert_kind_of CodeRay::TokensProxy, tokens
|
52
|
+
|
53
|
+
assert_equal ["{", :operator, " ", :space, :begin_group, :key,
|
54
|
+
"\"", :delimiter, "just", :content, "\"", :delimiter,
|
55
|
+
:end_group, :key, ":", :operator, " ", :space,
|
56
|
+
:begin_group, :string, "\"", :delimiter, "an", :content,
|
57
|
+
"\"", :delimiter, :end_group, :string, ",", :operator,
|
58
|
+
" ", :space, :begin_group, :key, "\"", :delimiter,
|
59
|
+
"example", :content, "\"", :delimiter, :end_group, :key,
|
60
|
+
":", :operator, " ", :space, "42", :integer,
|
61
|
+
" ", :space, "}", :operator], tokens.tokens
|
62
|
+
|
63
|
+
# produce a token statistic
|
64
|
+
assert_equal <<-STATISTIC, tokens.statistic
|
65
|
+
|
66
|
+
Code Statistics
|
67
|
+
|
68
|
+
Tokens 26
|
69
|
+
Non-Whitespace 15
|
70
|
+
Bytes Total 31
|
71
|
+
|
72
|
+
Token Types (7):
|
73
|
+
type count ratio size (average)
|
74
|
+
-------------------------------------------------------------
|
75
|
+
TOTAL 26 100.00 % 1.2
|
76
|
+
delimiter 6 23.08 % 1.0
|
77
|
+
operator 5 19.23 % 1.0
|
78
|
+
space 5 19.23 % 1.0
|
79
|
+
key 4 15.38 % 0.0
|
80
|
+
:begin_group 3 11.54 % 0.0
|
81
|
+
:end_group 3 11.54 % 0.0
|
82
|
+
content 3 11.54 % 4.3
|
83
|
+
string 2 7.69 % 0.0
|
84
|
+
integer 1 3.85 % 2.0
|
85
|
+
|
86
|
+
STATISTIC
|
87
|
+
|
88
|
+
# count the tokens
|
89
|
+
assert_equal 26, tokens.count
|
90
|
+
|
91
|
+
# produce a HTML div, but with CSS classes
|
92
|
+
div = tokens.div(:css => :class)
|
93
|
+
assert_equal <<-DIV, div
|
94
|
+
<div class="CodeRay">
|
95
|
+
<div class="code"><pre>{ <span class="key"><span class="delimiter">"</span><span class="content">just</span><span class="delimiter">"</span></span>: <span class="string"><span class="delimiter">"</span><span class="content">an</span><span class="delimiter">"</span></span>, <span class="key"><span class="delimiter">"</span><span class="content">example</span><span class="delimiter">"</span></span>: <span class="integer">42</span> }</pre></div>
|
96
|
+
</div>
|
97
|
+
DIV
|
98
|
+
|
99
|
+
# highlight a file (HTML div); guess the file type base on the extension
|
100
|
+
require 'coderay/helpers/file_type'
|
101
|
+
assert_equal :ruby, CodeRay::FileType[__FILE__]
|
102
|
+
|
103
|
+
# get a new scanner for Python
|
104
|
+
python_scanner = CodeRay.scanner :python
|
105
|
+
assert_kind_of CodeRay::Scanners::Python, python_scanner
|
106
|
+
|
107
|
+
# get a new encoder for terminal
|
108
|
+
terminal_encoder = CodeRay.encoder :term
|
109
|
+
assert_kind_of CodeRay::Encoders::Terminal, terminal_encoder
|
110
|
+
|
111
|
+
# scanning into tokens
|
112
|
+
tokens = python_scanner.tokenize 'import this; # The Zen of Python'
|
113
|
+
assert_equal ["import", :keyword, " ", :space, "this", :include,
|
114
|
+
";", :operator, " ", :space, "# The Zen of Python", :comment], tokens
|
115
|
+
|
116
|
+
# format the tokens
|
117
|
+
term = terminal_encoder.encode_tokens(tokens)
|
118
|
+
assert_equal "\e[1;31mimport\e[0m \e[33mthis\e[0m; \e[37m# The Zen of Python\e[0m", term
|
119
|
+
|
120
|
+
# re-using scanner and encoder
|
121
|
+
ruby_highlighter = CodeRay::Duo[:ruby, :div]
|
122
|
+
div = ruby_highlighter.encode('puts "Hello, world!"')
|
123
|
+
assert_equal <<-DIV, div
|
124
|
+
<div class="CodeRay">
|
125
|
+
<div class="code"><pre>puts <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">"</span><span style="color:#D20">Hello, world!</span><span style="color:#710">"</span></span></pre></div>
|
126
|
+
</div>
|
127
|
+
DIV
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|