hyperbolist-rack-codehighlighter 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
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