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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/prawn/document/bounding_box.rb +223 -143
- data/lib/prawn/document/column_box.rb +61 -26
- data/lib/prawn/document/internals.rb +25 -16
- data/lib/prawn/document/span.rb +21 -18
- data/lib/prawn/document.rb +273 -182
- data/lib/prawn/encoding.rb +2 -5
- data/lib/prawn/errors.rb +23 -34
- data/lib/prawn/font.rb +254 -139
- data/lib/prawn/font_metric_cache.rb +18 -16
- data/lib/prawn/fonts/afm.rb +99 -57
- data/lib/prawn/fonts/dfont.rb +7 -1
- data/lib/prawn/fonts/otf.rb +4 -1
- data/lib/prawn/fonts/to_unicode_cmap.rb +151 -0
- data/lib/prawn/fonts/ttc.rb +7 -2
- data/lib/prawn/fonts/ttf.rb +345 -107
- data/lib/prawn/fonts.rb +14 -0
- data/lib/prawn/graphics/blend_mode.rb +25 -28
- data/lib/prawn/graphics/cap_style.rb +9 -12
- data/lib/prawn/graphics/color.rb +75 -50
- data/lib/prawn/graphics/dash.rb +45 -42
- data/lib/prawn/graphics/join_style.rb +18 -12
- data/lib/prawn/graphics/patterns.rb +239 -110
- data/lib/prawn/graphics/transformation.rb +51 -44
- data/lib/prawn/graphics/transparency.rb +16 -40
- data/lib/prawn/graphics.rb +370 -260
- data/lib/prawn/grid.rb +219 -57
- data/lib/prawn/image_handler.rb +27 -10
- data/lib/prawn/images/image.rb +8 -10
- data/lib/prawn/images/jpg.rb +46 -20
- data/lib/prawn/images/png.rb +94 -42
- data/lib/prawn/images.rb +70 -81
- data/lib/prawn/measurement_extensions.rb +39 -8
- data/lib/prawn/measurements.rb +60 -5
- data/lib/prawn/outline.rb +120 -113
- data/lib/prawn/repeater.rb +52 -36
- data/lib/prawn/security/arcfour.rb +4 -4
- data/lib/prawn/security.rb +106 -98
- data/lib/prawn/soft_mask.rb +42 -30
- data/lib/prawn/stamp.rb +38 -42
- data/lib/prawn/text/box.rb +156 -105
- data/lib/prawn/text/formatted/arranger.rb +121 -41
- data/lib/prawn/text/formatted/box.rb +239 -163
- data/lib/prawn/text/formatted/fragment.rb +130 -14
- data/lib/prawn/text/formatted/line_wrap.rb +49 -38
- data/lib/prawn/text/formatted/parser.rb +116 -74
- data/lib/prawn/text/formatted/wrap.rb +25 -26
- data/lib/prawn/text/formatted.rb +75 -0
- data/lib/prawn/text.rb +456 -211
- data/lib/prawn/transformation_stack.rb +29 -10
- data/lib/prawn/utilities.rb +13 -13
- data/lib/prawn/version.rb +2 -1
- data/lib/prawn/view.rb +69 -54
- data/lib/prawn.rb +24 -18
- data.tar.gz.sig +0 -0
- metadata +55 -262
- metadata.gz.sig +3 -4
- data/.yardopts +0 -10
- data/Gemfile +0 -5
- data/Rakefile +0 -54
- data/manual/absolute_position.pdf +0 -0
- data/manual/basic_concepts/adding_pages.rb +0 -26
- data/manual/basic_concepts/basic_concepts.rb +0 -43
- data/manual/basic_concepts/creation.rb +0 -38
- data/manual/basic_concepts/cursor.rb +0 -32
- data/manual/basic_concepts/measurement.rb +0 -24
- data/manual/basic_concepts/origin.rb +0 -37
- data/manual/basic_concepts/other_cursor_helpers.rb +0 -39
- data/manual/basic_concepts/view.rb +0 -48
- data/manual/bounding_box/bounding_box.rb +0 -41
- data/manual/bounding_box/bounds.rb +0 -48
- data/manual/bounding_box/canvas.rb +0 -23
- data/manual/bounding_box/creation.rb +0 -22
- data/manual/bounding_box/indentation.rb +0 -45
- data/manual/bounding_box/nesting.rb +0 -52
- data/manual/bounding_box/russian_boxes.rb +0 -40
- data/manual/bounding_box/stretchy.rb +0 -29
- data/manual/contents.rb +0 -35
- data/manual/cover.rb +0 -43
- data/manual/document_and_page_options/background.rb +0 -25
- data/manual/document_and_page_options/document_and_page_options.rb +0 -34
- data/manual/document_and_page_options/metadata.rb +0 -25
- data/manual/document_and_page_options/page_margins.rb +0 -36
- data/manual/document_and_page_options/page_size.rb +0 -34
- data/manual/document_and_page_options/print_scaling.rb +0 -22
- data/manual/example_helper.rb +0 -8
- data/manual/graphics/blend_mode.rb +0 -52
- data/manual/graphics/circle_and_ellipse.rb +0 -21
- data/manual/graphics/color.rb +0 -22
- data/manual/graphics/common_lines.rb +0 -29
- data/manual/graphics/fill_and_stroke.rb +0 -41
- data/manual/graphics/fill_rules.rb +0 -37
- data/manual/graphics/gradients.rb +0 -43
- data/manual/graphics/graphics.rb +0 -64
- data/manual/graphics/helper.rb +0 -27
- data/manual/graphics/line_width.rb +0 -36
- data/manual/graphics/lines_and_curves.rb +0 -40
- data/manual/graphics/polygon.rb +0 -27
- data/manual/graphics/rectangle.rb +0 -20
- data/manual/graphics/rotate.rb +0 -25
- data/manual/graphics/scale.rb +0 -42
- data/manual/graphics/soft_masks.rb +0 -44
- data/manual/graphics/stroke_cap.rb +0 -30
- data/manual/graphics/stroke_dash.rb +0 -47
- data/manual/graphics/stroke_join.rb +0 -29
- data/manual/graphics/translate.rb +0 -28
- data/manual/graphics/transparency.rb +0 -33
- data/manual/how_to_read_this_manual.rb +0 -39
- data/manual/images/absolute_position.rb +0 -22
- data/manual/images/fit.rb +0 -20
- data/manual/images/horizontal.rb +0 -24
- data/manual/images/images.rb +0 -41
- data/manual/images/plain_image.rb +0 -17
- data/manual/images/scale.rb +0 -21
- data/manual/images/vertical.rb +0 -27
- data/manual/images/width_and_height.rb +0 -24
- data/manual/layout/boxes.rb +0 -26
- data/manual/layout/content.rb +0 -24
- data/manual/layout/layout.rb +0 -27
- data/manual/layout/simple_grid.rb +0 -22
- data/manual/outline/add_subsection_to.rb +0 -60
- data/manual/outline/insert_section_after.rb +0 -46
- data/manual/outline/outline.rb +0 -33
- data/manual/outline/sections_and_pages.rb +0 -66
- data/manual/repeatable_content/alternate_page_numbering.rb +0 -36
- data/manual/repeatable_content/page_numbering.rb +0 -55
- data/manual/repeatable_content/repeatable_content.rb +0 -35
- data/manual/repeatable_content/repeater.rb +0 -54
- data/manual/repeatable_content/stamp.rb +0 -40
- data/manual/security/encryption.rb +0 -28
- data/manual/security/permissions.rb +0 -41
- data/manual/security/security.rb +0 -28
- data/manual/table.rb +0 -16
- data/manual/text/alignment.rb +0 -43
- data/manual/text/color.rb +0 -24
- data/manual/text/column_box.rb +0 -30
- data/manual/text/fallback_fonts.rb +0 -41
- data/manual/text/font.rb +0 -40
- data/manual/text/font_size.rb +0 -44
- data/manual/text/font_style.rb +0 -22
- data/manual/text/formatted_callbacks.rb +0 -65
- data/manual/text/formatted_text.rb +0 -58
- data/manual/text/free_flowing_text.rb +0 -50
- data/manual/text/inline.rb +0 -40
- data/manual/text/kerning_and_character_spacing.rb +0 -38
- data/manual/text/leading.rb +0 -24
- data/manual/text/line_wrapping.rb +0 -60
- data/manual/text/paragraph_indentation.rb +0 -32
- data/manual/text/positioned_text.rb +0 -37
- data/manual/text/registering_families.rb +0 -51
- data/manual/text/rendering_and_color.rb +0 -36
- data/manual/text/right_to_left_text.rb +0 -54
- data/manual/text/rotation.rb +0 -47
- data/manual/text/single_usage.rb +0 -36
- data/manual/text/text.rb +0 -75
- data/manual/text/text_box_excess.rb +0 -35
- data/manual/text/text_box_extensions.rb +0 -48
- data/manual/text/text_box_overflow.rb +0 -49
- data/manual/text/utf8.rb +0 -27
- data/manual/text/win_ansi_charset.rb +0 -62
- data/prawn.gemspec +0 -57
- data/spec/data/curves.pdf +0 -66
- data/spec/extensions/encoding_helpers.rb +0 -11
- data/spec/prawn/document/bounding_box_spec.rb +0 -546
- data/spec/prawn/document/column_box_spec.rb +0 -75
- data/spec/prawn/document/security_spec.rb +0 -176
- data/spec/prawn/document_annotations_spec.rb +0 -76
- data/spec/prawn/document_destinations_spec.rb +0 -15
- data/spec/prawn/document_grid_spec.rb +0 -99
- data/spec/prawn/document_reference_spec.rb +0 -27
- data/spec/prawn/document_span_spec.rb +0 -36
- data/spec/prawn/document_spec.rb +0 -802
- data/spec/prawn/font_metric_cache_spec.rb +0 -54
- data/spec/prawn/font_spec.rb +0 -542
- data/spec/prawn/graphics/blend_mode_spec.rb +0 -63
- data/spec/prawn/graphics/transparency_spec.rb +0 -81
- data/spec/prawn/graphics_spec.rb +0 -837
- data/spec/prawn/graphics_stroke_styles_spec.rb +0 -229
- data/spec/prawn/image_handler_spec.rb +0 -53
- data/spec/prawn/images/jpg_spec.rb +0 -20
- data/spec/prawn/images/png_spec.rb +0 -283
- data/spec/prawn/images_spec.rb +0 -224
- data/spec/prawn/measurements_extensions_spec.rb +0 -24
- data/spec/prawn/outline_spec.rb +0 -412
- data/spec/prawn/repeater_spec.rb +0 -165
- data/spec/prawn/soft_mask_spec.rb +0 -74
- data/spec/prawn/stamp_spec.rb +0 -172
- data/spec/prawn/text/box_spec.rb +0 -1112
- data/spec/prawn/text/formatted/arranger_spec.rb +0 -466
- data/spec/prawn/text/formatted/box_spec.rb +0 -846
- data/spec/prawn/text/formatted/fragment_spec.rb +0 -343
- data/spec/prawn/text/formatted/line_wrap_spec.rb +0 -494
- data/spec/prawn/text/formatted/parser_spec.rb +0 -697
- data/spec/prawn/text_draw_text_spec.rb +0 -149
- data/spec/prawn/text_rendering_mode_spec.rb +0 -48
- data/spec/prawn/text_spacing_spec.rb +0 -95
- data/spec/prawn/text_spec.rb +0 -603
- data/spec/prawn/text_with_inline_formatting_spec.rb +0 -35
- data/spec/prawn/transformation_stack_spec.rb +0 -66
- data/spec/prawn/view_spec.rb +0 -63
- data/spec/prawn_manual_spec.rb +0 -35
- 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
|
11
|
+
attr_reader :format_state
|
12
|
+
attr_reader :text
|
18
13
|
attr_writer :width
|
19
|
-
attr_accessor :line_height
|
20
|
-
attr_accessor :
|
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
|
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
|
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
|
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
|
5
|
+
module Formatted
|
6
|
+
# Implements individual line wrapping of formatted text.
|
7
|
+
#
|
14
8
|
# @private
|
15
|
-
class LineWrap
|
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
|
35
|
-
# defined in the
|
36
|
-
# will fit within the width defined by the
|
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
|
-
|
98
|
+
case fragment
|
99
|
+
when ''
|
90
100
|
true
|
91
|
-
|
101
|
+
when "\n"
|
92
102
|
@newline_encountered = true
|
93
103
|
false
|
94
104
|
else
|
95
105
|
tokenize(fragment).each do |segment|
|
96
|
-
segment_width =
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
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 =
|
155
|
-
c
|
156
|
-
|
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
|
-
|
259
|
-
fragment_begins_with_breakable?(current_fragment)
|
260
|
-
|
261
|
-
|
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
|
|