prawn 1.1.0 → 2.4.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 (309) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/.yardopts +1 -0
  4. data/GPLv2 +20 -21
  5. data/Gemfile +3 -9
  6. data/Rakefile +9 -40
  7. data/lib/prawn/document/bounding_box.rb +54 -40
  8. data/lib/prawn/document/column_box.rb +8 -10
  9. data/lib/prawn/document/internals.rb +39 -146
  10. data/lib/prawn/document/span.rb +23 -17
  11. data/lib/prawn/document.rb +217 -182
  12. data/lib/prawn/encoding.rb +69 -101
  13. data/lib/prawn/errors.rb +47 -43
  14. data/lib/prawn/font.rb +124 -104
  15. data/lib/prawn/font_metric_cache.rb +23 -21
  16. data/lib/prawn/fonts/afm.rb +292 -0
  17. data/lib/prawn/{font → fonts}/dfont.rb +5 -12
  18. data/lib/prawn/fonts/otf.rb +11 -0
  19. data/lib/prawn/fonts/ttc.rb +36 -0
  20. data/lib/prawn/{font → fonts}/ttf.rb +140 -88
  21. data/lib/prawn/graphics/blend_mode.rb +65 -0
  22. data/lib/prawn/graphics/cap_style.rb +5 -5
  23. data/lib/prawn/graphics/color.rb +46 -44
  24. data/lib/prawn/graphics/dash.rb +27 -11
  25. data/lib/prawn/graphics/join_style.rb +11 -6
  26. data/lib/prawn/graphics/patterns.rb +220 -78
  27. data/lib/prawn/graphics/transformation.rb +20 -12
  28. data/lib/prawn/graphics/transparency.rb +20 -18
  29. data/lib/prawn/graphics.rb +153 -115
  30. data/lib/prawn/grid.rb +93 -50
  31. data/lib/prawn/image_handler.rb +4 -4
  32. data/lib/prawn/images/image.rb +3 -2
  33. data/lib/prawn/images/jpg.rb +31 -24
  34. data/lib/prawn/images/png.rb +101 -68
  35. data/lib/prawn/images.rb +64 -56
  36. data/lib/prawn/measurement_extensions.rb +10 -9
  37. data/lib/prawn/measurements.rb +20 -23
  38. data/lib/prawn/outline.rb +96 -75
  39. data/lib/prawn/repeater.rb +16 -16
  40. data/lib/prawn/security/arcfour.rb +2 -2
  41. data/lib/prawn/security.rb +100 -85
  42. data/lib/prawn/soft_mask.rb +37 -38
  43. data/lib/prawn/stamp.rb +28 -13
  44. data/lib/prawn/text/box.rb +24 -29
  45. data/lib/prawn/text/formatted/arranger.rb +108 -63
  46. data/lib/prawn/text/formatted/box.rb +187 -124
  47. data/lib/prawn/text/formatted/fragment.rb +24 -20
  48. data/lib/prawn/text/formatted/line_wrap.rb +133 -73
  49. data/lib/prawn/text/formatted/parser.rb +147 -127
  50. data/lib/prawn/text/formatted/wrap.rb +48 -35
  51. data/lib/prawn/text/formatted.rb +5 -5
  52. data/lib/prawn/text.rb +103 -68
  53. data/lib/prawn/transformation_stack.rb +44 -0
  54. data/lib/prawn/utilities.rb +10 -22
  55. data/lib/prawn/version.rb +5 -0
  56. data/lib/prawn/view.rb +101 -0
  57. data/lib/prawn.rb +39 -54
  58. data/manual/basic_concepts/adding_pages.rb +6 -7
  59. data/manual/basic_concepts/basic_concepts.rb +34 -25
  60. data/manual/basic_concepts/creation.rb +10 -11
  61. data/manual/basic_concepts/cursor.rb +4 -5
  62. data/manual/basic_concepts/measurement.rb +8 -9
  63. data/manual/basic_concepts/origin.rb +5 -6
  64. data/manual/basic_concepts/other_cursor_helpers.rb +11 -12
  65. data/manual/basic_concepts/view.rb +48 -0
  66. data/manual/bounding_box/bounding_box.rb +30 -28
  67. data/manual/bounding_box/bounds.rb +12 -13
  68. data/manual/bounding_box/canvas.rb +7 -8
  69. data/manual/bounding_box/creation.rb +6 -7
  70. data/manual/bounding_box/indentation.rb +14 -15
  71. data/manual/bounding_box/nesting.rb +25 -18
  72. data/manual/bounding_box/russian_boxes.rb +18 -18
  73. data/manual/bounding_box/stretchy.rb +12 -14
  74. data/manual/contents.rb +28 -22
  75. data/manual/cover.rb +33 -32
  76. data/manual/document_and_page_options/background.rb +15 -13
  77. data/manual/document_and_page_options/document_and_page_options.rb +24 -22
  78. data/manual/document_and_page_options/metadata.rb +20 -18
  79. data/manual/document_and_page_options/page_margins.rb +18 -20
  80. data/manual/document_and_page_options/page_size.rb +13 -13
  81. data/manual/document_and_page_options/print_scaling.rb +18 -15
  82. data/manual/example_helper.rb +5 -4
  83. data/manual/graphics/blend_mode.rb +52 -0
  84. data/manual/graphics/circle_and_ellipse.rb +4 -5
  85. data/manual/graphics/color.rb +7 -9
  86. data/manual/graphics/common_lines.rb +7 -8
  87. data/manual/graphics/fill_and_stroke.rb +5 -6
  88. data/manual/graphics/fill_rules.rb +12 -11
  89. data/manual/graphics/gradients.rb +27 -21
  90. data/manual/graphics/graphics.rb +46 -40
  91. data/manual/graphics/helper.rb +19 -9
  92. data/manual/graphics/line_width.rb +8 -7
  93. data/manual/graphics/lines_and_curves.rb +8 -9
  94. data/manual/graphics/polygon.rb +6 -8
  95. data/manual/graphics/rectangle.rb +4 -5
  96. data/manual/graphics/rotate.rb +6 -9
  97. data/manual/graphics/scale.rb +14 -13
  98. data/manual/graphics/soft_masks.rb +4 -6
  99. data/manual/graphics/stroke_cap.rb +7 -8
  100. data/manual/graphics/stroke_dash.rb +15 -16
  101. data/manual/graphics/stroke_join.rb +6 -7
  102. data/manual/graphics/translate.rb +10 -10
  103. data/manual/graphics/transparency.rb +7 -9
  104. data/manual/how_to_read_this_manual.rb +8 -9
  105. data/manual/images/absolute_position.rb +6 -7
  106. data/manual/images/fit.rb +7 -8
  107. data/manual/images/horizontal.rb +10 -11
  108. data/manual/images/images.rb +28 -27
  109. data/manual/images/plain_image.rb +5 -6
  110. data/manual/images/scale.rb +9 -10
  111. data/manual/images/vertical.rb +16 -14
  112. data/manual/images/width_and_height.rb +10 -11
  113. data/manual/layout/boxes.rb +10 -11
  114. data/manual/layout/content.rb +9 -10
  115. data/manual/layout/layout.rb +17 -18
  116. data/manual/layout/simple_grid.rb +6 -7
  117. data/manual/outline/add_subsection_to.rb +20 -21
  118. data/manual/outline/insert_section_after.rb +15 -16
  119. data/manual/outline/outline.rb +22 -21
  120. data/manual/outline/sections_and_pages.rb +17 -18
  121. data/manual/repeatable_content/alternate_page_numbering.rb +36 -0
  122. data/manual/repeatable_content/page_numbering.rb +17 -16
  123. data/manual/repeatable_content/repeatable_content.rb +27 -23
  124. data/manual/repeatable_content/repeater.rb +15 -16
  125. data/manual/repeatable_content/stamp.rb +14 -15
  126. data/manual/security/encryption.rb +8 -11
  127. data/manual/security/permissions.rb +20 -15
  128. data/manual/security/security.rb +18 -18
  129. data/manual/table.rb +16 -0
  130. data/manual/text/alignment.rb +16 -17
  131. data/manual/text/color.rb +12 -12
  132. data/manual/text/column_box.rb +9 -11
  133. data/manual/text/fallback_fonts.rb +25 -21
  134. data/manual/text/font.rb +11 -12
  135. data/manual/text/font_size.rb +13 -14
  136. data/manual/text/font_style.rb +10 -8
  137. data/manual/text/formatted_callbacks.rb +33 -23
  138. data/manual/text/formatted_text.rb +36 -25
  139. data/manual/text/free_flowing_text.rb +22 -23
  140. data/manual/text/inline.rb +18 -19
  141. data/manual/text/kerning_and_character_spacing.rb +14 -15
  142. data/manual/text/leading.rb +7 -8
  143. data/manual/text/line_wrapping.rb +37 -18
  144. data/manual/text/paragraph_indentation.rb +15 -10
  145. data/manual/text/positioned_text.rb +16 -17
  146. data/manual/text/registering_families.rb +27 -24
  147. data/manual/text/rendering_and_color.rb +9 -10
  148. data/manual/text/right_to_left_text.rb +30 -19
  149. data/manual/text/rotation.rb +33 -24
  150. data/manual/text/single_usage.rb +8 -9
  151. data/manual/text/text.rb +56 -54
  152. data/manual/text/text_box_excess.rb +20 -17
  153. data/manual/text/text_box_extensions.rb +18 -15
  154. data/manual/text/text_box_overflow.rb +24 -17
  155. data/manual/text/utf8.rb +12 -13
  156. data/manual/text/win_ansi_charset.rb +28 -25
  157. data/prawn.gemspec +45 -50
  158. data/spec/extensions/encoding_helpers.rb +3 -3
  159. data/spec/prawn/document/bounding_box_spec.rb +550 -0
  160. data/spec/prawn/document/column_box_spec.rb +75 -0
  161. data/spec/prawn/document/security_spec.rb +176 -0
  162. data/spec/prawn/document_annotations_spec.rb +76 -0
  163. data/spec/prawn/document_destinations_spec.rb +15 -0
  164. data/spec/prawn/document_grid_spec.rb +99 -0
  165. data/spec/prawn/document_reference_spec.rb +27 -0
  166. data/spec/prawn/document_span_spec.rb +44 -0
  167. data/spec/prawn/document_spec.rb +805 -0
  168. data/spec/prawn/font_metric_cache_spec.rb +54 -0
  169. data/spec/prawn/font_spec.rb +544 -0
  170. data/spec/prawn/graphics/blend_mode_spec.rb +63 -0
  171. data/spec/prawn/graphics/transparency_spec.rb +81 -0
  172. data/spec/prawn/graphics_spec.rb +872 -0
  173. data/spec/prawn/graphics_stroke_styles_spec.rb +229 -0
  174. data/spec/prawn/image_handler_spec.rb +53 -0
  175. data/spec/prawn/images/jpg_spec.rb +20 -0
  176. data/spec/prawn/images/png_spec.rb +283 -0
  177. data/spec/prawn/images_spec.rb +229 -0
  178. data/spec/prawn/measurements_extensions_spec.rb +24 -0
  179. data/spec/prawn/outline_spec.rb +512 -0
  180. data/spec/prawn/repeater_spec.rb +166 -0
  181. data/spec/prawn/soft_mask_spec.rb +74 -0
  182. data/spec/prawn/stamp_spec.rb +173 -0
  183. data/spec/prawn/text/box_spec.rb +1110 -0
  184. data/spec/prawn/text/formatted/arranger_spec.rb +466 -0
  185. data/spec/prawn/text/formatted/box_spec.rb +849 -0
  186. data/spec/prawn/text/formatted/fragment_spec.rb +343 -0
  187. data/spec/prawn/text/formatted/line_wrap_spec.rb +495 -0
  188. data/spec/prawn/text/formatted/parser_spec.rb +697 -0
  189. data/spec/prawn/text_draw_text_spec.rb +150 -0
  190. data/spec/prawn/text_rendering_mode_spec.rb +48 -0
  191. data/spec/prawn/text_spacing_spec.rb +95 -0
  192. data/spec/prawn/text_spec.rb +603 -0
  193. data/spec/prawn/text_with_inline_formatting_spec.rb +35 -0
  194. data/spec/prawn/transformation_stack_spec.rb +66 -0
  195. data/spec/prawn/view_spec.rb +63 -0
  196. data/spec/prawn_manual_spec.rb +35 -0
  197. data/spec/spec_helper.rb +19 -25
  198. data.tar.gz.sig +0 -0
  199. metadata +113 -276
  200. metadata.gz.sig +0 -0
  201. data/data/encodings/win_ansi.txt +0 -29
  202. data/data/images/16bit.alpha +0 -0
  203. data/data/images/16bit.color +0 -0
  204. data/data/images/16bit.png +0 -0
  205. data/data/images/arrow.png +0 -0
  206. data/data/images/arrow2.png +0 -0
  207. data/data/images/dice.alpha +0 -0
  208. data/data/images/dice.color +0 -0
  209. data/data/images/dice.png +0 -0
  210. data/data/images/dice_interlaced.png +0 -0
  211. data/data/images/fractal.jpg +0 -0
  212. data/data/images/indexed_color.dat +0 -0
  213. data/data/images/indexed_color.png +0 -0
  214. data/data/images/letterhead.jpg +0 -0
  215. data/data/images/license.md +0 -8
  216. data/data/images/page_white_text.alpha +0 -0
  217. data/data/images/page_white_text.color +0 -0
  218. data/data/images/page_white_text.png +0 -0
  219. data/data/images/pigs.jpg +0 -0
  220. data/data/images/prawn.png +0 -0
  221. data/data/images/ruport.png +0 -0
  222. data/data/images/ruport_data.dat +0 -0
  223. data/data/images/ruport_transparent.png +0 -0
  224. data/data/images/ruport_type0.png +0 -0
  225. data/data/images/stef.jpg +0 -0
  226. data/data/images/tru256.bmp +0 -0
  227. data/data/images/web-links.dat +0 -1
  228. data/data/images/web-links.png +0 -0
  229. data/data/pdfs/complex_template.pdf +0 -0
  230. data/data/pdfs/contains_ttf_font.pdf +0 -0
  231. data/data/pdfs/encrypted.pdf +0 -0
  232. data/data/pdfs/form.pdf +1 -819
  233. data/data/pdfs/hexagon.pdf +0 -61
  234. data/data/pdfs/indirect_reference.pdf +0 -86
  235. data/data/pdfs/multipage_template.pdf +0 -127
  236. data/data/pdfs/nested_pages.pdf +0 -118
  237. data/data/pdfs/page_without_mediabox.pdf +0 -193
  238. data/data/pdfs/resources_as_indirect_object.pdf +0 -83
  239. data/data/pdfs/two_hexagons.pdf +0 -90
  240. data/data/pdfs/version_1_6.pdf +0 -61
  241. data/data/shift_jis_text.txt +0 -1
  242. data/lib/prawn/document/graphics_state.rb +0 -73
  243. data/lib/prawn/font/afm.rb +0 -247
  244. data/lib/prawn/table/cell/image.rb +0 -69
  245. data/lib/prawn/table/cell/in_table.rb +0 -33
  246. data/lib/prawn/table/cell/span_dummy.rb +0 -93
  247. data/lib/prawn/table/cell/subtable.rb +0 -66
  248. data/lib/prawn/table/cell/text.rb +0 -154
  249. data/lib/prawn/table/cell.rb +0 -772
  250. data/lib/prawn/table/cells.rb +0 -255
  251. data/lib/prawn/table/column_width_calculator.rb +0 -182
  252. data/lib/prawn/table.rb +0 -644
  253. data/manual/table/basic_block.rb +0 -53
  254. data/manual/table/before_rendering_page.rb +0 -26
  255. data/manual/table/cell_border_lines.rb +0 -24
  256. data/manual/table/cell_borders_and_bg.rb +0 -31
  257. data/manual/table/cell_dimensions.rb +0 -30
  258. data/manual/table/cell_text.rb +0 -38
  259. data/manual/table/column_widths.rb +0 -30
  260. data/manual/table/content_and_subtables.rb +0 -39
  261. data/manual/table/creation.rb +0 -27
  262. data/manual/table/filtering.rb +0 -36
  263. data/manual/table/flow_and_header.rb +0 -17
  264. data/manual/table/image_cells.rb +0 -33
  265. data/manual/table/position.rb +0 -29
  266. data/manual/table/row_colors.rb +0 -20
  267. data/manual/table/span.rb +0 -30
  268. data/manual/table/style.rb +0 -22
  269. data/manual/table/table.rb +0 -52
  270. data/manual/table/width.rb +0 -27
  271. data/spec/acceptance/png.rb +0 -25
  272. data/spec/annotations_spec.rb +0 -74
  273. data/spec/bounding_box_spec.rb +0 -510
  274. data/spec/cell_spec.rb +0 -629
  275. data/spec/column_box_spec.rb +0 -65
  276. data/spec/destinations_spec.rb +0 -15
  277. data/spec/document_spec.rb +0 -730
  278. data/spec/extensions/mocha.rb +0 -46
  279. data/spec/font_metric_cache_spec.rb +0 -52
  280. data/spec/font_spec.rb +0 -449
  281. data/spec/formatted_text_arranger_spec.rb +0 -421
  282. data/spec/formatted_text_box_spec.rb +0 -639
  283. data/spec/formatted_text_fragment_spec.rb +0 -298
  284. data/spec/graphics_spec.rb +0 -669
  285. data/spec/grid_spec.rb +0 -96
  286. data/spec/image_handler_spec.rb +0 -54
  287. data/spec/images_spec.rb +0 -153
  288. data/spec/inline_formatted_text_parser_spec.rb +0 -564
  289. data/spec/jpg_spec.rb +0 -25
  290. data/spec/line_wrap_spec.rb +0 -344
  291. data/spec/measurement_units_spec.rb +0 -25
  292. data/spec/outline_spec.rb +0 -430
  293. data/spec/png_spec.rb +0 -237
  294. data/spec/reference_spec.rb +0 -25
  295. data/spec/repeater_spec.rb +0 -160
  296. data/spec/security_spec.rb +0 -158
  297. data/spec/soft_mask_spec.rb +0 -79
  298. data/spec/span_spec.rb +0 -44
  299. data/spec/stamp_spec.rb +0 -160
  300. data/spec/stroke_styles_spec.rb +0 -211
  301. data/spec/table/span_dummy_spec.rb +0 -17
  302. data/spec/table_spec.rb +0 -1527
  303. data/spec/text_at_spec.rb +0 -115
  304. data/spec/text_box_spec.rb +0 -1034
  305. data/spec/text_rendering_mode_spec.rb +0 -45
  306. data/spec/text_spacing_spec.rb +0 -93
  307. data/spec/text_spec.rb +0 -437
  308. data/spec/text_with_inline_formatting_spec.rb +0 -35
  309. data/spec/transparency_spec.rb +0 -91
@@ -1,510 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
-
5
- describe "A bounding box" do
6
-
7
- before(:each) do
8
- @x = 100
9
- @y = 125
10
- @width = 50
11
- @height = 75
12
- @box = Prawn::Document::BoundingBox.new(nil, nil, [@x,@y],
13
- :width => @width, :height => @height )
14
- end
15
-
16
- it "should have an anchor at (x, y - height)" do
17
- @box.anchor.should == [@x,@y-@height]
18
- end
19
-
20
- it "should have a left boundary of 0" do
21
- @box.left.should == 0
22
- end
23
-
24
- it "should have a right boundary equal to the width" do
25
- @box.right.should == @width
26
- end
27
-
28
- it "should have a top boundary of height" do
29
- @box.top.should == @height
30
- end
31
-
32
- it "should have a bottom boundary of 0" do
33
- @box.bottom.should == 0
34
- end
35
-
36
- it "should have a top-left of [0,height]" do
37
- @box.top_left.should == [0,@height]
38
- end
39
-
40
- it "should have a top-right of [width,height]" do
41
- @box.top_right.should == [@width,@height]
42
- end
43
-
44
- it "should have a bottom-left of [0,0]" do
45
- @box.bottom_left.should == [0,0]
46
- end
47
-
48
- it "should have a bottom-right of [width,0]" do
49
- @box.bottom_right.should == [@width,0]
50
- end
51
-
52
- it "should have an absolute left boundary of x" do
53
- @box.absolute_left.should == @x
54
- end
55
-
56
- it "should have an absolute right boundary of x + width" do
57
- @box.absolute_right.should == @x + @width
58
- end
59
-
60
- it "should have an absolute top boundary of y" do
61
- @box.absolute_top.should == @y
62
- end
63
-
64
- it "should have an absolute bottom boundary of y - height" do
65
- @box.absolute_bottom.should == @y - @height
66
- end
67
-
68
- it "should have an absolute bottom-left of [x,y-height]" do
69
- @box.absolute_bottom_left.should == [@x, @y - @height]
70
- end
71
-
72
- it "should have an absolute bottom-right of [x+width,y-height]" do
73
- @box.absolute_bottom_right.should == [@x + @width , @y - @height]
74
- end
75
-
76
- it "should have an absolute top-left of [x,y]" do
77
- @box.absolute_top_left.should == [@x, @y]
78
- end
79
-
80
- it "should have an absolute top-right of [x+width,y]" do
81
- @box.absolute_top_right.should == [@x + @width, @y]
82
- end
83
-
84
- it "should require width to be set" do
85
- lambda do
86
- Prawn::Document::BoundingBox.new(nil, nil, [100,100])
87
- end.should raise_error(ArgumentError)
88
- end
89
-
90
- it "should raise_error an ArgumentError if a block is not passed" do
91
- pdf = Prawn::Document.new
92
- lambda do
93
- pdf.bounding_box([0, 0], :width => 200)
94
- end.should raise_error(ArgumentError)
95
- end
96
-
97
- end
98
-
99
- describe "drawing bounding boxes" do
100
-
101
- before(:each) { create_pdf }
102
-
103
- it "should not stomp on the arguments to bounding_box" do
104
- pdf = Prawn::Document.new
105
- x = [100, 500]
106
- pdf.bounding_box x, :width => 100 do
107
- pdf.text "bork-bork-bork"
108
- end
109
- x.should == [100, 500]
110
- end
111
-
112
- it "should restore Document#bounds to the correct margin box on exit" do
113
- pdf = Prawn::Document.new(:margin => 200)
114
-
115
- # add a multi-page bounding box
116
- pdf.bounding_box([100, pdf.bounds.top], :width => 400) do
117
- pdf.text "The rain in spain falls mainly in the plains.\n" * 30
118
- end
119
-
120
- pdf.start_new_page(:margin => 0)
121
-
122
- x_min, y_min, x_max, y_max = pdf.page.dimensions
123
-
124
- pdf.bounds.absolute_top_left.should == [x_min, y_max]
125
- pdf.bounds.absolute_bottom_right.should == [x_max, y_min]
126
- end
127
-
128
- it "should restore the parent bounding box when calls are nested" do
129
- @pdf.bounding_box [100,500], :width => 300, :height => 300 do
130
-
131
- @pdf.bounds.absolute_top.should == 500 + @pdf.margin_box.absolute_bottom
132
- @pdf.bounds.absolute_left.should == 100 + @pdf.margin_box.absolute_left
133
-
134
- parent_box = @pdf.bounds
135
-
136
- @pdf.bounding_box [50,200], :width => 100, :height => 100 do
137
- @pdf.bounds.absolute_top.should == 200 + parent_box.absolute_bottom
138
- @pdf.bounds.absolute_left.should == 50 + parent_box.absolute_left
139
- end
140
-
141
- @pdf.bounds.absolute_top.should == 500 + @pdf.margin_box.absolute_bottom
142
- @pdf.bounds.absolute_left.should == 100 + @pdf.margin_box.absolute_left
143
-
144
- end
145
- end
146
-
147
- it "should calculate a height if none is specified" do
148
- @pdf.bounding_box([100, 500], :width => 100) do
149
- @pdf.text "The rain in Spain falls mainly on the plains."
150
- end
151
-
152
- @pdf.y.should be_within(0.001).of(458.384)
153
- end
154
-
155
- it "should keep track of the max height the box was stretched to" do
156
- box = @pdf.bounding_box(@pdf.bounds.top_left, :width => 100) do
157
- @pdf.move_down 100
158
- @pdf.move_up 15
159
- end
160
-
161
- box.height.should == 100
162
- end
163
-
164
- it "should advance the y-position by bbox.height by default" do
165
- orig_y = @pdf.y
166
- @pdf.bounding_box [0, @pdf.cursor], :width => @pdf.bounds.width,
167
- :height => 30 do
168
- @pdf.text "hello"
169
- end
170
- @pdf.y.should be_within(0.001).of(orig_y - 30)
171
- end
172
-
173
- it "should not advance y-position if passed :hold_position => true" do
174
- orig_y = @pdf.y
175
- @pdf.bounding_box [0, @pdf.cursor], :width => @pdf.bounds.width,
176
- :hold_position => true do
177
- @pdf.text "hello"
178
- end
179
- # y only advances by height of one line ("hello")
180
- @pdf.y.should be_within(0.001).of(orig_y - @pdf.height_of("hello"))
181
- end
182
-
183
- it "should not advance y-position of a stretchy bbox if it would stretch " +
184
- "the bbox further" do
185
- bottom = @pdf.y = @pdf.margin_box.absolute_bottom
186
- @pdf.bounding_box [0, @pdf.margin_box.top], :width => @pdf.bounds.width do
187
- @pdf.y = bottom
188
- @pdf.text "hello" # starts a new page
189
- end
190
- @pdf.page_count.should == 2
191
-
192
- # Restoring the position (to the absolute bottom) would stretch the bbox to
193
- # the bottom of the page, which we don't want. This should be equivalent to
194
- # a bbox with :hold_position => true, where we only advance by the amount
195
- # that was actually drawn.
196
- @pdf.y.should be_within(0.001).of(
197
- @pdf.margin_box.absolute_top - @pdf.height_of("hello")
198
- )
199
- end
200
-
201
- end
202
-
203
- describe "Indentation" do
204
- before(:each) { create_pdf }
205
-
206
- it "should temporarily shift the x coordinate and width" do
207
- @pdf.bounding_box([100,100], :width => 200) do
208
- @pdf.indent(20) do
209
- @pdf.bounds.absolute_left.should == 120
210
- @pdf.bounds.width.should == 180
211
- end
212
- end
213
- end
214
-
215
- it "should restore the x coordinate and width after block exits" do
216
- @pdf.bounding_box([100,100], :width => 200) do
217
- @pdf.indent(20) do
218
- # no-op
219
- end
220
- @pdf.bounds.absolute_left.should == 100
221
- @pdf.bounds.width.should == 200
222
- end
223
- end
224
-
225
- it "should restore the x coordinate and width on error" do
226
- @pdf.bounding_box([100,100], :width => 200) do
227
- begin
228
- @pdf.indent(20) { raise }
229
- rescue
230
- @pdf.bounds.absolute_left.should == 100
231
- @pdf.bounds.width.should == 200
232
- end
233
- end
234
- end
235
-
236
- it "should maintain left indentation across a page break" do
237
- original_left = @pdf.bounds.absolute_left
238
-
239
- @pdf.indent(20) do
240
- @pdf.bounds.absolute_left.should == original_left + 20
241
- @pdf.start_new_page
242
- @pdf.bounds.absolute_left.should == original_left + 20
243
- end
244
-
245
- @pdf.bounds.absolute_left.should == original_left
246
- end
247
-
248
- it "should maintain right indentation across a page break" do
249
- original_width = @pdf.bounds.width
250
-
251
- @pdf.indent(0, 20) do
252
- @pdf.bounds.width.should == original_width - 20
253
- @pdf.start_new_page
254
- @pdf.bounds.width.should == original_width - 20
255
- end
256
-
257
- @pdf.bounds.width.should == original_width
258
- end
259
-
260
- it "optionally allows adjustment of the right bound as well" do
261
- @pdf.bounding_box([100,100], :width => 200) do
262
- @pdf.indent(20, 30) do
263
- @pdf.bounds.absolute_left.should == 120
264
- @pdf.bounds.width.should == 150
265
- end
266
- @pdf.bounds.absolute_left.should == 100
267
- @pdf.bounds.width.should == 200
268
- end
269
- end
270
-
271
- describe "in a ColumnBox" do
272
- it "should subtract the given indentation from the available width" do
273
- @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width,
274
- :height => 200, :columns => 2, :spacer => 20) do
275
- width = @pdf.bounds.width
276
- @pdf.indent(20) do
277
- @pdf.bounds.width.should be_within(0.01).of(width - 20)
278
- end
279
- end
280
- end
281
-
282
- it "should subtract right padding from the available width" do
283
- @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width,
284
- :height => 200, :columns => 2, :spacer => 20) do
285
- width = @pdf.bounds.width
286
- @pdf.indent(20, 30) do
287
- @pdf.bounds.width.should be_within(0.01).of(width - 50)
288
- end
289
- end
290
- end
291
-
292
- it "should maintain the same left indentation across column breaks" do
293
- @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width, :columns => 3, :spacer => 15) do
294
- 3.times do |column|
295
- x = @pdf.bounds.left_side
296
- @pdf.indent(20) do
297
- @pdf.bounds.left_side.should == x+20
298
- end
299
- @pdf.bounds.move_past_bottom
300
- end
301
- end
302
- end
303
-
304
- it "should not change the right margin if only left indentation is requested" do
305
- @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width, :columns => 3, :spacer => 15) do
306
- 3.times do |column|
307
- x = @pdf.bounds.right_side
308
- @pdf.indent(20) do
309
- @pdf.bounds.right_side.should == x
310
- end
311
- @pdf.bounds.move_past_bottom
312
- end
313
- end
314
- end
315
-
316
- it "should maintain the same right indentation across columns" do
317
- @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width, :columns => 3, :spacer => 15) do
318
- 3.times do |column|
319
- x = @pdf.bounds.right_side
320
- @pdf.indent(20, 10) do
321
- @pdf.bounds.right_side.should == x-10
322
- end
323
- @pdf.bounds.move_past_bottom
324
- end
325
- end
326
- end
327
-
328
- it "should keep the right indentation after nesting indents" do
329
- @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width, :columns => 3, :spacer => 15) do
330
- 3.times do |column|
331
- # I am giving a right indent of 10...
332
- @pdf.indent(20, 10) do
333
- x = @pdf.bounds.right_side
334
- # ...and no right indent here...
335
- @pdf.indent(20) do
336
- # right indent is inherited from the parent!
337
- @pdf.bounds.right_side.should == x
338
- end
339
- end
340
- @pdf.bounds.move_past_bottom
341
- end
342
- end
343
- end
344
-
345
- it "should revert the right indentation if negative indent is given in nested indent" do
346
- @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width, :columns => 3, :spacer => 15) do
347
- 3.times do |column|
348
- x = @pdf.bounds.right_side
349
- @pdf.indent(20, 10) do
350
- # requesting a negative right-indent of equivalent size...
351
- @pdf.indent(20, -10) do
352
- # ...resets the right margin to that of the column!
353
- @pdf.bounds.right_side.should == x
354
- end
355
- end
356
- @pdf.bounds.move_past_bottom
357
- end
358
- end
359
- end
360
-
361
- it "should reduce the available column width by the sum of all nested indents" do
362
- @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width, :columns => 3, :spacer => 15) do
363
- 3.times do |column|
364
- w = @pdf.bounds.width
365
- @pdf.indent(20, 10) do
366
- @pdf.indent(20, 10) do
367
- @pdf.bounds.width.should == w - 60
368
- end
369
- end
370
- @pdf.bounds.move_past_bottom
371
- end
372
- end
373
- end
374
- end
375
- end
376
-
377
- describe "A canvas" do
378
- before(:each) { create_pdf }
379
-
380
- it "should use whatever the last set y position is" do
381
- @pdf.canvas do
382
- @pdf.bounding_box([100,500],:width => 200) { @pdf.move_down 50 }
383
- end
384
- @pdf.y.should == 450
385
- end
386
-
387
- it "should restore the original ypos after execution", :issue => 523 do
388
- doc = Prawn::Document.new(:skip_page_creation => true)
389
- doc.start_new_page
390
-
391
- original_ypos = doc.y
392
-
393
- doc.canvas {}
394
-
395
- doc.y.should == original_ypos
396
- end
397
-
398
- end
399
-
400
- describe "Deep-copying" do
401
- it "should create a new object that does not copy @document" do
402
- Prawn::Document.new do |pdf|
403
- orig = pdf.bounds
404
- copy = orig.deep_copy
405
-
406
- copy.should_not == pdf.bounds
407
- copy.document.should be_nil
408
- end
409
- end
410
-
411
- it "should deep-copy parent bounds" do
412
- Prawn::Document.new do |pdf|
413
- outside = pdf.bounds
414
- pdf.bounding_box [100, 100], :width => 100 do
415
- copy = pdf.bounds.deep_copy
416
-
417
- # the parent bounds should have the same parameters
418
- copy.parent.width.should == outside.width
419
- copy.parent.height.should == outside.height
420
-
421
- # but should not be the same object
422
- copy.parent.should_not == outside
423
- end
424
- end
425
- end
426
- end
427
-
428
- describe "Prawn::Document#reference_bounds" do
429
- before(:each) { create_pdf }
430
-
431
- it "should return self for non-stretchy bounds" do
432
- @pdf.bounding_box([0, @pdf.cursor], :width => 100, :height => 100) do
433
- @pdf.reference_bounds.should == @pdf.bounds
434
- end
435
- end
436
-
437
- it "should return the parent bounds if in a stretchy box" do
438
- @pdf.bounding_box([0, @pdf.cursor], :width => 100, :height => 100) do
439
- correct_bounds = @pdf.bounds
440
- @pdf.bounding_box([0, @pdf.cursor], :width => 100) do
441
- @pdf.reference_bounds.should == correct_bounds
442
- end
443
- end
444
- end
445
-
446
- it "should find the non-stretchy box through 2 levels" do
447
- @pdf.bounding_box([0, @pdf.cursor], :width => 100, :height => 100) do
448
- correct_bounds = @pdf.bounds
449
- @pdf.bounding_box([0, @pdf.cursor], :width => 100) do
450
- @pdf.bounding_box([0, @pdf.cursor], :width => 100) do
451
- @pdf.reference_bounds.should == correct_bounds
452
- end
453
- end
454
- end
455
- end
456
-
457
- it "should return the margin box if there's no explicit bbox" do
458
- @pdf.reference_bounds.should == @pdf.margin_box
459
-
460
- @pdf.bounding_box([0, @pdf.cursor], :width => 100) do
461
- @pdf.reference_bounds.should == @pdf.margin_box
462
- end
463
- end
464
-
465
- it "should return the canvas box if we're in a canvas" do
466
- @pdf.canvas do
467
- canvas_box = @pdf.bounds
468
-
469
- @pdf.reference_bounds.should == canvas_box
470
-
471
- @pdf.bounding_box([0, @pdf.cursor], :width => 100) do
472
- @pdf.reference_bounds.should == canvas_box
473
- end
474
- end
475
- end
476
-
477
- end
478
-
479
- describe "BoundingBox#move_past_bottom" do
480
- before(:each) { create_pdf }
481
-
482
- it "should ordinarily start a new page" do
483
- @pdf.bounds.move_past_bottom
484
- @pdf.text "Foo"
485
-
486
- pages = PDF::Inspector::Page.analyze(@pdf.render).pages
487
- pages.size.should == 2
488
- pages[0][:strings].should == []
489
- pages[1][:strings].should == ["Foo"]
490
- end
491
-
492
- it "should move to the top of the next page if it exists already" do
493
- # save away the y-position at the top of a page
494
- top_y = @pdf.y
495
-
496
- # create a blank page but go to the page before it
497
- @pdf.start_new_page
498
- @pdf.go_to_page 1
499
- @pdf.text "Foo"
500
-
501
- @pdf.bounds.move_past_bottom
502
- @pdf.y.should be_within(0.001).of(top_y)
503
- @pdf.text "Bar"
504
-
505
- pages = PDF::Inspector::Page.analyze(@pdf.render).pages
506
- pages.size.should == 2
507
- pages[0][:strings].should == ["Foo"]
508
- pages[1][:strings].should == ["Bar"]
509
- end
510
- end