wisepdf 1.2.6 → 1.2.7
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/Gemfile +2 -2
- data/Gemfile.lock +36 -30
- data/MIT-LICENSE +3 -3
- data/README.md +23 -12
- data/VERSION +1 -1
- data/lib/generators/wisepdf_generator.rb +1 -1
- data/lib/wisepdf/configuration.rb +14 -14
- data/lib/wisepdf/errors.rb +2 -2
- data/lib/wisepdf/ext.rb +2 -2
- data/lib/wisepdf/helper.rb +10 -10
- data/lib/wisepdf/parser.rb +14 -14
- data/lib/wisepdf/rails/railtie.rb +2 -2
- data/lib/wisepdf/rails.rb +3 -3
- data/lib/wisepdf/render.rb +16 -16
- data/lib/wisepdf/writer.rb +13 -14
- data/test/application_controller_test.rb +9 -9
- data/test/configuration_test.rb +10 -10
- data/test/dummy/app/controllers/application_controller.rb +3 -3
- data/test/helper_assets_test.rb +9 -9
- data/test/helper_legacy_test.rb +9 -9
- data/test/parser_test.rb +14 -14
- data/test/writer_test.rb +8 -8
- data/wisepdf.gemspec +2 -2
- metadata +3 -3
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
GEM
|
|
2
2
|
remote: http://rubygems.org/
|
|
3
3
|
specs:
|
|
4
|
-
actionmailer (3.2.
|
|
5
|
-
actionpack (= 3.2.
|
|
4
|
+
actionmailer (3.2.11)
|
|
5
|
+
actionpack (= 3.2.11)
|
|
6
6
|
mail (~> 2.4.4)
|
|
7
|
-
actionpack (3.2.
|
|
8
|
-
activemodel (= 3.2.
|
|
9
|
-
activesupport (= 3.2.
|
|
7
|
+
actionpack (3.2.11)
|
|
8
|
+
activemodel (= 3.2.11)
|
|
9
|
+
activesupport (= 3.2.11)
|
|
10
10
|
builder (~> 3.0.0)
|
|
11
11
|
erubis (~> 2.7.0)
|
|
12
12
|
journey (~> 1.0.4)
|
|
@@ -14,21 +14,23 @@ GEM
|
|
|
14
14
|
rack-cache (~> 1.2)
|
|
15
15
|
rack-test (~> 0.6.1)
|
|
16
16
|
sprockets (~> 2.2.1)
|
|
17
|
-
activemodel (3.2.
|
|
18
|
-
activesupport (= 3.2.
|
|
17
|
+
activemodel (3.2.11)
|
|
18
|
+
activesupport (= 3.2.11)
|
|
19
19
|
builder (~> 3.0.0)
|
|
20
|
-
activerecord (3.2.
|
|
21
|
-
activemodel (= 3.2.
|
|
22
|
-
activesupport (= 3.2.
|
|
20
|
+
activerecord (3.2.11)
|
|
21
|
+
activemodel (= 3.2.11)
|
|
22
|
+
activesupport (= 3.2.11)
|
|
23
23
|
arel (~> 3.0.2)
|
|
24
24
|
tzinfo (~> 0.3.29)
|
|
25
|
-
activeresource (3.2.
|
|
26
|
-
activemodel (= 3.2.
|
|
27
|
-
activesupport (= 3.2.
|
|
28
|
-
activesupport (3.2.
|
|
25
|
+
activeresource (3.2.11)
|
|
26
|
+
activemodel (= 3.2.11)
|
|
27
|
+
activesupport (= 3.2.11)
|
|
28
|
+
activesupport (3.2.11)
|
|
29
29
|
i18n (~> 0.6)
|
|
30
30
|
multi_json (~> 1.0)
|
|
31
31
|
arel (3.0.2)
|
|
32
|
+
bourne (1.1.2)
|
|
33
|
+
mocha (= 0.10.5)
|
|
32
34
|
builder (3.0.4)
|
|
33
35
|
erubis (2.7.0)
|
|
34
36
|
git (1.2.5)
|
|
@@ -39,45 +41,49 @@ GEM
|
|
|
39
41
|
git (>= 1.2.5)
|
|
40
42
|
rake
|
|
41
43
|
journey (1.0.4)
|
|
42
|
-
json (1.7.
|
|
44
|
+
json (1.7.6)
|
|
43
45
|
mail (2.4.4)
|
|
44
46
|
i18n (>= 0.4.0)
|
|
45
47
|
mime-types (~> 1.16)
|
|
46
48
|
treetop (~> 1.4.8)
|
|
49
|
+
metaclass (0.0.1)
|
|
47
50
|
mime-types (1.19)
|
|
48
|
-
|
|
51
|
+
mocha (0.10.5)
|
|
52
|
+
metaclass (~> 0.0.1)
|
|
53
|
+
multi_json (1.5.0)
|
|
49
54
|
polyglot (0.3.3)
|
|
50
|
-
rack (1.4.
|
|
55
|
+
rack (1.4.3)
|
|
51
56
|
rack-cache (1.2)
|
|
52
57
|
rack (>= 0.4)
|
|
53
58
|
rack-ssl (1.3.2)
|
|
54
59
|
rack
|
|
55
60
|
rack-test (0.6.2)
|
|
56
61
|
rack (>= 1.0)
|
|
57
|
-
rails (3.2.
|
|
58
|
-
actionmailer (= 3.2.
|
|
59
|
-
actionpack (= 3.2.
|
|
60
|
-
activerecord (= 3.2.
|
|
61
|
-
activeresource (= 3.2.
|
|
62
|
-
activesupport (= 3.2.
|
|
62
|
+
rails (3.2.11)
|
|
63
|
+
actionmailer (= 3.2.11)
|
|
64
|
+
actionpack (= 3.2.11)
|
|
65
|
+
activerecord (= 3.2.11)
|
|
66
|
+
activeresource (= 3.2.11)
|
|
67
|
+
activesupport (= 3.2.11)
|
|
63
68
|
bundler (~> 1.0)
|
|
64
|
-
railties (= 3.2.
|
|
65
|
-
railties (3.2.
|
|
66
|
-
actionpack (= 3.2.
|
|
67
|
-
activesupport (= 3.2.
|
|
69
|
+
railties (= 3.2.11)
|
|
70
|
+
railties (3.2.11)
|
|
71
|
+
actionpack (= 3.2.11)
|
|
72
|
+
activesupport (= 3.2.11)
|
|
68
73
|
rack-ssl (~> 1.3.2)
|
|
69
74
|
rake (>= 0.8.7)
|
|
70
75
|
rdoc (~> 3.4)
|
|
71
76
|
thor (>= 0.14.6, < 2.0)
|
|
72
|
-
rake (10.0.
|
|
77
|
+
rake (10.0.3)
|
|
73
78
|
rdoc (3.12)
|
|
74
79
|
json (~> 1.4)
|
|
75
80
|
shoulda (3.3.2)
|
|
76
81
|
shoulda-context (~> 1.0.1)
|
|
77
82
|
shoulda-matchers (~> 1.4.1)
|
|
78
|
-
shoulda-context (1.0.
|
|
79
|
-
shoulda-matchers (1.4.
|
|
83
|
+
shoulda-context (1.0.2)
|
|
84
|
+
shoulda-matchers (1.4.2)
|
|
80
85
|
activesupport (>= 3.0.0)
|
|
86
|
+
bourne (~> 1.1.2)
|
|
81
87
|
sprockets (2.2.2)
|
|
82
88
|
hike (~> 1.2)
|
|
83
89
|
multi_json (~> 1.0)
|
data/MIT-LICENSE
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Copyright (c) 2008 Miles Z. Sterret
|
|
2
|
-
|
|
2
|
+
|
|
3
3
|
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
4
|
a copy of this software and associated documentation files (the
|
|
5
5
|
"Software"), to deal in the Software without restriction, including
|
|
@@ -7,10 +7,10 @@ without limitation the rights to use, copy, modify, merge, publish,
|
|
|
7
7
|
distribute, sublicense, and/or sell copies of the Software, and to
|
|
8
8
|
permit persons to whom the Software is furnished to do so, subject to
|
|
9
9
|
the following conditions:
|
|
10
|
-
|
|
10
|
+
|
|
11
11
|
The above copyright notice and this permission notice shall be
|
|
12
12
|
included in all copies or substantial portions of the Software.
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
15
15
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
16
16
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
data/README.md
CHANGED
|
@@ -23,7 +23,7 @@ Add this to your Gemfile:
|
|
|
23
23
|
|
|
24
24
|
then do:
|
|
25
25
|
|
|
26
|
-
bundle
|
|
26
|
+
bundle install
|
|
27
27
|
|
|
28
28
|
## How does it work?
|
|
29
29
|
|
|
@@ -230,17 +230,28 @@ However, the wisepdf_* helpers will use file:// paths for assets when using :sho
|
|
|
230
230
|
|
|
231
231
|
Know other projects? Then contact me and I will add them to the list.
|
|
232
232
|
|
|
233
|
-
##
|
|
233
|
+
## Note on Patches / Pull Requests
|
|
234
234
|
|
|
235
|
-
*
|
|
236
|
-
*
|
|
237
|
-
*
|
|
238
|
-
|
|
239
|
-
* Commit
|
|
240
|
-
|
|
241
|
-
|
|
235
|
+
* Fork the project.
|
|
236
|
+
* Make your feature addition or bug fix.
|
|
237
|
+
* Add tests for it. This is important so I don't break it in a
|
|
238
|
+
future version unintentionally.
|
|
239
|
+
* Commit, do not mess with rakefile, version, or history.
|
|
240
|
+
(if you want to have your own version, that is fine but
|
|
241
|
+
bump version in a commit by itself I can ignore when I pull)
|
|
242
|
+
* Send me a pull request. Bonus points for topic branches.
|
|
242
243
|
|
|
243
|
-
##
|
|
244
|
+
## Credits
|
|
244
245
|
|
|
245
|
-
|
|
246
|
-
|
|
246
|
+

|
|
247
|
+
|
|
248
|
+
Wisepsd is maintained by [JetRockets](http://www.jetrockets.ru/en).
|
|
249
|
+
|
|
250
|
+
Contributors:
|
|
251
|
+
|
|
252
|
+
* [Igor Alexandrov](http://igor-alexandrov.github.com/)
|
|
253
|
+
* [Alexey Solilin](https://github.com/solilin)
|
|
254
|
+
|
|
255
|
+
## License
|
|
256
|
+
|
|
257
|
+
It is free software, and may be redistributed under the terms specified in the LICENSE file.
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.2.
|
|
1
|
+
1.2.7
|
|
@@ -3,51 +3,51 @@ require 'singleton'
|
|
|
3
3
|
module Wisepdf
|
|
4
4
|
class Configuration
|
|
5
5
|
include Singleton
|
|
6
|
-
|
|
6
|
+
|
|
7
7
|
class << self
|
|
8
8
|
attr_accessor :options
|
|
9
9
|
attr_accessor :wkhtmltopdf
|
|
10
|
-
|
|
10
|
+
|
|
11
11
|
def wkhtmltopdf
|
|
12
12
|
return @wkhtmltopdf if @wkhtmltopdf.present?
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
if @wkhtmltopdf.nil? && !self.windows?
|
|
15
15
|
@wkhtmltopdf = (defined?(Bundler) ? `bundle exec which wkhtmltopdf` : `which wkhtmltopdf`).chomp
|
|
16
16
|
end
|
|
17
|
-
return @wkhtmltopdf
|
|
17
|
+
return @wkhtmltopdf
|
|
18
18
|
end
|
|
19
|
-
|
|
19
|
+
|
|
20
20
|
def configure
|
|
21
21
|
yield self
|
|
22
22
|
end
|
|
23
|
-
|
|
23
|
+
|
|
24
24
|
def reset!
|
|
25
25
|
@options = {
|
|
26
26
|
:encoding => "UTF-8",
|
|
27
27
|
:use_xserver => false
|
|
28
28
|
}
|
|
29
29
|
@wkhtmltopdf = nil
|
|
30
|
-
end
|
|
31
|
-
|
|
30
|
+
end
|
|
31
|
+
|
|
32
32
|
def development?
|
|
33
33
|
(defined?(::Rails) && ::Rails.env == 'development') ||
|
|
34
34
|
(defined?(RAILS_ENV) && RAILS_ENV == 'development')
|
|
35
35
|
end
|
|
36
|
-
|
|
36
|
+
|
|
37
37
|
def test?
|
|
38
38
|
(defined?(::Rails) && ::Rails.env == 'test') ||
|
|
39
39
|
(defined?(RAILS_ENV) && RAILS_ENV == 'test')
|
|
40
|
-
end
|
|
41
|
-
|
|
40
|
+
end
|
|
41
|
+
|
|
42
42
|
def windows?
|
|
43
43
|
RbConfig::CONFIG['target_os'] == 'mingw32'
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
|
-
|
|
46
|
+
|
|
47
47
|
self.reset!
|
|
48
|
-
|
|
48
|
+
|
|
49
49
|
def method_missing(method)
|
|
50
50
|
self.class.send(method)
|
|
51
51
|
end
|
|
52
52
|
end
|
|
53
|
-
end
|
|
53
|
+
end
|
data/lib/wisepdf/errors.rb
CHANGED
data/lib/wisepdf/ext.rb
CHANGED
data/lib/wisepdf/helper.rb
CHANGED
|
@@ -3,9 +3,9 @@ module Wisepdf
|
|
|
3
3
|
module Legacy
|
|
4
4
|
def wisepdf_stylesheet_tag(*sources)
|
|
5
5
|
stylesheets_dir = ::Rails.root.join('public','stylesheets')
|
|
6
|
-
|
|
6
|
+
|
|
7
7
|
sources.collect { |source|
|
|
8
|
-
filename = ( source =~ /.css\z/ ? source : source + '.css' )
|
|
8
|
+
filename = ( source =~ /.css\z/ ? source : source + '.css' )
|
|
9
9
|
"<style type='text/css'>
|
|
10
10
|
#{File.read(stylesheets_dir.join(filename))}
|
|
11
11
|
</style>"
|
|
@@ -15,10 +15,10 @@ module Wisepdf
|
|
|
15
15
|
def wisepdf_image_tag(img, options={})
|
|
16
16
|
image_tag "file:///#{::Rails.root.join('public', 'images', img).pathname.to_s}", options
|
|
17
17
|
end
|
|
18
|
-
|
|
18
|
+
|
|
19
19
|
def wisepdf_javascript_tag(*sources)
|
|
20
20
|
javascripts_dir = ::Rails.root.join('public','javascripts')
|
|
21
|
-
|
|
21
|
+
|
|
22
22
|
sources.collect { |source|
|
|
23
23
|
filename = ( source =~ /.js\z/ ? source : source + '.js' )
|
|
24
24
|
"<script type='text/javascript'>
|
|
@@ -28,12 +28,12 @@ module Wisepdf
|
|
|
28
28
|
</script>"
|
|
29
29
|
}.join("\n").html_safe
|
|
30
30
|
end
|
|
31
|
-
end
|
|
32
|
-
|
|
31
|
+
end
|
|
32
|
+
|
|
33
33
|
module Assets
|
|
34
|
-
def wisepdf_stylesheet_tag(*sources)
|
|
34
|
+
def wisepdf_stylesheet_tag(*sources)
|
|
35
35
|
sources.collect { |source|
|
|
36
|
-
filename = ( source =~ /.css\z/ ? source : source + '.css' )
|
|
36
|
+
filename = ( source =~ /.css\z/ ? source : source + '.css' )
|
|
37
37
|
"<style type='text/css'>
|
|
38
38
|
#{::Rails.application.assets.find_asset(filename)}
|
|
39
39
|
</style>"
|
|
@@ -47,7 +47,7 @@ module Wisepdf
|
|
|
47
47
|
image_tag "file:///#{asset.pathname.to_s}", options
|
|
48
48
|
end
|
|
49
49
|
end
|
|
50
|
-
|
|
50
|
+
|
|
51
51
|
def wisepdf_javascript_tag(*sources)
|
|
52
52
|
sources.collect { |source|
|
|
53
53
|
filename = ( source =~ /.js\z/ ? source : source + '.js' )
|
|
@@ -60,4 +60,4 @@ module Wisepdf
|
|
|
60
60
|
end
|
|
61
61
|
end
|
|
62
62
|
end
|
|
63
|
-
end
|
|
63
|
+
end
|
data/lib/wisepdf/parser.rb
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
module Wisepdf
|
|
2
2
|
class Parser
|
|
3
3
|
include Singleton
|
|
4
|
-
|
|
4
|
+
|
|
5
5
|
ESCAPED_OPTIONS = [
|
|
6
6
|
:pdf, :layout, :template, :action, :partial,
|
|
7
7
|
:object, :collection, :as, :spacer_template,
|
|
8
8
|
:disposition, :locals, :status, :file, :text,
|
|
9
9
|
:xml, :json, :callback, :inline, :location, :save_to_file
|
|
10
10
|
]
|
|
11
|
-
|
|
11
|
+
|
|
12
12
|
class << self
|
|
13
13
|
def parse(options)
|
|
14
14
|
options = self.escape(options)
|
|
@@ -23,27 +23,27 @@ module Wisepdf
|
|
|
23
23
|
end
|
|
24
24
|
parsed_options
|
|
25
25
|
end
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
|
|
27
|
+
protected
|
|
28
28
|
def escape(options)
|
|
29
|
-
options.delete_if{ |k,v| ESCAPED_OPTIONS.include?(k.to_sym) }
|
|
29
|
+
options.delete_if{ |k,v| ESCAPED_OPTIONS.include?(k.to_sym) }
|
|
30
30
|
end
|
|
31
|
-
|
|
31
|
+
|
|
32
32
|
def flatten(options, prefix = nil)
|
|
33
33
|
hash = {}
|
|
34
34
|
options.each do |k,v|
|
|
35
35
|
key = prefix.nil? ? k : "#{prefix.to_s}-#{k}"
|
|
36
36
|
|
|
37
37
|
if v.is_a?(Hash)
|
|
38
|
-
hash.delete(k)
|
|
38
|
+
hash.delete(k)
|
|
39
39
|
hash.merge!(self.flatten(v, key))
|
|
40
|
-
else
|
|
41
|
-
hash[key.to_s] = v
|
|
42
|
-
end
|
|
40
|
+
else
|
|
41
|
+
hash[key.to_s] = v
|
|
42
|
+
end
|
|
43
43
|
end
|
|
44
44
|
return hash
|
|
45
|
-
end
|
|
46
|
-
|
|
45
|
+
end
|
|
46
|
+
|
|
47
47
|
def normalize_arg(arg)
|
|
48
48
|
arg.to_s.downcase.gsub(/[^a-z0-9]/,'-')
|
|
49
49
|
end
|
|
@@ -56,6 +56,6 @@ module Wisepdf
|
|
|
56
56
|
value.to_s
|
|
57
57
|
end
|
|
58
58
|
end
|
|
59
|
-
end
|
|
59
|
+
end
|
|
60
60
|
end
|
|
61
|
-
end
|
|
61
|
+
end
|
data/lib/wisepdf/rails.rb
CHANGED
data/lib/wisepdf/render.rb
CHANGED
|
@@ -10,9 +10,9 @@ module Wisepdf
|
|
|
10
10
|
|
|
11
11
|
def render(options = nil, *args, &block)
|
|
12
12
|
if options.is_a?(Hash) && options.has_key?(:pdf)
|
|
13
|
-
options = self.default_pdf_render_options.merge(options)
|
|
13
|
+
options = self.default_pdf_render_options.merge(options)
|
|
14
14
|
super(options.merge(:content_type => "text/html"), *args, &block) and return if options[:show_as_html]
|
|
15
|
-
|
|
15
|
+
|
|
16
16
|
self.log_pdf_creation
|
|
17
17
|
self.make_and_send_pdf(options)
|
|
18
18
|
else
|
|
@@ -29,7 +29,7 @@ module Wisepdf
|
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
protected
|
|
33
33
|
def log_pdf_creation
|
|
34
34
|
logger.info '*'*15 + 'WISEPDF' + '*'*15
|
|
35
35
|
end
|
|
@@ -39,29 +39,29 @@ module Wisepdf
|
|
|
39
39
|
@hf_tempfiles.each { |tf| tf.close! }
|
|
40
40
|
end
|
|
41
41
|
end
|
|
42
|
-
|
|
42
|
+
|
|
43
43
|
def default_pdf_render_options
|
|
44
44
|
{
|
|
45
45
|
:wkhtmltopdf => nil,
|
|
46
46
|
:layout => false,
|
|
47
47
|
:template => "#{controller_path}/#{action_name}",
|
|
48
|
-
:disposition => "inline"
|
|
48
|
+
:disposition => "inline"
|
|
49
49
|
}.merge(Wisepdf::Configuration.options)
|
|
50
50
|
end
|
|
51
|
-
|
|
51
|
+
|
|
52
52
|
def make_pdf(options = {})
|
|
53
|
-
options = self.prerender_header_and_footer(options)
|
|
54
|
-
html = render_to_string(:template => options[:template], :layout => options[:layout])
|
|
53
|
+
options = self.prerender_header_and_footer(options)
|
|
54
|
+
html = render_to_string(:template => options[:template], :layout => options[:layout])
|
|
55
55
|
Wisepdf::Writer.new(options[:wkhtmltopdf], options.dup).to_pdf(html)
|
|
56
56
|
end
|
|
57
57
|
|
|
58
|
-
def make_and_send_pdf(options = {})
|
|
58
|
+
def make_and_send_pdf(options = {})
|
|
59
59
|
pdf = self.make_pdf(options)
|
|
60
60
|
File.open(options[:save_to_file], 'wb') {|file| file << pdf } if options[:save_to_file].present?
|
|
61
|
-
|
|
61
|
+
|
|
62
62
|
filename = options.delete(:pdf)
|
|
63
63
|
filename += '.pdf' unless filename =~ /.pdf\z|.PDF\Z/
|
|
64
|
-
|
|
64
|
+
|
|
65
65
|
send_data(pdf, options.merge(:filename => filename, :type => 'application/pdf')) unless options[:save_only]
|
|
66
66
|
end
|
|
67
67
|
|
|
@@ -69,18 +69,18 @@ module Wisepdf
|
|
|
69
69
|
[:header, :footer].each do |hf|
|
|
70
70
|
if arguments[hf] && arguments[hf][:html] && arguments[hf][:html].is_a?(Hash)
|
|
71
71
|
opts = arguments[hf].delete(:html)
|
|
72
|
-
|
|
72
|
+
|
|
73
73
|
@hf_tempfiles = [] if ! defined?(@hf_tempfiles)
|
|
74
74
|
@hf_tempfiles.push( tf = Tempfile.new(["wisepdf_#{hf}_pdf", '.html']) )
|
|
75
75
|
opts[:layout] ||= arguments[:layout]
|
|
76
|
-
|
|
76
|
+
|
|
77
77
|
tf.write render_to_string(:template => opts[:template], :layout => opts[:layout], :locals => opts[:locals])
|
|
78
78
|
tf.flush
|
|
79
|
-
|
|
80
|
-
arguments[hf][:html] = "file://#{tf.path}"
|
|
79
|
+
|
|
80
|
+
arguments[hf][:html] = "file://#{tf.path}"
|
|
81
81
|
end
|
|
82
82
|
end
|
|
83
83
|
arguments
|
|
84
84
|
end
|
|
85
85
|
end
|
|
86
|
-
end
|
|
86
|
+
end
|
data/lib/wisepdf/writer.rb
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
require 'open3'
|
|
2
2
|
|
|
3
3
|
module Wisepdf
|
|
4
|
-
class Writer
|
|
4
|
+
class Writer
|
|
5
5
|
def initialize(wkhtmltopdf = nil, options = {})
|
|
6
6
|
self.wkhtmltopdf = wkhtmltopdf unless wkhtmltopdf.nil?
|
|
7
7
|
self.options = options
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
def to_pdf(string, options={})
|
|
11
|
-
invoke = self.command(options).join(' ')
|
|
11
|
+
invoke = self.command(options).join(' ')
|
|
12
12
|
self.log(invoke) if Wisepdf::Configuration.development? || Wisepdf::Configuration.test?
|
|
13
13
|
|
|
14
14
|
result, err = Open3.popen3(invoke) do |stdin, stdout, stderr|
|
|
@@ -24,42 +24,41 @@ module Wisepdf
|
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
def wkhtmltopdf
|
|
27
|
-
@wkhtmltopdf
|
|
28
|
-
@wkhtmltopdf
|
|
27
|
+
@wkhtmltopdf || self.wkhtmltopdf = Wisepdf::Configuration.wkhtmltopdf
|
|
29
28
|
end
|
|
30
29
|
|
|
31
|
-
def wkhtmltopdf=(value)
|
|
30
|
+
def wkhtmltopdf=(value)
|
|
31
|
+
raise Wisepdf::NoExecutableError.new(value) if value.blank? || !File.exists?(value)
|
|
32
32
|
@wkhtmltopdf = value
|
|
33
|
-
raise Wisepdf::NoExecutableError.new(@wkhtmltopdf) if @wkhtmltopdf.blank? || !File.exists?(@wkhtmltopdf)
|
|
34
33
|
end
|
|
35
|
-
|
|
34
|
+
|
|
36
35
|
def options
|
|
37
36
|
@options ||= Wisepdf::Parser.parse(Wisepdf::Configuration.options.dup)
|
|
38
37
|
@options
|
|
39
38
|
end
|
|
40
|
-
|
|
39
|
+
|
|
41
40
|
def options=(value)
|
|
42
41
|
self.options.merge!(Wisepdf::Parser.parse(value))
|
|
43
42
|
end
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
|
|
44
|
+
protected
|
|
46
45
|
def command(options = {})
|
|
47
46
|
options = Wisepdf::Parser.parse(options)
|
|
48
|
-
|
|
47
|
+
|
|
49
48
|
args = [self.wkhtmltopdf]
|
|
50
49
|
args += self.options.merge(options).to_a.flatten.compact
|
|
51
50
|
args << '--quiet'
|
|
52
51
|
|
|
53
|
-
args << '-'
|
|
52
|
+
args << '-'
|
|
54
53
|
args << '-'
|
|
55
54
|
|
|
56
55
|
args.map {|arg| %Q{"#{arg.gsub('"', '\"')}"}}
|
|
57
56
|
end
|
|
58
57
|
|
|
59
58
|
def log(command)
|
|
60
|
-
puts "*"*15
|
|
59
|
+
puts "*"*15
|
|
61
60
|
puts command
|
|
62
61
|
puts "*"*15
|
|
63
62
|
end
|
|
64
63
|
end
|
|
65
|
-
end
|
|
64
|
+
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
require 'helper'
|
|
2
|
-
|
|
2
|
+
|
|
3
3
|
class ApplicationControllerTest < ActionController::TestCase
|
|
4
4
|
tests ApplicationController
|
|
5
|
-
|
|
5
|
+
|
|
6
6
|
context "The controller" do
|
|
7
7
|
setup do
|
|
8
8
|
module Wisepdf::Render
|
|
@@ -11,22 +11,22 @@ class ApplicationControllerTest < ActionController::TestCase
|
|
|
11
11
|
public :prerender_header_and_footer
|
|
12
12
|
end
|
|
13
13
|
end
|
|
14
|
-
|
|
14
|
+
|
|
15
15
|
should "respond to #make_pdf" do
|
|
16
16
|
assert_respond_to @controller, :make_pdf
|
|
17
17
|
end
|
|
18
|
-
|
|
18
|
+
|
|
19
19
|
should "respond to #make_and_send_pdf" do
|
|
20
20
|
assert_respond_to @controller, :make_and_send_pdf
|
|
21
|
-
end
|
|
22
|
-
|
|
21
|
+
end
|
|
22
|
+
|
|
23
23
|
should "respond to #prerender_header_and_footer" do
|
|
24
24
|
assert_respond_to @controller, :prerender_header_and_footer
|
|
25
|
-
end
|
|
26
|
-
|
|
25
|
+
end
|
|
26
|
+
|
|
27
27
|
should 'render pdf' do
|
|
28
28
|
get :index, :format => :pdf
|
|
29
29
|
assert_response 200
|
|
30
30
|
end
|
|
31
31
|
end
|
|
32
|
-
end
|
|
32
|
+
end
|
data/test/configuration_test.rb
CHANGED
|
@@ -1,37 +1,37 @@
|
|
|
1
1
|
require 'helper'
|
|
2
2
|
|
|
3
|
-
class ConfigurationTest < Test::Unit::TestCase
|
|
3
|
+
class ConfigurationTest < Test::Unit::TestCase
|
|
4
4
|
context "Default configuration" do
|
|
5
5
|
setup do
|
|
6
6
|
Wisepdf::Configuration.reset!
|
|
7
7
|
end
|
|
8
|
-
|
|
8
|
+
|
|
9
9
|
should 'read default configuration' do
|
|
10
10
|
assert_equal "UTF-8", Wisepdf::Configuration.options[:encoding]
|
|
11
11
|
assert_equal false, Wisepdf::Configuration.options[:use_xserver]
|
|
12
12
|
end
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
if RbConfig::CONFIG['target_os'] != 'mingw32'
|
|
15
15
|
should 'try to find wkhtmltopdf if not on windows' do
|
|
16
16
|
path = (defined?(Bundler) ? `bundle exec which wkhtmltopdf` : `which wkhtmltopdf`).chomp
|
|
17
|
-
|
|
17
|
+
|
|
18
18
|
assert_equal path, Wisepdf::Configuration.wkhtmltopdf
|
|
19
19
|
end
|
|
20
20
|
end
|
|
21
21
|
end
|
|
22
|
-
|
|
22
|
+
|
|
23
23
|
context "Configuration" do
|
|
24
24
|
setup do
|
|
25
25
|
Wisepdf::Configuration.reset!
|
|
26
26
|
end
|
|
27
|
-
|
|
27
|
+
|
|
28
28
|
should 'accept and override default configuration' do
|
|
29
29
|
Wisepdf::Configuration.configure do |config|
|
|
30
30
|
config.wkhtmltopdf = '/path/to/wkhtmltopdf'
|
|
31
31
|
config.options = {
|
|
32
32
|
:layout => "layout.html",
|
|
33
33
|
:use_xserver => true,
|
|
34
|
-
:footer => {
|
|
34
|
+
:footer => {
|
|
35
35
|
:right => "#{Date.today.year}",
|
|
36
36
|
:font_size => 8,
|
|
37
37
|
:spacing => 8
|
|
@@ -42,7 +42,7 @@ class ConfigurationTest < Test::Unit::TestCase
|
|
|
42
42
|
}
|
|
43
43
|
end
|
|
44
44
|
assert_equal '/path/to/wkhtmltopdf', Wisepdf::Configuration.wkhtmltopdf
|
|
45
|
-
|
|
45
|
+
|
|
46
46
|
assert_equal 'layout.html', Wisepdf::Configuration.options[:layout]
|
|
47
47
|
assert_equal true, Wisepdf::Configuration.options[:use_xserver]
|
|
48
48
|
assert_equal "#{Date.today.year}", Wisepdf::Configuration.options[:footer][:right]
|
|
@@ -50,5 +50,5 @@ class ConfigurationTest < Test::Unit::TestCase
|
|
|
50
50
|
assert_equal 8, Wisepdf::Configuration.options[:footer][:spacing]
|
|
51
51
|
assert_equal 15, Wisepdf::Configuration.options[:margin][:bottom]
|
|
52
52
|
end
|
|
53
|
-
end
|
|
54
|
-
end
|
|
53
|
+
end
|
|
54
|
+
end
|
data/test/helper_assets_test.rb
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
require 'helper'
|
|
2
|
-
|
|
2
|
+
|
|
3
3
|
class AssetsHelperTest < ActionView::TestCase
|
|
4
4
|
include Wisepdf::Helper::Assets
|
|
5
|
-
|
|
6
|
-
context "wisepdf_stylesheet_tag" do
|
|
5
|
+
|
|
6
|
+
context "wisepdf_stylesheet_tag" do
|
|
7
7
|
should 'include stylesheet if no extension is given' do
|
|
8
8
|
assert_match wisepdf_stylesheet_tag('wisepdf').strip, /Wisepdf styles/
|
|
9
9
|
end
|
|
10
|
-
|
|
10
|
+
|
|
11
11
|
should 'include stylesheet if .css extension is given' do
|
|
12
12
|
assert_match wisepdf_stylesheet_tag('wisepdf.css').strip, /Wisepdf styles/
|
|
13
13
|
end
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
context "wisepdf_javascript_tag" do
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
context "wisepdf_javascript_tag" do
|
|
17
17
|
should 'include javascript if no extension is given' do
|
|
18
18
|
assert_match wisepdf_javascript_tag('wisepdf').strip, /Wisepdf javascript/
|
|
19
19
|
end
|
|
20
|
-
|
|
20
|
+
|
|
21
21
|
should 'include javascript if .js extension is given' do
|
|
22
22
|
assert_match wisepdf_javascript_tag('wisepdf.js').strip, /Wisepdf javascript/
|
|
23
23
|
end
|
|
24
|
-
end
|
|
24
|
+
end
|
|
25
25
|
end
|
data/test/helper_legacy_test.rb
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
require 'helper'
|
|
2
|
-
|
|
2
|
+
|
|
3
3
|
class LegacyHelperTest < ActionView::TestCase
|
|
4
4
|
include Wisepdf::Helper::Legacy
|
|
5
|
-
|
|
6
|
-
context "wisepdf_stylesheet_tag" do
|
|
5
|
+
|
|
6
|
+
context "wisepdf_stylesheet_tag" do
|
|
7
7
|
should 'include stylesheet if no extension is given' do
|
|
8
8
|
assert_match wisepdf_stylesheet_tag('wisepdf').strip, /Wisepdf styles/
|
|
9
9
|
end
|
|
10
|
-
|
|
10
|
+
|
|
11
11
|
should 'include stylesheet if .css extension is given' do
|
|
12
12
|
assert_match wisepdf_stylesheet_tag('wisepdf.css').strip, /Wisepdf styles/
|
|
13
13
|
end
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
context "wisepdf_javascript_tag" do
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
context "wisepdf_javascript_tag" do
|
|
17
17
|
should 'include javascript if no extension is given' do
|
|
18
18
|
assert_match wisepdf_javascript_tag('wisepdf').strip, /Wisepdf javascript/
|
|
19
19
|
end
|
|
20
|
-
|
|
20
|
+
|
|
21
21
|
should 'include javascript if .js extension is given' do
|
|
22
22
|
assert_match wisepdf_javascript_tag('wisepdf.js').strip, /Wisepdf javascript/
|
|
23
23
|
end
|
|
24
|
-
end
|
|
24
|
+
end
|
|
25
25
|
end
|
data/test/parser_test.rb
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
require 'helper'
|
|
2
2
|
|
|
3
|
-
class ParserTest < Test::Unit::TestCase
|
|
3
|
+
class ParserTest < Test::Unit::TestCase
|
|
4
4
|
context "Options normalization" do
|
|
5
5
|
setup do
|
|
6
6
|
Wisepdf::Configuration.reset!
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
@options = { Wisepdf::Parser::ESCAPED_OPTIONS.sample => 'value' }
|
|
9
9
|
end
|
|
10
|
-
|
|
10
|
+
|
|
11
11
|
should 'escape and parse digit options' do
|
|
12
12
|
@options.merge!({
|
|
13
13
|
:key => 10
|
|
@@ -15,10 +15,10 @@ class ParserTest < Test::Unit::TestCase
|
|
|
15
15
|
expected = {
|
|
16
16
|
'--key' => '10'
|
|
17
17
|
}
|
|
18
|
-
|
|
18
|
+
|
|
19
19
|
assert_equal expected, Wisepdf::Parser.parse(@options)
|
|
20
20
|
end
|
|
21
|
-
|
|
21
|
+
|
|
22
22
|
should 'escape and parse string options' do
|
|
23
23
|
@options.merge!({
|
|
24
24
|
:key => 'value'
|
|
@@ -26,10 +26,10 @@ class ParserTest < Test::Unit::TestCase
|
|
|
26
26
|
expected = {
|
|
27
27
|
'--key' => 'value'
|
|
28
28
|
}
|
|
29
|
-
|
|
29
|
+
|
|
30
30
|
assert_equal expected, Wisepdf::Parser.parse(@options)
|
|
31
31
|
end
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
should 'escape and parse boolean (true) options' do
|
|
34
34
|
@options.merge!({
|
|
35
35
|
:key => true
|
|
@@ -37,19 +37,19 @@ class ParserTest < Test::Unit::TestCase
|
|
|
37
37
|
expected = {
|
|
38
38
|
'--key' => nil
|
|
39
39
|
}
|
|
40
|
-
|
|
40
|
+
|
|
41
41
|
assert_equal expected, Wisepdf::Parser.parse(@options)
|
|
42
42
|
end
|
|
43
|
-
|
|
43
|
+
|
|
44
44
|
should 'escape and parse boolean (false) options' do
|
|
45
45
|
@options.merge!({
|
|
46
46
|
:key => false
|
|
47
47
|
})
|
|
48
48
|
expected = {}
|
|
49
|
-
|
|
49
|
+
|
|
50
50
|
assert_equal expected, Wisepdf::Parser.parse(@options)
|
|
51
51
|
end
|
|
52
|
-
|
|
52
|
+
|
|
53
53
|
should 'escape and parse nested options' do
|
|
54
54
|
@options.merge!({
|
|
55
55
|
:key => 'value',
|
|
@@ -61,8 +61,8 @@ class ParserTest < Test::Unit::TestCase
|
|
|
61
61
|
'--key' => 'value',
|
|
62
62
|
'--nested-key' => 'value'
|
|
63
63
|
}
|
|
64
|
-
|
|
64
|
+
|
|
65
65
|
assert_equal expected, Wisepdf::Parser.parse(@options)
|
|
66
|
-
end
|
|
66
|
+
end
|
|
67
67
|
end
|
|
68
|
-
end
|
|
68
|
+
end
|
data/test/writer_test.rb
CHANGED
|
@@ -6,8 +6,8 @@ class Wisepdf::Writer
|
|
|
6
6
|
public :command
|
|
7
7
|
end
|
|
8
8
|
|
|
9
|
-
class WriterTest < Test::Unit::TestCase
|
|
10
|
-
context "PDF generation" do
|
|
9
|
+
class WriterTest < Test::Unit::TestCase
|
|
10
|
+
context "PDF generation" do
|
|
11
11
|
should "generate PDF from html document" do
|
|
12
12
|
writer = Wisepdf::Writer.new
|
|
13
13
|
pdf = writer.to_pdf(HTML_DOCUMENT)
|
|
@@ -29,7 +29,7 @@ class WriterTest < Test::Unit::TestCase
|
|
|
29
29
|
writer.to_pdf(HTML_DOCUMENT)
|
|
30
30
|
end
|
|
31
31
|
end
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
should "raise exception when wkhtmltopdf is not executable" do
|
|
34
34
|
begin
|
|
35
35
|
tmp = Tempfile.new('wkhtmltopdf')
|
|
@@ -37,14 +37,14 @@ class WriterTest < Test::Unit::TestCase
|
|
|
37
37
|
File.chmod 0000, fp
|
|
38
38
|
assert_raise Wisepdf::WriteError do
|
|
39
39
|
writer = Wisepdf::Writer.new(fp)
|
|
40
|
-
writer.to_pdf(HTML_DOCUMENT)
|
|
40
|
+
writer.to_pdf(HTML_DOCUMENT)
|
|
41
41
|
end
|
|
42
42
|
ensure
|
|
43
43
|
tmp.delete
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
|
|
48
48
|
should "raise exception when pdf generation fails" do
|
|
49
49
|
begin
|
|
50
50
|
tmp = Tempfile.new('wkhtmltopdf')
|
|
@@ -52,11 +52,11 @@ class WriterTest < Test::Unit::TestCase
|
|
|
52
52
|
File.chmod 0777, fp
|
|
53
53
|
assert_raise Wisepdf::WriteError do
|
|
54
54
|
writer = Wisepdf::Writer.new(fp)
|
|
55
|
-
writer.to_pdf(HTML_DOCUMENT)
|
|
55
|
+
writer.to_pdf(HTML_DOCUMENT)
|
|
56
56
|
end
|
|
57
57
|
ensure
|
|
58
58
|
tmp.delete
|
|
59
59
|
end
|
|
60
|
-
end
|
|
61
|
-
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
62
|
end
|
data/wisepdf.gemspec
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
Gem::Specification.new do |s|
|
|
7
7
|
s.name = "wisepdf"
|
|
8
|
-
s.version = "1.2.
|
|
8
|
+
s.version = "1.2.7"
|
|
9
9
|
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
11
|
s.authors = ["Igor Alexandrov"]
|
|
12
|
-
s.date = "
|
|
12
|
+
s.date = "2013-01-10"
|
|
13
13
|
s.description = "wisepdf uses the shell utility wkhtmltopdf to serve a PDF file to a user from HTML. In other words, rather than dealing with a PDF generation DSL of some sort, you simply write an HTML view as you would normally, and let pdf take care of the hard stuff."
|
|
14
14
|
s.email = "igor.alexandrov@gmail.com"
|
|
15
15
|
s.extra_rdoc_files = [
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: wisepdf
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.2.
|
|
4
|
+
version: 1.2.7
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2013-01-10 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: sqlite3
|
|
@@ -201,7 +201,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
201
201
|
version: '0'
|
|
202
202
|
segments:
|
|
203
203
|
- 0
|
|
204
|
-
hash: -
|
|
204
|
+
hash: -1965210465825970962
|
|
205
205
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
206
206
|
none: false
|
|
207
207
|
requirements:
|