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