prawn 1.0.0.rc2 → 1.0.0

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 (169) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +9 -0
  3. data/COPYING +2 -2
  4. data/Gemfile +8 -15
  5. data/LICENSE +1 -1
  6. data/Rakefile +25 -16
  7. data/data/images/16bit.alpha +0 -0
  8. data/data/images/16bit.color +0 -0
  9. data/data/images/dice.alpha +0 -0
  10. data/data/images/dice.color +0 -0
  11. data/data/images/indexed_color.dat +0 -0
  12. data/data/images/indexed_color.png +0 -0
  13. data/data/images/license.md +8 -0
  14. data/data/images/page_white_text.alpha +0 -0
  15. data/data/images/page_white_text.color +0 -0
  16. data/lib/prawn.rb +85 -23
  17. data/lib/prawn/document.rb +134 -116
  18. data/lib/prawn/document/bounding_box.rb +33 -4
  19. data/lib/prawn/document/column_box.rb +18 -6
  20. data/lib/prawn/document/graphics_state.rb +11 -74
  21. data/lib/prawn/document/internals.rb +24 -23
  22. data/lib/prawn/document/span.rb +12 -10
  23. data/lib/prawn/encoding.rb +8 -9
  24. data/lib/prawn/errors.rb +13 -32
  25. data/lib/prawn/font.rb +137 -105
  26. data/lib/prawn/font/afm.rb +76 -32
  27. data/lib/prawn/font/dfont.rb +4 -3
  28. data/lib/prawn/font/ttf.rb +33 -25
  29. data/lib/prawn/font_metric_cache.rb +47 -0
  30. data/lib/prawn/graphics.rb +177 -57
  31. data/lib/prawn/graphics/cap_style.rb +4 -3
  32. data/lib/prawn/graphics/color.rb +5 -4
  33. data/lib/prawn/graphics/dash.rb +53 -31
  34. data/lib/prawn/graphics/join_style.rb +9 -7
  35. data/lib/prawn/graphics/patterns.rb +4 -15
  36. data/lib/prawn/graphics/transformation.rb +10 -9
  37. data/lib/prawn/graphics/transparency.rb +3 -1
  38. data/lib/prawn/{layout/grid.rb → grid.rb} +72 -54
  39. data/lib/prawn/image_handler.rb +42 -0
  40. data/lib/prawn/images.rb +58 -54
  41. data/lib/prawn/images/image.rb +6 -22
  42. data/lib/prawn/images/jpg.rb +20 -14
  43. data/lib/prawn/images/png.rb +58 -121
  44. data/lib/prawn/layout.rb +12 -15
  45. data/lib/prawn/measurement_extensions.rb +10 -6
  46. data/lib/prawn/measurements.rb +27 -21
  47. data/lib/prawn/outline.rb +108 -147
  48. data/lib/prawn/repeater.rb +10 -8
  49. data/lib/prawn/security.rb +59 -40
  50. data/lib/prawn/security/arcfour.rb +52 -0
  51. data/lib/prawn/soft_mask.rb +4 -4
  52. data/lib/prawn/stamp.rb +5 -3
  53. data/lib/prawn/table.rb +83 -60
  54. data/lib/prawn/table/cell.rb +17 -21
  55. data/lib/prawn/table/cell/image.rb +2 -3
  56. data/lib/prawn/table/cell/in_table.rb +8 -2
  57. data/lib/prawn/table/cell/span_dummy.rb +5 -0
  58. data/lib/prawn/table/cell/subtable.rb +3 -2
  59. data/lib/prawn/table/cell/text.rb +14 -12
  60. data/lib/prawn/table/cells.rb +58 -14
  61. data/lib/prawn/table/column_width_calculator.rb +61 -0
  62. data/lib/prawn/text.rb +27 -26
  63. data/lib/prawn/text/box.rb +12 -6
  64. data/lib/prawn/text/formatted.rb +5 -4
  65. data/lib/prawn/text/formatted/arranger.rb +290 -0
  66. data/lib/prawn/text/formatted/box.rb +85 -57
  67. data/lib/prawn/text/formatted/fragment.rb +11 -11
  68. data/lib/prawn/text/formatted/line_wrap.rb +266 -0
  69. data/lib/prawn/text/formatted/parser.rb +11 -4
  70. data/lib/prawn/text/formatted/wrap.rb +156 -0
  71. data/lib/prawn/utilities.rb +5 -3
  72. data/manual/document_and_page_options/document_and_page_options.rb +2 -1
  73. data/manual/document_and_page_options/metadata.rb +3 -3
  74. data/manual/document_and_page_options/page_size.rb +2 -2
  75. data/manual/document_and_page_options/print_scaling.rb +20 -0
  76. data/manual/example_file.rb +2 -7
  77. data/manual/example_helper.rb +62 -81
  78. data/manual/graphics/common_lines.rb +2 -0
  79. data/manual/graphics/helper.rb +11 -4
  80. data/manual/graphics/stroke_dash.rb +19 -14
  81. data/manual/manual/cover.rb +16 -0
  82. data/manual/manual/manual.rb +1 -5
  83. data/manual/text/fallback_fonts.rb +4 -4
  84. data/manual/text/formatted_text.rb +5 -5
  85. data/manual/text/inline.rb +2 -4
  86. data/manual/text/registering_families.rb +12 -12
  87. data/manual/text/single_usage.rb +4 -4
  88. data/manual/text/text.rb +0 -2
  89. data/prawn.gemspec +21 -13
  90. data/spec/acceptance/png.rb +23 -0
  91. data/spec/annotations_spec.rb +16 -32
  92. data/spec/bounding_box_spec.rb +22 -5
  93. data/spec/cell_spec.rb +49 -5
  94. data/spec/column_box_spec.rb +32 -0
  95. data/spec/destinations_spec.rb +5 -5
  96. data/spec/document_spec.rb +112 -118
  97. data/spec/extensions/encoding_helpers.rb +5 -2
  98. data/spec/font_metric_cache_spec.rb +52 -0
  99. data/spec/font_spec.rb +121 -120
  100. data/spec/formatted_text_arranger_spec.rb +24 -24
  101. data/spec/formatted_text_box_spec.rb +31 -32
  102. data/spec/formatted_text_fragment_spec.rb +2 -2
  103. data/spec/graphics_spec.rb +63 -45
  104. data/spec/grid_spec.rb +24 -13
  105. data/spec/image_handler_spec.rb +54 -0
  106. data/spec/images_spec.rb +34 -21
  107. data/spec/inline_formatted_text_parser_spec.rb +69 -20
  108. data/spec/jpg_spec.rb +3 -3
  109. data/spec/line_wrap_spec.rb +25 -14
  110. data/spec/measurement_units_spec.rb +5 -5
  111. data/spec/outline_spec.rb +68 -64
  112. data/spec/png_spec.rb +15 -18
  113. data/spec/reference_spec.rb +2 -82
  114. data/spec/repeater_spec.rb +1 -1
  115. data/spec/security_spec.rb +41 -9
  116. data/spec/soft_mask_spec.rb +0 -40
  117. data/spec/span_spec.rb +6 -11
  118. data/spec/spec_helper.rb +20 -2
  119. data/spec/stamp_spec.rb +19 -20
  120. data/spec/stroke_styles_spec.rb +31 -13
  121. data/spec/table/span_dummy_spec.rb +17 -0
  122. data/spec/table_spec.rb +268 -43
  123. data/spec/text_at_spec.rb +13 -27
  124. data/spec/text_box_spec.rb +35 -30
  125. data/spec/text_spec.rb +56 -40
  126. data/spec/transparency_spec.rb +5 -5
  127. metadata +214 -217
  128. data/README.md +0 -98
  129. data/data/fonts/Action Man.dfont +0 -0
  130. data/data/fonts/Activa.ttf +0 -0
  131. data/data/fonts/Chalkboard.ttf +0 -0
  132. data/data/fonts/DejaVuSans.ttf +0 -0
  133. data/data/fonts/Dustismo_Roman.ttf +0 -0
  134. data/data/fonts/comicsans.ttf +0 -0
  135. data/data/fonts/gkai00mp.ttf +0 -0
  136. data/data/images/16bit.dat +0 -0
  137. data/data/images/barcode_issue.png +0 -0
  138. data/data/images/dice.dat +0 -0
  139. data/data/images/page_white_text.dat +0 -0
  140. data/data/images/rails.dat +0 -0
  141. data/data/images/rails.png +0 -0
  142. data/lib/prawn/compatibility.rb +0 -87
  143. data/lib/prawn/core.rb +0 -87
  144. data/lib/prawn/core/annotations.rb +0 -61
  145. data/lib/prawn/core/byte_string.rb +0 -9
  146. data/lib/prawn/core/destinations.rb +0 -90
  147. data/lib/prawn/core/document_state.rb +0 -79
  148. data/lib/prawn/core/literal_string.rb +0 -16
  149. data/lib/prawn/core/name_tree.rb +0 -177
  150. data/lib/prawn/core/object_store.rb +0 -320
  151. data/lib/prawn/core/page.rb +0 -212
  152. data/lib/prawn/core/pdf_object.rb +0 -125
  153. data/lib/prawn/core/reference.rb +0 -119
  154. data/lib/prawn/core/text.rb +0 -268
  155. data/lib/prawn/core/text/formatted/arranger.rb +0 -294
  156. data/lib/prawn/core/text/formatted/line_wrap.rb +0 -288
  157. data/lib/prawn/core/text/formatted/wrap.rb +0 -153
  158. data/lib/prawn/document/page_geometry.rb +0 -136
  159. data/lib/prawn/document/snapshot.rb +0 -89
  160. data/manual/manual/foreword.rb +0 -13
  161. data/manual/templates/full_template.rb +0 -23
  162. data/manual/templates/page_template.rb +0 -47
  163. data/manual/templates/templates.rb +0 -26
  164. data/manual/text/group.rb +0 -29
  165. data/spec/name_tree_spec.rb +0 -112
  166. data/spec/object_store_spec.rb +0 -170
  167. data/spec/pdf_object_spec.rb +0 -172
  168. data/spec/snapshot_spec.rb +0 -186
  169. data/spec/template_spec.rb +0 -351
@@ -5,7 +5,7 @@ require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
5
5
  describe "Core::Text::Formatted::Arranger#format_array" do
6
6
  it "should populate unconsumed array" do
7
7
  create_pdf
8
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
8
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
9
9
  array = [{ :text => "hello " },
10
10
  { :text => "world how ", :styles => [:bold] },
11
11
  { :text => "are", :styles => [:bold, :italic] },
@@ -20,7 +20,7 @@ describe "Core::Text::Formatted::Arranger#format_array" do
20
20
  end
21
21
  it "should split newlines into their own elements" do
22
22
  create_pdf
23
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
23
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
24
24
  array = [{ :text => "\nhello\nworld" }]
25
25
  arranger.format_array = array
26
26
  arranger.unconsumed[0].should == { :text => "\n" }
@@ -32,7 +32,7 @@ end
32
32
  describe "Core::Text::Formatted::Arranger#preview_next_string" do
33
33
  it "should not populate the consumed array" do
34
34
  create_pdf
35
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
35
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
36
36
  array = [{ :text => "hello" }]
37
37
  arranger.format_array = array
38
38
  arranger.preview_next_string
@@ -40,7 +40,7 @@ describe "Core::Text::Formatted::Arranger#preview_next_string" do
40
40
  end
41
41
  it "should not consumed array" do
42
42
  create_pdf
43
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
43
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
44
44
  array = [{ :text => "hello" }]
45
45
  arranger.format_array = array
46
46
  arranger.preview_next_string.should == "hello"
@@ -49,7 +49,7 @@ end
49
49
  describe "Core::Text::Formatted::Arranger#next_string" do
50
50
  before(:each) do
51
51
  create_pdf
52
- @arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
52
+ @arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
53
53
  array = [{ :text => "hello " },
54
54
  { :text => "world how ", :styles => [:bold] },
55
55
  { :text => "are", :styles => [:bold, :italic] },
@@ -75,7 +75,7 @@ describe "Core::Text::Formatted::Arranger#next_string" do
75
75
  end
76
76
  it "should populate current_format_state array" do
77
77
  create_pdf
78
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
78
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
79
79
  array = [{ :text => "hello " },
80
80
  { :text => "world how ", :styles => [:bold] },
81
81
  { :text => "are", :styles => [:bold, :italic] },
@@ -101,7 +101,7 @@ end
101
101
  describe "Core::Text::Formatted::Arranger#retrieve_fragment" do
102
102
  it "should raise_error an error if called before finalize_line was called" do
103
103
  create_pdf
104
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
104
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
105
105
  array = [{ :text => "hello " },
106
106
  { :text => "world how ", :styles => [:bold] },
107
107
  { :text => "are", :styles => [:bold, :italic] },
@@ -116,7 +116,7 @@ describe "Core::Text::Formatted::Arranger#retrieve_fragment" do
116
116
  it "should return the consumed fragments in order of consumption" +
117
117
  " and update" do
118
118
  create_pdf
119
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
119
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
120
120
  array = [{ :text => "hello " },
121
121
  { :text => "world how ", :styles => [:bold] },
122
122
  { :text => "are", :styles => [:bold, :italic] },
@@ -132,7 +132,7 @@ describe "Core::Text::Formatted::Arranger#retrieve_fragment" do
132
132
  end
133
133
  it "should never return a fragment whose text is an empty string" do
134
134
  create_pdf
135
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
135
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
136
136
  array = [{ :text => "hello\nworld\n\n\nhow are you?" },
137
137
  { :text => "\n" },
138
138
  { :text => "\n" },
@@ -152,7 +152,7 @@ describe "Core::Text::Formatted::Arranger#retrieve_fragment" do
152
152
  end
153
153
  it "should not alter the current font style" do
154
154
  create_pdf
155
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
155
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
156
156
  array = [{ :text => "hello " },
157
157
  { :text => "world how ", :styles => [:bold] },
158
158
  { :text => "are", :styles => [:bold, :italic] },
@@ -170,7 +170,7 @@ describe "Core::Text::Formatted::Arranger#update_last_string" do
170
170
  it "should update the last retrieved string with what actually fit on" +
171
171
  "the line and the list of unconsumed with what did not" do
172
172
  create_pdf
173
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
173
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
174
174
  array = [{ :text => "hello " },
175
175
  { :text => "world how ", :styles => [:bold] },
176
176
  { :text => "are", :styles => [:bold, :italic] },
@@ -186,7 +186,7 @@ describe "Core::Text::Formatted::Arranger#update_last_string" do
186
186
  end
187
187
  it "should set the format state to the previously processed fragment" do
188
188
  create_pdf
189
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
189
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
190
190
  array = [{ :text => "hello " },
191
191
  { :text => "world how ", :styles => [:bold] },
192
192
  { :text => "are", :styles => [:bold, :italic] },
@@ -201,7 +201,7 @@ describe "Core::Text::Formatted::Arranger#update_last_string" do
201
201
  context "when the entire string was used" do
202
202
  it "should not push empty string onto unconsumed" do
203
203
  create_pdf
204
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
204
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
205
205
  array = [{ :text => "hello " },
206
206
  { :text => "world how ", :styles => [:bold] },
207
207
  { :text => "are", :styles => [:bold, :italic] },
@@ -217,7 +217,7 @@ end
217
217
  describe "Core::Text::Formatted::Arranger#space_count" do
218
218
  before(:each) do
219
219
  create_pdf
220
- @arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
220
+ @arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
221
221
  array = [{ :text => "hello " },
222
222
  { :text => "world how ", :styles => [:bold] },
223
223
  { :text => "are", :styles => [:bold, :italic] },
@@ -240,7 +240,7 @@ describe "Core::Text::Formatted::Arranger#finalize_line" do
240
240
  it "should make it so that all trailing white space fragments " +
241
241
  "exclude trailing white space" do
242
242
  create_pdf
243
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
243
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
244
244
  array = [{ :text => "hello " },
245
245
  { :text => "world how ", :styles => [:bold] },
246
246
  { :text => " ", :styles => [:bold, :italic] }]
@@ -264,7 +264,7 @@ end
264
264
  describe "Core::Text::Formatted::Arranger#line_width" do
265
265
  before(:each) do
266
266
  create_pdf
267
- @arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
267
+ @arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
268
268
  array = [{ :text => "hello " },
269
269
  { :text => "world", :styles => [:bold] }]
270
270
  @arranger.format_array = array
@@ -285,7 +285,7 @@ end
285
285
  describe "Core::Text::Formatted::Arranger#line_width with character_spacing > 0" do
286
286
  it "should return a width greater than a line without a character_spacing" do
287
287
  create_pdf
288
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
288
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
289
289
 
290
290
  array = [{ :text => "hello " },
291
291
  { :text => "world", :styles => [:bold] }]
@@ -311,7 +311,7 @@ end
311
311
  describe "Core::Text::Formatted::Arranger#line" do
312
312
  before(:each) do
313
313
  create_pdf
314
- @arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
314
+ @arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
315
315
  array = [{ :text => "hello " },
316
316
  { :text => "world", :styles => [:bold] }]
317
317
  @arranger.format_array = array
@@ -332,7 +332,7 @@ end
332
332
  describe "Core::Text::Formatted::Arranger#unconsumed" do
333
333
  it "should return the original array if nothing was consumed" do
334
334
  create_pdf
335
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
335
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
336
336
  array = [{ :text => "hello " },
337
337
  { :text => "world how ", :styles => [:bold] },
338
338
  { :text => "are", :styles => [:bold, :italic] },
@@ -342,7 +342,7 @@ describe "Core::Text::Formatted::Arranger#unconsumed" do
342
342
  end
343
343
  it "should return an empty array if everything was consumed" do
344
344
  create_pdf
345
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
345
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
346
346
  array = [{ :text => "hello " },
347
347
  { :text => "world how ", :styles => [:bold] },
348
348
  { :text => "are", :styles => [:bold, :italic] },
@@ -357,7 +357,7 @@ end
357
357
  describe "Core::Text::Formatted::Arranger#finished" do
358
358
  it "should be_false if anything was not printed" do
359
359
  create_pdf
360
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
360
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
361
361
  array = [{ :text => "hello " },
362
362
  { :text => "world how ", :styles => [:bold] },
363
363
  { :text => "are", :styles => [:bold, :italic] },
@@ -370,7 +370,7 @@ describe "Core::Text::Formatted::Arranger#finished" do
370
370
  end
371
371
  it "should be_false if everything was printed" do
372
372
  create_pdf
373
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
373
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
374
374
  array = [{ :text => "hello " },
375
375
  { :text => "world how ", :styles => [:bold] },
376
376
  { :text => "are", :styles => [:bold, :italic] },
@@ -385,7 +385,7 @@ end
385
385
  describe "Core::Text::Formatted::Arranger.max_line_height" do
386
386
  it "should be the height of the maximum consumed fragment" do
387
387
  create_pdf
388
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
388
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
389
389
  array = [{ :text => "hello " },
390
390
  { :text => "world how ", :styles => [:bold] },
391
391
  { :text => "are", :styles => [:bold, :italic],
@@ -402,7 +402,7 @@ end
402
402
  describe "Core::Text::Formatted::Arranger#repack_unretrieved" do
403
403
  it "should restore part of the original string" do
404
404
  create_pdf
405
- arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
405
+ arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
406
406
  array = [{ :text => "hello " },
407
407
  { :text => "world how ", :styles => [:bold] },
408
408
  { :text => "are", :styles => [:bold, :italic] },
@@ -18,22 +18,19 @@ describe "Text::Formatted::Box wrapping" do
18
18
  text_box.text.should == "Hello\nWorld2"
19
19
  end
20
20
 
21
- it "should_not raise_error Encoding::CompatibilityError when keeping a TTF and an " +
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
- }
28
-
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"))
33
- lambda {
34
- text_box.render
35
- }.should_not raise_error(Encoding::CompatibilityError)
36
- end
23
+ file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf"
24
+ @pdf.font_families["Kai"] = {
25
+ :normal => { :file => file, :font => "Kai" }
26
+ }
27
+
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"))
32
+
33
+ text_box.render
37
34
  end
38
35
 
39
36
  it "should wrap between two fragments when the preceding fragment ends with white space" do
@@ -84,26 +81,17 @@ describe "Text::Formatted::Box wrapping" do
84
81
  }.should_not raise_error
85
82
  text_box.text.should == "Noua Delineatio Geographica\ngeneralis | Apostolicarum\nperegrinationum | S FRANCISCI\nXAUERII | Indiarum & Iaponi\346\nApostoli"
86
83
  end
87
-
84
+
88
85
  describe "Unicode" do
89
86
  before do
90
- if RUBY_VERSION < '1.9'
91
- @reset_value = $KCODE
92
- $KCODE='u'
93
- else
94
- @reset_value = [Encoding.default_external, Encoding.default_internal]
95
- Encoding.default_external = Encoding::UTF_8
96
- Encoding.default_internal = Encoding::UTF_8
97
- end
87
+ @reset_value = [Encoding.default_external, Encoding.default_internal]
88
+ Encoding.default_external = Encoding::UTF_8
89
+ Encoding.default_internal = Encoding::UTF_8
98
90
  end
99
-
91
+
100
92
  after do
101
- if RUBY_VERSION < '1.9'
102
- $KCODE=@reset_value
103
- else
104
- Encoding.default_external = @reset_value[0]
105
- Encoding.default_internal = @reset_value[1]
106
- end
93
+ Encoding.default_external = @reset_value[0]
94
+ Encoding.default_internal = @reset_value[1]
107
95
  end
108
96
 
109
97
  it "should properly handle empty slices using Unicode encoding" do
@@ -397,7 +385,8 @@ describe "Text::Formatted::Box#render" do
397
385
  { :text => "callback now",
398
386
  :callback => [behind, in_front] }]
399
387
  text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
400
- lambda { text_box.render }.should_not raise_error(NoMethodError)
388
+
389
+ text_box.render # trigger callbacks
401
390
  end
402
391
  it "should be able to set the font" do
403
392
  create_pdf
@@ -512,6 +501,16 @@ describe "Text::Formatted::Box#render" do
512
501
  text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
513
502
  text_box.render
514
503
  end
504
+ it "should be able to add local actions" do
505
+ create_pdf
506
+ @pdf.expects(:link_annotation).with(kind_of(Array), :Border => [0,0,0],
507
+ :A => { :Type => :Action, :S => :Launch, :F => "../example.pdf", :NewWindow => true })
508
+ array = [{ :text => "click " },
509
+ { :text => "here", :local => "../example.pdf" },
510
+ { :text => " to open a local file" }]
511
+ text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf)
512
+ text_box.render
513
+ end
515
514
  it "should be able to set font size" do
516
515
  create_pdf
517
516
  array = [{ :text => "this contains " },
@@ -75,7 +75,7 @@ describe "Text::Formatted::Fragment#word_spacing=" do
75
75
  @fragment.ascender = 17
76
76
  @fragment.word_spacing = 10
77
77
  end
78
-
78
+
79
79
  it "should account for word_spacing in #width" do
80
80
  @fragment.width.should == 110
81
81
  end
@@ -122,7 +122,7 @@ describe "Text::Formatted::Fragment" do
122
122
  @fragment.descender = 7
123
123
  @fragment.ascender = 17
124
124
  end
125
-
125
+
126
126
  describe "#width" do
127
127
  it "should return the width" do
128
128
  @fragment.width.should == 100
@@ -121,7 +121,7 @@ describe "When drawing a curve" do
121
121
  curve = PDF::Inspector::Graphics::Curve.analyze(@pdf.render)
122
122
  curve.coords.should == [100.0, 100.0, 20.0, 90.0, 90.0, 75.0, 50.0, 50.0]
123
123
  end
124
-
124
+
125
125
 
126
126
  end
127
127
 
@@ -141,19 +141,19 @@ describe "When drawing a rounded rectangle" do
141
141
  line_points.zip(curves).flatten.each_slice(2) {|p| @all_coords << p }
142
142
  @all_coords.unshift @original_point
143
143
  end
144
-
144
+
145
145
  it "should draw a rectangle by connecting lines with rounded bezier curves" do
146
- @all_coords.should == [[60.0, 550.0],[90.0, 550.0], [95.523, 550.0], [100.0, 545.523], [100.0, 540.0],
147
- [100.0, 460.0], [100.0, 454.477], [95.523, 450.0], [90.0, 450.0],
148
- [60.0, 450.0], [54.477, 450.0], [50.0, 454.477], [50.0, 460.0],
146
+ @all_coords.should == [[60.0, 550.0],[90.0, 550.0], [95.523, 550.0], [100.0, 545.523], [100.0, 540.0],
147
+ [100.0, 460.0], [100.0, 454.477], [95.523, 450.0], [90.0, 450.0],
148
+ [60.0, 450.0], [54.477, 450.0], [50.0, 454.477], [50.0, 460.0],
149
149
  [50.0, 540.0], [50.0, 545.523], [54.477, 550.0], [60.0, 550.0]]
150
150
  end
151
-
151
+
152
152
  it "should start and end with the same point" do
153
153
  @original_point.should == @all_coords.last
154
154
  end
155
-
156
-
155
+
156
+
157
157
  end
158
158
 
159
159
  describe "When drawing an ellipse" do
@@ -162,27 +162,27 @@ describe "When drawing an ellipse" do
162
162
  @pdf.ellipse [100,100], 25, 50
163
163
  @curve = PDF::Inspector::Graphics::Curve.analyze(@pdf.render)
164
164
  end
165
-
165
+
166
166
  it "should use a Bézier approximation" do
167
- @curve.coords.should ==
167
+ @curve.coords.should ==
168
168
  [125.0, 100.0,
169
169
 
170
170
  125.0, 127.614,
171
171
  113.807, 150,
172
172
  100.0, 150.0,
173
-
173
+
174
174
  86.193, 150.0,
175
175
  75.0, 127.614,
176
176
  75.0, 100.0,
177
-
177
+
178
178
  75.0, 72.386,
179
179
  86.193, 50.0,
180
180
  100.0, 50.0,
181
-
181
+
182
182
  113.807, 50.0,
183
183
  125.0, 72.386,
184
184
  125.0, 100.0,
185
-
185
+
186
186
  100.0, 100.0]
187
187
  end
188
188
 
@@ -268,7 +268,7 @@ describe "When setting colors" do
268
268
  colors.fill_color.should == [0.8,1.0,0.0]
269
269
  colors.stroke_color.should == [1.0,0.0,0.8]
270
270
  end
271
-
271
+
272
272
  it "should set the color space when setting colors on new pages to please fussy readers" do
273
273
  @pdf.stroke_color "000000"
274
274
  @pdf.stroke { @pdf.rectangle([10, 10], 10, 10) }
@@ -381,80 +381,80 @@ end
381
381
 
382
382
  describe "When using graphics states" do
383
383
  before(:each) { create_pdf }
384
-
384
+
385
385
  it "should add the right content on save_graphics_state" do
386
386
  @pdf.expects(:add_content).with('q')
387
-
387
+
388
388
  @pdf.save_graphics_state
389
389
  end
390
-
390
+
391
391
  it "should add the right content on restore_graphics_state" do
392
392
  @pdf.expects(:add_content).with('Q')
393
-
393
+
394
394
  @pdf.restore_graphics_state
395
395
  end
396
-
396
+
397
397
  it "should save and restore when save_graphics_state is used with a block" do
398
398
  state = sequence "state"
399
399
  @pdf.expects(:add_content).with('q').in_sequence(state)
400
400
  @pdf.expects(:foo).in_sequence(state)
401
401
  @pdf.expects(:add_content).with('Q').in_sequence(state)
402
-
402
+
403
403
  @pdf.save_graphics_state do
404
404
  @pdf.foo
405
405
  end
406
406
  end
407
-
407
+
408
408
  it "should add the previous color space when restoring to a graphic state with different color space" do
409
409
  @pdf.stroke_color '000000'
410
410
  @pdf.save_graphics_state
411
411
  @pdf.stroke_color 0, 0, 0, 0
412
- @pdf.restore_graphics_state
412
+ @pdf.restore_graphics_state
413
413
  @pdf.stroke_color 0, 0, 100, 0
414
414
  @pdf.graphic_state.color_space.should == {:stroke=>:DeviceCMYK}
415
415
  colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render)
416
416
  colors.color_space.should == :DeviceCMYK
417
417
  colors.stroke_color_space_count[:DeviceCMYK].should == 2
418
418
  end
419
-
419
+
420
420
  it "should use the correct dash setting after restoring and starting new page" do
421
421
  @pdf.dash 5
422
422
  @pdf.save_graphics_state
423
423
  @pdf.dash 10
424
424
  @pdf.graphic_state.dash[:dash].should == 10
425
- @pdf.restore_graphics_state
425
+ @pdf.restore_graphics_state
426
426
  @pdf.start_new_page
427
427
  @pdf.graphic_state.dash[:dash].should == 5
428
428
  end
429
-
429
+
430
430
  it "the current graphic state should keep track of previous unchanged settings" do
431
431
  @pdf.stroke_color '000000'
432
432
  @pdf.save_graphics_state
433
433
  @pdf.dash 5
434
434
  @pdf.save_graphics_state
435
435
  @pdf.cap_style :round
436
- @pdf.save_graphics_state
436
+ @pdf.save_graphics_state
437
437
  @pdf.fill_color 0, 0, 100, 0
438
438
  @pdf.save_graphics_state
439
-
440
- @pdf.graphic_state.stroke_color.should == "000000"
439
+
440
+ @pdf.graphic_state.stroke_color.should == "000000"
441
441
  @pdf.graphic_state.join_style.should == :miter
442
- @pdf.graphic_state.fill_color.should == [0, 0, 100, 0]
443
- @pdf.graphic_state.cap_style.should == :round
444
- @pdf.graphic_state.color_space.should == {:fill=>:DeviceCMYK, :stroke=>:DeviceRGB}
442
+ @pdf.graphic_state.fill_color.should == [0, 0, 100, 0]
443
+ @pdf.graphic_state.cap_style.should == :round
444
+ @pdf.graphic_state.color_space.should == {:fill=>:DeviceCMYK, :stroke=>:DeviceRGB}
445
445
  @pdf.graphic_state.dash.should == {:space=>5, :phase=>0, :dash=>5}
446
446
  @pdf.graphic_state.line_width.should == 1
447
447
  end
448
-
449
-
450
-
448
+
449
+
450
+
451
451
  it "should not add extra graphic space closings when rendering multiple times" do
452
452
  @pdf.render
453
453
  state = PDF::Inspector::Graphics::State.analyze(@pdf.render)
454
454
  state.save_graphics_state_count.should == 1
455
455
  state.restore_graphics_state_count.should == 1
456
456
  end
457
-
457
+
458
458
  it "should add extra graphic state enclosings when content is added on multiple renderings" do
459
459
  @pdf.render
460
460
  @pdf.text "Adding a bit more content"
@@ -462,7 +462,7 @@ describe "When using graphics states" do
462
462
  state.save_graphics_state_count.should == 2
463
463
  state.restore_graphics_state_count.should == 2
464
464
  end
465
-
465
+
466
466
  it "adds extra graphic state enclosings when new settings are applied on multiple renderings" do
467
467
  @pdf.render
468
468
  @pdf.stroke_color 0, 0, 0, 0
@@ -470,13 +470,31 @@ describe "When using graphics states" do
470
470
  state.save_graphics_state_count.should == 2
471
471
  state.restore_graphics_state_count.should == 2
472
472
  end
473
-
474
-
473
+
474
+
475
475
  it "should raise_error error if closing an empty graphic stack" do
476
476
  lambda {
477
477
  @pdf.render
478
478
  @pdf.restore_graphics_state
479
- }.should raise_error(Prawn::Errors::EmptyGraphicStateStack)
479
+ }.should raise_error(PDF::Core::Errors::EmptyGraphicStateStack)
480
+ end
481
+
482
+ it "should copy mutable attributes when passing a previous_state to the initializer" do
483
+ new_state = PDF::Core::GraphicState.new(@pdf.graphic_state)
484
+
485
+ [:color_space, :dash, :fill_color, :stroke_color].each do |attr|
486
+ new_state.send(attr).should == @pdf.graphic_state.send(attr)
487
+ new_state.send(attr).should_not equal(@pdf.graphic_state.send(attr))
488
+ end
489
+ end
490
+
491
+ it "should copy mutable attributes when duping" do
492
+ new_state = @pdf.graphic_state.dup
493
+
494
+ [:color_space, :dash, :fill_color, :stroke_color].each do |attr|
495
+ new_state.send(attr).should == @pdf.graphic_state.send(attr)
496
+ new_state.send(attr).should_not equal(@pdf.graphic_state.send(attr))
497
+ end
480
498
  end
481
499
  end
482
500
 
@@ -485,19 +503,19 @@ describe "When using transformation matrix" do
485
503
 
486
504
  # Note: The (approximate) number of significant decimal digits of precision in fractional
487
505
  # part is 5 (PDF Reference, Third Edition, p. 706)
488
-
506
+
489
507
  it "should send the right content on transformation_matrix" do
490
508
  @pdf.expects(:add_content).with('1.00000 0.00000 0.12346 -1.00000 5.50000 20.00000 cm')
491
509
  @pdf.transformation_matrix 1, 0, 0.123456789, -1.0, 5.5, 20
492
510
  end
493
-
511
+
494
512
  it "should use fixed digits with very small number" do
495
513
  values = Array.new(6, 0.000000000001)
496
514
  string = Array.new(6, "0.00000").join " "
497
515
  @pdf.expects(:add_content).with("#{string} cm")
498
516
  @pdf.transformation_matrix *values
499
517
  end
500
-
518
+
501
519
  it "should be received by the inspector" do
502
520
  @pdf.transformation_matrix 1, 0, 0, -1, 5.5, 20
503
521
  matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render)
@@ -508,7 +526,7 @@ describe "When using transformation matrix" do
508
526
  values = Array.new(6, 0.000000000001)
509
527
  string = Array.new(6, "0.00000").join " "
510
528
  process = sequence "process"
511
-
529
+
512
530
  @pdf.expects(:save_graphics_state).with().in_sequence(process)
513
531
  @pdf.expects(:add_content).with("#{string} cm").in_sequence(process)
514
532
  @pdf.expects(:do_something).with().in_sequence(process)
@@ -517,7 +535,7 @@ describe "When using transformation matrix" do
517
535
  @pdf.do_something
518
536
  end
519
537
  end
520
-
538
+
521
539
  end
522
540
 
523
541
  describe "When using transformations shortcuts" do