coderay 0.9.8 → 1.0.0

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.
Files changed (87) hide show
  1. data/{lib/README → README_INDEX.rdoc} +10 -21
  2. data/Rakefile +6 -6
  3. data/bin/coderay +193 -64
  4. data/lib/coderay.rb +61 -105
  5. data/lib/coderay/duo.rb +17 -21
  6. data/lib/coderay/encoder.rb +100 -112
  7. data/lib/coderay/encoders/_map.rb +12 -7
  8. data/lib/coderay/encoders/comment_filter.rb +12 -30
  9. data/lib/coderay/encoders/count.rb +29 -11
  10. data/lib/coderay/encoders/debug.rb +32 -20
  11. data/lib/coderay/encoders/div.rb +13 -9
  12. data/lib/coderay/encoders/filter.rb +34 -51
  13. data/lib/coderay/encoders/html.rb +155 -161
  14. data/lib/coderay/encoders/html/css.rb +4 -9
  15. data/lib/coderay/encoders/html/numbering.rb +115 -0
  16. data/lib/coderay/encoders/html/output.rb +22 -70
  17. data/lib/coderay/encoders/json.rb +59 -45
  18. data/lib/coderay/encoders/lines_of_code.rb +12 -57
  19. data/lib/coderay/encoders/null.rb +6 -14
  20. data/lib/coderay/encoders/page.rb +13 -9
  21. data/lib/coderay/encoders/span.rb +13 -9
  22. data/lib/coderay/encoders/statistic.rb +58 -39
  23. data/lib/coderay/encoders/terminal.rb +179 -0
  24. data/lib/coderay/encoders/text.rb +31 -17
  25. data/lib/coderay/encoders/token_kind_filter.rb +111 -0
  26. data/lib/coderay/encoders/xml.rb +19 -18
  27. data/lib/coderay/encoders/yaml.rb +37 -9
  28. data/lib/coderay/for_redcloth.rb +4 -4
  29. data/lib/coderay/helpers/file_type.rb +127 -246
  30. data/lib/coderay/helpers/gzip.rb +41 -0
  31. data/lib/coderay/helpers/plugin.rb +241 -306
  32. data/lib/coderay/helpers/word_list.rb +65 -126
  33. data/lib/coderay/scanner.rb +173 -156
  34. data/lib/coderay/scanners/_map.rb +18 -17
  35. data/lib/coderay/scanners/c.rb +63 -77
  36. data/lib/coderay/scanners/clojure.rb +217 -0
  37. data/lib/coderay/scanners/cpp.rb +71 -84
  38. data/lib/coderay/scanners/css.rb +103 -120
  39. data/lib/coderay/scanners/debug.rb +47 -44
  40. data/lib/coderay/scanners/delphi.rb +70 -76
  41. data/lib/coderay/scanners/diff.rb +141 -50
  42. data/lib/coderay/scanners/erb.rb +81 -0
  43. data/lib/coderay/scanners/groovy.rb +104 -113
  44. data/lib/coderay/scanners/haml.rb +168 -0
  45. data/lib/coderay/scanners/html.rb +181 -110
  46. data/lib/coderay/scanners/java.rb +73 -75
  47. data/lib/coderay/scanners/java/builtin_types.rb +2 -0
  48. data/lib/coderay/scanners/java_script.rb +90 -101
  49. data/lib/coderay/scanners/json.rb +40 -53
  50. data/lib/coderay/scanners/php.rb +123 -147
  51. data/lib/coderay/scanners/python.rb +93 -91
  52. data/lib/coderay/scanners/raydebug.rb +66 -0
  53. data/lib/coderay/scanners/ruby.rb +343 -326
  54. data/lib/coderay/scanners/ruby/patterns.rb +40 -106
  55. data/lib/coderay/scanners/ruby/string_state.rb +71 -0
  56. data/lib/coderay/scanners/sql.rb +80 -66
  57. data/lib/coderay/scanners/text.rb +26 -0
  58. data/lib/coderay/scanners/xml.rb +1 -1
  59. data/lib/coderay/scanners/yaml.rb +74 -73
  60. data/lib/coderay/style.rb +10 -7
  61. data/lib/coderay/styles/_map.rb +3 -3
  62. data/lib/coderay/styles/alpha.rb +143 -0
  63. data/lib/coderay/token_kinds.rb +90 -0
  64. data/lib/coderay/tokens.rb +102 -277
  65. data/lib/coderay/tokens_proxy.rb +55 -0
  66. data/lib/coderay/version.rb +3 -0
  67. data/test/functional/basic.rb +200 -18
  68. data/test/functional/examples.rb +130 -0
  69. data/test/functional/for_redcloth.rb +15 -8
  70. data/test/functional/suite.rb +9 -6
  71. metadata +103 -123
  72. data/FOLDERS +0 -53
  73. data/bin/coderay_stylesheet +0 -4
  74. data/lib/coderay/encoders/html/numerization.rb +0 -133
  75. data/lib/coderay/encoders/term.rb +0 -158
  76. data/lib/coderay/encoders/token_class_filter.rb +0 -84
  77. data/lib/coderay/helpers/gzip_simple.rb +0 -123
  78. data/lib/coderay/scanners/nitro_xhtml.rb +0 -136
  79. data/lib/coderay/scanners/plaintext.rb +0 -20
  80. data/lib/coderay/scanners/rhtml.rb +0 -78
  81. data/lib/coderay/scanners/scheme.rb +0 -145
  82. data/lib/coderay/styles/cycnus.rb +0 -152
  83. data/lib/coderay/styles/murphy.rb +0 -134
  84. data/lib/coderay/token_classes.rb +0 -86
  85. data/test/functional/load_plugin_scanner.rb +0 -11
  86. data/test/functional/vhdl.rb +0 -126
  87. data/test/functional/word_list.rb +0 -79
@@ -1,5 +1,7 @@
1
1
  require 'test/unit'
2
- $:.unshift 'lib'
2
+ require File.expand_path('../../lib/assert_warning', __FILE__)
3
+
4
+ $:.unshift File.expand_path('../../../lib', __FILE__)
3
5
  require 'coderay'
4
6
 
5
7
  begin
@@ -8,17 +10,18 @@ begin
8
10
  require 'redcloth'
9
11
  rescue LoadError
10
12
  warn 'RedCloth not found - skipping for_redcloth tests.'
13
+ undef RedCloth if defined? RedCloth
11
14
  end
12
15
 
13
16
  class BasicTest < Test::Unit::TestCase
14
17
 
15
18
  def test_for_redcloth
16
19
  require 'coderay/for_redcloth'
17
- assert_equal "<p><span lang=\"ruby\" class=\"CodeRay\">puts <span style=\"background-color:#fff0f0;color:#D20\"><span style=\"color:#710\">&quot;</span><span style=\"\">Hello, World!</span><span style=\"color:#710\">&quot;</span></span></span></p>",
20
+ assert_equal "<p><span lang=\"ruby\" class=\"CodeRay\">puts <span style=\"background-color:hsla(0,100%,50%,0.05)\"><span style=\"color:#710\">&quot;</span><span style=\"color:#D20\">Hello, World!</span><span style=\"color:#710\">&quot;</span></span></span></p>",
18
21
  RedCloth.new('@[ruby]puts "Hello, World!"@').to_html
19
22
  assert_equal <<-BLOCKCODE.chomp,
20
23
  <div lang="ruby" class="CodeRay">
21
- <div class="code"><pre>puts <span style="background-color:#fff0f0;color:#D20"><span style="color:#710">&quot;</span><span style="">Hello, World!</span><span style="color:#710">&quot;</span></span></pre></div>
24
+ <div class="code"><pre>puts <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">&quot;</span><span style="color:#D20">Hello, World!</span><span style="color:#710">&quot;</span></span></pre></div>
22
25
  </div>
23
26
  BLOCKCODE
24
27
  RedCloth.new('bc[ruby]. puts "Hello, World!"').to_html
@@ -63,15 +66,19 @@ class BasicTest < Test::Unit::TestCase
63
66
  # See http://jgarber.lighthouseapp.com/projects/13054/tickets/124-code-markup-does-not-allow-brackets.
64
67
  def test_for_redcloth_false_positive
65
68
  require 'coderay/for_redcloth'
66
- assert_equal '<p><code>[project]_dff.skjd</code></p>',
67
- RedCloth.new('@[project]_dff.skjd@').to_html
69
+ assert_warning 'CodeRay::Scanners could not load plugin :project; falling back to :text' do
70
+ assert_equal '<p><code>[project]_dff.skjd</code></p>',
71
+ RedCloth.new('@[project]_dff.skjd@').to_html
72
+ end
68
73
  # false positive, but expected behavior / known issue
69
74
  assert_equal "<p><span lang=\"ruby\" class=\"CodeRay\">_dff.skjd</span></p>",
70
75
  RedCloth.new('@[ruby]_dff.skjd@').to_html
71
- assert_equal <<-BLOCKCODE.chomp,
76
+ assert_warning 'CodeRay::Scanners could not load plugin :project; falling back to :text' do
77
+ assert_equal <<-BLOCKCODE.chomp,
72
78
  <pre><code>[project]_dff.skjd</code></pre>
73
- BLOCKCODE
74
- RedCloth.new('bc. [project]_dff.skjd').to_html
79
+ BLOCKCODE
80
+ RedCloth.new('bc. [project]_dff.skjd').to_html
81
+ end
75
82
  end
76
83
 
77
84
  end if defined? RedCloth
@@ -1,12 +1,15 @@
1
1
  require 'test/unit'
2
2
 
3
- MYDIR = File.dirname(__FILE__)
4
-
5
- $:.unshift 'lib'
3
+ $VERBOSE = $CODERAY_DEBUG = true
4
+ $:.unshift File.expand_path('../../../lib', __FILE__)
6
5
  require 'coderay'
7
- puts "Running basic CodeRay #{CodeRay::VERSION} tests..."
8
6
 
9
- suite = %w(basic load_plugin_scanner word_list)
7
+ mydir = File.dirname(__FILE__)
8
+ suite = Dir[File.join(mydir, '*.rb')].
9
+ map { |tc| File.basename(tc).sub(/\.rb$/, '') } - %w'suite for_redcloth'
10
+
11
+ puts "Running basic CodeRay #{CodeRay::VERSION} tests: #{suite.join(', ')}"
12
+
10
13
  for test_case in suite
11
- load File.join(MYDIR, test_case + '.rb')
14
+ load File.join(mydir, test_case + '.rb')
12
15
  end
metadata CHANGED
@@ -1,146 +1,126 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: coderay
3
- version: !ruby/object:Gem::Version
4
- hash: 43
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 9
9
- - 8
10
- version: 0.9.8
11
6
  platform: ruby
12
- authors:
13
- - murphy
7
+ authors:
8
+ - Kornelius Kalnbach
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-05-01 00:00:00 Z
12
+ date: 2011-09-21 00:00:00.000000000Z
19
13
  dependencies: []
20
-
21
- description: |
22
- Fast and easy syntax highlighting for selected languages, written in Ruby.
23
- Comes with RedCloth integration and LOC counter.
24
-
25
- email: murphy@rubychan.de
26
- executables:
14
+ description: Fast and easy syntax highlighting for selected languages, written in
15
+ Ruby. Comes with RedCloth integration and LOC counter.
16
+ email:
17
+ - murphy@rubychan.de
18
+ executables:
27
19
  - coderay
28
- - coderay_stylesheet
29
20
  extensions: []
30
-
31
- extra_rdoc_files:
32
- - lib/README
33
- - FOLDERS
34
- files:
35
- - ./lib/coderay/duo.rb
36
- - ./lib/coderay/encoder.rb
37
- - ./lib/coderay/encoders/_map.rb
38
- - ./lib/coderay/encoders/comment_filter.rb
39
- - ./lib/coderay/encoders/count.rb
40
- - ./lib/coderay/encoders/debug.rb
41
- - ./lib/coderay/encoders/div.rb
42
- - ./lib/coderay/encoders/filter.rb
43
- - ./lib/coderay/encoders/html/css.rb
44
- - ./lib/coderay/encoders/html/numerization.rb
45
- - ./lib/coderay/encoders/html/output.rb
46
- - ./lib/coderay/encoders/html.rb
47
- - ./lib/coderay/encoders/json.rb
48
- - ./lib/coderay/encoders/lines_of_code.rb
49
- - ./lib/coderay/encoders/null.rb
50
- - ./lib/coderay/encoders/page.rb
51
- - ./lib/coderay/encoders/span.rb
52
- - ./lib/coderay/encoders/statistic.rb
53
- - ./lib/coderay/encoders/term.rb
54
- - ./lib/coderay/encoders/text.rb
55
- - ./lib/coderay/encoders/token_class_filter.rb
56
- - ./lib/coderay/encoders/xml.rb
57
- - ./lib/coderay/encoders/yaml.rb
58
- - ./lib/coderay/for_redcloth.rb
59
- - ./lib/coderay/helpers/file_type.rb
60
- - ./lib/coderay/helpers/gzip_simple.rb
61
- - ./lib/coderay/helpers/plugin.rb
62
- - ./lib/coderay/helpers/word_list.rb
63
- - ./lib/coderay/scanner.rb
64
- - ./lib/coderay/scanners/_map.rb
65
- - ./lib/coderay/scanners/c.rb
66
- - ./lib/coderay/scanners/cpp.rb
67
- - ./lib/coderay/scanners/css.rb
68
- - ./lib/coderay/scanners/debug.rb
69
- - ./lib/coderay/scanners/delphi.rb
70
- - ./lib/coderay/scanners/diff.rb
71
- - ./lib/coderay/scanners/groovy.rb
72
- - ./lib/coderay/scanners/html.rb
73
- - ./lib/coderay/scanners/java/builtin_types.rb
74
- - ./lib/coderay/scanners/java.rb
75
- - ./lib/coderay/scanners/java_script.rb
76
- - ./lib/coderay/scanners/json.rb
77
- - ./lib/coderay/scanners/nitro_xhtml.rb
78
- - ./lib/coderay/scanners/php.rb
79
- - ./lib/coderay/scanners/plaintext.rb
80
- - ./lib/coderay/scanners/python.rb
81
- - ./lib/coderay/scanners/rhtml.rb
82
- - ./lib/coderay/scanners/ruby/patterns.rb
83
- - ./lib/coderay/scanners/ruby.rb
84
- - ./lib/coderay/scanners/scheme.rb
85
- - ./lib/coderay/scanners/sql.rb
86
- - ./lib/coderay/scanners/xml.rb
87
- - ./lib/coderay/scanners/yaml.rb
88
- - ./lib/coderay/style.rb
89
- - ./lib/coderay/styles/_map.rb
90
- - ./lib/coderay/styles/cycnus.rb
91
- - ./lib/coderay/styles/murphy.rb
92
- - ./lib/coderay/token_classes.rb
93
- - ./lib/coderay/tokens.rb
94
- - ./lib/coderay.rb
95
- - ./Rakefile
96
- - ./test/functional/basic.rb
97
- - ./test/functional/for_redcloth.rb
98
- - ./test/functional/load_plugin_scanner.rb
99
- - ./test/functional/suite.rb
100
- - ./test/functional/vhdl.rb
101
- - ./test/functional/word_list.rb
102
- - ./lib/README
103
- - ./LICENSE
104
- - lib/README
105
- - FOLDERS
21
+ extra_rdoc_files:
22
+ - README_INDEX.rdoc
23
+ files:
24
+ - LICENSE
25
+ - README_INDEX.rdoc
26
+ - Rakefile
27
+ - lib/coderay.rb
28
+ - lib/coderay/duo.rb
29
+ - lib/coderay/encoder.rb
30
+ - lib/coderay/encoders/_map.rb
31
+ - lib/coderay/encoders/comment_filter.rb
32
+ - lib/coderay/encoders/count.rb
33
+ - lib/coderay/encoders/debug.rb
34
+ - lib/coderay/encoders/div.rb
35
+ - lib/coderay/encoders/filter.rb
36
+ - lib/coderay/encoders/html.rb
37
+ - lib/coderay/encoders/html/css.rb
38
+ - lib/coderay/encoders/html/numbering.rb
39
+ - lib/coderay/encoders/html/output.rb
40
+ - lib/coderay/encoders/json.rb
41
+ - lib/coderay/encoders/lines_of_code.rb
42
+ - lib/coderay/encoders/null.rb
43
+ - lib/coderay/encoders/page.rb
44
+ - lib/coderay/encoders/span.rb
45
+ - lib/coderay/encoders/statistic.rb
46
+ - lib/coderay/encoders/terminal.rb
47
+ - lib/coderay/encoders/text.rb
48
+ - lib/coderay/encoders/token_kind_filter.rb
49
+ - lib/coderay/encoders/xml.rb
50
+ - lib/coderay/encoders/yaml.rb
51
+ - lib/coderay/for_redcloth.rb
52
+ - lib/coderay/helpers/file_type.rb
53
+ - lib/coderay/helpers/gzip.rb
54
+ - lib/coderay/helpers/plugin.rb
55
+ - lib/coderay/helpers/word_list.rb
56
+ - lib/coderay/scanner.rb
57
+ - lib/coderay/scanners/_map.rb
58
+ - lib/coderay/scanners/c.rb
59
+ - lib/coderay/scanners/clojure.rb
60
+ - lib/coderay/scanners/cpp.rb
61
+ - lib/coderay/scanners/css.rb
62
+ - lib/coderay/scanners/debug.rb
63
+ - lib/coderay/scanners/delphi.rb
64
+ - lib/coderay/scanners/diff.rb
65
+ - lib/coderay/scanners/erb.rb
66
+ - lib/coderay/scanners/groovy.rb
67
+ - lib/coderay/scanners/haml.rb
68
+ - lib/coderay/scanners/html.rb
69
+ - lib/coderay/scanners/java.rb
70
+ - lib/coderay/scanners/java/builtin_types.rb
71
+ - lib/coderay/scanners/java_script.rb
72
+ - lib/coderay/scanners/json.rb
73
+ - lib/coderay/scanners/php.rb
74
+ - lib/coderay/scanners/python.rb
75
+ - lib/coderay/scanners/raydebug.rb
76
+ - lib/coderay/scanners/ruby.rb
77
+ - lib/coderay/scanners/ruby/patterns.rb
78
+ - lib/coderay/scanners/ruby/string_state.rb
79
+ - lib/coderay/scanners/sql.rb
80
+ - lib/coderay/scanners/text.rb
81
+ - lib/coderay/scanners/xml.rb
82
+ - lib/coderay/scanners/yaml.rb
83
+ - lib/coderay/style.rb
84
+ - lib/coderay/styles/_map.rb
85
+ - lib/coderay/styles/alpha.rb
86
+ - lib/coderay/token_kinds.rb
87
+ - lib/coderay/tokens.rb
88
+ - lib/coderay/tokens_proxy.rb
89
+ - lib/coderay/version.rb
90
+ - test/functional/basic.rb
91
+ - test/functional/examples.rb
92
+ - test/functional/for_redcloth.rb
93
+ - test/functional/suite.rb
106
94
  - bin/coderay
107
- - bin/coderay_stylesheet
108
95
  homepage: http://coderay.rubychan.de
109
96
  licenses: []
110
-
111
97
  post_install_message:
112
- rdoc_options:
98
+ rdoc_options:
113
99
  - -SNw2
114
- - -mlib/README
100
+ - -mREADME_INDEX.rdoc
115
101
  - -t CodeRay Documentation
116
- require_paths:
102
+ require_paths:
117
103
  - lib
118
- required_ruby_version: !ruby/object:Gem::Requirement
104
+ required_ruby_version: !ruby/object:Gem::Requirement
119
105
  none: false
120
- requirements:
121
- - - ">="
122
- - !ruby/object:Gem::Version
123
- hash: 51
124
- segments:
125
- - 1
126
- - 8
127
- - 2
128
- version: 1.8.2
129
- required_rubygems_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: 1.8.6
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
130
111
  none: false
131
- requirements:
132
- - - ">="
133
- - !ruby/object:Gem::Version
134
- hash: 3
135
- segments:
136
- - 0
137
- version: "0"
112
+ requirements:
113
+ - - ! '>='
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
138
116
  requirements: []
139
-
140
117
  rubyforge_project: coderay
141
- rubygems_version: 1.7.2
118
+ rubygems_version: 1.8.10
142
119
  signing_key:
143
120
  specification_version: 3
144
121
  summary: Fast syntax highlighting for selected languages.
145
- test_files:
146
- - ./test/functional/suite.rb
122
+ test_files:
123
+ - test/functional/basic.rb
124
+ - test/functional/examples.rb
125
+ - test/functional/for_redcloth.rb
126
+ - test/functional/suite.rb
data/FOLDERS DELETED
@@ -1,53 +0,0 @@
1
- = CodeRay - Trunk folder structure
2
-
3
- == bench - Benchmarking system
4
-
5
- All benchmarking stuff goes here.
6
-
7
- Test inputs are stored in files named <code>example.<lang></code>.
8
- Test outputs go to <code>bench/test.<encoder-default-file-extension></code>.
9
-
10
- Run <code>bench/bench.rb</code> to get a usage description.
11
-
12
- Run <code>rake bench</code> to perform an example benchmark.
13
-
14
-
15
- == bin - Scripts
16
-
17
- Executional files for CodeRay.
18
-
19
-
20
- == demo - Demos and functional tests
21
-
22
- Demonstrational scripts to show of CodeRay's features.
23
-
24
- Run them as functional tests with <code>rake test:demos</code>.
25
-
26
-
27
- == etc - Lots of stuff
28
-
29
- Some addidtional files for CodeRay, mainly graphics and Vim scripts.
30
-
31
-
32
- == gem_server - Gem output folder
33
-
34
- For <code>rake gem</code>.
35
-
36
-
37
- == lib - CodeRay library code
38
-
39
- This is the base directory for the CodeRay library.
40
-
41
-
42
- == rake_helpers - Rake helper libraries
43
-
44
- Some files to enhance Rake, including the Autumnal Rdoc template and some scripts.
45
-
46
-
47
- == test - Tests
48
-
49
- Tests for the scanners.
50
-
51
- Each language has its own subfolder and sub-suite.
52
-
53
- Run with <code>rake test</code>.
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'coderay'
3
-
4
- puts CodeRay::Encoders[:html]::CSS.new.stylesheet
@@ -1,133 +0,0 @@
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
- =begin NUMERIZABLE_WRAPPINGS = {
13
- :table => [:div, :page, nil],
14
- :inline => :all,
15
- :list => [:div, :page, nil]
16
- }
17
- NUMERIZABLE_WRAPPINGS.default = :all
18
- =end
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
- highlight_lines = options[:highlight_lines]
36
- bolding =
37
- if bold_every == false && highlight_lines == nil
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
48
- elsif bold_every.is_a? Integer
49
- raise ArgumentError, ":bolding can't be 0." if bold_every == 0
50
- proc do |line|
51
- if line % bold_every == 0
52
- "<strong>#{line}</strong>" # every bold_every-th number in bold
53
- else
54
- line.to_s
55
- end
56
- end
57
- else
58
- raise ArgumentError, 'Invalid value %p for :bolding; false or Integer expected.' % bold_every
59
- end
60
-
61
- case mode
62
- when :inline
63
- max_width = (start + line_count).to_s.size
64
- line_number = start
65
- gsub!(/^/) do
66
- line_number_text = bolding.call line_number
67
- indent = ' ' * (max_width - line_number.to_s.size) # TODO: Optimize (10^x)
68
- res = "<span class=\"no\">#{indent}#{line_number_text}</span> "
69
- line_number += 1
70
- res
71
- end
72
-
73
- when :table
74
- # This is really ugly.
75
- # Because even monospace fonts seem to have different heights when bold,
76
- # I make the newline bold, both in the code and the line numbers.
77
- # FIXME Still not working perfect for Mr. Internet Exploder
78
- line_numbers = (start ... start + line_count).to_a.map(&bolding).join("\n")
79
- line_numbers << "\n" # also for Mr. MS Internet Exploder :-/
80
- line_numbers.gsub!(/\n/) { "<tt>\n</tt>" }
81
-
82
- line_numbers_table_tpl = TABLE.apply('LINE_NUMBERS', line_numbers)
83
- gsub!("</div>\n", '</div>')
84
- gsub!("\n", "<tt>\n</tt>")
85
- wrap_in! line_numbers_table_tpl
86
- @wrapped_in = :div
87
-
88
- when :list
89
- opened_tags = []
90
- gsub!(/^.*$\n?/) do |line|
91
- line.chomp!
92
-
93
- open = opened_tags.join
94
- line.scan(%r!<(/)?span[^>]*>?!) do |close,|
95
- if close
96
- opened_tags.pop
97
- else
98
- opened_tags << $&
99
- end
100
- end
101
- close = '</span>' * opened_tags.size
102
-
103
- "<li>#{open}#{line}#{close}</li>\n"
104
- end
105
- chomp!("\n")
106
- wrap_in! LIST
107
- @wrapped_in = :div
108
-
109
- else
110
- raise ArgumentError, 'Unknown value %p for mode: expected one of %p' %
111
- [mode, [:table, :list, :inline]]
112
- end
113
-
114
- self
115
- end
116
-
117
- def line_count
118
- line_count = count("\n")
119
- position_of_last_newline = rindex(?\n)
120
- if position_of_last_newline
121
- after_last_newline = self[position_of_last_newline + 1 .. -1]
122
- ends_with_newline = after_last_newline[/\A(?:<\/span>)*\z/]
123
- line_count += 1 if not ends_with_newline
124
- end
125
- line_count
126
- end
127
-
128
- end
129
-
130
- end
131
-
132
- end
133
- end