rack-pygments 0.2 → 0.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.
@@ -0,0 +1,9 @@
1
+ module Rack
2
+ class Pygments
3
+ module Version
4
+ STRING = "0.3"
5
+ MAJOR = 0
6
+ MINOR = 3
7
+ end
8
+ end
9
+ end
data/lib/rack/pygments.rb CHANGED
@@ -5,7 +5,7 @@ module Rack
5
5
 
6
6
  def initialize(app, opts={})
7
7
  @app = app
8
- @tag = opts[:html_tag].nil? ? 'highlight' : opts[:html_tag]
8
+ @tag = opts[:html_tag].nil? ? 'highlight' : opts[:html_tag]
9
9
  @attr = opts[:html_attr].nil? ? 'lang' : opts[:html_attr]
10
10
  if system("which pygmentize > /dev/null")
11
11
  @bin = `which pygmentize`.chomp
@@ -15,22 +15,26 @@ module Rack
15
15
  end
16
16
 
17
17
  def call(env)
18
- if env["PATH_INFO"] !~ /.*\.css$/
19
18
  status, headers, response = @app.call(env)
20
- content = response.each.map.join
21
- document = Nokogiri::HTML(content)
22
- nodes = document.css(@tag)
23
- nodes.each do |node|
24
- lang = node.attribute(@attr).nil? ? 'bash' : node.attribute(@attr).value
25
- pygmentize = `echo '#{node.content}' | #{@bin} -l #{lang} -f html`
26
- node.replace(Nokogiri::HTML(pygmentize).css("div.highlight").first)
27
- end
28
- response = document.to_s
29
- headers["Content-Length"] = response.length.to_s
30
- [status,headers,[response]]
31
- else
32
- @app.call(env)
19
+ return [status, headers, response] unless pygmentize?(status, headers)
20
+ response_body = pygmentize(response.join)
21
+ headers["Content-Length"] = response_body.length.to_s
22
+ [status,headers,[response_body]]
23
+ end
24
+
25
+ def pygmentize?(status, headers)
26
+ status == 200 && headers['Content-Type'] =~ /html/
27
+ end
28
+
29
+ def pygmentize(content)
30
+ document = Nokogiri::HTML(content)
31
+ nodes = document.css(@tag)
32
+ nodes.each do |node|
33
+ lang = node.attribute(@attr).nil? ? 'bash' : node.attribute(@attr).value
34
+ pygmentized = `echo '#{node.content}' | #{@bin} -l #{lang} -f html`
35
+ node.replace(Nokogiri::HTML(pygmentized).css("div.highlight").first)
33
36
  end
37
+ document.to_s
34
38
  end
35
39
  end
36
40
  end
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+ require 'nokogiri'
3
+
4
+ class App
5
+ def initialize(env={})
6
+ @env = env
7
+ end
8
+
9
+ def call(env={})
10
+ [@env[:status], @env[:headers], @env[:response]]
11
+ end
12
+ end
13
+
14
+ shared_examples_for "a pass-through" do
15
+ it "passes the status, headers, and response through unchanged" do
16
+ pygments.call({}).should == [status, headers, response]
17
+ end
18
+ end
19
+
20
+ describe Rack::Pygments do
21
+ describe "#call" do
22
+ let(:app) do
23
+ App.new(:status => status,
24
+ :headers => headers,
25
+ :response => response)
26
+ end
27
+ let(:status) { 200 }
28
+ let(:headers) { {'Content-Length' => 0, 'Content-Type' => 'text/html'} }
29
+ let(:response) { [] }
30
+ let(:pygments) { Rack::Pygments.new(app)}
31
+ context "when the response content is HTML" do
32
+ context "and the response status is 200" do
33
+ context "and there is no highlight element in the HTML" do
34
+ let(:response) do
35
+ doc = <<-DOC
36
+ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
37
+ <html>
38
+ <head><title>Page</title></head>
39
+ <body><h1>Header</h1></body>
40
+ </html>
41
+ DOC
42
+ [doc]
43
+ end
44
+ it_should_behave_like "a pass-through"
45
+ end
46
+ context "and there is a highlight element in the HTML" do
47
+ let(:response) do
48
+ doc = <<-DOC
49
+ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
50
+ <html>
51
+ <head><title>Page</title></head>
52
+ <body><h1>Header</h1><highlight lang="ruby">@var='foo'</highlight></body>
53
+ </html>
54
+ DOC
55
+ [doc]
56
+ end
57
+ it "replaces the highlight element with a div containing marked-up code" do
58
+ response = pygments.call({})[2]
59
+ document = Nokogiri::HTML(response.join)
60
+ document.css('highlight').should be_empty
61
+ document.css('div.highlight').should have(1).element
62
+ end
63
+ end
64
+ end
65
+ context "and the response status is not 200" do
66
+ let(:status) { 304 }
67
+ it_should_behave_like "a pass-through"
68
+ end
69
+ end
70
+ context "when the response content is not HTML" do
71
+ before { headers['Content-Type'] = 'text/css' }
72
+ it_should_behave_like "a pass-through"
73
+ end
74
+ end
75
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,2 @@
1
+ --colour
2
+ --format=specdoc
@@ -0,0 +1,2 @@
1
+ require 'spec'
2
+ require 'rack/pygments'
metadata CHANGED
@@ -4,16 +4,17 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 2
8
- version: "0.2"
7
+ - 3
8
+ version: "0.3"
9
9
  platform: ruby
10
10
  authors:
11
11
  - Bryan Goines
12
+ - Matt Yoho
12
13
  autorequire:
13
14
  bindir: bin
14
15
  cert_chain: []
15
16
 
16
- date: 2010-05-07 00:00:00 -05:00
17
+ date: 2010-07-19 00:00:00 -05:00
17
18
  default_executable:
18
19
  dependencies:
19
20
  - !ruby/object:Gem::Dependency
@@ -40,6 +41,18 @@ dependencies:
40
41
  version: "0"
41
42
  type: :runtime
42
43
  version_requirements: *id002
44
+ - !ruby/object:Gem::Dependency
45
+ name: rspec
46
+ prerelease: false
47
+ requirement: &id003 !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ segments:
52
+ - 0
53
+ version: "0"
54
+ type: :development
55
+ version_requirements: *id003
43
56
  description: rack-pygments - Rack Middleware for Pygments, the syntax highlighter
44
57
  email: bryan@ffiirree.com
45
58
  executables: []
@@ -49,13 +62,14 @@ extensions: []
49
62
  extra_rdoc_files:
50
63
  - README
51
64
  files:
65
+ - lib/rack/pygments/version.rb
52
66
  - lib/rack/pygments.rb
67
+ - examples/sinatra/public/style.css
53
68
  - examples/sinatra/app.rb
54
69
  - examples/sinatra/config.ru
55
- - examples/sinatra/public/style.css
56
70
  - LICENSE
57
71
  - README
58
- has_rdoc: false
72
+ has_rdoc: true
59
73
  homepage: http://github.com/bry4n/rack-pygments
60
74
  licenses: []
61
75
 
@@ -85,5 +99,7 @@ rubygems_version: 1.3.6
85
99
  signing_key:
86
100
  specification_version: 1
87
101
  summary: rack-pygments
88
- test_files: []
89
-
102
+ test_files:
103
+ - spec/lib/rack/pygments_spec.rb
104
+ - spec/spec.opts
105
+ - spec/spec_helper.rb