prawn 0.11.1 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- data/GPLv2 +340 -0
- data/GPLv3 +674 -0
- data/README.md +96 -0
- data/Rakefile +0 -12
- data/examples/example_helper.rb +3 -0
- data/lib/prawn.rb +1 -1
- data/lib/prawn/core/page.rb +4 -2
- data/lib/prawn/core/pdf_object.rb +7 -7
- data/lib/prawn/core/text/formatted/arranger.rb +2 -1
- data/lib/prawn/core/text/formatted/line_wrap.rb +2 -1
- data/lib/prawn/core/text/formatted/wrap.rb +5 -1
- data/lib/prawn/document.rb +135 -112
- data/lib/prawn/document/bounding_box.rb +51 -5
- data/lib/prawn/document/column_box.rb +0 -19
- data/lib/prawn/document/internals.rb +1 -0
- data/lib/prawn/document/snapshot.rb +3 -0
- data/lib/prawn/font.rb +4 -3
- data/lib/prawn/font/afm.rb +11 -2
- data/lib/prawn/font/ttf.rb +15 -0
- data/lib/prawn/images.rb +1 -1
- data/lib/prawn/table.rb +23 -7
- data/lib/prawn/table/cell.rb +31 -9
- data/lib/prawn/table/cell/text.rb +2 -2
- data/prawn.gemspec +5 -6
- data/spec/bounding_box_spec.rb +157 -0
- data/spec/data/curves.pdf +66 -0
- data/spec/document_spec.rb +59 -4
- data/spec/extensions/mocha.rb +1 -3
- data/spec/font_spec.rb +23 -0
- data/spec/formatted_text_box_spec.rb +40 -0
- data/spec/images_spec.rb +7 -0
- data/spec/object_store_spec.rb +3 -3
- data/spec/snapshot_spec.rb +33 -0
- data/spec/table_spec.rb +75 -0
- data/spec/template_spec.rb +11 -5
- data/spec/text_spacing_spec.rb +18 -0
- data/spec/text_spec.rb +32 -0
- metadata +217 -283
- data/HACKING +0 -50
- data/README +0 -141
- data/examples/bounding_box/bounding_boxes.rb +0 -44
- data/examples/bounding_box/indentation.rb +0 -35
- data/examples/bounding_box/stretched_nesting.rb +0 -68
- data/examples/general/background.rb +0 -24
- data/examples/general/canvas.rb +0 -16
- data/examples/general/float.rb +0 -12
- data/examples/general/margin.rb +0 -37
- data/examples/general/measurement_units.rb +0 -52
- data/examples/general/metadata-info.rb +0 -17
- data/examples/general/multi_page_layout.rb +0 -19
- data/examples/general/outlines.rb +0 -67
- data/examples/general/page_geometry.rb +0 -32
- data/examples/general/page_numbering.rb +0 -40
- data/examples/general/page_templates.rb +0 -20
- data/examples/general/repeaters.rb +0 -48
- data/examples/general/stamp.rb +0 -42
- data/examples/general/templates.rb +0 -14
- data/examples/graphics/basic_images.rb +0 -24
- data/examples/graphics/curves.rb +0 -12
- data/examples/graphics/hexagon.rb +0 -14
- data/examples/graphics/image_fit.rb +0 -16
- data/examples/graphics/image_flow.rb +0 -38
- data/examples/graphics/image_position.rb +0 -18
- data/examples/graphics/line.rb +0 -33
- data/examples/graphics/polygons.rb +0 -17
- data/examples/graphics/rounded_polygons.rb +0 -20
- data/examples/graphics/rounded_rectangle.rb +0 -21
- data/examples/graphics/ruport_style_helpers.rb +0 -20
- data/examples/graphics/stroke_bounds.rb +0 -21
- data/examples/graphics/stroke_cap_and_join.rb +0 -46
- data/examples/graphics/stroke_dash.rb +0 -43
- data/examples/graphics/transformations.rb +0 -53
- data/examples/graphics/transparency.rb +0 -27
- data/examples/grid/bounding_boxes.rb +0 -22
- data/examples/grid/column_gutter_grid.rb +0 -21
- data/examples/grid/multi_boxes.rb +0 -52
- data/examples/grid/show_grid.rb +0 -14
- data/examples/grid/simple_grid.rb +0 -21
- data/examples/m17n/chinese_text_wrapping.rb +0 -18
- data/examples/m17n/euro.rb +0 -16
- data/examples/m17n/utf8.rb +0 -14
- data/examples/security/hello_foo.rb +0 -9
- data/examples/table/borders.rb +0 -25
- data/examples/table/cell.rb +0 -13
- data/examples/table/checkerboard.rb +0 -23
- data/examples/table/inline_format_table.rb +0 -13
- data/examples/table/multi_page_table.rb +0 -10
- data/examples/table/simple_table.rb +0 -25
- data/examples/table/subtable.rb +0 -13
- data/examples/table/widths.rb +0 -21
- data/examples/text/alignment.rb +0 -19
- data/examples/text/character_spacing.rb +0 -13
- data/examples/text/dfont.rb +0 -49
- data/examples/text/family_based_styling.rb +0 -25
- data/examples/text/font_size.rb +0 -34
- data/examples/text/inline_format.rb +0 -104
- data/examples/text/kerning.rb +0 -31
- data/examples/text/rendering_mode.rb +0 -21
- data/examples/text/rotated.rb +0 -99
- data/examples/text/shaped_text_box.rb +0 -32
- data/examples/text/simple_text.rb +0 -18
- data/examples/text/simple_text_ttf.rb +0 -18
- data/examples/text/span.rb +0 -30
- data/examples/text/text_box.rb +0 -90
- data/examples/text/text_box_returning_excess.rb +0 -52
- data/examples/text/text_flow.rb +0 -68
@@ -0,0 +1,66 @@
|
|
1
|
+
%PDF-1.3
|
2
|
+
%����
|
3
|
+
1 0 obj
|
4
|
+
<< /Creator (Prawn)
|
5
|
+
/Producer (Prawn)
|
6
|
+
>>
|
7
|
+
endobj
|
8
|
+
2 0 obj
|
9
|
+
<< /Type /Pages
|
10
|
+
/Count 1
|
11
|
+
/Kids [5 0 R]
|
12
|
+
>>
|
13
|
+
endobj
|
14
|
+
3 0 obj
|
15
|
+
<< /Type /Catalog
|
16
|
+
/Pages 2 0 R
|
17
|
+
>>
|
18
|
+
endobj
|
19
|
+
4 0 obj
|
20
|
+
<< /Length 380
|
21
|
+
>>
|
22
|
+
stream
|
23
|
+
/DeviceRGB cs
|
24
|
+
0.000 0.000 0.000 scn
|
25
|
+
/DeviceRGB CS
|
26
|
+
0.000 0.000 0.000 SCN
|
27
|
+
q
|
28
|
+
136.000 136.000 m
|
29
|
+
96.000 126.000 96.000 126.000 86.000 86.000 c
|
30
|
+
S
|
31
|
+
246.000 236.000 m
|
32
|
+
246.000 241.523 241.523 246.000 236.000 246.000 c
|
33
|
+
230.477 246.000 226.000 241.523 226.000 236.000 c
|
34
|
+
226.000 230.477 230.477 226.000 236.000 226.000 c
|
35
|
+
241.523 226.000 246.000 230.477 246.000 236.000 c
|
36
|
+
236.000 236.000 m
|
37
|
+
f
|
38
|
+
Q
|
39
|
+
|
40
|
+
endstream
|
41
|
+
endobj
|
42
|
+
5 0 obj
|
43
|
+
<< /Type /Page
|
44
|
+
/Parent 2 0 R
|
45
|
+
/MediaBox [0 0 612.0 792.0]
|
46
|
+
/Contents 4 0 R
|
47
|
+
/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
|
48
|
+
>>
|
49
|
+
>>
|
50
|
+
endobj
|
51
|
+
xref
|
52
|
+
0 6
|
53
|
+
0000000000 65535 f
|
54
|
+
0000000015 00000 n
|
55
|
+
0000000071 00000 n
|
56
|
+
0000000128 00000 n
|
57
|
+
0000000177 00000 n
|
58
|
+
0000000608 00000 n
|
59
|
+
trailer
|
60
|
+
<< /Size 6
|
61
|
+
/Root 3 0 R
|
62
|
+
/Info 1 0 R
|
63
|
+
>>
|
64
|
+
startxref
|
65
|
+
762
|
66
|
+
%%EOF
|
data/spec/document_spec.rb
CHANGED
@@ -3,6 +3,14 @@ require "tempfile"
|
|
3
3
|
|
4
4
|
require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
5
5
|
|
6
|
+
describe "Prawn::Document.new" do
|
7
|
+
it "should not modify its argument" do
|
8
|
+
options = {:page_layout => :landscape}
|
9
|
+
Prawn::Document.new(options)
|
10
|
+
options.should == {:page_layout => :landscape}
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
6
14
|
describe "The cursor" do
|
7
15
|
it "should equal pdf.y - bounds.absolute_bottom" do
|
8
16
|
pdf = Prawn::Document.new
|
@@ -101,6 +109,31 @@ describe "When beginning each new page" do
|
|
101
109
|
|
102
110
|
end
|
103
111
|
|
112
|
+
describe "Prawn::Document#float" do
|
113
|
+
it "should restore the original y-position" do
|
114
|
+
create_pdf
|
115
|
+
orig_y = @pdf.y
|
116
|
+
@pdf.float { @pdf.text "Foo" }
|
117
|
+
@pdf.y.should == orig_y
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should teleport across pages if necessary" do
|
121
|
+
create_pdf
|
122
|
+
|
123
|
+
@pdf.float do
|
124
|
+
@pdf.text "Foo"
|
125
|
+
@pdf.start_new_page
|
126
|
+
@pdf.text "Bar"
|
127
|
+
end
|
128
|
+
@pdf.text "Baz"
|
129
|
+
|
130
|
+
pages = PDF::Inspector::Page.analyze(@pdf.render).pages
|
131
|
+
pages.size.should == 2
|
132
|
+
pages[0][:strings].should == ["Foo", "Baz"]
|
133
|
+
pages[1][:strings].should == ["Bar"]
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
104
137
|
describe "The page_number method" do
|
105
138
|
it "should be 1 for a new document" do
|
106
139
|
pdf = Prawn::Document.new
|
@@ -250,6 +283,15 @@ describe "When reopening pages" do
|
|
250
283
|
pages[1][:strings].should == ["New page 2"]
|
251
284
|
pages[2][:strings].should == ["Old page 2"]
|
252
285
|
end
|
286
|
+
|
287
|
+
it "should update the bounding box to the new page's margin box" do
|
288
|
+
Prawn::Document.new do
|
289
|
+
start_new_page :layout => :landscape
|
290
|
+
lsize = [bounds.width, bounds.height]
|
291
|
+
go_to_page 1
|
292
|
+
[bounds.width, bounds.height].should == lsize.reverse
|
293
|
+
end
|
294
|
+
end
|
253
295
|
end
|
254
296
|
|
255
297
|
describe "When setting page size" do
|
@@ -292,7 +334,7 @@ describe "When setting page layout" do
|
|
292
334
|
pages.first[:size].should == Prawn::Document::PageGeometry::SIZES["A4"].reverse
|
293
335
|
end
|
294
336
|
|
295
|
-
it "should retain page layout
|
337
|
+
it "should retain page layout by default when starting a new page" do
|
296
338
|
@pdf = Prawn::Document.new(:page_layout => :landscape)
|
297
339
|
@pdf.start_new_page(:trace => true)
|
298
340
|
pages = PDF::Inspector::Page.analyze(@pdf.render).pages
|
@@ -300,6 +342,13 @@ describe "When setting page layout" do
|
|
300
342
|
page[:size].should == Prawn::Document::PageGeometry::SIZES["LETTER"].reverse
|
301
343
|
end
|
302
344
|
end
|
345
|
+
|
346
|
+
it "should swap the bounds when starting a new page with different layout" do
|
347
|
+
@pdf = Prawn::Document.new
|
348
|
+
size = [@pdf.bounds.width, @pdf.bounds.height]
|
349
|
+
@pdf.start_new_page(:layout => :landscape)
|
350
|
+
[@pdf.bounds.width, @pdf.bounds.height].should == size.reverse
|
351
|
+
end
|
303
352
|
end
|
304
353
|
|
305
354
|
describe "The mask() feature" do
|
@@ -529,13 +578,19 @@ describe "The number_pages method" do
|
|
529
578
|
@pdf.number_pages "test, <total>", {:page_filter => :all}
|
530
579
|
end
|
531
580
|
|
532
|
-
it "must print
|
581
|
+
it "must print each page if given the :all page_filter" do
|
533
582
|
10.times { @pdf.start_new_page }
|
534
|
-
@pdf.expects(:text_box).
|
583
|
+
@pdf.expects(:text_box).times(10)
|
535
584
|
@pdf.number_pages "test", {:page_filter => :all}
|
536
585
|
end
|
586
|
+
|
587
|
+
it "must print each page if no :page_filter is specified" do
|
588
|
+
10.times { @pdf.start_new_page }
|
589
|
+
@pdf.expects(:text_box).times(10)
|
590
|
+
@pdf.number_pages "test"
|
591
|
+
end
|
537
592
|
|
538
|
-
it "must not print the page number
|
593
|
+
it "must not print the page number if given a nil filter" do
|
539
594
|
10.times { @pdf.start_new_page }
|
540
595
|
@pdf.expects(:text_box).never
|
541
596
|
@pdf.number_pages "test", {:page_filter => nil}
|
data/spec/extensions/mocha.rb
CHANGED
@@ -12,12 +12,10 @@
|
|
12
12
|
class ParameterChecker < Mocha::ParametersMatcher
|
13
13
|
def initialize(&matching_block)
|
14
14
|
@matching_block = matching_block
|
15
|
-
@run_matching_block = false
|
16
15
|
end
|
17
16
|
|
18
17
|
def match?(actual_parameters = [])
|
19
|
-
@matching_block.call(*actual_parameters)
|
20
|
-
@run_matching_block = true
|
18
|
+
@matching_block.call(*actual_parameters)
|
21
19
|
|
22
20
|
true # always succeed
|
23
21
|
end
|
data/spec/font_spec.rb
CHANGED
@@ -20,6 +20,15 @@ describe "#width_of" do
|
|
20
20
|
@pdf.width_of("hello world").should == original_width + 11 * 7
|
21
21
|
end
|
22
22
|
end
|
23
|
+
|
24
|
+
it "should exclude newlines" do
|
25
|
+
create_pdf
|
26
|
+
# Use a TTF font that has a non-zero width for \n
|
27
|
+
@pdf.font("#{Prawn::BASEDIR}/data/fonts/gkai00mp.ttf")
|
28
|
+
|
29
|
+
@pdf.width_of("\nhello world\n").should ==
|
30
|
+
@pdf.width_of("hello world")
|
31
|
+
end
|
23
32
|
end
|
24
33
|
|
25
34
|
describe "#font_size" do
|
@@ -353,3 +362,17 @@ describe "DFont fonts" do
|
|
353
362
|
assert_equal f2.object_id, @pdf.find_font(@file, :font => "ActionMan-Bold").object_id
|
354
363
|
end
|
355
364
|
end
|
365
|
+
|
366
|
+
describe "#character_count(text)" do
|
367
|
+
it "should work on TTF fonts" do
|
368
|
+
create_pdf
|
369
|
+
@pdf.font("#{Prawn::BASEDIR}/data/fonts/gkai00mp.ttf")
|
370
|
+
@pdf.font.character_count("こんにちは世界").should == 7
|
371
|
+
@pdf.font.character_count("Hello, world!").should == 13
|
372
|
+
end
|
373
|
+
|
374
|
+
it "should work on AFM fonts" do
|
375
|
+
create_pdf
|
376
|
+
@pdf.font.character_count("Hello, world!").should == 13
|
377
|
+
end
|
378
|
+
end
|
@@ -75,6 +75,46 @@ describe "Text::Formatted::Box wrapping" do
|
|
75
75
|
text_box.render
|
76
76
|
text_box.text.should == "Hello World\n2"
|
77
77
|
end
|
78
|
+
|
79
|
+
it "should properly handle empty slices using default encoding" do
|
80
|
+
texts = [{ :text => "Noua Delineatio Geographica generalis | Apostolicarum peregrinationum | S FRANCISCI XAUERII | Indiarum & Iaponiæ Apostoli", :font => 'Courier', :size => 10 }]
|
81
|
+
text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Noua Delineatio Geographica gen"))
|
82
|
+
assert_nothing_raised do
|
83
|
+
text_box.render
|
84
|
+
end
|
85
|
+
text_box.text.should == "Noua Delineatio Geographica\ngeneralis | Apostolicarum\nperegrinationum | S FRANCISCI\nXAUERII | Indiarum & Iaponi\346\nApostoli"
|
86
|
+
end
|
87
|
+
|
88
|
+
describe "Unicode" do
|
89
|
+
before do
|
90
|
+
if RUBY_VERSION < '1.9'
|
91
|
+
@reset_value = $KCODE
|
92
|
+
$KCODE='u'
|
93
|
+
else
|
94
|
+
@reset_value = [Encoding.default_external, Encoding.default_internal]
|
95
|
+
Encoding.default_external = Encoding::UTF_8
|
96
|
+
Encoding.default_internal = Encoding::UTF_8
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
after do
|
101
|
+
if RUBY_VERSION < '1.9'
|
102
|
+
$KCODE=@reset_value
|
103
|
+
else
|
104
|
+
Encoding.default_external = @reset_value[0]
|
105
|
+
Encoding.default_internal = @reset_value[1]
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should properly handle empty slices using Unicode encoding" do
|
110
|
+
texts = [{ :text => "Noua Delineatio Geographica generalis | Apostolicarum peregrinationum | S FRANCISCI XAUERII | Indiarum & Iaponiæ Apostoli", :font => 'Courier', :size => 10 }]
|
111
|
+
text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Noua Delineatio Geographica gen"))
|
112
|
+
assert_nothing_raised do
|
113
|
+
text_box.render
|
114
|
+
end
|
115
|
+
text_box.text.should == "Noua Delineatio Geographica\ngeneralis | Apostolicarum\nperegrinationum | S FRANCISCI\nXAUERII | Indiarum & Iaponi\346\nApostoli"
|
116
|
+
end
|
117
|
+
end
|
78
118
|
end
|
79
119
|
|
80
120
|
describe "Text::Formatted::Box with :fallback_fonts option that includes" +
|
data/spec/images_spec.rb
CHANGED
@@ -91,6 +91,13 @@ describe "the image() function" do
|
|
91
91
|
Set.new(hash[pages[0]][:Resources][:XObject].keys).should ==
|
92
92
|
Set.new([:I1, :I2])
|
93
93
|
end
|
94
|
+
|
95
|
+
it "should not start a new page just for a stretchy bounding box" do
|
96
|
+
@pdf.expects(:start_new_page).times(0)
|
97
|
+
@pdf.bounding_box([0, @pdf.cursor], :width => @pdf.bounds.width) do
|
98
|
+
@pdf.image @filename
|
99
|
+
end
|
100
|
+
end
|
94
101
|
|
95
102
|
describe ":fit option" do
|
96
103
|
it "should fit inside the defined constraints" do
|
data/spec/object_store_spec.rb
CHANGED
@@ -16,20 +16,20 @@ describe "Prawn::ObjectStore" do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
it "should import objects from an existing PDF" do
|
19
|
-
filename = "#{Prawn::BASEDIR}/
|
19
|
+
filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf"
|
20
20
|
store = Prawn::Core::ObjectStore.new(:template => filename)
|
21
21
|
store.size.should == 5
|
22
22
|
end
|
23
23
|
|
24
24
|
it "should point to existing roots when importing objects from an existing PDF" do
|
25
|
-
filename = "#{Prawn::BASEDIR}/
|
25
|
+
filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf"
|
26
26
|
store = Prawn::Core::ObjectStore.new(:template => filename)
|
27
27
|
store.info.class.should == Prawn::Core::Reference
|
28
28
|
store.root.class.should == Prawn::Core::Reference
|
29
29
|
end
|
30
30
|
|
31
31
|
it "should initialize with pages when importing objects from an existing PDF" do
|
32
|
-
filename = "#{Prawn::BASEDIR}/
|
32
|
+
filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf"
|
33
33
|
store = Prawn::Core::ObjectStore.new(:template => filename)
|
34
34
|
store.pages.data[:Count].should == 1
|
35
35
|
end
|
data/spec/snapshot_spec.rb
CHANGED
@@ -112,6 +112,39 @@ describe "Prawn::Document#transaction" do
|
|
112
112
|
end
|
113
113
|
|
114
114
|
end
|
115
|
+
|
116
|
+
it "should restore bounds on rollback" do
|
117
|
+
Prawn::Document.new(:page_layout => :landscape) do
|
118
|
+
size = [bounds.width, bounds.height]
|
119
|
+
transaction do
|
120
|
+
start_new_page :layout => :portrait
|
121
|
+
rollback
|
122
|
+
end
|
123
|
+
[bounds.width, bounds.height].should == size
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should set new bounding box on start_new_page with different layout" do
|
128
|
+
Prawn::Document.new(:page_layout => :landscape) do
|
129
|
+
size = [bounds.width, bounds.height]
|
130
|
+
transaction do
|
131
|
+
start_new_page
|
132
|
+
rollback
|
133
|
+
end
|
134
|
+
|
135
|
+
start_new_page :layout => :portrait
|
136
|
+
[bounds.width, bounds.height].should == size.reverse
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
it "should work with dests" do
|
141
|
+
Prawn::Document.new do |pdf|
|
142
|
+
pdf.add_dest("dest", pdf.dest_fit_horizontally(pdf.cursor,
|
143
|
+
pdf.page.dictionary))
|
144
|
+
pdf.text("Hello world")
|
145
|
+
lambda { pdf.transaction{} }.should.not.raise
|
146
|
+
end
|
147
|
+
end
|
115
148
|
|
116
149
|
describe "with a stamp dictionary present" do
|
117
150
|
|
data/spec/table_spec.rb
CHANGED
@@ -219,6 +219,13 @@ describe "Prawn::Table" do
|
|
219
219
|
table.width.should == 300
|
220
220
|
end
|
221
221
|
|
222
|
+
it "should accept Numeric for column_widths" do
|
223
|
+
table = Prawn::Table.new([%w[ a b c ], %w[d e f]], @pdf) do |t|
|
224
|
+
t.column_widths = 50
|
225
|
+
end
|
226
|
+
table.width.should == 150
|
227
|
+
end
|
228
|
+
|
222
229
|
it "should calculate unspecified column widths as "+
|
223
230
|
"(max(string_width) + 2*horizontal_padding)" do
|
224
231
|
hpad, fs = 3, 12
|
@@ -485,6 +492,37 @@ describe "Prawn::Table" do
|
|
485
492
|
output.pages[0][:strings].should.be.empty
|
486
493
|
output.pages[1][:strings].should == ["Header", "Body"]
|
487
494
|
end
|
495
|
+
|
496
|
+
it "should draw background before borders, but only within pages" do
|
497
|
+
seq = sequence("drawing_order")
|
498
|
+
|
499
|
+
@pdf = Prawn::Document.new
|
500
|
+
|
501
|
+
# give enough room for only the first row
|
502
|
+
@pdf.y = @pdf.bounds.absolute_bottom + 30
|
503
|
+
t = @pdf.make_table([["A", "B"],
|
504
|
+
["C", "D"]],
|
505
|
+
:cell_style => {:background_color => 'ff0000'})
|
506
|
+
|
507
|
+
ca = t.cells[0, 0]
|
508
|
+
cb = t.cells[0, 1]
|
509
|
+
cc = t.cells[1, 0]
|
510
|
+
cd = t.cells[1, 1]
|
511
|
+
|
512
|
+
# All backgrounds should draw before any borders on page 1...
|
513
|
+
ca.expects(:draw_background).in_sequence(seq)
|
514
|
+
cb.expects(:draw_background).in_sequence(seq)
|
515
|
+
ca.expects(:draw_borders).in_sequence(seq)
|
516
|
+
cb.expects(:draw_borders).in_sequence(seq)
|
517
|
+
# ...and page 2
|
518
|
+
@pdf.expects(:start_new_page).in_sequence(seq)
|
519
|
+
cc.expects(:draw_background).in_sequence(seq)
|
520
|
+
cd.expects(:draw_background).in_sequence(seq)
|
521
|
+
cc.expects(:draw_borders).in_sequence(seq)
|
522
|
+
cd.expects(:draw_borders).in_sequence(seq)
|
523
|
+
|
524
|
+
t.draw
|
525
|
+
end
|
488
526
|
end
|
489
527
|
|
490
528
|
describe "#style" do
|
@@ -581,6 +619,27 @@ describe "Prawn::Table" do
|
|
581
619
|
end
|
582
620
|
end
|
583
621
|
|
622
|
+
it "should draw all backgrounds before any borders" do
|
623
|
+
# lest backgrounds overlap borders:
|
624
|
+
# https://github.com/sandal/prawn/pull/226
|
625
|
+
|
626
|
+
seq = sequence("drawing_order")
|
627
|
+
|
628
|
+
t = @pdf.make_table([["A", "B"]],
|
629
|
+
:cell_style => {:background_color => 'ff0000'})
|
630
|
+
ca = t.cells[0, 0]
|
631
|
+
cb = t.cells[0, 1]
|
632
|
+
|
633
|
+
# XXX Not a perfectly general test, because it would still be acceptable
|
634
|
+
# if we drew B then A
|
635
|
+
ca.expects(:draw_background).in_sequence(seq)
|
636
|
+
cb.expects(:draw_background).in_sequence(seq)
|
637
|
+
ca.expects(:draw_borders).in_sequence(seq)
|
638
|
+
cb.expects(:draw_borders).in_sequence(seq)
|
639
|
+
|
640
|
+
t.draw
|
641
|
+
end
|
642
|
+
|
584
643
|
it "should allow multiple inkings of the same table" do
|
585
644
|
pdf = Prawn::Document.new
|
586
645
|
t = Prawn::Table.new([["foo"]], pdf)
|
@@ -595,6 +654,22 @@ describe "Prawn::Table" do
|
|
595
654
|
pdf.move_cursor_to(400)
|
596
655
|
t.draw
|
597
656
|
end
|
657
|
+
|
658
|
+
describe "in stretchy bounding boxes" do
|
659
|
+
it "should draw all cells on a row at the same y-position" do
|
660
|
+
pdf = Prawn::Document.new
|
661
|
+
|
662
|
+
text_y = pdf.y.to_i - 5 # text starts 5pt below current y pos (padding)
|
663
|
+
|
664
|
+
pdf.bounding_box([0, pdf.cursor], :width => pdf.bounds.width) do
|
665
|
+
pdf.expects(:draw_text!).checking { |text, options|
|
666
|
+
pdf.bounds.absolute_top.should == text_y
|
667
|
+
}.times(3)
|
668
|
+
|
669
|
+
pdf.table([%w[a b c]])
|
670
|
+
end
|
671
|
+
end
|
672
|
+
end
|
598
673
|
end
|
599
674
|
|
600
675
|
describe "headers" do
|