hyperbolist-rack-codehighlighter 0.4.2

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 (36) hide show
  1. data/LICENSE +22 -0
  2. data/README.markdown +247 -0
  3. data/Rakefile +31 -0
  4. data/TODO +38 -0
  5. data/VERSION.yml +5 -0
  6. data/examples/app.rb +15 -0
  7. data/examples/check.rb +16 -0
  8. data/examples/config.ru +19 -0
  9. data/examples/public/javascripts/lang-css.js +2 -0
  10. data/examples/public/javascripts/lang-hs.js +2 -0
  11. data/examples/public/javascripts/lang-lisp.js +3 -0
  12. data/examples/public/javascripts/lang-lua.js +2 -0
  13. data/examples/public/javascripts/lang-ml.js +2 -0
  14. data/examples/public/javascripts/lang-proto.js +1 -0
  15. data/examples/public/javascripts/lang-sql.js +2 -0
  16. data/examples/public/javascripts/lang-vb.js +2 -0
  17. data/examples/public/javascripts/lang-wiki.js +1 -0
  18. data/examples/public/javascripts/prettify.js +31 -0
  19. data/examples/public/stylesheets/application.css +29 -0
  20. data/examples/public/stylesheets/censor.css +4 -0
  21. data/examples/public/stylesheets/coderay.css +126 -0
  22. data/examples/public/stylesheets/prettify.css +44 -0
  23. data/examples/public/stylesheets/syntax.css +79 -0
  24. data/examples/public/stylesheets/uv.css +1022 -0
  25. data/examples/public/stylesheets/uv/amy.css +147 -0
  26. data/examples/public/stylesheets/uv/blackboard.css +88 -0
  27. data/examples/public/stylesheets/uv/cobalt.css +149 -0
  28. data/examples/public/stylesheets/uv/dawn.css +121 -0
  29. data/examples/public/stylesheets/uv/espresso_libre.css +109 -0
  30. data/examples/public/stylesheets/uv/sunburst.css +180 -0
  31. data/examples/public/stylesheets/uv/twilight.css +137 -0
  32. data/examples/public/stylesheets/uv/zenburnesque.css +91 -0
  33. data/examples/views/index.erb +81 -0
  34. data/examples/views/layout.erb +38 -0
  35. data/lib/rack/codehighlighter.rb +152 -0
  36. metadata +121 -0
@@ -0,0 +1,81 @@
1
+ <h3>C</h3>
2
+
3
+ <pre>:::c
4
+ int a, b;
5
+ int main(int argc, char *argv[]) {
6
+ hello();
7
+ return 0;
8
+ }
9
+ void hello(void) {
10
+ printf("hello world\n");
11
+ }
12
+ </pre>
13
+
14
+ <h3>html</h3>
15
+
16
+ <pre>:::html
17
+ <html>
18
+ <head>
19
+ <title>hello world</title>
20
+ </head>
21
+ <body>
22
+ <h1>hello world</h1>
23
+ </body>
24
+ </html>
25
+ </pre>
26
+
27
+ <h3>ruby </h3>
28
+
29
+ <pre>:::ruby
30
+ def hello
31
+ puts 'hello world'
32
+ end
33
+ </pre>
34
+
35
+ <h3>css21</h3>
36
+
37
+ <pre>:::css
38
+ html {
39
+ margin: 0;
40
+ padding: 0;
41
+ background-color: #0C7D85;
42
+ line-height: 1.6;
43
+ }
44
+ body {
45
+ margin: 1em auto 1em auto;
46
+ padding: 1em 2em 2em 1em;
47
+ width: 760px;
48
+ border: 1px solid black;
49
+ background-color: #E8DDCB;
50
+ }
51
+ </pre>
52
+
53
+ <h3>sqlite</h3>
54
+
55
+ <pre>:::sql
56
+ drop table if exists exams;
57
+ create table exams (
58
+ id integer primary key autoincrement,
59
+ student_id integer not null, -- foreign key
60
+ result integer default 0 collate nocase,
61
+ when datetime
62
+ );
63
+ </pre>
64
+
65
+ <h3>javascript</h3>
66
+
67
+ <pre>:::javascript
68
+ for (var i = 0, length = properties.length; i < length; i++) {
69
+ var property = properties[i], value = source[property];
70
+ if (ancestor && Object.isFunction(value) &&
71
+ value.argumentNames().first() == "$super") {
72
+ var method = value, value = Object.extend((function(m) {
73
+ return function() { return ancestor[m].apply(this, arguments) };
74
+ })(property).wrap(method), {
75
+ valueOf: function() { return method },
76
+ toString: function() { return method.toString() }
77
+ });
78
+ }
79
+ this.prototype[property] = value;
80
+ }
81
+ </pre>
@@ -0,0 +1,38 @@
1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" http://www.w3.org/TR/html4/strict.dtd">
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8">
5
+ <link rel="stylesheet" href="/stylesheets/application.css"
6
+ type="text/css" media="screen" charset="utf-8">
7
+ <link rel="stylesheet" href="/stylesheets/syntax.css"
8
+ type="text/css" media="screen" charset="utf-8">
9
+ <link rel="stylesheet" href="/stylesheets/coderay.css"
10
+ type="text/css" media="screen" charset="utf-8">
11
+ <link rel="stylesheet" href="/stylesheets/uv.css"
12
+ type="text/css" media="screen" charset="utf-8">
13
+ <link rel="stylesheet" href="/stylesheets/censor.css"
14
+ type="text/css" media="screen" charset="utf-8"/>
15
+
16
+ <link rel="stylesheet" href="/stylesheets/prettify.css"
17
+ type="text/css" media="screen" charset="utf-8"/>
18
+
19
+ <script src="/javascripts/prettify.js"
20
+ type="text/javascript" charset="utf-8"></script>
21
+
22
+ <script src="http://www.google.com/jsapi"></script>
23
+ <script>
24
+ // on page load complete, fire off a prettyPrint
25
+ google.setOnLoadCallback(function() {
26
+ prettyPrint();
27
+ });
28
+ </script>
29
+
30
+ <title><%= "Code Highlighting Middleware" %></title>
31
+ </head>
32
+
33
+ <body>
34
+
35
+ <%= yield %>
36
+
37
+ </body>
38
+ </html>
@@ -0,0 +1,152 @@
1
+ require 'rack/utils'
2
+ require 'nokogiri'
3
+
4
+ module Rack
5
+ class Codehighlighter
6
+ include Rack::Utils
7
+
8
+ # for logging use
9
+ FORMAT = %{%s - [%s] [%s] "%s %s%s %s" (%s) %d %d %0.4f\n}
10
+
11
+ def initialize(app, highlighter = :censor, opts = {})
12
+ @app = app
13
+ @highlighter = highlighter
14
+ @opts = {
15
+ :element => "pre",
16
+ :pattern => /\A:::(\w+)\s*(\n|&#x000A;)/i, # &#x000A; == line feed
17
+ :reason => "[[-- ugly code removed --]]", #8-)
18
+ :markdown => false
19
+ }
20
+ @opts.merge! opts
21
+ end
22
+
23
+ def call(env)
24
+ began_at = Time.now
25
+ status, headers, response = @app.call(env)
26
+ headers = HeaderHash.new(headers)
27
+
28
+ if !STATUS_WITH_NO_ENTITY_BODY.include?(status) &&
29
+ !headers['transfer-encoding'] &&
30
+ headers['content-type'] &&
31
+ headers['content-type'].include?("text/html")
32
+
33
+ content = ""
34
+ response.each { |part| content += part }
35
+ doc = Nokogiri::HTML(content)
36
+ nodes = doc.search(@opts[:element])
37
+ nodes.each do |node|
38
+ s = node.inner_html || "[++where is the code?++]"
39
+ if @opts[:markdown]
40
+ node.parent.swap(send(@highlighter, s))
41
+ else
42
+ node.swap(send(@highlighter, s))
43
+ end
44
+ end
45
+
46
+ body = doc.to_html
47
+ headers['content-length'] = bytesize(body).to_s
48
+
49
+ log(env, status, headers, began_at) if @opts[:logging]
50
+ [status, headers, [body]]
51
+ else
52
+ [status, headers, response]
53
+ end
54
+ end
55
+
56
+ private
57
+
58
+ def log(env, status, headers, began_at)
59
+ # 127.0.0.1 - [ultraviolet] [10/Oct/2009 12:12:12] "GET /pastie HTTP/1.1" (text/html) 200 512 1.23
60
+ now = Time.now
61
+ logger = env['rack.errors']
62
+ logger.write FORMAT % [
63
+ env['HTTP_X_FORWARDED_FOR'] || env["REMOTE_ADDR"] || "-",
64
+ @highlighter,
65
+ now.strftime("%d/%b/%Y %H:%M:%S"),
66
+ env["REQUEST_METHOD"],
67
+ env["PATH_INFO"],
68
+ env["QUERY_STRING"].empty? ? "" : "?"+env["QUERY_STRING"],
69
+ env["HTTP_VERSION"],
70
+ headers["content-type"] || "unknown",
71
+ status.to_s[0..3],
72
+ headers['content-length'],
73
+ now - began_at
74
+ ]
75
+ end
76
+
77
+ # simplifies testing
78
+ def censor(string)
79
+ "<pre class='censor'>#{@opts[:reason]}</pre>"
80
+ end
81
+
82
+ def syntax(string)
83
+ # allow use html instead of xml
84
+ translate = {
85
+ 'html' => 'xml',
86
+ 'c' => 'ansic',
87
+ 'css' => 'css21',
88
+ 'sql' => 'sqlite'
89
+ }
90
+ lang = 'unknown'
91
+ refs = @opts[:pattern].match(string) # extract language name
92
+ if refs
93
+ lang = refs[1]
94
+ convertor = ::Syntax::Convertors::HTML.for_syntax translate[lang]
95
+ convertor.convert(unescape_html(string.sub(@opts[:pattern], "")) || "[=this can'n happen=]")
96
+ else
97
+ "<pre>#{string}</pre>"
98
+ end
99
+ end
100
+
101
+ def coderay(string)
102
+ lang = 'unknown'
103
+ refs = @opts[:pattern].match(string) # extract language name
104
+ if refs
105
+ lang = refs[1]
106
+ str = unescape_html(string.sub(@opts[:pattern], ""))
107
+ "<pre class='CodeRay'>#{::CodeRay.encoder(:html).encode str, lang}</pre>"
108
+ else
109
+ "<pre class='CodeRay'>#{string}</pre>"
110
+ end
111
+ end
112
+
113
+ # experimental Javascript highlighter
114
+ def prettify(string)
115
+ # prettify uses short names; I want to use full names
116
+ translate = {
117
+ 'ruby' => 'rb',
118
+ 'bash' => 'bsh',
119
+ 'javascript' => 'js',
120
+ 'python' => 'py'
121
+ }
122
+ lang = 'unknown'
123
+ refs = @opts[:pattern].match(string) # extract language name
124
+ if refs
125
+ lang = refs[1]
126
+ str = string.sub(@opts[:pattern], "")
127
+ "<pre class='prettyprint lang-#{translate[lang] || lang}'>#{str}</pre>"
128
+ else
129
+ "<pre>#{string}</pre>"
130
+ end
131
+ end
132
+
133
+ def ultraviolet(string)
134
+ opts = { :theme => 'dawn', :lines => false }
135
+ opts.merge! @opts
136
+ lang = 'text'
137
+ refs = @opts[:pattern].match(string) # extract language name
138
+ if refs
139
+ lang = refs[1]
140
+ str = unescape_html(string.sub(@opts[:pattern], ""))
141
+ "#{::Uv.parse(str, 'xhtml', lang, opts[:lines], opts[:theme])}"
142
+ else
143
+ "<pre class='#{opts[:theme]}'>#{string}</pre>"
144
+ end
145
+ end
146
+
147
+ def unescape_html(string)
148
+ string.to_s.gsub(/&#x000A;/i, "\n").gsub("&lt;", '<').gsub("&gt;", '>').gsub("&amp;", '&')
149
+ end
150
+
151
+ end
152
+ end
metadata ADDED
@@ -0,0 +1,121 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hyperbolist-rack-codehighlighter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.2
5
+ platform: ruby
6
+ authors:
7
+ - Eric Sherman
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-02-10 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rack
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.0.0
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: nokogiri
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.4.1
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: rack-test
37
+ type: :development
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 0.3.0
44
+ version:
45
+ description: Rack Middleware for Code Highlighting.
46
+ email: hyperbolist@gmail.com
47
+ executables: []
48
+
49
+ extensions: []
50
+
51
+ extra_rdoc_files:
52
+ - LICENSE
53
+ - README.markdown
54
+ - TODO
55
+ files:
56
+ - LICENSE
57
+ - Rakefile
58
+ - TODO
59
+ - VERSION.yml
60
+ - examples/app.rb
61
+ - examples/check.rb
62
+ - examples/config.ru
63
+ - examples/public/javascripts/lang-css.js
64
+ - examples/public/javascripts/lang-hs.js
65
+ - examples/public/javascripts/lang-lisp.js
66
+ - examples/public/javascripts/lang-lua.js
67
+ - examples/public/javascripts/lang-ml.js
68
+ - examples/public/javascripts/lang-proto.js
69
+ - examples/public/javascripts/lang-sql.js
70
+ - examples/public/javascripts/lang-vb.js
71
+ - examples/public/javascripts/lang-wiki.js
72
+ - examples/public/javascripts/prettify.js
73
+ - examples/public/stylesheets/application.css
74
+ - examples/public/stylesheets/censor.css
75
+ - examples/public/stylesheets/coderay.css
76
+ - examples/public/stylesheets/prettify.css
77
+ - examples/public/stylesheets/syntax.css
78
+ - examples/public/stylesheets/uv.css
79
+ - examples/public/stylesheets/uv/amy.css
80
+ - examples/public/stylesheets/uv/blackboard.css
81
+ - examples/public/stylesheets/uv/cobalt.css
82
+ - examples/public/stylesheets/uv/dawn.css
83
+ - examples/public/stylesheets/uv/espresso_libre.css
84
+ - examples/public/stylesheets/uv/sunburst.css
85
+ - examples/public/stylesheets/uv/twilight.css
86
+ - examples/public/stylesheets/uv/zenburnesque.css
87
+ - examples/views/index.erb
88
+ - examples/views/layout.erb
89
+ - lib/rack/codehighlighter.rb
90
+ - README.markdown
91
+ has_rdoc: true
92
+ homepage: http://github.com/hyperbolist/rack-codehighlighter
93
+ licenses: []
94
+
95
+ post_install_message:
96
+ rdoc_options:
97
+ - --charset=UTF-8
98
+ require_paths:
99
+ - lib
100
+ required_ruby_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: "0"
105
+ version:
106
+ required_rubygems_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: "0"
111
+ version:
112
+ requirements: []
113
+
114
+ rubyforge_project:
115
+ rubygems_version: 1.3.5
116
+ signing_key:
117
+ specification_version: 3
118
+ summary: Rack Middleware for Code Highlighting.
119
+ test_files:
120
+ - examples/app.rb
121
+ - examples/check.rb