coderay 0.4.5.73 → 0.5.0.100
Sign up to get free protection for your applications and to get access to all the features.
- data/README +3 -2
- data/demo/demo_css.rb +1 -1
- data/demo/demo_load_encoder.rb +8 -0
- data/demo/demo_load_scanner.rb +25 -0
- data/demo/demo_more.rb +3 -2
- data/demo/suite.rb +82 -0
- data/lib/coderay.rb +8 -2
- data/lib/coderay/encoder.rb +1 -1
- data/lib/coderay/encoders/_map.rb +8 -0
- data/lib/coderay/encoders/div.rb +3 -1
- data/lib/coderay/encoders/html.rb +8 -5
- data/lib/coderay/encoders/{helpers/html_helper.rb → html/classes.rb} +1 -0
- data/lib/coderay/encoders/html/css.rb +66 -0
- data/lib/coderay/encoders/html/numerization.rb +112 -0
- data/lib/coderay/encoders/{helpers/html_output.rb → html/output.rb} +27 -90
- data/lib/coderay/encoders/span.rb +2 -1
- data/lib/coderay/encoders/statistic.rb +1 -1
- data/lib/coderay/helpers/plugin.rb +100 -88
- data/lib/coderay/helpers/word_list.rb +108 -0
- data/lib/coderay/scanner.rb +3 -3
- data/lib/coderay/scanners/_map.rb +10 -0
- data/lib/coderay/scanners/c.rb +1 -1
- data/lib/coderay/scanners/delphi.rb +1 -1
- data/lib/coderay/scanners/ruby.rb +1 -1
- data/lib/coderay/scanners/{helpers/ruby_helper.rb → ruby/patterns.rb} +0 -0
- data/lib/coderay/style.rb +20 -0
- data/lib/coderay/{encoders/helpers/html_css.rb → styles/cycnus.rb} +22 -59
- data/lib/coderay/styles/murphy.rb +119 -0
- data/lib/coderay/tokens.rb +1 -1
- metadata +23 -15
- data/lib/coderay/helpers/scanner_helper.rb +0 -63
data/README
CHANGED
@@ -18,13 +18,13 @@ 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.5.0 (2005.november.5)
|
22
22
|
Author:: murphy
|
23
23
|
Idea:: licenser
|
24
24
|
Website:: rd.cYcnus.de/coderay[http://rd.cYcnus.de/coderay]
|
25
25
|
Copyright:: (c) 2005 by cYcnus
|
26
26
|
License:: GNU LGPL; see LICENSE file in the main directory.
|
27
|
-
Subversion:: $Id: README
|
27
|
+
Subversion:: $Id: README 94 2005-11-10 21:52:03Z murphy $
|
28
28
|
|
29
29
|
-----
|
30
30
|
|
@@ -101,3 +101,4 @@ Where would we be without all those people?
|
|
101
101
|
* As you can see, CodeRay was created under heavy use of *free* software.
|
102
102
|
* So CodeRay is also *free*.
|
103
103
|
* If you use CodeRay to create software, think about making this software *free*, too.
|
104
|
+
* Thanks :)
|
data/demo/demo_css.rb
CHANGED
data/demo/demo_load_encoder.rb
CHANGED
@@ -15,3 +15,11 @@ tokens_encoder = require_plugin 'CodeRay::Encoders/tokens'
|
|
15
15
|
print 'Require is also possible: '
|
16
16
|
p tokens_encoder
|
17
17
|
puts 'See?'
|
18
|
+
|
19
|
+
puts 'Now load some mapped encoders: stats and plain.'
|
20
|
+
require_plugin 'CodeRay::Encoders/stats'
|
21
|
+
require_plugin 'CodeRay::Encoders/plain'
|
22
|
+
|
23
|
+
puts 'Require all Encoders:'
|
24
|
+
CodeRay::Encoders.load_all
|
25
|
+
p CodeRay::Encoders.plugin_hash.sort_by { |k,v| k.to_s }
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'coderay'
|
2
|
+
|
3
|
+
begin
|
4
|
+
CodeRay::Scanners::Ruby
|
5
|
+
rescue
|
6
|
+
puts 'CodeRay::Encoders::Ruby is not defined; you must load it first.'
|
7
|
+
end
|
8
|
+
|
9
|
+
ruby_scanner = CodeRay::Scanners[:ruby]
|
10
|
+
print 'Now it is loaded: '
|
11
|
+
p ruby_scanner
|
12
|
+
puts 'See?'
|
13
|
+
|
14
|
+
c_scanner = require_plugin 'CodeRay::Scanners/c'
|
15
|
+
print 'Require is also possible: '
|
16
|
+
p c_scanner
|
17
|
+
puts 'See?'
|
18
|
+
|
19
|
+
puts 'Now load some mapped scanners: cpp and plain.'
|
20
|
+
require_plugin 'CodeRay::Scanners/cpp'
|
21
|
+
require_plugin 'CodeRay::Scanners/plain'
|
22
|
+
|
23
|
+
puts 'Require all Scanners:'
|
24
|
+
CodeRay::Scanners.load_all
|
25
|
+
p CodeRay::Scanners.plugin_hash.sort_by { |k,v| k.to_s }
|
data/demo/demo_more.rb
CHANGED
@@ -17,7 +17,7 @@ time = Benchmark.realtime do
|
|
17
17
|
body = %w[C Ruby Genereated\ by].zip([c, ruby, me]).map do |title, code|
|
18
18
|
"<h1>#{title}</h1>\n#{code}"
|
19
19
|
end.join
|
20
|
-
body = hl.class::Output.new(body, :div).page!
|
20
|
+
body = hl.class::Output.new(body, hl.css, :div).page!
|
21
21
|
|
22
22
|
# CodeRay also provides a simple page generator
|
23
23
|
$output = body #hl.class.wrap_in_page body
|
@@ -27,7 +27,8 @@ File.open('test.html', 'w') do |f|
|
|
27
27
|
f.write $output
|
28
28
|
end
|
29
29
|
puts 'Input: %dB, Output: %dB' % [$input.size, $output.size]
|
30
|
-
puts 'Created "test.html" in %0.3f seconds (%d KB/s).
|
30
|
+
#puts 'Created "test.html" in %0.3f seconds (%d KB/s).' % [time, $input.size / 1024.0 / time]
|
31
|
+
puts 'Take a look with your browser.'
|
31
32
|
|
32
33
|
__END__
|
33
34
|
/**********************************************************************
|
data/demo/suite.rb
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
mydir = File.dirname(__FILE__)
|
2
|
+
$:.unshift mydir + '/../lib/'
|
3
|
+
|
4
|
+
$VERBOSE = true
|
5
|
+
|
6
|
+
require 'test/unit'
|
7
|
+
include Test::Unit
|
8
|
+
|
9
|
+
class CodeRaySuite < TestCase
|
10
|
+
|
11
|
+
def self.dir &block
|
12
|
+
@dir ||= File.dirname(__FILE__)
|
13
|
+
if block
|
14
|
+
Dir.chdir @dir, &block
|
15
|
+
end
|
16
|
+
@dir
|
17
|
+
end
|
18
|
+
|
19
|
+
def dir &block
|
20
|
+
self.class.dir(&block)
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_ALL
|
24
|
+
dir do
|
25
|
+
for input in Dir["demo_*.rb"] - ['demo_server.rb', 'demo_stream.rb']
|
26
|
+
puts "[ testing #{input}... ]"
|
27
|
+
name = File.basename(input, ".rb")
|
28
|
+
output = name + '.out'
|
29
|
+
code = File.open(input, 'rb') { |f| break f.read }
|
30
|
+
|
31
|
+
result = `ruby -wI../lib #{input}`
|
32
|
+
|
33
|
+
if File.exist? output
|
34
|
+
expected = File.read output
|
35
|
+
ok = expected == result
|
36
|
+
computed = output.sub('.out', '.computed')
|
37
|
+
unless ok
|
38
|
+
File.open(computed, 'w') { |f| f.write result }
|
39
|
+
print `gvimdiff #{output} #{computed}` if $DEBUG
|
40
|
+
end
|
41
|
+
assert(ok, "Output error: #{computed} != #{output}") unless $DEBUG
|
42
|
+
else
|
43
|
+
File.open(output, 'w') do |f| f.write result end
|
44
|
+
puts "New test: #{output}"
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
require 'test/unit/testsuite'
|
54
|
+
$suite = TestSuite.new 'CodeRay Demos Test'
|
55
|
+
$suite << CodeRaySuite.suite
|
56
|
+
|
57
|
+
def load_suite name
|
58
|
+
begin
|
59
|
+
require name + '/suite.rb'
|
60
|
+
rescue LoadError
|
61
|
+
$stderr.puts <<-ERR
|
62
|
+
|
63
|
+
!! Folder #{File.split(__FILE__).first + '/' + name} not found
|
64
|
+
|
65
|
+
ERR
|
66
|
+
false
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
if subsuite = ARGV.find { |a| break $1 if a[/^([^-].*)/] }
|
71
|
+
load_suite(subsuite) or exit
|
72
|
+
else
|
73
|
+
Dir[mydir + '/*/'].each { |suite| load_suite suite }
|
74
|
+
end
|
75
|
+
|
76
|
+
if ARGV.include? '-f'
|
77
|
+
require 'test/unit/ui/fox/testrunner'
|
78
|
+
UI::Fox::TestRunner.run $suite
|
79
|
+
else
|
80
|
+
require 'test/unit/ui/console/testrunner'
|
81
|
+
UI::Console::TestRunner.run $suite
|
82
|
+
end
|
data/lib/coderay.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# = CodeRay Library
|
2
2
|
#
|
3
|
-
# $Id: coderay.rb
|
3
|
+
# $Id: coderay.rb 96 2005-11-13 06:24:54Z murphy $
|
4
4
|
#
|
5
5
|
# CodeRay is a Ruby library for syntax highlighting.
|
6
6
|
#
|
@@ -128,11 +128,17 @@
|
|
128
128
|
# The scanning methods provide more flexibility; we recommend to use these.
|
129
129
|
module CodeRay
|
130
130
|
|
131
|
-
Version
|
131
|
+
# Version: Major.Minor.Teeny[.Revision]
|
132
|
+
# Major: 0 for pre-release
|
133
|
+
# Minor: odd for beta, even for stable
|
134
|
+
# Teeny: development state
|
135
|
+
# Revision: Subversion Revision number (generated on rake)
|
136
|
+
Version = '0.6.0'
|
132
137
|
|
133
138
|
require 'coderay/tokens'
|
134
139
|
require 'coderay/scanner'
|
135
140
|
require 'coderay/encoder'
|
141
|
+
require 'coderay/style'
|
136
142
|
|
137
143
|
|
138
144
|
class << self
|
data/lib/coderay/encoder.rb
CHANGED
data/lib/coderay/encoders/div.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module CodeRay module Encoders
|
2
2
|
|
3
|
-
|
3
|
+
load :html
|
4
|
+
|
4
5
|
class Div < HTML
|
5
6
|
|
6
7
|
FILE_EXTENSION = 'div.html'
|
@@ -11,6 +12,7 @@ module CodeRay module Encoders
|
|
11
12
|
:css => :style,
|
12
13
|
:wrap => :div,
|
13
14
|
})
|
15
|
+
|
14
16
|
end
|
15
17
|
|
16
18
|
end end
|
@@ -39,7 +39,7 @@ module Encoders
|
|
39
39
|
# Default: :page
|
40
40
|
#
|
41
41
|
# === :line_numbers
|
42
|
-
# Include line numbers in :table, :inline or nil (no line numbers)
|
42
|
+
# Include line numbers in :table, :inline, :list or nil (no line numbers)
|
43
43
|
#
|
44
44
|
# Default: nil
|
45
45
|
#
|
@@ -71,6 +71,8 @@ module Encoders
|
|
71
71
|
:level => :xhtml,
|
72
72
|
:css => :class,
|
73
73
|
|
74
|
+
:style => :cycnus,
|
75
|
+
|
74
76
|
:wrap => :page,
|
75
77
|
|
76
78
|
:line_numbers => nil,
|
@@ -80,9 +82,9 @@ module Encoders
|
|
80
82
|
:hint => false,
|
81
83
|
}
|
82
84
|
|
83
|
-
|
84
|
-
|
85
|
-
|
85
|
+
helper :classes, :output, :css
|
86
|
+
|
87
|
+
attr_reader :css
|
86
88
|
|
87
89
|
def initialize(*)
|
88
90
|
super
|
@@ -116,7 +118,7 @@ module Encoders
|
|
116
118
|
@HTML_ESCAPE["\t"] = ' ' * options[:tab_width]
|
117
119
|
|
118
120
|
@opened = [nil]
|
119
|
-
@css = CSS.new
|
121
|
+
@css = CSS.new options[:style]
|
120
122
|
|
121
123
|
hint = options[:hint]
|
122
124
|
if hint and not [:debug, :info].include? hint
|
@@ -192,6 +194,7 @@ module Encoders
|
|
192
194
|
@out << '</span>' * @opened.size
|
193
195
|
|
194
196
|
@out.extend Output
|
197
|
+
@out.css = @css
|
195
198
|
@out.numerize! options[:line_numbers], options # if options[:line_numbers]
|
196
199
|
@out.wrap! options[:wrap] # if options[:wrap]
|
197
200
|
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module CodeRay module Encoders
|
2
|
+
|
3
|
+
class HTML
|
4
|
+
class CSS
|
5
|
+
|
6
|
+
DEFAULT_STYLESHEET_ID = :cycnus
|
7
|
+
|
8
|
+
attr :stylesheet
|
9
|
+
|
10
|
+
def CSS.load_stylesheet style
|
11
|
+
style = DEFAULT_STYLESHEET_ID if style == :default
|
12
|
+
CodeRay::Styles[style]
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize style = :default
|
16
|
+
@classes = Hash.new
|
17
|
+
style = CSS.load_stylesheet style
|
18
|
+
@stylesheet = [
|
19
|
+
style::CSS_MAIN_STYLES,
|
20
|
+
style::TOKEN_COLORS.gsub(/^(?!$)/, '.CodeRay ')
|
21
|
+
].join("\n")
|
22
|
+
parse style::TOKEN_COLORS
|
23
|
+
end
|
24
|
+
|
25
|
+
def [] *styles
|
26
|
+
cl = @classes[styles.first]
|
27
|
+
return '' unless cl
|
28
|
+
style = ''
|
29
|
+
1.upto(styles.size) do |offset|
|
30
|
+
break if style = cl[styles[offset .. -1]]
|
31
|
+
end
|
32
|
+
raise 'Style not found: %p' % [styles] if $DEBUG and style.empty?
|
33
|
+
return style
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
CSS_CLASS_PATTERN = /
|
39
|
+
( (?: # $1 = classes
|
40
|
+
\s* \. [-\w]+
|
41
|
+
)+ )
|
42
|
+
\s* \{ \s*
|
43
|
+
( [^\}]+ )? # $2 = style
|
44
|
+
\s* \} \s*
|
45
|
+
|
|
46
|
+
( . ) # $3 = error
|
47
|
+
/mx
|
48
|
+
def parse stylesheet
|
49
|
+
stylesheet.scan CSS_CLASS_PATTERN do |classes, style, error|
|
50
|
+
raise "CSS parse error: '#{error.inspect}' not recognized" if error
|
51
|
+
styles = classes.scan(/[-\w]+/)
|
52
|
+
cl = styles.pop
|
53
|
+
@classes[cl] ||= Hash.new
|
54
|
+
@classes[cl][styles] = style.to_s.strip
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end end
|
62
|
+
|
63
|
+
if $0 == __FILE__
|
64
|
+
require 'pp'
|
65
|
+
pp CodeRay::Encoders::HTML::CSS.new
|
66
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module CodeRay
|
2
|
+
module Encoders
|
3
|
+
|
4
|
+
class HTML
|
5
|
+
|
6
|
+
module Output
|
7
|
+
|
8
|
+
def numerize *args
|
9
|
+
clone.numerize!(*args)
|
10
|
+
end
|
11
|
+
|
12
|
+
NUMERIZABLE_WRAPPINGS = {
|
13
|
+
:table => [:div, :page],
|
14
|
+
:inline => :all,
|
15
|
+
:list => [:div, :page],
|
16
|
+
nil => :all
|
17
|
+
}
|
18
|
+
|
19
|
+
def numerize! mode = :table, options = {}
|
20
|
+
return self unless mode
|
21
|
+
|
22
|
+
options = DEFAULT_OPTIONS.merge options
|
23
|
+
|
24
|
+
start = options[:line_number_start]
|
25
|
+
unless start.is_a? Integer
|
26
|
+
raise ArgumentError, "Invalid value %p for :line_number_start; Integer expected." % start
|
27
|
+
end
|
28
|
+
|
29
|
+
allowed_wrappings = NUMERIZABLE_WRAPPINGS[mode]
|
30
|
+
unless allowed_wrappings == :all or allowed_wrappings.include? options[:wrap]
|
31
|
+
raise ArgumentError, "Can't numerize, :wrap must be in %p, but is %p" % [NUMERIZABLE_WRAPPINGS, options[:wrap]]
|
32
|
+
end
|
33
|
+
|
34
|
+
bold_every = options[:bold_every]
|
35
|
+
bolding =
|
36
|
+
if bold_every == :no_bolding or bold_every == 0
|
37
|
+
proc { |line| line.to_s }
|
38
|
+
elsif bold_every.is_a? Integer
|
39
|
+
proc do |line|
|
40
|
+
if line % bold_every == 0
|
41
|
+
"<strong>#{line}</strong>" # every bold_every-th number in bold
|
42
|
+
else
|
43
|
+
line.to_s
|
44
|
+
end
|
45
|
+
end
|
46
|
+
else
|
47
|
+
raise ArgumentError, "Invalid value %p for :bolding; :no_bolding or Integer expected." % bolding
|
48
|
+
end
|
49
|
+
|
50
|
+
line_count = count("\n")
|
51
|
+
line_count += 1 if self[-1] != ?\n
|
52
|
+
|
53
|
+
case mode
|
54
|
+
when :inline
|
55
|
+
max_width = (start + line_count).to_s.size
|
56
|
+
line = start
|
57
|
+
gsub!(/^/) do
|
58
|
+
line_number = bolding.call line
|
59
|
+
line += 1
|
60
|
+
"<span class=\"no\">#{ line_number.rjust(max_width) }</span> "
|
61
|
+
end
|
62
|
+
#wrap! :div
|
63
|
+
|
64
|
+
when :table
|
65
|
+
# This is really ugly.
|
66
|
+
# Because even monospace fonts seem to have different heights when bold,
|
67
|
+
# I make the newline bold, both in the code and the line numbers.
|
68
|
+
# FIXME Still not working perfect for Mr. Internet Exploder
|
69
|
+
# FIXME Firefox struggles with very long codes (> 200 lines)
|
70
|
+
line_numbers = (start ... start + line_count).to_a.map(&bolding).join("\n")
|
71
|
+
line_numbers << "\n" # also for Mr. MS Internet Exploder :-/
|
72
|
+
line_numbers.gsub!(/\n/) { "<tt>\n</tt>" }
|
73
|
+
|
74
|
+
line_numbers_table_tpl = TABLE.apply('LINE_NUMBERS', line_numbers)
|
75
|
+
gsub!(/\n/) { "<tt>\n</tt>" }
|
76
|
+
wrap_in! line_numbers_table_tpl
|
77
|
+
@wrapped_in = :div
|
78
|
+
|
79
|
+
when :list
|
80
|
+
opened_tags = []
|
81
|
+
gsub!(/^.*$\n?/) do |line|
|
82
|
+
line.chomp!
|
83
|
+
|
84
|
+
open = opened_tags.join
|
85
|
+
line.scan(%r!<(/)?span[^>]*>?!) do |close,|
|
86
|
+
if close
|
87
|
+
opened_tags.pop
|
88
|
+
else
|
89
|
+
opened_tags << $&
|
90
|
+
end
|
91
|
+
end
|
92
|
+
close = '</span>' * opened_tags.size
|
93
|
+
|
94
|
+
"<li>#{open}#{line}#{close}</li>"
|
95
|
+
end
|
96
|
+
wrap_in! LIST
|
97
|
+
@wrapped_in = :div
|
98
|
+
|
99
|
+
else
|
100
|
+
raise ArgumentError, "Unknown value %p for mode: expected one of %p" %
|
101
|
+
[mode, NUMERIZABLE_WRAPPINGS.keys - [:all]]
|
102
|
+
end
|
103
|
+
|
104
|
+
self
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
end
|