coderay 0.5.0.121 → 0.7.1.147
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/FOLDERS +53 -0
- data/README +21 -13
- data/bin/coderay +79 -0
- data/demo/demo_cache.rb +12 -0
- data/demo/demo_html_list.rb +12 -0
- data/lib/coderay.rb +11 -2
- data/lib/coderay/duo.rb +29 -0
- data/lib/coderay/encoder.rb +4 -4
- data/lib/coderay/encoders/_map.rb +6 -6
- data/lib/coderay/encoders/count.rb +3 -3
- data/lib/coderay/encoders/debug.rb +38 -30
- data/lib/coderay/encoders/div.rb +4 -2
- data/lib/coderay/encoders/html.rb +9 -19
- data/lib/coderay/encoders/html/classes.rb +5 -2
- data/lib/coderay/encoders/html/css.rb +5 -6
- data/lib/coderay/encoders/html/numerization.rb +28 -18
- data/lib/coderay/encoders/html/output.rb +4 -4
- data/lib/coderay/encoders/null.rb +16 -16
- data/lib/coderay/encoders/page.rb +21 -0
- data/lib/coderay/encoders/span.rb +6 -3
- data/lib/coderay/encoders/statistic.rb +4 -2
- data/lib/coderay/encoders/tokens.rb +35 -35
- data/lib/coderay/encoders/xml.rb +53 -52
- data/lib/coderay/encoders/yaml.rb +13 -10
- data/lib/coderay/helpers/filetype.rb +41 -5
- data/lib/coderay/helpers/gzip_simple.rb +1 -1
- data/lib/coderay/helpers/plugin.rb +33 -17
- data/lib/coderay/scanner.rb +60 -19
- data/lib/coderay/scanners/_map.rb +12 -8
- data/lib/coderay/scanners/c.rb +16 -8
- data/lib/coderay/scanners/delphi.rb +9 -3
- data/lib/coderay/scanners/html.rb +167 -0
- data/lib/coderay/scanners/nitro_html.rb +125 -0
- data/lib/coderay/scanners/plaintext.rb +4 -2
- data/lib/coderay/scanners/rhtml.rb +65 -0
- data/lib/coderay/scanners/ruby.rb +51 -39
- data/lib/coderay/scanners/ruby/patterns.rb +12 -9
- data/lib/coderay/scanners/xml.rb +18 -0
- data/lib/coderay/scanners/yaml.rb +85 -0
- data/lib/coderay/styles/_map.rb +7 -0
- data/lib/coderay/styles/cycnus.rb +105 -99
- data/lib/coderay/styles/murphy.rb +18 -18
- metadata +19 -6
@@ -1,19 +1,22 @@
|
|
1
1
|
module CodeRay
|
2
|
-
|
2
|
+
module Encoders
|
3
3
|
|
4
|
-
|
4
|
+
# = YAML Encoder
|
5
|
+
#
|
6
|
+
# Slow.
|
7
|
+
class YAML < Encoder
|
5
8
|
|
6
|
-
|
9
|
+
register_for :yaml
|
7
10
|
|
8
|
-
|
9
|
-
|
10
|
-
protected
|
11
|
-
def compile tokens, options
|
12
|
-
require 'yaml'
|
13
|
-
@out = tokens.to_a.to_yaml
|
14
|
-
end
|
11
|
+
FILE_EXTENSION = 'yaml'
|
15
12
|
|
13
|
+
protected
|
14
|
+
def compile tokens, options
|
15
|
+
require 'yaml'
|
16
|
+
@out = tokens.to_a.to_yaml
|
16
17
|
end
|
17
18
|
|
18
19
|
end
|
20
|
+
|
21
|
+
end
|
19
22
|
end
|
@@ -6,16 +6,29 @@
|
|
6
6
|
#
|
7
7
|
# Version: 0.1 (2005.september.1)
|
8
8
|
#
|
9
|
-
# ==Documentation
|
10
|
-
#
|
11
|
-
# TODO
|
9
|
+
# == Documentation
|
12
10
|
#
|
11
|
+
# # determine the type of the given
|
12
|
+
# lang = FileType[ARGV.first]
|
13
|
+
#
|
14
|
+
# # return :plaintext if the file type is unknown
|
15
|
+
# lang = FileType.fetch ARGV.first, :plaintext
|
16
|
+
#
|
17
|
+
# # try the shebang line, too
|
18
|
+
# lang = FileType.fetch ARGV.first, :plaintext, true
|
19
|
+
#
|
13
20
|
module FileType
|
14
21
|
|
15
22
|
UnknownFileType = Class.new Exception
|
16
23
|
|
17
24
|
class << self
|
18
25
|
|
26
|
+
# Try to determine the file type of the file.
|
27
|
+
#
|
28
|
+
# +filename+ is a relative or absolute path to a file.
|
29
|
+
#
|
30
|
+
# The file itself is only accessed when +read_shebang+ is set to true.
|
31
|
+
# That means you can get filetypes from files that don't exist.
|
19
32
|
def [] filename, read_shebang = false
|
20
33
|
name = File.basename filename
|
21
34
|
ext = File.extname name
|
@@ -43,6 +56,9 @@ module FileType
|
|
43
56
|
end
|
44
57
|
|
45
58
|
# This works like Hash#fetch.
|
59
|
+
#
|
60
|
+
# If the filetype cannot be found, the +default+ value
|
61
|
+
# is returned.
|
46
62
|
def fetch filename, default = nil, read_shebang = false
|
47
63
|
if default and block_given?
|
48
64
|
warn 'block supersedes default value argument'
|
@@ -61,12 +77,17 @@ module FileType
|
|
61
77
|
TypeFromExt = {
|
62
78
|
'rb' => :ruby,
|
63
79
|
'rbw' => :ruby,
|
64
|
-
'
|
80
|
+
'rake' => :ruby,
|
81
|
+
'cpp' => :c,
|
65
82
|
'c' => :c,
|
66
83
|
'h' => :c,
|
67
84
|
'xml' => :xml,
|
68
85
|
'htm' => :html,
|
69
86
|
'html' => :html,
|
87
|
+
'xhtml' => :xhtml,
|
88
|
+
'rhtml' => :rhtml,
|
89
|
+
'yaml' => :yaml,
|
90
|
+
'yml' => :yaml,
|
70
91
|
}
|
71
92
|
|
72
93
|
TypeFromShebang = /\b(?:ruby|perl|python|sh)\b/
|
@@ -80,7 +101,7 @@ end
|
|
80
101
|
|
81
102
|
if $0 == __FILE__
|
82
103
|
$VERBOSE = true
|
83
|
-
|
104
|
+
eval DATA.read, nil, $0, __LINE__+4
|
84
105
|
end
|
85
106
|
|
86
107
|
__END__
|
@@ -118,6 +139,7 @@ class TC_FileType < Test::Unit::TestCase
|
|
118
139
|
assert_equal :ruby, FileType['C:\\Program Files\\x\\y\\c\\test.rbw']
|
119
140
|
assert_equal :ruby, FileType['/usr/bin/something/Rakefile']
|
120
141
|
assert_equal :ruby, FileType['~/myapp/gem/Rantfile']
|
142
|
+
assert_equal :ruby, FileType['./lib/tasks\repository.rake']
|
121
143
|
assert_not_equal :ruby, FileType['test_rb']
|
122
144
|
assert_not_equal :ruby, FileType['Makefile']
|
123
145
|
assert_not_equal :ruby, FileType['set.rb/set']
|
@@ -133,6 +155,20 @@ class TC_FileType < Test::Unit::TestCase
|
|
133
155
|
assert_not_equal :c, FileType['~/projects/blabla/c']
|
134
156
|
end
|
135
157
|
|
158
|
+
def test_html
|
159
|
+
assert_equal :html, FileType['test.htm']
|
160
|
+
assert_equal :xhtml, FileType['test.xhtml']
|
161
|
+
assert_equal :xhtml, FileType['test.html.xhtml']
|
162
|
+
assert_equal :rhtml, FileType['_form.rhtml']
|
163
|
+
end
|
164
|
+
|
165
|
+
def test_yaml
|
166
|
+
assert_equal :yaml, FileType['test.yml']
|
167
|
+
assert_equal :yaml, FileType['test.yaml']
|
168
|
+
assert_equal :yaml, FileType['my.html.yaml']
|
169
|
+
assert_not_equal :yaml, FileType['YAML']
|
170
|
+
end
|
171
|
+
|
136
172
|
def test_shebang
|
137
173
|
dir = './test'
|
138
174
|
if File.directory? dir
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# = PluginHost
|
2
2
|
#
|
3
|
-
# $Id: plugin.rb
|
3
|
+
# $Id: plugin.rb 143 2006-06-28 23:05:18Z murphy $
|
4
4
|
#
|
5
5
|
# A simple subclass plugin system.
|
6
6
|
#
|
@@ -56,7 +56,6 @@ module PluginHost
|
|
56
56
|
|
57
57
|
def require_helper plugin_id, helper_name
|
58
58
|
path = path_to File.join(plugin_id, helper_name)
|
59
|
-
#$stderr.puts 'Loading helper: ' + path
|
60
59
|
require path
|
61
60
|
end
|
62
61
|
|
@@ -125,6 +124,20 @@ module PluginHost
|
|
125
124
|
end
|
126
125
|
end
|
127
126
|
|
127
|
+
# Define the default plugin to use when no plugin is found
|
128
|
+
# for a given id.
|
129
|
+
#
|
130
|
+
# See also map.
|
131
|
+
#
|
132
|
+
# class MyColorHost < PluginHost
|
133
|
+
# map :navy => :dark_blue
|
134
|
+
# default :gray
|
135
|
+
# end
|
136
|
+
def default id
|
137
|
+
id = validate_id id
|
138
|
+
plugin_hash[nil] = id
|
139
|
+
end
|
140
|
+
|
128
141
|
# Every plugin must register itself for one or more
|
129
142
|
# +ids+ by calling register_for, which calls this method.
|
130
143
|
#
|
@@ -144,6 +157,17 @@ module PluginHost
|
|
144
157
|
@plugin_hash ||= create_plugin_hash
|
145
158
|
end
|
146
159
|
|
160
|
+
# Returns an array of all .rb files in the plugin path.
|
161
|
+
#
|
162
|
+
# The extension .rb is not included.
|
163
|
+
def all_plugin_names
|
164
|
+
Dir[path_to('*')].select do |file|
|
165
|
+
File.basename(file)[/^(?!_)\w+\.rb$/]
|
166
|
+
end.map do |file|
|
167
|
+
File.basename file, '.rb'
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
147
171
|
protected
|
148
172
|
# Created a new plugin list and stores it to @plugin_hash.
|
149
173
|
def create_plugin_hash
|
@@ -152,10 +176,13 @@ protected
|
|
152
176
|
id = validate_id(plugin_id)
|
153
177
|
path = path_to id
|
154
178
|
begin
|
155
|
-
#$stderr.puts 'Loading plugin: ' + path if $DEBUG
|
156
179
|
require path
|
157
180
|
rescue LoadError => boom
|
158
|
-
|
181
|
+
if h.has_key? nil # default plugin
|
182
|
+
h[id] = h[nil]
|
183
|
+
else
|
184
|
+
raise PluginNotFound, 'Could not load plugin %p: %s' % [id, boom]
|
185
|
+
end
|
159
186
|
else
|
160
187
|
# Plugin should have registered by now
|
161
188
|
unless h.has_key? id
|
@@ -188,17 +215,6 @@ protected
|
|
188
215
|
end
|
189
216
|
end
|
190
217
|
|
191
|
-
# Returns an array of all .rb files in the plugin path.
|
192
|
-
#
|
193
|
-
# The extension .rb is not included.
|
194
|
-
def all_plugin_names
|
195
|
-
Dir[path_to('*')].select do |file|
|
196
|
-
File.basename(file)[/^(?!_)\w+\.rb$/]
|
197
|
-
end.map do |file|
|
198
|
-
File.basename file, '.rb'
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
218
|
# Returns the Plugin for +id+.
|
203
219
|
# Use it like Hash#fetch.
|
204
220
|
#
|
@@ -208,7 +224,7 @@ protected
|
|
208
224
|
plugin_hash.fetch validate_id(id), *args, &blk
|
209
225
|
end
|
210
226
|
|
211
|
-
# Returns the path to the
|
227
|
+
# Returns the expected path to the plugin file for the given id.
|
212
228
|
def path_to plugin_id
|
213
229
|
File.join plugin_path, "#{plugin_id}.rb"
|
214
230
|
end
|
@@ -219,7 +235,7 @@ protected
|
|
219
235
|
# Raises +ArgumentError+ for all other objects, or if the
|
220
236
|
# given String includes non-alphanumeric characters (\W).
|
221
237
|
def validate_id id
|
222
|
-
if id.is_a? Symbol
|
238
|
+
if id.is_a? Symbol or id.nil?
|
223
239
|
id
|
224
240
|
elsif id.is_a? String
|
225
241
|
if id[/\w+/] == id
|
data/lib/coderay/scanner.rb
CHANGED
@@ -4,7 +4,7 @@ module CodeRay
|
|
4
4
|
|
5
5
|
# = Scanners
|
6
6
|
#
|
7
|
-
# $Id: scanner.rb
|
7
|
+
# $Id: scanner.rb 143 2006-06-28 23:05:18Z murphy $
|
8
8
|
#
|
9
9
|
# This module holds the Scanner class and its subclasses.
|
10
10
|
# For example, the Ruby scanner is named CodeRay::Scanners::Ruby
|
@@ -65,6 +65,10 @@ module CodeRay
|
|
65
65
|
is_a? Streamable
|
66
66
|
end
|
67
67
|
|
68
|
+
def normify code
|
69
|
+
code = code.to_s.to_unix
|
70
|
+
end
|
71
|
+
|
68
72
|
end
|
69
73
|
|
70
74
|
=begin
|
@@ -91,44 +95,59 @@ module CodeRay
|
|
91
95
|
# TokenStream with the +block+ as callback to handle the tokens.
|
92
96
|
#
|
93
97
|
# Else, a Tokens object is used.
|
94
|
-
def initialize code, options = {}, &block
|
98
|
+
def initialize code='', options = {}, &block
|
95
99
|
@options = self.class::DEFAULT_OPTIONS.merge options
|
96
100
|
raise "I am only the basic Scanner class. I can't scan "\
|
97
101
|
"anything. :( Use my subclasses." if self.class == Scanner
|
98
102
|
|
99
|
-
|
100
|
-
# all dos/unix/mac newline problems.
|
101
|
-
super code.gsub(/\r\n?/, "\n")
|
103
|
+
super Scanner.normify(code)
|
102
104
|
|
105
|
+
@tokens = options[:tokens]
|
103
106
|
if @options[:stream]
|
104
107
|
warn "warning in CodeRay::Scanner.new: :stream is set, "\
|
105
108
|
"but no block was given" unless block_given?
|
106
109
|
raise NotStreamableError, self unless kind_of? Streamable
|
107
|
-
@tokens
|
110
|
+
@tokens ||= TokenStream.new(&block)
|
108
111
|
else
|
109
112
|
warn "warning in CodeRay::Scanner.new: Block given, "\
|
110
113
|
"but :stream is #{@options[:stream]}" if block_given?
|
111
|
-
@tokens
|
114
|
+
@tokens ||= Tokens.new
|
112
115
|
end
|
116
|
+
|
117
|
+
setup
|
113
118
|
end
|
114
119
|
|
115
120
|
# More mnemonic accessor name for the input string.
|
116
121
|
alias code string
|
117
122
|
|
123
|
+
def reset
|
124
|
+
super
|
125
|
+
reset_instance
|
126
|
+
end
|
127
|
+
|
128
|
+
def string= code
|
129
|
+
code = Scanner.normify(code)
|
130
|
+
super code
|
131
|
+
reset_instance
|
132
|
+
end
|
133
|
+
|
118
134
|
# Scans the code and returns all tokens in a Tokens object.
|
119
|
-
def tokenize options = {}
|
120
|
-
options = @options.merge(
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
135
|
+
def tokenize new_string=nil, options = {}
|
136
|
+
options = @options.merge(options)
|
137
|
+
self.string = new_string if new_string
|
138
|
+
@cached_tokens =
|
139
|
+
if @options[:stream] # :stream must have been set already
|
140
|
+
reset unless new_string
|
141
|
+
scan_tokens @tokens, options
|
142
|
+
@tokens
|
143
|
+
else
|
144
|
+
scan_tokens @tokens, options
|
145
|
+
end
|
128
146
|
end
|
129
147
|
|
130
|
-
|
131
|
-
|
148
|
+
def tokens
|
149
|
+
@cached_tokens ||= tokenize
|
150
|
+
end
|
132
151
|
|
133
152
|
# Traverses the tokens.
|
134
153
|
def each &block
|
@@ -148,6 +167,14 @@ module CodeRay
|
|
148
167
|
|
149
168
|
protected
|
150
169
|
|
170
|
+
# Can be implemented by subclasses to do some initialization
|
171
|
+
# that has to be done once per instance.
|
172
|
+
#
|
173
|
+
# Use reset for initialization that has to be done once per
|
174
|
+
# scan.
|
175
|
+
def setup
|
176
|
+
end
|
177
|
+
|
151
178
|
# This is the central method, and commonly the only one a
|
152
179
|
# subclass implements.
|
153
180
|
#
|
@@ -158,6 +185,11 @@ module CodeRay
|
|
158
185
|
"#{self.class}#scan_tokens not implemented."
|
159
186
|
end
|
160
187
|
|
188
|
+
def reset_instance
|
189
|
+
@tokens.clear unless @options[:keep_tokens]
|
190
|
+
@cached_tokens = nil
|
191
|
+
end
|
192
|
+
|
161
193
|
# Scanner error with additional status information
|
162
194
|
def raise_inspect msg, tokens, ambit = 30
|
163
195
|
raise ScanError, <<-EOE % [
|
@@ -194,4 +226,13 @@ surrounding code:
|
|
194
226
|
end
|
195
227
|
end
|
196
228
|
|
197
|
-
|
229
|
+
class String
|
230
|
+
# I love this hack. It seems to silence all dos/unix/mac newline problems.
|
231
|
+
def to_unix
|
232
|
+
if index ?\r
|
233
|
+
gsub(/\r\n?/, "\n")
|
234
|
+
else
|
235
|
+
self
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
@@ -1,10 +1,14 @@
|
|
1
1
|
module CodeRay
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
2
|
+
module Scanners
|
3
|
+
|
4
|
+
map :cpp => :c,
|
5
|
+
:plain => :plaintext,
|
6
|
+
:pascal => :delphi,
|
7
|
+
:irb => :ruby,
|
8
|
+
:xml => :html,
|
9
|
+
:xhtml => :nitro_html
|
10
|
+
|
11
|
+
default :plain
|
12
|
+
|
13
|
+
end
|
10
14
|
end
|
data/lib/coderay/scanners/c.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
module CodeRay
|
1
|
+
module CodeRay
|
2
|
+
module Scanners
|
2
3
|
|
3
4
|
class C < Scanner
|
4
5
|
|
@@ -42,7 +43,9 @@ module CodeRay module Scanners
|
|
42
43
|
kind = :error
|
43
44
|
match = nil
|
44
45
|
|
45
|
-
|
46
|
+
case state
|
47
|
+
|
48
|
+
when :initial
|
46
49
|
|
47
50
|
if scan(/ \s+ | \\\n /x)
|
48
51
|
kind = :space
|
@@ -96,7 +99,7 @@ module CodeRay module Scanners
|
|
96
99
|
getch
|
97
100
|
end
|
98
101
|
|
99
|
-
|
102
|
+
when :string
|
100
103
|
if scan(/[^\\"]+/)
|
101
104
|
kind = :content
|
102
105
|
elsif scan(/"/)
|
@@ -110,10 +113,10 @@ module CodeRay module Scanners
|
|
110
113
|
kind = :error
|
111
114
|
state = :initial
|
112
115
|
else
|
113
|
-
|
116
|
+
raise_inspect "else case \" reached; %p not handled." % peek(1), tokens
|
114
117
|
end
|
115
118
|
|
116
|
-
|
119
|
+
when :include_expected
|
117
120
|
if scan(/<[^>\n]+>?|"[^"\n\\]*(?:\\.[^"\n\\]*)*"?/)
|
118
121
|
kind = :include
|
119
122
|
state = :initial
|
@@ -128,12 +131,16 @@ module CodeRay module Scanners
|
|
128
131
|
end
|
129
132
|
|
130
133
|
else
|
131
|
-
|
134
|
+
raise_inspect 'Unknown state', tokens
|
132
135
|
|
133
136
|
end
|
134
137
|
|
135
138
|
match ||= matched
|
136
|
-
|
139
|
+
if $DEBUG and (not kind or kind == :error)
|
140
|
+
raise_inspect 'Error token %p in line %d' %
|
141
|
+
[[match, kind], line], tokens
|
142
|
+
end
|
143
|
+
raise_inspect 'Empty token', tokens unless match
|
137
144
|
|
138
145
|
tokens << [match, kind]
|
139
146
|
|
@@ -144,4 +151,5 @@ module CodeRay module Scanners
|
|
144
151
|
|
145
152
|
end
|
146
153
|
|
147
|
-
end
|
154
|
+
end
|
155
|
+
end
|