wicked_pdf 1.0.0 → 1.0.1
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +9 -0
- data/.rubocop_todo.yml +67 -0
- data/.travis.yml +4 -0
- data/CHANGLOG.md +42 -0
- data/README.md +5 -3
- data/Rakefile +9 -7
- data/lib/wicked_pdf.rb +24 -25
- data/lib/wicked_pdf/middleware.rb +0 -2
- data/lib/wicked_pdf/pdf_helper.rb +16 -19
- data/lib/wicked_pdf/railtie.rb +3 -2
- data/lib/wicked_pdf/tempfile.rb +1 -1
- data/lib/wicked_pdf/version.rb +1 -1
- data/lib/wicked_pdf/wicked_pdf_helper.rb +3 -109
- data/lib/wicked_pdf/wicked_pdf_helper/assets.rb +120 -0
- data/test/functional/wicked_pdf_helper_assets_test.rb +7 -1
- data/test/unit/wicked_pdf_test.rb +12 -9
- data/wicked_pdf.gemspec +1 -0
- metadata +20 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9ab8593ac44c5682cf136c152de88154d721bb05
|
|
4
|
+
data.tar.gz: a999e4080b0f2a76c4488058e4ccf24e69cb9d1d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1dc2bb0b82be7d2071dd92648cee85e6ab8f539cce32b3eb92d78ab4758926e156aead56847d6a2663ea9909f79d3f53c37f6b63bf3b01d0d2343efd37b3d3c6
|
|
7
|
+
data.tar.gz: 1595873318fa389a248d5d85203a9fc397a3670d36c3ac73032362bb06f5c38f5c9dbbe78bd5e3c11c233fcfb1ad06b530dbc8ef2bdbe29582b20308605e8158
|
data/.rubocop.yml
ADDED
data/.rubocop_todo.yml
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# This configuration was generated by `rubocop --auto-gen-config`
|
|
2
|
+
# on 2015-11-08 18:41:57 -0500 using RuboCop version 0.32.1.
|
|
3
|
+
# The point is for the user to remove these configuration records
|
|
4
|
+
# one by one as the offenses are removed from the code base.
|
|
5
|
+
# Note that changes in the inspected code, or installation of new
|
|
6
|
+
# versions of RuboCop, may require this file to be generated again.
|
|
7
|
+
|
|
8
|
+
# Offense count: 2
|
|
9
|
+
Lint/AmbiguousRegexpLiteral:
|
|
10
|
+
Enabled: false
|
|
11
|
+
|
|
12
|
+
# Offense count: 2
|
|
13
|
+
Lint/HandleExceptions:
|
|
14
|
+
Enabled: false
|
|
15
|
+
|
|
16
|
+
# Offense count: 9
|
|
17
|
+
Metrics/AbcSize:
|
|
18
|
+
Max: 45
|
|
19
|
+
|
|
20
|
+
# Offense count: 2
|
|
21
|
+
Metrics/BlockNesting:
|
|
22
|
+
Max: 4
|
|
23
|
+
|
|
24
|
+
# Offense count: 2
|
|
25
|
+
# Configuration parameters: CountComments.
|
|
26
|
+
Metrics/ClassLength:
|
|
27
|
+
Max: 279
|
|
28
|
+
|
|
29
|
+
# Offense count: 5
|
|
30
|
+
Metrics/CyclomaticComplexity:
|
|
31
|
+
Max: 9
|
|
32
|
+
|
|
33
|
+
# Offense count: 92
|
|
34
|
+
# Configuration parameters: AllowURI, URISchemes.
|
|
35
|
+
Metrics/LineLength:
|
|
36
|
+
Max: 563
|
|
37
|
+
|
|
38
|
+
# Offense count: 14
|
|
39
|
+
# Configuration parameters: CountComments.
|
|
40
|
+
Metrics/MethodLength:
|
|
41
|
+
Max: 30
|
|
42
|
+
|
|
43
|
+
# Offense count: 4
|
|
44
|
+
Metrics/PerceivedComplexity:
|
|
45
|
+
Max: 12
|
|
46
|
+
|
|
47
|
+
# Offense count: 5
|
|
48
|
+
Style/AccessorMethodName:
|
|
49
|
+
Enabled: false
|
|
50
|
+
|
|
51
|
+
# Offense count: 1
|
|
52
|
+
Style/CaseEquality:
|
|
53
|
+
Enabled: false
|
|
54
|
+
|
|
55
|
+
# Offense count: 1
|
|
56
|
+
Style/ClassVars:
|
|
57
|
+
Enabled: false
|
|
58
|
+
|
|
59
|
+
# Offense count: 15
|
|
60
|
+
Style/Documentation:
|
|
61
|
+
Enabled: false
|
|
62
|
+
|
|
63
|
+
# Offense count: 5
|
|
64
|
+
# Cop supports --auto-correct.
|
|
65
|
+
# Configuration parameters: EnforcedStyle, SupportedStyles, AllowInnerSlashes.
|
|
66
|
+
Style/RegexpLiteral:
|
|
67
|
+
Enabled: false
|
data/.travis.yml
CHANGED
data/CHANGLOG.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Change Log
|
|
2
|
+
All notable changes to this project will be documented in this file.
|
|
3
|
+
This project adheres to [Semantic Versioning](http://semver.org/).
|
|
4
|
+
|
|
5
|
+
## [1.0.0] - 2015-11-03
|
|
6
|
+
### Changed
|
|
7
|
+
- Accepted that `WickedPDF` cannot guarantee backwards compatibility with older versions of `wkthmltopdf`, and decided to publish a new version with the MAJOR number incremented, signaling that this may have breaking changes for some people, but providing a path forward for progress. This release number also signals that this is a mature (and relatively stable) project, and should be deemed ready for production (since it has been used in production since ~2009, and downloaded over a *million* times on [RubyGems.org](https://rubygems.org/gems/wicked_pdf)).
|
|
8
|
+
- Stopped attempting to track with version number of `wkhtmltopdf` binary releases (`wkhtmltopdf` v9.x == `WickedPDF` v9.x)
|
|
9
|
+
- Adopted [Semantic Versioning](http://semver.org/) for release numbering
|
|
10
|
+
- Added a CHANGELOG (based on [keepachangelog.com](http://keepachangelog.com/))
|
|
11
|
+
- Misc code tweaks as suggested by [RuboCop](https://github.com/bbatsov/rubocop)
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
- Check version of `wkhtmltopdf` before deciding to pass arguments with or without dashes
|
|
15
|
+
- New arguments and options for the table of contents supported in newer versions of wkhtmltopf: `text_size_shrink`, `level_indentation`, `disable_dotted_lines`, `disable_toc_links`, `xsl_style_sheet`
|
|
16
|
+
- Merge in global options to `pdf_from_html_file` and `pdf_from_string`
|
|
17
|
+
- Add ability to generate pdf from a web resource: `pdf_from_url(url)`
|
|
18
|
+
|
|
19
|
+
### Removed
|
|
20
|
+
- Explicit dependency on [Rails](https://github.com/rails/rails), since parts of this library may be used without it.
|
|
21
|
+
- Comment out the `:exe_path` option in the generated initalizer by default (since many systems won't have `wkthmltopdf` installed in that specific location)
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
- Issues with `file://` paths on Windows-based systems
|
|
25
|
+
- Issues with parsed options/argument ordering on versions of `wkthmltopdf` > 0.9
|
|
26
|
+
- Issues with middleware headers when running Rails app mounted in a subdirectory
|
|
27
|
+
- Issues with options that have a `key: 'value'` syntax when passed to `wkthmltopdf`
|
|
28
|
+
- Issue with `:temp_path` option being deleted from original options hash
|
|
29
|
+
- Issue with header/footer `:content` being deleted after the first page
|
|
30
|
+
- Issues with options being modified during processing (including global config options)
|
|
31
|
+
- Issues with asset helpers recognizing assets specified without a protocol
|
|
32
|
+
- Issues with `url()` references and embedded `data:base64` assests in stylesheets rendered with `wicked_pdf_stylesheet_link_tag`
|
|
33
|
+
- Asset helpers no longer add a file extension if it already is specified with one
|
|
34
|
+
|
|
35
|
+
# Compare Releases
|
|
36
|
+
- [1.0.0...Unreleased](https://github.com/mileszs/wicked_pdf/compare/f0b49fa...HEAD)
|
|
37
|
+
- [1.0.0...1.0.1](https://github.com/mileszs/wicked_pdf/compare/24303d0...f0b49fa)
|
|
38
|
+
- [0.11.0...1.0.0](https://github.com/mileszs/wicked_pdf/compare/968ae69...24303d0)
|
|
39
|
+
- [0.10.2...0.11.0](https://github.com/mileszs/wicked_pdf/compare/076f043...968ae69)
|
|
40
|
+
- [0.10.1...0.10.2](https://github.com/mileszs/wicked_pdf/compare/a920bc9...076f043)
|
|
41
|
+
- [0.10.0...0.10.1](https://github.com/mileszs/wicked_pdf/compare/df67c30...a920bc9)
|
|
42
|
+
- [0.9.10...0.10.0](https://github.com/mileszs/wicked_pdf/compare/9daecee...df67c30)
|
data/README.md
CHANGED
|
@@ -329,9 +329,11 @@ You may have noticed: this plugin is heavily inspired by the PrinceXML plugin [p
|
|
|
329
329
|
|
|
330
330
|
1. Fork it
|
|
331
331
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
332
|
-
3.
|
|
333
|
-
4.
|
|
334
|
-
5.
|
|
332
|
+
3. Run the test suite and check the output (`rake`)
|
|
333
|
+
4. Add tests for your feature or fix (please)
|
|
334
|
+
5. Commit your changes (`git commit -am 'Add some feature'`)
|
|
335
|
+
6. Push to the branch (`git push origin my-new-feature`)
|
|
336
|
+
7. Create new Pull Request
|
|
335
337
|
|
|
336
338
|
### Awesome Peoples
|
|
337
339
|
|
data/Rakefile
CHANGED
|
@@ -5,7 +5,7 @@ require 'rails/version'
|
|
|
5
5
|
require 'bundler/gem_tasks'
|
|
6
6
|
|
|
7
7
|
desc 'Default: run unit tests.'
|
|
8
|
-
task :default => :setup_and_run_tests
|
|
8
|
+
task :default => [:setup_and_run_tests, :rubocop]
|
|
9
9
|
|
|
10
10
|
desc 'Test the wicked_pdf plugin.'
|
|
11
11
|
Rake::TestTask.new(:test) do |t|
|
|
@@ -15,6 +15,13 @@ Rake::TestTask.new(:test) do |t|
|
|
|
15
15
|
t.verbose = true
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
+
desc 'Run RuboCop'
|
|
19
|
+
task :rubocop do
|
|
20
|
+
return unless RUBY_VERSION > '1.9.2'
|
|
21
|
+
require 'rubocop/rake_task'
|
|
22
|
+
RuboCop::RakeTask.new
|
|
23
|
+
end
|
|
24
|
+
|
|
18
25
|
desc 'Setup and run all tests'
|
|
19
26
|
task :setup_and_run_tests do
|
|
20
27
|
unless File.exist?('test/dummy/config/environment.rb')
|
|
@@ -27,12 +34,7 @@ desc 'Generate dummy application for test cases'
|
|
|
27
34
|
task :dummy_generate do
|
|
28
35
|
Rake::Task[:dummy_remove].invoke
|
|
29
36
|
puts 'Creating dummy application to run tests'
|
|
30
|
-
|
|
31
|
-
prefix = ''
|
|
32
|
-
if Rails::VERSION::MAJOR != 2
|
|
33
|
-
prefix = 'new '
|
|
34
|
-
end
|
|
35
|
-
|
|
37
|
+
prefix = (Rails::VERSION::MAJOR == 2) ? '' : 'new '
|
|
36
38
|
system("rails #{prefix}test/dummy")
|
|
37
39
|
FileUtils.rm_r Dir.glob('test/dummy/test/*')
|
|
38
40
|
end
|
data/lib/wicked_pdf.rb
CHANGED
|
@@ -50,9 +50,8 @@ class WickedPdf
|
|
|
50
50
|
|
|
51
51
|
def pdf_from_string(string, options = {})
|
|
52
52
|
options = options.dup
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
string_file = WickedPdfTempfile.new("wicked_pdf.html", options[:temp_path])
|
|
53
|
+
options.merge!(WickedPdf.config) { |_key, option, _config| option }
|
|
54
|
+
string_file = WickedPdfTempfile.new('wicked_pdf.html', options[:temp_path])
|
|
56
55
|
string_file.binmode
|
|
57
56
|
string_file.write(string)
|
|
58
57
|
string_file.close
|
|
@@ -67,8 +66,8 @@ class WickedPdf
|
|
|
67
66
|
|
|
68
67
|
def pdf_from_url(url, options = {})
|
|
69
68
|
# merge in global config options
|
|
70
|
-
options.merge!(WickedPdf.config) {|
|
|
71
|
-
generated_pdf_file = WickedPdfTempfile.new(
|
|
69
|
+
options.merge!(WickedPdf.config) { |_key, option, _config| option }
|
|
70
|
+
generated_pdf_file = WickedPdfTempfile.new('wicked_pdf_generated_file.pdf', options[:temp_path])
|
|
72
71
|
command = [@exe_path]
|
|
73
72
|
command << '-q' unless on_windows? # suppress errors on stdout
|
|
74
73
|
command += parse_options(options)
|
|
@@ -77,10 +76,11 @@ class WickedPdf
|
|
|
77
76
|
|
|
78
77
|
print_command(command.inspect) if in_development_mode?
|
|
79
78
|
|
|
80
|
-
err = Open3.popen3(*command) do |
|
|
79
|
+
err = Open3.popen3(*command) do |_stdin, _stdout, stderr|
|
|
81
80
|
stderr.read
|
|
82
81
|
end
|
|
83
|
-
if
|
|
82
|
+
if options[:return_file]
|
|
83
|
+
return_file = options.delete(:return_file)
|
|
84
84
|
return generated_pdf_file
|
|
85
85
|
end
|
|
86
86
|
generated_pdf_file.rewind
|
|
@@ -114,7 +114,7 @@ class WickedPdf
|
|
|
114
114
|
end
|
|
115
115
|
|
|
116
116
|
def retreive_binary_version
|
|
117
|
-
|
|
117
|
+
_stdin, stdout, _stderr = Open3.popen3(@exe_path + ' -V')
|
|
118
118
|
@binary_version = parse_version(stdout.gets(nil))
|
|
119
119
|
rescue StandardError
|
|
120
120
|
end
|
|
@@ -186,7 +186,7 @@ class WickedPdf
|
|
|
186
186
|
if options[o].blank?
|
|
187
187
|
[]
|
|
188
188
|
else
|
|
189
|
-
make_option("#{prefix.blank? ? '' : prefix + '-'}#{o
|
|
189
|
+
make_option("#{prefix.blank? ? '' : prefix + '-'}#{o}",
|
|
190
190
|
options[o],
|
|
191
191
|
type)
|
|
192
192
|
end
|
|
@@ -196,22 +196,21 @@ class WickedPdf
|
|
|
196
196
|
def parse_header_footer(options)
|
|
197
197
|
r = []
|
|
198
198
|
[:header, :footer].collect do |hf|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
end
|
|
199
|
+
next if options[hf].blank?
|
|
200
|
+
opt_hf = options[hf]
|
|
201
|
+
r += make_options(opt_hf, [:center, :font_name, :left, :right], "#{hf}")
|
|
202
|
+
r += make_options(opt_hf, [:font_size, :spacing], "#{hf}", :numeric)
|
|
203
|
+
r += make_options(opt_hf, [:line], "#{hf}", :boolean)
|
|
204
|
+
if options[hf] && options[hf][:content]
|
|
205
|
+
@hf_tempfiles = [] unless defined?(@hf_tempfiles)
|
|
206
|
+
@hf_tempfiles.push(tf = WickedPdfTempfile.new("wicked_#{hf}_pdf.html"))
|
|
207
|
+
tf.write options[hf][:content]
|
|
208
|
+
tf.flush
|
|
209
|
+
options[hf][:html] = {}
|
|
210
|
+
options[hf][:html][:url] = "file:///#{tf.path}"
|
|
211
|
+
end
|
|
212
|
+
unless opt_hf[:html].blank?
|
|
213
|
+
r += make_option("#{hf}-html", opt_hf[:html][:url]) unless opt_hf[:html][:url].blank?
|
|
215
214
|
end
|
|
216
215
|
end unless options.blank?
|
|
217
216
|
r
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
class WickedPdf
|
|
2
2
|
class Middleware
|
|
3
|
-
|
|
4
3
|
def initialize(app, options = {}, conditions = {})
|
|
5
4
|
@app = app
|
|
6
5
|
@options = (WickedPdf.config || {}).merge(options)
|
|
@@ -89,6 +88,5 @@ class WickedPdf
|
|
|
89
88
|
def concat(accepts, type)
|
|
90
89
|
(accepts || '').split(',').unshift(type).compact.join(',')
|
|
91
90
|
end
|
|
92
|
-
|
|
93
91
|
end
|
|
94
92
|
end
|
|
@@ -43,15 +43,13 @@ module PdfHelper
|
|
|
43
43
|
|
|
44
44
|
def set_basic_auth(options = {})
|
|
45
45
|
options[:basic_auth] ||= WickedPdf.config.fetch(:basic_auth) { false }
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
end
|
|
46
|
+
return unless options[:basic_auth] && request.env['HTTP_AUTHORIZATION']
|
|
47
|
+
request.env['HTTP_AUTHORIZATION'].split(' ').last
|
|
49
48
|
end
|
|
50
49
|
|
|
51
50
|
def clean_temp_files
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
end
|
|
51
|
+
return unless defined?(@hf_tempfiles)
|
|
52
|
+
@hf_tempfiles.each(&:close!)
|
|
55
53
|
end
|
|
56
54
|
|
|
57
55
|
def make_pdf(options = {})
|
|
@@ -66,8 +64,8 @@ module PdfHelper
|
|
|
66
64
|
|
|
67
65
|
def make_and_send_pdf(pdf_name, options = {})
|
|
68
66
|
options[:wkhtmltopdf] ||= nil
|
|
69
|
-
options[:layout]
|
|
70
|
-
options[:template]
|
|
67
|
+
options[:layout] ||= false
|
|
68
|
+
options[:template] ||= File.join(controller_path, action_name)
|
|
71
69
|
options[:disposition] ||= 'inline'
|
|
72
70
|
if options[:show_as_html]
|
|
73
71
|
render_opts = { :template => options[:template], :layout => options[:layout], :formats => options[:formats], :handlers => options[:handlers], :content_type => 'text/html' }
|
|
@@ -85,17 +83,16 @@ module PdfHelper
|
|
|
85
83
|
# to temp files and return a new options hash including the URLs to these files.
|
|
86
84
|
def prerender_header_and_footer(options)
|
|
87
85
|
[:header, :footer].each do |hf|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
end
|
|
86
|
+
next unless options[hf] && options[hf][:html] && options[hf][:html][:template]
|
|
87
|
+
@hf_tempfiles = [] unless defined?(@hf_tempfiles)
|
|
88
|
+
@hf_tempfiles.push(tf = WickedPdfTempfile.new("wicked_#{hf}_pdf.html"))
|
|
89
|
+
options[hf][:html][:layout] ||= options[:layout]
|
|
90
|
+
render_opts = { :template => options[hf][:html][:template], :layout => options[hf][:html][:layout], :formats => options[hf][:html][:formats], :handlers => options[hf][:html][:handlers] }
|
|
91
|
+
render_opts.merge!(:locals => options[hf][:html][:locals]) if options[hf][:html][:locals]
|
|
92
|
+
render_opts.merge!(:file => options[hf][:html][:file]) if options[:file]
|
|
93
|
+
tf.write render_to_string(render_opts)
|
|
94
|
+
tf.flush
|
|
95
|
+
options[hf][:html][:url] = "file:///#{tf.path}"
|
|
99
96
|
end
|
|
100
97
|
options
|
|
101
98
|
end
|
data/lib/wicked_pdf/railtie.rb
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
require 'wicked_pdf/pdf_helper'
|
|
2
2
|
require 'wicked_pdf/wicked_pdf_helper'
|
|
3
|
+
require 'wicked_pdf/wicked_pdf_helper/assets'
|
|
3
4
|
|
|
4
5
|
if defined?(Rails)
|
|
5
6
|
|
|
6
7
|
if Rails::VERSION::MAJOR == 3
|
|
7
8
|
|
|
8
9
|
class WickedRailtie < Rails::Railtie
|
|
9
|
-
initializer 'wicked_pdf.register' do |
|
|
10
|
+
initializer 'wicked_pdf.register' do |_app|
|
|
10
11
|
ActionController::Base.send :include, PdfHelper
|
|
11
12
|
if Rails::VERSION::MINOR > 0 && Rails.configuration.assets.enabled
|
|
12
13
|
ActionView::Base.send :include, WickedPdfHelper::Assets
|
|
@@ -28,7 +29,7 @@ if defined?(Rails)
|
|
|
28
29
|
else
|
|
29
30
|
|
|
30
31
|
class WickedRailtie < Rails::Railtie
|
|
31
|
-
initializer 'wicked_pdf.register' do |
|
|
32
|
+
initializer 'wicked_pdf.register' do |_app|
|
|
32
33
|
ActionController::Base.send :include, PdfHelper
|
|
33
34
|
ActionView::Base.send :include, WickedPdfHelper::Assets
|
|
34
35
|
end
|
data/lib/wicked_pdf/tempfile.rb
CHANGED
|
@@ -3,7 +3,7 @@ require 'tempfile'
|
|
|
3
3
|
class WickedPdfTempfile < Tempfile
|
|
4
4
|
# ensures the Tempfile's filename always keeps its extension
|
|
5
5
|
def initialize(filename, temp_dir = nil)
|
|
6
|
-
temp_dir
|
|
6
|
+
temp_dir ||= Dir.tmpdir
|
|
7
7
|
extension = File.extname(filename)
|
|
8
8
|
basename = File.basename(filename, extension)
|
|
9
9
|
super([basename, extension], temp_dir)
|
data/lib/wicked_pdf/version.rb
CHANGED
|
@@ -1,20 +1,18 @@
|
|
|
1
|
-
require 'open-uri'
|
|
2
|
-
|
|
3
1
|
module WickedPdfHelper
|
|
4
2
|
def self.root_path
|
|
5
3
|
String === Rails.root ? Pathname.new(Rails.root) : Rails.root
|
|
6
4
|
end
|
|
7
5
|
|
|
8
6
|
def self.add_extension(filename, extension)
|
|
9
|
-
|
|
7
|
+
filename.to_s.split('.').include?(extension) ? filename : "#{filename}.#{extension}"
|
|
10
8
|
end
|
|
11
9
|
|
|
12
10
|
def wicked_pdf_stylesheet_link_tag(*sources)
|
|
13
11
|
css_dir = WickedPdfHelper.root_path.join('public', 'stylesheets')
|
|
14
|
-
css_text = sources.collect
|
|
12
|
+
css_text = sources.collect do |source|
|
|
15
13
|
source = WickedPdfHelper.add_extension(source, 'css')
|
|
16
14
|
"<style type='text/css'>#{File.read(css_dir.join(source))}</style>"
|
|
17
|
-
|
|
15
|
+
end.join("\n")
|
|
18
16
|
css_text.respond_to?(:html_safe) ? css_text.html_safe : css_text
|
|
19
17
|
end
|
|
20
18
|
|
|
@@ -32,108 +30,4 @@ module WickedPdfHelper
|
|
|
32
30
|
js_text = sources.collect { |source| wicked_pdf_javascript_src_tag(source, {}) }.join("\n")
|
|
33
31
|
js_text.respond_to?(:html_safe) ? js_text.html_safe : js_text
|
|
34
32
|
end
|
|
35
|
-
|
|
36
|
-
module Assets
|
|
37
|
-
ASSET_URL_REGEX = /url\(['"]?([^'"]+?)['"]?\)/
|
|
38
|
-
|
|
39
|
-
def wicked_pdf_stylesheet_link_tag(*sources)
|
|
40
|
-
stylesheet_contents = sources.collect do |source|
|
|
41
|
-
source = WickedPdfHelper.add_extension(source, 'css')
|
|
42
|
-
"<style type='text/css'>#{read_asset(source)}</style>"
|
|
43
|
-
end.join("\n")
|
|
44
|
-
|
|
45
|
-
stylesheet_contents.gsub(ASSET_URL_REGEX) do
|
|
46
|
-
if Regexp.last_match[1].starts_with?('data:')
|
|
47
|
-
"url(#{Regexp.last_match[1]})"
|
|
48
|
-
else
|
|
49
|
-
"url(#{wicked_pdf_asset_path(Regexp.last_match[1])})"
|
|
50
|
-
end
|
|
51
|
-
end.html_safe
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def wicked_pdf_image_tag(img, options = {})
|
|
55
|
-
image_tag wicked_pdf_asset_path(img), options
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def wicked_pdf_javascript_src_tag(jsfile, options = {})
|
|
59
|
-
jsfile = WickedPdfHelper.add_extension(jsfile, 'js')
|
|
60
|
-
javascript_include_tag wicked_pdf_asset_path(jsfile), options
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def wicked_pdf_javascript_include_tag(*sources)
|
|
64
|
-
sources.collect { |source|
|
|
65
|
-
source = WickedPdfHelper.add_extension(source, 'js')
|
|
66
|
-
"<script type='text/javascript'>#{read_asset(source)}</script>"
|
|
67
|
-
}.join("\n").html_safe
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def wicked_pdf_asset_path(asset)
|
|
71
|
-
if (pathname = asset_pathname(asset).to_s) =~ URI_REGEXP
|
|
72
|
-
pathname
|
|
73
|
-
else
|
|
74
|
-
"file:///#{pathname}"
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
private
|
|
79
|
-
|
|
80
|
-
# borrowed from actionpack/lib/action_view/helpers/asset_url_helper.rb
|
|
81
|
-
URI_REGEXP = %r{^[-a-z]+://|^(?:cid|data):|^//}
|
|
82
|
-
|
|
83
|
-
def asset_pathname(source)
|
|
84
|
-
if precompiled_asset?(source)
|
|
85
|
-
if (pathname = set_protocol(asset_path(source))) =~ URI_REGEXP
|
|
86
|
-
# asset_path returns an absolute URL using asset_host if asset_host is set
|
|
87
|
-
pathname
|
|
88
|
-
else
|
|
89
|
-
File.join(Rails.public_path, asset_path(source).sub(/\A#{Rails.application.config.action_controller.relative_url_root}/, ''))
|
|
90
|
-
end
|
|
91
|
-
else
|
|
92
|
-
Rails.application.assets.find_asset(source).pathname
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
# will prepend a http or default_protocol to a protocol relative URL
|
|
97
|
-
# or when no protcol is set.
|
|
98
|
-
def set_protocol(source)
|
|
99
|
-
protocol = WickedPdf.config[:default_protocol] || 'http'
|
|
100
|
-
if source[0, 2] == '//'
|
|
101
|
-
source = [protocol, ':', source].join
|
|
102
|
-
elsif source[0] != '/' && !source[0, 8].include?('://')
|
|
103
|
-
source = [protocol, '://', source].join
|
|
104
|
-
end
|
|
105
|
-
source
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
def precompiled_asset?(source)
|
|
109
|
-
Rails.configuration.assets.compile == false || source.to_s[0] == '/'
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
def read_asset(source)
|
|
113
|
-
if precompiled_asset?(source)
|
|
114
|
-
if set_protocol(asset_path(source)) =~ URI_REGEXP
|
|
115
|
-
read_from_uri(source)
|
|
116
|
-
else
|
|
117
|
-
IO.read(asset_pathname(source))
|
|
118
|
-
end
|
|
119
|
-
else
|
|
120
|
-
Rails.application.assets.find_asset(source).to_s
|
|
121
|
-
end
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
def read_from_uri(source)
|
|
125
|
-
encoding = ':UTF-8' if RUBY_VERSION > '1.8'
|
|
126
|
-
asset = open(asset_pathname(source), "r#{encoding}") { |f| f.read }
|
|
127
|
-
asset = gzip(asset) if WickedPdf.config[:expect_gzipped_remote_assets]
|
|
128
|
-
asset
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
def gzip(asset)
|
|
132
|
-
stringified_asset = StringIO.new(asset)
|
|
133
|
-
gzipper = Zlib::GzipReader.new(stringified_asset)
|
|
134
|
-
gzipped_asset = gzipper.read
|
|
135
|
-
rescue Zlib::GzipFile::Error
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
end
|
|
139
33
|
end
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
require 'open-uri'
|
|
2
|
+
|
|
3
|
+
module WickedPdfHelper
|
|
4
|
+
module Assets
|
|
5
|
+
ASSET_URL_REGEX = /url\(['"]?([^'"]+?)['"]?\)/
|
|
6
|
+
|
|
7
|
+
def wicked_pdf_asset_base64(path)
|
|
8
|
+
asset = Rails.application.assets.find_asset(path)
|
|
9
|
+
throw "Could not find asset '#{path}'" if asset.nil?
|
|
10
|
+
base64 = Base64.encode64(asset.to_s).gsub(/\s+/, '')
|
|
11
|
+
"data:#{asset.content_type};base64,#{Rack::Utils.escape(base64)}"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def wicked_pdf_stylesheet_link_tag(*sources)
|
|
15
|
+
stylesheet_contents = sources.collect do |source|
|
|
16
|
+
source = WickedPdfHelper.add_extension(source, 'css')
|
|
17
|
+
"<style type='text/css'>#{read_asset(source)}</style>"
|
|
18
|
+
end.join("\n")
|
|
19
|
+
|
|
20
|
+
stylesheet_contents.gsub(ASSET_URL_REGEX) do
|
|
21
|
+
if Regexp.last_match[1].starts_with?('data:')
|
|
22
|
+
"url(#{Regexp.last_match[1]})"
|
|
23
|
+
else
|
|
24
|
+
asset = Regexp.last_match[1]
|
|
25
|
+
if asset_exists?(asset)
|
|
26
|
+
"url(#{wicked_pdf_asset_path(asset)})"
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end.html_safe
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def wicked_pdf_image_tag(img, options = {})
|
|
33
|
+
image_tag wicked_pdf_asset_path(img), options
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def wicked_pdf_javascript_src_tag(jsfile, options = {})
|
|
37
|
+
jsfile = WickedPdfHelper.add_extension(jsfile, 'js')
|
|
38
|
+
javascript_include_tag wicked_pdf_asset_path(jsfile), options
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def wicked_pdf_javascript_include_tag(*sources)
|
|
42
|
+
sources.collect do |source|
|
|
43
|
+
source = WickedPdfHelper.add_extension(source, 'js')
|
|
44
|
+
"<script type='text/javascript'>#{read_asset(source)}</script>"
|
|
45
|
+
end.join("\n").html_safe
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def wicked_pdf_asset_path(asset)
|
|
49
|
+
if (pathname = asset_pathname(asset).to_s) =~ URI_REGEXP
|
|
50
|
+
pathname
|
|
51
|
+
else
|
|
52
|
+
"file:///#{pathname}"
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
# borrowed from actionpack/lib/action_view/helpers/asset_url_helper.rb
|
|
59
|
+
URI_REGEXP = %r{^[-a-z]+://|^(?:cid|data):|^//}
|
|
60
|
+
|
|
61
|
+
def asset_pathname(source)
|
|
62
|
+
if precompiled_asset?(source)
|
|
63
|
+
if (pathname = set_protocol(asset_path(source))) =~ URI_REGEXP
|
|
64
|
+
# asset_path returns an absolute URL using asset_host if asset_host is set
|
|
65
|
+
pathname
|
|
66
|
+
else
|
|
67
|
+
File.join(Rails.public_path, asset_path(source).sub(/\A#{Rails.application.config.action_controller.relative_url_root}/, ''))
|
|
68
|
+
end
|
|
69
|
+
else
|
|
70
|
+
Rails.application.assets.find_asset(source).pathname
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# will prepend a http or default_protocol to a protocol relative URL
|
|
75
|
+
# or when no protcol is set.
|
|
76
|
+
def set_protocol(source)
|
|
77
|
+
protocol = WickedPdf.config[:default_protocol] || 'http'
|
|
78
|
+
if source[0, 2] == '//'
|
|
79
|
+
source = [protocol, ':', source].join
|
|
80
|
+
elsif source[0] != '/' && !source[0, 8].include?('://')
|
|
81
|
+
source = [protocol, '://', source].join
|
|
82
|
+
end
|
|
83
|
+
source
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def precompiled_asset?(source)
|
|
87
|
+
Rails.configuration.assets.compile == false || source.to_s[0] == '/'
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def read_asset(source)
|
|
91
|
+
if precompiled_asset?(source)
|
|
92
|
+
if set_protocol(asset_path(source)) =~ URI_REGEXP
|
|
93
|
+
read_from_uri(source)
|
|
94
|
+
elsif asset_exists?(source)
|
|
95
|
+
IO.read(asset_pathname(source))
|
|
96
|
+
end
|
|
97
|
+
else
|
|
98
|
+
Rails.application.assets.find_asset(source).to_s
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def read_from_uri(source)
|
|
103
|
+
encoding = ':UTF-8' if RUBY_VERSION > '1.8'
|
|
104
|
+
asset = open(asset_pathname(source), "r#{encoding}") { |f| f.read }
|
|
105
|
+
asset = gzip(asset) if WickedPdf.config[:expect_gzipped_remote_assets]
|
|
106
|
+
asset
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def gzip(asset)
|
|
110
|
+
stringified_asset = StringIO.new(asset)
|
|
111
|
+
gzipper = Zlib::GzipReader.new(stringified_asset)
|
|
112
|
+
gzipper.read
|
|
113
|
+
rescue Zlib::GzipFile::Error
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def asset_exists?(source)
|
|
117
|
+
Rails.application.assets.find_asset(source).present?
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
@@ -2,10 +2,16 @@ require 'test_helper'
|
|
|
2
2
|
require 'action_view/test_case'
|
|
3
3
|
|
|
4
4
|
class WickedPdfHelperAssetsTest < ActionView::TestCase
|
|
5
|
-
|
|
6
5
|
include WickedPdfHelper::Assets
|
|
7
6
|
|
|
8
7
|
if Rails::VERSION::MAJOR > 3 || (Rails::VERSION::MAJOR == 3 && Rails::VERSION::MINOR > 0)
|
|
8
|
+
test 'wicked_pdf_asset_base64 returns a base64 encoded asset' do
|
|
9
|
+
source = File.new('test/fixtures/wicked.css', 'r')
|
|
10
|
+
destination = Rails.root.join('app', 'assets', 'stylesheets', 'wicked.css')
|
|
11
|
+
File.open(destination, 'w') { |f| f.write(source) }
|
|
12
|
+
assert_match /data:text\/css;base64,.+/, wicked_pdf_asset_base64('wicked.css')
|
|
13
|
+
end
|
|
14
|
+
|
|
9
15
|
test 'wicked_pdf_asset_path should return a url when assets are served by an asset server' do
|
|
10
16
|
expects(:asset_pathname => 'http://assets.domain.com/dummy.png')
|
|
11
17
|
assert_equal 'http://assets.domain.com/dummy.png', wicked_pdf_asset_path('dummy.png')
|
|
@@ -95,18 +95,18 @@ class WickedPdfTest < ActiveSupport::TestCase
|
|
|
95
95
|
|
|
96
96
|
[:header, :footer].each do |hf|
|
|
97
97
|
[:center, :font_name, :left, :right].each do |o|
|
|
98
|
-
assert_equal "--#{hf
|
|
98
|
+
assert_equal "--#{hf}-#{o.to_s.gsub('_', '-')} header_footer",
|
|
99
99
|
wp.get_parsed_options(hf => { o => 'header_footer' }).strip
|
|
100
100
|
end
|
|
101
101
|
|
|
102
102
|
[:font_size, :spacing].each do |o|
|
|
103
|
-
assert_equal "--#{hf
|
|
103
|
+
assert_equal "--#{hf}-#{o.to_s.gsub('_', '-')} 12",
|
|
104
104
|
wp.get_parsed_options(hf => { o => '12' }).strip
|
|
105
105
|
end
|
|
106
106
|
|
|
107
|
-
assert_equal "--#{hf
|
|
107
|
+
assert_equal "--#{hf}-line",
|
|
108
108
|
wp.get_parsed_options(hf => { :line => true }).strip
|
|
109
|
-
assert_equal "--#{hf
|
|
109
|
+
assert_equal "--#{hf}-html http://www.abc.com",
|
|
110
110
|
wp.get_parsed_options(hf => { :html => { :url => 'http://www.abc.com' } }).strip
|
|
111
111
|
end
|
|
112
112
|
end
|
|
@@ -120,7 +120,8 @@ class WickedPdfTest < ActiveSupport::TestCase
|
|
|
120
120
|
wp.get_parsed_options(:toc => { o => 'toc' }).strip
|
|
121
121
|
end
|
|
122
122
|
|
|
123
|
-
[
|
|
123
|
+
[
|
|
124
|
+
:depth, :header_fs, :l1_font_size, :l2_font_size, :l3_font_size, :l4_font_size,
|
|
124
125
|
:l5_font_size, :l6_font_size, :l7_font_size, :l1_indentation, :l2_indentation,
|
|
125
126
|
:l3_indentation, :l4_indentation, :l5_indentation, :l6_indentation, :l7_indentation
|
|
126
127
|
].each do |o|
|
|
@@ -145,7 +146,7 @@ class WickedPdfTest < ActiveSupport::TestCase
|
|
|
145
146
|
wp = WickedPdf.new
|
|
146
147
|
|
|
147
148
|
[:top, :bottom, :left, :right].each do |o|
|
|
148
|
-
assert_equal "--margin-#{o
|
|
149
|
+
assert_equal "--margin-#{o} 12", wp.get_parsed_options(:margin => { o => '12' }).strip
|
|
149
150
|
end
|
|
150
151
|
end
|
|
151
152
|
|
|
@@ -155,14 +156,15 @@ class WickedPdfTest < ActiveSupport::TestCase
|
|
|
155
156
|
|
|
156
157
|
pathname = Rails.root.join('app', 'views', 'pdf', 'file.html')
|
|
157
158
|
assert_equal "#{cover_option} http://example.org", wp.get_parsed_options(:cover => 'http://example.org').strip, 'URL'
|
|
158
|
-
assert_equal "#{cover_option} #{pathname
|
|
159
|
+
assert_equal "#{cover_option} #{pathname}", wp.get_parsed_options(:cover => pathname).strip, 'Pathname'
|
|
159
160
|
assert_match /#{cover_option} .+wicked_cover_pdf.+\.html/, wp.get_parsed_options(:cover => '<html><body>HELLO</body></html>').strip, 'HTML'
|
|
160
161
|
end
|
|
161
162
|
|
|
162
163
|
test 'should parse other options' do
|
|
163
164
|
wp = WickedPdf.new
|
|
164
165
|
|
|
165
|
-
[
|
|
166
|
+
[
|
|
167
|
+
:orientation, :page_size, :proxy, :username, :password, :dpi,
|
|
166
168
|
:encoding, :user_style_sheet
|
|
167
169
|
].each do |o|
|
|
168
170
|
assert_equal "--#{o.to_s.gsub('_', '-')} opts", wp.get_parsed_options(o => 'opts').strip
|
|
@@ -179,7 +181,8 @@ class WickedPdfTest < ActiveSupport::TestCase
|
|
|
179
181
|
assert_equal "--#{o.to_s.gsub('_', '-')} 5", wp.get_parsed_options(o => 5).strip
|
|
180
182
|
end
|
|
181
183
|
|
|
182
|
-
[
|
|
184
|
+
[
|
|
185
|
+
:book, :default_header, :disable_javascript, :grayscale, :lowquality,
|
|
183
186
|
:enable_plugins, :disable_internal_links, :disable_external_links,
|
|
184
187
|
:print_media_type, :disable_smart_shrinking, :use_xserver, :no_background
|
|
185
188
|
].each do |o|
|
data/wicked_pdf.gemspec
CHANGED
|
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
|
|
|
21
21
|
spec.add_development_dependency 'rails'
|
|
22
22
|
spec.add_development_dependency 'bundler', '~> 1.3'
|
|
23
23
|
spec.add_development_dependency 'rake'
|
|
24
|
+
spec.add_development_dependency 'rubocop' if RUBY_VERSION > '1.9.2'
|
|
24
25
|
spec.add_development_dependency 'sqlite3'
|
|
25
26
|
spec.add_development_dependency 'mocha'
|
|
26
27
|
spec.add_development_dependency 'test-unit'
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: wicked_pdf
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Miles Z. Sterrett
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-11-
|
|
11
|
+
date: 2015-11-19 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rails
|
|
@@ -52,6 +52,20 @@ dependencies:
|
|
|
52
52
|
- - ">="
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
54
|
version: '0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: rubocop
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ">="
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0'
|
|
55
69
|
- !ruby/object:Gem::Dependency
|
|
56
70
|
name: sqlite3
|
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -104,7 +118,10 @@ extensions: []
|
|
|
104
118
|
extra_rdoc_files: []
|
|
105
119
|
files:
|
|
106
120
|
- ".gitignore"
|
|
121
|
+
- ".rubocop.yml"
|
|
122
|
+
- ".rubocop_todo.yml"
|
|
107
123
|
- ".travis.yml"
|
|
124
|
+
- CHANGLOG.md
|
|
108
125
|
- Gemfile
|
|
109
126
|
- LICENSE.txt
|
|
110
127
|
- README.md
|
|
@@ -128,6 +145,7 @@ files:
|
|
|
128
145
|
- lib/wicked_pdf/tempfile.rb
|
|
129
146
|
- lib/wicked_pdf/version.rb
|
|
130
147
|
- lib/wicked_pdf/wicked_pdf_helper.rb
|
|
148
|
+
- lib/wicked_pdf/wicked_pdf_helper/assets.rb
|
|
131
149
|
- test/fixtures/document_with_long_line.html
|
|
132
150
|
- test/fixtures/wicked.css
|
|
133
151
|
- test/functional/pdf_helper_test.rb
|