prawn 2.3.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/prawn/document/bounding_box.rb +223 -143
  4. data/lib/prawn/document/column_box.rb +61 -26
  5. data/lib/prawn/document/internals.rb +25 -16
  6. data/lib/prawn/document/span.rb +21 -18
  7. data/lib/prawn/document.rb +273 -182
  8. data/lib/prawn/encoding.rb +2 -5
  9. data/lib/prawn/errors.rb +23 -34
  10. data/lib/prawn/font.rb +254 -139
  11. data/lib/prawn/font_metric_cache.rb +18 -16
  12. data/lib/prawn/fonts/afm.rb +99 -57
  13. data/lib/prawn/fonts/dfont.rb +7 -1
  14. data/lib/prawn/fonts/otf.rb +4 -1
  15. data/lib/prawn/fonts/to_unicode_cmap.rb +151 -0
  16. data/lib/prawn/fonts/ttc.rb +7 -2
  17. data/lib/prawn/fonts/ttf.rb +345 -107
  18. data/lib/prawn/fonts.rb +14 -0
  19. data/lib/prawn/graphics/blend_mode.rb +25 -28
  20. data/lib/prawn/graphics/cap_style.rb +9 -12
  21. data/lib/prawn/graphics/color.rb +75 -50
  22. data/lib/prawn/graphics/dash.rb +45 -42
  23. data/lib/prawn/graphics/join_style.rb +18 -12
  24. data/lib/prawn/graphics/patterns.rb +239 -110
  25. data/lib/prawn/graphics/transformation.rb +51 -44
  26. data/lib/prawn/graphics/transparency.rb +16 -40
  27. data/lib/prawn/graphics.rb +370 -260
  28. data/lib/prawn/grid.rb +219 -57
  29. data/lib/prawn/image_handler.rb +27 -10
  30. data/lib/prawn/images/image.rb +8 -10
  31. data/lib/prawn/images/jpg.rb +46 -20
  32. data/lib/prawn/images/png.rb +94 -42
  33. data/lib/prawn/images.rb +70 -81
  34. data/lib/prawn/measurement_extensions.rb +39 -8
  35. data/lib/prawn/measurements.rb +60 -5
  36. data/lib/prawn/outline.rb +120 -113
  37. data/lib/prawn/repeater.rb +52 -36
  38. data/lib/prawn/security/arcfour.rb +4 -4
  39. data/lib/prawn/security.rb +106 -98
  40. data/lib/prawn/soft_mask.rb +42 -30
  41. data/lib/prawn/stamp.rb +38 -42
  42. data/lib/prawn/text/box.rb +156 -105
  43. data/lib/prawn/text/formatted/arranger.rb +121 -41
  44. data/lib/prawn/text/formatted/box.rb +239 -163
  45. data/lib/prawn/text/formatted/fragment.rb +130 -14
  46. data/lib/prawn/text/formatted/line_wrap.rb +49 -38
  47. data/lib/prawn/text/formatted/parser.rb +116 -74
  48. data/lib/prawn/text/formatted/wrap.rb +25 -26
  49. data/lib/prawn/text/formatted.rb +75 -0
  50. data/lib/prawn/text.rb +456 -211
  51. data/lib/prawn/transformation_stack.rb +29 -10
  52. data/lib/prawn/utilities.rb +13 -13
  53. data/lib/prawn/version.rb +2 -1
  54. data/lib/prawn/view.rb +69 -54
  55. data/lib/prawn.rb +24 -18
  56. data.tar.gz.sig +0 -0
  57. metadata +55 -262
  58. metadata.gz.sig +3 -4
  59. data/.yardopts +0 -10
  60. data/Gemfile +0 -5
  61. data/Rakefile +0 -54
  62. data/manual/absolute_position.pdf +0 -0
  63. data/manual/basic_concepts/adding_pages.rb +0 -26
  64. data/manual/basic_concepts/basic_concepts.rb +0 -43
  65. data/manual/basic_concepts/creation.rb +0 -38
  66. data/manual/basic_concepts/cursor.rb +0 -32
  67. data/manual/basic_concepts/measurement.rb +0 -24
  68. data/manual/basic_concepts/origin.rb +0 -37
  69. data/manual/basic_concepts/other_cursor_helpers.rb +0 -39
  70. data/manual/basic_concepts/view.rb +0 -48
  71. data/manual/bounding_box/bounding_box.rb +0 -41
  72. data/manual/bounding_box/bounds.rb +0 -48
  73. data/manual/bounding_box/canvas.rb +0 -23
  74. data/manual/bounding_box/creation.rb +0 -22
  75. data/manual/bounding_box/indentation.rb +0 -45
  76. data/manual/bounding_box/nesting.rb +0 -52
  77. data/manual/bounding_box/russian_boxes.rb +0 -40
  78. data/manual/bounding_box/stretchy.rb +0 -29
  79. data/manual/contents.rb +0 -35
  80. data/manual/cover.rb +0 -43
  81. data/manual/document_and_page_options/background.rb +0 -25
  82. data/manual/document_and_page_options/document_and_page_options.rb +0 -34
  83. data/manual/document_and_page_options/metadata.rb +0 -25
  84. data/manual/document_and_page_options/page_margins.rb +0 -36
  85. data/manual/document_and_page_options/page_size.rb +0 -34
  86. data/manual/document_and_page_options/print_scaling.rb +0 -22
  87. data/manual/example_helper.rb +0 -8
  88. data/manual/graphics/blend_mode.rb +0 -52
  89. data/manual/graphics/circle_and_ellipse.rb +0 -21
  90. data/manual/graphics/color.rb +0 -22
  91. data/manual/graphics/common_lines.rb +0 -29
  92. data/manual/graphics/fill_and_stroke.rb +0 -41
  93. data/manual/graphics/fill_rules.rb +0 -37
  94. data/manual/graphics/gradients.rb +0 -43
  95. data/manual/graphics/graphics.rb +0 -64
  96. data/manual/graphics/helper.rb +0 -27
  97. data/manual/graphics/line_width.rb +0 -36
  98. data/manual/graphics/lines_and_curves.rb +0 -40
  99. data/manual/graphics/polygon.rb +0 -27
  100. data/manual/graphics/rectangle.rb +0 -20
  101. data/manual/graphics/rotate.rb +0 -25
  102. data/manual/graphics/scale.rb +0 -42
  103. data/manual/graphics/soft_masks.rb +0 -44
  104. data/manual/graphics/stroke_cap.rb +0 -30
  105. data/manual/graphics/stroke_dash.rb +0 -47
  106. data/manual/graphics/stroke_join.rb +0 -29
  107. data/manual/graphics/translate.rb +0 -28
  108. data/manual/graphics/transparency.rb +0 -33
  109. data/manual/how_to_read_this_manual.rb +0 -39
  110. data/manual/images/absolute_position.rb +0 -22
  111. data/manual/images/fit.rb +0 -20
  112. data/manual/images/horizontal.rb +0 -24
  113. data/manual/images/images.rb +0 -41
  114. data/manual/images/plain_image.rb +0 -17
  115. data/manual/images/scale.rb +0 -21
  116. data/manual/images/vertical.rb +0 -27
  117. data/manual/images/width_and_height.rb +0 -24
  118. data/manual/layout/boxes.rb +0 -26
  119. data/manual/layout/content.rb +0 -24
  120. data/manual/layout/layout.rb +0 -27
  121. data/manual/layout/simple_grid.rb +0 -22
  122. data/manual/outline/add_subsection_to.rb +0 -60
  123. data/manual/outline/insert_section_after.rb +0 -46
  124. data/manual/outline/outline.rb +0 -33
  125. data/manual/outline/sections_and_pages.rb +0 -66
  126. data/manual/repeatable_content/alternate_page_numbering.rb +0 -36
  127. data/manual/repeatable_content/page_numbering.rb +0 -55
  128. data/manual/repeatable_content/repeatable_content.rb +0 -35
  129. data/manual/repeatable_content/repeater.rb +0 -54
  130. data/manual/repeatable_content/stamp.rb +0 -40
  131. data/manual/security/encryption.rb +0 -28
  132. data/manual/security/permissions.rb +0 -41
  133. data/manual/security/security.rb +0 -28
  134. data/manual/table.rb +0 -16
  135. data/manual/text/alignment.rb +0 -43
  136. data/manual/text/color.rb +0 -24
  137. data/manual/text/column_box.rb +0 -30
  138. data/manual/text/fallback_fonts.rb +0 -41
  139. data/manual/text/font.rb +0 -40
  140. data/manual/text/font_size.rb +0 -44
  141. data/manual/text/font_style.rb +0 -22
  142. data/manual/text/formatted_callbacks.rb +0 -65
  143. data/manual/text/formatted_text.rb +0 -58
  144. data/manual/text/free_flowing_text.rb +0 -50
  145. data/manual/text/inline.rb +0 -40
  146. data/manual/text/kerning_and_character_spacing.rb +0 -38
  147. data/manual/text/leading.rb +0 -24
  148. data/manual/text/line_wrapping.rb +0 -60
  149. data/manual/text/paragraph_indentation.rb +0 -32
  150. data/manual/text/positioned_text.rb +0 -37
  151. data/manual/text/registering_families.rb +0 -51
  152. data/manual/text/rendering_and_color.rb +0 -36
  153. data/manual/text/right_to_left_text.rb +0 -54
  154. data/manual/text/rotation.rb +0 -47
  155. data/manual/text/single_usage.rb +0 -36
  156. data/manual/text/text.rb +0 -75
  157. data/manual/text/text_box_excess.rb +0 -35
  158. data/manual/text/text_box_extensions.rb +0 -48
  159. data/manual/text/text_box_overflow.rb +0 -49
  160. data/manual/text/utf8.rb +0 -27
  161. data/manual/text/win_ansi_charset.rb +0 -62
  162. data/prawn.gemspec +0 -57
  163. data/spec/data/curves.pdf +0 -66
  164. data/spec/extensions/encoding_helpers.rb +0 -11
  165. data/spec/prawn/document/bounding_box_spec.rb +0 -546
  166. data/spec/prawn/document/column_box_spec.rb +0 -75
  167. data/spec/prawn/document/security_spec.rb +0 -176
  168. data/spec/prawn/document_annotations_spec.rb +0 -76
  169. data/spec/prawn/document_destinations_spec.rb +0 -15
  170. data/spec/prawn/document_grid_spec.rb +0 -99
  171. data/spec/prawn/document_reference_spec.rb +0 -27
  172. data/spec/prawn/document_span_spec.rb +0 -36
  173. data/spec/prawn/document_spec.rb +0 -802
  174. data/spec/prawn/font_metric_cache_spec.rb +0 -54
  175. data/spec/prawn/font_spec.rb +0 -542
  176. data/spec/prawn/graphics/blend_mode_spec.rb +0 -63
  177. data/spec/prawn/graphics/transparency_spec.rb +0 -81
  178. data/spec/prawn/graphics_spec.rb +0 -837
  179. data/spec/prawn/graphics_stroke_styles_spec.rb +0 -229
  180. data/spec/prawn/image_handler_spec.rb +0 -53
  181. data/spec/prawn/images/jpg_spec.rb +0 -20
  182. data/spec/prawn/images/png_spec.rb +0 -283
  183. data/spec/prawn/images_spec.rb +0 -224
  184. data/spec/prawn/measurements_extensions_spec.rb +0 -24
  185. data/spec/prawn/outline_spec.rb +0 -412
  186. data/spec/prawn/repeater_spec.rb +0 -165
  187. data/spec/prawn/soft_mask_spec.rb +0 -74
  188. data/spec/prawn/stamp_spec.rb +0 -172
  189. data/spec/prawn/text/box_spec.rb +0 -1112
  190. data/spec/prawn/text/formatted/arranger_spec.rb +0 -466
  191. data/spec/prawn/text/formatted/box_spec.rb +0 -846
  192. data/spec/prawn/text/formatted/fragment_spec.rb +0 -343
  193. data/spec/prawn/text/formatted/line_wrap_spec.rb +0 -494
  194. data/spec/prawn/text/formatted/parser_spec.rb +0 -697
  195. data/spec/prawn/text_draw_text_spec.rb +0 -149
  196. data/spec/prawn/text_rendering_mode_spec.rb +0 -48
  197. data/spec/prawn/text_spacing_spec.rb +0 -95
  198. data/spec/prawn/text_spec.rb +0 -603
  199. data/spec/prawn/text_with_inline_formatting_spec.rb +0 -35
  200. data/spec/prawn/transformation_stack_spec.rb +0 -66
  201. data/spec/prawn/view_spec.rb +0 -63
  202. data/spec/prawn_manual_spec.rb +0 -35
  203. data/spec/spec_helper.rb +0 -48
@@ -1,11 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # text/formatted/fragment.rb : Implements information about a formatted fragment
4
- #
5
- # Copyright March 2010, Daniel Nelson. All Rights Reserved.
6
- #
7
- # This is free software. Please see the LICENSE and COPYING files for details.
8
-
9
3
  module Prawn
10
4
  module Text
11
5
  module Formatted
@@ -14,11 +8,19 @@ module Prawn
14
8
  #
15
9
  # @private
16
10
  class Fragment
17
- attr_reader :format_state, :text
11
+ attr_reader :format_state
12
+ attr_reader :text
18
13
  attr_writer :width
19
- attr_accessor :line_height, :descender, :ascender
20
- attr_accessor :word_spacing, :left, :baseline
21
-
14
+ attr_accessor :line_height
15
+ attr_accessor :descender
16
+ attr_accessor :ascender
17
+ attr_accessor :word_spacing
18
+ attr_accessor :left
19
+ attr_accessor :baseline
20
+
21
+ # @param text [String]
22
+ # @param format_state [Hash{Symbol => any}]
23
+ # @param document [Prawn::Documnt]
22
24
  def initialize(text, format_state, document)
23
25
  @format_state = format_state
24
26
  @document = document
@@ -30,35 +32,58 @@ module Prawn
30
32
  @text = process_text(@original_text)
31
33
  end
32
34
 
35
+ # Width of fragment.
36
+ #
37
+ # @return [Number]
33
38
  def width
34
39
  if @word_spacing.zero? then @width
35
- else @width + @word_spacing * space_count
40
+ else
41
+ @width + (@word_spacing * space_count)
36
42
  end
37
43
  end
38
44
 
45
+ # Height of fragment.
46
+ #
47
+ # @return [Number]
39
48
  def height
40
49
  top - bottom
41
50
  end
42
51
 
52
+ # Is this a subscript fragment?
53
+ #
54
+ # @return [Boolean]
43
55
  def subscript?
44
56
  styles.include?(:subscript)
45
57
  end
46
58
 
59
+ # Is this a superscript fragment?
60
+ #
61
+ # @return [Boolean]
47
62
  def superscript?
48
63
  styles.include?(:superscript)
49
64
  end
50
65
 
66
+ # Vertical offset of the fragment.
67
+ #
68
+ # @return [Number]
51
69
  def y_offset
52
70
  if subscript? then -descender
53
71
  elsif superscript? then 0.85 * ascender
54
- else 0
72
+ else
73
+ 0
55
74
  end
56
75
  end
57
76
 
77
+ # Fragment bounding box, relative to the containing bounding box.
78
+ #
79
+ # @return [Array(Number, Number, Number, Number)]
58
80
  def bounding_box
59
81
  [left, bottom, right, top]
60
82
  end
61
83
 
84
+ # Fragment bounding box, relative to the containing page.
85
+ #
86
+ # @return [Array(Number, Number, Number, Number)]
62
87
  def absolute_bounding_box
63
88
  box = bounding_box
64
89
  box[0] += @document.bounds.absolute_left
@@ -68,53 +93,90 @@ module Prawn
68
93
  box
69
94
  end
70
95
 
96
+ # Underline endpoints.
97
+ #
98
+ # @return [Array(Array(Number, Number), Array(Number, Number))]
71
99
  def underline_points
72
100
  y = baseline - 1.25
73
101
  [[left, y], [right, y]]
74
102
  end
75
103
 
104
+ # Strikethrough endpoints.
105
+ #
106
+ # @return [Array(Array(Number, Number), Array(Number, Number))]
76
107
  def strikethrough_points
77
- y = baseline + ascender * 0.3
108
+ y = baseline + (ascender * 0.3)
78
109
  [[left, y], [right, y]]
79
110
  end
80
111
 
112
+ # Fragment font styles.
113
+ #
114
+ # @return [Array<Symbol>]
81
115
  def styles
82
116
  @format_state[:styles] || []
83
117
  end
84
118
 
119
+ # Fragment link.
120
+ #
121
+ # @return [String, nil]
85
122
  def link
86
123
  @format_state[:link]
87
124
  end
88
125
 
126
+ # Anchor.
127
+ #
128
+ # @return [PDF::Core::Reference, Array, Hash]
89
129
  def anchor
90
130
  @format_state[:anchor]
91
131
  end
92
132
 
133
+ # Local destination.
134
+ #
135
+ # @return [String]
93
136
  def local
94
137
  @format_state[:local]
95
138
  end
96
139
 
140
+ # Fragment color.
141
+ #
142
+ # @return [Color]
97
143
  def color
98
144
  @format_state[:color]
99
145
  end
100
146
 
147
+ # Fragment font name.
148
+ #
149
+ # @return [String]
101
150
  def font
102
151
  @format_state[:font]
103
152
  end
104
153
 
154
+ # Font size.
155
+ #
156
+ # @return [Number]
105
157
  def size
106
158
  @format_state[:size]
107
159
  end
108
160
 
161
+ # Character spacing.
162
+ #
163
+ # @return [Number]
109
164
  def character_spacing
110
165
  @format_state[:character_spacing] ||
111
166
  @document.character_spacing
112
167
  end
113
168
 
169
+ # Text direction.
170
+ #
171
+ # @return [:ltr, :rtl]
114
172
  def direction
115
173
  @format_state[:direction]
116
174
  end
117
175
 
176
+ # Set default text direction.
177
+ #
178
+ # @param direction [:ltr, :rtl]
179
+ # @return [void]
118
180
  def default_direction=(direction)
119
181
  unless @format_state[:direction]
120
182
  @format_state[:direction] = direction
@@ -122,15 +184,24 @@ module Prawn
122
184
  end
123
185
  end
124
186
 
187
+ # Keep trailing spaces.
188
+ #
189
+ # @return [void]
125
190
  def include_trailing_white_space!
126
191
  @format_state.delete(:exclude_trailing_white_space)
127
192
  @text = process_text(@original_text)
128
193
  end
129
194
 
195
+ # Number of spaces in the text.
196
+ #
197
+ # @return [Integer]
130
198
  def space_count
131
199
  @text.count(' ')
132
200
  end
133
201
 
202
+ # Callbacks.
203
+ #
204
+ # @return [Array]
134
205
  def callback_objects
135
206
  callback = @format_state[:callback]
136
207
  if callback.nil?
@@ -142,62 +213,107 @@ module Prawn
142
213
  end
143
214
  end
144
215
 
216
+ # Horizontal coordinate of the right side of the fragment.
217
+ #
218
+ # @return [Number]
145
219
  def right
146
220
  left + width
147
221
  end
148
222
 
223
+ # Vertical coordinate of the top side of the fragment.
224
+ #
225
+ # @return [Number]
149
226
  def top
150
227
  baseline + ascender
151
228
  end
152
229
 
230
+ # Vertical coordinate of the bottom side of the fragment.
231
+ #
232
+ # @return [Number]
153
233
  def bottom
154
234
  baseline - descender
155
235
  end
156
236
 
237
+ # Coordinates of the top left corner of the fragment.
238
+ #
239
+ # @return [Array(Number, Number)]
157
240
  def top_left
158
241
  [left, top]
159
242
  end
160
243
 
244
+ # Coordinates of the top right corner of the fragment.
245
+ #
246
+ # @return [Array(Number, Number)]
161
247
  def top_right
162
248
  [right, top]
163
249
  end
164
250
 
251
+ # Coordinates of the bottom right corner of the fragment.
252
+ #
253
+ # @return [Array(Number, Number)]
165
254
  def bottom_right
166
255
  [right, bottom]
167
256
  end
168
257
 
258
+ # Coordinates of the bottom left corner of the fragment.
259
+ #
260
+ # @return [Array(Number, Number)]
169
261
  def bottom_left
170
262
  [left, bottom]
171
263
  end
172
264
 
265
+ # Absolute horizontal coordinate of the left side of the fragment.
266
+ #
267
+ # @return [Number]
173
268
  def absolute_left
174
269
  absolute_bounding_box[0]
175
270
  end
176
271
 
272
+ # Absolute horizontal coordinate of the right side of the fragment.
273
+ #
274
+ # @return [Number]
177
275
  def absolute_right
178
276
  absolute_bounding_box[2]
179
277
  end
180
278
 
279
+ # Absolute vertical coordinate of the top side of the fragment.
280
+ #
281
+ # @return [Number]
181
282
  def absolute_top
182
283
  absolute_bounding_box[3]
183
284
  end
184
285
 
286
+ # Absolute vertical coordinate of the bottom side of the fragment.
287
+ #
288
+ # @return [Number]
185
289
  def absolute_bottom
186
290
  absolute_bounding_box[1]
187
291
  end
188
292
 
293
+ # Absolute coordinates of the top left corner of the fragment.
294
+ #
295
+ # @return [Array(Number, Number)]
189
296
  def absolute_top_left
190
297
  [absolute_left, absolute_top]
191
298
  end
192
299
 
300
+ # Absolute coordinates of the top right corner of the fragment.
301
+ #
302
+ # @return [Array(Number, Number)]
193
303
  def absolute_top_right
194
304
  [absolute_right, absolute_top]
195
305
  end
196
306
 
307
+ # Absolute coordinates of the bottom left corner of the fragment.
308
+ #
309
+ # @return [Array(Number, Number)]
197
310
  def absolute_bottom_left
198
311
  [absolute_left, absolute_bottom]
199
312
  end
200
313
 
314
+ # Absolute coordinates of the bottom right corner of the fragment.
315
+ #
316
+ # @return [Array(Number, Number)]
201
317
  def absolute_bottom_right
202
318
  [absolute_right, absolute_bottom]
203
319
  end
@@ -211,7 +327,7 @@ module Prawn
211
327
  string = string.rstrip
212
328
 
213
329
  if soft_hyphens_need_processing?(string)
214
- string = process_soft_hyphens(string[0..-2]) + string[-1..-1]
330
+ string = process_soft_hyphens(string[0..-2]) + string[-1..]
215
331
  end
216
332
  elsif soft_hyphens_need_processing?(string)
217
333
  string = process_soft_hyphens(string)
@@ -1,40 +1,49 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # core/text/formatted/line_wrap.rb : Implements individual line wrapping of
4
- # formatted text
5
- #
6
- # Copyright February 2010, Daniel Nelson. All Rights Reserved.
7
- #
8
- # This is free software. Please see the LICENSE and COPYING files for details.
9
- #
10
-
11
3
  module Prawn
12
4
  module Text
13
- module Formatted #:nodoc:
5
+ module Formatted
6
+ # Implements individual line wrapping of formatted text.
7
+ #
14
8
  # @private
15
- class LineWrap #:nodoc:
16
- # The width of the last wrapped line
9
+ class LineWrap
10
+ # The width of the last wrapped line.
17
11
  #
12
+ # @return [Number]
18
13
  def width
19
14
  @accumulated_width || 0
20
15
  end
21
16
 
22
- # The number of spaces in the last wrapped line
17
+ # The number of spaces in the last wrapped line.
18
+ # @return [Integer]
23
19
  attr_reader :space_count
24
20
 
25
- # Whether this line is the last line in the paragraph
21
+ # Whether this line is the last line in the paragraph.
22
+ #
23
+ # @return [Boolean]
26
24
  def paragraph_finished?
27
25
  @newline_encountered || next_string_newline? || @arranger.finished?
28
26
  end
29
27
 
28
+ # Break the fragment into tokens.
29
+ #
30
+ # @param fragment [String]
31
+ # @return [Array<String>]
30
32
  def tokenize(fragment)
31
33
  fragment.scan(scan_pattern(fragment.encoding))
32
34
  end
33
35
 
34
- # Work in conjunction with the PDF::Formatted::Arranger
35
- # defined in the :arranger option to determine what formatted text
36
- # will fit within the width defined by the :width option
36
+ # Work in conjunction with the {Prawn::Text::Formatted::Arranger}
37
+ # defined in the `:arranger` option to determine what formatted text
38
+ # will fit within the width defined by the `:width` option.
37
39
  #
40
+ # @param options [Hash{Symbol => any}]
41
+ # @option options :document [Prawn::Document]
42
+ # @option options :kerning [Boolean]
43
+ # @option options :width [Number]
44
+ # @option options :disable_wrap_by_char [Boolean]
45
+ # @option options :arranger [Prawn::Text::Formatted::Arranger]
46
+ # @return [String]
38
47
  def wrap_line(options)
39
48
  initialize_line(options)
40
49
 
@@ -86,18 +95,20 @@ module Prawn
86
95
  # the line
87
96
  #
88
97
  def add_fragment_to_line(fragment)
89
- if fragment == ''
98
+ case fragment
99
+ when ''
90
100
  true
91
- elsif fragment == "\n"
101
+ when "\n"
92
102
  @newline_encountered = true
93
103
  false
94
104
  else
95
105
  tokenize(fragment).each do |segment|
96
- segment_width = if segment == zero_width_space(segment.encoding)
97
- 0
98
- else
99
- @document.width_of(segment, kerning: @kerning)
100
- end
106
+ segment_width =
107
+ if segment == zero_width_space(segment.encoding)
108
+ 0
109
+ else
110
+ @document.width_of(segment, kerning: @kerning)
111
+ end
101
112
 
102
113
  if @accumulated_width + segment_width <= @width
103
114
  @accumulated_width += segment_width
@@ -136,7 +147,7 @@ module Prawn
136
147
  "[^#{ebc}]+",
137
148
  "[#{ews}]+",
138
149
  "#{ehy}+[^#{ebc}]*",
139
- eshy.to_s
150
+ eshy.to_s,
140
151
  ]
141
152
 
142
153
  pattern = patterns
@@ -151,17 +162,18 @@ module Prawn
151
162
  # word breaking is needed
152
163
  #
153
164
  def word_division_scan_pattern(encoding = ::Encoding::UTF_8)
154
- common_whitespaces = ["\t", "\n", "\v", "\r", ' '].map do |c|
155
- c.encode(encoding)
156
- end
165
+ common_whitespaces =
166
+ ["\t", "\n", "\v", "\r", ' '].map { |c|
167
+ c.encode(encoding)
168
+ }
157
169
 
158
170
  Regexp.union(
159
171
  common_whitespaces +
160
172
  [
161
173
  zero_width_space(encoding),
162
174
  soft_hyphen(encoding),
163
- hyphen(encoding)
164
- ].compact
175
+ hyphen(encoding),
176
+ ].compact,
165
177
  )
166
178
  end
167
179
 
@@ -176,7 +188,7 @@ module Prawn
176
188
  [
177
189
  whitespace(encoding),
178
190
  soft_hyphen(encoding),
179
- hyphen(encoding)
191
+ hyphen(encoding),
180
192
  ].join('')
181
193
  end
182
194
 
@@ -227,7 +239,7 @@ module Prawn
227
239
  else
228
240
  update_output_based_on_last_fragment(
229
241
  fragment,
230
- soft_hyphen(fragment.encoding)
242
+ soft_hyphen(fragment.encoding),
231
243
  )
232
244
  update_line_status_based_on_last_output
233
245
  pull_preceding_fragment_to_join_this_one?(fragment)
@@ -248,18 +260,17 @@ module Prawn
248
260
  @arranger.update_last_string(
249
261
  @fragment_output,
250
262
  remaining_text,
251
- normalized_soft_hyphen
263
+ normalized_soft_hyphen,
252
264
  )
253
265
  end
254
266
 
255
267
  def pull_preceding_fragment_to_join_this_one?(current_fragment)
256
268
  if @fragment_output.empty? && !current_fragment.empty? &&
257
- @line_contains_more_than_one_word
258
- unless previous_fragment_ended_with_breakable? ||
259
- fragment_begins_with_breakable?(current_fragment)
260
- @fragment_output = @previous_fragment_output_without_last_word
261
- update_output_based_on_last_fragment(@previous_fragment)
262
- end
269
+ @line_contains_more_than_one_word &&
270
+ !(previous_fragment_ended_with_breakable? ||
271
+ fragment_begins_with_breakable?(current_fragment))
272
+ @fragment_output = @previous_fragment_output_without_last_word
273
+ update_output_based_on_last_fragment(@previous_fragment)
263
274
  end
264
275
  end
265
276