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,343 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe Prawn::Text::Formatted::Fragment do
6
- let(:pdf) { create_pdf }
7
-
8
- describe 'Text::Formatted::Fragment' do
9
- let(:fragment) do
10
- format_state = {
11
- styles: %i[bold italic],
12
- color: nil,
13
- link: nil,
14
- anchor: nil,
15
- font: nil,
16
- size: nil
17
- }
18
- described_class.new(
19
- 'hello world',
20
- format_state,
21
- pdf
22
- ).tap do |fragment|
23
- fragment.width = 100
24
- fragment.left = 50
25
- fragment.baseline = 200
26
- fragment.line_height = 27
27
- fragment.descender = 7
28
- fragment.ascender = 17
29
- end
30
- end
31
-
32
- describe '#width' do
33
- it 'returns the width' do
34
- expect(fragment.width).to eq(100)
35
- end
36
- end
37
-
38
- describe '#styles' do
39
- it 'returns the styles array' do
40
- expect(fragment.styles).to eq(%i[bold italic])
41
- end
42
-
43
- it 'nevers return nil' do
44
- format_state = {
45
- styles: nil,
46
- color: nil,
47
- link: nil,
48
- anchor: nil,
49
- font: nil,
50
- size: nil
51
- }
52
- fragment = described_class.new(
53
- 'hello world',
54
- format_state,
55
- pdf
56
- )
57
- expect(fragment.styles).to eq([])
58
- end
59
- end
60
-
61
- describe '#line_height' do
62
- it 'returns the line_height' do
63
- expect(fragment.line_height).to eq(27)
64
- end
65
- end
66
-
67
- describe '#ascender' do
68
- it 'returns the ascender' do
69
- expect(fragment.ascender).to eq(17)
70
- end
71
- end
72
-
73
- describe '#descender' do
74
- it 'returns the descender' do
75
- expect(fragment.descender).to eq(7)
76
- end
77
- end
78
-
79
- describe '#y_offset' do
80
- it 'is zero' do
81
- expect(fragment.y_offset).to eq(0)
82
- end
83
- end
84
-
85
- describe '#bounding_box' do
86
- it 'returns the bounding box surrounding the fragment' do
87
- target_box = [50, 193, 150, 217]
88
- expect(fragment.bounding_box).to eq(target_box)
89
- end
90
- end
91
-
92
- describe '#absolute_bounding_box' do
93
- it 'returns the bounding box surrounding the fragment' \
94
- ' in absolute coordinates' do
95
- target_box = [50, 193, 150, 217]
96
- target_box[0] += pdf.bounds.absolute_left
97
- target_box[1] += pdf.bounds.absolute_bottom
98
- target_box[2] += pdf.bounds.absolute_left
99
- target_box[3] += pdf.bounds.absolute_bottom
100
-
101
- expect(fragment.absolute_bounding_box).to eq(target_box)
102
- end
103
- end
104
-
105
- describe '#underline_points' do
106
- it 'defines a line under the fragment' do
107
- y = 198.75
108
- target_points = [[50, y], [150, y]]
109
- expect(fragment.underline_points).to eq(target_points)
110
- end
111
- end
112
-
113
- describe '#strikethrough_points' do
114
- it 'defines a line through the fragment' do
115
- y = 200 + fragment.ascender * 0.3
116
- target_points = [[50, y], [150, y]]
117
- expect(fragment.strikethrough_points).to eq(target_points)
118
- end
119
- end
120
- end
121
-
122
- describe '#space_count' do
123
- it 'returns the number of spaces in the fragment' do
124
- format_state = {}
125
- fragment = described_class.new(
126
- 'hello world ',
127
- format_state,
128
- pdf
129
- )
130
- expect(fragment.space_count).to eq(2)
131
- end
132
-
133
- it 'excludes trailing spaces from the count when ' \
134
- ':exclude_trailing_white_space => true' do
135
- format_state = { exclude_trailing_white_space: true }
136
- fragment = described_class.new(
137
- 'hello world ',
138
- format_state,
139
- pdf
140
- )
141
- expect(fragment.space_count).to eq(1)
142
- end
143
- end
144
-
145
- describe '#include_trailing_white_space!' do
146
- it 'makes the fragment include trailing white space' do
147
- format_state = { exclude_trailing_white_space: true }
148
- fragment = described_class.new(
149
- 'hello world ',
150
- format_state,
151
- pdf
152
- )
153
- expect(fragment.space_count).to eq(1)
154
- fragment.include_trailing_white_space!
155
- expect(fragment.space_count).to eq(2)
156
- end
157
- end
158
-
159
- describe '#text' do
160
- it 'returns the fragment text' do
161
- format_state = {}
162
- fragment = described_class.new(
163
- 'hello world ',
164
- format_state,
165
- pdf
166
- )
167
- expect(fragment.text).to eq('hello world ')
168
- end
169
-
170
- it 'returns the fragment text without trailing spaces when ' \
171
- ':exclude_trailing_white_space => true' do
172
- format_state = { exclude_trailing_white_space: true }
173
- fragment = described_class.new(
174
- 'hello world ',
175
- format_state,
176
- pdf
177
- )
178
- expect(fragment.text).to eq('hello world')
179
- end
180
- end
181
-
182
- describe '#word_spacing=' do
183
- let(:fragment) do
184
- format_state = {
185
- styles: %i[bold italic],
186
- color: nil,
187
- link: nil,
188
- anchor: nil,
189
- font: nil,
190
- size: nil
191
- }
192
- described_class.new(
193
- 'hello world',
194
- format_state,
195
- pdf
196
- ).tap do |fragment|
197
- fragment.width = 100
198
- fragment.left = 50
199
- fragment.baseline = 200
200
- fragment.line_height = 27
201
- fragment.descender = 7
202
- fragment.ascender = 17
203
- fragment.word_spacing = 10
204
- end
205
- end
206
-
207
- it 'accounts for word_spacing in #width' do
208
- expect(fragment.width).to eq(110)
209
- end
210
-
211
- it 'accounts for word_spacing in #bounding_box' do
212
- target_box = [50, 193, 160, 217]
213
- expect(fragment.bounding_box).to eq(target_box)
214
- end
215
-
216
- it 'accounts for word_spacing in #absolute_bounding_box' do
217
- target_box = [50, 193, 160, 217]
218
- target_box[0] += pdf.bounds.absolute_left
219
- target_box[1] += pdf.bounds.absolute_bottom
220
- target_box[2] += pdf.bounds.absolute_left
221
- target_box[3] += pdf.bounds.absolute_bottom
222
- expect(fragment.absolute_bounding_box).to eq(target_box)
223
- end
224
-
225
- it 'accounts for word_spacing in #underline_points' do
226
- y = 198.75
227
- target_points = [[50, y], [160, y]]
228
- expect(fragment.underline_points).to eq(target_points)
229
- end
230
-
231
- it 'accounts for word_spacing in #strikethrough_points' do
232
- y = 200 + fragment.ascender * 0.3
233
- target_points = [[50, y], [160, y]]
234
- expect(fragment.strikethrough_points).to eq(target_points)
235
- end
236
- end
237
-
238
- describe 'subscript' do
239
- let(:fragment) do
240
- format_state = {
241
- styles: [:subscript],
242
- color: nil,
243
- link: nil,
244
- anchor: nil,
245
- font: nil,
246
- size: nil
247
- }
248
- described_class.new(
249
- 'hello world',
250
- format_state,
251
- pdf
252
- ).tap do |fragment|
253
- fragment.line_height = 27
254
- fragment.descender = 7
255
- fragment.ascender = 17
256
- end
257
- end
258
-
259
- describe '#subscript?' do
260
- it 'be_trues' do
261
- expect(fragment).to be_subscript
262
- end
263
- end
264
-
265
- describe '#y_offset' do
266
- it 'returns a negative value' do
267
- expect(fragment.y_offset).to be < 0
268
- end
269
- end
270
- end
271
-
272
- describe 'superscript' do
273
- let(:fragment) do
274
- format_state = {
275
- styles: [:superscript],
276
- color: nil,
277
- link: nil,
278
- anchor: nil,
279
- font: nil,
280
- size: nil
281
- }
282
- described_class.new(
283
- 'hello world',
284
- format_state,
285
- pdf
286
- ).tap do |fragment|
287
- fragment.line_height = 27
288
- fragment.descender = 7
289
- fragment.ascender = 17
290
- end
291
- end
292
-
293
- describe '#superscript?' do
294
- it 'be_trues' do
295
- expect(fragment).to be_superscript
296
- end
297
- end
298
-
299
- describe '#y_offset' do
300
- it 'returns a positive value' do
301
- expect(fragment.y_offset).to be > 0
302
- end
303
- end
304
- end
305
-
306
- context 'with :direction => :rtl' do
307
- it '#text should be reversed' do
308
- format_state = { direction: :rtl }
309
- fragment = described_class.new(
310
- 'hello world',
311
- format_state,
312
- pdf
313
- )
314
- expect(fragment.text).to eq('dlrow olleh')
315
- end
316
- end
317
-
318
- describe '#default_direction=' do
319
- it 'sets the direction if there is no fragment level direction ' \
320
- 'specification' do
321
- format_state = {}
322
- fragment = described_class.new(
323
- 'hello world',
324
- format_state,
325
- pdf
326
- )
327
- fragment.default_direction = :rtl
328
- expect(fragment.direction).to eq(:rtl)
329
- end
330
-
331
- it 'does not set the direction if there is a fragment level direction ' \
332
- 'specification' do
333
- format_state = { direction: :rtl }
334
- fragment = described_class.new(
335
- 'hello world',
336
- format_state,
337
- pdf
338
- )
339
- fragment.default_direction = :ltr
340
- expect(fragment.direction).to eq(:rtl)
341
- end
342
- end
343
- end