coderay 0.4.3.48 → 0.4.5.73
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.
- data/demo/demo_highlight.rb +14 -0
- data/demo/demo_server.rb +26 -8
- data/lib/coderay.rb +23 -3
- data/lib/coderay/encoder.rb +26 -4
- data/lib/coderay/encoders/debug.rb +38 -0
- data/lib/coderay/encoders/helpers/html_css.rb +1 -0
- data/lib/coderay/encoders/helpers/html_helper.rb +1 -0
- data/lib/coderay/encoders/helpers/html_output.rb +32 -11
- data/lib/coderay/encoders/html.rb +86 -16
- data/lib/coderay/encoders/null.rb +9 -3
- data/lib/coderay/encoders/statistic.rb +15 -10
- data/lib/coderay/encoders/xml.rb +70 -0
- data/lib/coderay/helpers/plugin.rb +6 -6
- data/lib/coderay/scanners/helpers/ruby_helper.rb +18 -17
- data/lib/coderay/scanners/ruby.rb +89 -41
- data/lib/coderay/tokens.rb +3 -4
- metadata +21 -18
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'coderay'
|
2
|
+
|
3
|
+
puts CodeRay.highlight('puts "Hello, World!"', :ruby)
|
4
|
+
|
5
|
+
output = CodeRay.highlight_file($0, :line_numbers => :table)
|
6
|
+
puts <<HTML
|
7
|
+
<html>
|
8
|
+
<head>
|
9
|
+
#{output.stylesheet true}
|
10
|
+
<body>
|
11
|
+
#{output}
|
12
|
+
</body>
|
13
|
+
</html>
|
14
|
+
HTML
|
data/demo/demo_server.rb
CHANGED
@@ -1,10 +1,24 @@
|
|
1
1
|
# CodeRay dynamic highlighter
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
2
|
+
|
3
|
+
unless ARGV.grep(/-[hv]|--(help|version)/).empty?
|
4
|
+
puts <<-USAGE
|
5
|
+
CodeRay Server 0.5
|
6
|
+
$Id: demo_server.rb 57 2005-10-22 01:16:34Z murphy $
|
7
|
+
|
8
|
+
Usage:
|
9
|
+
1) Start this and your browser.
|
10
|
+
2) Go to http://localhost:2468/?<path to the file>
|
11
|
+
and you should get the highlighted version.
|
12
|
+
|
13
|
+
Parameters:
|
14
|
+
-d Debug mode; reload CodeRay engine for every file.
|
15
|
+
(prepare for MANY "already initialized" and "method redefined"
|
16
|
+
messages - ingore it.)
|
17
|
+
|
18
|
+
... More to come.
|
19
|
+
USAGE
|
20
|
+
exit
|
21
|
+
end
|
8
22
|
|
9
23
|
require 'webrick'
|
10
24
|
require 'pathname'
|
@@ -29,7 +43,7 @@ require 'coderay'
|
|
29
43
|
class CodeRayServlet < WEBrick::HTTPServlet::AbstractServlet
|
30
44
|
|
31
45
|
STYLE = 'style="font-family: sans-serif; color: navy;"'
|
32
|
-
BANNER = '<p><img src="http://rd.cYcnus.de/coderay/coderay-banner" style="border: 0" alt="
|
46
|
+
BANNER = '<p><img src="http://rd.cYcnus.de/coderay/coderay-banner" style="border: 0" alt="Highlighted by CodeRay"/></p>'
|
33
47
|
|
34
48
|
def do_GET req, res
|
35
49
|
q = req.query_string || ''
|
@@ -59,6 +73,10 @@ class CodeRayServlet < WEBrick::HTTPServlet::AbstractServlet
|
|
59
73
|
page << "#{BANNER}</body></html>"
|
60
74
|
|
61
75
|
elsif File.exist? path
|
76
|
+
if $DEBUG
|
77
|
+
$".delete_if { |f| f =~ /coderay/ }
|
78
|
+
require 'coderay'
|
79
|
+
end
|
62
80
|
div = CodeRay.scan_file(path).html :tab_width => 8, :wrap => :div
|
63
81
|
div.replace <<-DIV
|
64
82
|
<div #{STYLE}>
|
@@ -74,7 +92,7 @@ class CodeRayServlet < WEBrick::HTTPServlet::AbstractServlet
|
|
74
92
|
end
|
75
93
|
end
|
76
94
|
|
77
|
-
#
|
95
|
+
# This port is taken by "qip_msgd" - I don't know that. Do you?
|
78
96
|
module CodeRay
|
79
97
|
PORT = 0xC0DE / 20
|
80
98
|
end
|
data/lib/coderay.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# = CodeRay Library
|
2
2
|
#
|
3
|
-
# $Id: coderay.rb
|
3
|
+
# $Id: coderay.rb 73 2005-10-29 16:09:17Z murphy $
|
4
4
|
#
|
5
5
|
# CodeRay is a Ruby library for syntax highlighting.
|
6
6
|
#
|
@@ -128,7 +128,7 @@
|
|
128
128
|
# The scanning methods provide more flexibility; we recommend to use these.
|
129
129
|
module CodeRay
|
130
130
|
|
131
|
-
Version = '0.4.
|
131
|
+
Version = '0.4.6'
|
132
132
|
|
133
133
|
require 'coderay/tokens'
|
134
134
|
require 'coderay/scanner'
|
@@ -201,6 +201,16 @@ module CodeRay
|
|
201
201
|
encoder(format, options).encode code, lang, options
|
202
202
|
end
|
203
203
|
|
204
|
+
# Highlight a string into a HTML <div>.
|
205
|
+
#
|
206
|
+
# CSS styles use classes, so you have to include a stylesheet
|
207
|
+
# in your output.
|
208
|
+
#
|
209
|
+
# See encode.
|
210
|
+
def highlight code, lang, options = { :css => :class }, format = :div
|
211
|
+
encode code, lang, format, options
|
212
|
+
end
|
213
|
+
|
204
214
|
# Encode pre-scanned Tokens.
|
205
215
|
# Use this together with CodeRay.scan:
|
206
216
|
#
|
@@ -223,10 +233,20 @@ module CodeRay
|
|
223
233
|
# require 'coderay'
|
224
234
|
# page = CodeRay.encode_file 'some_c_code.c', :html
|
225
235
|
def encode_file filename, format, options = {}
|
226
|
-
tokens = scan_file filename, auto, get_scanner_options(options)
|
236
|
+
tokens = scan_file filename, :auto, get_scanner_options(options)
|
227
237
|
encode_tokens tokens, format, options
|
228
238
|
end
|
229
239
|
|
240
|
+
# Highlight a file into a HTML <div>.
|
241
|
+
#
|
242
|
+
# CSS styles use classes, so you have to include a stylesheet
|
243
|
+
# in your output.
|
244
|
+
#
|
245
|
+
# See encode.
|
246
|
+
def highlight_file filename, options = { :css => :class }, format = :div
|
247
|
+
encode_file filename, format, options
|
248
|
+
end
|
249
|
+
|
230
250
|
# Finds the Encoder class for +format+ and creates an instance, passing
|
231
251
|
# +options+ to it.
|
232
252
|
#
|
data/lib/coderay/encoder.rb
CHANGED
@@ -109,6 +109,11 @@ module CodeRay
|
|
109
109
|
method(:token).to_proc
|
110
110
|
end
|
111
111
|
|
112
|
+
# Return the default file extension for outputs of this encoder.
|
113
|
+
def file_extension
|
114
|
+
self.class::FILE_EXTENSION
|
115
|
+
end
|
116
|
+
|
112
117
|
protected
|
113
118
|
|
114
119
|
# Called with merged options before encoding starts.
|
@@ -122,11 +127,28 @@ module CodeRay
|
|
122
127
|
# Called with +text+ and +kind+ of the currently scanned token.
|
123
128
|
# For simple scanners, it's enougth to implement this method.
|
124
129
|
#
|
125
|
-
#
|
126
|
-
#
|
130
|
+
# By default, it calls text_token or block_token, depending on
|
131
|
+
# whether +text+ is a String.
|
127
132
|
def token text, kind
|
128
|
-
|
129
|
-
|
133
|
+
if text.is_a? String
|
134
|
+
text_token text, kind
|
135
|
+
else
|
136
|
+
block_token text, kind
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def text_token text, kind
|
141
|
+
end
|
142
|
+
|
143
|
+
def block_token action, kind
|
144
|
+
case action
|
145
|
+
when :open
|
146
|
+
open_token kind
|
147
|
+
when :close
|
148
|
+
close_token kind
|
149
|
+
else
|
150
|
+
raise 'unknown block action: %p' % action
|
151
|
+
end
|
130
152
|
end
|
131
153
|
|
132
154
|
# Called with merged options after encoding starts.
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module CodeRay
|
2
|
+
module Encoders
|
3
|
+
|
4
|
+
# = Debug Encoder
|
5
|
+
class Debug < Encoder
|
6
|
+
|
7
|
+
include Streamable
|
8
|
+
register_for :debug
|
9
|
+
|
10
|
+
FILE_EXTENSION = 'raydebug'
|
11
|
+
|
12
|
+
protected
|
13
|
+
def text_token text, kind
|
14
|
+
@out <<
|
15
|
+
if kind == :space
|
16
|
+
text
|
17
|
+
else
|
18
|
+
text = text.gsub(/[)\\]/, '\\\\\0')
|
19
|
+
"#{kind}(#{text})"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def block_token action, kind
|
24
|
+
@out << super
|
25
|
+
end
|
26
|
+
|
27
|
+
def open_token kind
|
28
|
+
"#{kind}<"
|
29
|
+
end
|
30
|
+
|
31
|
+
def close_token kind
|
32
|
+
">"
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -102,6 +102,7 @@ table.CodeRay td { padding: 2px 4px; vertical-align: top; }
|
|
102
102
|
.hx { color:#058; font-weight:bold; }
|
103
103
|
.i { color:#00D; font-weight:bold; }
|
104
104
|
.ic { color:#B44; font-weight:bold; }
|
105
|
+
.il { }
|
105
106
|
.in { color:#B2B; font-weight:bold; }
|
106
107
|
.iv { color:#33B; }
|
107
108
|
.la { color:#970; font-weight:bold; }
|
@@ -13,6 +13,8 @@ module CodeRay
|
|
13
13
|
# TODO: more doc.
|
14
14
|
module Output
|
15
15
|
|
16
|
+
attr_accessor :wrapped_in
|
17
|
+
|
16
18
|
class << self
|
17
19
|
|
18
20
|
# This makes Output look like a class.
|
@@ -33,8 +35,18 @@ module CodeRay
|
|
33
35
|
warn "The Output module is intended to extend instances of String, not #{o.class}." unless o.respond_to? :to_str
|
34
36
|
end
|
35
37
|
|
38
|
+
def stylesheet in_tag = false
|
39
|
+
ss = CSS::DEFAULT_STYLESHEET
|
40
|
+
ss = <<-CSS if in_tag
|
41
|
+
<style type="text/css">
|
42
|
+
#{ss}
|
43
|
+
</style>
|
44
|
+
CSS
|
45
|
+
ss
|
46
|
+
end
|
47
|
+
|
36
48
|
def page_template_for_css css = :default
|
37
|
-
css =
|
49
|
+
css = stylesheet if css == :default
|
38
50
|
PAGE.apply 'CSS', css
|
39
51
|
end
|
40
52
|
|
@@ -53,11 +65,6 @@ module CodeRay
|
|
53
65
|
|
54
66
|
wrapper :div, :span, :page
|
55
67
|
|
56
|
-
def wrapped_in
|
57
|
-
@wrapped_in ||= nil
|
58
|
-
end
|
59
|
-
attr_writer :wrapped_in
|
60
|
-
|
61
68
|
def wrapped_in? element
|
62
69
|
wrapped_in == element
|
63
70
|
end
|
@@ -97,19 +104,28 @@ module CodeRay
|
|
97
104
|
clone.wrap!(*args)
|
98
105
|
end
|
99
106
|
|
107
|
+
NUMERIZABLE_WRAPPINGS = {
|
108
|
+
:table => [:div, :page],
|
109
|
+
:inline => :all,
|
110
|
+
nil => :all
|
111
|
+
}
|
112
|
+
|
100
113
|
def numerize! mode = :table, options = {}
|
101
114
|
return self unless mode
|
102
115
|
|
103
|
-
|
116
|
+
options = DEFAULT_OPTIONS.merge options
|
117
|
+
|
118
|
+
start = options[:line_number_start]
|
104
119
|
unless start.is_a? Integer
|
105
120
|
raise ArgumentError, "Invalid value %p for :line_number_start; Integer expected." % start
|
106
121
|
end
|
107
122
|
|
108
|
-
|
123
|
+
allowed_wrappings = NUMERIZABLE_WRAPPINGS[mode]
|
124
|
+
unless allowed_wrappings == :all or allowed_wrappings.include? options[:wrap]
|
109
125
|
raise ArgumentError, "Can't numerize, :wrap must be in %p, but is %p" % [NUMERIZABLE_WRAPPINGS, options[:wrap]]
|
110
126
|
end
|
111
127
|
|
112
|
-
bold_every = options
|
128
|
+
bold_every = options[:bold_every]
|
113
129
|
bolding =
|
114
130
|
if bold_every == :no_bolding or bold_every == 0
|
115
131
|
proc { |line| line.to_s }
|
@@ -137,7 +153,7 @@ module CodeRay
|
|
137
153
|
line += 1
|
138
154
|
"<span class=\"no\">#{ line_number.rjust(max_width) }</span> "
|
139
155
|
end
|
140
|
-
wrap! :div
|
156
|
+
#wrap! :div
|
141
157
|
|
142
158
|
when :table
|
143
159
|
# This is really ugly.
|
@@ -164,6 +180,10 @@ module CodeRay
|
|
164
180
|
clone.numerize!(*args)
|
165
181
|
end
|
166
182
|
|
183
|
+
def stylesheet in_tag = false
|
184
|
+
Output.stylesheet in_tag
|
185
|
+
end
|
186
|
+
|
167
187
|
class Template < String
|
168
188
|
|
169
189
|
def self.wrap! str, template, target
|
@@ -207,9 +227,10 @@ module CodeRay
|
|
207
227
|
DIV_TABLE = <<-`DIV_TABLE`
|
208
228
|
<table class="CodeRay"> <tr>
|
209
229
|
<td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre><%LINE_NUMBERS%></pre></td>
|
210
|
-
<td class="code"><pre
|
230
|
+
<td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><%CONTENT%></pre></td>
|
211
231
|
</tr> </table>
|
212
232
|
DIV_TABLE
|
233
|
+
# title="double click to expand"
|
213
234
|
|
214
235
|
PAGE = <<-`PAGE`
|
215
236
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
@@ -1,6 +1,63 @@
|
|
1
1
|
module CodeRay
|
2
2
|
module Encoders
|
3
3
|
|
4
|
+
# = HTML Encoder
|
5
|
+
#
|
6
|
+
# This is CodeRay's most important highlighter:
|
7
|
+
# It provides save, fast XHTML generation and CSS support.
|
8
|
+
#
|
9
|
+
# == Usage
|
10
|
+
#
|
11
|
+
# require 'coderay'
|
12
|
+
# puts CodeRay.scan('Some /code/', :ruby).html #-> a HTML page
|
13
|
+
# puts CodeRay.scan('Some /code/', :ruby).html(:wrap => :span) #-> <span class="CodeRay"><span class="co">Some</span> /code/</span>
|
14
|
+
# puts CodeRay.scan('Some /code/', :ruby).span #-> the same
|
15
|
+
#
|
16
|
+
# puts CodeRay.scan('Some code', :ruby).html(
|
17
|
+
# :wrap => nil,
|
18
|
+
# :line_numbers => :inline,
|
19
|
+
# :css => :style
|
20
|
+
# )
|
21
|
+
# #-> <span class="no">1</span> <span style="color:#036; font-weight:bold;">Some</span> code
|
22
|
+
#
|
23
|
+
# == Options
|
24
|
+
#
|
25
|
+
# === :tab_width
|
26
|
+
# Convert \t characters to +n+ spaces (a number.)
|
27
|
+
# Default: 8
|
28
|
+
#
|
29
|
+
# === :css
|
30
|
+
# How to include the styles; can be :class or :style.
|
31
|
+
#
|
32
|
+
# Default: :class
|
33
|
+
#
|
34
|
+
# === :wrap
|
35
|
+
# Wrap in :page, :div, :span or nil.
|
36
|
+
#
|
37
|
+
# You can also use Encoders::Div and Encoders::Span.
|
38
|
+
#
|
39
|
+
# Default: :page
|
40
|
+
#
|
41
|
+
# === :line_numbers
|
42
|
+
# Include line numbers in :table, :inline or nil (no line numbers)
|
43
|
+
#
|
44
|
+
# Default: nil
|
45
|
+
#
|
46
|
+
# === :line_number_start
|
47
|
+
# Where to start with line number counting.
|
48
|
+
#
|
49
|
+
# Default: 1
|
50
|
+
#
|
51
|
+
# === :bold_every
|
52
|
+
# Make every +n+-th number appear bold.
|
53
|
+
#
|
54
|
+
# Default: 10
|
55
|
+
#
|
56
|
+
# === :hint
|
57
|
+
# Include some information into the output using the title attribute.
|
58
|
+
# Can be :info (show token type on mouse-over) or :debug.
|
59
|
+
#
|
60
|
+
# Default: false
|
4
61
|
class HTML < Encoder
|
5
62
|
|
6
63
|
include Streamable
|
@@ -19,8 +76,9 @@ module Encoders
|
|
19
76
|
:line_numbers => nil,
|
20
77
|
:line_number_start => 1,
|
21
78
|
:bold_every => 10,
|
79
|
+
|
80
|
+
:hint => false,
|
22
81
|
}
|
23
|
-
NUMERIZABLE_WRAPPINGS = [:div, :page]
|
24
82
|
|
25
83
|
require 'coderay/encoders/helpers/html_helper'
|
26
84
|
require 'coderay/encoders/helpers/html_output'
|
@@ -47,12 +105,9 @@ module Encoders
|
|
47
105
|
ansi_chars = Array(0x7f..0xff)
|
48
106
|
ansi_chars.each { |i| HTML_ESCAPE[i.chr] = '&#%d;' % i }
|
49
107
|
# \x9 (\t) and \xA (\n) not included
|
50
|
-
HTML_ESCAPE_PATTERN = /[&"><\
|
108
|
+
HTML_ESCAPE_PATTERN = /[\t&"><\xB-\x1f\x7f-\xff\0-\x8]/
|
51
109
|
|
52
110
|
def setup options
|
53
|
-
if options[:line_numbers] and not NUMERIZABLE_WRAPPINGS.include? options[:wrap]
|
54
|
-
warn ':line_numbers wanted, but :wrap is %p' % options[:wrap]
|
55
|
-
end
|
56
111
|
super
|
57
112
|
return if options == @last_options
|
58
113
|
@last_options = options
|
@@ -63,6 +118,11 @@ module Encoders
|
|
63
118
|
@opened = [nil]
|
64
119
|
@css = CSS.new
|
65
120
|
|
121
|
+
hint = options[:hint]
|
122
|
+
if hint and not [:debug, :info].include? hint
|
123
|
+
raise ArgumentError, "Unknown value %p for :hint; expected :info, :debug, false or nil." % hint
|
124
|
+
end
|
125
|
+
|
66
126
|
case options[:css]
|
67
127
|
|
68
128
|
when :class
|
@@ -73,15 +133,20 @@ module Encoders
|
|
73
133
|
type = k
|
74
134
|
end
|
75
135
|
c = ClassOfKind[type]
|
76
|
-
if c == :NO_HIGHLIGHT
|
136
|
+
if c == :NO_HIGHLIGHT and not hint
|
77
137
|
h[k] = false
|
78
138
|
else
|
79
|
-
if
|
80
|
-
|
139
|
+
title = if hint
|
140
|
+
if hint == :debug
|
141
|
+
' title="%p"' % [ k ]
|
142
|
+
elsif hint == :info
|
143
|
+
path = (k[1..-1] << k.first).map { |kind| kind.to_s.gsub(/_/, ' ').gsub(/\b\w/) { $&.capitalize } }
|
144
|
+
" title=\"#{path.join('/')}\""
|
145
|
+
end
|
81
146
|
else
|
82
|
-
|
147
|
+
''
|
83
148
|
end
|
84
|
-
h[k] = '<span%s class="%s">' % [
|
149
|
+
h[k] = '<span%s class="%s">' % [title, c]
|
85
150
|
end
|
86
151
|
end
|
87
152
|
|
@@ -92,19 +157,24 @@ module Encoders
|
|
92
157
|
else
|
93
158
|
styles = [k]
|
94
159
|
end
|
160
|
+
type = styles.first
|
95
161
|
styles.map! { |c| ClassOfKind[c] }
|
96
|
-
if styles.first == :NO_HIGHLIGHT
|
162
|
+
if styles.first == :NO_HIGHLIGHT and not hint
|
97
163
|
h[k] = false
|
98
164
|
else
|
99
|
-
if
|
100
|
-
|
165
|
+
title = if hint
|
166
|
+
if hint == :debug
|
167
|
+
' title="%p"' % [ styles ]
|
168
|
+
elsif hint == :info and styles.size == 1
|
169
|
+
" title=\"#{type.to_s.gsub(/_/, " ").capitalize}\""
|
170
|
+
end
|
101
171
|
else
|
102
|
-
|
172
|
+
''
|
103
173
|
end
|
104
174
|
style = @css[*styles]
|
105
175
|
h[k] =
|
106
176
|
if style
|
107
|
-
'<span%s style="%s">' % [
|
177
|
+
'<span%s style="%s">' % [title, style]
|
108
178
|
else
|
109
179
|
false
|
110
180
|
end
|
@@ -112,7 +182,7 @@ module Encoders
|
|
112
182
|
end
|
113
183
|
|
114
184
|
else
|
115
|
-
raise "Unknown value %p for :css." % options[:css]
|
185
|
+
raise ArgumentError, "Unknown value %p for :css." % options[:css]
|
116
186
|
|
117
187
|
end
|
118
188
|
end
|
@@ -1,12 +1,20 @@
|
|
1
1
|
module CodeRay
|
2
2
|
module Encoders
|
3
3
|
|
4
|
+
# = Null Encoder
|
5
|
+
#
|
6
|
+
# Does nothing and returns an empty string.
|
4
7
|
class Null < Encoder
|
5
8
|
|
6
9
|
include Streamable
|
7
10
|
register_for :null
|
8
11
|
|
9
|
-
|
12
|
+
# Defined for faster processing
|
13
|
+
def to_proc
|
14
|
+
proc {}
|
15
|
+
end
|
16
|
+
|
17
|
+
protected
|
10
18
|
|
11
19
|
def token(*)
|
12
20
|
# do nothing
|
@@ -16,5 +24,3 @@ module CodeRay
|
|
16
24
|
|
17
25
|
end
|
18
26
|
end
|
19
|
-
|
20
|
-
|
@@ -22,17 +22,22 @@ module CodeRay module Encoders
|
|
22
22
|
super
|
23
23
|
end
|
24
24
|
|
25
|
-
def
|
25
|
+
def text_token text, kind
|
26
|
+
@real_token_count += 1 unless kind == :space
|
27
|
+
@type_stats[kind].count += 1
|
28
|
+
@type_stats[kind].size += text.size
|
29
|
+
@type_stats['TOTAL'].size += text.size
|
30
|
+
end
|
31
|
+
|
32
|
+
# TODO Hierarchy handling
|
33
|
+
def block_token action, kind
|
34
|
+
#@content_type = kind
|
35
|
+
@type_stats['open/close'].count += 1
|
36
|
+
end
|
37
|
+
|
38
|
+
def token text, kind
|
39
|
+
super
|
26
40
|
@type_stats['TOTAL'].count += 1
|
27
|
-
if text.is_a? String
|
28
|
-
@real_token_count += 1 unless type == :space
|
29
|
-
@type_stats[type].count += 1
|
30
|
-
@type_stats[type].size += text.size
|
31
|
-
@type_stats['TOTAL'].size += text.size
|
32
|
-
else
|
33
|
-
@content_type = type
|
34
|
-
@type_stats['open/close'].count += 1
|
35
|
-
end
|
36
41
|
end
|
37
42
|
|
38
43
|
STATS = <<-STATS
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module CodeRay
|
2
|
+
module Encoders
|
3
|
+
|
4
|
+
# = Debug Encoder
|
5
|
+
class XML < Encoder
|
6
|
+
|
7
|
+
include Streamable
|
8
|
+
register_for :xml
|
9
|
+
|
10
|
+
FILE_EXTENSION = 'xml'
|
11
|
+
|
12
|
+
require 'rexml/document'
|
13
|
+
|
14
|
+
DEFAULT_OPTIONS = {
|
15
|
+
:tab_width => 8,
|
16
|
+
:pretty => -1,
|
17
|
+
:transitive => false,
|
18
|
+
}
|
19
|
+
|
20
|
+
protected
|
21
|
+
|
22
|
+
def setup options
|
23
|
+
@out = ''
|
24
|
+
@doc = REXML::Document.new
|
25
|
+
@doc << REXML::XMLDecl.new
|
26
|
+
@tab_width = options[:tab_width]
|
27
|
+
@root = @node = @doc.add_element('coderay-tokens')
|
28
|
+
end
|
29
|
+
|
30
|
+
def finish options
|
31
|
+
@doc.write @out, options[:pretty], options[:transitive], true
|
32
|
+
@out
|
33
|
+
end
|
34
|
+
|
35
|
+
def text_token text, kind
|
36
|
+
if kind == :space
|
37
|
+
token = @node
|
38
|
+
else
|
39
|
+
token = @node.add_element kind.to_s
|
40
|
+
end
|
41
|
+
text.scan(/(\x20+)|(\t+)|(\n)|[^\x20\t\n]+/) do |space, tab, nl|
|
42
|
+
case
|
43
|
+
when space
|
44
|
+
token << REXML::Text.new(space, true)
|
45
|
+
when tab
|
46
|
+
token << REXML::Text.new(tab, true)
|
47
|
+
when nl
|
48
|
+
token << REXML::Text.new(nl, true)
|
49
|
+
else
|
50
|
+
token << REXML::Text.new($&)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def open_token kind
|
56
|
+
@node = @node.add_element kind.to_s
|
57
|
+
end
|
58
|
+
|
59
|
+
def close_token kind
|
60
|
+
if @node == @root
|
61
|
+
raise 'no token to close!'
|
62
|
+
end
|
63
|
+
@node = @node.parent
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# = PluginHost
|
2
2
|
#
|
3
|
-
# $Id: plugin.rb
|
3
|
+
# $Id: plugin.rb 59 2005-10-29 04:55:15Z murphy $
|
4
4
|
#
|
5
5
|
# A simple subclass plugin system.
|
6
6
|
#
|
@@ -90,10 +90,10 @@ module PluginHost
|
|
90
90
|
id = validate_id(plugin_id)
|
91
91
|
path = path_to id
|
92
92
|
begin
|
93
|
-
|
93
|
+
#$stderr.puts 'Loading plugin: ' + path if $DEBUG
|
94
94
|
require path
|
95
|
-
rescue LoadError
|
96
|
-
raise PluginNotFound,
|
95
|
+
rescue LoadError => boom
|
96
|
+
raise PluginNotFound, 'Could not load plugin %p: %s' % [id, boom]
|
97
97
|
else
|
98
98
|
# Plugin should have registered by now
|
99
99
|
unless h.has_key? id
|
@@ -151,7 +151,7 @@ module PluginHost
|
|
151
151
|
end
|
152
152
|
|
153
153
|
# Alias for +[]+.
|
154
|
-
alias
|
154
|
+
alias load []
|
155
155
|
|
156
156
|
# Returns the Plugin for +id+.
|
157
157
|
# Use it like Hash#fetch.
|
@@ -239,7 +239,7 @@ def require_plugin path
|
|
239
239
|
host = PluginHost.host_by_id(host_id)
|
240
240
|
raise PluginHost::HostNotFound,
|
241
241
|
"No host for #{host_id.inspect} found." unless host
|
242
|
-
host.
|
242
|
+
host.load plugin_id
|
243
243
|
end
|
244
244
|
|
245
245
|
|
@@ -12,9 +12,11 @@ module CodeRay module Scanners
|
|
12
12
|
]
|
13
13
|
|
14
14
|
DEF_KEYWORDS = %w[ def ]
|
15
|
+
UNDEF_KEYWORDS = %w[ undef ]
|
15
16
|
MODULE_KEYWORDS = %w[class module]
|
16
17
|
DEF_NEW_STATE = WordList.new(:initial).
|
17
18
|
add(DEF_KEYWORDS, :def_expected).
|
19
|
+
add(UNDEF_KEYWORDS, :undef_expected).
|
18
20
|
add(MODULE_KEYWORDS, :module_expected)
|
19
21
|
|
20
22
|
IDENTS_ALLOWING_REGEXP = %w[
|
@@ -32,13 +34,11 @@ module CodeRay module Scanners
|
|
32
34
|
add(RESERVED_WORDS, :reserved).
|
33
35
|
add(PREDEFINED_CONSTANTS, :pre_constant)
|
34
36
|
|
35
|
-
# IDENT = /[a-zA-Z_][a-zA-Z_0-9]*/
|
36
37
|
IDENT = /[a-z_][\w_]*/i
|
37
38
|
|
38
39
|
METHOD_NAME = / #{IDENT} [?!]? /ox
|
39
|
-
|
40
|
-
#
|
41
|
-
| \*\*? # multiplication and power
|
40
|
+
METHOD_NAME_OPERATOR = /
|
41
|
+
\*\*? # multiplication and power
|
42
42
|
| [-+]@? # plus, minus
|
43
43
|
| [\/%&|^`~] # division, modulo or format strings, &and, |or, ^xor, `system`, tilde
|
44
44
|
| \[\]=? # array getter and setter
|
@@ -46,10 +46,11 @@ module CodeRay module Scanners
|
|
46
46
|
| <=?>? | >=? # comparison, rocket operator
|
47
47
|
| ===? # simple equality and case equality
|
48
48
|
/ox
|
49
|
+
METHOD_NAME_EX = / #{IDENT} [?!=]? | #{METHOD_NAME_OPERATOR} /ox
|
49
50
|
INSTANCE_VARIABLE = / @ #{IDENT} /ox
|
50
51
|
CLASS_VARIABLE = / @@ #{IDENT} /ox
|
51
52
|
OBJECT_VARIABLE = / @@? #{IDENT} /ox
|
52
|
-
GLOBAL_VARIABLE = / \$ (?: #{IDENT} | [1-9] | 0
|
53
|
+
GLOBAL_VARIABLE = / \$ (?: #{IDENT} | [1-9]\d* | 0\w* | [~&+`'=\/,;_.<>!@$?*":\\] | -[a-zA-Z_0-9] ) /ox
|
53
54
|
PREFIX_VARIABLE = / #{GLOBAL_VARIABLE} |#{OBJECT_VARIABLE} /ox
|
54
55
|
VARIABLE = / @?@? #{IDENT} | #{GLOBAL_VARIABLE} /ox
|
55
56
|
|
@@ -60,19 +61,17 @@ module CodeRay module Scanners
|
|
60
61
|
QUOTE_TO_TYPE.default = :string
|
61
62
|
|
62
63
|
REGEXP_MODIFIERS = /[mixounse]*/
|
63
|
-
REGEXP_SYMBOLS = /
|
64
|
-
[|?*+?(){}\[\].^$]
|
65
|
-
/x
|
64
|
+
REGEXP_SYMBOLS = /[|?*+?(){}\[\].^$]/
|
66
65
|
|
67
|
-
DECIMAL = /\d+(?:_\d+)*/
|
66
|
+
DECIMAL = /\d+(?:_\d+)*/
|
68
67
|
OCTAL = /0_?[0-7]+(?:_[0-7]+)*/
|
69
68
|
HEXADECIMAL = /0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*/
|
70
69
|
BINARY = /0b[01]+(?:_[01]+)*/
|
71
70
|
|
72
71
|
EXPONENT = / [eE] [+-]? #{DECIMAL} /ox
|
73
|
-
|
74
|
-
|
75
|
-
NUMERIC = / #{OCTAL} | #{HEXADECIMAL} | #{BINARY} | #{FLOAT_OR_INT} /ox
|
72
|
+
FLOAT_SUFFIX = / #{EXPONENT} | \. #{DECIMAL} #{EXPONENT}? /ox
|
73
|
+
FLOAT_OR_INT = / #{DECIMAL} (?: #{FLOAT_SUFFIX} () )? /ox
|
74
|
+
NUMERIC = / (?=0) (?: #{OCTAL} | #{HEXADECIMAL} | #{BINARY} ) | #{FLOAT_OR_INT} /ox
|
76
75
|
|
77
76
|
SYMBOL = /
|
78
77
|
:
|
@@ -103,7 +102,7 @@ module CodeRay module Scanners
|
|
103
102
|
)
|
104
103
|
/mx
|
105
104
|
|
106
|
-
# NOTE: This is not
|
105
|
+
# NOTE: This is not completely correct, but
|
107
106
|
# nobody needs heredoc delimiters ending with \n.
|
108
107
|
HEREDOC_OPEN = /
|
109
108
|
<< (-)? # $1 = float
|
@@ -115,7 +114,7 @@ module CodeRay module Scanners
|
|
115
114
|
)
|
116
115
|
/mx
|
117
116
|
|
118
|
-
|
117
|
+
RUBYDOC = /
|
119
118
|
=begin (?!\S)
|
120
119
|
.*?
|
121
120
|
(?: \Z | ^=end (?!\S) [^\n]* )
|
@@ -127,6 +126,8 @@ module CodeRay module Scanners
|
|
127
126
|
(?: \Z | (?=^\#CODE) )
|
128
127
|
/mx
|
129
128
|
|
129
|
+
RUBYDOC_OR_DATA = / #{RUBYDOC} | #{DATA} /xo
|
130
|
+
|
130
131
|
RDOC_DATA_START = / ^=begin (?!\S) | ^__END__$ /x
|
131
132
|
|
132
133
|
FANCY_START = / % ( [qQwWxsr] | (?![\w\s=]) ) (.) /mox
|
@@ -144,7 +145,7 @@ module CodeRay module Scanners
|
|
144
145
|
FancyStringType['W'] = FancyStringType[''] = FancyStringType['Q']
|
145
146
|
|
146
147
|
class StringState < Struct.new :type, :interpreted, :delim, :heredoc,
|
147
|
-
:paren, :paren_depth, :pattern
|
148
|
+
:paren, :paren_depth, :pattern, :next_state
|
148
149
|
|
149
150
|
CLOSING_PAREN = Hash[ *%w[
|
150
151
|
( )
|
@@ -186,7 +187,7 @@ module CodeRay module Scanners
|
|
186
187
|
delim_pattern = / \n #{ '(?>[\ \t]*)' if indented } #{ Regexp.new delim_pattern } $ /x
|
187
188
|
h[k] =
|
188
189
|
if interpreted
|
189
|
-
|
190
|
+
/ (?= #{delim_pattern}() | \\ | \# [{$@] ) /mx # $1 set == end of heredoc
|
190
191
|
else
|
191
192
|
/ (?= #{delim_pattern}() | \\ ) /mx
|
192
193
|
end
|
@@ -203,7 +204,7 @@ module CodeRay module Scanners
|
|
203
204
|
else
|
204
205
|
pattern = STRING_PATTERN[ [delim, interpreted] ]
|
205
206
|
end
|
206
|
-
super kind, interpreted, delim, heredoc, paren, paren_depth, pattern
|
207
|
+
super kind, interpreted, delim, heredoc, paren, paren_depth, pattern, :initial
|
207
208
|
end
|
208
209
|
end unless defined? StringState
|
209
210
|
|
@@ -43,7 +43,6 @@ module CodeRay module Scanners
|
|
43
43
|
|
44
44
|
if state.instance_of? StringState
|
45
45
|
# {{{
|
46
|
-
|
47
46
|
match = scan_until(state.pattern) || scan_until(/\z/)
|
48
47
|
tokens << [match, :content] unless match.empty?
|
49
48
|
break if eos?
|
@@ -52,7 +51,7 @@ module CodeRay module Scanners
|
|
52
51
|
match = getch + scan_until(/$/)
|
53
52
|
tokens << [match, :delimiter]
|
54
53
|
tokens << [:close, state.type]
|
55
|
-
state =
|
54
|
+
state = state.next_state
|
56
55
|
next
|
57
56
|
end
|
58
57
|
|
@@ -103,7 +102,7 @@ module CodeRay module Scanners
|
|
103
102
|
end
|
104
103
|
tokens << [:close, state.type]
|
105
104
|
fancy_allowed = regexp_allowed = false
|
106
|
-
state =
|
105
|
+
state = state.next_state
|
107
106
|
|
108
107
|
when '\\'
|
109
108
|
if state.interpreted
|
@@ -128,13 +127,14 @@ module CodeRay module Scanners
|
|
128
127
|
fancy_allowed = regexp_allowed = true
|
129
128
|
state = :initial
|
130
129
|
depth = 1
|
131
|
-
tokens << [
|
130
|
+
tokens << [:open, :inline]
|
131
|
+
tokens << [match + getch, :delimiter]
|
132
132
|
when ?$, ?@
|
133
133
|
tokens << [match, :escape]
|
134
134
|
last_state = state # scan one token as normal code, then return here
|
135
135
|
state = :initial
|
136
136
|
else
|
137
|
-
raise
|
137
|
+
raise 'else-case # reached; #%p not handled' % peek(1), tokens
|
138
138
|
end
|
139
139
|
|
140
140
|
when state.paren
|
@@ -145,7 +145,7 @@ module CodeRay module Scanners
|
|
145
145
|
tokens << [match, :function]
|
146
146
|
|
147
147
|
else
|
148
|
-
raise
|
148
|
+
raise 'else-case " reached; %p not handled, state = %p' % [match, state], tokens
|
149
149
|
|
150
150
|
end
|
151
151
|
next
|
@@ -153,7 +153,7 @@ module CodeRay module Scanners
|
|
153
153
|
else
|
154
154
|
# {{{
|
155
155
|
if match = scan(/ [ \t\f]+ | \\? \n | \# .* /x) or
|
156
|
-
( bol? and match = scan(
|
156
|
+
( bol? and match = scan(/#{RUBYDOC_OR_DATA}/o) )
|
157
157
|
fancy_allowed = true
|
158
158
|
case m = match[0]
|
159
159
|
when ?\s, ?\t, ?\f
|
@@ -161,7 +161,10 @@ module CodeRay module Scanners
|
|
161
161
|
type = :space
|
162
162
|
when ?\n, ?\\
|
163
163
|
type = :space
|
164
|
-
|
164
|
+
if m == ?\n
|
165
|
+
regexp_allowed = true
|
166
|
+
state = :initial if state == :undef_comma_expected
|
167
|
+
end
|
165
168
|
if heredocs
|
166
169
|
unscan # heredoc scanning needs \n at start
|
167
170
|
state = heredocs.shift
|
@@ -175,14 +178,32 @@ module CodeRay module Scanners
|
|
175
178
|
type = :comment
|
176
179
|
regexp_allowed = true
|
177
180
|
else
|
178
|
-
raise
|
181
|
+
raise 'else-case _ reached, because case %p was not handled' % [matched[0].chr], tokens
|
179
182
|
end
|
180
183
|
tokens << [match, type]
|
181
184
|
next
|
182
185
|
|
183
186
|
elsif state == :initial
|
184
|
-
|
185
|
-
|
187
|
+
|
188
|
+
# IDENTS #
|
189
|
+
if match = scan(/#{METHOD_NAME}/o)
|
190
|
+
if last_token_dot
|
191
|
+
type = if match[/^[A-Z]/] then :constant else :ident end
|
192
|
+
else
|
193
|
+
type = IDENT_KIND[match]
|
194
|
+
if type == :ident and match[/^[A-Z]/] and not match[/[!?]$/]
|
195
|
+
type = :constant
|
196
|
+
elsif type == :reserved
|
197
|
+
state = DEF_NEW_STATE[match]
|
198
|
+
end
|
199
|
+
end
|
200
|
+
## experimental!
|
201
|
+
fancy_allowed = regexp_allowed = :set if REGEXP_ALLOWED[match] or check(/\s+(?:%\S|\/\S)/)
|
202
|
+
|
203
|
+
# OPERATORS #
|
204
|
+
elsif (not last_token_dot and match = scan(/ ==?=? | \.\.?\.? | [\(\)\[\]\{\}] | :: | , /x)) or
|
205
|
+
(last_token_dot and match = scan(/#{METHOD_NAME_OPERATOR}/o))
|
206
|
+
if match !~ / [.\)\]\}] /x or match =~ /\.\.\.?/
|
186
207
|
regexp_allowed = fancy_allowed = :set
|
187
208
|
end
|
188
209
|
last_token_dot = :set if match == '.' or match == '::'
|
@@ -195,33 +216,22 @@ module CodeRay module Scanners
|
|
195
216
|
depth -= 1
|
196
217
|
if depth == 0
|
197
218
|
state, depth, heredocs = states.pop
|
198
|
-
|
219
|
+
tokens << [match, :delimiter]
|
220
|
+
type = :inline
|
221
|
+
match = :close
|
199
222
|
end
|
200
223
|
end
|
201
224
|
end
|
202
225
|
|
203
|
-
elsif match = scan(/#{METHOD_NAME}/o)
|
204
|
-
if last_token_dot
|
205
|
-
type = if match[/^[A-Z]/] then :constant else :ident end
|
206
|
-
else
|
207
|
-
type = IDENT_KIND[match]
|
208
|
-
if type == :ident and match[/^[A-Z]/]
|
209
|
-
type = :constant
|
210
|
-
elsif type == :reserved
|
211
|
-
state = DEF_NEW_STATE[match]
|
212
|
-
end
|
213
|
-
end
|
214
|
-
fancy_allowed = regexp_allowed = REGEXP_ALLOWED[match]
|
215
|
-
|
216
226
|
elsif match = scan(/ ['"] /mx)
|
217
227
|
tokens << [:open, :string]
|
218
228
|
type = :delimiter
|
219
|
-
state = StringState.new :string, match
|
229
|
+
state = StringState.new :string, match == '"', match # important for streaming
|
220
230
|
|
221
231
|
elsif match = scan(/#{INSTANCE_VARIABLE}/o)
|
222
232
|
type = :instance_variable
|
223
|
-
|
224
|
-
elsif regexp_allowed and match = scan(
|
233
|
+
|
234
|
+
elsif regexp_allowed and match = scan(/\//)
|
225
235
|
tokens << [:open, :regexp]
|
226
236
|
type = :delimiter
|
227
237
|
interpreted = true
|
@@ -232,15 +242,23 @@ module CodeRay module Scanners
|
|
232
242
|
end
|
233
243
|
|
234
244
|
elsif match = scan(/#{NUMERIC}/o)
|
235
|
-
type = if
|
245
|
+
type = if self[1] then :float else :integer end
|
236
246
|
|
237
|
-
elsif
|
238
|
-
case match[1]
|
247
|
+
elsif match = scan(/#{SYMBOL}/o)
|
248
|
+
case delim = match[1]
|
239
249
|
when ?', ?"
|
240
250
|
tokens << [:open, :symbol]
|
241
|
-
|
251
|
+
tokens << [':', :symbol]
|
252
|
+
match = delim.chr
|
253
|
+
type = :delimiter
|
254
|
+
state = StringState.new :symbol, delim == ?", match
|
255
|
+
else
|
256
|
+
type = :symbol
|
242
257
|
end
|
243
|
-
|
258
|
+
|
259
|
+
elsif match = scan(/ [-+!~^]=? | [*|&]{1,2}=? | >>? /x)
|
260
|
+
regexp_allowed = fancy_allowed = :set
|
261
|
+
type = :operator
|
244
262
|
|
245
263
|
elsif fancy_allowed and match = scan(/#{HEREDOC_OPEN}/o)
|
246
264
|
indented = self[1] == '-'
|
@@ -265,7 +283,7 @@ module CodeRay module Scanners
|
|
265
283
|
elsif fancy_allowed and match = scan(/#{CHARACTER}/o)
|
266
284
|
type = :integer
|
267
285
|
|
268
|
-
elsif match = scan(/ [
|
286
|
+
elsif match = scan(/ [\/%]=? | <(?:<|=>?)? | [?:;] /x)
|
269
287
|
regexp_allowed = fancy_allowed = :set
|
270
288
|
type = :operator
|
271
289
|
|
@@ -290,25 +308,55 @@ module CodeRay module Scanners
|
|
290
308
|
end
|
291
309
|
|
292
310
|
elsif state == :def_expected
|
293
|
-
|
311
|
+
state = :initial
|
312
|
+
if match = scan(/(?>#{METHOD_NAME_EX})(?!\.|::)/o)
|
294
313
|
type = :method
|
295
314
|
else
|
296
|
-
|
315
|
+
next
|
316
|
+
end
|
317
|
+
|
318
|
+
elsif state == :undef_expected
|
319
|
+
state = :undef_comma_expected
|
320
|
+
if match = scan(/#{METHOD_NAME_EX}/o)
|
321
|
+
type = :method
|
322
|
+
elsif match = scan(/#{SYMBOL}/o)
|
323
|
+
case delim = match[1]
|
324
|
+
when ?', ?"
|
325
|
+
tokens << [:open, :symbol]
|
326
|
+
tokens << [':', :symbol]
|
327
|
+
match = delim.chr
|
328
|
+
type = :delimiter
|
329
|
+
state = StringState.new :symbol, delim == ?", match
|
330
|
+
state.next_state = :undef_comma_expected
|
331
|
+
else
|
332
|
+
type = :symbol
|
333
|
+
end
|
334
|
+
else
|
335
|
+
state = :initial
|
336
|
+
next
|
337
|
+
end
|
338
|
+
|
339
|
+
elsif state == :undef_comma_expected
|
340
|
+
if match = scan(/,/)
|
341
|
+
type = :operator
|
342
|
+
state = :undef_expected
|
343
|
+
else
|
344
|
+
state = :initial
|
345
|
+
next
|
297
346
|
end
|
298
|
-
state = :initial
|
299
347
|
|
300
348
|
elsif state == :module_expected
|
301
349
|
if match = scan(/<</)
|
302
350
|
type = :operator
|
303
351
|
else
|
352
|
+
state = :initial
|
304
353
|
if match = scan(/ (?:#{IDENT}::)* #{IDENT} /ox)
|
305
354
|
type = :class
|
306
355
|
else
|
307
|
-
|
356
|
+
next
|
308
357
|
end
|
309
358
|
end
|
310
|
-
|
311
|
-
|
359
|
+
|
312
360
|
end
|
313
361
|
|
314
362
|
regexp_allowed = regexp_allowed == :set
|
@@ -316,7 +364,7 @@ module CodeRay module Scanners
|
|
316
364
|
last_token_dot = last_token_dot == :set
|
317
365
|
|
318
366
|
if $DEBUG
|
319
|
-
raise_inspect 'error token %p in line %d' % [
|
367
|
+
raise_inspect 'error token %p in line %d' % [[match, type], line], tokens if not type or type == :error
|
320
368
|
end
|
321
369
|
|
322
370
|
tokens << [match, type]
|
data/lib/coderay/tokens.rb
CHANGED
@@ -94,15 +94,14 @@ module CodeRay
|
|
94
94
|
false
|
95
95
|
end
|
96
96
|
|
97
|
-
alias :orig_each :each
|
98
97
|
# Iterates over all tokens.
|
99
98
|
#
|
100
99
|
# If a filter is given, only tokens of that kind are yielded.
|
101
100
|
def each kind_filter = nil, &block
|
102
101
|
unless kind_filter
|
103
|
-
|
102
|
+
super(&block)
|
104
103
|
else
|
105
|
-
|
104
|
+
super do |text, kind|
|
106
105
|
next unless kind == kind_filter
|
107
106
|
yield text, kind
|
108
107
|
end
|
@@ -115,7 +114,7 @@ module CodeRay
|
|
115
114
|
# Example:
|
116
115
|
# tokens.each_text_token { |text, kind| text.replace html_escape(text) }
|
117
116
|
def each_text_token
|
118
|
-
|
117
|
+
each do |text, kind|
|
119
118
|
next unless text.respond_to? :to_str
|
120
119
|
yield text, kind
|
121
120
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.10
|
|
3
3
|
specification_version: 1
|
4
4
|
name: coderay
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.4.
|
7
|
-
date: 2005-10-
|
6
|
+
version: 0.4.5.73
|
7
|
+
date: 2005-10-29
|
8
8
|
summary: CodeRay is a fast syntax highlighter engine for many languages.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -31,47 +31,50 @@ authors:
|
|
31
31
|
- murphy
|
32
32
|
files:
|
33
33
|
- "./lib/coderay.rb"
|
34
|
-
- "./lib/coderay/encoder.rb"
|
35
|
-
- "./lib/coderay/scanner.rb"
|
36
34
|
- "./lib/coderay/tokens.rb"
|
37
|
-
- "./lib/coderay/
|
35
|
+
- "./lib/coderay/scanner.rb"
|
36
|
+
- "./lib/coderay/encoder.rb"
|
37
|
+
- "./lib/coderay/encoders/xml.rb"
|
38
|
+
- "./lib/coderay/encoders/span.rb"
|
38
39
|
- "./lib/coderay/encoders/div.rb"
|
40
|
+
- "./lib/coderay/encoders/yaml.rb"
|
39
41
|
- "./lib/coderay/encoders/tokens.rb"
|
42
|
+
- "./lib/coderay/encoders/text.rb"
|
40
43
|
- "./lib/coderay/encoders/statistic.rb"
|
44
|
+
- "./lib/coderay/encoders/count.rb"
|
41
45
|
- "./lib/coderay/encoders/null.rb"
|
42
|
-
- "./lib/coderay/encoders/
|
46
|
+
- "./lib/coderay/encoders/debug.rb"
|
43
47
|
- "./lib/coderay/encoders/html.rb"
|
44
|
-
- "./lib/coderay/encoders/text.rb"
|
45
|
-
- "./lib/coderay/encoders/count.rb"
|
46
48
|
- "./lib/coderay/encoders/helpers/html_helper.rb"
|
47
|
-
- "./lib/coderay/encoders/helpers/html_output.rb"
|
48
49
|
- "./lib/coderay/encoders/helpers/html_css.rb"
|
49
|
-
- "./lib/coderay/helpers/
|
50
|
+
- "./lib/coderay/encoders/helpers/html_output.rb"
|
50
51
|
- "./lib/coderay/helpers/filetype.rb"
|
51
|
-
- "./lib/coderay/helpers/
|
52
|
+
- "./lib/coderay/helpers/plugin.rb"
|
52
53
|
- "./lib/coderay/helpers/scanner_helper.rb"
|
54
|
+
- "./lib/coderay/helpers/gzip_simple.rb"
|
53
55
|
- "./lib/coderay/scanners/c.rb"
|
54
56
|
- "./lib/coderay/scanners/delphi.rb"
|
55
57
|
- "./lib/coderay/scanners/plaintext.rb"
|
56
58
|
- "./lib/coderay/scanners/ruby.rb"
|
57
59
|
- "./lib/coderay/scanners/helpers/ruby_helper.rb"
|
58
60
|
- "./demo/demo_global_vars2.rb"
|
61
|
+
- "./demo/demo_stream2.rb"
|
62
|
+
- "./demo/demo_load_encoder.rb"
|
59
63
|
- "./demo/demo_encoder.rb"
|
60
64
|
- "./demo/demo_div.rb"
|
65
|
+
- "./demo/demo_html2.rb"
|
66
|
+
- "./demo/demo_css.rb"
|
61
67
|
- "./demo/demo_count.rb"
|
62
68
|
- "./demo/demo_simple.rb"
|
63
|
-
- "./demo/demo_tokens.rb"
|
64
|
-
- "./demo/demo_css.rb"
|
65
|
-
- "./demo/demo_html.rb"
|
66
|
-
- "./demo/demo_dump.rb"
|
67
|
-
- "./demo/demo_stream2.rb"
|
68
|
-
- "./demo/demo_load_encoder.rb"
|
69
|
-
- "./demo/demo_html2.rb"
|
70
69
|
- "./demo/demo_scanner.rb"
|
71
70
|
- "./demo/demo_stream.rb"
|
72
71
|
- "./demo/demo_global_vars.rb"
|
73
72
|
- "./demo/demo_more.rb"
|
73
|
+
- "./demo/demo_tokens.rb"
|
74
|
+
- "./demo/demo_html.rb"
|
75
|
+
- "./demo/demo_dump.rb"
|
74
76
|
- "./demo/demo_server.rb"
|
77
|
+
- "./demo/demo_highlight.rb"
|
75
78
|
- "./README"
|
76
79
|
- "./LICENSE"
|
77
80
|
test_files: []
|