wbzyl-rack-codehighlighter 0.2.0 → 0.2.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/README.markdown +136 -104
- data/VERSION.yml +1 -1
- data/examples/config.ru +4 -4
- data/lib/rack/codehighlighter.rb +6 -3
- metadata +2 -2
data/README.markdown
CHANGED
@@ -1,33 +1,103 @@
|
|
1
|
-
# Rack
|
1
|
+
# Rack::Codehighlighter middleware
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
*Rack::Codehighlighter* provides a thin wrapper over
|
4
|
+
a bunch of code highlighters to make their usage as generic possible.
|
5
5
|
|
6
|
-
|
6
|
+
* ultraviolet
|
7
|
+
* coderay
|
8
|
+
* syntax
|
9
|
+
* prettify
|
10
|
+
* censor
|
7
11
|
|
8
|
-
|
12
|
+
Install the gem with:
|
9
13
|
|
10
|
-
|
11
|
-
I can not tell you how much time I’ve wasted trying to add in some
|
12
|
-
cool feature into rails. I would dig into the rails internals,
|
13
|
-
override methods, do all kinds of tricky stuff. I thought I was
|
14
|
-
awesome. A month later rails comes out with some cool new feature, I
|
15
|
-
update rails and everything explodes.
|
14
|
+
sudo gem install wbzyl-rack-codehighlighter -s http://gems.github.com
|
16
15
|
|
17
|
-
Code must be html-escaped.
|
18
16
|
|
19
|
-
|
17
|
+
The middleware reads HTML produced by an application, where it looks
|
18
|
+
for code blocks to highlight. Below we ask *coderay* to
|
19
|
+
highlight all `pre` elements:
|
20
20
|
|
21
|
+
use Rack::Codehighlighter, :coderay, :element => "pre", :pattern => /\A:::(\w+)\s*\n/
|
21
22
|
|
22
|
-
|
23
|
+
The middleware uses the pattern to learn what language the code block
|
24
|
+
contains, for example
|
25
|
+
|
26
|
+
<pre>:::ruby
|
27
|
+
puts "hello world"
|
28
|
+
</pre>
|
29
|
+
|
30
|
+
Plain description what the pattern says:
|
31
|
+
If the element contents begins with three colons, the text following
|
32
|
+
the colons, up to the end of line, identifies the language. The text
|
33
|
+
matched by the pattern is removed from the code block before
|
34
|
+
processing.
|
35
|
+
|
36
|
+
The above example could be shortened to:
|
37
|
+
|
38
|
+
use Rack::Codehighlighter, :coderay
|
39
|
+
|
40
|
+
because the default values for options are used.
|
41
|
+
|
42
|
+
Normalization:
|
43
|
+
|
44
|
+
* highlighted code is always wrapped with `pre` element
|
45
|
+
with attributes appropriate for codehighlighter used. (2
|
46
|
+
* language names are taken from Ultraviolet
|
47
|
+
|
48
|
+
|
49
|
+
## A simple example with inline template
|
50
|
+
|
51
|
+
# example.rb
|
52
|
+
|
53
|
+
require 'rubygems'
|
54
|
+
|
55
|
+
gem 'sinatra', '>=0.9.0'
|
56
|
+
require 'sinatra'
|
57
|
+
|
58
|
+
gem 'wbzyl-rack-codehighlighter', '>=0.2.0'
|
59
|
+
require 'rack/codehighlighter'
|
60
|
+
|
61
|
+
use Rack::Codehighlighter, :censor, :reason => '[[--difficult code removed--]]'
|
62
|
+
|
63
|
+
get "/" do
|
64
|
+
erb :hello
|
65
|
+
end
|
66
|
+
|
67
|
+
__END__
|
68
|
+
|
69
|
+
@@ hello
|
70
|
+
<h3>Fibonacci numbers in Ruby</h3>
|
71
|
+
|
72
|
+
<pre>:::ruby
|
73
|
+
def fib(n)
|
74
|
+
if n < 2
|
75
|
+
1
|
76
|
+
else
|
77
|
+
fib(n-2) + fib(n-1)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
</pre>
|
81
|
+
|
82
|
+
Run the above example with:
|
83
|
+
|
84
|
+
ruby example.rb
|
85
|
+
|
86
|
+
The results are accessible from `http://localhost:4567`.
|
23
87
|
|
24
|
-
sudo gem install wbzyl-rack-codehighlighter -s http://gems.github.com
|
25
88
|
|
26
|
-
|
89
|
+
## Why using middleware for code highlighting is awesome?
|
90
|
+
|
91
|
+
In pre-Rack applications era possible approaches were:
|
92
|
+
|
93
|
+
* pure javascript; cons code must be html-escaped
|
94
|
+
* gems; conection to methods responsible for code highlighting
|
95
|
+
is obtrusive, i.e. via plugin + additional markup
|
96
|
+
|
97
|
+
Analyze packages mentioned at the *The Ruby Toolbox* page:
|
27
98
|
[Syntax Highlighting](http://ruby-toolbox.com/categories/syntax_highlighting.html)
|
28
|
-
packages from the *The Ruby Toolbox* page.
|
29
99
|
|
30
|
-
|
100
|
+
Links:
|
31
101
|
|
32
102
|
http://carboni.ca/projects/harsh/
|
33
103
|
unless HAML is used
|
@@ -37,14 +107,15 @@ Exisitng practice is obtrusive:
|
|
37
107
|
does't degrade to html: new source tag
|
38
108
|
http://github.com/arya/tm_syntax_highlighting/
|
39
109
|
how to connect to rails/sinatra?
|
40
|
-
|
41
|
-
Pure Javascript highlighters:
|
42
|
-
|
43
|
-
In Ruby on Rails (redcloth)
|
44
|
-
|
45
|
-
Add censored method/example.
|
46
110
|
|
111
|
+
[*Ruby tips from me, your idol*](http://www.binarylogic.com/2009/04/19/ruby-tips-from-me-your-idol):
|
112
|
+
I can not tell you how much time I’ve wasted trying to add in some
|
113
|
+
cool feature into rails. I would dig into the rails internals,
|
114
|
+
override methods, do all kinds of tricky stuff. I thought I was
|
115
|
+
awesome. A month later rails comes out with some cool new feature, I
|
116
|
+
update rails and everything explodes.
|
47
117
|
|
118
|
+
Conclusion: highlighting via plugins is doomed to explode sooner or later.
|
48
119
|
|
49
120
|
|
50
121
|
## Using with Rack application
|
@@ -54,128 +125,89 @@ a **Sinatra** application. If your application includes a rackup file or
|
|
54
125
|
uses *Rack::Builder* to construct the application pipeline, simply
|
55
126
|
require and use as follows:
|
56
127
|
|
128
|
+
# get one of supported highlighters
|
129
|
+
gem 'coderay'
|
130
|
+
require 'coderay'
|
131
|
+
|
57
132
|
gem 'wbzyl-rack-codehighlighter'
|
58
133
|
require 'rack/codehighlighter'
|
59
|
-
|
60
|
-
|
61
|
-
require 'uv'
|
62
|
-
|
63
|
-
use Rack::Codehighlighter, :ultraviolet
|
134
|
+
|
135
|
+
use Rack::Codehighlighter, :coderay
|
64
136
|
run app
|
65
137
|
|
66
|
-
|
67
|
-
|
138
|
+
Remember to include in the layout an appropriate stylesheet
|
139
|
+
(look into `examples/public/stylesheets` directory
|
140
|
+
for sample stylesheets).
|
68
141
|
|
69
|
-
Include in the layout one of provided stylesheets.
|
70
142
|
|
71
143
|
## Using with Rails
|
72
144
|
|
73
145
|
In order to use include the following in a Rails application
|
74
146
|
`config/environment.rb` file:
|
75
147
|
|
148
|
+
# get one of supported highlighters
|
149
|
+
require 'coderay'
|
150
|
+
|
76
151
|
require 'rack/codehighlighter'
|
77
152
|
|
78
153
|
Rails::Initializer.run do |config|
|
154
|
+
config.gem 'coderay'
|
79
155
|
config.gem 'wbzyl-rack-codehighlighter'
|
80
|
-
|
156
|
+
|
157
|
+
config.middleware.use Rack::Codehighlighter, :coderay
|
81
158
|
end
|
82
159
|
|
83
160
|
Check the Rack configuration:
|
84
161
|
|
85
162
|
rake middleware
|
86
163
|
|
87
|
-
|
88
|
-
|
164
|
+
Remember to include in the layout an appropriate stylesheet
|
165
|
+
(look into `examples/public/stylesheets` directory
|
166
|
+
for sample stylesheets).
|
89
167
|
|
90
|
-
[*Ruby tips from me, your idol*](http://www.binarylogic.com/2009/04/19/ruby-tips-from-me-your-idol):
|
91
|
-
Think about what you are doing, try to understand it, come up with a
|
92
|
-
better solution, etc.
|
93
|
-
*Is it Rack a cool feature?*
|
94
|
-
|
95
|
-
|
96
|
-
## Configuration options
|
97
|
-
|
98
|
-
Markup your code with:
|
99
|
-
|
100
|
-
<pre><code>:::ruby
|
101
|
-
...
|
102
|
-
</code></pre>
|
103
|
-
|
104
|
-
## Quick Sinatra example
|
105
|
-
|
106
|
-
Example (incomplete html, needs a layout file with link to css):
|
107
|
-
|
108
|
-
# file example.rb
|
109
|
-
|
110
|
-
require 'rubygems'
|
111
|
-
require 'sinatra'
|
112
|
-
|
113
|
-
gem 'coderay'
|
114
|
-
require 'coderay'
|
115
|
-
|
116
|
-
gem 'wbzyl-rack-codehighlighter'
|
117
|
-
require 'rack/codehighlighter'
|
118
|
-
|
119
|
-
use Rack::Codehighlighter, :coderay
|
120
|
-
|
121
|
-
get "/" do
|
122
|
-
erb :hello
|
123
|
-
end
|
124
|
-
|
125
|
-
__END__
|
126
|
-
|
127
|
-
@@ hello
|
128
|
-
### Fibonacci numbers in Ruby
|
129
|
-
|
130
|
-
<pre><code>:::ruby
|
131
|
-
def fib(n)
|
132
|
-
if n < 2
|
133
|
-
1
|
134
|
-
else
|
135
|
-
fib(n-2) + fib(n-1)
|
136
|
-
end
|
137
|
-
end
|
138
|
-
</code></pre>
|
139
168
|
|
140
|
-
|
169
|
+
## Configuration examples
|
141
170
|
|
142
|
-
|
171
|
+
Coderay:
|
143
172
|
|
173
|
+
use Rack::Codehighlighter, :coderay,
|
174
|
+
:element => "pre", :pattern => /\A:::(\w+)\s*\n/, :logging => false
|
144
175
|
|
145
|
-
|
176
|
+
Ultraviolet:
|
146
177
|
|
147
|
-
|
178
|
+
use Rack::Codehighlighter, :ultraviolet, :theme => "dawn", :lines => false,
|
179
|
+
:element => "pre", :pattern => /\A:::(\w+)\s*\n/, :logging => false
|
148
180
|
|
149
|
-
|
150
|
-
the colons identifies the language (ruby in the example).
|
151
|
-
The first line is removed from the code block before processing.
|
181
|
+
Prettify:
|
152
182
|
|
153
|
-
|
183
|
+
use Rack::Codehighlighter, :prettify,
|
184
|
+
:element => "pre", :pattern => /\A:::(\w+)\s*\n/, :logging => false
|
154
185
|
|
155
|
-
|
186
|
+
Syntax:
|
156
187
|
|
157
|
-
|
188
|
+
use Rack::Codehighlighter, :syntax,
|
189
|
+
:element => "pre", :pattern => /\A:::(\w+)\s*\n/, :logging => false
|
158
190
|
|
159
|
-
|
191
|
+
Censor:
|
160
192
|
|
193
|
+
use Rack::Codehighlighter, :censor, :reason => "[[-- ugly code removed --]]",
|
194
|
+
:element => "pre", :pattern => /\A:::(\w+)\s*\n/, :logging => false
|
161
195
|
|
162
|
-
|
196
|
+
In the above examples, the default value of each option is used.
|
163
197
|
|
164
|
-
|
198
|
+
All highlighters use `pre` element to wrap highlighted code.
|
199
|
+
In Markdown, Maruku and RDiscount templates code is wrapped with `pre>code`.
|
200
|
+
To remove an extra nesting the `:markdown` option should be used:
|
165
201
|
|
166
|
-
|
202
|
+
use Rack::Codehighlighter, :coderay, :markdown => true
|
203
|
+
:element => "pre>code", :pattern => /\A:::(\w+)\s*\n/, :logging => false
|
167
204
|
|
168
205
|
|
169
|
-
## Supported
|
206
|
+
## Supported highlighters
|
170
207
|
|
171
208
|
These currently include: *Syntax* (fast), *Coderay* (very fast),
|
172
209
|
*Ultraviolet* (slow, but highlights almost any language).
|
173
210
|
|
174
|
-
The *Codehighlighter* gem provides a thin interface over a bunch of
|
175
|
-
exisitng code highlighters to make their usage as generic possible.
|
176
|
-
|
177
|
-
What does it mean? Explain.
|
178
|
-
|
179
211
|
|
180
212
|
### [Syntax](http://syntax.rubyforge.org/)
|
181
213
|
|
data/VERSION.yml
CHANGED
data/examples/config.ru
CHANGED
@@ -5,14 +5,14 @@ use Rack::Lint
|
|
5
5
|
|
6
6
|
# use default options
|
7
7
|
|
8
|
-
#use Rack::Codehighlighter, :prettify, :element => "
|
8
|
+
#use Rack::Codehighlighter, :prettify, :element => "pre", :pattern => /\A:::(\w+)\s*\n/, :logging => true
|
9
9
|
|
10
|
-
use Rack::Codehighlighter, :coderay, :element => "
|
10
|
+
use Rack::Codehighlighter, :coderay, :element => "pre", :pattern => /\A:::(\w+)\s*\n/, :logging => true
|
11
11
|
|
12
|
-
#use Rack::Codehighlighter, :syntax, :element => "
|
12
|
+
#use Rack::Codehighlighter, :syntax, :element => "pre", :pattern => /\A:::(\w+)\s*\n/, :logging => true
|
13
13
|
|
14
14
|
#use Rack::Codehighlighter, :ultraviolet, :theme => 'dawn',
|
15
|
-
# :element => "
|
15
|
+
# :element => "pre", :pattern => /\A:::(\w+)\s*\n/, :logging => true
|
16
16
|
|
17
17
|
#use Rack::Codehighlighter, :censor, :reason => '[[-- ugly code removed --]]'
|
18
18
|
|
data/lib/rack/codehighlighter.rb
CHANGED
@@ -14,7 +14,7 @@ module Rack
|
|
14
14
|
@app = app
|
15
15
|
@highlighter = highlighter
|
16
16
|
@opts = {
|
17
|
-
:element => "
|
17
|
+
:element => "pre",
|
18
18
|
:pattern => /\A:::(\w+)\s*\n/,
|
19
19
|
:reason => "[[-- ugly code removed --]]"
|
20
20
|
}
|
@@ -37,7 +37,7 @@ module Rack
|
|
37
37
|
nodes = doc.search(@opts[:element])
|
38
38
|
nodes.each do |node|
|
39
39
|
s = node.inner_html || "[++where is the code?++]"
|
40
|
-
if @opts[:
|
40
|
+
if @opts[:maruku]
|
41
41
|
node.parent.swap(send(@highlighter, s))
|
42
42
|
else
|
43
43
|
node.swap(send(@highlighter, s))
|
@@ -91,7 +91,7 @@ module Rack
|
|
91
91
|
if refs
|
92
92
|
lang = refs[1]
|
93
93
|
convertor = ::Syntax::Convertors::HTML.for_syntax translate[lang]
|
94
|
-
convertor.convert(unescape_html(string.sub(
|
94
|
+
convertor.convert(unescape_html(string.sub(@opts[:pattern], "")) || "[=this can'n happen=]")
|
95
95
|
else
|
96
96
|
"<pre>#{string}</pre>"
|
97
97
|
end
|
@@ -100,6 +100,7 @@ module Rack
|
|
100
100
|
def coderay(string)
|
101
101
|
lang = 'unknown'
|
102
102
|
refs = @opts[:pattern].match(string) # extract language name
|
103
|
+
# instead of pre the original/matched tag should be used
|
103
104
|
if refs
|
104
105
|
lang = refs[1]
|
105
106
|
str = unescape_html(string.sub(@opts[:pattern], ""))
|
@@ -118,6 +119,7 @@ module Rack
|
|
118
119
|
}
|
119
120
|
lang = 'unknown'
|
120
121
|
refs = @opts[:pattern].match(string) # extract language name
|
122
|
+
# instead of pre the original/matched tag should be used
|
121
123
|
if refs
|
122
124
|
lang = refs[1]
|
123
125
|
str = string.sub(@opts[:pattern], "")
|
@@ -137,6 +139,7 @@ module Rack
|
|
137
139
|
str = unescape_html(string.sub(@opts[:pattern], ""))
|
138
140
|
"#{::Uv.parse(str, 'xhtml', lang, opts[:lines], opts[:theme])}"
|
139
141
|
else
|
142
|
+
# instead of pre the original/matched tag should be used
|
140
143
|
"<pre class='#{opts[:theme]}'>#{string}</pre>"
|
141
144
|
end
|
142
145
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wbzyl-rack-codehighlighter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wlodek Bzyl
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-06-
|
12
|
+
date: 2009-06-07 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|