prawn 1.1.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 (309) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/.yardopts +1 -0
  4. data/GPLv2 +20 -21
  5. data/Gemfile +3 -9
  6. data/Rakefile +9 -40
  7. data/lib/prawn/document/bounding_box.rb +54 -40
  8. data/lib/prawn/document/column_box.rb +8 -10
  9. data/lib/prawn/document/internals.rb +39 -146
  10. data/lib/prawn/document/span.rb +23 -17
  11. data/lib/prawn/document.rb +217 -182
  12. data/lib/prawn/encoding.rb +69 -101
  13. data/lib/prawn/errors.rb +47 -43
  14. data/lib/prawn/font.rb +124 -104
  15. data/lib/prawn/font_metric_cache.rb +23 -21
  16. data/lib/prawn/fonts/afm.rb +292 -0
  17. data/lib/prawn/{font → fonts}/dfont.rb +5 -12
  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 +140 -88
  21. data/lib/prawn/graphics/blend_mode.rb +65 -0
  22. data/lib/prawn/graphics/cap_style.rb +5 -5
  23. data/lib/prawn/graphics/color.rb +46 -44
  24. data/lib/prawn/graphics/dash.rb +27 -11
  25. data/lib/prawn/graphics/join_style.rb +11 -6
  26. data/lib/prawn/graphics/patterns.rb +220 -78
  27. data/lib/prawn/graphics/transformation.rb +20 -12
  28. data/lib/prawn/graphics/transparency.rb +20 -18
  29. data/lib/prawn/graphics.rb +153 -115
  30. data/lib/prawn/grid.rb +93 -50
  31. data/lib/prawn/image_handler.rb +4 -4
  32. data/lib/prawn/images/image.rb +3 -2
  33. data/lib/prawn/images/jpg.rb +31 -24
  34. data/lib/prawn/images/png.rb +101 -68
  35. data/lib/prawn/images.rb +64 -56
  36. data/lib/prawn/measurement_extensions.rb +10 -9
  37. data/lib/prawn/measurements.rb +20 -23
  38. data/lib/prawn/outline.rb +96 -75
  39. data/lib/prawn/repeater.rb +16 -16
  40. data/lib/prawn/security/arcfour.rb +2 -2
  41. data/lib/prawn/security.rb +100 -85
  42. data/lib/prawn/soft_mask.rb +37 -38
  43. data/lib/prawn/stamp.rb +28 -13
  44. data/lib/prawn/text/box.rb +24 -29
  45. data/lib/prawn/text/formatted/arranger.rb +108 -63
  46. data/lib/prawn/text/formatted/box.rb +187 -124
  47. data/lib/prawn/text/formatted/fragment.rb +24 -20
  48. data/lib/prawn/text/formatted/line_wrap.rb +133 -73
  49. data/lib/prawn/text/formatted/parser.rb +147 -127
  50. data/lib/prawn/text/formatted/wrap.rb +48 -35
  51. data/lib/prawn/text/formatted.rb +5 -5
  52. data/lib/prawn/text.rb +103 -68
  53. data/lib/prawn/transformation_stack.rb +44 -0
  54. data/lib/prawn/utilities.rb +10 -22
  55. data/lib/prawn/version.rb +5 -0
  56. data/lib/prawn/view.rb +101 -0
  57. data/lib/prawn.rb +39 -54
  58. data/manual/basic_concepts/adding_pages.rb +6 -7
  59. data/manual/basic_concepts/basic_concepts.rb +34 -25
  60. data/manual/basic_concepts/creation.rb +10 -11
  61. data/manual/basic_concepts/cursor.rb +4 -5
  62. data/manual/basic_concepts/measurement.rb +8 -9
  63. data/manual/basic_concepts/origin.rb +5 -6
  64. data/manual/basic_concepts/other_cursor_helpers.rb +11 -12
  65. data/manual/basic_concepts/view.rb +48 -0
  66. data/manual/bounding_box/bounding_box.rb +30 -28
  67. data/manual/bounding_box/bounds.rb +12 -13
  68. data/manual/bounding_box/canvas.rb +7 -8
  69. data/manual/bounding_box/creation.rb +6 -7
  70. data/manual/bounding_box/indentation.rb +14 -15
  71. data/manual/bounding_box/nesting.rb +25 -18
  72. data/manual/bounding_box/russian_boxes.rb +18 -18
  73. data/manual/bounding_box/stretchy.rb +12 -14
  74. data/manual/contents.rb +28 -22
  75. data/manual/cover.rb +33 -32
  76. data/manual/document_and_page_options/background.rb +15 -13
  77. data/manual/document_and_page_options/document_and_page_options.rb +24 -22
  78. data/manual/document_and_page_options/metadata.rb +20 -18
  79. data/manual/document_and_page_options/page_margins.rb +18 -20
  80. data/manual/document_and_page_options/page_size.rb +13 -13
  81. data/manual/document_and_page_options/print_scaling.rb +18 -15
  82. data/manual/example_helper.rb +5 -4
  83. data/manual/graphics/blend_mode.rb +52 -0
  84. data/manual/graphics/circle_and_ellipse.rb +4 -5
  85. data/manual/graphics/color.rb +7 -9
  86. data/manual/graphics/common_lines.rb +7 -8
  87. data/manual/graphics/fill_and_stroke.rb +5 -6
  88. data/manual/graphics/fill_rules.rb +12 -11
  89. data/manual/graphics/gradients.rb +27 -21
  90. data/manual/graphics/graphics.rb +46 -40
  91. data/manual/graphics/helper.rb +19 -9
  92. data/manual/graphics/line_width.rb +8 -7
  93. data/manual/graphics/lines_and_curves.rb +8 -9
  94. data/manual/graphics/polygon.rb +6 -8
  95. data/manual/graphics/rectangle.rb +4 -5
  96. data/manual/graphics/rotate.rb +6 -9
  97. data/manual/graphics/scale.rb +14 -13
  98. data/manual/graphics/soft_masks.rb +4 -6
  99. data/manual/graphics/stroke_cap.rb +7 -8
  100. data/manual/graphics/stroke_dash.rb +15 -16
  101. data/manual/graphics/stroke_join.rb +6 -7
  102. data/manual/graphics/translate.rb +10 -10
  103. data/manual/graphics/transparency.rb +7 -9
  104. data/manual/how_to_read_this_manual.rb +8 -9
  105. data/manual/images/absolute_position.rb +6 -7
  106. data/manual/images/fit.rb +7 -8
  107. data/manual/images/horizontal.rb +10 -11
  108. data/manual/images/images.rb +28 -27
  109. data/manual/images/plain_image.rb +5 -6
  110. data/manual/images/scale.rb +9 -10
  111. data/manual/images/vertical.rb +16 -14
  112. data/manual/images/width_and_height.rb +10 -11
  113. data/manual/layout/boxes.rb +10 -11
  114. data/manual/layout/content.rb +9 -10
  115. data/manual/layout/layout.rb +17 -18
  116. data/manual/layout/simple_grid.rb +6 -7
  117. data/manual/outline/add_subsection_to.rb +20 -21
  118. data/manual/outline/insert_section_after.rb +15 -16
  119. data/manual/outline/outline.rb +22 -21
  120. data/manual/outline/sections_and_pages.rb +17 -18
  121. data/manual/repeatable_content/alternate_page_numbering.rb +36 -0
  122. data/manual/repeatable_content/page_numbering.rb +17 -16
  123. data/manual/repeatable_content/repeatable_content.rb +27 -23
  124. data/manual/repeatable_content/repeater.rb +15 -16
  125. data/manual/repeatable_content/stamp.rb +14 -15
  126. data/manual/security/encryption.rb +8 -11
  127. data/manual/security/permissions.rb +20 -15
  128. data/manual/security/security.rb +18 -18
  129. data/manual/table.rb +16 -0
  130. data/manual/text/alignment.rb +16 -17
  131. data/manual/text/color.rb +12 -12
  132. data/manual/text/column_box.rb +9 -11
  133. data/manual/text/fallback_fonts.rb +25 -21
  134. data/manual/text/font.rb +11 -12
  135. data/manual/text/font_size.rb +13 -14
  136. data/manual/text/font_style.rb +10 -8
  137. data/manual/text/formatted_callbacks.rb +33 -23
  138. data/manual/text/formatted_text.rb +36 -25
  139. data/manual/text/free_flowing_text.rb +22 -23
  140. data/manual/text/inline.rb +18 -19
  141. data/manual/text/kerning_and_character_spacing.rb +14 -15
  142. data/manual/text/leading.rb +7 -8
  143. data/manual/text/line_wrapping.rb +37 -18
  144. data/manual/text/paragraph_indentation.rb +15 -10
  145. data/manual/text/positioned_text.rb +16 -17
  146. data/manual/text/registering_families.rb +27 -24
  147. data/manual/text/rendering_and_color.rb +9 -10
  148. data/manual/text/right_to_left_text.rb +30 -19
  149. data/manual/text/rotation.rb +33 -24
  150. data/manual/text/single_usage.rb +8 -9
  151. data/manual/text/text.rb +56 -54
  152. data/manual/text/text_box_excess.rb +20 -17
  153. data/manual/text/text_box_extensions.rb +18 -15
  154. data/manual/text/text_box_overflow.rb +24 -17
  155. data/manual/text/utf8.rb +12 -13
  156. data/manual/text/win_ansi_charset.rb +28 -25
  157. data/prawn.gemspec +45 -50
  158. data/spec/extensions/encoding_helpers.rb +3 -3
  159. data/spec/prawn/document/bounding_box_spec.rb +550 -0
  160. data/spec/prawn/document/column_box_spec.rb +75 -0
  161. data/spec/prawn/document/security_spec.rb +176 -0
  162. data/spec/prawn/document_annotations_spec.rb +76 -0
  163. data/spec/prawn/document_destinations_spec.rb +15 -0
  164. data/spec/prawn/document_grid_spec.rb +99 -0
  165. data/spec/prawn/document_reference_spec.rb +27 -0
  166. data/spec/prawn/document_span_spec.rb +44 -0
  167. data/spec/prawn/document_spec.rb +805 -0
  168. data/spec/prawn/font_metric_cache_spec.rb +54 -0
  169. data/spec/prawn/font_spec.rb +544 -0
  170. data/spec/prawn/graphics/blend_mode_spec.rb +63 -0
  171. data/spec/prawn/graphics/transparency_spec.rb +81 -0
  172. data/spec/prawn/graphics_spec.rb +872 -0
  173. data/spec/prawn/graphics_stroke_styles_spec.rb +229 -0
  174. data/spec/prawn/image_handler_spec.rb +53 -0
  175. data/spec/prawn/images/jpg_spec.rb +20 -0
  176. data/spec/prawn/images/png_spec.rb +283 -0
  177. data/spec/prawn/images_spec.rb +229 -0
  178. data/spec/prawn/measurements_extensions_spec.rb +24 -0
  179. data/spec/prawn/outline_spec.rb +512 -0
  180. data/spec/prawn/repeater_spec.rb +166 -0
  181. data/spec/prawn/soft_mask_spec.rb +74 -0
  182. data/spec/prawn/stamp_spec.rb +173 -0
  183. data/spec/prawn/text/box_spec.rb +1110 -0
  184. data/spec/prawn/text/formatted/arranger_spec.rb +466 -0
  185. data/spec/prawn/text/formatted/box_spec.rb +849 -0
  186. data/spec/prawn/text/formatted/fragment_spec.rb +343 -0
  187. data/spec/prawn/text/formatted/line_wrap_spec.rb +495 -0
  188. data/spec/prawn/text/formatted/parser_spec.rb +697 -0
  189. data/spec/prawn/text_draw_text_spec.rb +150 -0
  190. data/spec/prawn/text_rendering_mode_spec.rb +48 -0
  191. data/spec/prawn/text_spacing_spec.rb +95 -0
  192. data/spec/prawn/text_spec.rb +603 -0
  193. data/spec/prawn/text_with_inline_formatting_spec.rb +35 -0
  194. data/spec/prawn/transformation_stack_spec.rb +66 -0
  195. data/spec/prawn/view_spec.rb +63 -0
  196. data/spec/prawn_manual_spec.rb +35 -0
  197. data/spec/spec_helper.rb +19 -25
  198. data.tar.gz.sig +0 -0
  199. metadata +113 -276
  200. metadata.gz.sig +0 -0
  201. data/data/encodings/win_ansi.txt +0 -29
  202. data/data/images/16bit.alpha +0 -0
  203. data/data/images/16bit.color +0 -0
  204. data/data/images/16bit.png +0 -0
  205. data/data/images/arrow.png +0 -0
  206. data/data/images/arrow2.png +0 -0
  207. data/data/images/dice.alpha +0 -0
  208. data/data/images/dice.color +0 -0
  209. data/data/images/dice.png +0 -0
  210. data/data/images/dice_interlaced.png +0 -0
  211. data/data/images/fractal.jpg +0 -0
  212. data/data/images/indexed_color.dat +0 -0
  213. data/data/images/indexed_color.png +0 -0
  214. data/data/images/letterhead.jpg +0 -0
  215. data/data/images/license.md +0 -8
  216. data/data/images/page_white_text.alpha +0 -0
  217. data/data/images/page_white_text.color +0 -0
  218. data/data/images/page_white_text.png +0 -0
  219. data/data/images/pigs.jpg +0 -0
  220. data/data/images/prawn.png +0 -0
  221. data/data/images/ruport.png +0 -0
  222. data/data/images/ruport_data.dat +0 -0
  223. data/data/images/ruport_transparent.png +0 -0
  224. data/data/images/ruport_type0.png +0 -0
  225. data/data/images/stef.jpg +0 -0
  226. data/data/images/tru256.bmp +0 -0
  227. data/data/images/web-links.dat +0 -1
  228. data/data/images/web-links.png +0 -0
  229. data/data/pdfs/complex_template.pdf +0 -0
  230. data/data/pdfs/contains_ttf_font.pdf +0 -0
  231. data/data/pdfs/encrypted.pdf +0 -0
  232. data/data/pdfs/form.pdf +1 -819
  233. data/data/pdfs/hexagon.pdf +0 -61
  234. data/data/pdfs/indirect_reference.pdf +0 -86
  235. data/data/pdfs/multipage_template.pdf +0 -127
  236. data/data/pdfs/nested_pages.pdf +0 -118
  237. data/data/pdfs/page_without_mediabox.pdf +0 -193
  238. data/data/pdfs/resources_as_indirect_object.pdf +0 -83
  239. data/data/pdfs/two_hexagons.pdf +0 -90
  240. data/data/pdfs/version_1_6.pdf +0 -61
  241. data/data/shift_jis_text.txt +0 -1
  242. data/lib/prawn/document/graphics_state.rb +0 -73
  243. data/lib/prawn/font/afm.rb +0 -247
  244. data/lib/prawn/table/cell/image.rb +0 -69
  245. data/lib/prawn/table/cell/in_table.rb +0 -33
  246. data/lib/prawn/table/cell/span_dummy.rb +0 -93
  247. data/lib/prawn/table/cell/subtable.rb +0 -66
  248. data/lib/prawn/table/cell/text.rb +0 -154
  249. data/lib/prawn/table/cell.rb +0 -772
  250. data/lib/prawn/table/cells.rb +0 -255
  251. data/lib/prawn/table/column_width_calculator.rb +0 -182
  252. data/lib/prawn/table.rb +0 -644
  253. data/manual/table/basic_block.rb +0 -53
  254. data/manual/table/before_rendering_page.rb +0 -26
  255. data/manual/table/cell_border_lines.rb +0 -24
  256. data/manual/table/cell_borders_and_bg.rb +0 -31
  257. data/manual/table/cell_dimensions.rb +0 -30
  258. data/manual/table/cell_text.rb +0 -38
  259. data/manual/table/column_widths.rb +0 -30
  260. data/manual/table/content_and_subtables.rb +0 -39
  261. data/manual/table/creation.rb +0 -27
  262. data/manual/table/filtering.rb +0 -36
  263. data/manual/table/flow_and_header.rb +0 -17
  264. data/manual/table/image_cells.rb +0 -33
  265. data/manual/table/position.rb +0 -29
  266. data/manual/table/row_colors.rb +0 -20
  267. data/manual/table/span.rb +0 -30
  268. data/manual/table/style.rb +0 -22
  269. data/manual/table/table.rb +0 -52
  270. data/manual/table/width.rb +0 -27
  271. data/spec/acceptance/png.rb +0 -25
  272. data/spec/annotations_spec.rb +0 -74
  273. data/spec/bounding_box_spec.rb +0 -510
  274. data/spec/cell_spec.rb +0 -629
  275. data/spec/column_box_spec.rb +0 -65
  276. data/spec/destinations_spec.rb +0 -15
  277. data/spec/document_spec.rb +0 -730
  278. data/spec/extensions/mocha.rb +0 -46
  279. data/spec/font_metric_cache_spec.rb +0 -52
  280. data/spec/font_spec.rb +0 -449
  281. data/spec/formatted_text_arranger_spec.rb +0 -421
  282. data/spec/formatted_text_box_spec.rb +0 -639
  283. data/spec/formatted_text_fragment_spec.rb +0 -298
  284. data/spec/graphics_spec.rb +0 -669
  285. data/spec/grid_spec.rb +0 -96
  286. data/spec/image_handler_spec.rb +0 -54
  287. data/spec/images_spec.rb +0 -153
  288. data/spec/inline_formatted_text_parser_spec.rb +0 -564
  289. data/spec/jpg_spec.rb +0 -25
  290. data/spec/line_wrap_spec.rb +0 -344
  291. data/spec/measurement_units_spec.rb +0 -25
  292. data/spec/outline_spec.rb +0 -430
  293. data/spec/png_spec.rb +0 -237
  294. data/spec/reference_spec.rb +0 -25
  295. data/spec/repeater_spec.rb +0 -160
  296. data/spec/security_spec.rb +0 -158
  297. data/spec/soft_mask_spec.rb +0 -79
  298. data/spec/span_spec.rb +0 -44
  299. data/spec/stamp_spec.rb +0 -160
  300. data/spec/stroke_styles_spec.rb +0 -211
  301. data/spec/table/span_dummy_spec.rb +0 -17
  302. data/spec/table_spec.rb +0 -1527
  303. data/spec/text_at_spec.rb +0 -115
  304. data/spec/text_box_spec.rb +0 -1034
  305. data/spec/text_rendering_mode_spec.rb +0 -45
  306. data/spec/text_spacing_spec.rb +0 -93
  307. data/spec/text_spec.rb +0 -437
  308. data/spec/text_with_inline_formatting_spec.rb +0 -35
  309. data/spec/transparency_spec.rb +0 -91
@@ -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,88 +11,91 @@
11
11
  module Prawn
12
12
  module Text
13
13
  module Formatted
14
-
15
14
  class Parser
16
15
  # @group Extension API
17
16
 
18
- PARSER_REGEX = 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
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
35
35
 
36
- def self.format(string, *args)
37
- tokens = string.gsub(/<br\s*\/?>/, "\n").scan(PARSER_REGEX)
38
- 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)
39
39
  end
40
40
 
41
41
  def self.to_string(array)
42
- prefixes = { :bold => "<b>",
43
- :italic => "<i>",
44
- :underline => "<u>",
45
- :strikethrough => "<strikethrough>",
46
- :subscript => "<sub>",
47
- :superscript => "<sup>" }
48
- suffixes = { :bold => "</b>",
49
- :italic => "</i>",
50
- :underline => "</u>",
51
- :strikethrough => "</strikethrough>",
52
- :subscript => "</sub>",
53
- :superscript => "</sup>" }
54
- array.collect do |hash|
55
- prefix = ""
56
- suffix = ""
57
- if hash[:styles]
58
- hash[:styles].each do |style|
59
- prefix = prefix + prefixes[style]
60
- suffix = suffixes[style] + suffix
61
- 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
62
64
  end
63
65
 
64
66
  font = hash[:font] ? " name='#{hash[:font]}'" : nil
65
67
  size = hash[:size] ? " size='#{hash[:size]}'" : nil
66
- if hash[:character_spacing]
67
- character_spacing = " character_spacing='#{hash[:character_spacing]}'"
68
- else
69
- character_spacing = nil
70
- end
68
+ character_spacing =
69
+ if hash[:character_spacing]
70
+ " character_spacing='#{hash[:character_spacing]}'"
71
+ end
71
72
  if font || size || character_spacing
72
- prefix = prefix + "<font#{font}#{size}#{character_spacing}>"
73
- suffix = "</font>"
73
+ prefix += "<font#{font}#{size}#{character_spacing}>"
74
+ suffix = '</font>'
74
75
  end
75
76
 
76
77
  link = hash[:link] ? " href='#{hash[:link]}'" : nil
77
78
  anchor = hash[:anchor] ? " anchor='#{hash[:anchor]}'" : nil
78
79
  if link || anchor
79
- prefix = prefix + "<link#{link}#{anchor}>"
80
- suffix = "</link>"
80
+ prefix += "<link#{link}#{anchor}>"
81
+ suffix = '</link>'
81
82
  end
82
83
 
83
84
  if hash[:color]
84
- if hash[:color].kind_of?(Array)
85
- prefix = prefix + "<color c='#{hash[:color][0]}'" +
86
- " m='#{hash[:color][1]}'" +
87
- " y='#{hash[:color][2]}'" +
88
- " k='#{hash[:color][3]}'>"
89
- else
90
- prefix = prefix + "<color rgb='#{hash[:color]}'>"
91
- end
92
- 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>'
93
95
  end
94
96
 
95
- string = hash[:text].gsub("&", "&amp;").gsub(">", "&gt;").gsub("<", "&lt;")
97
+ string = hash[:text].gsub('&', '&amp;').gsub('>', '&gt;')
98
+ .gsub('<', '&lt;')
96
99
  prefix + string + suffix
97
100
  end.join
98
101
  end
@@ -105,11 +108,13 @@ module Prawn
105
108
  array.each do |hash|
106
109
  hash[:text].scan(scan_pattern).each do |string|
107
110
  if string == "\n"
108
- paragraph << hash.dup.merge(:text => "\n") if previous_string == "\n"
111
+ if previous_string == "\n"
112
+ paragraph << hash.dup.merge(text: "\n")
113
+ end
109
114
  paragraphs << paragraph unless paragraph.empty?
110
115
  paragraph = []
111
116
  else
112
- paragraph << hash.dup.merge(:text => string)
117
+ paragraph << hash.dup.merge(text: string)
113
118
  end
114
119
  previous_string = string
115
120
  end
@@ -118,8 +123,6 @@ module Prawn
118
123
  paragraphs
119
124
  end
120
125
 
121
- private
122
-
123
126
  def self.array_from_tokens(tokens)
124
127
  array = []
125
128
  styles = []
@@ -131,93 +134,110 @@ module Prawn
131
134
  sizes = []
132
135
  character_spacings = []
133
136
 
134
- while token = tokens.shift
137
+ tokens.each do |token|
135
138
  case token
136
- when "<b>", "<strong>"
139
+ when '<b>', '<strong>'
137
140
  styles << :bold
138
- when "<i>", "<em>"
141
+ when '<i>', '<em>'
139
142
  styles << :italic
140
- when "<u>"
143
+ when '<u>'
141
144
  styles << :underline
142
- when "<strikethrough>"
145
+ when '<strikethrough>'
143
146
  styles << :strikethrough
144
- when "<sub>"
147
+ when '<sub>'
145
148
  styles << :subscript
146
- when "<sup>"
149
+ when '<sup>'
147
150
  styles << :superscript
148
- when "</b>", "</strong>"
151
+ when '</b>', '</strong>'
149
152
  styles.delete(:bold)
150
- when "</i>", "</em>"
153
+ when '</i>', '</em>'
151
154
  styles.delete(:italic)
152
- when "</u>"
155
+ when '</u>'
153
156
  styles.delete(:underline)
154
- when "</strikethrough>"
157
+ when '</strikethrough>'
155
158
  styles.delete(:strikethrough)
156
- when "</sub>"
159
+ when '</sub>'
157
160
  styles.delete(:subscript)
158
- when "</sup>"
161
+ when '</sup>'
159
162
  styles.delete(:superscript)
160
- when "</link>", "</a>"
163
+ when '</link>', '</a>'
161
164
  link = nil
162
165
  anchor = nil
163
166
  local = nil
164
- when "</color>"
167
+ when '</color>'
165
168
  colors.pop
166
- when "</font>"
169
+ when '</font>'
167
170
  fonts.pop
168
171
  sizes.pop
169
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?
170
223
  else
171
- if token =~ /^<link[^>]*>$/ or token =~ /^<a[^>]*>$/
172
- matches = /href="([^"]*)"/.match(token) || /href='([^']*)'/.match(token)
173
- link = matches[1] unless matches.nil?
174
-
175
- matches = /anchor="([^"]*)"/.match(token) || /anchor='([^']*)'/.match(token)
176
- anchor = matches[1] unless matches.nil?
177
-
178
- matches = /local="([^"]*)"/.match(token) || /local='([^']*)'/.match(token)
179
- local = matches[1] unless matches.nil?
180
- elsif token =~ /^<color[^>]*>$/
181
- matches = /rgb="#?([^"]*)"/.match(token) || /rgb='#?([^']*)'/.match(token)
182
- colors << matches[1] if matches
183
-
184
- matches = /c="#?([^"]*)" +m="#?([^"]*)" +y="#?([^"]*)" +k="#?([^"]*)"/.match(token) ||
185
- /c='#?([^']*)' +m='#?([^']*)' +y='#?([^']*)' +k='#?([^']*)'/.match(token)
186
- colors << [matches[1].to_i, matches[2].to_i, matches[3].to_i, matches[4].to_i] if matches
187
-
188
- # intend to support rgb="#ffffff" or rgb='#ffffff',
189
- # r="255" g="255" b="255" or r='255' g='255' b='255',
190
- # and c="100" m="100" y="100" k="100" or
191
- # c='100' m='100' y='100' k='100'
192
- # color = { :rgb => "#ffffff" }
193
- # color = { :r => 255, :g => 255, :b => 255 }
194
- # color = { :c => 100, :m => 100, :y => 100, :k => 100 }
195
- elsif token =~ /^<font[^>]*>$/
196
- matches = /name="([^"]*)"/.match(token) || /name='([^']*)'/.match(token)
197
- fonts << matches[1] unless matches.nil?
198
-
199
- matches = /size="([^"]*)"/.match(token) || /size='([^']*)'/.match(token)
200
- sizes << matches[1].to_f unless matches.nil?
201
-
202
- matches = /character_spacing="([^"]*)"/.match(token) || /character_spacing='([^']*)'/.match(token)
203
- character_spacings << matches[1].to_f unless matches.nil?
204
- else
205
- string = token.gsub("&lt;", "<").gsub("&gt;", ">").gsub("&amp;", "&")
206
- array << { :text => string,
207
- :styles => styles.dup,
208
- :color => colors.last,
209
- :local => local,
210
- :link => link,
211
- :anchor => anchor,
212
- :font => fonts.last,
213
- :size => sizes.last,
214
- :character_spacing => character_spacings.last }
215
- 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
+ }
216
237
  end
217
238
  end
218
239
  array
219
240
  end
220
-
221
241
  end
222
242
  end
223
243
  end
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  # wrap.rb: Handles text wrapping for for formatted text
4
4
  #
@@ -6,8 +6,8 @@
6
6
  #
7
7
  # This is free software. Please see the LICENSE and COPYING files for details.
8
8
 
9
- require_relative "line_wrap"
10
- require_relative "arranger"
9
+ require_relative 'line_wrap'
10
+ require_relative 'arranger'
11
11
 
12
12
  module Prawn
13
13
  module Text
@@ -15,14 +15,15 @@ module Prawn
15
15
  # @private
16
16
 
17
17
  module Wrap #:nodoc:
18
-
19
- def initialize(array, options)
18
+ def initialize(_array, options)
20
19
  @line_wrap = Prawn::Text::Formatted::LineWrap.new
21
- @arranger = Prawn::Text::Formatted::Arranger.new(@document,
22
- :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]
23
25
  end
24
26
 
25
-
26
27
  # See the developer documentation for PDF::Core::Text#wrap
27
28
  #
28
29
  # Formatted#wrap should set the following variables:
@@ -47,14 +48,17 @@ module Prawn
47
48
  initialize_wrap(array)
48
49
 
49
50
  stop = false
50
- while !stop
51
+ until stop
51
52
  # wrap before testing if enough height for this line because the
52
53
  # height of the highest fragment on this line will be used to
53
54
  # determine the line height
54
- @line_wrap.wrap_line(:document => @document,
55
- :kerning => @kerning,
56
- :width => available_width,
57
- :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
+ )
58
62
 
59
63
  if enough_height_for_this_line?
60
64
  move_baseline_down
@@ -78,31 +82,37 @@ module Prawn
78
82
  fragments_this_line = []
79
83
 
80
84
  word_spacing = word_spacing_for_this_line
81
- while fragment = @arranger.retrieve_fragment
85
+ @arranger.fragments.each do |fragment|
82
86
  fragment.word_spacing = word_spacing
83
87
  if fragment.text == "\n"
84
- printed_fragments << "\n" if @printed_lines.last == ""
88
+ printed_fragments << "\n" if @printed_lines.last == ''
85
89
  break
86
90
  end
87
91
  printed_fragments << fragment.text
88
92
  fragments_this_line << fragment
89
93
  end
94
+ @arranger.fragments.replace []
90
95
 
91
96
  accumulated_width = 0
92
97
  fragments_this_line.reverse! if @direction == :rtl
93
98
  fragments_this_line.each do |fragment_this_line|
94
99
  fragment_this_line.default_direction = @direction
95
- format_and_draw_fragment(fragment_this_line, accumulated_width,
96
- @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
+ )
97
106
  accumulated_width += fragment_this_line.width
98
107
  end
99
108
 
100
- @printed_lines << printed_fragments.map { |s| s.force_encoding(::Encoding::UTF_8) }.join
109
+ @printed_lines << printed_fragments.map do |s|
110
+ s.dup.force_encoding(::Encoding::UTF_8)
111
+ end.join
101
112
  end
102
113
 
103
114
  def word_spacing_for_this_line
104
- if @align == :justify &&
105
- @line_wrap.space_count > 0 &&
115
+ if @align == :justify && @line_wrap.space_count.positive? &&
106
116
  !@line_wrap.paragraph_finished?
107
117
  (available_width - @line_wrap.width) / @line_wrap.space_count
108
118
  else
@@ -112,13 +122,14 @@ module Prawn
112
122
 
113
123
  def enough_height_for_this_line?
114
124
  @line_height = @arranger.max_line_height
115
- @descender = @arranger.max_descender
116
- @ascender = @arranger.max_ascender
117
- if @baseline_y == 0
118
- diff = @ascender + @descender
119
- else
120
- diff = @descender + @line_height + @leading
121
- 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
122
133
  require_relatived_total_height = @baseline_y.abs + diff
123
134
  if require_relatived_total_height > @height + 0.0001
124
135
  # no room for the full height of this line
@@ -135,23 +146,25 @@ module Prawn
135
146
 
136
147
  # these values will depend on the maximum value within a given line
137
148
  @line_height = 0
138
- @descender = 0
139
- @ascender = 0
140
- @baseline_y = 0
149
+ @descender = 0
150
+ @ascender = 0
151
+ @baseline_y = 0
141
152
 
142
153
  @printed_lines = []
143
154
  @nothing_printed = true
144
155
  @everything_printed = false
145
156
  end
146
157
 
147
- def format_and_draw_fragment(fragment, accumulated_width,
148
- line_width, word_spacing)
158
+ def format_and_draw_fragment(fragment, accumulated_width, line_width, word_spacing)
149
159
  @arranger.apply_color_and_font_settings(fragment) do
150
- draw_fragment(fragment, accumulated_width,
151
- line_width, word_spacing)
160
+ draw_fragment(
161
+ fragment,
162
+ accumulated_width,
163
+ line_width,
164
+ word_spacing
165
+ )
152
166
  end
153
167
  end
154
-
155
168
  end
156
169
  end
157
170
  end
@@ -1,7 +1,7 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- require_relative "formatted/wrap"
3
+ require_relative 'formatted/wrap'
4
4
 
5
- require_relative "formatted/box"
6
- require_relative "formatted/parser"
7
- require_relative "formatted/fragment"
5
+ require_relative 'formatted/box'
6
+ require_relative 'formatted/parser'
7
+ require_relative 'formatted/fragment'