prawn 2.0.1 → 2.0.2
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
- data/Rakefile +7 -5
- data/lib/prawn.rb +4 -4
- data/lib/prawn/document.rb +47 -46
- data/lib/prawn/document/bounding_box.rb +13 -19
- data/lib/prawn/document/column_box.rb +3 -5
- data/lib/prawn/document/internals.rb +0 -1
- data/lib/prawn/document/span.rb +12 -12
- data/lib/prawn/errors.rb +32 -33
- data/lib/prawn/font.rb +29 -36
- data/lib/prawn/font/afm.rb +20 -20
- data/lib/prawn/font/dfont.rb +0 -1
- data/lib/prawn/font/ttf.rb +30 -27
- data/lib/prawn/font_metric_cache.rb +4 -8
- data/lib/prawn/graphics.rb +37 -42
- data/lib/prawn/graphics/cap_style.rb +1 -1
- data/lib/prawn/graphics/color.rb +21 -23
- data/lib/prawn/graphics/dash.rb +5 -6
- data/lib/prawn/graphics/join_style.rb +1 -2
- data/lib/prawn/graphics/patterns.rb +25 -21
- data/lib/prawn/graphics/transformation.rb +4 -5
- data/lib/prawn/graphics/transparency.rb +6 -8
- data/lib/prawn/grid.rb +21 -14
- data/lib/prawn/image_handler.rb +2 -2
- data/lib/prawn/images.rb +29 -31
- data/lib/prawn/images/image.rb +1 -1
- data/lib/prawn/images/jpg.rb +10 -12
- data/lib/prawn/images/png.rb +13 -13
- data/lib/prawn/measurements.rb +7 -14
- data/lib/prawn/outline.rb +6 -6
- data/lib/prawn/repeater.rb +1 -5
- data/lib/prawn/security.rb +17 -25
- data/lib/prawn/security/arcfour.rb +1 -1
- data/lib/prawn/soft_mask.rb +11 -12
- data/lib/prawn/stamp.rb +16 -8
- data/lib/prawn/text.rb +23 -20
- data/lib/prawn/text/box.rb +3 -6
- data/lib/prawn/text/formatted/arranger.rb +9 -12
- data/lib/prawn/text/formatted/box.rb +23 -22
- data/lib/prawn/text/formatted/fragment.rb +0 -4
- data/lib/prawn/text/formatted/line_wrap.rb +13 -24
- data/lib/prawn/text/formatted/parser.rb +16 -20
- data/lib/prawn/text/formatted/wrap.rb +2 -7
- data/lib/prawn/utilities.rb +6 -3
- data/lib/prawn/version.rb +1 -1
- data/manual/basic_concepts/basic_concepts.rb +0 -2
- data/manual/basic_concepts/view.rb +1 -1
- data/manual/bounding_box/bounding_box.rb +0 -3
- data/manual/bounding_box/russian_boxes.rb +7 -8
- data/manual/bounding_box/stretchy.rb +0 -1
- data/manual/contents.rb +2 -2
- data/manual/cover.rb +11 -12
- data/manual/document_and_page_options/document_and_page_options.rb +2 -5
- data/manual/document_and_page_options/metadata.rb +10 -10
- data/manual/document_and_page_options/page_size.rb +0 -1
- data/manual/graphics/fill_rules.rb +5 -4
- data/manual/graphics/graphics.rb +0 -3
- data/manual/graphics/lines_and_curves.rb +1 -1
- data/manual/graphics/rotate.rb +0 -2
- data/manual/graphics/scale.rb +4 -2
- data/manual/graphics/soft_masks.rb +0 -1
- data/manual/graphics/stroke_cap.rb +1 -1
- data/manual/graphics/stroke_join.rb +1 -1
- data/manual/graphics/translate.rb +3 -3
- data/manual/graphics/transparency.rb +0 -1
- data/manual/how_to_read_this_manual.rb +0 -1
- data/manual/images/images.rb +0 -3
- data/manual/layout/boxes.rb +5 -5
- data/manual/layout/content.rb +2 -2
- data/manual/layout/layout.rb +0 -3
- data/manual/outline/outline.rb +0 -3
- data/manual/repeatable_content/page_numbering.rb +1 -1
- data/manual/repeatable_content/repeatable_content.rb +0 -3
- data/manual/repeatable_content/repeater.rb +6 -6
- data/manual/security/encryption.rb +0 -2
- data/manual/security/permissions.rb +0 -2
- data/manual/security/security.rb +0 -3
- data/manual/text/alignment.rb +3 -3
- data/manual/text/color.rb +0 -1
- data/manual/text/column_box.rb +0 -1
- data/manual/text/fallback_fonts.rb +2 -2
- data/manual/text/formatted_callbacks.rb +3 -2
- data/manual/text/paragraph_indentation.rb +2 -3
- data/manual/text/registering_families.rb +13 -9
- data/manual/text/rotation.rb +0 -1
- data/manual/text/text.rb +0 -3
- data/manual/text/text_box_overflow.rb +7 -5
- data/manual/text/utf8.rb +1 -1
- data/manual/text/win_ansi_charset.rb +2 -2
- data/prawn.gemspec +4 -4
- data/spec/acceptance/png.rb +6 -7
- data/spec/annotations_spec.rb +21 -28
- data/spec/bounding_box_spec.rb +100 -109
- data/spec/column_box_spec.rb +26 -32
- data/spec/destinations_spec.rb +2 -4
- data/spec/document_spec.rb +145 -151
- data/spec/extensions/mocha.rb +0 -1
- data/spec/font_metric_cache_spec.rb +7 -7
- data/spec/font_spec.rb +103 -102
- data/spec/formatted_text_arranger_spec.rb +76 -74
- data/spec/formatted_text_box_spec.rb +170 -159
- data/spec/formatted_text_fragment_spec.rb +57 -56
- data/spec/graphics_spec.rb +158 -175
- data/spec/grid_spec.rb +28 -29
- data/spec/image_handler_spec.rb +4 -5
- data/spec/images_spec.rb +50 -36
- data/spec/inline_formatted_text_parser_spec.rb +397 -393
- data/spec/jpg_spec.rb +4 -6
- data/spec/line_wrap_spec.rb +54 -55
- data/spec/measurement_units_spec.rb +12 -15
- data/spec/outline_spec.rb +77 -98
- data/spec/png_spec.rb +55 -65
- data/spec/reference_spec.rb +3 -3
- data/spec/repeater_spec.rb +20 -26
- data/spec/security_spec.rb +42 -49
- data/spec/soft_mask_spec.rb +4 -5
- data/spec/span_spec.rb +5 -6
- data/spec/spec_helper.rb +2 -4
- data/spec/stamp_spec.rb +41 -22
- data/spec/stroke_styles_spec.rb +36 -39
- data/spec/text_at_spec.rb +28 -29
- data/spec/text_box_spec.rb +160 -165
- data/spec/text_rendering_mode_spec.rb +9 -9
- data/spec/text_spacing_spec.rb +13 -13
- data/spec/text_spec.rb +116 -124
- data/spec/text_with_inline_formatting_spec.rb +5 -5
- data/spec/transparency_spec.rb +20 -20
- data/spec/view_spec.rb +0 -1
- metadata +7 -7
data/spec/jpg_spec.rb
CHANGED
@@ -7,7 +7,6 @@
|
|
7
7
|
require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
8
8
|
|
9
9
|
describe "When reading a JPEG file" do
|
10
|
-
|
11
10
|
before(:each) do
|
12
11
|
@filename = "#{Prawn::DATADIR}/images/pigs.jpg"
|
13
12
|
@img_data = File.open(@filename, "rb") { |f| f.read }
|
@@ -16,10 +15,9 @@ describe "When reading a JPEG file" do
|
|
16
15
|
it "should read the basic attributes correctly" do
|
17
16
|
jpg = Prawn::Images::JPG.new(@img_data)
|
18
17
|
|
19
|
-
jpg.width.
|
20
|
-
jpg.height.
|
21
|
-
jpg.bits.
|
22
|
-
jpg.channels.
|
18
|
+
expect(jpg.width).to eq(604)
|
19
|
+
expect(jpg.height).to eq(453)
|
20
|
+
expect(jpg.bits).to eq(8)
|
21
|
+
expect(jpg.channels).to eq(3)
|
23
22
|
end
|
24
23
|
end
|
25
|
-
|
data/spec/line_wrap_spec.rb
CHANGED
@@ -14,31 +14,31 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
14
14
|
{ :text => "goodbye ", :style => [:bold] }]
|
15
15
|
@arranger.format_array = array
|
16
16
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
17
|
-
|
18
|
-
|
19
|
-
string.
|
17
|
+
:width => 300,
|
18
|
+
:document => @pdf)
|
19
|
+
expect(string).to eq("hello world, goodbye")
|
20
20
|
end
|
21
|
-
it "should strip trailing spaces when a white-space-only fragment was"
|
22
|
-
" successfully pushed onto the end of a line but no other non-white"
|
21
|
+
it "should strip trailing spaces when a white-space-only fragment was" \
|
22
|
+
" successfully pushed onto the end of a line but no other non-white" \
|
23
23
|
" space fragment fits after it" do
|
24
24
|
array = [{ :text => "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " },
|
25
25
|
{ :text => " ", :style => [:bold] },
|
26
26
|
{ :text => " bbbbbbbbbbbbbbbbbbbbbbbbbbbb" }]
|
27
27
|
@arranger.format_array = array
|
28
28
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
29
|
-
|
30
|
-
|
31
|
-
string.
|
29
|
+
:width => 300,
|
30
|
+
:document => @pdf)
|
31
|
+
expect(string).to eq("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
|
32
32
|
end
|
33
33
|
it "should raise_error CannotFit if a too-small width is given" do
|
34
34
|
array = [{ :text => " hello world, " },
|
35
35
|
{ :text => "goodbye ", :style => [:bold] }]
|
36
36
|
@arranger.format_array = array
|
37
|
-
|
37
|
+
expect do
|
38
38
|
@line_wrap.wrap_line(:arranger => @arranger,
|
39
39
|
:width => 1,
|
40
40
|
:document => @pdf)
|
41
|
-
end.
|
41
|
+
end.to raise_error(Prawn::Errors::CannotFit)
|
42
42
|
end
|
43
43
|
|
44
44
|
it "should break on space" do
|
@@ -47,7 +47,7 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
47
47
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
48
48
|
:width => @one_word_width,
|
49
49
|
:document => @pdf)
|
50
|
-
string.
|
50
|
+
expect(string).to eq("hello")
|
51
51
|
end
|
52
52
|
|
53
53
|
it "should break on zero-width space" do
|
@@ -57,7 +57,7 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
57
57
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
58
58
|
:width => @one_word_width,
|
59
59
|
:document => @pdf)
|
60
|
-
string.
|
60
|
+
expect(string).to eq("hello")
|
61
61
|
end
|
62
62
|
|
63
63
|
it "should not display zero-width space" do
|
@@ -67,7 +67,7 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
67
67
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
68
68
|
:width => 300,
|
69
69
|
:document => @pdf)
|
70
|
-
string.
|
70
|
+
expect(string).to eq("helloworld")
|
71
71
|
end
|
72
72
|
|
73
73
|
it "should break on tab" do
|
@@ -76,7 +76,7 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
76
76
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
77
77
|
:width => @one_word_width,
|
78
78
|
:document => @pdf)
|
79
|
-
string.
|
79
|
+
expect(string).to eq("hello")
|
80
80
|
end
|
81
81
|
|
82
82
|
it "should break on hyphens" do
|
@@ -85,24 +85,24 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
85
85
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
86
86
|
:width => @one_word_width,
|
87
87
|
:document => @pdf)
|
88
|
-
string.
|
88
|
+
expect(string).to eq("hello-")
|
89
89
|
end
|
90
90
|
|
91
|
-
it "should not break after a hyphen that follows white space and"
|
91
|
+
it "should not break after a hyphen that follows white space and" \
|
92
92
|
"precedes a word" do
|
93
93
|
array = [{ :text => "hello -" }]
|
94
94
|
@arranger.format_array = array
|
95
95
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
96
96
|
:width => @one_word_width,
|
97
97
|
:document => @pdf)
|
98
|
-
string.
|
98
|
+
expect(string).to eq("hello -")
|
99
99
|
|
100
100
|
array = [{ :text => "hello -world" }]
|
101
101
|
@arranger.format_array = array
|
102
102
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
103
103
|
:width => @one_word_width,
|
104
104
|
:document => @pdf)
|
105
|
-
string.
|
105
|
+
expect(string).to eq("hello")
|
106
106
|
end
|
107
107
|
|
108
108
|
it "should break on a soft hyphen" do
|
@@ -114,7 +114,7 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
114
114
|
:document => @pdf)
|
115
115
|
expected = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}")
|
116
116
|
expected.force_encoding(Encoding::UTF_8)
|
117
|
-
string.
|
117
|
+
expect(string).to eq(expected)
|
118
118
|
|
119
119
|
@pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf")
|
120
120
|
@line_wrap = Prawn::Text::Formatted::LineWrap.new
|
@@ -125,16 +125,16 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
125
125
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
126
126
|
:width => @one_word_width,
|
127
127
|
:document => @pdf)
|
128
|
-
string.
|
128
|
+
expect(string).to eq("hello#{Prawn::Text::SHY}")
|
129
129
|
end
|
130
130
|
|
131
|
-
it "should ignore width of a soft-hyphen during adding fragments to line", :issue =>775 do
|
131
|
+
it "should ignore width of a soft-hyphen during adding fragments to line", :issue => 775 do
|
132
132
|
hyphen_string = "Hy#{Prawn::Text::SHY}phe#{Prawn::Text::SHY}nat#{Prawn::Text::SHY}ions "
|
133
133
|
string1 = @pdf.font.normalize_encoding(hyphen_string * 5)
|
134
134
|
string2 = @pdf.font.normalize_encoding("Hyphenations " * 3 + hyphen_string)
|
135
135
|
|
136
|
-
array1 = [{text: string1}]
|
137
|
-
array2 = [{text: string2}]
|
136
|
+
array1 = [{ text: string1 }]
|
137
|
+
array2 = [{ text: string2 }]
|
138
138
|
|
139
139
|
@arranger.format_array = array1
|
140
140
|
|
@@ -149,10 +149,10 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
149
149
|
res2 = @line_wrap.wrap_line(:arranger => @arranger,
|
150
150
|
:width => 300,
|
151
151
|
:document => @pdf)
|
152
|
-
res1.
|
152
|
+
expect(res1).to eq(res2)
|
153
153
|
end
|
154
154
|
|
155
|
-
it "should not display soft hyphens except at the end of a line "
|
155
|
+
it "should not display soft hyphens except at the end of a line " \
|
156
156
|
"for more than one element in format_array", :issue => 347 do
|
157
157
|
@pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf")
|
158
158
|
@line_wrap = Prawn::Text::Formatted::LineWrap.new
|
@@ -164,7 +164,7 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
164
164
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
165
165
|
:width => 300,
|
166
166
|
:document => @pdf)
|
167
|
-
string.
|
167
|
+
expect(string).to eq("helloworld hiearth")
|
168
168
|
end
|
169
169
|
|
170
170
|
it "should not break before a hard hyphen that follows a word" do
|
@@ -175,14 +175,14 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
175
175
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
176
176
|
:width => enough_width_for_hello_world,
|
177
177
|
:document => @pdf)
|
178
|
-
string.
|
178
|
+
expect(string).to eq("hello world")
|
179
179
|
|
180
180
|
array = [{ :text => "hello world-" }]
|
181
181
|
@arranger.format_array = array
|
182
182
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
183
183
|
:width => enough_width_for_hello_world,
|
184
184
|
:document => @pdf)
|
185
|
-
string.
|
185
|
+
expect(string).to eq("hello")
|
186
186
|
|
187
187
|
@pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf")
|
188
188
|
@line_wrap = Prawn::Text::Formatted::LineWrap.new
|
@@ -193,17 +193,17 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
193
193
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
194
194
|
:width => enough_width_for_hello_world,
|
195
195
|
:document => @pdf)
|
196
|
-
string.
|
196
|
+
expect(string).to eq("hello world")
|
197
197
|
|
198
198
|
array = [{ :text => "hello world-" }]
|
199
199
|
@arranger.format_array = array
|
200
200
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
201
201
|
:width => enough_width_for_hello_world,
|
202
202
|
:document => @pdf)
|
203
|
-
string.
|
203
|
+
expect(string).to eq("hello")
|
204
204
|
end
|
205
205
|
|
206
|
-
it "should not break after a hard hyphen that follows a soft hyphen and"
|
206
|
+
it "should not break after a hard hyphen that follows a soft hyphen and" \
|
207
207
|
"precedes a word" do
|
208
208
|
string = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}-")
|
209
209
|
array = [{ :text => string }]
|
@@ -211,7 +211,7 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
211
211
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
212
212
|
:width => @one_word_width,
|
213
213
|
:document => @pdf)
|
214
|
-
string.
|
214
|
+
expect(string).to eq("hello-")
|
215
215
|
|
216
216
|
string = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}-world")
|
217
217
|
array = [{ :text => string }]
|
@@ -221,7 +221,7 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
221
221
|
:document => @pdf)
|
222
222
|
expected = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}")
|
223
223
|
expected.force_encoding(Encoding::UTF_8)
|
224
|
-
string.
|
224
|
+
expect(string).to eq(expected)
|
225
225
|
|
226
226
|
@pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf")
|
227
227
|
@line_wrap = Prawn::Text::Formatted::LineWrap.new
|
@@ -232,7 +232,7 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
232
232
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
233
233
|
:width => @one_word_width,
|
234
234
|
:document => @pdf)
|
235
|
-
string.
|
235
|
+
expect(string).to eq("hello-")
|
236
236
|
|
237
237
|
string = "hello#{Prawn::Text::SHY}-world"
|
238
238
|
array = [{ :text => string }]
|
@@ -240,7 +240,7 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
240
240
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
241
241
|
:width => @one_word_width,
|
242
242
|
:document => @pdf)
|
243
|
-
string.
|
243
|
+
expect(string).to eq("hello#{Prawn::Text::SHY}")
|
244
244
|
end
|
245
245
|
|
246
246
|
it "should process UTF-8 chars", :unresolved, :issue => 693 do
|
@@ -251,7 +251,7 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
251
251
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
252
252
|
:width => 300,
|
253
253
|
:document => @pdf)
|
254
|
-
string.
|
254
|
+
expect(string).to eq("Test")
|
255
255
|
end
|
256
256
|
end
|
257
257
|
|
@@ -266,18 +266,18 @@ describe "Core::Text::Formatted::LineWrap#space_count" do
|
|
266
266
|
{ :text => "goodbye", :style => [:bold] }]
|
267
267
|
@arranger.format_array = array
|
268
268
|
@line_wrap.wrap_line(:arranger => @arranger,
|
269
|
-
|
270
|
-
|
271
|
-
@line_wrap.space_count.
|
269
|
+
:width => 300,
|
270
|
+
:document => @pdf)
|
271
|
+
expect(@line_wrap.space_count).to eq(2)
|
272
272
|
end
|
273
273
|
it "should exclude preceding and trailing spaces from the count" do
|
274
274
|
array = [{ :text => " hello world, " },
|
275
275
|
{ :text => "goodbye ", :style => [:bold] }]
|
276
276
|
@arranger.format_array = array
|
277
277
|
@line_wrap.wrap_line(:arranger => @arranger,
|
278
|
-
|
279
|
-
|
280
|
-
@line_wrap.space_count.
|
278
|
+
:width => 300,
|
279
|
+
:document => @pdf)
|
280
|
+
expect(@line_wrap.space_count).to eq(2)
|
281
281
|
end
|
282
282
|
end
|
283
283
|
|
@@ -296,22 +296,22 @@ describe "Core::Text::Formatted::LineWrap" do
|
|
296
296
|
@arranger.format_array = array
|
297
297
|
@line_wrap = Prawn::Text::Formatted::LineWrap.new
|
298
298
|
end
|
299
|
-
it "should only return an empty string if nothing fit or there"
|
299
|
+
it "should only return an empty string if nothing fit or there" \
|
300
300
|
"was nothing to wrap" do
|
301
301
|
8.times do
|
302
302
|
line = @line_wrap.wrap_line(:arranger => @arranger,
|
303
|
-
|
304
|
-
|
305
|
-
line.
|
303
|
+
:width => 200,
|
304
|
+
:document => @pdf)
|
305
|
+
expect(line).not_to be_empty
|
306
306
|
end
|
307
307
|
line = @line_wrap.wrap_line(:arranger => @arranger,
|
308
|
-
|
309
|
-
|
310
|
-
line.
|
308
|
+
:width => 200,
|
309
|
+
:document => @pdf)
|
310
|
+
expect(line).to be_empty
|
311
311
|
end
|
312
312
|
it "should tokenize a string using the scan_pattern" do
|
313
313
|
tokens = @line_wrap.tokenize("one two three")
|
314
|
-
tokens.length.
|
314
|
+
expect(tokens.length).to eq(6)
|
315
315
|
end
|
316
316
|
end
|
317
317
|
|
@@ -329,7 +329,7 @@ describe "Core::Text::Formatted::LineWrap#paragraph_finished?" do
|
|
329
329
|
:width => @one_word_width,
|
330
330
|
:document => @pdf)
|
331
331
|
|
332
|
-
@line_wrap.paragraph_finished
|
332
|
+
expect(@line_wrap.paragraph_finished?).to eq(false)
|
333
333
|
end
|
334
334
|
it "should be_true when the last printed line is the last fragment to print" do
|
335
335
|
array = [{ :text => "hello world" }]
|
@@ -341,7 +341,7 @@ describe "Core::Text::Formatted::LineWrap#paragraph_finished?" do
|
|
341
341
|
:width => @one_word_width,
|
342
342
|
:document => @pdf)
|
343
343
|
|
344
|
-
@line_wrap.paragraph_finished
|
344
|
+
expect(@line_wrap.paragraph_finished?).to eq(true)
|
345
345
|
end
|
346
346
|
it "should be_true when a newline exists on the current line" do
|
347
347
|
array = [{ :text => "hello\n world" }]
|
@@ -350,7 +350,7 @@ describe "Core::Text::Formatted::LineWrap#paragraph_finished?" do
|
|
350
350
|
:width => @one_word_width,
|
351
351
|
:document => @pdf)
|
352
352
|
|
353
|
-
@line_wrap.paragraph_finished
|
353
|
+
expect(@line_wrap.paragraph_finished?).to eq(true)
|
354
354
|
end
|
355
355
|
it "should be_true when a newline exists in the next fragment" do
|
356
356
|
array = [{ :text => "hello " },
|
@@ -361,7 +361,6 @@ describe "Core::Text::Formatted::LineWrap#paragraph_finished?" do
|
|
361
361
|
:width => @one_word_width,
|
362
362
|
:document => @pdf)
|
363
363
|
|
364
|
-
@line_wrap.paragraph_finished
|
364
|
+
expect(@line_wrap.paragraph_finished?).to eq(true)
|
365
365
|
end
|
366
366
|
end
|
367
|
-
|
@@ -4,22 +4,19 @@ require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
|
4
4
|
require "prawn/measurement_extensions"
|
5
5
|
|
6
6
|
describe "Measurement units" do
|
7
|
-
|
8
7
|
it "should convert units to PostScriptPoints" do
|
9
|
-
1.mm.
|
10
|
-
1.mm.
|
11
|
-
2.mm.
|
12
|
-
3.mm.
|
13
|
-
-3.mm.
|
14
|
-
1.cm.
|
15
|
-
1.dm.
|
16
|
-
1.m.
|
8
|
+
expect(1.mm).to be_within(0.000000001).of(2.834645669)
|
9
|
+
expect(1.mm).to eq(72 / 25.4)
|
10
|
+
expect(2.mm).to eq(2 * 72 / 25.4)
|
11
|
+
expect(3.mm).to eq(3 * 72 / 25.4)
|
12
|
+
expect(-3.mm).to eq(-3 * 72 / 25.4)
|
13
|
+
expect(1.cm).to eq(10 * 72 / 25.4)
|
14
|
+
expect(1.dm).to eq(100 * 72 / 25.4)
|
15
|
+
expect(1.m).to eq(1000 * 72 / 25.4)
|
17
16
|
|
18
|
-
1.in.
|
19
|
-
1.ft.
|
20
|
-
1.yd.
|
21
|
-
1.pt.
|
17
|
+
expect(1.in).to eq(72)
|
18
|
+
expect(1.ft).to eq(72 * 12)
|
19
|
+
expect(1.yd).to eq(72 * 12 * 3)
|
20
|
+
expect(1.pt).to eq(1)
|
22
21
|
end
|
23
|
-
|
24
22
|
end
|
25
|
-
|
data/spec/outline_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
|
3
3
|
|
4
4
|
describe "Outline" do
|
5
5
|
before(:each) do
|
6
|
-
@pdf = Prawn::Document.new
|
6
|
+
@pdf = Prawn::Document.new do
|
7
7
|
text "Page 1. This is the first Chapter. "
|
8
8
|
start_new_page
|
9
9
|
text "Page 2. More in the first Chapter. "
|
@@ -24,7 +24,7 @@ describe "Outline" do
|
|
24
24
|
if obj.is_a?(Hash) && obj[:Title]
|
25
25
|
title = obj[:Title].dup
|
26
26
|
title.force_encoding(Encoding::UTF_16LE)
|
27
|
-
title.valid_encoding
|
27
|
+
expect(title.valid_encoding?).to eq(true)
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
@@ -36,55 +36,50 @@ describe "Outline" do
|
|
36
36
|
end
|
37
37
|
|
38
38
|
it "should create a root outline dictionary item" do
|
39
|
-
@outline_root.
|
39
|
+
expect(@outline_root).not_to be_nil
|
40
40
|
end
|
41
41
|
|
42
42
|
it "should set the first and last top items of the root outline dictionary item" do
|
43
|
-
referenced_object(@outline_root[:First]).
|
44
|
-
referenced_object(@outline_root[:Last]).
|
43
|
+
expect(referenced_object(@outline_root[:First])).to eq(@section_1)
|
44
|
+
expect(referenced_object(@outline_root[:Last])).to eq(@section_1)
|
45
45
|
end
|
46
46
|
|
47
47
|
describe "#create_outline_item" do
|
48
48
|
it "should create outline items for each section and page" do
|
49
|
-
[@section_1, @page_1, @page_2].each {|item| item.
|
49
|
+
[@section_1, @page_1, @page_2].each { |item| expect(item).not_to be_nil }
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
53
|
describe "#set_relations, #set_variables_for_block, and #reset_parent" do
|
54
54
|
it "should link sibling items" do
|
55
|
-
referenced_object(@page_1[:Next]).
|
56
|
-
referenced_object(@page_2[:Prev]).
|
55
|
+
expect(referenced_object(@page_1[:Next])).to eq(@page_2)
|
56
|
+
expect(referenced_object(@page_2[:Prev])).to eq(@page_1)
|
57
57
|
end
|
58
58
|
|
59
59
|
it "should link child items to parent item" do
|
60
|
-
[@page_1, @page_2].each {|page| referenced_object(page[:Parent]).
|
60
|
+
[@page_1, @page_2].each { |page| expect(referenced_object(page[:Parent])).to eq(@section_1) }
|
61
61
|
end
|
62
62
|
|
63
63
|
it "should set the first and last child items for parent item" do
|
64
|
-
referenced_object(@section_1[:First]).
|
65
|
-
referenced_object(@section_1[:Last]).
|
64
|
+
expect(referenced_object(@section_1[:First])).to eq(@page_1)
|
65
|
+
expect(referenced_object(@section_1[:Last])).to eq(@page_2)
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
69
|
describe "#increase_count" do
|
70
|
-
|
71
70
|
it "should add the count of all descendant items" do
|
72
|
-
@outline_root[:Count].
|
73
|
-
@section_1[:Count].abs.
|
74
|
-
@page_1[:Count].
|
75
|
-
@page_2[:Count].
|
71
|
+
expect(@outline_root[:Count]).to eq(3)
|
72
|
+
expect(@section_1[:Count].abs).to eq(2)
|
73
|
+
expect(@page_1[:Count]).to eq(0)
|
74
|
+
expect(@page_2[:Count]).to eq(0)
|
76
75
|
end
|
77
|
-
|
78
76
|
end
|
79
77
|
|
80
78
|
describe "closed option" do
|
81
|
-
|
82
79
|
it "should set the item's integer count to negative" do
|
83
|
-
@section_1[:Count].
|
80
|
+
expect(@section_1[:Count]).to eq(-2)
|
84
81
|
end
|
85
|
-
|
86
82
|
end
|
87
|
-
|
88
83
|
end
|
89
84
|
|
90
85
|
describe "adding a custom destination" do
|
@@ -100,13 +95,12 @@ describe "Outline" do
|
|
100
95
|
end
|
101
96
|
|
102
97
|
it "should create an outline item" do
|
103
|
-
@custom_dest.
|
98
|
+
expect(@custom_dest).not_to be_nil
|
104
99
|
end
|
105
100
|
|
106
101
|
it "should reference the custom destination" do
|
107
|
-
referenced_object(@custom_dest[:Dest].first).
|
102
|
+
expect(referenced_object(@custom_dest[:Dest].first)).to eq(referenced_object(@pages.last))
|
108
103
|
end
|
109
|
-
|
110
104
|
end
|
111
105
|
|
112
106
|
describe "addding a section later with outline#section" do
|
@@ -122,31 +116,29 @@ describe "Outline" do
|
|
122
116
|
end
|
123
117
|
|
124
118
|
it "should add new outline items to document" do
|
125
|
-
[@section_2, @page_3].each { |item| item.
|
119
|
+
[@section_2, @page_3].each { |item| expect(item).not_to be_nil }
|
126
120
|
end
|
127
121
|
|
128
122
|
it "should reset the last items for root outline dictionary" do
|
129
|
-
referenced_object(@outline_root[:First]).
|
130
|
-
referenced_object(@outline_root[:Last]).
|
123
|
+
expect(referenced_object(@outline_root[:First])).to eq(@section_1)
|
124
|
+
expect(referenced_object(@outline_root[:Last])).to eq(@section_2)
|
131
125
|
end
|
132
126
|
|
133
127
|
it "should reset the next relation for the previous last top level item" do
|
134
|
-
referenced_object(@section_1[:Next]).
|
128
|
+
expect(referenced_object(@section_1[:Next])).to eq(@section_2)
|
135
129
|
end
|
136
130
|
|
137
131
|
it "should set the previous relation of the addded to section" do
|
138
|
-
referenced_object(@section_2[:Prev]).
|
132
|
+
expect(referenced_object(@section_2[:Prev])).to eq(@section_1)
|
139
133
|
end
|
140
134
|
|
141
135
|
it "should increase the count of root outline dictionary" do
|
142
|
-
@outline_root[:Count].
|
136
|
+
expect(@outline_root[:Count]).to eq(5)
|
143
137
|
end
|
144
|
-
|
145
138
|
end
|
146
139
|
|
147
140
|
describe "#outline.add_subsection_to" do
|
148
141
|
context "positioned last" do
|
149
|
-
|
150
142
|
before(:each) do
|
151
143
|
@pdf.start_new_page
|
152
144
|
@pdf.text "Page 3. An added subsection "
|
@@ -161,39 +153,36 @@ describe "Outline" do
|
|
161
153
|
end
|
162
154
|
|
163
155
|
it "should add new outline items to document" do
|
164
|
-
[@subsection, @added_page_3].each { |item| item.
|
156
|
+
[@subsection, @added_page_3].each { |item| expect(item).not_to be_nil }
|
165
157
|
end
|
166
158
|
|
167
159
|
it "should reset the last item for parent item dictionary" do
|
168
|
-
referenced_object(@section_1[:First]).
|
169
|
-
referenced_object(@section_1[:Last]).
|
160
|
+
expect(referenced_object(@section_1[:First])).to eq(@page_1)
|
161
|
+
expect(referenced_object(@section_1[:Last])).to eq(@subsection)
|
170
162
|
end
|
171
163
|
|
172
164
|
it "should set the prev relation for the new subsection to its parent's old last item" do
|
173
|
-
referenced_object(@subsection[:Prev]).
|
165
|
+
expect(referenced_object(@subsection[:Prev])).to eq(@page_2)
|
174
166
|
end
|
175
167
|
|
176
|
-
|
177
168
|
it "the subsection should become the next relation for its parent's old last item" do
|
178
|
-
|
179
|
-
|
169
|
+
expect(referenced_object(@page_2[:Next])).to eq(@subsection)
|
170
|
+
end
|
180
171
|
|
181
172
|
it "should set the first relation for the new subsection" do
|
182
|
-
referenced_object(@subsection[:First]).
|
173
|
+
expect(referenced_object(@subsection[:First])).to eq(@added_page_3)
|
183
174
|
end
|
184
175
|
|
185
176
|
it "should set the correct last relation of the added to section" do
|
186
|
-
referenced_object(@subsection[:Last]).
|
177
|
+
expect(referenced_object(@subsection[:Last])).to eq(@added_page_3)
|
187
178
|
end
|
188
179
|
|
189
180
|
it "should increase the count of root outline dictionary" do
|
190
|
-
@outline_root[:Count].
|
181
|
+
expect(@outline_root[:Count]).to eq(5)
|
191
182
|
end
|
192
|
-
|
193
183
|
end
|
194
184
|
|
195
185
|
context "positioned first" do
|
196
|
-
|
197
186
|
before(:each) do
|
198
187
|
@pdf.start_new_page
|
199
188
|
@pdf.text "Page 3. An added subsection "
|
@@ -208,38 +197,37 @@ describe "Outline" do
|
|
208
197
|
end
|
209
198
|
|
210
199
|
it "should add new outline items to document" do
|
211
|
-
[@subsection, @added_page_3].each { |item| item.
|
200
|
+
[@subsection, @added_page_3].each { |item| expect(item).not_to be_nil }
|
212
201
|
end
|
213
202
|
|
214
203
|
it "should reset the first item for parent item dictionary" do
|
215
|
-
referenced_object(@section_1[:First]).
|
216
|
-
referenced_object(@section_1[:Last]).
|
204
|
+
expect(referenced_object(@section_1[:First])).to eq(@subsection)
|
205
|
+
expect(referenced_object(@section_1[:Last])).to eq(@page_2)
|
217
206
|
end
|
218
207
|
|
219
208
|
it "should set the next relation for the new subsection to its parent's old first item" do
|
220
|
-
referenced_object(@subsection[:Next]).
|
209
|
+
expect(referenced_object(@subsection[:Next])).to eq(@page_1)
|
221
210
|
end
|
222
211
|
|
223
212
|
it "the subsection should become the prev relation for its parent's old first item" do
|
224
|
-
|
225
|
-
|
213
|
+
expect(referenced_object(@page_1[:Prev])).to eq(@subsection)
|
214
|
+
end
|
226
215
|
|
227
216
|
it "should set the first relation for the new subsection" do
|
228
|
-
referenced_object(@subsection[:First]).
|
217
|
+
expect(referenced_object(@subsection[:First])).to eq(@added_page_3)
|
229
218
|
end
|
230
219
|
|
231
220
|
it "should set the correct last relation of the added to section" do
|
232
|
-
referenced_object(@subsection[:Last]).
|
221
|
+
expect(referenced_object(@subsection[:Last])).to eq(@added_page_3)
|
233
222
|
end
|
234
223
|
|
235
224
|
it "should increase the count of root outline dictionary" do
|
236
|
-
@outline_root[:Count].
|
225
|
+
expect(@outline_root[:Count]).to eq(5)
|
237
226
|
end
|
238
|
-
|
239
227
|
end
|
240
228
|
|
241
229
|
it "should require an existing title" do
|
242
|
-
|
230
|
+
expect do
|
243
231
|
@pdf.go_to_page 1
|
244
232
|
@pdf.start_new_page
|
245
233
|
@pdf.text "Inserted Page"
|
@@ -249,7 +237,7 @@ describe "Outline" do
|
|
249
237
|
end
|
250
238
|
end
|
251
239
|
render_and_find_objects
|
252
|
-
end.
|
240
|
+
end.to raise_error(Prawn::Errors::UnknownOutlineTitle)
|
253
241
|
end
|
254
242
|
end
|
255
243
|
|
@@ -268,38 +256,35 @@ describe "Outline" do
|
|
268
256
|
|
269
257
|
it "should insert new outline items to document" do
|
270
258
|
render_and_find_objects
|
271
|
-
@inserted_page.
|
259
|
+
expect(@inserted_page).not_to be_nil
|
272
260
|
end
|
273
261
|
|
274
262
|
it "should adjust the count of all ancestors" do
|
275
263
|
render_and_find_objects
|
276
|
-
@outline_root[:Count].
|
277
|
-
@section_1[:Count].abs.
|
264
|
+
expect(@outline_root[:Count]).to eq(4)
|
265
|
+
expect(@section_1[:Count].abs).to eq(3)
|
278
266
|
end
|
279
267
|
|
280
268
|
describe "#adjust_relations" do
|
281
|
-
|
282
269
|
it "should reset the sibling relations of adjoining items to inserted item" do
|
283
270
|
render_and_find_objects
|
284
|
-
referenced_object(@page_1[:Next]).
|
285
|
-
referenced_object(@page_2[:Prev]).
|
271
|
+
expect(referenced_object(@page_1[:Next])).to eq(@inserted_page)
|
272
|
+
expect(referenced_object(@page_2[:Prev])).to eq(@inserted_page)
|
286
273
|
end
|
287
274
|
|
288
275
|
it "should set the sibling relation of added item to adjoining items" do
|
289
276
|
render_and_find_objects
|
290
|
-
referenced_object(@inserted_page[:Next]).
|
291
|
-
referenced_object(@inserted_page[:Prev]).
|
277
|
+
expect(referenced_object(@inserted_page[:Next])).to eq(@page_2)
|
278
|
+
expect(referenced_object(@inserted_page[:Prev])).to eq(@page_1)
|
292
279
|
end
|
293
280
|
|
294
281
|
it "should not affect the first and last relations of parent item" do
|
295
282
|
render_and_find_objects
|
296
|
-
referenced_object(@section_1[:First]).
|
297
|
-
referenced_object(@section_1[:Last]).
|
283
|
+
expect(referenced_object(@section_1[:First])).to eq(@page_1)
|
284
|
+
expect(referenced_object(@section_1[:Last])).to eq(@page_2)
|
298
285
|
end
|
299
|
-
|
300
286
|
end
|
301
287
|
|
302
|
-
|
303
288
|
context "when adding another section afterwards" do
|
304
289
|
it "should have reset the root position so that a new section is added at the end of root sections" do
|
305
290
|
@pdf.start_new_page
|
@@ -310,48 +295,43 @@ describe "Outline" do
|
|
310
295
|
end
|
311
296
|
end
|
312
297
|
render_and_find_objects
|
313
|
-
referenced_object(@outline_root[:Last]).
|
314
|
-
referenced_object(@section_1[:Next]).
|
298
|
+
expect(referenced_object(@outline_root[:Last])).to eq(@section_2)
|
299
|
+
expect(referenced_object(@section_1[:Next])).to eq(@section_2)
|
315
300
|
end
|
316
301
|
end
|
317
|
-
|
318
|
-
end
|
319
|
-
|
302
|
+
end
|
320
303
|
|
321
304
|
describe "inserting at the end of another section" do
|
322
|
-
|
323
305
|
before(:each) do
|
324
306
|
@pdf.go_to_page 2
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
307
|
+
@pdf.start_new_page
|
308
|
+
@pdf.text "Inserted Page"
|
309
|
+
@pdf.outline.update do
|
310
|
+
insert_section_after 'Page 2' do
|
311
|
+
page :destination => page_number, :title => "Inserted Page"
|
312
|
+
end
|
313
|
+
end
|
314
|
+
render_and_find_objects
|
333
315
|
end
|
334
316
|
|
335
317
|
describe "#adjust_relations" do
|
336
|
-
|
337
318
|
it "should reset the sibling relations of adjoining item to inserted item" do
|
338
|
-
|
319
|
+
expect(referenced_object(@page_2[:Next])).to eq(@inserted_page)
|
339
320
|
end
|
340
321
|
|
341
322
|
it "should set the sibling relation of added item to adjoining items" do
|
342
|
-
referenced_object(@inserted_page[:Next]).
|
343
|
-
referenced_object(@inserted_page[:Prev]).
|
323
|
+
expect(referenced_object(@inserted_page[:Next])).to be_nil
|
324
|
+
expect(referenced_object(@inserted_page[:Prev])).to eq(@page_2)
|
344
325
|
end
|
345
326
|
|
346
327
|
it "should adjust the last relation of parent item" do
|
347
|
-
referenced_object(@section_1[:Last]).
|
328
|
+
expect(referenced_object(@section_1[:Last])).to eq(@inserted_page)
|
348
329
|
end
|
349
|
-
|
350
330
|
end
|
351
331
|
end
|
352
332
|
|
353
333
|
it "should require an existing title" do
|
354
|
-
|
334
|
+
expect do
|
355
335
|
@pdf.go_to_page 1
|
356
336
|
@pdf.start_new_page
|
357
337
|
@pdf.text "Inserted Page"
|
@@ -361,28 +341,27 @@ describe "Outline" do
|
|
361
341
|
end
|
362
342
|
end
|
363
343
|
render_and_find_objects
|
364
|
-
end.
|
344
|
+
end.to raise_error(Prawn::Errors::UnknownOutlineTitle)
|
365
345
|
end
|
366
|
-
|
367
346
|
end
|
368
347
|
|
369
348
|
describe "#page" do
|
370
349
|
it "should require a title option to be set" do
|
371
|
-
|
372
|
-
@pdf = Prawn::Document.new
|
350
|
+
expect do
|
351
|
+
@pdf = Prawn::Document.new do
|
373
352
|
text "Page 1. This is the first Chapter. "
|
374
353
|
outline.define do
|
375
354
|
page :destination => 1, :title => nil
|
376
355
|
end
|
377
356
|
end
|
378
|
-
end.
|
357
|
+
end.to raise_error(Prawn::Errors::RequiredOption)
|
379
358
|
end
|
380
359
|
end
|
381
360
|
end
|
382
361
|
|
383
362
|
describe "foreign character encoding" do
|
384
363
|
before(:each) do
|
385
|
-
pdf = Prawn::Document.new
|
364
|
+
pdf = Prawn::Document.new do
|
386
365
|
outline.define do
|
387
366
|
section 'La pomme croquée', :destination => 1, :closed => true
|
388
367
|
end
|
@@ -392,15 +371,15 @@ describe "foreign character encoding" do
|
|
392
371
|
|
393
372
|
it "should handle other encodings for the title" do
|
394
373
|
object = find_by_title('La pomme croquée')
|
395
|
-
object.
|
374
|
+
expect(object).not_to be_nil
|
396
375
|
end
|
397
376
|
end
|
398
377
|
|
399
378
|
def render_and_find_objects
|
400
379
|
output = StringIO.new(@pdf.render, 'r+')
|
401
380
|
@hash = PDF::Reader::ObjectHash.new(output)
|
402
|
-
@outline_root = @hash.values.find {|obj| obj.is_a?(Hash) && obj[:Type] == :Outlines}
|
403
|
-
@pages = @hash.values.find {|obj| obj.is_a?(Hash) && obj[:Type] == :Pages}[:Kids]
|
381
|
+
@outline_root = @hash.values.find { |obj| obj.is_a?(Hash) && obj[:Type] == :Outlines }
|
382
|
+
@pages = @hash.values.find { |obj| obj.is_a?(Hash) && obj[:Type] == :Pages }[:Kids]
|
404
383
|
@section_1 = find_by_title('Chapter 1')
|
405
384
|
@page_1 = find_by_title('Page 1')
|
406
385
|
@page_2 = find_by_title('Page 2')
|