prawn 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +2 -0
- data.tar.gz.sig +0 -0
- data/Gemfile +1 -9
- data/Rakefile +12 -22
- data/lib/prawn.rb +29 -48
- data/lib/prawn/document.rb +148 -123
- data/lib/prawn/document/bounding_box.rb +33 -26
- data/lib/prawn/document/column_box.rb +5 -7
- data/lib/prawn/document/internals.rb +6 -6
- data/lib/prawn/document/span.rb +20 -17
- data/lib/prawn/encoding.rb +65 -67
- data/lib/prawn/errors.rb +10 -7
- data/lib/prawn/font.rb +78 -62
- data/lib/prawn/font/afm.rb +93 -66
- data/lib/prawn/font/dfont.rb +2 -10
- data/lib/prawn/font/ttc.rb +34 -0
- data/lib/prawn/font/ttf.rb +73 -65
- data/lib/prawn/font_metric_cache.rb +9 -8
- data/lib/prawn/graphics.rb +110 -70
- data/lib/prawn/graphics/blend_mode.rb +7 -8
- data/lib/prawn/graphics/cap_style.rb +2 -4
- data/lib/prawn/graphics/color.rb +23 -26
- data/lib/prawn/graphics/dash.rb +22 -12
- data/lib/prawn/graphics/join_style.rb +8 -4
- data/lib/prawn/graphics/patterns.rb +185 -96
- data/lib/prawn/graphics/transformation.rb +11 -9
- data/lib/prawn/graphics/transparency.rb +15 -13
- data/lib/prawn/grid.rb +20 -20
- data/lib/prawn/image_handler.rb +4 -6
- data/lib/prawn/images.rb +22 -15
- data/lib/prawn/images/image.rb +0 -1
- data/lib/prawn/images/jpg.rb +26 -22
- data/lib/prawn/images/png.rb +60 -57
- data/lib/prawn/measurement_extensions.rb +8 -9
- data/lib/prawn/measurements.rb +14 -15
- data/lib/prawn/outline.rb +96 -78
- data/lib/prawn/repeater.rb +12 -10
- data/lib/prawn/security.rb +66 -48
- data/lib/prawn/security/arcfour.rb +1 -3
- data/lib/prawn/soft_mask.rb +23 -25
- data/lib/prawn/stamp.rb +16 -12
- data/lib/prawn/text.rb +59 -45
- data/lib/prawn/text/box.rb +9 -8
- data/lib/prawn/text/formatted.rb +4 -6
- data/lib/prawn/text/formatted/arranger.rb +51 -30
- data/lib/prawn/text/formatted/box.rb +112 -88
- data/lib/prawn/text/formatted/fragment.rb +10 -15
- data/lib/prawn/text/formatted/line_wrap.rb +118 -61
- data/lib/prawn/text/formatted/parser.rb +134 -110
- data/lib/prawn/text/formatted/wrap.rb +42 -32
- data/lib/prawn/transformation_stack.rb +3 -4
- data/lib/prawn/utilities.rb +6 -21
- data/lib/prawn/version.rb +1 -3
- data/lib/prawn/view.rb +4 -2
- data/manual/basic_concepts/adding_pages.rb +4 -7
- data/manual/basic_concepts/basic_concepts.rb +29 -22
- data/manual/basic_concepts/creation.rb +8 -11
- data/manual/basic_concepts/cursor.rb +2 -5
- data/manual/basic_concepts/measurement.rb +3 -6
- data/manual/basic_concepts/origin.rb +3 -6
- data/manual/basic_concepts/other_cursor_helpers.rb +9 -12
- data/manual/basic_concepts/view.rb +20 -16
- data/manual/bounding_box/bounding_box.rb +27 -24
- data/manual/bounding_box/bounds.rb +9 -12
- data/manual/bounding_box/canvas.rb +2 -5
- data/manual/bounding_box/creation.rb +4 -7
- data/manual/bounding_box/indentation.rb +12 -15
- data/manual/bounding_box/nesting.rb +22 -17
- data/manual/bounding_box/russian_boxes.rb +8 -9
- data/manual/bounding_box/stretchy.rb +10 -13
- data/manual/contents.rb +26 -22
- data/manual/cover.rb +22 -20
- data/manual/document_and_page_options/background.rb +9 -13
- data/manual/document_and_page_options/document_and_page_options.rb +23 -20
- data/manual/document_and_page_options/metadata.rb +16 -16
- data/manual/document_and_page_options/page_margins.rb +16 -20
- data/manual/document_and_page_options/page_size.rb +11 -12
- data/manual/document_and_page_options/print_scaling.rb +15 -15
- data/manual/example_helper.rb +2 -4
- data/manual/graphics/blend_mode.rb +10 -9
- data/manual/graphics/circle_and_ellipse.rb +2 -5
- data/manual/graphics/color.rb +5 -9
- data/manual/graphics/common_lines.rb +5 -8
- data/manual/graphics/fill_and_stroke.rb +2 -5
- data/manual/graphics/fill_rules.rb +7 -10
- data/manual/graphics/gradients.rb +25 -21
- data/manual/graphics/graphics.rb +49 -43
- data/manual/graphics/helper.rb +10 -9
- data/manual/graphics/line_width.rb +5 -7
- data/manual/graphics/lines_and_curves.rb +5 -8
- data/manual/graphics/polygon.rb +4 -8
- data/manual/graphics/rectangle.rb +2 -5
- data/manual/graphics/rotate.rb +4 -7
- data/manual/graphics/scale.rb +12 -15
- data/manual/graphics/soft_masks.rb +1 -4
- data/manual/graphics/stroke_cap.rb +3 -6
- data/manual/graphics/stroke_dash.rb +9 -12
- data/manual/graphics/stroke_join.rb +2 -5
- data/manual/graphics/translate.rb +7 -10
- data/manual/graphics/transparency.rb +5 -8
- data/manual/how_to_read_this_manual.rb +4 -6
- data/manual/images/absolute_position.rb +4 -7
- data/manual/images/fit.rb +5 -8
- data/manual/images/horizontal.rb +6 -9
- data/manual/images/images.rb +25 -23
- data/manual/images/plain_image.rb +3 -6
- data/manual/images/scale.rb +7 -10
- data/manual/images/vertical.rb +10 -13
- data/manual/images/width_and_height.rb +8 -11
- data/manual/layout/boxes.rb +3 -6
- data/manual/layout/content.rb +5 -8
- data/manual/layout/layout.rb +16 -16
- data/manual/layout/simple_grid.rb +4 -7
- data/manual/outline/add_subsection_to.rb +18 -21
- data/manual/outline/insert_section_after.rb +13 -16
- data/manual/outline/outline.rb +19 -17
- data/manual/outline/sections_and_pages.rb +15 -18
- data/manual/repeatable_content/alternate_page_numbering.rb +19 -17
- data/manual/repeatable_content/page_numbering.rb +15 -16
- data/manual/repeatable_content/repeatable_content.rb +23 -19
- data/manual/repeatable_content/repeater.rb +12 -15
- data/manual/repeatable_content/stamp.rb +12 -15
- data/manual/security/encryption.rb +7 -10
- data/manual/security/permissions.rb +17 -14
- data/manual/security/security.rb +17 -16
- data/manual/table.rb +2 -4
- data/manual/text/alignment.rb +14 -17
- data/manual/text/color.rb +10 -11
- data/manual/text/column_box.rb +5 -8
- data/manual/text/fallback_fonts.rb +23 -21
- data/manual/text/font.rb +9 -12
- data/manual/text/font_size.rb +11 -14
- data/manual/text/font_style.rb +4 -7
- data/manual/text/formatted_callbacks.rb +23 -21
- data/manual/text/formatted_text.rb +31 -25
- data/manual/text/free_flowing_text.rb +18 -21
- data/manual/text/inline.rb +16 -19
- data/manual/text/kerning_and_character_spacing.rb +12 -15
- data/manual/text/leading.rb +5 -8
- data/manual/text/line_wrapping.rb +33 -17
- data/manual/text/paragraph_indentation.rb +11 -14
- data/manual/text/positioned_text.rb +13 -16
- data/manual/text/registering_families.rb +16 -19
- data/manual/text/rendering_and_color.rb +7 -10
- data/manual/text/right_to_left_text.rb +24 -19
- data/manual/text/rotation.rb +26 -23
- data/manual/text/single_usage.rb +6 -9
- data/manual/text/text.rb +56 -52
- data/manual/text/text_box_excess.rb +18 -17
- data/manual/text/text_box_extensions.rb +16 -15
- data/manual/text/text_box_overflow.rb +15 -18
- data/manual/text/utf8.rb +9 -12
- data/manual/text/win_ansi_charset.rb +18 -19
- data/prawn.gemspec +37 -27
- data/spec/extensions/encoding_helpers.rb +0 -2
- data/spec/manual_spec.rb +33 -0
- data/spec/prawn/document/bounding_box_spec.rb +546 -0
- data/spec/prawn/document/column_box_spec.rb +73 -0
- data/spec/prawn/document/security_spec.rb +173 -0
- data/spec/prawn/document_annotations_spec.rb +74 -0
- data/spec/prawn/document_destinations_spec.rb +13 -0
- data/spec/prawn/document_grid_spec.rb +96 -0
- data/spec/prawn/document_reference_spec.rb +25 -0
- data/spec/prawn/document_span_spec.rb +34 -0
- data/spec/prawn/document_spec.rb +751 -0
- data/spec/prawn/font_metric_cache_spec.rb +52 -0
- data/spec/prawn/font_spec.rb +513 -0
- data/spec/prawn/graphics/blend_mode_spec.rb +61 -0
- data/spec/prawn/graphics/transparency_spec.rb +79 -0
- data/spec/prawn/graphics_spec.rb +817 -0
- data/spec/prawn/graphics_stroke_styles_spec.rb +227 -0
- data/spec/{image_handler_spec.rb → prawn/image_handler_spec.rb} +13 -15
- data/spec/prawn/images/jpg_spec.rb +18 -0
- data/spec/prawn/images/png_spec.rb +281 -0
- data/spec/prawn/images_spec.rb +170 -0
- data/spec/prawn/measurements_extensions_spec.rb +22 -0
- data/spec/prawn/outline_spec.rb +408 -0
- data/spec/prawn/repeater_spec.rb +163 -0
- data/spec/prawn/soft_mask_spec.rb +72 -0
- data/spec/prawn/stamp_spec.rb +168 -0
- data/spec/prawn/text/box_spec.rb +1113 -0
- data/spec/prawn/text/formatted/arranger_spec.rb +464 -0
- data/spec/prawn/text/formatted/box_spec.rb +825 -0
- data/spec/prawn/text/formatted/fragment_spec.rb +341 -0
- data/spec/prawn/text/formatted/line_wrap_spec.rb +491 -0
- data/spec/prawn/text/formatted/parser_spec.rb +667 -0
- data/spec/prawn/text_draw_text_spec.rb +147 -0
- data/spec/prawn/text_rendering_mode_spec.rb +42 -0
- data/spec/prawn/text_spacing_spec.rb +93 -0
- data/spec/prawn/text_spec.rb +601 -0
- data/spec/prawn/text_with_inline_formatting_spec.rb +33 -0
- data/spec/{transformation_stack_spec.rb → prawn/transformation_stack_spec.rb} +21 -20
- data/spec/prawn/view_spec.rb +45 -0
- data/spec/spec_helper.rb +16 -16
- metadata +96 -151
- metadata.gz.sig +1 -0
- data/data/images/16bit.alpha +0 -0
- data/data/images/16bit.color +0 -0
- data/data/images/16bit.png +0 -0
- data/data/images/arrow.png +0 -0
- data/data/images/arrow2.png +0 -0
- data/data/images/blend_modes_bottom_layer.jpg +0 -0
- data/data/images/blend_modes_top_layer.jpg +0 -0
- data/data/images/dice.alpha +0 -0
- data/data/images/dice.color +0 -0
- data/data/images/dice.png +0 -0
- data/data/images/dice_interlaced.png +0 -0
- data/data/images/fractal.jpg +0 -0
- data/data/images/indexed_color.dat +0 -0
- data/data/images/indexed_color.png +0 -0
- data/data/images/indexed_transparency.png +0 -0
- data/data/images/indexed_transparency_alpha.dat +0 -0
- data/data/images/indexed_transparency_color.dat +0 -0
- data/data/images/letterhead.jpg +0 -0
- data/data/images/license.md +0 -8
- data/data/images/page_white_text.alpha +0 -0
- data/data/images/page_white_text.color +0 -0
- data/data/images/page_white_text.png +0 -0
- data/data/images/pigs.jpg +0 -0
- data/data/images/prawn.png +0 -0
- data/data/images/ruport.png +0 -0
- data/data/images/ruport_data.dat +0 -0
- data/data/images/ruport_transparent.png +0 -0
- data/data/images/ruport_type0.png +0 -0
- data/data/images/stef.jpg +0 -0
- data/data/images/tru256.bmp +0 -0
- data/data/images/web-links.dat +0 -1
- data/data/images/web-links.png +0 -0
- data/data/pdfs/complex_template.pdf +0 -0
- data/data/pdfs/contains_ttf_font.pdf +0 -0
- data/data/pdfs/encrypted.pdf +0 -0
- data/data/pdfs/form.pdf +1 -819
- data/data/pdfs/hexagon.pdf +0 -61
- data/data/pdfs/indirect_reference.pdf +0 -86
- data/data/pdfs/multipage_template.pdf +0 -127
- data/data/pdfs/nested_pages.pdf +0 -118
- data/data/pdfs/page_without_mediabox.pdf +0 -193
- data/data/pdfs/resources_as_indirect_object.pdf +0 -83
- data/data/pdfs/two_hexagons.pdf +0 -90
- data/data/pdfs/version_1_6.pdf +0 -61
- data/data/shift_jis_text.txt +0 -1
- data/spec/acceptance/png_spec.rb +0 -35
- data/spec/annotations_spec.rb +0 -67
- data/spec/blend_mode_spec.rb +0 -71
- data/spec/bounding_box_spec.rb +0 -501
- data/spec/column_box_spec.rb +0 -59
- data/spec/destinations_spec.rb +0 -13
- data/spec/document_spec.rb +0 -738
- data/spec/font_metric_cache_spec.rb +0 -52
- data/spec/font_spec.rb +0 -475
- data/spec/formatted_text_arranger_spec.rb +0 -452
- data/spec/formatted_text_box_spec.rb +0 -716
- data/spec/formatted_text_fragment_spec.rb +0 -299
- data/spec/graphics_spec.rb +0 -705
- data/spec/grid_spec.rb +0 -95
- data/spec/images_spec.rb +0 -167
- data/spec/inline_formatted_text_parser_spec.rb +0 -568
- data/spec/jpg_spec.rb +0 -23
- data/spec/line_wrap_spec.rb +0 -366
- data/spec/measurement_units_spec.rb +0 -22
- data/spec/outline_spec.rb +0 -409
- data/spec/png_spec.rb +0 -257
- data/spec/reference_spec.rb +0 -25
- data/spec/repeater_spec.rb +0 -154
- data/spec/security_spec.rb +0 -151
- data/spec/soft_mask_spec.rb +0 -78
- data/spec/span_spec.rb +0 -43
- data/spec/stamp_spec.rb +0 -179
- data/spec/stroke_styles_spec.rb +0 -208
- data/spec/text_at_spec.rb +0 -142
- data/spec/text_box_spec.rb +0 -1042
- data/spec/text_rendering_mode_spec.rb +0 -45
- data/spec/text_spacing_spec.rb +0 -93
- data/spec/text_spec.rb +0 -543
- data/spec/text_with_inline_formatting_spec.rb +0 -35
- data/spec/transparency_spec.rb +0 -91
- data/spec/view_spec.rb +0 -42
@@ -1,13 +1,11 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
# wrap.rb: Handles text wrapping for for formatted text
|
4
2
|
#
|
5
3
|
# Contributed by Daniel Nelson
|
6
4
|
#
|
7
5
|
# This is free software. Please see the LICENSE and COPYING files for details.
|
8
6
|
|
9
|
-
require_relative
|
10
|
-
require_relative
|
7
|
+
require_relative 'line_wrap'
|
8
|
+
require_relative 'arranger'
|
11
9
|
|
12
10
|
module Prawn
|
13
11
|
module Text
|
@@ -15,10 +13,12 @@ module Prawn
|
|
15
13
|
# @private
|
16
14
|
|
17
15
|
module Wrap #:nodoc:
|
18
|
-
def initialize(
|
16
|
+
def initialize(_array, options)
|
19
17
|
@line_wrap = Prawn::Text::Formatted::LineWrap.new
|
20
|
-
@arranger = Prawn::Text::Formatted::Arranger.new(
|
21
|
-
|
18
|
+
@arranger = Prawn::Text::Formatted::Arranger.new(
|
19
|
+
@document,
|
20
|
+
kerning: options[:kerning]
|
21
|
+
)
|
22
22
|
@disable_wrap_by_char = options[:disable_wrap_by_char]
|
23
23
|
end
|
24
24
|
|
@@ -46,15 +46,17 @@ module Prawn
|
|
46
46
|
initialize_wrap(array)
|
47
47
|
|
48
48
|
stop = false
|
49
|
-
|
49
|
+
until stop
|
50
50
|
# wrap before testing if enough height for this line because the
|
51
51
|
# height of the highest fragment on this line will be used to
|
52
52
|
# determine the line height
|
53
|
-
@line_wrap.wrap_line(
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
53
|
+
@line_wrap.wrap_line(
|
54
|
+
document: @document,
|
55
|
+
kerning: @kerning,
|
56
|
+
width: available_width,
|
57
|
+
arranger: @arranger,
|
58
|
+
disable_wrap_by_char: @disable_wrap_by_char
|
59
|
+
)
|
58
60
|
|
59
61
|
if enough_height_for_this_line?
|
60
62
|
move_baseline_down
|
@@ -78,30 +80,36 @@ module Prawn
|
|
78
80
|
fragments_this_line = []
|
79
81
|
|
80
82
|
word_spacing = word_spacing_for_this_line
|
81
|
-
|
83
|
+
@arranger.fragments.each do |fragment|
|
82
84
|
fragment.word_spacing = word_spacing
|
83
85
|
if fragment.text == "\n"
|
84
|
-
printed_fragments << "\n" if @printed_lines.last ==
|
86
|
+
printed_fragments << "\n" if @printed_lines.last == ''
|
85
87
|
break
|
86
88
|
end
|
87
89
|
printed_fragments << fragment.text
|
88
90
|
fragments_this_line << fragment
|
89
91
|
end
|
92
|
+
@arranger.fragments.replace []
|
90
93
|
|
91
94
|
accumulated_width = 0
|
92
95
|
fragments_this_line.reverse! if @direction == :rtl
|
93
96
|
fragments_this_line.each do |fragment_this_line|
|
94
97
|
fragment_this_line.default_direction = @direction
|
95
|
-
format_and_draw_fragment(
|
96
|
-
|
98
|
+
format_and_draw_fragment(
|
99
|
+
fragment_this_line, accumulated_width,
|
100
|
+
@line_wrap.width, word_spacing
|
101
|
+
)
|
97
102
|
accumulated_width += fragment_this_line.width
|
98
103
|
end
|
99
104
|
|
100
|
-
@printed_lines << printed_fragments.map
|
105
|
+
@printed_lines << printed_fragments.map do |s|
|
106
|
+
s.force_encoding(::Encoding::UTF_8)
|
107
|
+
end.join
|
101
108
|
end
|
102
109
|
|
103
110
|
def word_spacing_for_this_line
|
104
|
-
if @align == :justify && @line_wrap.space_count > 0 &&
|
111
|
+
if @align == :justify && @line_wrap.space_count > 0 &&
|
112
|
+
!@line_wrap.paragraph_finished?
|
105
113
|
(available_width - @line_wrap.width) / @line_wrap.space_count
|
106
114
|
else
|
107
115
|
0
|
@@ -110,13 +118,13 @@ module Prawn
|
|
110
118
|
|
111
119
|
def enough_height_for_this_line?
|
112
120
|
@line_height = @arranger.max_line_height
|
113
|
-
@descender
|
114
|
-
@ascender
|
115
|
-
if @baseline_y
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
121
|
+
@descender = @arranger.max_descender
|
122
|
+
@ascender = @arranger.max_ascender
|
123
|
+
diff = if @baseline_y.zero?
|
124
|
+
@ascender + @descender
|
125
|
+
else
|
126
|
+
@descender + @line_height + @leading
|
127
|
+
end
|
120
128
|
require_relatived_total_height = @baseline_y.abs + diff
|
121
129
|
if require_relatived_total_height > @height + 0.0001
|
122
130
|
# no room for the full height of this line
|
@@ -133,9 +141,9 @@ module Prawn
|
|
133
141
|
|
134
142
|
# these values will depend on the maximum value within a given line
|
135
143
|
@line_height = 0
|
136
|
-
@descender
|
137
|
-
@ascender
|
138
|
-
@baseline_y
|
144
|
+
@descender = 0
|
145
|
+
@ascender = 0
|
146
|
+
@baseline_y = 0
|
139
147
|
|
140
148
|
@printed_lines = []
|
141
149
|
@nothing_printed = true
|
@@ -143,10 +151,12 @@ module Prawn
|
|
143
151
|
end
|
144
152
|
|
145
153
|
def format_and_draw_fragment(fragment, accumulated_width,
|
146
|
-
|
154
|
+
line_width, word_spacing)
|
147
155
|
@arranger.apply_color_and_font_settings(fragment) do
|
148
|
-
draw_fragment(
|
149
|
-
|
156
|
+
draw_fragment(
|
157
|
+
fragment, accumulated_width,
|
158
|
+
line_width, word_spacing
|
159
|
+
)
|
150
160
|
end
|
151
161
|
end
|
152
162
|
end
|
@@ -1,14 +1,13 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
# transformation_stack.rb : Stores the transformations that have been applied to the document
|
1
|
+
# transformation_stack.rb : Stores the transformations that have been applied to
|
2
|
+
# the document
|
4
3
|
#
|
5
4
|
# Copyright 2015, Roger Nesbitt. All Rights Reserved.
|
6
5
|
#
|
7
6
|
# This is free software. Please see the LICENSE and COPYING files for details.
|
8
|
-
#
|
9
7
|
|
10
8
|
require 'matrix'
|
11
9
|
|
10
|
+
# rubocop: disable Metrics/ParameterLists
|
12
11
|
module Prawn
|
13
12
|
module TransformationStack
|
14
13
|
def add_to_transformation_stack(a, b, c, d, e, f)
|
data/lib/prawn/utilities.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
# utilities.rb : General-purpose utility classes which don't fit anywhere else
|
4
2
|
#
|
5
3
|
# Copyright August 2012, Alex Dowad. All Rights Reserved.
|
@@ -9,15 +7,17 @@
|
|
9
7
|
require 'thread'
|
10
8
|
|
11
9
|
module Prawn
|
12
|
-
# Throughout the Prawn codebase, repeated calculations which can benefit from
|
13
|
-
#
|
14
|
-
#
|
10
|
+
# Throughout the Prawn codebase, repeated calculations which can benefit from
|
11
|
+
# caching are made.
|
12
|
+
# In some cases, caching and reusing results can not only save CPU cycles but
|
13
|
+
# also greatly reduce memory requirements
|
15
14
|
# But at the same time, we don't want to throw away thread safety
|
16
15
|
# We have two interchangeable thread-safe cache implementations:
|
17
16
|
|
18
17
|
# @private
|
19
18
|
class SynchronizedCache
|
20
|
-
# As an optimization, this could access the hash directly on VMs with
|
19
|
+
# As an optimization, this could access the hash directly on VMs with
|
20
|
+
# a global interpreter lock (like MRI)
|
21
21
|
def initialize
|
22
22
|
@cache = {}
|
23
23
|
@mutex = Mutex.new
|
@@ -31,19 +31,4 @@ module Prawn
|
|
31
31
|
@mutex.synchronize { @cache[key] = value }
|
32
32
|
end
|
33
33
|
end
|
34
|
-
|
35
|
-
# @private
|
36
|
-
class ThreadLocalCache
|
37
|
-
def initialize
|
38
|
-
@cache_id = "cache_#{self.object_id}".to_sym
|
39
|
-
end
|
40
|
-
|
41
|
-
def [](key)
|
42
|
-
(Thread.current[@cache_id] ||= {})[key]
|
43
|
-
end
|
44
|
-
|
45
|
-
def []=(key, value)
|
46
|
-
(Thread.current[@cache_id] ||= {})[key] = value
|
47
|
-
end
|
48
|
-
end
|
49
34
|
end
|
data/lib/prawn/version.rb
CHANGED
data/lib/prawn/view.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
#
|
3
1
|
# prawn/view.rb : Implements a mixin for Prawn's DSL
|
4
2
|
#
|
5
3
|
# This is free software. Please see the LICENSE and COPYING files for details.
|
@@ -69,6 +67,10 @@ module Prawn
|
|
69
67
|
document.send(m, *a, &b)
|
70
68
|
end
|
71
69
|
|
70
|
+
def respond_to_missing?
|
71
|
+
document.respond_to?(m)
|
72
|
+
end
|
73
|
+
|
72
74
|
# Syntactic sugar that uses +instance_eval+ under the hood to provide
|
73
75
|
# a block-based DSL.
|
74
76
|
#
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
#
|
3
1
|
# A PDF document is a collection of pages. When we create a new document be it
|
4
2
|
# with <code>Document.new</code> or on a <code>Document.generate</code> block
|
5
3
|
# one initial page is created for us.
|
@@ -12,14 +10,13 @@
|
|
12
10
|
#
|
13
11
|
# Just use the <code>start_new_page</code> method and a shiny new page will be
|
14
12
|
# created for you just like in the following snippet.
|
15
|
-
|
16
|
-
|
17
|
-
%w[.. example_helper]))
|
13
|
+
|
14
|
+
require_relative '../example_helper'
|
18
15
|
|
19
16
|
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
20
17
|
Prawn::ManualBuilder::Example.generate(filename) do
|
21
|
-
text "We are still on the initial page for this example. Now I'll ask "
|
22
|
-
|
18
|
+
text "We are still on the initial page for this example. Now I'll ask " \
|
19
|
+
'Prawn to gently start a new page. Please follow me to the next page.'
|
23
20
|
|
24
21
|
start_new_page
|
25
22
|
|
@@ -1,34 +1,41 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
#
|
3
1
|
# Examples for Prawn basic concepts.
|
4
2
|
#
|
5
3
|
|
6
|
-
require_relative
|
4
|
+
require_relative '../example_helper'
|
7
5
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
p.example
|
12
|
-
p.example
|
13
|
-
p.example
|
14
|
-
p.example
|
15
|
-
p.example
|
16
|
-
p.example
|
6
|
+
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
7
|
+
Prawn::ManualBuilder::Example.generate(filename, page_size: 'FOLIO') do
|
8
|
+
package 'basic_concepts' do |p|
|
9
|
+
p.example 'creation', eval_source: false, full_source: true
|
10
|
+
p.example 'origin'
|
11
|
+
p.example 'cursor'
|
12
|
+
p.example 'other_cursor_helpers'
|
13
|
+
p.example 'adding_pages'
|
14
|
+
p.example 'measurement'
|
15
|
+
p.example 'view', eval_source: false, full_source: true
|
17
16
|
|
18
17
|
p.intro do
|
19
|
-
prose
|
18
|
+
prose <<-END
|
19
|
+
This chapter covers the minimum amount of functionality you'll need to
|
20
|
+
start using Prawn.
|
20
21
|
|
21
|
-
|
22
|
+
If you are new to Prawn this is the first chapter to read. Once you are
|
23
|
+
comfortable with the concepts shown here you might want to check the
|
24
|
+
Basics section of the Graphics, Bounding Box and Text sections.
|
22
25
|
|
23
|
-
|
26
|
+
The examples show:
|
27
|
+
END
|
24
28
|
|
25
|
-
list(
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
list(
|
30
|
+
'How to create new pdf documents in every possible way',
|
31
|
+
'Where the origin for the document coordinates is. What are Bounding '\
|
32
|
+
'Boxes and how they interact with the origin',
|
33
|
+
'How the cursor behaves',
|
34
|
+
'How to start new pages',
|
35
|
+
'What the base unit for measurement and coordinates is and how to use '\
|
36
|
+
'other convenient measures',
|
37
|
+
"How to build custom view objects that use Prawn's DSL"
|
38
|
+
)
|
32
39
|
end
|
33
40
|
end
|
34
41
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
#
|
3
1
|
# There are three ways to create a PDF Document in Prawn: creating a new
|
4
2
|
# <code>Prawn::Document</code> instance, or using the
|
5
3
|
# <code>Prawn::Document.generate</code> method with and without block arguments.
|
@@ -19,21 +17,20 @@
|
|
19
17
|
# The generate method without block arguments requires
|
20
18
|
# less typing and defines and renders the pdf document in one shot.
|
21
19
|
# Almost all of the examples are coded this way.
|
22
|
-
|
23
|
-
|
24
|
-
%w[.. example_helper]))
|
20
|
+
|
21
|
+
require_relative '../example_helper'
|
25
22
|
|
26
23
|
# Assignment
|
27
24
|
pdf = Prawn::Document.new
|
28
|
-
pdf.text
|
29
|
-
pdf.render_file
|
25
|
+
pdf.text 'Hello World'
|
26
|
+
pdf.render_file 'assignment.pdf'
|
30
27
|
|
31
28
|
# Implicit Block
|
32
|
-
Prawn::Document.generate(
|
33
|
-
text
|
29
|
+
Prawn::Document.generate('implicit.pdf') do
|
30
|
+
text 'Hello World'
|
34
31
|
end
|
35
32
|
|
36
33
|
# Explicit Block
|
37
|
-
Prawn::Document.generate(
|
38
|
-
pdf.text
|
34
|
+
Prawn::Document.generate('explicit.pdf') do |pdf|
|
35
|
+
pdf.text 'Hello World'
|
39
36
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
#
|
3
1
|
# We normally write our documents from top to bottom and it is no different with
|
4
2
|
# Prawn. Even if the origin is on the bottom left corner we still fill the page
|
5
3
|
# from the top to the bottom. In other words the cursor for inserting content
|
@@ -11,9 +9,8 @@
|
|
11
9
|
# The following snippet shows how the cursor behaves when we add some text to
|
12
10
|
# the page and demonstrates some of the helpers to manage the cursor position.
|
13
11
|
# The <code>cursor</code> method returns the current cursor position.
|
14
|
-
|
15
|
-
|
16
|
-
%w[.. example_helper]))
|
12
|
+
|
13
|
+
require_relative '../example_helper'
|
17
14
|
|
18
15
|
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
19
16
|
Prawn::ManualBuilder::Example.generate(filename) do
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
#
|
3
1
|
# The base unit in Prawn is the PDF Point. One PDF Point is equal to 1/72 of
|
4
2
|
# an inch.
|
5
3
|
#
|
@@ -10,13 +8,12 @@
|
|
10
8
|
# Just <code>require "prawn/measurement_extensions"</code> and it will mix some
|
11
9
|
# helpers onto <code>Numeric</code> for converting common measurement units to
|
12
10
|
# PDF Points.
|
13
|
-
|
14
|
-
|
15
|
-
%w[.. example_helper]))
|
11
|
+
|
12
|
+
require_relative '../example_helper'
|
16
13
|
|
17
14
|
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
18
15
|
Prawn::ManualBuilder::Example.generate(filename) do
|
19
|
-
require
|
16
|
+
require 'prawn/measurement_extensions'
|
20
17
|
|
21
18
|
[:mm, :cm, :dm, :m, :in, :yd, :ft].each do |measurement|
|
22
19
|
text "1 #{measurement} in PDF Points: #{1.send(measurement)} pt"
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
#
|
3
1
|
# This is the most important concept you need to learn about Prawn:
|
4
2
|
#
|
5
3
|
# PDF documents have the origin <code>[0,0]</code> at the bottom-left corner of
|
@@ -21,9 +19,8 @@
|
|
21
19
|
#
|
22
20
|
# The following snippet strokes a circle on the margin box origin. Then strokes
|
23
21
|
# the boundaries of a bounding box and a circle on its origin.
|
24
|
-
|
25
|
-
|
26
|
-
%w[.. example_helper]))
|
22
|
+
|
23
|
+
require_relative '../example_helper'
|
27
24
|
|
28
25
|
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
29
26
|
Prawn::ManualBuilder::Example.generate(filename) do
|
@@ -31,7 +28,7 @@ Prawn::ManualBuilder::Example.generate(filename) do
|
|
31
28
|
|
32
29
|
stroke_circle [0, 0], 10
|
33
30
|
|
34
|
-
bounding_box([100, 300], :
|
31
|
+
bounding_box([100, 300], width: 300, height: 200) do
|
35
32
|
stroke_bounds
|
36
33
|
stroke_circle [0, 0], 10
|
37
34
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
#
|
3
1
|
# Another group of helpers for changing the cursor position are the pad methods.
|
4
2
|
# They accept a numeric value and a block. <code>pad</code> will use the numeric
|
5
3
|
# value to move the cursor down both before and after the block content.
|
@@ -8,33 +6,32 @@
|
|
8
6
|
#
|
9
7
|
# <code>float</code> is a method for not changing the cursor. Pass it a block
|
10
8
|
# and the cursor will remain on the same place when the block returns.
|
11
|
-
|
12
|
-
|
13
|
-
%w[.. example_helper]))
|
9
|
+
|
10
|
+
require_relative '../example_helper'
|
14
11
|
|
15
12
|
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
16
13
|
Prawn::ManualBuilder::Example.generate(filename) do
|
17
14
|
stroke_horizontal_rule
|
18
|
-
pad(20) { text
|
15
|
+
pad(20) { text 'Text padded both before and after.' }
|
19
16
|
|
20
17
|
stroke_horizontal_rule
|
21
|
-
pad_top(20) { text
|
18
|
+
pad_top(20) { text 'Text padded on the top.' }
|
22
19
|
|
23
20
|
stroke_horizontal_rule
|
24
|
-
pad_bottom(20) { text
|
21
|
+
pad_bottom(20) { text 'Text padded on the bottom.' }
|
25
22
|
|
26
23
|
stroke_horizontal_rule
|
27
24
|
move_down 30
|
28
25
|
|
29
|
-
text
|
26
|
+
text 'Text written before the float block.'
|
30
27
|
|
31
28
|
float do
|
32
29
|
move_down 30
|
33
|
-
bounding_box([0, cursor], :
|
34
|
-
text
|
30
|
+
bounding_box([0, cursor], width: 200) do
|
31
|
+
text 'Text written inside the float block.'
|
35
32
|
stroke_bounds
|
36
33
|
end
|
37
34
|
end
|
38
35
|
|
39
|
-
text
|
36
|
+
text 'Text written after the float block.'
|
40
37
|
end
|