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
  # core/text/formatted/arranger.rb : Implements a data structure for 2-stage
4
4
  # processing of lines of formatted text
@@ -10,11 +10,32 @@
10
10
  module Prawn
11
11
  module Text
12
12
  module Formatted #:nodoc:
13
+ # @private
13
14
 
14
15
  class Arranger #:nodoc:
16
+ class NotFinalized < StandardError
17
+ DEFAULT_MESSAGE = 'Lines must be finalized'
18
+ MESSAGE_WITH_METHOD = 'Lines must be finalized before calling #%<method>s'
19
+
20
+ def initialize(message = DEFAULT_MESSAGE, method: nil)
21
+ if method && message == DEFAULT_MESSAGE
22
+ super format(MESSAGE_WITH_METHOD, method: method)
23
+ else
24
+ super message
25
+ end
26
+ end
27
+ end
28
+
29
+ class BadFontFamily < StandardError
30
+ def initialize(message = 'Bad font family')
31
+ super
32
+ end
33
+ end
34
+
15
35
  attr_reader :max_line_height
16
36
  attr_reader :max_descender
17
37
  attr_reader :max_ascender
38
+ attr_reader :finalized
18
39
  attr_accessor :consumed
19
40
 
20
41
  # The following present only for testing purposes
@@ -22,7 +43,7 @@ module Prawn
22
43
  attr_reader :fragments
23
44
  attr_reader :current_format_state
24
45
 
25
- def initialize(document, options={})
46
+ def initialize(document, options = {})
26
47
  @document = document
27
48
  @fragments = []
28
49
  @unconsumed = []
@@ -30,50 +51,55 @@ module Prawn
30
51
  end
31
52
 
32
53
  def space_count
33
- if @unfinalized_line
34
- raise "Lines must be finalized before calling #space_count"
54
+ unless finalized
55
+ raise NotFinalized.new(method: 'space_count')
35
56
  end
36
- @fragments.inject(0) do |sum, fragment|
57
+
58
+ @fragments.reduce(0) do |sum, fragment|
37
59
  sum + fragment.space_count
38
60
  end
39
61
  end
40
62
 
41
63
  def line_width
42
- if @unfinalized_line
43
- raise "Lines must be finalized before calling #line_width"
64
+ unless finalized
65
+ raise raise NotFinalized.new(method: 'line_width')
44
66
  end
45
- @fragments.inject(0) do |sum, fragment|
67
+
68
+ @fragments.reduce(0) do |sum, fragment|
46
69
  sum + fragment.width
47
70
  end
48
71
  end
49
72
 
50
73
  def line
51
- if @unfinalized_line
52
- raise "Lines must be finalized before calling #line"
74
+ unless finalized
75
+ raise NotFinalized.new(method: 'line')
53
76
  end
54
- @fragments.collect do |fragment|
55
- if ruby_18 { true }
56
- fragment.text
57
- else
58
- fragment.text.dup.force_encoding("utf-8")
59
- end
77
+
78
+ @fragments.map do |fragment|
79
+ fragment.text.dup.encode(::Encoding::UTF_8)
80
+ rescue ::Encoding::InvalidByteSequenceError,
81
+ ::Encoding::UndefinedConversionError
82
+ fragment.text.dup.force_encoding(::Encoding::UTF_8)
60
83
  end.join
61
84
  end
62
85
 
63
86
  def finalize_line
64
- @unfinalized_line = false
87
+ @finalized = true
88
+
65
89
  omit_trailing_whitespace_from_line_width
66
90
  @fragments = []
67
91
  @consumed.each do |hash|
68
92
  text = hash[:text]
69
93
  format_state = hash.dup
70
94
  format_state.delete(:text)
71
- fragment = Prawn::Text::Formatted::Fragment.new(text,
72
- format_state,
73
- @document)
95
+ fragment = Prawn::Text::Formatted::Fragment.new(
96
+ text,
97
+ format_state,
98
+ @document
99
+ )
74
100
  @fragments << fragment
75
- set_fragment_measurements(fragment)
76
- set_line_measurement_maximums(fragment)
101
+ self.fragment_measurements = fragment
102
+ self.line_measurement_maximums = fragment
77
103
  end
78
104
  end
79
105
 
@@ -82,13 +108,13 @@ module Prawn
82
108
  @unconsumed = []
83
109
  array.each do |hash|
84
110
  hash[:text].scan(/[^\n]+|\n/) do |line|
85
- @unconsumed << hash.merge(:text => line)
111
+ @unconsumed << hash.merge(text: line)
86
112
  end
87
113
  end
88
114
  end
89
115
 
90
116
  def initialize_line
91
- @unfinalized_line = true
117
+ @finalized = false
92
118
  @max_line_height = 0
93
119
  @max_descender = 0
94
120
  @max_ascender = 0
@@ -98,28 +124,30 @@ module Prawn
98
124
  end
99
125
 
100
126
  def finished?
101
- @unconsumed.length == 0
127
+ @unconsumed.empty?
102
128
  end
103
129
 
104
130
  def next_string
105
- unless @unfinalized_line
106
- raise "Lines must not be finalized when calling #next_string"
131
+ if finalized
132
+ raise NotFinalized.new(method: 'next_string')
107
133
  end
108
- hash = @unconsumed.shift
109
- if hash.nil?
110
- nil
111
- else
112
- @consumed << hash.dup
113
- @current_format_state = hash.dup
134
+
135
+ next_unconsumed_hash = @unconsumed.shift
136
+
137
+ if next_unconsumed_hash
138
+ @consumed << next_unconsumed_hash.dup
139
+ @current_format_state = next_unconsumed_hash.dup
114
140
  @current_format_state.delete(:text)
115
- hash[:text]
141
+
142
+ next_unconsumed_hash[:text]
116
143
  end
117
144
  end
118
145
 
119
146
  def preview_next_string
120
- hash = @unconsumed.first
121
- if hash.nil? then nil
122
- else hash[:text]
147
+ next_unconsumed_hash = @unconsumed.first
148
+
149
+ if next_unconsumed_hash
150
+ next_unconsumed_hash[:text]
123
151
  end
124
152
  end
125
153
 
@@ -137,26 +165,28 @@ module Prawn
137
165
  end
138
166
  end
139
167
 
140
- def apply_font_settings(fragment=nil, &block)
168
+ def apply_font_settings(fragment = nil, &block)
141
169
  if fragment.nil?
142
170
  font = current_format_state[:font]
143
171
  size = current_format_state[:size]
144
172
  character_spacing = current_format_state[:character_spacing] ||
145
- @document.character_spacing
173
+ @document.character_spacing
146
174
  styles = current_format_state[:styles]
147
- font_style = font_style(styles)
148
175
  else
149
176
  font = fragment.font
150
177
  size = fragment.size
151
178
  character_spacing = fragment.character_spacing
152
179
  styles = fragment.styles
153
- font_style = font_style(styles)
154
180
  end
181
+ font_style = font_style(styles)
155
182
 
156
183
  @document.character_spacing(character_spacing) do
157
184
  if font || font_style != :normal
158
- raise "Bad font family" unless @document.font.family
159
- @document.font(font || @document.font.family, :style => font_style) do
185
+ raise BadFontFamily unless @document.font.family
186
+
187
+ @document.font(
188
+ font || @document.font.family, style: font_style
189
+ ) do
160
190
  apply_font_size(size, styles, &block)
161
191
  end
162
192
  else
@@ -165,8 +195,9 @@ module Prawn
165
195
  end
166
196
  end
167
197
 
168
- def update_last_string(printed, unprinted, normalized_soft_hyphen=nil)
198
+ def update_last_string(printed, unprinted, normalized_soft_hyphen = nil)
169
199
  return if printed.nil?
200
+
170
201
  if printed.empty?
171
202
  @consumed.pop
172
203
  else
@@ -177,32 +208,34 @@ module Prawn
177
208
  end
178
209
 
179
210
  unless unprinted.empty?
180
- @unconsumed.unshift(@current_format_state.merge(:text => unprinted))
211
+ @unconsumed.unshift(@current_format_state.merge(text: unprinted))
181
212
  end
182
213
 
183
214
  load_previous_format_state if printed.empty?
184
215
  end
185
216
 
186
217
  def retrieve_fragment
187
- if @unfinalized_line
188
- raise "Lines must be finalized before fragments can be retrieved"
218
+ unless finalized
219
+ raise NotFinalized, 'Lines must be finalized before fragments can be retrieved'
189
220
  end
221
+
190
222
  @fragments.shift
191
223
  end
192
224
 
193
225
  def repack_unretrieved
194
226
  new_unconsumed = []
227
+ # rubocop: disable Lint/AssignmentInCondition
195
228
  while fragment = retrieve_fragment
229
+ # rubocop: enable Lint/AssignmentInCondition
196
230
  fragment.include_trailing_white_space!
197
- new_unconsumed << fragment.format_state.merge(:text => fragment.text)
231
+ new_unconsumed << fragment.format_state.merge(text: fragment.text)
198
232
  end
199
233
  @unconsumed = new_unconsumed.concat(@unconsumed)
200
234
  end
201
235
 
202
236
  def font_style(styles)
203
- if styles.nil?
204
- :normal
205
- elsif styles.include?(:bold) && styles.include?(:italic)
237
+ styles = Array(styles)
238
+ if styles.include?(:bold) && styles.include?(:italic)
206
239
  :bold_italic
207
240
  elsif styles.include?(:bold)
208
241
  :bold
@@ -225,19 +258,20 @@ module Prawn
225
258
  end
226
259
  end
227
260
 
228
- def apply_font_size(size, styles)
261
+ def apply_font_size(size, styles, &block)
229
262
  if subscript?(styles) || superscript?(styles)
230
263
  relative_size = 0.583
231
- if size.nil?
232
- size = @document.font_size * relative_size
233
- else
234
- size = size * relative_size
235
- end
264
+ size =
265
+ if size.nil?
266
+ @document.font_size * relative_size
267
+ else
268
+ size * relative_size
269
+ end
236
270
  end
237
271
  if size.nil?
238
272
  yield
239
273
  else
240
- @document.font_size(size) { yield }
274
+ @document.font_size(size, &block)
241
275
  end
242
276
  end
243
277
 
@@ -269,24 +303,33 @@ module Prawn
269
303
  end
270
304
  end
271
305
 
272
- def set_fragment_measurements(fragment)
306
+ def fragment_measurements=(fragment)
273
307
  apply_font_settings(fragment) do
274
- fragment.width = @document.width_of(fragment.text,
275
- :kerning => @kerning)
308
+ fragment.width = @document.width_of(
309
+ fragment.text,
310
+ kerning: @kerning
311
+ )
276
312
  fragment.line_height = @document.font.height
277
313
  fragment.descender = @document.font.descender
278
314
  fragment.ascender = @document.font.ascender
279
315
  end
280
316
  end
281
317
 
282
- def set_line_measurement_maximums(fragment)
283
- @max_line_height = [defined?(@max_line_height) && @max_line_height, fragment.line_height].compact.max
284
- @max_descender = [defined?(@max_descender) && @max_descender, fragment.descender].compact.max
285
- @max_ascender = [defined?(@max_ascender) && @max_ascender, fragment.ascender].compact.max
318
+ def line_measurement_maximums=(fragment)
319
+ @max_line_height = [
320
+ defined?(@max_line_height) && @max_line_height,
321
+ fragment.line_height
322
+ ].compact.max
323
+ @max_descender = [
324
+ defined?(@max_descender) && @max_descender,
325
+ fragment.descender
326
+ ].compact.max
327
+ @max_ascender = [
328
+ defined?(@max_ascender) && @max_ascender,
329
+ fragment.ascender
330
+ ].compact.max
286
331
  end
287
-
288
332
  end
289
-
290
333
  end
291
334
  end
292
335
  end