coderay 0.7.1.147 → 0.7.2.165
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/bin/coderay +54 -56
- data/demo/suite.rb +54 -54
- data/lib/coderay.rb +187 -187
- data/lib/coderay/duo.rb +29 -29
- data/lib/coderay/encoder.rb +173 -173
- data/lib/coderay/encoders/_map.rb +8 -8
- data/lib/coderay/encoders/count.rb +21 -21
- data/lib/coderay/encoders/debug.rb +46 -46
- data/lib/coderay/encoders/div.rb +20 -20
- data/lib/coderay/encoders/html.rb +249 -245
- data/lib/coderay/encoders/html/classes.rb +73 -73
- data/lib/coderay/encoders/html/css.rb +65 -65
- data/lib/coderay/encoders/html/numerization.rb +122 -122
- data/lib/coderay/encoders/html/output.rb +195 -195
- data/lib/coderay/encoders/null.rb +26 -26
- data/lib/coderay/encoders/page.rb +21 -21
- data/lib/coderay/encoders/span.rb +20 -20
- data/lib/coderay/encoders/statistic.rb +81 -81
- data/lib/coderay/encoders/text.rb +33 -33
- data/lib/coderay/encoders/tokens.rb +44 -44
- data/lib/coderay/encoders/xml.rb +71 -71
- data/lib/coderay/encoders/yaml.rb +22 -22
- data/lib/coderay/helpers/filetype.rb +152 -153
- data/lib/coderay/helpers/gzip_simple.rb +67 -68
- data/lib/coderay/helpers/plugin.rb +297 -297
- data/lib/coderay/helpers/word_list.rb +46 -47
- data/lib/coderay/scanner.rb +238 -238
- data/lib/coderay/scanners/_map.rb +15 -14
- data/lib/coderay/scanners/c.rb +163 -155
- data/lib/coderay/scanners/delphi.rb +131 -129
- data/lib/coderay/scanners/html.rb +174 -167
- data/lib/coderay/scanners/nitro_xhtml.rb +130 -0
- data/lib/coderay/scanners/plaintext.rb +15 -15
- data/lib/coderay/scanners/rhtml.rb +73 -65
- data/lib/coderay/scanners/ruby.rb +404 -397
- data/lib/coderay/scanners/ruby/patterns.rb +216 -216
- data/lib/coderay/scanners/xml.rb +18 -18
- data/lib/coderay/style.rb +20 -20
- data/lib/coderay/styles/_map.rb +3 -3
- data/lib/coderay/styles/cycnus.rb +18 -18
- data/lib/coderay/styles/murphy.rb +18 -18
- data/lib/coderay/tokens.rb +322 -322
- metadata +86 -86
- data/lib/coderay/scanners/nitro_html.rb +0 -125
- data/lib/coderay/scanners/yaml.rb +0 -85
@@ -1,46 +1,46 @@
|
|
1
|
-
module CodeRay
|
2
|
-
module Encoders
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
end
|
46
|
-
end
|
1
|
+
module CodeRay
|
2
|
+
module Encoders
|
3
|
+
|
4
|
+
# = Debug Encoder
|
5
|
+
#
|
6
|
+
# Fast encoder producing simple debug output.
|
7
|
+
#
|
8
|
+
# It is readable and diff-able and is used for testing.
|
9
|
+
#
|
10
|
+
# You cannot fully restore the tokens information from the
|
11
|
+
# output, because consecutive :space tokens are merged.
|
12
|
+
# Use Tokens#dump for caching purposes.
|
13
|
+
class Debug < Encoder
|
14
|
+
|
15
|
+
include Streamable
|
16
|
+
register_for :debug
|
17
|
+
|
18
|
+
FILE_EXTENSION = 'raydebug'
|
19
|
+
|
20
|
+
protected
|
21
|
+
def text_token text, kind
|
22
|
+
@out <<
|
23
|
+
if kind == :space
|
24
|
+
text
|
25
|
+
else
|
26
|
+
text = text.gsub(/[)\\]/, '\\\\\0')
|
27
|
+
"#{kind}(#{text})"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def block_token action, kind
|
32
|
+
@out << super
|
33
|
+
end
|
34
|
+
|
35
|
+
def open_token kind
|
36
|
+
"#{kind}<"
|
37
|
+
end
|
38
|
+
|
39
|
+
def close_token kind
|
40
|
+
">"
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
data/lib/coderay/encoders/div.rb
CHANGED
@@ -1,20 +1,20 @@
|
|
1
|
-
module CodeRay
|
2
|
-
module Encoders
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
end
|
20
|
-
end
|
1
|
+
module CodeRay
|
2
|
+
module Encoders
|
3
|
+
|
4
|
+
load :html
|
5
|
+
|
6
|
+
class Div < HTML
|
7
|
+
|
8
|
+
FILE_EXTENSION = 'div.html'
|
9
|
+
|
10
|
+
register_for :div
|
11
|
+
|
12
|
+
DEFAULT_OPTIONS = HTML::DEFAULT_OPTIONS.merge({
|
13
|
+
:css => :style,
|
14
|
+
:wrap => :div,
|
15
|
+
})
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -1,245 +1,249 @@
|
|
1
|
-
module CodeRay
|
2
|
-
module Encoders
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
end
|
245
|
-
|
1
|
+
module CodeRay
|
2
|
+
module Encoders
|
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: nil
|
40
|
+
#
|
41
|
+
# === :line_numbers
|
42
|
+
# Include line numbers in :table, :inline, :list 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), :info_long (with full path) or :debug (via inspect).
|
59
|
+
#
|
60
|
+
# Default: false
|
61
|
+
class HTML < Encoder
|
62
|
+
|
63
|
+
include Streamable
|
64
|
+
register_for :html
|
65
|
+
|
66
|
+
FILE_EXTENSION = 'html'
|
67
|
+
|
68
|
+
DEFAULT_OPTIONS = {
|
69
|
+
:tab_width => 8,
|
70
|
+
|
71
|
+
:level => :xhtml,
|
72
|
+
:css => :class,
|
73
|
+
|
74
|
+
:style => :cycnus,
|
75
|
+
|
76
|
+
:wrap => nil,
|
77
|
+
|
78
|
+
:line_numbers => nil,
|
79
|
+
:line_number_start => 1,
|
80
|
+
:bold_every => 10,
|
81
|
+
|
82
|
+
:hint => false,
|
83
|
+
}
|
84
|
+
|
85
|
+
helper :classes, :output, :css
|
86
|
+
|
87
|
+
attr_reader :css
|
88
|
+
|
89
|
+
protected
|
90
|
+
|
91
|
+
HTML_ESCAPE = { #:nodoc:
|
92
|
+
'&' => '&',
|
93
|
+
'"' => '"',
|
94
|
+
'>' => '>',
|
95
|
+
'<' => '<',
|
96
|
+
}
|
97
|
+
|
98
|
+
# This was to prevent illegal HTML.
|
99
|
+
# Strange chars should still be avoided in codes.
|
100
|
+
evil_chars = Array(0x00...0x20) - [?\n, ?\t, ?\s]
|
101
|
+
evil_chars.each { |i| HTML_ESCAPE[i.chr] = ' ' }
|
102
|
+
#ansi_chars = Array(0x7f..0xff)
|
103
|
+
#ansi_chars.each { |i| HTML_ESCAPE[i.chr] = '&#%d;' % i }
|
104
|
+
# \x9 (\t) and \xA (\n) not included
|
105
|
+
#HTML_ESCAPE_PATTERN = /[\t&"><\0-\x8\xB-\x1f\x7f-\xff]/
|
106
|
+
HTML_ESCAPE_PATTERN = /[\t"&><\0-\x8\xB-\x1f]/
|
107
|
+
|
108
|
+
TOKEN_KIND_TO_INFO = Hash.new { |h, kind|
|
109
|
+
h[kind] =
|
110
|
+
case kind
|
111
|
+
when :pre_constant
|
112
|
+
'Predefined constant'
|
113
|
+
else
|
114
|
+
kind.to_s.gsub(/_/, ' ').gsub(/\b\w/) { $&.capitalize }
|
115
|
+
end
|
116
|
+
}
|
117
|
+
|
118
|
+
# Generate a hint about the given +classes+ in a +hint+ style.
|
119
|
+
#
|
120
|
+
# +hint+ may be :info, :info_long or :debug.
|
121
|
+
def self.token_path_to_hint hint, classes
|
122
|
+
return '' unless hint
|
123
|
+
title =
|
124
|
+
case hint
|
125
|
+
when :info
|
126
|
+
TOKEN_KIND_TO_INFO[classes.first]
|
127
|
+
when :info_long
|
128
|
+
classes.reverse.map { |kind| TOKEN_KIND_TO_INFO[kind] }.join('/')
|
129
|
+
when :debug
|
130
|
+
classes.inspect
|
131
|
+
end
|
132
|
+
" title=\"#{title}\""
|
133
|
+
end
|
134
|
+
|
135
|
+
def setup options
|
136
|
+
super
|
137
|
+
|
138
|
+
@HTML_ESCAPE = HTML_ESCAPE.dup
|
139
|
+
@HTML_ESCAPE["\t"] = ' ' * options[:tab_width]
|
140
|
+
|
141
|
+
@opened = [nil]
|
142
|
+
@css = CSS.new options[:style]
|
143
|
+
|
144
|
+
hint = options[:hint]
|
145
|
+
if hint and not [:debug, :info, :info_long].include? hint
|
146
|
+
raise ArgumentError, "Unknown value %p for :hint; expected :info, :debug, false or nil." % hint
|
147
|
+
end
|
148
|
+
|
149
|
+
case options[:css]
|
150
|
+
|
151
|
+
when :class
|
152
|
+
@css_style = Hash.new do |h, k|
|
153
|
+
if k.is_a? Array
|
154
|
+
type = k.first
|
155
|
+
else
|
156
|
+
type = k
|
157
|
+
end
|
158
|
+
c = ClassOfKind[type]
|
159
|
+
if c == :NO_HIGHLIGHT and not hint
|
160
|
+
h[k] = false
|
161
|
+
else
|
162
|
+
title = HTML.token_path_to_hint hint, (k[1..-1] << k.first)
|
163
|
+
h[k] = '<span%s class="%s">' % [title, c]
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
when :style
|
168
|
+
@css_style = Hash.new do |h, k|
|
169
|
+
if k.is_a? Array
|
170
|
+
styles = k.dup
|
171
|
+
else
|
172
|
+
styles = [k]
|
173
|
+
end
|
174
|
+
type = styles.first
|
175
|
+
classes = styles.map { |c| ClassOfKind[c] }
|
176
|
+
if classes.first == :NO_HIGHLIGHT and not hint
|
177
|
+
h[k] = false
|
178
|
+
else
|
179
|
+
styles.shift if [:delimiter, :modifier, :content, :escape].include? styles.first
|
180
|
+
title = HTML.token_path_to_hint hint, styles
|
181
|
+
classes.delete 'il'
|
182
|
+
style = @css[*classes]
|
183
|
+
h[k] =
|
184
|
+
if style
|
185
|
+
'<span%s style="%s">' % [title, style]
|
186
|
+
else
|
187
|
+
false
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
else
|
193
|
+
raise ArgumentError, "Unknown value %p for :css." % options[:css]
|
194
|
+
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
def finish options
|
199
|
+
not_needed = @opened.shift
|
200
|
+
@out << '</span>' * @opened.size
|
201
|
+
warn '%d tokens still open: %p' % [@opened.size, @opened] unless @opened.empty?
|
202
|
+
|
203
|
+
@out.extend Output
|
204
|
+
@out.css = @css
|
205
|
+
@out.numerize! options[:line_numbers], options
|
206
|
+
@out.wrap! options[:wrap]
|
207
|
+
|
208
|
+
super
|
209
|
+
end
|
210
|
+
|
211
|
+
def token text, type
|
212
|
+
if text.is_a? ::String
|
213
|
+
if text =~ /#{HTML_ESCAPE_PATTERN}/o
|
214
|
+
text = text.gsub(/#{HTML_ESCAPE_PATTERN}/o) { |m| @HTML_ESCAPE[m] }
|
215
|
+
end
|
216
|
+
@opened[0] = type
|
217
|
+
if style = @css_style[@opened]
|
218
|
+
@out << style << text << '</span>'
|
219
|
+
else
|
220
|
+
@out << text
|
221
|
+
end
|
222
|
+
else
|
223
|
+
case text
|
224
|
+
when :open
|
225
|
+
@opened[0] = type
|
226
|
+
@out << (@css_style[@opened] || '<span>')
|
227
|
+
@opened << type
|
228
|
+
when :close
|
229
|
+
if @opened.empty?
|
230
|
+
# nothing to close
|
231
|
+
else
|
232
|
+
if @opened.size == 1 or @opened.last != type
|
233
|
+
raise 'Malformed token stream: Trying to close a token (%p) that is not open. Open are: %p.' % [type, @opened[1..-1]] if $DEBUG
|
234
|
+
end
|
235
|
+
@out << '</span>'
|
236
|
+
@opened.pop
|
237
|
+
end
|
238
|
+
when nil
|
239
|
+
raise 'Token with nil as text was given: %p' % [[text, type]]
|
240
|
+
else
|
241
|
+
raise 'unknown token kind: %p' % text
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
end
|
247
|
+
|
248
|
+
end
|
249
|
+
end
|