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,697 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe Prawn::Text::Formatted::Parser do
6
- describe '#format' do
7
- it 'handles sup' do
8
- string = '<sup>superscript</sup>'
9
- array = described_class.format(string)
10
- expect(array[0]).to eq(
11
- text: 'superscript',
12
- styles: [:superscript],
13
- color: nil,
14
- link: nil,
15
- anchor: nil,
16
- local: nil,
17
- font: nil,
18
- size: nil,
19
- character_spacing: nil
20
- )
21
- end
22
-
23
- it 'handles sub' do
24
- string = '<sub>subscript</sub>'
25
- array = described_class.format(string)
26
- expect(array[0]).to eq(
27
- text: 'subscript',
28
- styles: [:subscript],
29
- color: nil,
30
- link: nil,
31
- anchor: nil,
32
- local: nil,
33
- font: nil,
34
- size: nil,
35
- character_spacing: nil
36
- )
37
- end
38
-
39
- it 'handles rgb' do
40
- string = "<color rgb='#ff0000'>red text</color>"
41
- array = described_class.format(string)
42
- expect(array[0]).to eq(
43
- text: 'red text',
44
- styles: [],
45
- color: 'ff0000',
46
- link: nil,
47
- anchor: nil,
48
- local: nil,
49
- font: nil,
50
- size: nil,
51
- character_spacing: nil
52
- )
53
- end
54
-
55
- it '# should be optional in rgb' do
56
- string = "<color rgb='ff0000'>red text</color>"
57
- array = described_class.format(string)
58
- expect(array[0]).to eq(
59
- text: 'red text',
60
- styles: [],
61
- color: 'ff0000',
62
- link: nil,
63
- anchor: nil,
64
- local: nil,
65
- font: nil,
66
- size: nil,
67
- character_spacing: nil
68
- )
69
- end
70
-
71
- it 'handles cmyk' do
72
- string = "<color c='0' m='100' y='0' k='0'>magenta text</color>"
73
- array = described_class.format(string)
74
- expect(array[0]).to eq(
75
- text: 'magenta text',
76
- styles: [],
77
- color: [0, 100, 0, 0],
78
- link: nil,
79
- anchor: nil,
80
- local: nil,
81
- font: nil,
82
- size: nil,
83
- character_spacing: nil
84
- )
85
- end
86
-
87
- it 'handles fonts' do
88
- string = "<font name='Courier'>Courier text</font>"
89
- array = described_class.format(string)
90
- expect(array[0]).to eq(
91
- text: 'Courier text',
92
- styles: [],
93
- color: nil,
94
- link: nil,
95
- anchor: nil,
96
- local: nil,
97
- font: 'Courier',
98
- size: nil,
99
- character_spacing: nil
100
- )
101
- end
102
-
103
- it 'handles size' do
104
- string = "<font size='14'>14 point text</font>"
105
- array = described_class.format(string)
106
- expect(array[0]).to eq(
107
- text: '14 point text',
108
- styles: [],
109
- color: nil,
110
- link: nil,
111
- anchor: nil,
112
- local: nil,
113
- font: nil,
114
- size: 14,
115
- character_spacing: nil
116
- )
117
- end
118
-
119
- it 'handles character_spacing' do
120
- string = "<font character_spacing='2.5'>extra character spacing</font>"
121
- array = described_class.format(string)
122
- expect(array[0]).to eq(
123
- text: 'extra character spacing',
124
- styles: [],
125
- color: nil,
126
- link: nil,
127
- anchor: nil,
128
- local: nil,
129
- font: nil,
130
- size: nil,
131
- character_spacing: 2.5
132
- )
133
- end
134
-
135
- it 'handles links' do
136
- string = "<link href='http://example.com'>external link</link>"
137
- array = described_class.format(string)
138
- expect(array[0]).to eq(
139
- text: 'external link',
140
- styles: [],
141
- color: nil,
142
- link: 'http://example.com',
143
- anchor: nil,
144
- local: nil,
145
- font: nil,
146
- size: nil,
147
- character_spacing: nil
148
- )
149
- end
150
-
151
- it 'handles local links' do
152
- string = "<link local='/home/example/foo.bar'>local link</link>"
153
- array = described_class.format(string)
154
- expect(array[0]).to eq(
155
- text: 'local link',
156
- styles: [],
157
- color: nil,
158
- link: nil,
159
- anchor: nil,
160
- local: '/home/example/foo.bar',
161
- font: nil,
162
- size: nil,
163
- character_spacing: nil
164
- )
165
- end
166
-
167
- it 'handles anchors' do
168
- string = "<link anchor='ToC'>internal link</link>"
169
- array = described_class.format(string)
170
- expect(array[0]).to eq(
171
- text: 'internal link',
172
- styles: [],
173
- color: nil,
174
- link: nil,
175
- anchor: 'ToC',
176
- local: nil,
177
- font: nil,
178
- size: nil,
179
- character_spacing: nil
180
- )
181
- end
182
-
183
- it 'handles higher order characters properly' do
184
- string = "<b>©\n©</b>"
185
- array = described_class.format(string)
186
- expect(array[0]).to eq(
187
- text: '©',
188
- styles: [:bold],
189
- color: nil,
190
- link: nil,
191
- anchor: nil,
192
- local: nil,
193
- font: nil,
194
- size: nil,
195
- character_spacing: nil
196
- )
197
- expect(array[1]).to eq(
198
- text: "\n",
199
- styles: [:bold],
200
- color: nil,
201
- link: nil,
202
- anchor: nil,
203
- local: nil,
204
- font: nil,
205
- size: nil,
206
- character_spacing: nil
207
- )
208
- expect(array[2]).to eq(
209
- text: '©',
210
- styles: [:bold],
211
- color: nil,
212
- link: nil,
213
- anchor: nil,
214
- local: nil,
215
- font: nil,
216
- size: nil,
217
- character_spacing: nil
218
- )
219
- end
220
-
221
- it 'converts &lt; &gt;, and &amp; to <, >, and &, respectively' do
222
- string = 'hello <b>&lt;, &gt;, and &amp;</b>'
223
- array = described_class.format(string)
224
- expect(array[1]).to eq(
225
- text: '<, >, and &',
226
- styles: [:bold],
227
- color: nil,
228
- link: nil,
229
- anchor: nil,
230
- local: nil,
231
- font: nil,
232
- size: nil,
233
- character_spacing: nil
234
- )
235
- end
236
-
237
- it 'handles double qoutes around tag attributes' do
238
- string = 'some <font size="14">sized</font> text'
239
- array = described_class.format(string)
240
- expect(array[1]).to eq(
241
- text: 'sized',
242
- styles: [],
243
- color: nil,
244
- link: nil,
245
- anchor: nil,
246
- local: nil,
247
- font: nil,
248
- size: 14,
249
- character_spacing: nil
250
- )
251
- end
252
-
253
- it 'handles single qoutes around tag attributes' do
254
- string = "some <font size='14'>sized</font> text"
255
- array = described_class.format(string)
256
- expect(array[1]).to eq(
257
- text: 'sized',
258
- styles: [],
259
- color: nil,
260
- link: nil,
261
- anchor: nil,
262
- local: nil,
263
- font: nil,
264
- size: 14,
265
- character_spacing: nil
266
- )
267
- end
268
-
269
- it 'constructs a formatted text array from a string' do
270
- string = "hello <b>world\nhow <i>are</i></b> you?"
271
- array = described_class.format(string)
272
-
273
- expect(array[0]).to eq(
274
- text: 'hello ',
275
- styles: [],
276
- color: nil,
277
- link: nil,
278
- anchor: nil,
279
- local: nil,
280
- font: nil,
281
- size: nil,
282
- character_spacing: nil
283
- )
284
- expect(array[1]).to eq(
285
- text: 'world',
286
- styles: [:bold],
287
- color: nil,
288
- link: nil,
289
- anchor: nil,
290
- local: nil,
291
- font: nil,
292
- size: nil,
293
- character_spacing: nil
294
- )
295
- expect(array[2]).to eq(
296
- text: "\n",
297
- styles: [:bold],
298
- color: nil,
299
- link: nil,
300
- anchor: nil,
301
- local: nil,
302
- font: nil,
303
- size: nil,
304
- character_spacing: nil
305
- )
306
- expect(array[3]).to eq(
307
- text: 'how ',
308
- styles: [:bold],
309
- color: nil,
310
- link: nil,
311
- anchor: nil,
312
- local: nil,
313
- font: nil,
314
- size: nil,
315
- character_spacing: nil
316
- )
317
- expect(array[4]).to eq(
318
- text: 'are',
319
- styles: %i[bold italic],
320
- color: nil,
321
- link: nil,
322
- anchor: nil,
323
- local: nil,
324
- font: nil,
325
- size: nil,
326
- character_spacing: nil
327
- )
328
- expect(array[5]).to eq(
329
- text: ' you?',
330
- styles: [],
331
- color: nil,
332
- link: nil,
333
- anchor: nil,
334
- local: nil,
335
- font: nil,
336
- size: nil,
337
- character_spacing: nil
338
- )
339
- end
340
-
341
- it 'accepts <strong> as an alternative to <b>' do
342
- string = '<strong>bold</strong> not bold'
343
- array = described_class.format(string)
344
-
345
- expect(array[0]).to eq(
346
- text: 'bold',
347
- styles: [:bold],
348
- color: nil,
349
- link: nil,
350
- anchor: nil,
351
- local: nil,
352
- font: nil,
353
- size: nil,
354
- character_spacing: nil
355
- )
356
- expect(array[1]).to eq(
357
- text: ' not bold',
358
- styles: [],
359
- color: nil,
360
- link: nil,
361
- anchor: nil,
362
- local: nil,
363
- font: nil,
364
- size: nil,
365
- character_spacing: nil
366
- )
367
- end
368
-
369
- it 'accepts <em> as an alternative to <i>' do
370
- string = '<em>italic</em> not italic'
371
- array = described_class.format(string)
372
-
373
- expect(array[0]).to eq(
374
- text: 'italic',
375
- styles: [:italic],
376
- color: nil,
377
- link: nil,
378
- anchor: nil,
379
- local: nil,
380
- font: nil,
381
- size: nil,
382
- character_spacing: nil
383
- )
384
- expect(array[1]).to eq(
385
- text: ' not italic',
386
- styles: [],
387
- color: nil,
388
- link: nil,
389
- anchor: nil,
390
- local: nil,
391
- font: nil,
392
- size: nil,
393
- character_spacing: nil
394
- )
395
- end
396
-
397
- it 'accepts <a> as an alternative to <link>' do
398
- string = "<a href='http://example.com'>link</a> not a link"
399
- array = described_class.format(string)
400
-
401
- expect(array[0]).to eq(
402
- text: 'link',
403
- styles: [],
404
- color: nil,
405
- link: 'http://example.com',
406
- anchor: nil,
407
- local: nil,
408
- font: nil,
409
- size: nil,
410
- character_spacing: nil
411
- )
412
- expect(array[1]).to eq(
413
- text: ' not a link',
414
- styles: [],
415
- color: nil,
416
- link: nil,
417
- anchor: nil,
418
- local: nil,
419
- font: nil,
420
- size: nil,
421
- character_spacing: nil
422
- )
423
- end
424
-
425
- it 'turns <br>, <br/> into newline' do
426
- array = described_class.format('hello<br>big<br/>world')
427
- expect(array.map { |frag| frag[:text] }.join).to eq("hello\nbig\nworld")
428
- end
429
- end
430
-
431
- describe '#to_string' do
432
- it 'handles sup' do
433
- string = '<sup>superscript</sup>'
434
- array = [{
435
- text: 'superscript',
436
- styles: [:superscript],
437
- color: nil,
438
- link: nil,
439
- anchor: nil,
440
- local: nil,
441
- font: nil,
442
- size: nil,
443
- character_spacing: nil
444
- }]
445
- expect(described_class.to_string(array)).to eq(string)
446
- end
447
-
448
- it 'handles sub' do
449
- string = '<sub>subscript</sub>'
450
- array = [{
451
- text: 'subscript',
452
- styles: [:subscript],
453
- color: nil,
454
- link: nil,
455
- anchor: nil,
456
- local: nil,
457
- font: nil,
458
- size: nil,
459
- character_spacing: nil
460
- }]
461
- expect(described_class.to_string(array)).to eq(string)
462
- end
463
-
464
- it 'handles rgb' do
465
- string = "<color rgb='ff0000'>red text</color>"
466
- array = [{
467
- text: 'red text',
468
- styles: [],
469
- color: 'ff0000',
470
- link: nil,
471
- anchor: nil,
472
- local: nil,
473
- font: nil,
474
- size: nil,
475
- character_spacing: nil
476
- }]
477
- expect(described_class.to_string(array)).to eq(string)
478
- end
479
-
480
- it 'handles cmyk' do
481
- string = "<color c='0' m='100' y='0' k='0'>magenta text</color>"
482
- array = [{
483
- text: 'magenta text',
484
- styles: [],
485
- color: [0, 100, 0, 0],
486
- link: nil,
487
- anchor: nil,
488
- local: nil,
489
- font: nil,
490
- size: nil,
491
- character_spacing: nil
492
- }]
493
- expect(described_class.to_string(array)).to eq(string)
494
- end
495
-
496
- it 'handles fonts' do
497
- string = "<font name='Courier'>Courier text</font>"
498
- array = [{
499
- text: 'Courier text',
500
- styles: [],
501
- color: nil,
502
- link: nil,
503
- anchor: nil,
504
- local: nil,
505
- font: 'Courier',
506
- size: nil,
507
- character_spacing: nil
508
- }]
509
- expect(described_class.to_string(array)).to eq(string)
510
- end
511
-
512
- it 'handles size' do
513
- string = "<font size='14'>14 point text</font>"
514
- array = [{
515
- text: '14 point text',
516
- styles: [],
517
- color: nil,
518
- link: nil,
519
- anchor: nil,
520
- local: nil,
521
- font: nil,
522
- size: 14,
523
- character_spacing: nil
524
- }]
525
- expect(described_class.to_string(array)).to eq(string)
526
- end
527
-
528
- it 'handles character spacing' do
529
- string =
530
- "<font character_spacing='2.5'>2.5 extra character spacing</font>"
531
- array = [{
532
- text: '2.5 extra character spacing',
533
- styles: [],
534
- color: nil,
535
- link: nil,
536
- anchor: nil,
537
- local: nil,
538
- font: nil,
539
- size: nil,
540
- character_spacing: 2.5
541
- }]
542
- expect(described_class.to_string(array)).to eq(string)
543
- end
544
-
545
- it 'handles links' do
546
- array = [{
547
- text: 'external link',
548
- styles: [],
549
- color: nil,
550
- link: 'http://example.com',
551
- anchor: nil,
552
- local: nil,
553
- font: nil,
554
- size: nil,
555
- character_spacing: nil
556
- }]
557
- string = "<link href='http://example.com'>external link</link>"
558
- expect(described_class.to_string(array)).to eq(string)
559
- end
560
-
561
- it 'handles anchors' do
562
- array = [{
563
- text: 'internal link',
564
- styles: [],
565
- color: nil,
566
- link: nil,
567
- anchor: 'ToC',
568
- font: nil,
569
- size: nil,
570
- character_spacing: nil
571
- }]
572
- string = "<link anchor='ToC'>internal link</link>"
573
- expect(described_class.to_string(array)).to eq(string)
574
- end
575
-
576
- it 'converts <, >, and & to &lt; &gt;, and &amp;, respectively' do
577
- array = [
578
- {
579
- text: 'hello ',
580
- styles: [],
581
- color: nil,
582
- link: nil,
583
- font: nil,
584
- size: nil,
585
- character_spacing: nil
586
- },
587
- {
588
- text: '<, >, and &',
589
- styles: [:bold],
590
- color: nil,
591
- link: nil,
592
- font: nil,
593
- size: nil,
594
- character_spacing: nil
595
- }
596
- ]
597
- string = 'hello <b>&lt;, &gt;, and &amp;</b>'
598
- expect(described_class.to_string(array)).to eq(string)
599
- end
600
-
601
- it 'constructs an HTML-esque string from a formatted text array' do
602
- array = [
603
- {
604
- text: 'hello ',
605
- styles: [],
606
- color: nil,
607
- link: nil,
608
- font: nil,
609
- size: 14,
610
- character_spacing: nil
611
- },
612
- {
613
- text: 'world',
614
- styles: [:bold],
615
- color: nil,
616
- link: nil,
617
- font: nil,
618
- size: nil,
619
- character_spacing: nil
620
- },
621
- {
622
- text: "\n",
623
- styles: [:bold],
624
- color: nil,
625
- link: nil,
626
- font: nil,
627
- size: nil,
628
- character_spacing: nil
629
- },
630
- {
631
- text: 'how ',
632
- styles: [:bold],
633
- color: nil,
634
- link: nil,
635
- font: nil,
636
- size: nil,
637
- character_spacing: nil
638
- },
639
- {
640
- text: 'are',
641
- styles: %i[bold italic],
642
- color: nil,
643
- link: nil,
644
- font: nil,
645
- size: nil,
646
- character_spacing: nil
647
- },
648
- {
649
- text: ' you?',
650
- styles: [],
651
- color: nil,
652
- link: nil,
653
- font: nil,
654
- size: nil,
655
- character_spacing: nil
656
- }
657
- ]
658
- string = "<font size='14'>hello </font><b>world</b><b>\n"\
659
- '</b><b>how </b><b><i>are</i></b> you?'
660
- expect(described_class.to_string(array)).to eq(string)
661
- end
662
- end
663
-
664
- describe '#array_paragraphs' do
665
- it 'groups fragments separated by newlines' do
666
- array = [
667
- { text: "\nhello\nworld" },
668
- { text: "\n\n" },
669
- { text: 'how' },
670
- { text: 'are' },
671
- { text: 'you' }
672
- ]
673
- target = [
674
- [{ text: "\n" }],
675
- [{ text: 'hello' }],
676
- [{ text: 'world' }],
677
- [{ text: "\n" }],
678
- [
679
- { text: 'how' },
680
- { text: 'are' },
681
- { text: 'you' }
682
- ]
683
- ]
684
- expect(described_class.array_paragraphs(array)).to eq(target)
685
- end
686
-
687
- it 'works properly if ending in an empty paragraph' do
688
- array = [{ text: "\nhello\nworld\n" }]
689
- target = [
690
- [{ text: "\n" }],
691
- [{ text: 'hello' }],
692
- [{ text: 'world' }]
693
- ]
694
- expect(described_class.array_paragraphs(array)).to eq(target)
695
- end
696
- end
697
- end