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
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  # text/formatted/parser.rb : Implements a bi-directional parser between a subset
4
4
  # of html and formatted text arrays
@@ -11,86 +11,91 @@
11
11
  module Prawn
12
12
  module Text
13
13
  module Formatted
14
-
15
14
  class Parser
16
- PARSER_REGEX = begin
17
- regex_string = "\n|" +
18
- "<b>|</b>|" +
19
- "<i>|</i>|" +
20
- "<u>|</u>|" +
21
- "<strikethrough>|</strikethrough>|" +
22
- "<sub>|</sub>|" +
23
- "<sup>|</sup>|" +
24
- "<link[^>]*>|</link>|" +
25
- "<color[^>]*>|</color>|" +
26
- "<font[^>]*>|</font>|" +
27
- "<strong>|</strong>|" +
28
- "<em>|</em>|" +
29
- "<a[^>]*>|</a>|" +
30
- "[^<\n]+"
31
- Regexp.new(regex_string, Regexp::MULTILINE)
32
- end
15
+ # @group Extension API
16
+
17
+ PARSER_REGEX =
18
+ begin
19
+ regex_string = "\n|" \
20
+ '<b>|</b>|' \
21
+ '<i>|</i>|' \
22
+ '<u>|</u>|' \
23
+ '<strikethrough>|</strikethrough>|' \
24
+ '<sub>|</sub>|' \
25
+ '<sup>|</sup>|' \
26
+ '<link[^>]*>|</link>|' \
27
+ '<color[^>]*>|</color>|' \
28
+ '<font[^>]*>|</font>|' \
29
+ '<strong>|</strong>|' \
30
+ '<em>|</em>|' \
31
+ '<a[^>]*>|</a>|' \
32
+ "[^<\n]+"
33
+ Regexp.new(regex_string, Regexp::MULTILINE)
34
+ end
33
35
 
34
- def self.format(string, *args)
35
- tokens = string.gsub(/<br\s*\/?>/, "\n").scan(PARSER_REGEX)
36
- self.array_from_tokens(tokens)
36
+ def self.format(string, *_args)
37
+ tokens = string.gsub(%r{<br\s*/?>}, "\n").scan(PARSER_REGEX)
38
+ array_from_tokens(tokens)
37
39
  end
38
40
 
39
41
  def self.to_string(array)
40
- prefixes = { :bold => "<b>",
41
- :italic => "<i>",
42
- :underline => "<u>",
43
- :strikethrough => "<strikethrough>",
44
- :subscript => "<sub>",
45
- :superscript => "<sup>" }
46
- suffixes = { :bold => "</b>",
47
- :italic => "</i>",
48
- :underline => "</u>",
49
- :strikethrough => "</strikethrough>",
50
- :subscript => "</sub>",
51
- :superscript => "</sup>" }
52
- array.collect do |hash|
53
- prefix = ""
54
- suffix = ""
55
- if hash[:styles]
56
- hash[:styles].each do |style|
57
- prefix = prefix + prefixes[style]
58
- suffix = suffixes[style] + suffix
59
- end
42
+ prefixes = {
43
+ bold: '<b>',
44
+ italic: '<i>',
45
+ underline: '<u>',
46
+ strikethrough: '<strikethrough>',
47
+ subscript: '<sub>',
48
+ superscript: '<sup>'
49
+ }
50
+ suffixes = {
51
+ bold: '</b>',
52
+ italic: '</i>',
53
+ underline: '</u>',
54
+ strikethrough: '</strikethrough>',
55
+ subscript: '</sub>',
56
+ superscript: '</sup>'
57
+ }
58
+ array.map do |hash|
59
+ prefix = ''
60
+ suffix = ''
61
+ hash[:styles]&.each do |style|
62
+ prefix += prefixes[style]
63
+ suffix = suffixes[style] + suffix
60
64
  end
61
65
 
62
66
  font = hash[:font] ? " name='#{hash[:font]}'" : nil
63
67
  size = hash[:size] ? " size='#{hash[:size]}'" : nil
64
- if hash[:character_spacing]
65
- character_spacing = " character_spacing='#{hash[:character_spacing]}'"
66
- else
67
- character_spacing = nil
68
- end
68
+ character_spacing =
69
+ if hash[:character_spacing]
70
+ " character_spacing='#{hash[:character_spacing]}'"
71
+ end
69
72
  if font || size || character_spacing
70
- prefix = prefix + "<font#{font}#{size}#{character_spacing}>"
71
- suffix = "</font>"
73
+ prefix += "<font#{font}#{size}#{character_spacing}>"
74
+ suffix = '</font>'
72
75
  end
73
76
 
74
77
  link = hash[:link] ? " href='#{hash[:link]}'" : nil
75
78
  anchor = hash[:anchor] ? " anchor='#{hash[:anchor]}'" : nil
76
79
  if link || anchor
77
- prefix = prefix + "<link#{link}#{anchor}>"
78
- suffix = "</link>"
80
+ prefix += "<link#{link}#{anchor}>"
81
+ suffix = '</link>'
79
82
  end
80
83
 
81
84
  if hash[:color]
82
- if hash[:color].kind_of?(Array)
83
- prefix = prefix + "<color c='#{hash[:color][0]}'" +
84
- " m='#{hash[:color][1]}'" +
85
- " y='#{hash[:color][2]}'" +
86
- " k='#{hash[:color][3]}'>"
87
- else
88
- prefix = prefix + "<color rgb='#{hash[:color]}'>"
89
- end
90
- suffix = "</color>"
85
+ prefix +=
86
+ if hash[:color].is_a?(Array)
87
+ "<color c='#{hash[:color][0]}'" \
88
+ " m='#{hash[:color][1]}'" \
89
+ " y='#{hash[:color][2]}'" \
90
+ " k='#{hash[:color][3]}'>"
91
+ else
92
+ "<color rgb='#{hash[:color]}'>"
93
+ end
94
+ suffix = '</color>'
91
95
  end
92
96
 
93
- string = hash[:text].gsub("&", "&amp;").gsub(">", "&gt;").gsub("<", "&lt;")
97
+ string = hash[:text].gsub('&', '&amp;').gsub('>', '&gt;')
98
+ .gsub('<', '&lt;')
94
99
  prefix + string + suffix
95
100
  end.join
96
101
  end
@@ -103,11 +108,13 @@ module Prawn
103
108
  array.each do |hash|
104
109
  hash[:text].scan(scan_pattern).each do |string|
105
110
  if string == "\n"
106
- paragraph << hash.dup.merge(:text => "\n") if previous_string == "\n"
111
+ if previous_string == "\n"
112
+ paragraph << hash.dup.merge(text: "\n")
113
+ end
107
114
  paragraphs << paragraph unless paragraph.empty?
108
115
  paragraph = []
109
116
  else
110
- paragraph << hash.dup.merge(:text => string)
117
+ paragraph << hash.dup.merge(text: string)
111
118
  end
112
119
  previous_string = string
113
120
  end
@@ -116,8 +123,6 @@ module Prawn
116
123
  paragraphs
117
124
  end
118
125
 
119
- private
120
-
121
126
  def self.array_from_tokens(tokens)
122
127
  array = []
123
128
  styles = []
@@ -129,93 +134,110 @@ module Prawn
129
134
  sizes = []
130
135
  character_spacings = []
131
136
 
132
- while token = tokens.shift
137
+ tokens.each do |token|
133
138
  case token
134
- when "<b>", "<strong>"
139
+ when '<b>', '<strong>'
135
140
  styles << :bold
136
- when "<i>", "<em>"
141
+ when '<i>', '<em>'
137
142
  styles << :italic
138
- when "<u>"
143
+ when '<u>'
139
144
  styles << :underline
140
- when "<strikethrough>"
145
+ when '<strikethrough>'
141
146
  styles << :strikethrough
142
- when "<sub>"
147
+ when '<sub>'
143
148
  styles << :subscript
144
- when "<sup>"
149
+ when '<sup>'
145
150
  styles << :superscript
146
- when "</b>", "</strong>"
151
+ when '</b>', '</strong>'
147
152
  styles.delete(:bold)
148
- when "</i>", "</em>"
153
+ when '</i>', '</em>'
149
154
  styles.delete(:italic)
150
- when "</u>"
155
+ when '</u>'
151
156
  styles.delete(:underline)
152
- when "</strikethrough>"
157
+ when '</strikethrough>'
153
158
  styles.delete(:strikethrough)
154
- when "</sub>"
159
+ when '</sub>'
155
160
  styles.delete(:subscript)
156
- when "</sup>"
161
+ when '</sup>'
157
162
  styles.delete(:superscript)
158
- when "</link>", "</a>"
163
+ when '</link>', '</a>'
159
164
  link = nil
160
165
  anchor = nil
161
166
  local = nil
162
- when "</color>"
167
+ when '</color>'
163
168
  colors.pop
164
- when "</font>"
169
+ when '</font>'
165
170
  fonts.pop
166
171
  sizes.pop
167
172
  character_spacings.pop
173
+ when /^<link[^>]*>$/, /^<a[^>]*>$/
174
+ matches = /href="([^"]*)"/.match(token) ||
175
+ /href='([^']*)'/.match(token)
176
+ link = matches[1] unless matches.nil?
177
+
178
+ matches = /anchor="([^"]*)"/.match(token) ||
179
+ /anchor='([^']*)'/.match(token)
180
+ anchor = matches[1] unless matches.nil?
181
+
182
+ matches = /local="([^"]*)"/.match(token) ||
183
+ /local='([^']*)'/.match(token)
184
+ local = matches[1] unless matches.nil?
185
+ when /^<color[^>]*>$/
186
+ matches = /rgb="#?([^"]*)"/.match(token) ||
187
+ /rgb='#?([^']*)'/.match(token)
188
+ colors << matches[1] if matches
189
+
190
+ match = /c="#?([^"]*)"/.match(token) ||
191
+ /c='#?([^']*)'/.match(token)
192
+ c = match[1].to_i unless match.nil?
193
+ match = /m="#?([^"]*)"/.match(token) ||
194
+ /m='#?([^']*)'/.match(token)
195
+ m = match[1].to_i unless match.nil?
196
+ match = /y="#?([^"]*)"/.match(token) ||
197
+ /y='#?([^']*)'/.match(token)
198
+ y = match[1].to_i unless match.nil?
199
+ match = /k="#?([^"]*)"/.match(token) ||
200
+ /k='#?([^']*)'/.match(token)
201
+ k = match[1].to_i unless match.nil?
202
+ colors << [c, m, y, k] if [c, m, y, k].all?
203
+
204
+ # intend to support rgb="#ffffff" or rgb='#ffffff',
205
+ # r="255" g="255" b="255" or r='255' g='255' b='255',
206
+ # and c="100" m="100" y="100" k="100" or
207
+ # c='100' m='100' y='100' k='100'
208
+ # color = { :rgb => "#ffffff" }
209
+ # color = { :r => 255, :g => 255, :b => 255 }
210
+ # color = { :c => 100, :m => 100, :y => 100, :k => 100 }
211
+ when /^<font[^>]*>$/
212
+ matches = /name="([^"]*)"/.match(token) ||
213
+ /name='([^']*)'/.match(token)
214
+ fonts << matches[1] unless matches.nil?
215
+
216
+ matches = /size="([^"]*)"/.match(token) ||
217
+ /size='([^']*)'/.match(token)
218
+ sizes << matches[1].to_f unless matches.nil?
219
+
220
+ matches = /character_spacing="([^"]*)"/.match(token) ||
221
+ /character_spacing='([^']*)'/.match(token)
222
+ character_spacings << matches[1].to_f unless matches.nil?
168
223
  else
169
- if token =~ /^<link[^>]*>$/ or token =~ /^<a[^>]*>$/
170
- matches = /href="([^"]*)"/.match(token) || /href='([^']*)'/.match(token)
171
- link = matches[1] unless matches.nil?
172
-
173
- matches = /anchor="([^"]*)"/.match(token) || /anchor='([^']*)'/.match(token)
174
- anchor = matches[1] unless matches.nil?
175
-
176
- matches = /local="([^"]*)"/.match(token) || /local='([^']*)'/.match(token)
177
- local = matches[1] unless matches.nil?
178
- elsif token =~ /^<color[^>]*>$/
179
- matches = /rgb="#?([^"]*)"/.match(token) || /rgb='#?([^']*)'/.match(token)
180
- colors << matches[1] if matches
181
-
182
- matches = /c="#?([^"]*)" +m="#?([^"]*)" +y="#?([^"]*)" +k="#?([^"]*)"/.match(token) ||
183
- /c='#?([^']*)' +m='#?([^']*)' +y='#?([^']*)' +k='#?([^']*)'/.match(token)
184
- colors << [matches[1].to_i, matches[2].to_i, matches[3].to_i, matches[4].to_i] if matches
185
-
186
- # intend to support rgb="#ffffff" or rgb='#ffffff',
187
- # r="255" g="255" b="255" or r='255' g='255' b='255',
188
- # and c="100" m="100" y="100" k="100" or
189
- # c='100' m='100' y='100' k='100'
190
- # color = { :rgb => "#ffffff" }
191
- # color = { :r => 255, :g => 255, :b => 255 }
192
- # color = { :c => 100, :m => 100, :y => 100, :k => 100 }
193
- elsif token =~ /^<font[^>]*>$/
194
- matches = /name="([^"]*)"/.match(token) || /name='([^']*)'/.match(token)
195
- fonts << matches[1] unless matches.nil?
196
-
197
- matches = /size="([^"]*)"/.match(token) || /size='([^']*)'/.match(token)
198
- sizes << matches[1].to_f unless matches.nil?
199
-
200
- matches = /character_spacing="([^"]*)"/.match(token) || /character_spacing='([^']*)'/.match(token)
201
- character_spacings << matches[1].to_f unless matches.nil?
202
- else
203
- string = token.gsub("&lt;", "<").gsub("&gt;", ">").gsub("&amp;", "&")
204
- array << { :text => string,
205
- :styles => styles.dup,
206
- :color => colors.last,
207
- :local => local,
208
- :link => link,
209
- :anchor => anchor,
210
- :font => fonts.last,
211
- :size => sizes.last,
212
- :character_spacing => character_spacings.last }
213
- end
224
+ string = token.gsub('&lt;', '<').gsub('&gt;', '>')
225
+ .gsub('&amp;', '&')
226
+ array << {
227
+ text: string,
228
+ styles: styles.dup,
229
+ color: colors.last,
230
+ local: local,
231
+ link: link,
232
+ anchor: anchor,
233
+ font: fonts.last,
234
+ size: sizes.last,
235
+ character_spacing: character_spacings.last
236
+ }
214
237
  end
215
238
  end
216
239
  array
217
240
  end
218
-
219
241
  end
220
242
  end
221
243
  end
@@ -1,18 +1,29 @@
1
- require_relative "line_wrap"
2
- require_relative "arranger"
1
+ # frozen_string_literal: true
2
+
3
+ # wrap.rb: Handles text wrapping for for formatted text
4
+ #
5
+ # Contributed by Daniel Nelson
6
+ #
7
+ # This is free software. Please see the LICENSE and COPYING files for details.
8
+
9
+ require_relative 'line_wrap'
10
+ require_relative 'arranger'
3
11
 
4
12
  module Prawn
5
13
  module Text
6
14
  module Formatted #:nodoc:
7
- module Wrap #:nodoc:
15
+ # @private
8
16
 
9
- def initialize(array, options)
17
+ module Wrap #:nodoc:
18
+ def initialize(_array, options)
10
19
  @line_wrap = Prawn::Text::Formatted::LineWrap.new
11
- @arranger = Prawn::Text::Formatted::Arranger.new(@document,
12
- :kerning => options[:kerning])
20
+ @arranger = Prawn::Text::Formatted::Arranger.new(
21
+ @document,
22
+ kerning: options[:kerning]
23
+ )
24
+ @disable_wrap_by_char = options[:disable_wrap_by_char]
13
25
  end
14
26
 
15
-
16
27
  # See the developer documentation for PDF::Core::Text#wrap
17
28
  #
18
29
  # Formatted#wrap should set the following variables:
@@ -37,14 +48,17 @@ module Prawn
37
48
  initialize_wrap(array)
38
49
 
39
50
  stop = false
40
- while !stop
51
+ until stop
41
52
  # wrap before testing if enough height for this line because the
42
53
  # height of the highest fragment on this line will be used to
43
54
  # determine the line height
44
- @line_wrap.wrap_line(:document => @document,
45
- :kerning => @kerning,
46
- :width => available_width,
47
- :arranger => @arranger)
55
+ @line_wrap.wrap_line(
56
+ document: @document,
57
+ kerning: @kerning,
58
+ width: available_width,
59
+ arranger: @arranger,
60
+ disable_wrap_by_char: @disable_wrap_by_char
61
+ )
48
62
 
49
63
  if enough_height_for_this_line?
50
64
  move_baseline_down
@@ -68,34 +82,37 @@ module Prawn
68
82
  fragments_this_line = []
69
83
 
70
84
  word_spacing = word_spacing_for_this_line
71
- while fragment = @arranger.retrieve_fragment
85
+ @arranger.fragments.each do |fragment|
72
86
  fragment.word_spacing = word_spacing
73
87
  if fragment.text == "\n"
74
- printed_fragments << "\n" if @printed_lines.last == ""
88
+ printed_fragments << "\n" if @printed_lines.last == ''
75
89
  break
76
90
  end
77
91
  printed_fragments << fragment.text
78
92
  fragments_this_line << fragment
79
93
  end
94
+ @arranger.fragments.replace []
80
95
 
81
96
  accumulated_width = 0
82
97
  fragments_this_line.reverse! if @direction == :rtl
83
98
  fragments_this_line.each do |fragment_this_line|
84
99
  fragment_this_line.default_direction = @direction
85
- format_and_draw_fragment(fragment_this_line, accumulated_width,
86
- @line_wrap.width, word_spacing)
100
+ format_and_draw_fragment(
101
+ fragment_this_line,
102
+ accumulated_width,
103
+ @line_wrap.width,
104
+ word_spacing
105
+ )
87
106
  accumulated_width += fragment_this_line.width
88
107
  end
89
108
 
90
- if "".respond_to?(:force_encoding)
91
- printed_fragments.map! { |s| s.force_encoding("utf-8") }
92
- end
93
- @printed_lines << printed_fragments.join
109
+ @printed_lines << printed_fragments.map do |s|
110
+ s.dup.force_encoding(::Encoding::UTF_8)
111
+ end.join
94
112
  end
95
113
 
96
114
  def word_spacing_for_this_line
97
- if @align == :justify &&
98
- @line_wrap.space_count > 0 &&
115
+ if @align == :justify && @line_wrap.space_count.positive? &&
99
116
  !@line_wrap.paragraph_finished?
100
117
  (available_width - @line_wrap.width) / @line_wrap.space_count
101
118
  else
@@ -105,13 +122,14 @@ module Prawn
105
122
 
106
123
  def enough_height_for_this_line?
107
124
  @line_height = @arranger.max_line_height
108
- @descender = @arranger.max_descender
109
- @ascender = @arranger.max_ascender
110
- if @baseline_y == 0
111
- diff = @ascender + @descender
112
- else
113
- diff = @descender + @line_height + @leading
114
- end
125
+ @descender = @arranger.max_descender
126
+ @ascender = @arranger.max_ascender
127
+ diff =
128
+ if @baseline_y.zero?
129
+ @ascender + @descender
130
+ else
131
+ @descender + @line_height + @leading
132
+ end
115
133
  require_relatived_total_height = @baseline_y.abs + diff
116
134
  if require_relatived_total_height > @height + 0.0001
117
135
  # no room for the full height of this line
@@ -128,23 +146,25 @@ module Prawn
128
146
 
129
147
  # these values will depend on the maximum value within a given line
130
148
  @line_height = 0
131
- @descender = 0
132
- @ascender = 0
133
- @baseline_y = 0
149
+ @descender = 0
150
+ @ascender = 0
151
+ @baseline_y = 0
134
152
 
135
153
  @printed_lines = []
136
154
  @nothing_printed = true
137
155
  @everything_printed = false
138
156
  end
139
157
 
140
- def format_and_draw_fragment(fragment, accumulated_width,
141
- line_width, word_spacing)
158
+ def format_and_draw_fragment(fragment, accumulated_width, line_width, word_spacing)
142
159
  @arranger.apply_color_and_font_settings(fragment) do
143
- draw_fragment(fragment, accumulated_width,
144
- line_width, word_spacing)
160
+ draw_fragment(
161
+ fragment,
162
+ accumulated_width,
163
+ line_width,
164
+ word_spacing
165
+ )
145
166
  end
146
167
  end
147
-
148
168
  end
149
169
  end
150
170
  end
@@ -1,5 +1,7 @@
1
- require_relative "formatted/wrap"
1
+ # frozen_string_literal: true
2
2
 
3
- require_relative "formatted/box"
4
- require_relative "formatted/parser"
5
- require_relative "formatted/fragment"
3
+ require_relative 'formatted/wrap'
4
+
5
+ require_relative 'formatted/box'
6
+ require_relative 'formatted/parser'
7
+ require_relative 'formatted/fragment'