wisepdf 1.0.3 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.3
1
+ 1.1.0
@@ -32,7 +32,12 @@ module Wisepdf
32
32
  (defined?(::Rails) && ::Rails.env == 'development') ||
33
33
  (defined?(RAILS_ENV) && RAILS_ENV == 'development')
34
34
  end
35
-
35
+
36
+ def test?
37
+ (defined?(::Rails) && ::Rails.env == 'test') ||
38
+ (defined?(RAILS_ENV) && RAILS_ENV == 'test')
39
+ end
40
+
36
41
  def windows?
37
42
  RbConfig::CONFIG['target_os'] == 'mingw32'
38
43
  end
@@ -1,6 +1,3 @@
1
- require 'active_support/core_ext/class/attribute_accessors'
2
- require 'active_support/core_ext/object/blank'
3
-
4
1
  module Wisepdf
5
2
  class Writer
6
3
  def initialize(path=nil)
@@ -8,148 +5,93 @@ module Wisepdf
8
5
  end
9
6
 
10
7
  def to_pdf(string, options={})
11
- command = "\"#{self.wkhtmltopdf}\" #{parse_options(options)} #{'-q ' unless Wisepdf::Configuration.windows?}- - " # -q for no errors on stdout
12
- print_command(command) if Wisepdf::Configuration.development?
13
-
14
- result = IO.popen(command, "wb+") do |pdf|
8
+ options = { :encoding => "UTF-8" }.merge(options)
9
+ @options = normalize_options(options)
10
+
11
+ invoke = self.command.join(' ')
12
+ log(invoke) if Wisepdf::Configuration.development? || Wisepdf::Configuration.test?
13
+
14
+ result = IO.popen(invoke, "wb+") do |pdf|
15
15
  pdf.puts(string)
16
16
  pdf.close_write
17
17
  pdf.gets(nil)
18
18
  end
19
-
19
+
20
20
  raise Wisepdf::WriteError if result.to_s.strip.empty?
21
-
21
+
22
22
  return result
23
23
  end
24
-
24
+
25
25
  def wkhtmltopdf
26
26
  return @wkhtmltopdf if @wkhtmltopdf.present?
27
27
 
28
28
  @wkhtmltopdf = Wisepdf::Configuration.wkhtmltopdf
29
29
  raise Wisepdf::NoExecutableError.new(@wkhtmltopdf) if @wkhtmltopdf.nil? || !File.exists?(@wkhtmltopdf)
30
-
30
+
31
31
  return @wkhtmltopdf
32
32
  end
33
-
33
+
34
34
  def wkhtmltopdf=(value)
35
35
  @wkhtmltopdf = value
36
36
  raise Wisepdf::NoExecutableError.new(@wkhtmltopdf) if @wkhtmltopdf.nil? || !File.exists?(@wkhtmltopdf)
37
37
  end
38
-
39
- private
40
- def print_command(cmd)
41
- puts "*"*15
42
- puts cmd
43
- puts "*"*15
44
- end
45
38
 
46
- def parse_options(options)
47
- [
48
- parse_header_footer(:header => options.delete(:header),
49
- :footer => options.delete(:footer),
50
- :layout => options[:layout]),
51
- parse_toc(options.delete(:toc)),
52
- parse_outline(options.delete(:outline)),
53
- parse_margins(options.delete(:margin)),
54
- parse_others(options),
55
- parse_basic_auth(options)
56
- ].join(' ')
57
- end
39
+ protected
40
+ def command
41
+ args = [self.wkhtmltopdf]
42
+ args += @options.to_a.flatten.compact
43
+ args << '--quiet'
58
44
 
59
- def parse_basic_auth(options)
60
- if options[:basic_auth]
61
- user, passwd = Base64.decode64(options[:basic_auth]).split(":")
62
- "--username '#{user}' --password '#{passwd}'"
63
- else
64
- ""
65
- end
66
- end
67
-
68
- def make_option(name, value, type=:string)
69
- if value.is_a?(Array)
70
- return value.collect { |v| make_option(name, v, type) }.join('')
71
- end
72
- "--#{name.gsub('_', '-')} " + case type
73
- when :boolean then ""
74
- when :numeric then value.to_s
75
- when :name_value then value.to_s
76
- else "\"#{value}\""
77
- end + " "
78
- end
45
+ args << '-'
46
+ args << '-'
79
47
 
80
- def make_options(options, names, prefix="", type=:string)
81
- names.collect {|o| make_option("#{prefix.blank? ? "" : prefix + "-"}#{o.to_s}", options[o], type) unless options[o].blank?}.join
48
+ args.map {|arg| %Q{"#{arg.gsub('"', '\"')}"}}
82
49
  end
83
50
 
84
- def parse_header_footer(options)
85
- r=""
86
- [:header, :footer].collect do |hf|
87
- unless options[hf].blank?
88
- opt_hf = options[hf]
89
- r += make_options(opt_hf, [:center, :font_name, :left, :right], "#{hf.to_s}")
90
- r += make_options(opt_hf, [:font_size, :spacing], "#{hf.to_s}", :numeric)
91
- r += make_options(opt_hf, [:line], "#{hf.to_s}", :boolean)
92
- unless opt_hf[:html].blank?
93
- r += make_option("#{hf.to_s}-html", opt_hf[:html][:url]) unless opt_hf[:html][:url].blank?
94
- end
95
- end
96
- end unless options.blank?
97
- r
98
- end
51
+ def normalize_options(options)
52
+ options = self.flatten(options)
53
+ normalized_options = {}
99
54
 
100
- def parse_toc(options)
101
- r = 'toc ' unless options.nil?
102
- unless options.blank?
103
- r += make_options(options, [ :level_indentation, :header_text], "toc")
104
- r += make_options(options, [ :text_size_shrink], "toc", :numeric)
105
- r += make_options(options, [ :disable_toc_links, :disable_dotted_lines], "", :boolean)
55
+ options.each do |key, value|
56
+ next if !value
57
+ normalized_key = "--#{self.normalize_arg(key)}"
58
+ normalized_options[normalized_key] = self.normalize_value(value)
106
59
  end
107
- return r
60
+ normalized_options
108
61
  end
109
62
 
110
- def parse_outline(options)
111
- unless options.blank?
112
- r = make_options(options, [:outline], "", :boolean)
113
- r +=make_options(options, [:outline_depth], "", :numeric)
63
+ def flatten(options, prefix = nil)
64
+ hash = {}
65
+ options.each do |k,v|
66
+ key = prefix.nil? ? k : "#{prefix.to_s}-#{k}"
67
+
68
+ if v.is_a?(Hash)
69
+ hash.delete(k)
70
+ hash.merge!(self.flatten(v, key))
71
+ else
72
+ hash[key.to_s] = v
73
+ end
114
74
  end
75
+ return hash
115
76
  end
116
77
 
117
- def parse_margins(options)
118
- make_options(options, [:top, :bottom, :left, :right], "margin", :numeric) unless options.blank?
78
+ def normalize_arg(arg)
79
+ arg.to_s.downcase.gsub(/[^a-z0-9]/,'-')
119
80
  end
120
81
 
121
- def parse_others(options)
122
- unless options.blank?
123
- r = make_options(options, [ :orientation,
124
- :page_size,
125
- :page_width,
126
- :page_height,
127
- :proxy,
128
- :username,
129
- :password,
130
- :cover,
131
- :dpi,
132
- :encoding,
133
- :user_style_sheet])
134
- r +=make_options(options, [ :cookie,
135
- :post], "", :name_value)
136
- r +=make_options(options, [ :redirect_delay,
137
- :zoom,
138
- :page_offset,
139
- :javascript_delay], "", :numeric)
140
- r +=make_options(options, [ :book,
141
- :default_header,
142
- :disable_javascript,
143
- :greyscale,
144
- :lowquality,
145
- :enable_plugins,
146
- :disable_internal_links,
147
- :disable_external_links,
148
- :print_media_type,
149
- :disable_smart_shrinking,
150
- :use_xserver,
151
- :no_background], "", :boolean)
82
+ def normalize_value(value)
83
+ case value
84
+ when TrueClass
85
+ nil
86
+ else
87
+ value.to_s
152
88
  end
153
89
  end
90
+
91
+ def log(command)
92
+ puts "*"*15
93
+ puts command
94
+ puts "*"*15
95
+ end
154
96
  end
155
97
  end
data/test/writer_test.rb CHANGED
@@ -3,9 +3,9 @@ require 'helper'
3
3
  HTML_DOCUMENT = "<html><body>Hello World</body></html>"
4
4
 
5
5
  # Provide a public accessor to the normally-private parse_options function
6
- class Wisepdf::Writer
7
- public :parse_options
8
- end
6
+ # class Wisepdf::Writer
7
+ # public :parse_options
8
+ # end
9
9
 
10
10
  class WriterTest < Test::Unit::TestCase
11
11
  context "Default configuration" do
@@ -59,95 +59,95 @@ class WriterTest < Test::Unit::TestCase
59
59
  end
60
60
  end
61
61
 
62
- context "Option parsing" do
63
- setup do
64
- Wisepdf::Configuration.reset!
65
- end
66
-
67
- should "parse header and footer options" do
68
- wp = Wisepdf::Writer.new
69
-
70
- [:header, :footer].each do |hf|
71
- [:center, :font_name, :left, :right].each do |o|
72
- assert_equal "--#{hf.to_s}-#{o.to_s.gsub('_', '-')} \"header_footer\"",
73
- wp.parse_options(hf => {o => "header_footer"}).strip
74
- end
75
-
76
- [:font_size, :spacing].each do |o|
77
- assert_equal "--#{hf.to_s}-#{o.to_s.gsub('_', '-')} 12",
78
- wp.parse_options(hf => {o => "12"}).strip
79
- end
80
-
81
- assert_equal "--#{hf.to_s}-line",
82
- wp.parse_options(hf => {:line => true}).strip
83
- assert_equal "--#{hf.to_s}-html \"http://www.abc.com\"",
84
- wp.parse_options(hf => {:html => {:url => 'http://www.abc.com'}}).strip
85
- end
86
- end
87
-
88
- should "parse toc options" do
89
- wp = Wisepdf::Writer.new
90
-
91
- [:level_indentation, :header_text].each do |o|
92
- assert_equal "toc --toc-#{o.to_s.gsub('_', '-')} \"toc\"",
93
- wp.parse_options(:toc => {o => "toc"}).strip
94
- end
95
-
96
- [:text_size_shrink].each do |o|
97
- assert_equal "toc --toc-#{o.to_s.gsub('_', '-')} 5",
98
- wp.parse_options(:toc => {o => 5}).strip
99
- end
100
-
101
- [:disable_toc_links, :disable_dotted_lines].each do |o|
102
- assert_equal "toc --#{o.to_s.gsub('_', '-')}",
103
- wp.parse_options(:toc => {o => true}).strip
104
- end
105
- end
106
-
107
- should "parse outline options" do
108
- wp = Wisepdf::Writer.new
109
-
110
- assert_equal "--outline", wp.parse_options(:outline => {:outline => true}).strip
111
- assert_equal "--outline-depth 5", wp.parse_options(:outline => {:outline_depth => 5}).strip
112
- end
113
-
114
- should "parse margins options" do
115
- wp = Wisepdf::Writer.new
116
-
117
- [:top, :bottom, :left, :right].each do |o|
118
- assert_equal "--margin-#{o.to_s} 12", wp.parse_options(:margin => {o => "12"}).strip
119
- end
120
- end
121
-
122
- should "parse other options" do
123
- wp = Wisepdf::Writer.new
124
-
125
- [ :orientation, :page_size, :proxy, :username, :password, :cover, :dpi,
126
- :encoding, :user_style_sheet
127
- ].each do |o|
128
- assert_equal "--#{o.to_s.gsub('_', '-')} \"opts\"", wp.parse_options(o => "opts").strip
129
- end
130
-
131
- [:cookie, :post].each do |o|
132
- assert_equal "--#{o.to_s.gsub('_', '-')} name value", wp.parse_options(o => "name value").strip
133
-
134
- nv_formatter = ->(number){ "--#{o.to_s.gsub('_', '-')} par#{number} val#{number}" }
135
- assert_equal "#{nv_formatter.call(1)} #{nv_formatter.call(2)}", wp.parse_options(o => ['par1 val1', 'par2 val2']).strip
136
- end
137
-
138
- [:redirect_delay, :zoom, :page_offset].each do |o|
139
- assert_equal "--#{o.to_s.gsub('_', '-')} 5", wp.parse_options(o => 5).strip
140
- end
141
-
142
- [ :book, :default_header, :disable_javascript, :greyscale, :lowquality,
143
- :enable_plugins, :disable_internal_links, :disable_external_links,
144
- :print_media_type, :disable_smart_shrinking, :use_xserver, :no_background
145
- ].each do |o|
146
- assert_equal "--#{o.to_s.gsub('_', '-')}", wp.parse_options(o => true).strip
147
- end
148
- end
149
-
150
- end
62
+ # context "Option parsing" do
63
+ # setup do
64
+ # Wisepdf::Configuration.reset!
65
+ # end
66
+ #
67
+ # should "parse header and footer options" do
68
+ # wp = Wisepdf::Writer.new
69
+ #
70
+ # [:header, :footer].each do |hf|
71
+ # [:center, :font_name, :left, :right].each do |o|
72
+ # assert_equal "--#{hf.to_s}-#{o.to_s.gsub('_', '-')} \"header_footer\"",
73
+ # wp.parse_options(hf => {o => "header_footer"}).strip
74
+ # end
75
+ #
76
+ # [:font_size, :spacing].each do |o|
77
+ # assert_equal "--#{hf.to_s}-#{o.to_s.gsub('_', '-')} 12",
78
+ # wp.parse_options(hf => {o => "12"}).strip
79
+ # end
80
+ #
81
+ # assert_equal "--#{hf.to_s}-line",
82
+ # wp.parse_options(hf => {:line => true}).strip
83
+ # assert_equal "--#{hf.to_s}-html \"http://www.abc.com\"",
84
+ # wp.parse_options(hf => {:html => {:url => 'http://www.abc.com'}}).strip
85
+ # end
86
+ # end
87
+ #
88
+ # should "parse toc options" do
89
+ # wp = Wisepdf::Writer.new
90
+ #
91
+ # [:level_indentation, :header_text].each do |o|
92
+ # assert_equal "toc --toc-#{o.to_s.gsub('_', '-')} \"toc\"",
93
+ # wp.parse_options(:toc => {o => "toc"}).strip
94
+ # end
95
+ #
96
+ # [:text_size_shrink].each do |o|
97
+ # assert_equal "toc --toc-#{o.to_s.gsub('_', '-')} 5",
98
+ # wp.parse_options(:toc => {o => 5}).strip
99
+ # end
100
+ #
101
+ # [:disable_toc_links, :disable_dotted_lines].each do |o|
102
+ # assert_equal "toc --#{o.to_s.gsub('_', '-')}",
103
+ # wp.parse_options(:toc => {o => true}).strip
104
+ # end
105
+ # end
106
+ #
107
+ # should "parse outline options" do
108
+ # wp = Wisepdf::Writer.new
109
+ #
110
+ # assert_equal "--outline", wp.parse_options(:outline => {:outline => true}).strip
111
+ # assert_equal "--outline-depth 5", wp.parse_options(:outline => {:outline_depth => 5}).strip
112
+ # end
113
+ #
114
+ # should "parse margins options" do
115
+ # wp = Wisepdf::Writer.new
116
+ #
117
+ # [:top, :bottom, :left, :right].each do |o|
118
+ # assert_equal "--margin-#{o.to_s} 12", wp.parse_options(:margin => {o => "12"}).strip
119
+ # end
120
+ # end
121
+ #
122
+ # should "parse other options" do
123
+ # wp = Wisepdf::Writer.new
124
+ #
125
+ # [ :orientation, :page_size, :proxy, :username, :password, :cover, :dpi,
126
+ # :encoding, :user_style_sheet
127
+ # ].each do |o|
128
+ # assert_equal "--#{o.to_s.gsub('_', '-')} \"opts\"", wp.parse_options(o => "opts").strip
129
+ # end
130
+ #
131
+ # [:cookie, :post].each do |o|
132
+ # assert_equal "--#{o.to_s.gsub('_', '-')} name value", wp.parse_options(o => "name value").strip
133
+ #
134
+ # nv_formatter = ->(number){ "--#{o.to_s.gsub('_', '-')} par#{number} val#{number}" }
135
+ # assert_equal "#{nv_formatter.call(1)} #{nv_formatter.call(2)}", wp.parse_options(o => ['par1 val1', 'par2 val2']).strip
136
+ # end
137
+ #
138
+ # [:redirect_delay, :zoom, :page_offset].each do |o|
139
+ # assert_equal "--#{o.to_s.gsub('_', '-')} 5", wp.parse_options(o => 5).strip
140
+ # end
141
+ #
142
+ # [ :book, :default_header, :disable_javascript, :greyscale, :lowquality,
143
+ # :enable_plugins, :disable_internal_links, :disable_external_links,
144
+ # :print_media_type, :disable_smart_shrinking, :use_xserver, :no_background
145
+ # ].each do |o|
146
+ # assert_equal "--#{o.to_s.gsub('_', '-')}", wp.parse_options(o => true).strip
147
+ # end
148
+ # end
149
+ #
150
+ # end
151
151
 
152
152
  context "PDF generation" do
153
153
  should "generate PDF from html document" do
data/wisepdf.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "wisepdf"
8
- s.version = "1.0.3"
8
+ s.version = "1.1.0"
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"]
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.0.3
4
+ version: 1.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-04-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: &70324747536240 !ruby/object:Gem::Requirement
16
+ requirement: &70255372627820 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 3.0.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70324747536240
24
+ version_requirements: *70255372627820
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: sqlite3
27
- requirement: &70324747535640 !ruby/object:Gem::Requirement
27
+ requirement: &70255372626060 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70324747535640
35
+ version_requirements: *70255372626060
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: wkhtmltopdf-binary
38
- requirement: &70324747535060 !ruby/object:Gem::Requirement
38
+ requirement: &70255372624980 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70324747535060
46
+ version_requirements: *70255372624980
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: shoulda
49
- requirement: &70324747534180 !ruby/object:Gem::Requirement
49
+ requirement: &70255372623580 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70324747534180
57
+ version_requirements: *70255372623580
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: bundler
60
- requirement: &70324747532640 !ruby/object:Gem::Requirement
60
+ requirement: &70255372622720 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.0.0
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70324747532640
68
+ version_requirements: *70255372622720
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: jeweler
71
- requirement: &70324747531200 !ruby/object:Gem::Requirement
71
+ requirement: &70255372621920 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: 1.6.4
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70324747531200
79
+ version_requirements: *70255372621920
80
80
  description: wisepdf uses the shell utility wkhtmltopdf to serve a PDF file to a user
81
81
  from HTML. In other words, rather than dealing with a PDF generation DSL of some
82
82
  sort, you simply write an HTML view as you would normally, and let pdf take care
@@ -172,7 +172,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
172
172
  version: '0'
173
173
  segments:
174
174
  - 0
175
- hash: 743039549491428770
175
+ hash: 585500770691807734
176
176
  required_rubygems_version: !ruby/object:Gem::Requirement
177
177
  none: false
178
178
  requirements: