prawn 2.4.0 → 2.5.0

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