wbzyl-rack-codehighlighter 0.1.1 → 0.1.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.
data/README.markdown CHANGED
@@ -5,7 +5,7 @@ of exisitng code highlighters to make their usage as generic possible.
5
5
 
6
6
  To install it, run:
7
7
 
8
- sudo gem install wbzyl-codehighlighter-middleware -s http://gems.github.com
8
+ sudo gem install wbzyl-rack-codehighlighter -s http://gems.github.com
9
9
 
10
10
  Markup your code with:
11
11
 
@@ -19,10 +19,15 @@ Example (incomplete html, needs a layout file with link to css):
19
19
 
20
20
  require 'rubygems'
21
21
  require 'sinatra'
22
+
23
+ gem 'coderay'
22
24
  require 'coderay' # use the Coderay highlighter
23
25
 
24
26
  gem 'wbzyl-sinatra-rdiscount'
25
- require 'wbzyl-codehighlighter-middleware'
27
+ require 'sinatra/rdiscount'
28
+
29
+ gem 'wbzyl-rack-codehighlighter'
30
+ require 'rack/codehighlighter'
26
31
 
27
32
  use Rack::Codehighlighter, :coderay
28
33
 
@@ -0,0 +1,138 @@
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
@@ -0,0 +1,138 @@
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
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.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wlodek Bzyl
@@ -12,6 +12,16 @@ cert_chain: []
12
12
  date: 2009-05-31 00:00:00 -07:00
13
13
  default_executable:
14
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:
15
25
  - !ruby/object:Gem::Dependency
16
26
  name: hpricot
17
27
  type: :runtime
@@ -22,6 +32,16 @@ dependencies:
22
32
  - !ruby/object:Gem::Version
23
33
  version: 0.8.1
24
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:
25
45
  description: Rack Middleware for Code Highlighting.
26
46
  email: matwb@univ.gda.pl
27
47
  executables: []
@@ -32,12 +52,6 @@ extra_rdoc_files:
32
52
  - LICENSE
33
53
  - README.markdown
34
54
  files:
35
- - .gitignore
36
- - LICENSE
37
- - README.markdown
38
- - Rakefile
39
- - TODO
40
- - VERSION.yml
41
55
  - examples/app.rb
42
56
  - examples/config.ru
43
57
  - examples/public/javascripts/lang-css.js
@@ -65,6 +79,10 @@ files:
65
79
  - examples/public/stylesheets/uv/zenburnesque.css
66
80
  - examples/views/index.rdiscount
67
81
  - examples/views/layout.rdiscount
82
+ - lib/codehighlighter-middleware.rb
83
+ - lib/rack/codehighlighter.rb
84
+ - LICENSE
85
+ - README.markdown
68
86
  has_rdoc: false
69
87
  homepage: http://github.com/wbzyl/rack-codehighlighter
70
88
  post_install_message:
data/.gitignore DELETED
@@ -1,4 +0,0 @@
1
- \#*
2
- .\#*
3
- *~
4
- pkg
data/Rakefile DELETED
@@ -1,39 +0,0 @@
1
- require "rubygems"
2
- require "rake/gempackagetask"
3
- require "rake/clean"
4
- #require "spec/rake/spectask"
5
-
6
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '/lib')
7
-
8
- begin
9
- require 'jeweler'
10
- Jeweler::Tasks.new do |s|
11
- s.name = "rack-codehighlighter"
12
- s.summary = "Rack Middleware for Code Highlighting."
13
- s.email = "matwb@univ.gda.pl"
14
- s.homepage = "http://github.com/wbzyl/rack-codehighlighter"
15
- s.authors = ["Wlodek Bzyl"]
16
- s.description = s.summary
17
-
18
- # s.add_dependency 'coderay', '>=0.8.312'
19
- s.add_dependency 'hpricot', '>=0.8.1'
20
- end
21
- rescue LoadError
22
- puts "Jeweler not available."
23
- puts "Install it with:"
24
- puts " sudo gem install technicalpickles-jeweler -s http://gems.github.com"
25
- end
26
-
27
- #Rake::TestTask.new(:test) do |t|
28
- # t.libs << 'lib' << 'test'
29
- # t.pattern = 'test/**/*_test.rb'
30
- # t.verbose = false
31
- #end
32
-
33
- desc 'Install the package as a gem.'
34
- task :install => [:clean, :build] do
35
- gem = Dir['pkg/*.gem'].last
36
- sh "sudo gem install --no-rdoc --no-ri --local #{gem}"
37
- end
38
-
39
- task :default => :test
data/TODO DELETED
@@ -1,22 +0,0 @@
1
-
2
- [1.05.2009, done]
3
- Add support for code-prettify:
4
-
5
- * [source code](http://code.google.com/p/google-code-prettify/)
6
- [example](http://google-code-prettify.googlecode.com/svn/trunk/README.html)
7
-
8
-
9
- * see http://tomayko.com/writings/javascript-prettification
10
- (support for jQuery, new pallette)
11
-
12
- * example:
13
- <pre class="prettyprint lang-html">
14
- The lang-* class specifies the language file extensions.
15
- File extensions supported by default include
16
- "bsh", "c", "cc", "cpp", "cs", "csh", "cyc", "cv", "htm", "html",
17
- "java", "js", "m", "mxml", "perl", "pl", "pm", "py", "rb", "sh",
18
- "xhtml", "xml", "xsl".
19
- </pre>
20
-
21
- [1.05.2009]
22
- Add support for unobtrustive Code Highlighter By Dan Webb 11/2005
data/VERSION.yml DELETED
@@ -1,4 +0,0 @@
1
- ---
2
- :patch: 0
3
- :major: 0
4
- :minor: 1