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