prawn 0.13.0 → 0.13.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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -1
  3. data/README.md +1 -0
  4. data/data/images/16bit.alpha +0 -0
  5. data/data/images/16bit.color +0 -0
  6. data/data/images/dice.alpha +0 -0
  7. data/data/images/dice.color +0 -0
  8. data/data/images/page_white_text.alpha +0 -0
  9. data/data/images/page_white_text.color +0 -0
  10. data/lib/pdf/core/object_store.rb +3 -15
  11. data/lib/pdf/core/pdf_object.rb +8 -33
  12. data/lib/prawn.rb +1 -2
  13. data/lib/prawn/document.rb +2 -3
  14. data/lib/prawn/encoding.rb +1 -2
  15. data/lib/prawn/font/afm.rb +70 -29
  16. data/lib/prawn/font/ttf.rb +10 -2
  17. data/lib/prawn/images/jpg.rb +9 -10
  18. data/lib/prawn/images/png.rb +46 -118
  19. data/lib/prawn/text/formatted/arranger.rb +1 -5
  20. data/lib/prawn/text/formatted/box.rb +1 -1
  21. data/lib/prawn/text/formatted/fragment.rb +5 -11
  22. data/lib/prawn/text/formatted/line_wrap.rb +4 -25
  23. data/lib/prawn/text/formatted/wrap.rb +1 -4
  24. data/manual/example_file.rb +2 -7
  25. data/manual/manual/manual.rb +1 -1
  26. data/prawn.gemspec +0 -1
  27. data/spec/document_spec.rb +5 -7
  28. data/spec/extensions/encoding_helpers.rb +2 -3
  29. data/spec/filters_spec.rb +1 -1
  30. data/spec/font_spec.rb +3 -2
  31. data/spec/formatted_text_box_spec.rb +14 -25
  32. data/spec/images_spec.rb +2 -6
  33. data/spec/line_wrap_spec.rb +2 -2
  34. data/spec/outline_spec.rb +10 -10
  35. data/spec/png_spec.rb +9 -12
  36. data/spec/text_at_spec.rb +11 -26
  37. data/spec/text_box_spec.rb +6 -2
  38. data/spec/text_spec.rb +13 -27
  39. metadata +5 -20
  40. data/data/images/16bit.dat +0 -0
  41. data/data/images/dice.dat +0 -0
  42. data/data/images/page_white_text.dat +0 -0
  43. data/lib/prawn/compatibility.rb +0 -91
@@ -52,11 +52,7 @@ module Prawn
52
52
  raise "Lines must be finalized before calling #line"
53
53
  end
54
54
  @fragments.collect do |fragment|
55
- if ruby_18 { true }
56
- fragment.text
57
- else
58
- fragment.text.dup.force_encoding("utf-8")
59
- end
55
+ fragment.text.dup.force_encoding(::Encoding::UTF_8)
60
56
  end.join
61
57
  end
62
58
 
@@ -392,7 +392,7 @@ module Prawn
392
392
  # all fonts
393
393
  fallback_fonts << fragment_font
394
394
 
395
- hash[:text].unicode_characters do |char|
395
+ hash[:text].each_char do |char|
396
396
  @document.font(fragment_font)
397
397
  font_glyph_pairs << [find_font_for_this_glyph(char,
398
398
  @document.font.family,
@@ -212,11 +212,7 @@ module Prawn
212
212
  end
213
213
  case direction
214
214
  when :rtl
215
- if ruby_18 { true }
216
- string.scan(/./mu).reverse.join
217
- else
218
- string.reverse
219
- end
215
+ string.reverse
220
216
  else
221
217
  string
222
218
  end
@@ -232,11 +228,9 @@ module Prawn
232
228
 
233
229
  def process_soft_hyphens(string)
234
230
  if string.length > 0 && normalized_soft_hyphen
235
- ruby_19 {
236
- if string.encoding != normalized_soft_hyphen.encoding
237
- string.force_encoding(normalized_soft_hyphen.encoding)
238
- end
239
- }
231
+ if string.encoding != normalized_soft_hyphen.encoding
232
+ string.force_encoding(normalized_soft_hyphen.encoding)
233
+ end
240
234
  string[0..-2].gsub(normalized_soft_hyphen, "") + string[-1..-1]
241
235
  else
242
236
  string
@@ -244,7 +238,7 @@ module Prawn
244
238
  end
245
239
 
246
240
  def strip_zero_width_spaces(string)
247
- if !"".respond_to?(:encoding) || string.encoding.to_s == "UTF-8"
241
+ if string.encoding == ::Encoding::UTF_8
248
242
  string.gsub(Prawn::Text::ZWSP, "")
249
243
  else
250
244
  string
@@ -119,7 +119,7 @@ module Prawn
119
119
  "[#{whitespace}]+|" +
120
120
  "#{hyphen}+[^#{break_chars}]*|" +
121
121
  "#{soft_hyphen}"
122
- new_regexp(pattern)
122
+ Regexp.new(pattern)
123
123
  end
124
124
 
125
125
  # The pattern used to determine whether any word breaks exist on a
@@ -127,7 +127,7 @@ module Prawn
127
127
  # word breaking is needed
128
128
  #
129
129
  def word_division_scan_pattern
130
- new_regexp("\\s|[#{zero_width_space}#{soft_hyphen}#{hyphen}]")
130
+ Regexp.new("\\s|[#{zero_width_space}#{soft_hyphen}#{hyphen}]")
131
131
  end
132
132
 
133
133
  def break_chars
@@ -241,18 +241,9 @@ module Prawn
241
241
  end
242
242
 
243
243
  def wrap_by_char(segment)
244
- # this conditional is only necessary for Ruby 1.8 compatibility
245
- # String#unicode_characters is a helper which iterates over UTF-8 characters
246
- # under Ruby 1.9, it is implemented simply by aliasing #each_char
247
244
  font = @document.font
248
- if font.unicode?
249
- segment.unicode_characters do |char|
250
- break unless append_char(char,font)
251
- end
252
- else
253
- segment.each_char do |char|
254
- break unless append_char(char,font)
255
- end
245
+ segment.each_char do |char|
246
+ break unless append_char(char,font)
256
247
  end
257
248
  end
258
249
 
@@ -268,18 +259,6 @@ module Prawn
268
259
  false
269
260
  end
270
261
  end
271
-
272
- def new_regexp(pattern)
273
- regexp = ruby_19 {
274
- Regexp.new(pattern)
275
- }
276
- regexp = regexp || ruby_18 {
277
- lang = @document.font.unicode? ? 'U' : 'N'
278
- Regexp.new(pattern, 0, lang)
279
- }
280
- regexp
281
- end
282
-
283
262
  end
284
263
  end
285
264
  end
@@ -87,10 +87,7 @@ module Prawn
87
87
  accumulated_width += fragment_this_line.width
88
88
  end
89
89
 
90
- if "".respond_to?(:force_encoding)
91
- printed_fragments.map! { |s| s.force_encoding("utf-8") }
92
- end
93
- @printed_lines << printed_fragments.join
90
+ @printed_lines << printed_fragments.map { |s| s.force_encoding(::Encoding::UTF_8) }.join
94
91
  end
95
92
 
96
93
  def word_spacing_for_this_line
@@ -103,13 +103,8 @@ module Prawn
103
103
  def read_file(folder_name, filename)
104
104
  data = File.read(File.expand_path(File.join(
105
105
  File.dirname(__FILE__), folder_name, filename)))
106
-
107
- # XXX If we ever have manual files with source encodings other than
108
- # UTF-8, we will need to fix this to work on Ruby 1.9.
109
- if data.respond_to?(:encode!)
110
- data.encode!("UTF-8")
111
- end
112
- data
106
+
107
+ data.encode(::Encoding::UTF_8)
113
108
  end
114
109
 
115
110
  end
@@ -3,7 +3,7 @@
3
3
  # Generates the Prawn by example manual.
4
4
  #
5
5
 
6
- Encoding.default_external = "UTF-8" if defined? Encoding
6
+ Encoding.default_external = Encoding::UTF_8
7
7
 
8
8
  require File.expand_path(File.join(File.dirname(__FILE__),
9
9
  %w[.. example_helper]))
@@ -23,7 +23,6 @@ Gem::Specification.new do |spec|
23
23
  spec.add_dependency('pdf-reader', '~>1.2')
24
24
  spec.add_dependency('ttfunk', '~>1.0.3')
25
25
  spec.add_dependency('ruby-rc4')
26
- spec.add_dependency('afm')
27
26
  spec.add_development_dependency('pdf-inspector', '~> 1.1.0')
28
27
  spec.add_development_dependency('coderay', '~> 1.0.7')
29
28
  spec.add_development_dependency('rdoc')
@@ -447,13 +447,11 @@ describe "The group() feature" do
447
447
  end
448
448
 
449
449
  describe "The render() feature" do
450
- if "spec".respond_to?(:encode!)
451
- it "should return a 8 bit encoded string on a m17n aware VM" do
452
- @pdf = Prawn::Document.new(:page_size => "A4", :page_layout => :landscape)
453
- @pdf.line [100,100], [200,200]
454
- str = @pdf.render
455
- str.encoding.to_s.should == "ASCII-8BIT"
456
- end
450
+ it "should return a 8 bit encoded string on a m17n aware VM" do
451
+ @pdf = Prawn::Document.new(:page_size => "A4", :page_layout => :landscape)
452
+ @pdf.line [100,100], [200,200]
453
+ str = @pdf.render
454
+ str.encoding.to_s.should == "ASCII-8BIT"
457
455
  end
458
456
 
459
457
  it "should trigger before_render callbacks just before rendering" do
@@ -1,10 +1,9 @@
1
1
  module EncodingHelpers
2
2
  def win1252_string(str)
3
- ruby_19 { str.force_encoding("Windows-1252") }
4
- str
3
+ str.force_encoding(Encoding::Windows_1252)
5
4
  end
6
5
 
7
6
  def bin_string(str)
8
- ruby_19 { str.force_encoding("ASCII-8BIT") } || ruby_18 { str }
7
+ str.force_encoding(Encoding::ASCII_8BIT)
9
8
  end
10
9
  end
@@ -3,7 +3,7 @@
3
3
  require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
4
 
5
5
  FILTERS = {
6
- :FlateDecode => {'test' => ruby_19 { "x\x9C+I-.\x01\x00\x04]\x01\xC1".force_encoding(Encoding::ASCII_8BIT) } || "x\x9C+I-.\x01\x00\x04]\x01\xC1" },
6
+ :FlateDecode => {'test' => "x\x9C+I-.\x01\x00\x04]\x01\xC1".force_encoding(Encoding::ASCII_8BIT) },
7
7
  :DCTDecode => {'test' => "test"}
8
8
  }
9
9
 
@@ -80,8 +80,9 @@ describe "#width_of" do
80
80
  styled_bold_hello.should == @bold_hello
81
81
  end
82
82
 
83
- # This is not a fully confirmed bug report... needs further investigation
84
- it "should not treat minus as if it were a hyphen", :unresolved, :issue => 578 do
83
+ it "should not treat minus as if it were a hyphen", :issue => 578 do
84
+ create_pdf
85
+
85
86
  @pdf.width_of("-0.75").should be < @pdf.width_of("25.00")
86
87
  end
87
88
  end
@@ -20,19 +20,17 @@ describe "Text::Formatted::Box wrapping" do
20
20
 
21
21
  it "should not raise an Encoding::CompatibilityError when keeping a TTF and an " +
22
22
  "AFM font together" do
23
- ruby_19 do
24
- file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf"
25
- @pdf.font_families["Kai"] = {
26
- :normal => { :file => file, :font => "Kai" }
27
- }
23
+ file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf"
24
+ @pdf.font_families["Kai"] = {
25
+ :normal => { :file => file, :font => "Kai" }
26
+ }
28
27
 
29
- texts = [{ :text => "Hello " },
30
- { :text => "再见", :font => "Kai"},
31
- { :text => "World" }]
32
- text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Hello World"))
28
+ texts = [{ :text => "Hello " },
29
+ { :text => "再见", :font => "Kai"},
30
+ { :text => "World" }]
31
+ text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Hello World"))
33
32
 
34
- text_box.render
35
- end
33
+ text_box.render
36
34
  end
37
35
 
38
36
  it "should wrap between two fragments when the preceding fragment ends with white space" do
@@ -86,23 +84,14 @@ describe "Text::Formatted::Box wrapping" do
86
84
 
87
85
  describe "Unicode" do
88
86
  before do
89
- if RUBY_VERSION < '1.9'
90
- @reset_value = $KCODE
91
- $KCODE='u'
92
- else
93
- @reset_value = [Encoding.default_external, Encoding.default_internal]
94
- Encoding.default_external = Encoding::UTF_8
95
- Encoding.default_internal = Encoding::UTF_8
96
- end
87
+ @reset_value = [Encoding.default_external, Encoding.default_internal]
88
+ Encoding.default_external = Encoding::UTF_8
89
+ Encoding.default_internal = Encoding::UTF_8
97
90
  end
98
91
 
99
92
  after do
100
- if RUBY_VERSION < '1.9'
101
- $KCODE=@reset_value
102
- else
103
- Encoding.default_external = @reset_value[0]
104
- Encoding.default_internal = @reset_value[1]
105
- end
93
+ Encoding.default_external = @reset_value[0]
94
+ Encoding.default_internal = @reset_value[1]
106
95
  end
107
96
 
108
97
  it "should properly handle empty slices using Unicode encoding" do
@@ -83,16 +83,12 @@ describe "the image() function" do
83
83
  @pdf.state.version.should >= 1.5
84
84
  end
85
85
 
86
- # to support Adobe Reader, which apparently doesn't handle 16-bit alpha
87
- # channels. Verified experimentally [BE] but not confirmed in documentation
88
- # or anything. OS X Preview handles those files just fine.
89
- #
90
- it "should embed 8-bit alpha channels for 16-bit PNGs" do
86
+ it "should embed 16-bit alpha channels for 16-bit PNGs" do
91
87
  @pdf.image "#{Prawn::DATADIR}/images/16bit.png"
92
88
 
93
89
  output = @pdf.render
94
90
  output.should =~ /\/BitsPerComponent 16/
95
- output.should =~ /\/BitsPerComponent 8/
91
+ output.should_not =~ /\/BitsPerComponent 8/
96
92
  end
97
93
 
98
94
  it "should flow an image to a new page if it will not fit on a page" do
@@ -113,7 +113,7 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
113
113
  :width => @one_word_width,
114
114
  :document => @pdf)
115
115
  expected = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}")
116
- expected.force_encoding("utf-8") if "".respond_to?(:force_encoding)
116
+ expected.force_encoding(Encoding::UTF_8)
117
117
  string.should == expected
118
118
 
119
119
  @pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf")
@@ -202,7 +202,7 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
202
202
  :width => @one_word_width,
203
203
  :document => @pdf)
204
204
  expected = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}")
205
- expected.force_encoding("utf-8") if "".respond_to?(:force_encoding)
205
+ expected.force_encoding(Encoding::UTF_8)
206
206
  string.should == expected
207
207
 
208
208
  @pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf")
@@ -16,20 +16,20 @@ describe "Outline" do
16
16
  end
17
17
  end
18
18
  end
19
- if RUBY_VERSION >= "1.9"
20
- describe "outline encoding" do
21
- it "should store all outline titles as UTF-16" do
22
- render_and_find_objects
23
- @hash.values.each do |obj|
24
- if obj.is_a?(Hash) && obj[:Title]
25
- title = obj[:Title].dup
26
- title.force_encoding("UTF-16LE")
27
- title.valid_encoding?.should == true
28
- end
19
+
20
+ describe "outline encoding" do
21
+ it "should store all outline titles as UTF-16" do
22
+ render_and_find_objects
23
+ @hash.values.each do |obj|
24
+ if obj.is_a?(Hash) && obj[:Title]
25
+ title = obj[:Title].dup
26
+ title.force_encoding(Encoding::UTF_16LE)
27
+ title.valid_encoding?.should == true
29
28
  end
30
29
  end
31
30
  end
32
31
  end
32
+
33
33
  describe "#generate_outline" do
34
34
  before(:each) do
35
35
  render_and_find_objects
@@ -131,7 +131,7 @@ describe "When reading a greyscale+alpha PNG file (color type 4)" do
131
131
 
132
132
  before(:each) do
133
133
  @filename = "#{Prawn::DATADIR}/images/page_white_text.png"
134
- @data_filename = "#{Prawn::DATADIR}/images/page_white_text.dat"
134
+ @color_data_filename = "#{Prawn::DATADIR}/images/page_white_text.color"
135
135
  @alpha_data_filename = "#{Prawn::DATADIR}/images/page_white_text.alpha"
136
136
  @img_data = File.binread(@filename)
137
137
  end
@@ -151,14 +151,14 @@ describe "When reading a greyscale+alpha PNG file (color type 4)" do
151
151
  it "should correctly return the raw image data (with no alpha channel) from the image data chunk" do
152
152
  png = Prawn::Images::PNG.new(@img_data)
153
153
  png.split_alpha_channel!
154
- data = Zlib::Inflate.inflate(File.binread(@data_filename))
154
+ data = File.binread(@color_data_filename)
155
155
  png.img_data.should == data
156
156
  end
157
157
 
158
158
  it "should correctly extract the alpha channel data from the image data chunk" do
159
159
  png = Prawn::Images::PNG.new(@img_data)
160
160
  png.split_alpha_channel!
161
- data = Zlib::Inflate.inflate(File.binread(@alpha_data_filename))
161
+ data = File.binread(@alpha_data_filename)
162
162
  png.alpha_channel.should == data
163
163
  end
164
164
  end
@@ -167,7 +167,7 @@ describe "When reading an RGB+alpha PNG file (color type 6)" do
167
167
 
168
168
  before(:each) do
169
169
  @filename = "#{Prawn::DATADIR}/images/dice.png"
170
- @data_filename = "#{Prawn::DATADIR}/images/dice.dat"
170
+ @color_data_filename = "#{Prawn::DATADIR}/images/dice.color"
171
171
  @alpha_data_filename = "#{Prawn::DATADIR}/images/dice.alpha"
172
172
  @img_data = File.binread(@filename)
173
173
  end
@@ -187,17 +187,14 @@ describe "When reading an RGB+alpha PNG file (color type 6)" do
187
187
  it "should correctly return the raw image data (with no alpha channel) from the image data chunk" do
188
188
  png = Prawn::Images::PNG.new(@img_data)
189
189
  png.split_alpha_channel!
190
- data = Zlib::Inflate.inflate(File.binread(@data_filename))
191
- # compare decompressed rather than compressed image data
192
- # because JRuby's implementation of Zlib is different from MRI --
193
- # both generate valid gzipped data, but not bit-identical to each other
190
+ data = File.binread(@color_data_filename)
194
191
  png.img_data.should == data
195
192
  end
196
193
 
197
194
  it "should correctly extract the alpha channel data from the image data chunk" do
198
195
  png = Prawn::Images::PNG.new(@img_data)
199
196
  png.split_alpha_channel!
200
- data = Zlib::Inflate.inflate(File.binread(@alpha_data_filename))
197
+ data = File.binread(@alpha_data_filename)
201
198
  png.alpha_channel.should == data
202
199
  end
203
200
  end
@@ -206,7 +203,7 @@ describe "When reading a 16bit RGB+alpha PNG file (color type 6)" do
206
203
 
207
204
  before(:each) do
208
205
  @filename = "#{Prawn::DATADIR}/images/16bit.png"
209
- @data_filename = "#{Prawn::DATADIR}/images/16bit.dat"
206
+ @color_data_filename = "#{Prawn::DATADIR}/images/16bit.color"
210
207
  # alpha channel truncated to 8-bit
211
208
  @alpha_data_filename = "#{Prawn::DATADIR}/images/16bit.alpha"
212
209
  @img_data = File.binread(@filename)
@@ -227,14 +224,14 @@ describe "When reading a 16bit RGB+alpha PNG file (color type 6)" do
227
224
  it "should correctly return the raw image data (with no alpha channel) from the image data chunk" do
228
225
  png = Prawn::Images::PNG.new(@img_data)
229
226
  png.split_alpha_channel!
230
- data = Zlib::Inflate.inflate(File.binread(@data_filename))
227
+ data = File.binread(@color_data_filename)
231
228
  png.img_data.should == data
232
229
  end
233
230
 
234
231
  it "should correctly extract the alpha channel data from the image data chunk" do
235
232
  png = Prawn::Images::PNG.new(@img_data)
236
233
  png.split_alpha_channel!
237
- data = Zlib::Inflate.inflate(File.binread(@alpha_data_filename))
234
+ data = File.binread(@alpha_data_filename)
238
235
  png.alpha_channel.should == data
239
236
  end
240
237
  end
@@ -98,33 +98,18 @@ describe "#draw_text" do
98
98
  text.strings.first.should == str
99
99
  end
100
100
 
101
- if "spec".respond_to?(:encode!)
102
- # Handle non utf-8 string encodings in a sane way on M17N aware VMs
103
- it "should raise_error an exception when a utf-8 incompatible string is rendered" do
104
- str = "Blah \xDD"
105
- str.force_encoding("ASCII-8BIT")
106
- lambda { @pdf.draw_text(str, :at => [0, 0]) }.should raise_error(
107
- Prawn::Errors::IncompatibleStringEncoding)
108
- end
101
+ it "should raise_error an exception when a utf-8 incompatible string is rendered" do
102
+ str = "Blah \xDD"
103
+ str.force_encoding(Encoding::ASCII_8BIT)
104
+ lambda { @pdf.draw_text(str, :at => [0, 0]) }.should raise_error(
105
+ Prawn::Errors::IncompatibleStringEncoding)
106
+ end
109
107
 
110
- it "should not raise an exception when a shift-jis string is rendered" do
111
- datafile = "#{Prawn::DATADIR}/shift_jis_text.txt"
112
- sjis_str = File.open(datafile, "r:shift_jis") { |f| f.gets }
113
- @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf")
108
+ it "should not raise an exception when a shift-jis string is rendered" do
109
+ datafile = "#{Prawn::DATADIR}/shift_jis_text.txt"
110
+ sjis_str = File.open(datafile, "r:shift_jis") { |f| f.gets }
111
+ @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf")
114
112
 
115
- @pdf.draw_text(sjis_str, :at => [0, 0])
116
- end
117
- else
118
- # Handle non utf-8 string encodings in a sane way on non-M17N aware VMs
119
- it "should raise_error an exception when a corrupt utf-8 string is rendered" do
120
- str = "Blah \xDD"
121
- lambda { @pdf.draw_text(str, :at => [0, 0]) }.should raise_error(
122
- Prawn::Errors::IncompatibleStringEncoding)
123
- end
124
- it "should raise_error an exception when a shift-jis string is rendered" do
125
- sjis_str = File.read("#{Prawn::DATADIR}/shift_jis_text.txt")
126
- lambda { @pdf.draw_text(sjis_str, :at => [0, 0]) }.should raise_error(
127
- Prawn::Errors::IncompatibleStringEncoding)
128
- end
113
+ @pdf.draw_text(sjis_str, :at => [0, 0])
129
114
  end
130
115
  end