prawn 2.0.1 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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')
|