coderay 1.0.0.800pre → 1.0.0.815pre
Sign up to get free protection for your applications and to get access to all the features.
- data/{README.rdoc → README_INDEX.rdoc} +2 -0
- data/Rakefile +3 -3
- data/bin/coderay +31 -9
- data/lib/coderay.rb +2 -1
- data/lib/coderay/encoder.rb +11 -1
- data/lib/coderay/encoders/_map.rb +0 -1
- data/lib/coderay/encoders/count.rb +9 -3
- data/lib/coderay/encoders/debug.rb +1 -1
- data/lib/coderay/encoders/filter.rb +12 -6
- data/lib/coderay/encoders/html.rb +11 -1
- data/lib/coderay/encoders/html/css.rb +1 -1
- data/lib/coderay/encoders/html/output.rb +0 -1
- data/lib/coderay/encoders/json.rb +20 -7
- data/lib/coderay/encoders/lines_of_code.rb +2 -1
- data/lib/coderay/encoders/statistic.rb +5 -6
- data/lib/coderay/encoders/text.rb +8 -5
- data/lib/coderay/encoders/token_kind_filter.rb +1 -0
- data/lib/coderay/encoders/xml.rb +5 -3
- data/lib/coderay/encoders/yaml.rb +13 -8
- data/lib/coderay/helpers/file_type.rb +4 -4
- data/lib/coderay/helpers/plugin.rb +7 -5
- data/lib/coderay/scanner.rb +30 -18
- data/lib/coderay/scanners/_map.rb +14 -13
- data/lib/coderay/scanners/clojure.rb +1 -1
- data/lib/coderay/scanners/css.rb +36 -27
- data/lib/coderay/scanners/{rhtml.rb → erb.rb} +3 -3
- data/lib/coderay/scanners/groovy.rb +1 -1
- data/lib/coderay/scanners/java_script.rb +1 -1
- data/lib/coderay/scanners/php.rb +2 -2
- data/lib/coderay/scanners/ruby.rb +11 -6
- data/lib/coderay/tokens.rb +1 -3
- data/test/functional/basic.rb +26 -19
- data/test/functional/examples.rb +2 -0
- data/test/functional/for_redcloth.rb +12 -6
- data/test/functional/suite.rb +2 -1
- metadata +26 -9
- data/lib/coderay/scanners/nitro_xhtml.rb +0 -136
- data/lib/coderay/scanners/scheme.rb +0 -136
@@ -90,7 +90,7 @@ module CodeRay
|
|
90
90
|
'h' => :c,
|
91
91
|
'htm' => :page,
|
92
92
|
'html' => :page,
|
93
|
-
'html.erb' => :
|
93
|
+
'html.erb' => :erb,
|
94
94
|
'java' => :java,
|
95
95
|
'js' => :java_script,
|
96
96
|
'json' => :json,
|
@@ -109,14 +109,14 @@ module CodeRay
|
|
109
109
|
'raydebug' => :raydebug,
|
110
110
|
'rb' => :ruby,
|
111
111
|
'rbw' => :ruby,
|
112
|
-
'rhtml' => :
|
112
|
+
'rhtml' => :erb,
|
113
113
|
'rjs' => :ruby,
|
114
114
|
'rpdf' => :ruby,
|
115
115
|
'ru' => :ruby,
|
116
116
|
'rxml' => :ruby,
|
117
|
-
'sch' => :scheme,
|
117
|
+
# 'sch' => :scheme,
|
118
118
|
'sql' => :sql,
|
119
|
-
'ss' => :scheme,
|
119
|
+
# 'ss' => :scheme,
|
120
120
|
'xhtml' => :page,
|
121
121
|
'xml' => :xml,
|
122
122
|
'yaml' => :yaml,
|
@@ -114,9 +114,10 @@ module CodeRay
|
|
114
114
|
def default id = nil
|
115
115
|
if id
|
116
116
|
id = validate_id id
|
117
|
-
|
117
|
+
raise "The default plugin can't be named \"default\"." if id == :default
|
118
|
+
plugin_hash[:default] = id
|
118
119
|
else
|
119
|
-
load
|
120
|
+
load :default
|
120
121
|
end
|
121
122
|
end
|
122
123
|
|
@@ -179,10 +180,11 @@ module CodeRay
|
|
179
180
|
require path
|
180
181
|
rescue LoadError => boom
|
181
182
|
if @plugin_map_loaded
|
182
|
-
if h.has_key?(
|
183
|
-
h[
|
183
|
+
if h.has_key?(:default)
|
184
|
+
warn '%p could not load plugin %p; falling back to %p' % [self, id, h[:default]]
|
185
|
+
h[:default]
|
184
186
|
else
|
185
|
-
raise PluginNotFound, '
|
187
|
+
raise PluginNotFound, '%p could not load plugin %p: %s' % [self, id, boom]
|
186
188
|
end
|
187
189
|
else
|
188
190
|
load_plugin_map
|
data/lib/coderay/scanner.rb
CHANGED
@@ -74,7 +74,7 @@ module CodeRay
|
|
74
74
|
if code.respond_to? :encoding
|
75
75
|
code = encode_with_encoding code, self.encoding
|
76
76
|
else
|
77
|
-
code = to_unix code
|
77
|
+
code = to_unix code
|
78
78
|
end
|
79
79
|
# code = code.dup if code.eql? original
|
80
80
|
code
|
@@ -100,7 +100,7 @@ module CodeRay
|
|
100
100
|
def encode_with_encoding code, target_encoding
|
101
101
|
if code.encoding == target_encoding
|
102
102
|
if code.valid_encoding?
|
103
|
-
return to_unix
|
103
|
+
return to_unix code
|
104
104
|
else
|
105
105
|
source_encoding = guess_encoding code
|
106
106
|
end
|
@@ -112,7 +112,7 @@ module CodeRay
|
|
112
112
|
end
|
113
113
|
|
114
114
|
def to_unix code
|
115
|
-
code.gsub(/\r\n?/, "\n")
|
115
|
+
code.index(?\r) ? code.gsub(/\r\n?/, "\n") : code
|
116
116
|
end
|
117
117
|
|
118
118
|
def guess_encoding s
|
@@ -221,27 +221,39 @@ module CodeRay
|
|
221
221
|
end
|
222
222
|
include Enumerable
|
223
223
|
|
224
|
-
# The current line position of the scanner
|
224
|
+
# The current line position of the scanner, starting with 1.
|
225
|
+
# See also: #column.
|
225
226
|
#
|
226
227
|
# Beware, this is implemented inefficiently. It should be used
|
227
228
|
# for debugging only.
|
228
|
-
def line
|
229
|
-
|
229
|
+
def line pos = self.pos
|
230
|
+
return 1 if pos <= 0
|
231
|
+
binary_string[0...pos].count("\n") + 1
|
230
232
|
end
|
231
233
|
|
232
|
-
# The current column position of the scanner
|
234
|
+
# The current column position of the scanner, starting with 1.
|
235
|
+
# See also: #line.
|
233
236
|
#
|
234
237
|
# Beware, this is implemented inefficiently. It should be used
|
235
238
|
# for debugging only.
|
236
239
|
def column pos = self.pos
|
237
|
-
return
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
240
|
+
return 1 if pos <= 0
|
241
|
+
pos - (binary_string.rindex(?\n, pos - 1) || -1)
|
242
|
+
end
|
243
|
+
|
244
|
+
# The string in binary encoding.
|
245
|
+
#
|
246
|
+
# To be used with #pos, which is the index of the byte the scanner
|
247
|
+
# will scan next.
|
248
|
+
def binary_string
|
249
|
+
@binary_string ||=
|
250
|
+
if string.respond_to?(:bytesize) && string.bytesize != string.size
|
251
|
+
#:nocov:
|
252
|
+
string.dup.force_encoding('binary')
|
253
|
+
#:nocov:
|
254
|
+
else
|
255
|
+
string
|
256
|
+
end
|
245
257
|
end
|
246
258
|
|
247
259
|
protected
|
@@ -267,7 +279,7 @@ module CodeRay
|
|
267
279
|
def reset_instance
|
268
280
|
@tokens.clear if @tokens.respond_to?(:clear) && !@options[:keep_tokens]
|
269
281
|
@cached_tokens = nil
|
270
|
-
@
|
282
|
+
@binary_string = nil if defined? @binary_string
|
271
283
|
end
|
272
284
|
|
273
285
|
# Scanner error with additional status information
|
@@ -297,8 +309,8 @@ surrounding code:
|
|
297
309
|
tokens.respond_to?(:last) ? tokens.last(10).map { |t| t.inspect }.join("\n") : '',
|
298
310
|
line, column, pos,
|
299
311
|
matched, state, bol?, eos?,
|
300
|
-
|
301
|
-
|
312
|
+
binary_string[pos - ambit, ambit],
|
313
|
+
binary_string[pos, ambit],
|
302
314
|
], backtrace
|
303
315
|
end
|
304
316
|
|
@@ -2,20 +2,21 @@ module CodeRay
|
|
2
2
|
module Scanners
|
3
3
|
|
4
4
|
map \
|
5
|
-
:
|
6
|
-
:
|
7
|
-
:ecmascript
|
5
|
+
:'c++' => :cpp,
|
6
|
+
:cplusplus => :cpp,
|
7
|
+
:ecmascript => :java_script,
|
8
8
|
:ecma_script => :java_script,
|
9
|
-
:
|
10
|
-
:
|
11
|
-
:
|
12
|
-
:
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:
|
16
|
-
:
|
17
|
-
:
|
18
|
-
:
|
9
|
+
:rhtml => :erb,
|
10
|
+
:eruby => :erb,
|
11
|
+
:irb => :ruby,
|
12
|
+
:javascript => :java_script,
|
13
|
+
:js => :java_script,
|
14
|
+
:pascal => :delphi,
|
15
|
+
:patch => :diff,
|
16
|
+
:plain => :text,
|
17
|
+
:plaintext => :text,
|
18
|
+
:xhtml => :html,
|
19
|
+
:yml => :yaml
|
19
20
|
|
20
21
|
default :text
|
21
22
|
|
@@ -156,7 +156,7 @@ module CodeRay
|
|
156
156
|
elsif match = scan(/['`\(\[\)\]\{\}]|\#[({]|~@?|[@\^]/)
|
157
157
|
encoder.text_token match, :operator
|
158
158
|
elsif match = scan(/;.*/)
|
159
|
-
encoder.text_token match, :comment #
|
159
|
+
encoder.text_token match, :comment # TODO: recognize (comment ...) too
|
160
160
|
elsif match = scan(/\#?\\(?:newline|space|.?)/)
|
161
161
|
encoder.text_token match, :char
|
162
162
|
elsif match = scan(/\#[ft]/)
|
data/lib/coderay/scanners/css.rb
CHANGED
@@ -2,9 +2,9 @@ module CodeRay
|
|
2
2
|
module Scanners
|
3
3
|
|
4
4
|
class CSS < Scanner
|
5
|
-
|
5
|
+
|
6
6
|
register_for :css
|
7
|
-
|
7
|
+
|
8
8
|
KINDS_NOT_LOC = [
|
9
9
|
:comment,
|
10
10
|
:class, :pseudo_class, :type,
|
@@ -20,28 +20,28 @@ module Scanners
|
|
20
20
|
NMChar = /[-_a-zA-Z0-9]|#{Escape}/
|
21
21
|
NMStart = /[_a-zA-Z]|#{Escape}/
|
22
22
|
NL = /\r\n|\r|\n|\f/
|
23
|
-
String1 = /"(?:[^\n\r\f\\"]|\\#{NL}|#{Escape})*"?/ #
|
24
|
-
String2 = /'(?:[^\n\r\f\\']|\\#{NL}|#{Escape})*'?/ #
|
23
|
+
String1 = /"(?:[^\n\r\f\\"]|\\#{NL}|#{Escape})*"?/ # TODO: buggy regexp
|
24
|
+
String2 = /'(?:[^\n\r\f\\']|\\#{NL}|#{Escape})*'?/ # TODO: buggy regexp
|
25
25
|
String = /#{String1}|#{String2}/
|
26
|
-
|
26
|
+
|
27
27
|
HexColor = /#(?:#{Hex}{6}|#{Hex}{3})/
|
28
28
|
Color = /#{HexColor}/
|
29
|
-
|
29
|
+
|
30
30
|
Num = /-?(?:[0-9]+|[0-9]*\.[0-9]+)/
|
31
31
|
Name = /#{NMChar}+/
|
32
32
|
Ident = /-?#{NMStart}#{NMChar}*/
|
33
33
|
AtKeyword = /@#{Ident}/
|
34
34
|
Percentage = /#{Num}%/
|
35
|
-
|
35
|
+
|
36
36
|
reldimensions = %w[em ex px]
|
37
37
|
absdimensions = %w[in cm mm pt pc]
|
38
38
|
Unit = Regexp.union(*(reldimensions + absdimensions))
|
39
|
-
|
39
|
+
|
40
40
|
Dimension = /#{Num}#{Unit}/
|
41
|
-
|
41
|
+
|
42
42
|
Comment = %r! /\* (?: .*? \*/ | .* ) !mx
|
43
43
|
Function = /(?:url|alpha|attr|counters?)\((?:[^)\n\r\f]|\\\))*\)?/
|
44
|
-
|
44
|
+
|
45
45
|
Id = /##{Name}/
|
46
46
|
Class = /\.#{Name}/
|
47
47
|
PseudoClass = /:#{Name}/
|
@@ -64,20 +64,26 @@ module Scanners
|
|
64
64
|
when :initial, :media
|
65
65
|
if match = scan(/(?>#{RE::Ident})(?!\()|\*/ox)
|
66
66
|
encoder.text_token match, :type
|
67
|
+
next
|
67
68
|
elsif match = scan(RE::Class)
|
68
69
|
encoder.text_token match, :class
|
70
|
+
next
|
69
71
|
elsif match = scan(RE::Id)
|
70
72
|
encoder.text_token match, :constant
|
73
|
+
next
|
71
74
|
elsif match = scan(RE::PseudoClass)
|
72
75
|
encoder.text_token match, :pseudo_class
|
76
|
+
next
|
73
77
|
elsif match = scan(RE::AttributeSelector)
|
74
78
|
# TODO: Improve highlighting inside of attribute selectors.
|
75
79
|
encoder.text_token match[0,1], :operator
|
76
80
|
encoder.text_token match[1..-2], :attribute_name if match.size > 2
|
77
81
|
encoder.text_token match[-1,1], :operator if match[-1] == ?]
|
82
|
+
next
|
78
83
|
elsif match = scan(/@media/)
|
79
84
|
encoder.text_token match, :directive
|
80
85
|
states.push :media_before_name
|
86
|
+
next
|
81
87
|
end
|
82
88
|
|
83
89
|
when :block
|
@@ -87,18 +93,21 @@ module Scanners
|
|
87
93
|
else
|
88
94
|
encoder.text_token match, :key
|
89
95
|
end
|
96
|
+
next
|
90
97
|
end
|
91
|
-
|
98
|
+
|
92
99
|
when :media_before_name
|
93
100
|
if match = scan(RE::Ident)
|
94
101
|
encoder.text_token match, :type
|
95
102
|
states[-1] = :media_after_name
|
103
|
+
next
|
96
104
|
end
|
97
105
|
|
98
106
|
when :media_after_name
|
99
107
|
if match = scan(/\{/)
|
100
108
|
encoder.text_token match, :operator
|
101
109
|
states[-1] = :media
|
110
|
+
next
|
102
111
|
end
|
103
112
|
|
104
113
|
else
|
@@ -110,12 +119,12 @@ module Scanners
|
|
110
119
|
|
111
120
|
elsif match = scan(/\/\*(?:.*?\*\/|\z)/m)
|
112
121
|
encoder.text_token match, :comment
|
113
|
-
|
122
|
+
|
114
123
|
elsif match = scan(/\{/)
|
115
124
|
value_expected = false
|
116
125
|
encoder.text_token match, :operator
|
117
126
|
states.push :block
|
118
|
-
|
127
|
+
|
119
128
|
elsif match = scan(/\}/)
|
120
129
|
value_expected = false
|
121
130
|
if states.last == :block || states.last == :media
|
@@ -124,14 +133,14 @@ module Scanners
|
|
124
133
|
else
|
125
134
|
encoder.text_token match, :error
|
126
135
|
end
|
127
|
-
|
136
|
+
|
128
137
|
elsif match = scan(/#{RE::String}/o)
|
129
138
|
encoder.begin_group :string
|
130
139
|
encoder.text_token match[0, 1], :delimiter
|
131
140
|
encoder.text_token match[1..-2], :content if match.size > 2
|
132
141
|
encoder.text_token match[-1, 1], :delimiter if match.size >= 2
|
133
142
|
encoder.end_group :string
|
134
|
-
|
143
|
+
|
135
144
|
elsif match = scan(/#{RE::Function}/o)
|
136
145
|
encoder.begin_group :string
|
137
146
|
start = match[/^\w+\(/]
|
@@ -143,22 +152,22 @@ module Scanners
|
|
143
152
|
encoder.text_token match[start.size..-1], :content
|
144
153
|
end
|
145
154
|
encoder.end_group :string
|
146
|
-
|
155
|
+
|
147
156
|
elsif match = scan(/(?: #{RE::Dimension} | #{RE::Percentage} | #{RE::Num} )/ox)
|
148
157
|
encoder.text_token match, :float
|
149
|
-
|
158
|
+
|
150
159
|
elsif match = scan(/#{RE::Color}/o)
|
151
160
|
encoder.text_token match, :color
|
152
|
-
|
161
|
+
|
153
162
|
elsif match = scan(/! *important/)
|
154
163
|
encoder.text_token match, :important
|
155
|
-
|
164
|
+
|
156
165
|
elsif match = scan(/(?:rgb|hsl)a?\([^()\n]*\)?/)
|
157
166
|
encoder.text_token match, :color
|
158
|
-
|
167
|
+
|
159
168
|
elsif match = scan(RE::AtKeyword)
|
160
169
|
encoder.text_token match, :directive
|
161
|
-
|
170
|
+
|
162
171
|
elsif match = scan(/ [+>:;,.=()\/] /x)
|
163
172
|
if match == ':'
|
164
173
|
value_expected = true
|
@@ -166,18 +175,18 @@ module Scanners
|
|
166
175
|
value_expected = false
|
167
176
|
end
|
168
177
|
encoder.text_token match, :operator
|
169
|
-
|
178
|
+
|
170
179
|
else
|
171
180
|
encoder.text_token getch, :error
|
172
|
-
|
181
|
+
|
173
182
|
end
|
174
|
-
|
183
|
+
|
175
184
|
end
|
176
|
-
|
185
|
+
|
177
186
|
encoder
|
178
187
|
end
|
179
|
-
|
188
|
+
|
180
189
|
end
|
181
|
-
|
190
|
+
|
182
191
|
end
|
183
192
|
end
|
@@ -5,9 +5,9 @@ module Scanners
|
|
5
5
|
load :ruby
|
6
6
|
|
7
7
|
# Scanner for HTML ERB templates.
|
8
|
-
class
|
8
|
+
class ERB < Scanner
|
9
9
|
|
10
|
-
register_for :
|
10
|
+
register_for :erb
|
11
11
|
title 'HTML ERB Template'
|
12
12
|
|
13
13
|
KINDS_NOT_LOC = HTML::KINDS_NOT_LOC
|
@@ -56,7 +56,7 @@ module Scanners
|
|
56
56
|
if start_tag[/\A<%#/]
|
57
57
|
encoder.text_token code, :comment
|
58
58
|
else
|
59
|
-
@ruby_scanner.tokenize code
|
59
|
+
@ruby_scanner.tokenize code, :tokens => encoder
|
60
60
|
end unless code.empty?
|
61
61
|
encoder.text_token end_tag, :inline_delimiter unless end_tag.empty?
|
62
62
|
encoder.end_group :inline
|
@@ -220,7 +220,7 @@ module Scanners
|
|
220
220
|
encoder.text_token match, :content
|
221
221
|
|
222
222
|
elsif match = scan(/ \\. /mx)
|
223
|
-
encoder.text_token match, :content #
|
223
|
+
encoder.text_token match, :content # TODO: Shouldn't this be :error?
|
224
224
|
|
225
225
|
elsif match = scan(/ \\ | \n /x)
|
226
226
|
encoder.end_group state
|
@@ -89,7 +89,7 @@ module Scanners
|
|
89
89
|
end
|
90
90
|
|
91
91
|
elsif value_expected && match = scan(/<([[:alpha:]]\w*) (?: [^\/>]*\/> | .*?<\/\1>)/xim)
|
92
|
-
#
|
92
|
+
# TODO: scan over nested tags
|
93
93
|
xml_scanner.tokenize match, :tokens => encoder
|
94
94
|
value_expected = false
|
95
95
|
next
|
data/lib/coderay/scanners/php.rb
CHANGED
@@ -234,8 +234,8 @@ module Scanners
|
|
234
234
|
def scan_tokens encoder, options
|
235
235
|
|
236
236
|
if check(RE::PHP_START) || # starts with <?
|
237
|
-
(match?(/\s*<\S/) &&
|
238
|
-
|
237
|
+
(match?(/\s*<\S/) && check(/.{1,1000}#{RE::PHP_START}/om)) || # starts with tag and contains <?
|
238
|
+
check(/.{0,1000}#{RE::HTML_INDICATOR}/om) ||
|
239
239
|
check(/.{1,100}#{RE::PHP_START}/om) # PHP start after max 100 chars
|
240
240
|
# is HTML with embedded PHP, so start with HTML
|
241
241
|
states = [:initial]
|
@@ -26,7 +26,7 @@ module Scanners
|
|
26
26
|
state, heredocs = @state
|
27
27
|
heredocs = heredocs.dup if heredocs.is_a?(Array)
|
28
28
|
|
29
|
-
if state && state.instance_of?(
|
29
|
+
if state && state.instance_of?(StringState)
|
30
30
|
encoder.begin_group state.type
|
31
31
|
end
|
32
32
|
|
@@ -426,13 +426,18 @@ module Scanners
|
|
426
426
|
end
|
427
427
|
|
428
428
|
# cleaning up
|
429
|
-
if
|
430
|
-
|
431
|
-
@state = state, heredocs
|
429
|
+
if state.is_a? StringState
|
430
|
+
encoder.end_group state.type
|
432
431
|
end
|
433
432
|
|
434
|
-
if
|
435
|
-
|
433
|
+
if options[:keep_state]
|
434
|
+
if state.is_a?(StringState) && state.heredoc
|
435
|
+
(heredocs ||= []).unshift state
|
436
|
+
state = :initial
|
437
|
+
elsif heredocs && heredocs.empty?
|
438
|
+
heredocs = nil
|
439
|
+
end
|
440
|
+
@state = state, heredocs
|
436
441
|
end
|
437
442
|
|
438
443
|
if inline_block_stack
|