prawn 0.15.0 → 1.0.0.rc1
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.
- data/COPYING +2 -2
- data/LICENSE +1 -1
- data/README.md +96 -0
- data/Rakefile +27 -30
- data/data/fonts/Action Man.dfont +0 -0
- data/data/fonts/Activa.ttf +0 -0
- data/data/fonts/Chalkboard.ttf +0 -0
- data/data/fonts/DejaVuSans.ttf +0 -0
- data/data/fonts/Dustismo_Roman.ttf +0 -0
- data/data/fonts/comicsans.ttf +0 -0
- data/data/fonts/gkai00mp.ttf +0 -0
- data/data/images/16bit.alpha +0 -0
- data/data/images/16bit.dat +0 -0
- data/data/images/dice.alpha +0 -0
- data/data/images/dice.dat +0 -0
- data/data/images/page_white_text.alpha +0 -0
- data/data/images/page_white_text.dat +0 -0
- data/data/images/rails.dat +0 -0
- data/data/images/rails.png +0 -0
- data/data/pdfs/nested_pages.pdf +13 -13
- data/lib/prawn.rb +21 -85
- data/lib/prawn/compatibility.rb +51 -0
- data/lib/prawn/core.rb +85 -0
- data/lib/prawn/core/annotations.rb +61 -0
- data/lib/prawn/core/byte_string.rb +9 -0
- data/lib/prawn/core/destinations.rb +90 -0
- data/lib/prawn/core/document_state.rb +78 -0
- data/lib/prawn/core/literal_string.rb +16 -0
- data/lib/prawn/core/name_tree.rb +177 -0
- data/lib/prawn/core/object_store.rb +264 -0
- data/lib/prawn/core/page.rb +215 -0
- data/lib/prawn/core/pdf_object.rb +108 -0
- data/lib/prawn/core/reference.rb +115 -0
- data/lib/prawn/core/text.rb +268 -0
- data/lib/prawn/core/text/formatted/arranger.rb +294 -0
- data/lib/prawn/core/text/formatted/line_wrap.rb +273 -0
- data/lib/prawn/core/text/formatted/wrap.rb +153 -0
- data/lib/prawn/document.rb +122 -155
- data/lib/prawn/document/bounding_box.rb +7 -36
- data/lib/prawn/document/column_box.rb +10 -38
- data/lib/prawn/document/graphics_state.rb +74 -11
- data/lib/prawn/document/internals.rb +23 -24
- data/lib/prawn/document/page_geometry.rb +136 -0
- data/lib/prawn/document/snapshot.rb +6 -7
- data/lib/prawn/document/span.rb +10 -12
- data/lib/prawn/encoding.rb +10 -9
- data/lib/prawn/errors.rb +30 -15
- data/lib/prawn/font.rb +104 -136
- data/lib/prawn/font/afm.rb +44 -46
- data/lib/prawn/font/dfont.rb +3 -4
- data/lib/prawn/font/ttf.rb +50 -31
- data/lib/prawn/graphics.rb +57 -302
- data/lib/prawn/graphics/cap_style.rb +3 -4
- data/lib/prawn/graphics/color.rb +5 -13
- data/lib/prawn/graphics/dash.rb +31 -53
- data/lib/prawn/graphics/gradient.rb +84 -0
- data/lib/prawn/graphics/join_style.rb +7 -9
- data/lib/prawn/graphics/transformation.rb +9 -10
- data/lib/prawn/graphics/transparency.rb +1 -3
- data/lib/prawn/images.rb +59 -69
- data/lib/prawn/images/image.rb +22 -6
- data/lib/prawn/images/jpg.rb +14 -20
- data/lib/prawn/images/png.rb +118 -61
- data/lib/prawn/layout.rb +15 -10
- data/lib/prawn/layout/grid.rb +54 -66
- data/lib/prawn/measurement_extensions.rb +6 -10
- data/lib/prawn/measurements.rb +21 -27
- data/lib/prawn/outline.rb +308 -6
- data/lib/prawn/repeater.rb +8 -10
- data/lib/prawn/security.rb +33 -55
- data/lib/prawn/security/arcfour.rb +0 -1
- data/lib/prawn/stamp.rb +3 -5
- data/lib/prawn/table.rb +60 -188
- data/lib/prawn/table/cell.rb +44 -272
- data/lib/prawn/table/cell/image.rb +3 -2
- data/lib/prawn/table/cell/in_table.rb +2 -4
- data/lib/prawn/table/cell/subtable.rb +2 -2
- data/lib/prawn/table/cell/text.rb +18 -41
- data/lib/prawn/table/cells.rb +48 -142
- data/lib/prawn/text.rb +25 -32
- data/lib/prawn/text/box.rb +6 -12
- data/lib/prawn/text/formatted.rb +4 -5
- data/lib/prawn/text/formatted/box.rb +59 -96
- data/lib/prawn/text/formatted/fragment.rb +23 -34
- data/lib/prawn/text/formatted/parser.rb +5 -15
- data/prawn.gemspec +13 -24
- data/spec/annotations_spec.rb +32 -16
- data/spec/bounding_box_spec.rb +17 -119
- data/spec/cell_spec.rb +42 -112
- data/spec/destinations_spec.rb +5 -5
- data/spec/document_spec.rb +111 -155
- data/spec/extensions/mocha.rb +0 -1
- data/spec/font_spec.rb +99 -149
- data/spec/formatted_text_arranger_spec.rb +43 -43
- data/spec/formatted_text_box_spec.rb +44 -43
- data/spec/formatted_text_fragment_spec.rb +8 -8
- data/spec/graphics_spec.rb +68 -151
- data/spec/grid_spec.rb +15 -26
- data/spec/images_spec.rb +30 -51
- data/spec/inline_formatted_text_parser_spec.rb +20 -69
- data/spec/jpg_spec.rb +4 -4
- data/spec/line_wrap_spec.rb +28 -28
- data/spec/measurement_units_spec.rb +6 -6
- data/spec/name_tree_spec.rb +112 -0
- data/spec/object_store_spec.rb +106 -17
- data/spec/outline_spec.rb +63 -103
- data/spec/pdf_object_spec.rb +170 -0
- data/spec/png_spec.rb +25 -25
- data/spec/reference_spec.rb +65 -8
- data/spec/repeater_spec.rb +10 -10
- data/spec/security_spec.rb +12 -44
- data/spec/snapshot_spec.rb +7 -7
- data/spec/span_spec.rb +15 -10
- data/spec/spec_helper.rb +8 -32
- data/spec/stamp_spec.rb +30 -29
- data/spec/stroke_styles_spec.rb +18 -36
- data/spec/table_spec.rb +111 -706
- data/spec/template_spec.rb +297 -0
- data/spec/text_at_spec.rb +33 -19
- data/spec/text_box_spec.rb +64 -100
- data/spec/text_rendering_mode_spec.rb +5 -5
- data/spec/text_spacing_spec.rb +4 -4
- data/spec/text_spec.rb +64 -84
- data/spec/transparency_spec.rb +5 -5
- metadata +290 -463
- checksums.yaml +0 -7
- data/.yardopts +0 -10
- data/Gemfile +0 -11
- data/data/images/16bit.color +0 -0
- data/data/images/dice.color +0 -0
- data/data/images/indexed_color.dat +0 -0
- data/data/images/indexed_color.png +0 -0
- data/data/images/page_white_text.color +0 -0
- data/lib/prawn/font_metric_cache.rb +0 -47
- data/lib/prawn/graphics/patterns.rb +0 -138
- data/lib/prawn/image_handler.rb +0 -36
- data/lib/prawn/soft_mask.rb +0 -96
- data/lib/prawn/table/cell/span_dummy.rb +0 -93
- data/lib/prawn/table/column_width_calculator.rb +0 -61
- data/lib/prawn/text/formatted/arranger.rb +0 -290
- data/lib/prawn/text/formatted/line_wrap.rb +0 -266
- data/lib/prawn/text/formatted/wrap.rb +0 -150
- data/lib/prawn/utilities.rb +0 -46
- data/manual/basic_concepts/adding_pages.rb +0 -27
- data/manual/basic_concepts/basic_concepts.rb +0 -34
- data/manual/basic_concepts/creation.rb +0 -39
- data/manual/basic_concepts/cursor.rb +0 -33
- data/manual/basic_concepts/measurement.rb +0 -25
- data/manual/basic_concepts/origin.rb +0 -38
- data/manual/basic_concepts/other_cursor_helpers.rb +0 -40
- data/manual/bounding_box/bounding_box.rb +0 -39
- data/manual/bounding_box/bounds.rb +0 -49
- data/manual/bounding_box/canvas.rb +0 -24
- data/manual/bounding_box/creation.rb +0 -23
- data/manual/bounding_box/indentation.rb +0 -46
- data/manual/bounding_box/nesting.rb +0 -45
- data/manual/bounding_box/russian_boxes.rb +0 -40
- data/manual/bounding_box/stretchy.rb +0 -31
- data/manual/document_and_page_options/background.rb +0 -27
- data/manual/document_and_page_options/document_and_page_options.rb +0 -32
- data/manual/document_and_page_options/metadata.rb +0 -23
- data/manual/document_and_page_options/page_margins.rb +0 -38
- data/manual/document_and_page_options/page_size.rb +0 -34
- data/manual/document_and_page_options/print_scaling.rb +0 -20
- data/manual/example_file.rb +0 -111
- data/manual/example_helper.rb +0 -411
- data/manual/example_package.rb +0 -53
- data/manual/example_section.rb +0 -46
- data/manual/graphics/circle_and_ellipse.rb +0 -22
- data/manual/graphics/color.rb +0 -24
- data/manual/graphics/common_lines.rb +0 -30
- data/manual/graphics/fill_and_stroke.rb +0 -42
- data/manual/graphics/fill_rules.rb +0 -37
- data/manual/graphics/gradients.rb +0 -37
- data/manual/graphics/graphics.rb +0 -58
- data/manual/graphics/helper.rb +0 -24
- data/manual/graphics/line_width.rb +0 -35
- data/manual/graphics/lines_and_curves.rb +0 -41
- data/manual/graphics/polygon.rb +0 -29
- data/manual/graphics/rectangle.rb +0 -21
- data/manual/graphics/rotate.rb +0 -28
- data/manual/graphics/scale.rb +0 -41
- data/manual/graphics/soft_masks.rb +0 -46
- data/manual/graphics/stroke_cap.rb +0 -31
- data/manual/graphics/stroke_dash.rb +0 -48
- data/manual/graphics/stroke_join.rb +0 -30
- data/manual/graphics/translate.rb +0 -29
- data/manual/graphics/transparency.rb +0 -35
- data/manual/images/absolute_position.rb +0 -23
- data/manual/images/fit.rb +0 -21
- data/manual/images/horizontal.rb +0 -25
- data/manual/images/images.rb +0 -40
- data/manual/images/plain_image.rb +0 -18
- data/manual/images/scale.rb +0 -22
- data/manual/images/vertical.rb +0 -28
- data/manual/images/width_and_height.rb +0 -25
- data/manual/layout/boxes.rb +0 -27
- data/manual/layout/content.rb +0 -25
- data/manual/layout/layout.rb +0 -28
- data/manual/layout/simple_grid.rb +0 -23
- data/manual/manual/cover.rb +0 -36
- data/manual/manual/foreword.rb +0 -85
- data/manual/manual/how_to_read_this_manual.rb +0 -41
- data/manual/manual/manual.rb +0 -34
- data/manual/outline/add_subsection_to.rb +0 -61
- data/manual/outline/insert_section_after.rb +0 -47
- data/manual/outline/outline.rb +0 -32
- data/manual/outline/sections_and_pages.rb +0 -67
- data/manual/repeatable_content/page_numbering.rb +0 -54
- data/manual/repeatable_content/repeatable_content.rb +0 -31
- data/manual/repeatable_content/repeater.rb +0 -55
- data/manual/repeatable_content/stamp.rb +0 -41
- data/manual/security/encryption.rb +0 -31
- data/manual/security/permissions.rb +0 -38
- data/manual/security/security.rb +0 -28
- data/manual/syntax_highlight.rb +0 -52
- data/manual/table/basic_block.rb +0 -53
- data/manual/table/before_rendering_page.rb +0 -26
- data/manual/table/cell_border_lines.rb +0 -24
- data/manual/table/cell_borders_and_bg.rb +0 -31
- data/manual/table/cell_dimensions.rb +0 -30
- data/manual/table/cell_text.rb +0 -38
- data/manual/table/column_widths.rb +0 -30
- data/manual/table/content_and_subtables.rb +0 -39
- data/manual/table/creation.rb +0 -27
- data/manual/table/filtering.rb +0 -36
- data/manual/table/flow_and_header.rb +0 -17
- data/manual/table/image_cells.rb +0 -33
- data/manual/table/position.rb +0 -29
- data/manual/table/row_colors.rb +0 -20
- data/manual/table/span.rb +0 -30
- data/manual/table/style.rb +0 -22
- data/manual/table/table.rb +0 -52
- data/manual/table/width.rb +0 -27
- data/manual/text/alignment.rb +0 -44
- data/manual/text/color.rb +0 -24
- data/manual/text/column_box.rb +0 -32
- data/manual/text/fallback_fonts.rb +0 -37
- data/manual/text/font.rb +0 -41
- data/manual/text/font_size.rb +0 -45
- data/manual/text/font_style.rb +0 -23
- data/manual/text/formatted_callbacks.rb +0 -60
- data/manual/text/formatted_text.rb +0 -54
- data/manual/text/free_flowing_text.rb +0 -51
- data/manual/text/group.rb +0 -31
- data/manual/text/inline.rb +0 -43
- data/manual/text/kerning_and_character_spacing.rb +0 -39
- data/manual/text/leading.rb +0 -25
- data/manual/text/line_wrapping.rb +0 -41
- data/manual/text/paragraph_indentation.rb +0 -26
- data/manual/text/positioned_text.rb +0 -38
- data/manual/text/registering_families.rb +0 -48
- data/manual/text/rendering_and_color.rb +0 -37
- data/manual/text/right_to_left_text.rb +0 -43
- data/manual/text/rotation.rb +0 -43
- data/manual/text/single_usage.rb +0 -37
- data/manual/text/text.rb +0 -75
- data/manual/text/text_box_excess.rb +0 -32
- data/manual/text/text_box_extensions.rb +0 -45
- data/manual/text/text_box_overflow.rb +0 -44
- data/manual/text/utf8.rb +0 -28
- data/manual/text/win_ansi_charset.rb +0 -59
- data/spec/acceptance/png.rb +0 -23
- data/spec/column_box_spec.rb +0 -65
- data/spec/extensions/encoding_helpers.rb +0 -9
- data/spec/font_metric_cache_spec.rb +0 -52
- data/spec/image_handler_spec.rb +0 -54
- data/spec/soft_mask_spec.rb +0 -117
- data/spec/table/span_dummy_spec.rb +0 -17
data/spec/jpg_spec.rb
CHANGED
@@ -4,18 +4,18 @@
|
|
4
4
|
# contents of palette and transparency to ensure they're correct.
|
5
5
|
# Need to find files that have these sections first.
|
6
6
|
|
7
|
-
require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
7
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
8
8
|
|
9
9
|
describe "When reading a JPEG file" do
|
10
10
|
|
11
11
|
before(:each) do
|
12
|
-
@filename = "#{Prawn::
|
12
|
+
@filename = "#{Prawn::BASEDIR}/data/images/pigs.jpg"
|
13
13
|
@img_data = File.open(@filename, "rb") { |f| f.read }
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
it "should read the basic attributes correctly" do
|
17
17
|
jpg = Prawn::Images::JPG.new(@img_data)
|
18
|
-
|
18
|
+
|
19
19
|
jpg.width.should == 604
|
20
20
|
jpg.height.should == 453
|
21
21
|
jpg.bits.should == 8
|
data/spec/line_wrap_spec.rb
CHANGED
@@ -5,8 +5,8 @@ require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
|
5
5
|
describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
6
6
|
before(:each) do
|
7
7
|
create_pdf
|
8
|
-
@arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
|
9
|
-
@line_wrap = Prawn::Text::Formatted::LineWrap.new
|
8
|
+
@arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
|
9
|
+
@line_wrap = Prawn::Core::Text::Formatted::LineWrap.new
|
10
10
|
@one_word_width = 50
|
11
11
|
end
|
12
12
|
it "should strip leading and trailing spaces" do
|
@@ -30,7 +30,7 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
30
30
|
:document => @pdf)
|
31
31
|
string.should == "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
32
32
|
end
|
33
|
-
it "should
|
33
|
+
it "should raise 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
|
@@ -38,7 +38,7 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
38
38
|
@line_wrap.wrap_line(:arranger => @arranger,
|
39
39
|
:width => 1,
|
40
40
|
:document => @pdf)
|
41
|
-
end.should
|
41
|
+
end.should.raise(Prawn::Errors::CannotFit)
|
42
42
|
end
|
43
43
|
|
44
44
|
it "should break on space" do
|
@@ -51,7 +51,7 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
51
51
|
end
|
52
52
|
|
53
53
|
it "should break on zero-width space" do
|
54
|
-
@pdf.font("#{Prawn::
|
54
|
+
@pdf.font("#{Prawn::BASEDIR}/data/fonts/DejaVuSans.ttf")
|
55
55
|
array = [{ :text => "hello#{Prawn::Text::ZWSP}world" }]
|
56
56
|
@arranger.format_array = array
|
57
57
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
@@ -61,7 +61,7 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
61
61
|
end
|
62
62
|
|
63
63
|
it "should not display zero-width space" do
|
64
|
-
@pdf.font("#{Prawn::
|
64
|
+
@pdf.font("#{Prawn::BASEDIR}/data/fonts/DejaVuSans.ttf")
|
65
65
|
array = [{ :text => "hello#{Prawn::Text::ZWSP}world" }]
|
66
66
|
@arranger.format_array = array
|
67
67
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
@@ -113,11 +113,11 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
113
113
|
:width => @one_word_width,
|
114
114
|
:document => @pdf)
|
115
115
|
expected = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}")
|
116
|
-
expected.force_encoding(
|
116
|
+
expected.force_encoding("utf-8") if "".respond_to?(:force_encoding)
|
117
117
|
string.should == expected
|
118
118
|
|
119
|
-
@pdf.font("#{Prawn::
|
120
|
-
@line_wrap = Prawn::Text::Formatted::LineWrap.new
|
119
|
+
@pdf.font("#{Prawn::BASEDIR}/data/fonts/DejaVuSans.ttf")
|
120
|
+
@line_wrap = Prawn::Core::Text::Formatted::LineWrap.new
|
121
121
|
|
122
122
|
string = "hello#{Prawn::Text::SHY}world"
|
123
123
|
array = [{ :text => string }]
|
@@ -137,8 +137,8 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
137
137
|
:document => @pdf)
|
138
138
|
string.should == "helloworld"
|
139
139
|
|
140
|
-
@pdf.font("#{Prawn::
|
141
|
-
@line_wrap = Prawn::Text::Formatted::LineWrap.new
|
140
|
+
@pdf.font("#{Prawn::BASEDIR}/data/fonts/DejaVuSans.ttf")
|
141
|
+
@line_wrap = Prawn::Core::Text::Formatted::LineWrap.new
|
142
142
|
|
143
143
|
string = "hello#{Prawn::Text::SHY}world"
|
144
144
|
array = [{ :text => string }]
|
@@ -166,8 +166,8 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
166
166
|
:document => @pdf)
|
167
167
|
string.should == "hello"
|
168
168
|
|
169
|
-
@pdf.font("#{Prawn::
|
170
|
-
@line_wrap = Prawn::Text::Formatted::LineWrap.new
|
169
|
+
@pdf.font("#{Prawn::BASEDIR}/data/fonts/DejaVuSans.ttf")
|
170
|
+
@line_wrap = Prawn::Core::Text::Formatted::LineWrap.new
|
171
171
|
enough_width_for_hello_world = 68
|
172
172
|
|
173
173
|
array = [{ :text => "hello world" }]
|
@@ -202,11 +202,11 @@ describe "Core::Text::Formatted::LineWrap#wrap_line" do
|
|
202
202
|
:width => @one_word_width,
|
203
203
|
:document => @pdf)
|
204
204
|
expected = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}")
|
205
|
-
expected.force_encoding(
|
205
|
+
expected.force_encoding("utf-8") if "".respond_to?(:force_encoding)
|
206
206
|
string.should == expected
|
207
207
|
|
208
|
-
@pdf.font("#{Prawn::
|
209
|
-
@line_wrap = Prawn::Text::Formatted::LineWrap.new
|
208
|
+
@pdf.font("#{Prawn::BASEDIR}/data/fonts/DejaVuSans.ttf")
|
209
|
+
@line_wrap = Prawn::Core::Text::Formatted::LineWrap.new
|
210
210
|
|
211
211
|
string = "hello#{Prawn::Text::SHY}-"
|
212
212
|
array = [{ :text => string }]
|
@@ -229,8 +229,8 @@ end
|
|
229
229
|
describe "Core::Text::Formatted::LineWrap#space_count" do
|
230
230
|
before(:each) do
|
231
231
|
create_pdf
|
232
|
-
@arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
|
233
|
-
@line_wrap = Prawn::Text::Formatted::LineWrap.new
|
232
|
+
@arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
|
233
|
+
@line_wrap = Prawn::Core::Text::Formatted::LineWrap.new
|
234
234
|
end
|
235
235
|
it "should return the number of spaces in the last wrapped line" do
|
236
236
|
array = [{ :text => "hello world, " },
|
@@ -255,7 +255,7 @@ end
|
|
255
255
|
describe "Core::Text::Formatted::LineWrap" do
|
256
256
|
before(:each) do
|
257
257
|
create_pdf
|
258
|
-
@arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
|
258
|
+
@arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
|
259
259
|
array = [{ :text => "hello\nworld\n\n\nhow are you?" },
|
260
260
|
{ :text => "\n" },
|
261
261
|
{ :text => "\n" },
|
@@ -265,7 +265,7 @@ describe "Core::Text::Formatted::LineWrap" do
|
|
265
265
|
{ :text => "\n" },
|
266
266
|
{ :text => "" }]
|
267
267
|
@arranger.format_array = array
|
268
|
-
@line_wrap = Prawn::Text::Formatted::LineWrap.new
|
268
|
+
@line_wrap = Prawn::Core::Text::Formatted::LineWrap.new
|
269
269
|
end
|
270
270
|
it "should only return an empty string if nothing fit or there" +
|
271
271
|
"was nothing to wrap" do
|
@@ -273,23 +273,23 @@ describe "Core::Text::Formatted::LineWrap" do
|
|
273
273
|
line = @line_wrap.wrap_line(:arranger => @arranger,
|
274
274
|
:width => 200,
|
275
275
|
:document => @pdf)
|
276
|
-
line.
|
276
|
+
line.should.not.be.empty
|
277
277
|
end
|
278
278
|
line = @line_wrap.wrap_line(:arranger => @arranger,
|
279
279
|
:width => 200,
|
280
280
|
:document => @pdf)
|
281
|
-
line.should
|
281
|
+
line.should.be.empty
|
282
282
|
end
|
283
283
|
end
|
284
284
|
|
285
285
|
describe "Core::Text::Formatted::LineWrap#paragraph_finished?" do
|
286
286
|
before(:each) do
|
287
287
|
create_pdf
|
288
|
-
@arranger = Prawn::Text::Formatted::Arranger.new(@pdf)
|
289
|
-
@line_wrap = Prawn::Text::Formatted::LineWrap.new
|
288
|
+
@arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf)
|
289
|
+
@line_wrap = Prawn::Core::Text::Formatted::LineWrap.new
|
290
290
|
@one_word_width = 50
|
291
291
|
end
|
292
|
-
it "should
|
292
|
+
it "should be false when the last printed line is not the end of the paragraph" do
|
293
293
|
array = [{ :text => "hello world" }]
|
294
294
|
@arranger.format_array = array
|
295
295
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
@@ -298,7 +298,7 @@ describe "Core::Text::Formatted::LineWrap#paragraph_finished?" do
|
|
298
298
|
|
299
299
|
@line_wrap.paragraph_finished?.should == false
|
300
300
|
end
|
301
|
-
it "should
|
301
|
+
it "should be true when the last printed line is the last fragment to print" do
|
302
302
|
array = [{ :text => "hello world" }]
|
303
303
|
@arranger.format_array = array
|
304
304
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
@@ -310,7 +310,7 @@ describe "Core::Text::Formatted::LineWrap#paragraph_finished?" do
|
|
310
310
|
|
311
311
|
@line_wrap.paragraph_finished?.should == true
|
312
312
|
end
|
313
|
-
it "should
|
313
|
+
it "should be true when a newline exists on the current line" do
|
314
314
|
array = [{ :text => "hello\n world" }]
|
315
315
|
@arranger.format_array = array
|
316
316
|
string = @line_wrap.wrap_line(:arranger => @arranger,
|
@@ -319,7 +319,7 @@ describe "Core::Text::Formatted::LineWrap#paragraph_finished?" do
|
|
319
319
|
|
320
320
|
@line_wrap.paragraph_finished?.should == true
|
321
321
|
end
|
322
|
-
it "should
|
322
|
+
it "should be true when a newline exists in the next fragment" do
|
323
323
|
array = [{ :text => "hello " },
|
324
324
|
{ :text => " \n" },
|
325
325
|
{ :text => "world" }]
|
@@ -1,10 +1,10 @@
|
|
1
|
-
require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
1
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
2
2
|
require "prawn/measurement_extensions"
|
3
3
|
|
4
4
|
describe "Measurement units" do
|
5
|
-
|
5
|
+
|
6
6
|
it "should convert units to PostScriptPoints" do
|
7
|
-
1.mm.should
|
7
|
+
1.mm.should.be.close(2.834645669, 0.000000001)
|
8
8
|
1.mm.should == (72 / 25.4)
|
9
9
|
2.mm.should == (2 * 72 / 25.4)
|
10
10
|
3.mm.should == 3 * 72 / 25.4
|
@@ -12,12 +12,12 @@ describe "Measurement units" do
|
|
12
12
|
1.cm.should == 10 * 72 / 25.4
|
13
13
|
1.dm.should == 100 * 72 / 25.4
|
14
14
|
1.m.should == 1000 * 72 / 25.4
|
15
|
-
|
15
|
+
|
16
16
|
1.in.should == 72
|
17
17
|
1.ft.should == 72 * 12
|
18
18
|
1.yd.should == 72 * 12 * 3
|
19
19
|
1.pt.should == 1
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
end
|
23
|
-
|
23
|
+
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
2
|
+
|
3
|
+
def tree_dump(tree)
|
4
|
+
if tree.is_a?(Prawn::Core::NameTree::Node)
|
5
|
+
"[" + tree.children.map { |child| tree_dump(child) }.join(",") + "]"
|
6
|
+
else
|
7
|
+
"#{tree.name}=#{tree.value}"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def tree_add(tree, *args)
|
12
|
+
args.each do |(name, value)|
|
13
|
+
tree.add(name, value)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def tree_value(name, value)
|
18
|
+
Prawn::Core::NameTree::Value.new(name, value)
|
19
|
+
end
|
20
|
+
|
21
|
+
class RefExposingDocument < Prawn::Document
|
22
|
+
def object_store
|
23
|
+
state.store
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "Name Tree" do
|
28
|
+
before(:each) { create_pdf(RefExposingDocument) }
|
29
|
+
|
30
|
+
it "should have no children when first initialized" do
|
31
|
+
node = Prawn::Core::NameTree::Node.new(@pdf, 3)
|
32
|
+
node.children.length.should == 0
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should have no subtrees while child limit is not reached" do
|
36
|
+
node = Prawn::Core::NameTree::Node.new(@pdf, 3)
|
37
|
+
tree_add(node, ["one", 1], ["two", 2], ["three", 3])
|
38
|
+
tree_dump(node).should == "[one=1,three=3,two=2]"
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should split into subtrees when limit is exceeded" do
|
42
|
+
node = Prawn::Core::NameTree::Node.new(@pdf, 3)
|
43
|
+
tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
|
44
|
+
tree_dump(node).should == "[[four=4,one=1],[three=3,two=2]]"
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should create a two new references when root is split" do
|
48
|
+
ref_count = @pdf.object_store.length
|
49
|
+
node = Prawn::Core::NameTree::Node.new(@pdf, 3)
|
50
|
+
tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
|
51
|
+
@pdf.object_store.length.should.equal ref_count+2
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should create a one new reference when subtree is split" do
|
55
|
+
node = Prawn::Core::NameTree::Node.new(@pdf, 3)
|
56
|
+
tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
|
57
|
+
|
58
|
+
ref_count = @pdf.object_store.length # save when root is split
|
59
|
+
tree_add(node, ["five", 5], ["six", 6], ["seven", 7])
|
60
|
+
tree_dump(node).should == "[[five=5,four=4,one=1],[seven=7,six=6],[three=3,two=2]]"
|
61
|
+
@pdf.object_store.length.should.equal ref_count+1
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should keep tree balanced when subtree split cascades to root" do
|
65
|
+
node = Prawn::Core::NameTree::Node.new(@pdf, 3)
|
66
|
+
tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
|
67
|
+
tree_add(node, ["five", 5], ["six", 6], ["seven", 7], ["eight", 8])
|
68
|
+
tree_dump(node).should == "[[[eight=8,five=5],[four=4,one=1]],[[seven=7,six=6],[three=3,two=2]]]"
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should maintain order of already properly ordered nodes" do
|
72
|
+
node = Prawn::Core::NameTree::Node.new(@pdf, 3)
|
73
|
+
tree_add(node, ["eight", 8], ["five", 5], ["four", 4], ["one", 1])
|
74
|
+
tree_add(node, ['seven', 7], ['six', 6], ['three', 3], ['two', 2])
|
75
|
+
tree_dump(node).should == "[[[eight=8,five=5],[four=4,one=1]],[[seven=7,six=6],[three=3,two=2]]]"
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should emit only :Names key with to_hash if root is only node" do
|
79
|
+
node = Prawn::Core::NameTree::Node.new(@pdf, 3)
|
80
|
+
tree_add(node, ["one", 1], ["two", 2], ["three", 3])
|
81
|
+
node.to_hash.should.equal(
|
82
|
+
{ :Names => [tree_value("one", 1), tree_value("three", 3), tree_value("two", 2)] }
|
83
|
+
)
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should emit only :Kids key with to_hash if root has children" do
|
87
|
+
node = Prawn::Core::NameTree::Node.new(@pdf, 3)
|
88
|
+
tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
|
89
|
+
node.to_hash.should.equal({ :Kids => node.children.map { |child| child.ref } })
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should emit :Limits and :Names keys with to_hash for leaf node" do
|
93
|
+
node = Prawn::Core::NameTree::Node.new(@pdf, 3)
|
94
|
+
tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
|
95
|
+
node.children.first.to_hash.should.equal(
|
96
|
+
{ :Limits => %w(four one),
|
97
|
+
:Names => [tree_value("four", 4), tree_value("one", 1)] }
|
98
|
+
)
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should emit :Limits and :Kids keys with to_hash for inner node" do
|
102
|
+
node = Prawn::Core::NameTree::Node.new(@pdf, 3)
|
103
|
+
tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
|
104
|
+
tree_add(node, ["five", 5], ["six", 6], ["seven", 7], ["eight", 8])
|
105
|
+
tree_add(node, ["nine", 9], ["ten", 10], ["eleven", 11], ["twelve", 12])
|
106
|
+
tree_add(node, ["thirteen", 13], ["fourteen", 14], ["fifteen", 15], ["sixteen", 16])
|
107
|
+
node.children.first.to_hash.should.equal(
|
108
|
+
{ :Limits => %w(eight one),
|
109
|
+
:Kids => node.children.first.children.map { |child| child.ref } }
|
110
|
+
)
|
111
|
+
end
|
112
|
+
end
|
data/spec/object_store_spec.rb
CHANGED
@@ -4,18 +4,60 @@ require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
|
4
4
|
|
5
5
|
describe "Prawn::ObjectStore" do
|
6
6
|
before(:each) do
|
7
|
-
@store =
|
7
|
+
@store = Prawn::Core::ObjectStore.new
|
8
8
|
end
|
9
9
|
|
10
10
|
it "should create required roots by default, including info passed to new" do
|
11
|
-
store =
|
11
|
+
store = Prawn::Core::ObjectStore.new(:info => {:Test => 3})
|
12
12
|
store.size.should == 3 # 3 default roots
|
13
13
|
store.info.data[:Test].should == 3
|
14
14
|
store.pages.data[:Count].should == 0
|
15
15
|
store.root.data[:Pages].should == store.pages
|
16
16
|
end
|
17
17
|
|
18
|
-
|
18
|
+
it "should import objects from an existing PDF" do
|
19
|
+
filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf"
|
20
|
+
store = Prawn::Core::ObjectStore.new(:template => filename)
|
21
|
+
store.size.should == 5
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should point to existing roots when importing objects from an existing PDF" do
|
25
|
+
filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf"
|
26
|
+
store = Prawn::Core::ObjectStore.new(:template => filename)
|
27
|
+
store.info.class.should == Prawn::Core::Reference
|
28
|
+
store.root.class.should == Prawn::Core::Reference
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should initialize with pages when importing objects from an existing PDF" do
|
32
|
+
filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf"
|
33
|
+
store = Prawn::Core::ObjectStore.new(:template => filename)
|
34
|
+
store.pages.data[:Count].should == 1
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should import all objects from a PDF that has an indirect reference in a stream dict" do
|
38
|
+
filename = "#{Prawn::BASEDIR}/data/pdfs/indirect_reference.pdf"
|
39
|
+
store = Prawn::Core::ObjectStore.new(:template => filename)
|
40
|
+
store.size.should == 8
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should raise ArgumentError when given a file that doesn exist as a template" do
|
44
|
+
filename = "not_really_there.pdf"
|
45
|
+
|
46
|
+
lambda { Prawn::Core::ObjectStore.new(:template => filename) }.should.raise(ArgumentError)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should raise Prawn::Errors::TemplateError when given a non PDF as a template" do
|
50
|
+
filename = "#{Prawn::BASEDIR}/data/images/dice.png"
|
51
|
+
|
52
|
+
lambda { Prawn::Core::ObjectStore.new(:template => filename) }.should.raise(Prawn::Errors::TemplateError)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should raise Prawn::Errors::TemplateError when given an encrypted PDF as a template" do
|
56
|
+
filename = "#{Prawn::BASEDIR}/data/pdfs/encrypted.pdf"
|
57
|
+
|
58
|
+
lambda { Prawn::Core::ObjectStore.new(:template => filename) }.should.raise(Prawn::Errors::TemplateError)
|
59
|
+
end
|
60
|
+
|
19
61
|
it "should add to its objects when ref() is called" do
|
20
62
|
count = @store.size
|
21
63
|
@store.ref("blah")
|
@@ -23,7 +65,7 @@ describe "Prawn::ObjectStore" do
|
|
23
65
|
end
|
24
66
|
|
25
67
|
it "should accept push with a Prawn::Reference" do
|
26
|
-
r =
|
68
|
+
r = Prawn::Core::Reference(123, "blah")
|
27
69
|
@store.push(r)
|
28
70
|
@store[r.identifier].should == r
|
29
71
|
end
|
@@ -40,17 +82,11 @@ describe "Prawn::ObjectStore" do
|
|
40
82
|
end
|
41
83
|
@store.map{|ref| ref.identifier}[-3..-1].should == [10, 11, 12]
|
42
84
|
end
|
43
|
-
|
44
|
-
it "should accept option to disabling PDF scaling in PDF clients" do
|
45
|
-
@store = PDF::Core::ObjectStore.new(:print_scaling => :none)
|
46
|
-
@store.root.data[:ViewerPreferences].should == {:PrintScaling => :None}
|
47
|
-
end
|
48
|
-
|
49
85
|
end
|
50
86
|
|
51
87
|
describe "Prawn::ObjectStore#compact" do
|
52
88
|
it "should do nothing to an ObjectStore with all live refs" do
|
53
|
-
store =
|
89
|
+
store = Prawn::Core::ObjectStore.new
|
54
90
|
store.info.data[:Blah] = store.ref(:some => "structure")
|
55
91
|
old_size = store.size
|
56
92
|
store.compact
|
@@ -59,23 +95,76 @@ describe "Prawn::ObjectStore#compact" do
|
|
59
95
|
end
|
60
96
|
|
61
97
|
it "should remove dead objects, renumbering live objects from 1" do
|
62
|
-
store =
|
98
|
+
store = Prawn::Core::ObjectStore.new
|
63
99
|
store.ref(:some => "structure")
|
64
100
|
old_size = store.size
|
65
101
|
store.compact
|
66
|
-
|
67
|
-
store.size.should
|
102
|
+
|
103
|
+
store.size.should.be < old_size
|
68
104
|
store.map{ |o| o.identifier }.should == (1..store.size).to_a
|
69
105
|
end
|
70
106
|
|
71
107
|
it "should detect and remove dead objects that were once live" do
|
72
|
-
store =
|
108
|
+
store = Prawn::Core::ObjectStore.new
|
73
109
|
store.info.data[:Blah] = store.ref(:some => "structure")
|
74
110
|
store.info.data[:Blah] = :overwritten
|
75
111
|
old_size = store.size
|
76
112
|
store.compact
|
77
|
-
|
78
|
-
store.size.should
|
113
|
+
|
114
|
+
store.size.should.be < old_size
|
79
115
|
store.map{ |o| o.identifier }.should == (1..store.size).to_a
|
80
116
|
end
|
81
117
|
end
|
118
|
+
|
119
|
+
describe "Prawn::ObjectStorie#object_id_for_page" do
|
120
|
+
it "should return the object ID of an imported template page" do
|
121
|
+
filename = "#{Prawn::BASEDIR}/data/pdfs/hexagon.pdf"
|
122
|
+
store = Prawn::Core::ObjectStore.new(:template => filename)
|
123
|
+
store.object_id_for_page(0).should == 4
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should return the object ID of the first imported template page" do
|
127
|
+
filename = "#{Prawn::BASEDIR}/data/pdfs/two_hexagons.pdf"
|
128
|
+
store = Prawn::Core::ObjectStore.new(:template => filename)
|
129
|
+
store.object_id_for_page(1).should == 4
|
130
|
+
end
|
131
|
+
|
132
|
+
it "should return the object ID of the last imported template page" do
|
133
|
+
filename = "#{Prawn::BASEDIR}/data/pdfs/two_hexagons.pdf"
|
134
|
+
store = Prawn::Core::ObjectStore.new(:template => filename)
|
135
|
+
store.object_id_for_page(-1).should == 6
|
136
|
+
end
|
137
|
+
|
138
|
+
it "should return the object ID of the first page of a template that uses nested Pages" do
|
139
|
+
filename = "#{Prawn::BASEDIR}/data/pdfs/nested_pages.pdf"
|
140
|
+
store = Prawn::Core::ObjectStore.new(:template => filename)
|
141
|
+
store.object_id_for_page(1).should == 5
|
142
|
+
end
|
143
|
+
|
144
|
+
it "should return the object ID of the last page of a template that uses nested Pages" do
|
145
|
+
filename = "#{Prawn::BASEDIR}/data/pdfs/nested_pages.pdf"
|
146
|
+
store = Prawn::Core::ObjectStore.new(:template => filename)
|
147
|
+
store.object_id_for_page(-1).should == 8
|
148
|
+
end
|
149
|
+
|
150
|
+
it "should return nil if given an invalid page number" do
|
151
|
+
filename = "#{Prawn::BASEDIR}/data/pdfs/hexagon.pdf"
|
152
|
+
store = Prawn::Core::ObjectStore.new(:template => filename)
|
153
|
+
store.object_id_for_page(10).should == nil
|
154
|
+
end
|
155
|
+
|
156
|
+
it "should return nil if given an invalid page number" do
|
157
|
+
store = Prawn::Core::ObjectStore.new
|
158
|
+
store.object_id_for_page(10).should == nil
|
159
|
+
end
|
160
|
+
|
161
|
+
it "should accept a stream instead of a filename" do
|
162
|
+
example = Prawn::Document.new()
|
163
|
+
example.text "An example doc, created in memory"
|
164
|
+
example.start_new_page
|
165
|
+
StringIO.open(example.render) do |stream|
|
166
|
+
@pdf = Prawn::Core::ObjectStore.new(:template => stream)
|
167
|
+
end
|
168
|
+
@pdf.page_count.should == 2
|
169
|
+
end
|
170
|
+
end
|