coderay 0.8.357 → 0.9.1
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/lib/README +4 -3
- data/lib/coderay.rb +2 -1
- data/lib/coderay/encoder.rb +41 -15
- data/lib/coderay/encoders/_map.rb +3 -1
- data/lib/coderay/encoders/comment_filter.rb +43 -0
- data/lib/coderay/encoders/div.rb +2 -3
- data/lib/coderay/encoders/filter.rb +75 -0
- data/lib/coderay/encoders/html.rb +20 -3
- data/lib/coderay/encoders/html/css.rb +1 -1
- data/lib/coderay/encoders/html/numerization.rb +11 -2
- data/lib/coderay/encoders/html/output.rb +10 -1
- data/lib/coderay/encoders/json.rb +69 -0
- data/lib/coderay/encoders/lines_of_code.rb +90 -0
- data/lib/coderay/encoders/page.rb +1 -2
- data/lib/coderay/encoders/span.rb +2 -3
- data/lib/coderay/encoders/term.rb +137 -0
- data/lib/coderay/encoders/text.rb +4 -4
- data/lib/coderay/encoders/token_class_filter.rb +84 -0
- data/lib/coderay/encoders/xml.rb +1 -0
- data/lib/coderay/for_redcloth.rb +9 -4
- data/lib/coderay/helpers/file_type.rb +54 -15
- data/lib/coderay/helpers/plugin.rb +21 -3
- data/lib/coderay/helpers/word_list.rb +19 -4
- data/lib/coderay/scanner.rb +33 -2
- data/lib/coderay/scanners/_map.rb +10 -4
- data/lib/coderay/scanners/c.rb +61 -23
- data/lib/coderay/scanners/cpp.rb +228 -0
- data/lib/coderay/scanners/css.rb +9 -1
- data/lib/coderay/scanners/debug.rb +1 -0
- data/lib/coderay/scanners/delphi.rb +2 -2
- data/lib/coderay/scanners/diff.rb +1 -0
- data/lib/coderay/scanners/groovy.rb +263 -0
- data/lib/coderay/scanners/html.rb +9 -2
- data/lib/coderay/scanners/java.rb +18 -14
- data/lib/coderay/scanners/java_script.rb +42 -13
- data/lib/coderay/scanners/json.rb +7 -1
- data/lib/coderay/scanners/nitro_xhtml.rb +4 -0
- data/lib/coderay/scanners/php.rb +526 -0
- data/lib/coderay/scanners/plaintext.rb +4 -1
- data/lib/coderay/scanners/python.rb +285 -0
- data/lib/coderay/scanners/rhtml.rb +3 -0
- data/lib/coderay/scanners/ruby.rb +29 -11
- data/lib/coderay/scanners/ruby/patterns.rb +26 -20
- data/lib/coderay/scanners/scheme.rb +3 -0
- data/lib/coderay/scanners/sql.rb +162 -0
- data/lib/coderay/scanners/xml.rb +1 -1
- data/lib/coderay/scanners/yaml.rb +4 -1
- data/lib/coderay/styles/cycnus.rb +11 -7
- data/lib/coderay/token_classes.rb +4 -1
- data/lib/coderay/tokens.rb +50 -46
- metadata +14 -4
- data/lib/coderay/encoders/tokens.rb +0 -44
data/lib/README
CHANGED
@@ -18,7 +18,7 @@ And with line numbers.
|
|
18
18
|
* is what everybody should have on their website
|
19
19
|
* solves all your problems and makes the girls run after you
|
20
20
|
|
21
|
-
Version: 0.
|
21
|
+
Version: 0.9.1
|
22
22
|
Author:: murphy (Kornelius Kalnbach)
|
23
23
|
Contact:: murphy rubychan de
|
24
24
|
Website:: coderay.rubychan.de[http://coderay.rubychan.de]
|
@@ -88,10 +88,11 @@ Please report errors in this documentation to <murphy rubychan de>.
|
|
88
88
|
* Jeremy Hinegardner for finding the shebang-on-empty-file bug in FileType.
|
89
89
|
* Charles Oliver Nutter and Yehuda Katz for helping me benchmark CodeRay on JRuby.
|
90
90
|
* Andreas Neuhaus for pointing out a markup bug in coderay/for_redcloth.
|
91
|
+
* 0xf30fc7 for the FileType patch concerning Delphi file extensions.
|
91
92
|
* The folks at redmine.org - thank you for using and fixing CodeRay!
|
92
93
|
* matz and all Ruby gods and gurus
|
93
94
|
* The inventors of: the computer, the internet, the true color display, HTML &
|
94
|
-
CSS, VIM,
|
95
|
+
CSS, VIM, Ruby, pizza, microwaves, guitars, scouting, programming, anime,
|
95
96
|
manga, coke and green ice tea.
|
96
97
|
|
97
98
|
Where would we be without all those people?
|
@@ -107,7 +108,7 @@ Where would we be without all those people?
|
|
107
108
|
* Subversion[http://subversion.tigris.org/]
|
108
109
|
* Redmine[http://redmine.org/]
|
109
110
|
* Firefox[http://www.mozilla.org/products/firefox/],
|
110
|
-
Firebug[http://getfirebug.com/], and
|
111
|
+
Firebug[http://getfirebug.com/], Safari[http://www.apple.com/safari/], and
|
111
112
|
Thunderbird[http://www.mozilla.org/products/thunderbird/]
|
112
113
|
* RubyGems[http://docs.rubygems.org/] and Rake[http://rake.rubyforge.org/]
|
113
114
|
* TortoiseSVN[http://tortoisesvn.tigris.org/] using Apache via
|
data/lib/coderay.rb
CHANGED
@@ -132,9 +132,10 @@ module CodeRay
|
|
132
132
|
# Minor: feature milestone
|
133
133
|
# Teeny: development state, 0 for pre-release
|
134
134
|
# Revision: Subversion Revision number (generated on rake gem:make)
|
135
|
-
VERSION = '0.
|
135
|
+
VERSION = '0.9.1'
|
136
136
|
|
137
137
|
require 'coderay/tokens'
|
138
|
+
require 'coderay/token_classes'
|
138
139
|
require 'coderay/scanner'
|
139
140
|
require 'coderay/encoder'
|
140
141
|
require 'coderay/duo'
|
data/lib/coderay/encoder.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require "stringio"
|
2
|
-
|
3
1
|
module CodeRay
|
4
2
|
|
5
3
|
# This module holds the Encoder class and its subclasses.
|
@@ -126,26 +124,36 @@ module CodeRay
|
|
126
124
|
@out = ''
|
127
125
|
end
|
128
126
|
|
129
|
-
# Called with +
|
127
|
+
# Called with +content+ and +kind+ of the currently scanned token.
|
130
128
|
# For simple scanners, it's enougth to implement this method.
|
131
129
|
#
|
132
130
|
# By default, it calls text_token or block_token, depending on
|
133
|
-
# whether +
|
134
|
-
def token
|
135
|
-
|
136
|
-
if
|
137
|
-
text_token
|
138
|
-
elsif
|
139
|
-
block_token
|
131
|
+
# whether +content+ is a String.
|
132
|
+
def token content, kind
|
133
|
+
encoded_token =
|
134
|
+
if content.is_a? ::String
|
135
|
+
text_token content, kind
|
136
|
+
elsif content.is_a? ::Symbol
|
137
|
+
block_token content, kind
|
140
138
|
else
|
141
|
-
raise 'Unknown token
|
139
|
+
raise 'Unknown token content type: %p' % [content]
|
142
140
|
end
|
143
|
-
|
141
|
+
append_encoded_token_to_output encoded_token
|
144
142
|
end
|
145
|
-
|
143
|
+
|
144
|
+
def append_encoded_token_to_output encoded_token
|
145
|
+
@out << encoded_token if encoded_token && defined?(@out) && @out
|
146
|
+
end
|
147
|
+
|
148
|
+
# Called for each text token ([text, kind]), where text is a String.
|
146
149
|
def text_token text, kind
|
147
150
|
end
|
148
|
-
|
151
|
+
|
152
|
+
# Called for each block (non-text) token ([action, kind]),
|
153
|
+
# where +action+ is a Symbol.
|
154
|
+
#
|
155
|
+
# Calls open_token, close_token, begin_line, and end_line according to
|
156
|
+
# the value of +action+.
|
149
157
|
def block_token action, kind
|
150
158
|
case action
|
151
159
|
when :open
|
@@ -160,6 +168,22 @@ module CodeRay
|
|
160
168
|
raise 'unknown block action: %p' % action
|
161
169
|
end
|
162
170
|
end
|
171
|
+
|
172
|
+
# Called for each block token at the start of the block ([:open, kind]).
|
173
|
+
def open_token kind
|
174
|
+
end
|
175
|
+
|
176
|
+
# Called for each block token end of the block ([:close, kind]).
|
177
|
+
def close_token kind
|
178
|
+
end
|
179
|
+
|
180
|
+
# Called for each line token block at the start of the line ([:begin_line, kind]).
|
181
|
+
def begin_line kind
|
182
|
+
end
|
183
|
+
|
184
|
+
# Called for each line token block at the end of the line ([:end_line, kind]).
|
185
|
+
def end_line kind
|
186
|
+
end
|
163
187
|
|
164
188
|
# Called with merged options after encoding starts.
|
165
189
|
# The return value is the result of encoding, typically @out.
|
@@ -173,7 +197,9 @@ module CodeRay
|
|
173
197
|
# TokenStream or a Tokens object.
|
174
198
|
if RUBY_VERSION >= '1.9'
|
175
199
|
def compile tokens, options
|
176
|
-
|
200
|
+
for text, kind in tokens
|
201
|
+
token text, kind
|
202
|
+
end
|
177
203
|
end
|
178
204
|
else
|
179
205
|
def compile tokens, options
|
@@ -0,0 +1,43 @@
|
|
1
|
+
($:.unshift '../..'; require 'coderay') unless defined? CodeRay
|
2
|
+
module CodeRay
|
3
|
+
module Encoders
|
4
|
+
|
5
|
+
load :token_class_filter
|
6
|
+
|
7
|
+
class CommentFilter < TokenClassFilter
|
8
|
+
|
9
|
+
register_for :comment_filter
|
10
|
+
|
11
|
+
DEFAULT_OPTIONS = superclass::DEFAULT_OPTIONS.merge \
|
12
|
+
:exclude => [:comment]
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
if $0 == __FILE__
|
20
|
+
$VERBOSE = true
|
21
|
+
$: << File.join(File.dirname(__FILE__), '..')
|
22
|
+
eval DATA.read, nil, $0, __LINE__ + 4
|
23
|
+
end
|
24
|
+
|
25
|
+
__END__
|
26
|
+
require 'test/unit'
|
27
|
+
|
28
|
+
class CommentFilterTest < Test::Unit::TestCase
|
29
|
+
|
30
|
+
def test_filtering_comments
|
31
|
+
tokens = CodeRay.scan <<-RUBY, :ruby
|
32
|
+
#!/usr/bin/env ruby
|
33
|
+
# a minimal Ruby program
|
34
|
+
puts "Hello world!"
|
35
|
+
RUBY
|
36
|
+
assert_equal <<-RUBY_FILTERED, tokens.comment_filter.text
|
37
|
+
#!/usr/bin/env ruby
|
38
|
+
|
39
|
+
puts "Hello world!"
|
40
|
+
RUBY_FILTERED
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
data/lib/coderay/encoders/div.rb
CHANGED
@@ -0,0 +1,75 @@
|
|
1
|
+
($:.unshift '../..'; require 'coderay') unless defined? CodeRay
|
2
|
+
module CodeRay
|
3
|
+
module Encoders
|
4
|
+
|
5
|
+
class Filter < Encoder
|
6
|
+
|
7
|
+
register_for :filter
|
8
|
+
|
9
|
+
protected
|
10
|
+
def setup options
|
11
|
+
@out = Tokens.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def text_token text, kind
|
15
|
+
[text, kind] if include_text_token? text, kind
|
16
|
+
end
|
17
|
+
|
18
|
+
def include_text_token? text, kind
|
19
|
+
true
|
20
|
+
end
|
21
|
+
|
22
|
+
def block_token action, kind
|
23
|
+
[action, kind] if include_block_token? action, kind
|
24
|
+
end
|
25
|
+
|
26
|
+
def include_block_token? action, kind
|
27
|
+
true
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
if $0 == __FILE__
|
36
|
+
$VERBOSE = true
|
37
|
+
$: << File.join(File.dirname(__FILE__), '..')
|
38
|
+
eval DATA.read, nil, $0, __LINE__ + 4
|
39
|
+
end
|
40
|
+
|
41
|
+
__END__
|
42
|
+
require 'test/unit'
|
43
|
+
|
44
|
+
class FilterTest < Test::Unit::TestCase
|
45
|
+
|
46
|
+
def test_creation
|
47
|
+
assert CodeRay::Encoders::Filter < CodeRay::Encoders::Encoder
|
48
|
+
filter = nil
|
49
|
+
assert_nothing_raised do
|
50
|
+
filter = CodeRay.encoder :filter
|
51
|
+
end
|
52
|
+
assert_kind_of CodeRay::Encoders::Encoder, filter
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_filtering_text_tokens
|
56
|
+
tokens = CodeRay::Tokens.new
|
57
|
+
10.times do |i|
|
58
|
+
tokens << [i.to_s, :index]
|
59
|
+
end
|
60
|
+
assert_equal tokens, CodeRay::Encoders::Filter.new.encode_tokens(tokens)
|
61
|
+
assert_equal tokens, tokens.filter
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_filtering_block_tokens
|
65
|
+
tokens = CodeRay::Tokens.new
|
66
|
+
10.times do |i|
|
67
|
+
tokens << [:open, :index]
|
68
|
+
tokens << [i.to_s, :content]
|
69
|
+
tokens << [:close, :index]
|
70
|
+
end
|
71
|
+
assert_equal tokens, CodeRay::Encoders::Filter.new.encode_tokens(tokens)
|
72
|
+
assert_equal tokens, tokens.filter
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'set'
|
2
2
|
|
3
3
|
module CodeRay
|
4
4
|
module Encoders
|
@@ -41,6 +41,12 @@ module Encoders
|
|
41
41
|
#
|
42
42
|
# Default: nil
|
43
43
|
#
|
44
|
+
# === :title
|
45
|
+
#
|
46
|
+
# The title of the HTML page (works only when :wrap is set to :page.)
|
47
|
+
#
|
48
|
+
# Default: 'CodeRay output'
|
49
|
+
#
|
44
50
|
# === :line_numbers
|
45
51
|
# Include line numbers in :table, :inline, :list or nil (no line numbers)
|
46
52
|
#
|
@@ -56,6 +62,16 @@ module Encoders
|
|
56
62
|
#
|
57
63
|
# Default: 10
|
58
64
|
#
|
65
|
+
# === :highlight_lines
|
66
|
+
#
|
67
|
+
# Highlights certain line numbers.
|
68
|
+
# Can be any Enumerable, typically just an Array or Range, of numbers.
|
69
|
+
#
|
70
|
+
# Bolding is deactivated when :highlight_lines is set. It only makes sense
|
71
|
+
# in combination with :line_numbers.
|
72
|
+
#
|
73
|
+
# Default: nil
|
74
|
+
#
|
59
75
|
# === :hint
|
60
76
|
# Include some information into the output using the title attribute.
|
61
77
|
# Can be :info (show token type on mouse-over), :info_long (with full path)
|
@@ -72,16 +88,16 @@ module Encoders
|
|
72
88
|
DEFAULT_OPTIONS = {
|
73
89
|
:tab_width => 8,
|
74
90
|
|
75
|
-
:level => :xhtml,
|
76
91
|
:css => :class,
|
77
92
|
|
78
93
|
:style => :cycnus,
|
79
|
-
|
80
94
|
:wrap => nil,
|
95
|
+
:title => 'CodeRay output',
|
81
96
|
|
82
97
|
:line_numbers => nil,
|
83
98
|
:line_number_start => 1,
|
84
99
|
:bold_every => 10,
|
100
|
+
:highlight_lines => nil,
|
85
101
|
|
86
102
|
:hint => false,
|
87
103
|
}
|
@@ -216,6 +232,7 @@ module Encoders
|
|
216
232
|
@out.css = @css
|
217
233
|
@out.numerize! options[:line_numbers], options
|
218
234
|
@out.wrap! options[:wrap]
|
235
|
+
@out.apply_title! options[:title]
|
219
236
|
|
220
237
|
super
|
221
238
|
end
|
@@ -27,7 +27,7 @@ module Encoders
|
|
27
27
|
1.upto(styles.size) do |offset|
|
28
28
|
break if style = cl[styles[offset .. -1]]
|
29
29
|
end
|
30
|
-
|
30
|
+
$stderr.puts 'Style not found: %p' % [styles] if $DEBUG and style.empty?
|
31
31
|
return style
|
32
32
|
end
|
33
33
|
|
@@ -32,9 +32,19 @@ module Encoders
|
|
32
32
|
#end
|
33
33
|
|
34
34
|
bold_every = options[:bold_every]
|
35
|
+
highlight_lines = options[:highlight_lines]
|
35
36
|
bolding =
|
36
|
-
if bold_every == false
|
37
|
+
if bold_every == false && highlight_lines == nil
|
37
38
|
proc { |line| line.to_s }
|
39
|
+
elsif highlight_lines.is_a? Enumerable
|
40
|
+
highlight_lines = highlight_lines.to_set
|
41
|
+
proc do |line|
|
42
|
+
if highlight_lines.include? line
|
43
|
+
"<strong class=\"highlighted\">#{line}</strong>" # highlighted line numbers in bold
|
44
|
+
else
|
45
|
+
line.to_s
|
46
|
+
end
|
47
|
+
end
|
38
48
|
elsif bold_every.is_a? Integer
|
39
49
|
raise ArgumentError, ":bolding can't be 0." if bold_every == 0
|
40
50
|
proc do |line|
|
@@ -65,7 +75,6 @@ module Encoders
|
|
65
75
|
# Because even monospace fonts seem to have different heights when bold,
|
66
76
|
# I make the newline bold, both in the code and the line numbers.
|
67
77
|
# FIXME Still not working perfect for Mr. Internet Exploder
|
68
|
-
# FIXME Firefox struggles with very long codes (> 200 lines)
|
69
78
|
line_numbers = (start ... start + line_count).to_a.map(&bolding).join("\n")
|
70
79
|
line_numbers << "\n" # also for Mr. MS Internet Exploder :-/
|
71
80
|
line_numbers.gsub!(/\n/) { "<tt>\n</tt>" }
|
@@ -86,6 +86,11 @@ module Encoders
|
|
86
86
|
Template.wrap! self, template, 'CONTENT'
|
87
87
|
self
|
88
88
|
end
|
89
|
+
|
90
|
+
def apply_title! title
|
91
|
+
self.sub!(/(<title>)(<\/title>)/) { $1 + title + $2 }
|
92
|
+
self
|
93
|
+
end
|
89
94
|
|
90
95
|
def wrap! element, *args
|
91
96
|
return self if not element or element == wrapped_in
|
@@ -100,6 +105,10 @@ module Encoders
|
|
100
105
|
wrap! :div if wrapped_in? nil
|
101
106
|
raise "Can't wrap %p in %p" % [wrapped_in, element] unless wrapped_in? :div
|
102
107
|
wrap_in! Output.page_template_for_css(@css)
|
108
|
+
if args.first.is_a?(Hash) && title = args.first[:title]
|
109
|
+
apply_title! title
|
110
|
+
end
|
111
|
+
self
|
103
112
|
when nil
|
104
113
|
return self
|
105
114
|
else
|
@@ -177,7 +186,7 @@ module Encoders
|
|
177
186
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="de">
|
178
187
|
<head>
|
179
188
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
180
|
-
<title
|
189
|
+
<title></title>
|
181
190
|
<style type="text/css">
|
182
191
|
<%CSS%>
|
183
192
|
</style>
|
@@ -0,0 +1,69 @@
|
|
1
|
+
($:.unshift '../..'; require 'coderay') unless defined? CodeRay
|
2
|
+
module CodeRay
|
3
|
+
module Encoders
|
4
|
+
|
5
|
+
# = JSON Encoder
|
6
|
+
class JSON < Encoder
|
7
|
+
|
8
|
+
register_for :json
|
9
|
+
FILE_EXTENSION = 'json'
|
10
|
+
|
11
|
+
protected
|
12
|
+
def setup options
|
13
|
+
begin
|
14
|
+
require 'json'
|
15
|
+
rescue LoadError
|
16
|
+
require 'rubygems'
|
17
|
+
require 'json'
|
18
|
+
end
|
19
|
+
@out = []
|
20
|
+
end
|
21
|
+
|
22
|
+
def text_token text, kind
|
23
|
+
{ :type => 'text', :text => text, :kind => kind }
|
24
|
+
end
|
25
|
+
|
26
|
+
def block_token action, kind
|
27
|
+
{ :type => 'block', :action => action, :kind => kind }
|
28
|
+
end
|
29
|
+
|
30
|
+
def finish options
|
31
|
+
@out.to_json
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
if $0 == __FILE__
|
40
|
+
$VERBOSE = true
|
41
|
+
$: << File.join(File.dirname(__FILE__), '..')
|
42
|
+
eval DATA.read, nil, $0, __LINE__ + 4
|
43
|
+
end
|
44
|
+
|
45
|
+
__END__
|
46
|
+
require 'test/unit'
|
47
|
+
$:.delete '.'
|
48
|
+
require 'rubygems' if RUBY_VERSION < '1.9'
|
49
|
+
|
50
|
+
class JSONEncoderTest < Test::Unit::TestCase
|
51
|
+
|
52
|
+
def test_json_output
|
53
|
+
tokens = CodeRay.scan <<-RUBY, :ruby
|
54
|
+
puts "Hello world!"
|
55
|
+
RUBY
|
56
|
+
require 'json'
|
57
|
+
assert_equal [
|
58
|
+
{"type"=>"text", "text"=>"puts", "kind"=>"ident"},
|
59
|
+
{"type"=>"text", "text"=>" ", "kind"=>"space"},
|
60
|
+
{"type"=>"block", "action"=>"open", "kind"=>"string"},
|
61
|
+
{"type"=>"text", "text"=>"\"", "kind"=>"delimiter"},
|
62
|
+
{"type"=>"text", "text"=>"Hello world!", "kind"=>"content"},
|
63
|
+
{"type"=>"text", "text"=>"\"", "kind"=>"delimiter"},
|
64
|
+
{"type"=>"block", "action"=>"close", "kind"=>"string"},
|
65
|
+
{"type"=>"text", "text"=>"\n", "kind"=>"space"}
|
66
|
+
], JSON.load(tokens.json)
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|