wbzyl-rack-codehighlighter 0.1.2 → 0.1.3

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.
@@ -1,3 +1,4 @@
1
+ gem 'rack'
1
2
  require 'rack/utils'
2
3
 
3
4
  gem 'hpricot', '>=0.8.1'
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.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wlodek Bzyl
@@ -79,7 +79,6 @@ files:
79
79
  - examples/public/stylesheets/uv/zenburnesque.css
80
80
  - examples/views/index.rdiscount
81
81
  - examples/views/layout.rdiscount
82
- - lib/codehighlighter-middleware.rb
83
82
  - lib/rack/codehighlighter.rb
84
83
  - LICENSE
85
84
  - README.markdown
@@ -1,138 +0,0 @@
1
- require 'rack/utils'
2
-
3
- gem 'hpricot', '>=0.8.1'
4
- require 'hpricot'
5
-
6
- module Rack
7
- class Codehighlighter
8
- include Rack::Utils
9
-
10
- FORMAT = %{%s - [%s] [%s] "%s %s%s %s" (%s) %d %d %0.4f\n}
11
-
12
- def initialize(app, highlighter = :coderay, opts = {})
13
- @app = app
14
- @highlighter = highlighter
15
-
16
- @opts = { :element => "//pre/code", :pattern => /\A:::(\w+)\s*\n/ }
17
-
18
- @opts.merge! opts
19
- end
20
-
21
- def call(env)
22
- began_at = Time.now
23
- status, headers, response = @app.call(env)
24
- headers = HeaderHash.new(headers)
25
-
26
- if !STATUS_WITH_NO_ENTITY_BODY.include?(status) &&
27
- !headers['transfer-encoding'] &&
28
- headers['content-type'] &&
29
- headers['content-type'].include?("text/html")
30
-
31
- content = ""
32
- response.each { |part| content += part }
33
- doc = Hpricot(content)
34
- nodes = doc.search(@opts[:element])
35
- nodes.each do |node|
36
- s = node.inner_html || "[++where is the code?++]"
37
- node.parent.swap(send(@highlighter, s))
38
- end
39
-
40
- body = doc.to_html
41
- headers['content-length'] = body.bytesize.to_s
42
-
43
- log(env, status, headers, began_at) if @opts[:logging]
44
- [status, headers, [body]]
45
- else
46
- [status, headers, response]
47
- end
48
- end
49
-
50
- private
51
-
52
- def log(env, status, headers, began_at)
53
- # lilith.local [coderay] text/html [26/may/2009 12:00:00] "GET / HTTP/1.1" 200 ? ?\n
54
- now = Time.now
55
- logger = env['rack.errors']
56
- logger.write FORMAT % [
57
- env['HTTP_X_FORWARDED_FOR'] || env["REMOTE_ADDR"] || "-",
58
- @highlighter,
59
- now.strftime("%d/%b/%Y %H:%M:%S"),
60
- env["REQUEST_METHOD"],
61
- env["PATH_INFO"],
62
- env["QUERY_STRING"].empty? ? "" : "?"+env["QUERY_STRING"],
63
- env["HTTP_VERSION"],
64
- headers["content-type"] || "unknown",
65
- status.to_s[0..3],
66
- headers['content-length'],
67
- now - began_at
68
- ]
69
- end
70
-
71
- def syntax(string)
72
- translate = {
73
- 'html' => 'xml',
74
- 'c' => 'ansic',
75
- 'css' => 'css21',
76
- 'sql' => 'sqlite'
77
- }
78
- lang = 'unknown'
79
- refs = @opts[:pattern].match(string) # extract language name
80
- if refs
81
- lang = refs[1]
82
- convertor = ::Syntax::Convertors::HTML.for_syntax translate[lang]
83
- convertor.convert(unescape_html(string.sub(/\A.*\n/, "")) || "[=this can'n happen=]")
84
- else
85
- "<pre>#{string}</pre>"
86
- end
87
- end
88
-
89
- def coderay(string)
90
- lang = 'unknown'
91
- refs = @opts[:pattern].match(string) # extract language name
92
- if refs
93
- lang = refs[1]
94
- str = unescape_html(string.sub(@opts[:pattern], ""))
95
- "<pre class='CodeRay'>#{::CodeRay.encoder(:html).encode str, lang}</pre>"
96
- else
97
- "<pre class='CodeRay'>#{string}</pre>"
98
- end
99
- end
100
-
101
- def prettify(string)
102
- translate = {
103
- 'ruby' => 'rb',
104
- 'bash' => 'bsh',
105
- 'javascript' => 'js',
106
- 'python' => 'py'
107
- }
108
- lang = 'unknown'
109
- refs = @opts[:pattern].match(string) # extract language name
110
- if refs
111
- lang = refs[1]
112
- str = string.sub(@opts[:pattern], "")
113
- "<pre class='prettyprint lang-#{translate[lang] || lang}'>#{str}</pre>"
114
- else
115
- "<pre>#{string}</pre>"
116
- end
117
- end
118
-
119
- def ultraviolet(string)
120
- opts = { :theme => 'dawn', :lines => false }
121
- opts.merge! @opts
122
- lang = 'text'
123
- refs = @opts[:pattern].match(string) # extract language name
124
- if refs
125
- lang = refs[1]
126
- str = unescape_html(string.sub(@opts[:pattern], ""))
127
- "#{::Uv.parse(str, 'xhtml', lang, opts[:lines], opts[:theme])}"
128
- else
129
- "<pre class='#{opts[:theme]}'>#{string}</pre>"
130
- end
131
- end
132
-
133
- def unescape_html(string)
134
- string.to_s.gsub("&lt;", '<').gsub("&gt;", '>').gsub("&amp;", '&')
135
- end
136
-
137
- end
138
- end