prawn 0.13.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/.yardopts +10 -0
  4. data/GPLv2 +20 -21
  5. data/Gemfile +3 -16
  6. data/Rakefile +17 -39
  7. data/lib/prawn/document/bounding_box.rb +85 -42
  8. data/lib/prawn/document/column_box.rb +21 -11
  9. data/lib/prawn/document/internals.rb +40 -147
  10. data/lib/prawn/document/span.rb +25 -17
  11. data/lib/prawn/document.rb +286 -245
  12. data/lib/prawn/encoding.rb +68 -101
  13. data/lib/prawn/errors.rb +47 -43
  14. data/lib/prawn/font.rb +204 -155
  15. data/lib/prawn/font_metric_cache.rb +25 -21
  16. data/lib/prawn/fonts/afm.rb +292 -0
  17. data/lib/prawn/{font → fonts}/dfont.rb +7 -13
  18. data/lib/prawn/fonts/otf.rb +11 -0
  19. data/lib/prawn/fonts/ttc.rb +36 -0
  20. data/lib/prawn/{font → fonts}/ttf.rb +142 -80
  21. data/lib/prawn/graphics/blend_mode.rb +65 -0
  22. data/lib/prawn/graphics/cap_style.rb +6 -5
  23. data/lib/prawn/graphics/color.rb +47 -44
  24. data/lib/prawn/graphics/dash.rb +30 -13
  25. data/lib/prawn/graphics/join_style.rb +13 -6
  26. data/lib/prawn/graphics/patterns.rb +221 -90
  27. data/lib/prawn/graphics/transformation.rb +21 -12
  28. data/lib/prawn/graphics/transparency.rb +21 -17
  29. data/lib/prawn/graphics.rb +155 -128
  30. data/lib/prawn/{layout/grid.rb → grid.rb} +110 -47
  31. data/lib/prawn/image_handler.rb +16 -2
  32. data/lib/prawn/images/image.rb +4 -2
  33. data/lib/prawn/images/jpg.rb +39 -30
  34. data/lib/prawn/images/png.rb +132 -169
  35. data/lib/prawn/images.rb +70 -62
  36. data/lib/prawn/measurement_extensions.rb +15 -10
  37. data/lib/prawn/measurements.rb +22 -23
  38. data/lib/prawn/outline.rb +301 -13
  39. data/lib/prawn/repeater.rb +19 -17
  40. data/lib/prawn/security/arcfour.rb +54 -0
  41. data/lib/prawn/security.rb +108 -86
  42. data/lib/prawn/soft_mask.rb +40 -41
  43. data/lib/prawn/stamp.rb +29 -12
  44. data/lib/prawn/text/box.rb +27 -29
  45. data/lib/prawn/text/formatted/arranger.rb +110 -67
  46. data/lib/prawn/text/formatted/box.rb +233 -165
  47. data/lib/prawn/text/formatted/fragment.rb +27 -27
  48. data/lib/prawn/text/formatted/line_wrap.rb +137 -97
  49. data/lib/prawn/text/formatted/parser.rb +149 -127
  50. data/lib/prawn/text/formatted/wrap.rb +57 -37
  51. data/lib/prawn/text/formatted.rb +6 -4
  52. data/lib/prawn/text.rb +105 -73
  53. data/lib/prawn/transformation_stack.rb +44 -0
  54. data/lib/prawn/utilities.rb +11 -21
  55. data/lib/prawn/version.rb +5 -0
  56. data/lib/prawn/view.rb +101 -0
  57. data/lib/prawn.rb +42 -68
  58. data/{data/images/fractal.jpg → manual/absolute_position.pdf} +0 -0
  59. data/manual/basic_concepts/adding_pages.rb +9 -10
  60. data/manual/basic_concepts/basic_concepts.rb +33 -24
  61. data/manual/basic_concepts/creation.rb +10 -11
  62. data/manual/basic_concepts/cursor.rb +9 -10
  63. data/manual/basic_concepts/measurement.rb +10 -11
  64. data/manual/basic_concepts/origin.rb +8 -9
  65. data/manual/basic_concepts/other_cursor_helpers.rb +17 -18
  66. data/manual/basic_concepts/view.rb +48 -0
  67. data/manual/bounding_box/bounding_box.rb +31 -29
  68. data/manual/bounding_box/bounds.rb +17 -18
  69. data/manual/bounding_box/canvas.rb +8 -9
  70. data/manual/bounding_box/creation.rb +8 -9
  71. data/manual/bounding_box/indentation.rb +22 -23
  72. data/manual/bounding_box/nesting.rb +32 -25
  73. data/manual/bounding_box/russian_boxes.rb +19 -19
  74. data/manual/bounding_box/stretchy.rb +18 -20
  75. data/manual/contents.rb +35 -0
  76. data/manual/cover.rb +43 -0
  77. data/manual/document_and_page_options/background.rb +16 -14
  78. data/manual/document_and_page_options/document_and_page_options.rb +26 -23
  79. data/manual/document_and_page_options/metadata.rb +21 -19
  80. data/manual/document_and_page_options/page_margins.rb +20 -22
  81. data/manual/document_and_page_options/page_size.rb +15 -15
  82. data/manual/document_and_page_options/print_scaling.rb +23 -0
  83. data/manual/example_helper.rb +5 -408
  84. data/manual/graphics/blend_mode.rb +52 -0
  85. data/manual/graphics/circle_and_ellipse.rb +8 -9
  86. data/manual/graphics/color.rb +11 -13
  87. data/manual/graphics/common_lines.rb +13 -12
  88. data/manual/graphics/fill_and_stroke.rb +10 -11
  89. data/manual/graphics/fill_rules.rb +13 -12
  90. data/manual/graphics/gradients.rb +28 -22
  91. data/manual/graphics/graphics.rb +52 -46
  92. data/manual/graphics/helper.rb +20 -10
  93. data/manual/graphics/line_width.rb +13 -12
  94. data/manual/graphics/lines_and_curves.rb +13 -14
  95. data/manual/graphics/polygon.rb +10 -12
  96. data/manual/graphics/rectangle.rb +7 -8
  97. data/manual/graphics/rotate.rb +9 -12
  98. data/manual/graphics/scale.rb +19 -18
  99. data/manual/graphics/soft_masks.rb +5 -7
  100. data/manual/graphics/stroke_cap.rb +10 -11
  101. data/manual/graphics/stroke_dash.rb +16 -17
  102. data/manual/graphics/stroke_join.rb +10 -11
  103. data/manual/graphics/translate.rb +13 -13
  104. data/manual/graphics/transparency.rb +11 -13
  105. data/manual/{manual/how_to_read_this_manual.rb → how_to_read_this_manual.rb} +23 -25
  106. data/manual/images/absolute_position.rb +9 -10
  107. data/manual/images/fit.rb +9 -10
  108. data/manual/images/horizontal.rb +13 -14
  109. data/manual/images/images.rb +31 -30
  110. data/manual/images/plain_image.rb +6 -7
  111. data/manual/images/scale.rb +12 -13
  112. data/manual/images/vertical.rb +19 -17
  113. data/manual/images/width_and_height.rb +13 -14
  114. data/manual/layout/boxes.rb +14 -15
  115. data/manual/layout/content.rb +12 -13
  116. data/manual/layout/layout.rb +19 -20
  117. data/manual/layout/simple_grid.rb +8 -9
  118. data/manual/outline/add_subsection_to.rb +26 -27
  119. data/manual/outline/insert_section_after.rb +19 -20
  120. data/manual/outline/outline.rb +23 -22
  121. data/manual/outline/sections_and_pages.rb +24 -25
  122. data/manual/repeatable_content/alternate_page_numbering.rb +36 -0
  123. data/manual/repeatable_content/page_numbering.rb +20 -19
  124. data/manual/repeatable_content/repeatable_content.rb +26 -22
  125. data/manual/repeatable_content/repeater.rb +18 -19
  126. data/manual/repeatable_content/stamp.rb +18 -19
  127. data/manual/security/encryption.rb +8 -11
  128. data/manual/security/permissions.rb +20 -15
  129. data/manual/security/security.rb +20 -20
  130. data/manual/table.rb +16 -0
  131. data/manual/text/alignment.rb +17 -18
  132. data/manual/text/color.rb +13 -13
  133. data/manual/text/column_box.rb +10 -12
  134. data/manual/text/fallback_fonts.rb +29 -25
  135. data/manual/text/font.rb +17 -18
  136. data/manual/text/font_size.rb +21 -22
  137. data/manual/text/font_style.rb +12 -10
  138. data/manual/text/formatted_callbacks.rb +36 -26
  139. data/manual/text/formatted_text.rb +41 -34
  140. data/manual/text/free_flowing_text.rb +28 -29
  141. data/manual/text/inline.rb +23 -26
  142. data/manual/text/kerning_and_character_spacing.rb +20 -21
  143. data/manual/text/leading.rb +10 -11
  144. data/manual/text/line_wrapping.rb +40 -21
  145. data/manual/text/paragraph_indentation.rb +17 -12
  146. data/manual/text/positioned_text.rb +19 -20
  147. data/manual/text/registering_families.rb +33 -30
  148. data/manual/text/rendering_and_color.rb +11 -12
  149. data/manual/text/right_to_left_text.rb +31 -20
  150. data/manual/text/rotation.rb +36 -27
  151. data/manual/text/single_usage.rb +13 -14
  152. data/manual/text/text.rb +62 -62
  153. data/manual/text/text_box_excess.rb +22 -19
  154. data/manual/text/text_box_extensions.rb +21 -18
  155. data/manual/text/text_box_overflow.rb +28 -21
  156. data/manual/text/utf8.rb +16 -17
  157. data/manual/text/win_ansi_charset.rb +29 -26
  158. data/prawn.gemspec +45 -43
  159. data/spec/extensions/encoding_helpers.rb +4 -3
  160. data/spec/prawn/document/bounding_box_spec.rb +550 -0
  161. data/spec/prawn/document/column_box_spec.rb +75 -0
  162. data/spec/prawn/document/security_spec.rb +176 -0
  163. data/spec/prawn/document_annotations_spec.rb +76 -0
  164. data/spec/prawn/document_destinations_spec.rb +15 -0
  165. data/spec/prawn/document_grid_spec.rb +99 -0
  166. data/spec/prawn/document_reference_spec.rb +27 -0
  167. data/spec/prawn/document_span_spec.rb +44 -0
  168. data/spec/prawn/document_spec.rb +805 -0
  169. data/spec/prawn/font_metric_cache_spec.rb +54 -0
  170. data/spec/prawn/font_spec.rb +544 -0
  171. data/spec/prawn/graphics/blend_mode_spec.rb +63 -0
  172. data/spec/prawn/graphics/transparency_spec.rb +81 -0
  173. data/spec/prawn/graphics_spec.rb +872 -0
  174. data/spec/prawn/graphics_stroke_styles_spec.rb +229 -0
  175. data/spec/prawn/image_handler_spec.rb +53 -0
  176. data/spec/prawn/images/jpg_spec.rb +20 -0
  177. data/spec/prawn/images/png_spec.rb +283 -0
  178. data/spec/prawn/images_spec.rb +229 -0
  179. data/spec/prawn/measurements_extensions_spec.rb +24 -0
  180. data/spec/prawn/outline_spec.rb +512 -0
  181. data/spec/prawn/repeater_spec.rb +166 -0
  182. data/spec/prawn/soft_mask_spec.rb +74 -0
  183. data/spec/prawn/stamp_spec.rb +173 -0
  184. data/spec/prawn/text/box_spec.rb +1110 -0
  185. data/spec/prawn/text/formatted/arranger_spec.rb +466 -0
  186. data/spec/prawn/text/formatted/box_spec.rb +849 -0
  187. data/spec/prawn/text/formatted/fragment_spec.rb +343 -0
  188. data/spec/prawn/text/formatted/line_wrap_spec.rb +495 -0
  189. data/spec/prawn/text/formatted/parser_spec.rb +697 -0
  190. data/spec/prawn/text_draw_text_spec.rb +150 -0
  191. data/spec/prawn/text_rendering_mode_spec.rb +48 -0
  192. data/spec/prawn/text_spacing_spec.rb +95 -0
  193. data/spec/prawn/text_spec.rb +603 -0
  194. data/spec/prawn/text_with_inline_formatting_spec.rb +35 -0
  195. data/spec/prawn/transformation_stack_spec.rb +66 -0
  196. data/spec/prawn/view_spec.rb +63 -0
  197. data/spec/prawn_manual_spec.rb +35 -0
  198. data/spec/spec_helper.rb +22 -21
  199. data.tar.gz.sig +0 -0
  200. metadata +168 -307
  201. metadata.gz.sig +0 -0
  202. data/README.md +0 -109
  203. data/data/encodings/win_ansi.txt +0 -29
  204. data/data/images/16bit.alpha +0 -0
  205. data/data/images/16bit.dat +0 -0
  206. data/data/images/16bit.png +0 -0
  207. data/data/images/arrow.png +0 -0
  208. data/data/images/arrow2.png +0 -0
  209. data/data/images/barcode_issue.png +0 -0
  210. data/data/images/dice.alpha +0 -0
  211. data/data/images/dice.dat +0 -0
  212. data/data/images/dice.png +0 -0
  213. data/data/images/dice_interlaced.png +0 -0
  214. data/data/images/indexed_color.dat +0 -0
  215. data/data/images/indexed_color.png +0 -0
  216. data/data/images/letterhead.jpg +0 -0
  217. data/data/images/page_white_text.alpha +0 -0
  218. data/data/images/page_white_text.dat +0 -0
  219. data/data/images/page_white_text.png +0 -0
  220. data/data/images/pigs.jpg +0 -0
  221. data/data/images/prawn.png +0 -0
  222. data/data/images/ruport.png +0 -0
  223. data/data/images/ruport_data.dat +0 -0
  224. data/data/images/ruport_transparent.png +0 -0
  225. data/data/images/ruport_type0.png +0 -0
  226. data/data/images/stef.jpg +0 -0
  227. data/data/images/tru256.bmp +0 -0
  228. data/data/images/web-links.dat +0 -1
  229. data/data/images/web-links.png +0 -0
  230. data/data/pdfs/complex_template.pdf +0 -0
  231. data/data/pdfs/contains_ttf_font.pdf +0 -0
  232. data/data/pdfs/encrypted.pdf +0 -0
  233. data/data/pdfs/form.pdf +1 -819
  234. data/data/pdfs/hexagon.pdf +0 -61
  235. data/data/pdfs/indirect_reference.pdf +0 -86
  236. data/data/pdfs/multipage_template.pdf +0 -127
  237. data/data/pdfs/nested_pages.pdf +0 -118
  238. data/data/pdfs/page_without_mediabox.pdf +0 -193
  239. data/data/pdfs/resources_as_indirect_object.pdf +0 -83
  240. data/data/pdfs/two_hexagons.pdf +0 -90
  241. data/data/pdfs/version_1_6.pdf +0 -61
  242. data/data/shift_jis_text.txt +0 -1
  243. data/lib/pdf/core/annotations.rb +0 -60
  244. data/lib/pdf/core/byte_string.rb +0 -9
  245. data/lib/pdf/core/destinations.rb +0 -90
  246. data/lib/pdf/core/document_state.rb +0 -78
  247. data/lib/pdf/core/filter_list.rb +0 -51
  248. data/lib/pdf/core/filters.rb +0 -36
  249. data/lib/pdf/core/graphics_state.rb +0 -68
  250. data/lib/pdf/core/literal_string.rb +0 -16
  251. data/lib/pdf/core/name_tree.rb +0 -177
  252. data/lib/pdf/core/object_store.rb +0 -320
  253. data/lib/pdf/core/outline.rb +0 -315
  254. data/lib/pdf/core/page.rb +0 -212
  255. data/lib/pdf/core/page_geometry.rb +0 -126
  256. data/lib/pdf/core/pdf_object.rb +0 -124
  257. data/lib/pdf/core/reference.rb +0 -103
  258. data/lib/pdf/core/stream.rb +0 -98
  259. data/lib/pdf/core/text.rb +0 -275
  260. data/lib/pdf/core.rb +0 -35
  261. data/lib/prawn/compatibility.rb +0 -91
  262. data/lib/prawn/document/graphics_state.rb +0 -73
  263. data/lib/prawn/document/snapshot.rb +0 -89
  264. data/lib/prawn/font/afm.rb +0 -203
  265. data/lib/prawn/layout.rb +0 -20
  266. data/lib/prawn/table/cell/image.rb +0 -70
  267. data/lib/prawn/table/cell/in_table.rb +0 -27
  268. data/lib/prawn/table/cell/span_dummy.rb +0 -92
  269. data/lib/prawn/table/cell/subtable.rb +0 -65
  270. data/lib/prawn/table/cell/text.rb +0 -153
  271. data/lib/prawn/table/cell.rb +0 -770
  272. data/lib/prawn/table/cells.rb +0 -295
  273. data/lib/prawn/table.rb +0 -643
  274. data/manual/example_file.rb +0 -116
  275. data/manual/example_package.rb +0 -53
  276. data/manual/example_section.rb +0 -46
  277. data/manual/manual/cover.rb +0 -35
  278. data/manual/manual/foreword.rb +0 -85
  279. data/manual/manual/manual.rb +0 -35
  280. data/manual/syntax_highlight.rb +0 -52
  281. data/manual/table/basic_block.rb +0 -53
  282. data/manual/table/before_rendering_page.rb +0 -26
  283. data/manual/table/cell_border_lines.rb +0 -24
  284. data/manual/table/cell_borders_and_bg.rb +0 -31
  285. data/manual/table/cell_dimensions.rb +0 -30
  286. data/manual/table/cell_text.rb +0 -38
  287. data/manual/table/column_widths.rb +0 -30
  288. data/manual/table/content_and_subtables.rb +0 -39
  289. data/manual/table/creation.rb +0 -27
  290. data/manual/table/filtering.rb +0 -36
  291. data/manual/table/flow_and_header.rb +0 -17
  292. data/manual/table/image_cells.rb +0 -33
  293. data/manual/table/position.rb +0 -29
  294. data/manual/table/row_colors.rb +0 -20
  295. data/manual/table/span.rb +0 -30
  296. data/manual/table/style.rb +0 -22
  297. data/manual/table/table.rb +0 -52
  298. data/manual/table/width.rb +0 -27
  299. data/manual/templates/full_template.rb +0 -25
  300. data/manual/templates/page_template.rb +0 -48
  301. data/manual/templates/templates.rb +0 -27
  302. data/manual/text/group.rb +0 -29
  303. data/spec/acceptance/png.rb +0 -23
  304. data/spec/annotations_spec.rb +0 -74
  305. data/spec/bounding_box_spec.rb +0 -493
  306. data/spec/cell_spec.rb +0 -628
  307. data/spec/column_box_spec.rb +0 -33
  308. data/spec/destinations_spec.rb +0 -15
  309. data/spec/document_spec.rb +0 -761
  310. data/spec/extensions/mocha.rb +0 -44
  311. data/spec/filters_spec.rb +0 -34
  312. data/spec/font_metric_cache_spec.rb +0 -52
  313. data/spec/font_spec.rb +0 -464
  314. data/spec/formatted_text_arranger_spec.rb +0 -421
  315. data/spec/formatted_text_box_spec.rb +0 -650
  316. data/spec/formatted_text_fragment_spec.rb +0 -298
  317. data/spec/graphics_spec.rb +0 -651
  318. data/spec/grid_spec.rb +0 -85
  319. data/spec/image_handler_spec.rb +0 -42
  320. data/spec/images_spec.rb +0 -157
  321. data/spec/inline_formatted_text_parser_spec.rb +0 -564
  322. data/spec/jpg_spec.rb +0 -25
  323. data/spec/line_wrap_spec.rb +0 -333
  324. data/spec/measurement_units_spec.rb +0 -23
  325. data/spec/name_tree_spec.rb +0 -112
  326. data/spec/object_store_spec.rb +0 -170
  327. data/spec/outline_spec.rb +0 -448
  328. data/spec/pdf_object_spec.rb +0 -172
  329. data/spec/png_spec.rb +0 -240
  330. data/spec/reference_spec.rb +0 -82
  331. data/spec/repeater_spec.rb +0 -158
  332. data/spec/security_spec.rb +0 -158
  333. data/spec/snapshot_spec.rb +0 -186
  334. data/spec/soft_mask_spec.rb +0 -117
  335. data/spec/span_spec.rb +0 -44
  336. data/spec/stamp_spec.rb +0 -158
  337. data/spec/stream_spec.rb +0 -58
  338. data/spec/stroke_styles_spec.rb +0 -211
  339. data/spec/table/span_dummy_spec.rb +0 -17
  340. data/spec/table_spec.rb +0 -1355
  341. data/spec/template_spec.rb +0 -351
  342. data/spec/text_at_spec.rb +0 -130
  343. data/spec/text_box_spec.rb +0 -1030
  344. data/spec/text_rendering_mode_spec.rb +0 -45
  345. data/spec/text_spacing_spec.rb +0 -93
  346. data/spec/text_spec.rb +0 -425
  347. data/spec/text_with_inline_formatting_spec.rb +0 -35
  348. data/spec/transparency_spec.rb +0 -89
@@ -0,0 +1,343 @@
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