multigiri 0.0.4 → 0.0.5
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/CHANGELOG +8 -0
- data/examples/config.ru +19 -13
- data/lib/multigiri.rb +72 -25
- data/lib/multigiri/default_attributes.rb +1 -1
- data/lib/multigiri/email_obfuscator.rb +1 -1
- data/lib/multigiri/google_analytics.rb +2 -2
- data/lib/multigiri/html5.rb +1 -1
- data/lib/multigiri/link_checker.rb +1 -1
- data/lib/multigiri/minify.rb +1 -1
- data/lib/multigiri/version.rb +2 -2
- metadata +22 -10
data/CHANGELOG
CHANGED
@@ -7,3 +7,11 @@
|
|
7
7
|
|
8
8
|
= Version 0.0.3
|
9
9
|
* Added middleware for HTML minification
|
10
|
+
|
11
|
+
= Version 0.0.4
|
12
|
+
* Fixed NoMethodError in multigiri.rb
|
13
|
+
|
14
|
+
= Version 0.0.5
|
15
|
+
* Nokogiri was divided into Nokogiri::HTML & Nokogiri::XML
|
16
|
+
* Added content_types option which can take an array of strings or regexps for matching if multigiri will run for current content type
|
17
|
+
* Improved performance
|
data/examples/config.ru
CHANGED
@@ -11,23 +11,29 @@ require "multigiri/google_analytics"
|
|
11
11
|
# nokogiri, document so instead of [status, headers, body] you'll get
|
12
12
|
# [status, headers, document]. After the multigiri block everything
|
13
13
|
# will get to normal, so middlewares whichrun later won't be affected.
|
14
|
-
use Multigiri do
|
15
|
-
use HTML5::Forms
|
16
|
-
use HTML5::Hidden
|
17
|
-
use EmailObfuscator
|
18
|
-
use GoogleAnalytics, :my_tracking_code
|
14
|
+
use Multigiri::HTML do
|
15
|
+
use Multigiri::HTML5::Forms
|
16
|
+
use Multigiri::HTML5::Hidden
|
17
|
+
use Multigiri::EmailObfuscator
|
18
|
+
use Multigiri::GoogleAnalytics, :my_tracking_code
|
19
19
|
end
|
20
20
|
|
21
|
-
#
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
# RSS / Atom feeds processing
|
22
|
+
use Multigiri::XML, content_types: ["application/rss+xml", "application/atom+xml"] do
|
23
|
+
# TODO
|
24
|
+
end
|
25
25
|
|
26
|
-
#
|
27
|
-
|
28
|
-
#
|
29
|
-
|
26
|
+
# Generic XML processing
|
27
|
+
use Multigiri::XML, content_types: [/\/xml$/] do
|
28
|
+
# TODO
|
29
|
+
end
|
30
30
|
|
31
|
+
use Rack::ContentType, "text/html"
|
32
|
+
|
33
|
+
# We can't use the trick with __END__ as is used in sinatra,
|
34
|
+
# since the content of the rackup file is eval-ed. This
|
35
|
+
# crappy design leads to more problems than just this one.
|
36
|
+
# template = ::File.read(__FILE__).split("__END__").last
|
31
37
|
template = ::File.read(__FILE__).match(/=begin template\n(.+)\n=end/m)[1]
|
32
38
|
|
33
39
|
run lambda { |env| [200, Hash.new, [template]] }
|
data/lib/multigiri.rb
CHANGED
@@ -10,34 +10,81 @@
|
|
10
10
|
require "nokogiri"
|
11
11
|
|
12
12
|
# TODO: args for nokogiri, export format, indentation etc
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
13
|
+
module Multigiri
|
14
|
+
class HTML
|
15
|
+
# Ruby GC is weak
|
16
|
+
CONTENT_TYPE = "Content-Type"
|
17
|
+
CONTENT_LENGTH = "Content-Length"
|
18
|
+
DEFAULT_TYPES = ["text/html"]
|
19
|
+
|
20
|
+
attr_reader :options, :block
|
21
|
+
def initialize(app, options = Hash.new, &block)
|
22
|
+
@app, @options, @block = app, options, block
|
23
|
+
@options[:indentation] ||= 2
|
24
|
+
@options[:content_types] ||= self.class::DEFAULT_TYPES
|
25
|
+
end
|
26
|
+
|
27
|
+
def call(env)
|
28
|
+
status, headers, chunks = @app.call(env)
|
29
|
+
check_content_type(headers)
|
30
|
+
if options[:content_types].empty? || options[:content_types].any? { |type| headers[CONTENT_TYPE].match(type) }
|
31
|
+
run(env, status, headers, chunks)
|
32
|
+
else
|
33
|
+
[status, headers, chunks]
|
34
|
+
end
|
35
|
+
end
|
19
36
|
|
20
|
-
def call(env)
|
21
37
|
# convert to a Nokogiri document
|
22
|
-
status, headers, chunks
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
38
|
+
def run(env, status, headers, chunks)
|
39
|
+
# the only what we know about body is that it has to respond to #each
|
40
|
+
body = String.new
|
41
|
+
chunks.each { |chunk| body += chunk }
|
42
|
+
document = Nokogiri::HTML(body) # before
|
43
|
+
@stack = lambda { |env| [status, headers, document] }
|
44
|
+
|
45
|
+
# get middlewares
|
46
|
+
self.instance_eval(&@block) if @block
|
47
|
+
|
48
|
+
# convert back to a [String]
|
49
|
+
status, headers, document = @stack.call(env)
|
50
|
+
body = document.to_html(indentation: options[:indentation]) # TODO
|
51
|
+
headers[CONTENT_LENGTH] = body.bytesize.to_s
|
52
|
+
return [status, headers, [body]]
|
53
|
+
end
|
54
|
+
|
55
|
+
# GoogleAnalytics.new(Other.new(self), tracking_code)
|
56
|
+
def use(klass, *args, &block)
|
57
|
+
@stack = klass.new(@stack, *args, &block)
|
58
|
+
end
|
59
|
+
|
60
|
+
protected
|
61
|
+
def check_content_type(headers)
|
62
|
+
if headers[CONTENT_TYPE].nil? && !options[:content_types].empty?
|
63
|
+
raise "Content-Type has to be set before you call multigiri, so multigiri can decide if it will parse the document or not!"
|
64
|
+
end
|
65
|
+
end
|
37
66
|
end
|
38
67
|
|
39
|
-
|
40
|
-
|
41
|
-
|
68
|
+
class XML < HTML
|
69
|
+
# XML has many MIME types, if you want to work with all posible XML MIME types, you can use
|
70
|
+
# use Multigiri, mime_type: /xml/
|
71
|
+
DEFAULT_TYPES = ["text/xml"]
|
72
|
+
|
73
|
+
def run(env, status, headers, chunks)
|
74
|
+
# the only what we know about body is that it has to respond to #each
|
75
|
+
body = String.new
|
76
|
+
chunks.each { |chunk| body += chunk }
|
77
|
+
document = Nokogiri::XML(body) # before
|
78
|
+
@stack = lambda { |env| [status, headers, document] }
|
79
|
+
|
80
|
+
# get middlewares
|
81
|
+
self.instance_eval(&@block) if @block
|
82
|
+
|
83
|
+
# convert back to a [String]
|
84
|
+
status, headers, document = @stack.call(env)
|
85
|
+
body = document.to_xml(indentation: options[:indentation]) # TODO
|
86
|
+
headers[CONTENT_LENGTH] = body.bytesize.to_s
|
87
|
+
return [status, headers, [body]]
|
88
|
+
end
|
42
89
|
end
|
43
90
|
end
|
@@ -7,7 +7,7 @@
|
|
7
7
|
# use GoogleAnalytics, :my_tracking_code if Rango.production?
|
8
8
|
# end
|
9
9
|
|
10
|
-
|
10
|
+
module Multigiri
|
11
11
|
class GoogleAnalytics
|
12
12
|
attr_accessor :tracking_code
|
13
13
|
def initialize(app, tracking_code)
|
@@ -27,7 +27,7 @@ class Multigiri
|
|
27
27
|
|
28
28
|
protected
|
29
29
|
def script(body, content)
|
30
|
-
script = Nokogiri::XML::Node.new(
|
30
|
+
script = Nokogiri::XML::Node.new("script", body.document)
|
31
31
|
script.inner_html = content
|
32
32
|
body.add_child(script)
|
33
33
|
end
|
data/lib/multigiri/html5.rb
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
# In future it can detect if the browser is capable to deal with given HTML 5 feature and
|
6
6
|
# if yes, then there will be no transformation required. But then carefully with caching :)
|
7
|
-
|
7
|
+
module Multigiri
|
8
8
|
module HTML5
|
9
9
|
# Browsers supporting HTML 5 should can submit forms through PUT or DELETE natively.
|
10
10
|
class Forms
|
data/lib/multigiri/minify.rb
CHANGED
data/lib/multigiri/version.rb
CHANGED
metadata
CHANGED
@@ -1,26 +1,33 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: multigiri
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 5
|
9
|
+
version: 0.0.5
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Jakub Stastny aka Botanicus
|
8
13
|
autorequire:
|
9
14
|
bindir: bin
|
10
15
|
cert_chain:
|
11
|
-
date: 2010-03-
|
16
|
+
date: 2010-03-24 00:00:00 +00:00
|
12
17
|
default_executable: multigiri
|
13
18
|
dependencies:
|
14
19
|
- !ruby/object:Gem::Dependency
|
15
20
|
name: nokogiri
|
16
|
-
|
17
|
-
|
18
|
-
version_requirements: !ruby/object:Gem::Requirement
|
21
|
+
prerelease: false
|
22
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
19
23
|
requirements:
|
20
24
|
- - ">="
|
21
25
|
- !ruby/object:Gem::Version
|
26
|
+
segments:
|
27
|
+
- 0
|
22
28
|
version: "0"
|
23
|
-
|
29
|
+
type: :runtime
|
30
|
+
version_requirements: *id001
|
24
31
|
description: ""
|
25
32
|
email: stastny@101ideas.cz
|
26
33
|
executables: []
|
@@ -57,7 +64,9 @@ has_rdoc: true
|
|
57
64
|
homepage: http://github.com/botanicus/multigiri
|
58
65
|
licenses: []
|
59
66
|
|
60
|
-
post_install_message: "[\e[32mVersion 0.0.
|
67
|
+
post_install_message: "[\e[32mVersion 0.0.5\e[0m] Nokogiri was divided into Nokogiri::HTML & Nokogiri::XML\n\
|
68
|
+
[\e[32mVersion 0.0.5\e[0m] Added content_types option which can take an array of strings or regexps for matching if multigiri will run for current content type\n\
|
69
|
+
[\e[32mVersion 0.0.5\e[0m] Improved performance\n"
|
61
70
|
rdoc_options: []
|
62
71
|
|
63
72
|
require_paths:
|
@@ -66,18 +75,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
66
75
|
requirements:
|
67
76
|
- - ">="
|
68
77
|
- !ruby/object:Gem::Version
|
78
|
+
segments:
|
79
|
+
- 1
|
80
|
+
- 9
|
69
81
|
version: "1.9"
|
70
|
-
version:
|
71
82
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
83
|
requirements:
|
73
84
|
- - ">="
|
74
85
|
- !ruby/object:Gem::Version
|
86
|
+
segments:
|
87
|
+
- 0
|
75
88
|
version: "0"
|
76
|
-
version:
|
77
89
|
requirements: []
|
78
90
|
|
79
91
|
rubyforge_project: multigiri
|
80
|
-
rubygems_version: 1.3.
|
92
|
+
rubygems_version: 1.3.6
|
81
93
|
signing_key:
|
82
94
|
specification_version: 3
|
83
95
|
summary: ""
|