prawn 0.13.0 → 2.4.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 +5 -5
- checksums.yaml.gz.sig +0 -0
- data/.yardopts +10 -0
- data/GPLv2 +20 -21
- data/Gemfile +3 -16
- data/Rakefile +17 -39
- data/lib/prawn/document/bounding_box.rb +85 -42
- data/lib/prawn/document/column_box.rb +21 -11
- data/lib/prawn/document/internals.rb +40 -147
- data/lib/prawn/document/span.rb +25 -17
- data/lib/prawn/document.rb +286 -245
- data/lib/prawn/encoding.rb +68 -101
- data/lib/prawn/errors.rb +47 -43
- data/lib/prawn/font.rb +204 -155
- data/lib/prawn/font_metric_cache.rb +25 -21
- data/lib/prawn/fonts/afm.rb +292 -0
- data/lib/prawn/{font → fonts}/dfont.rb +7 -13
- data/lib/prawn/fonts/otf.rb +11 -0
- data/lib/prawn/fonts/ttc.rb +36 -0
- data/lib/prawn/{font → fonts}/ttf.rb +142 -80
- data/lib/prawn/graphics/blend_mode.rb +65 -0
- data/lib/prawn/graphics/cap_style.rb +6 -5
- data/lib/prawn/graphics/color.rb +47 -44
- data/lib/prawn/graphics/dash.rb +30 -13
- data/lib/prawn/graphics/join_style.rb +13 -6
- data/lib/prawn/graphics/patterns.rb +221 -90
- data/lib/prawn/graphics/transformation.rb +21 -12
- data/lib/prawn/graphics/transparency.rb +21 -17
- data/lib/prawn/graphics.rb +155 -128
- data/lib/prawn/{layout/grid.rb → grid.rb} +110 -47
- data/lib/prawn/image_handler.rb +16 -2
- data/lib/prawn/images/image.rb +4 -2
- data/lib/prawn/images/jpg.rb +39 -30
- data/lib/prawn/images/png.rb +132 -169
- data/lib/prawn/images.rb +70 -62
- data/lib/prawn/measurement_extensions.rb +15 -10
- data/lib/prawn/measurements.rb +22 -23
- data/lib/prawn/outline.rb +301 -13
- data/lib/prawn/repeater.rb +19 -17
- data/lib/prawn/security/arcfour.rb +54 -0
- data/lib/prawn/security.rb +108 -86
- data/lib/prawn/soft_mask.rb +40 -41
- data/lib/prawn/stamp.rb +29 -12
- data/lib/prawn/text/box.rb +27 -29
- data/lib/prawn/text/formatted/arranger.rb +110 -67
- data/lib/prawn/text/formatted/box.rb +233 -165
- data/lib/prawn/text/formatted/fragment.rb +27 -27
- data/lib/prawn/text/formatted/line_wrap.rb +137 -97
- data/lib/prawn/text/formatted/parser.rb +149 -127
- data/lib/prawn/text/formatted/wrap.rb +57 -37
- data/lib/prawn/text/formatted.rb +6 -4
- data/lib/prawn/text.rb +105 -73
- data/lib/prawn/transformation_stack.rb +44 -0
- data/lib/prawn/utilities.rb +11 -21
- data/lib/prawn/version.rb +5 -0
- data/lib/prawn/view.rb +101 -0
- data/lib/prawn.rb +42 -68
- data/{data/images/fractal.jpg → manual/absolute_position.pdf} +0 -0
- data/manual/basic_concepts/adding_pages.rb +9 -10
- data/manual/basic_concepts/basic_concepts.rb +33 -24
- data/manual/basic_concepts/creation.rb +10 -11
- data/manual/basic_concepts/cursor.rb +9 -10
- data/manual/basic_concepts/measurement.rb +10 -11
- data/manual/basic_concepts/origin.rb +8 -9
- data/manual/basic_concepts/other_cursor_helpers.rb +17 -18
- data/manual/basic_concepts/view.rb +48 -0
- data/manual/bounding_box/bounding_box.rb +31 -29
- data/manual/bounding_box/bounds.rb +17 -18
- data/manual/bounding_box/canvas.rb +8 -9
- data/manual/bounding_box/creation.rb +8 -9
- data/manual/bounding_box/indentation.rb +22 -23
- data/manual/bounding_box/nesting.rb +32 -25
- data/manual/bounding_box/russian_boxes.rb +19 -19
- data/manual/bounding_box/stretchy.rb +18 -20
- data/manual/contents.rb +35 -0
- data/manual/cover.rb +43 -0
- data/manual/document_and_page_options/background.rb +16 -14
- data/manual/document_and_page_options/document_and_page_options.rb +26 -23
- data/manual/document_and_page_options/metadata.rb +21 -19
- data/manual/document_and_page_options/page_margins.rb +20 -22
- data/manual/document_and_page_options/page_size.rb +15 -15
- data/manual/document_and_page_options/print_scaling.rb +23 -0
- data/manual/example_helper.rb +5 -408
- data/manual/graphics/blend_mode.rb +52 -0
- data/manual/graphics/circle_and_ellipse.rb +8 -9
- data/manual/graphics/color.rb +11 -13
- data/manual/graphics/common_lines.rb +13 -12
- data/manual/graphics/fill_and_stroke.rb +10 -11
- data/manual/graphics/fill_rules.rb +13 -12
- data/manual/graphics/gradients.rb +28 -22
- data/manual/graphics/graphics.rb +52 -46
- data/manual/graphics/helper.rb +20 -10
- data/manual/graphics/line_width.rb +13 -12
- data/manual/graphics/lines_and_curves.rb +13 -14
- data/manual/graphics/polygon.rb +10 -12
- data/manual/graphics/rectangle.rb +7 -8
- data/manual/graphics/rotate.rb +9 -12
- data/manual/graphics/scale.rb +19 -18
- data/manual/graphics/soft_masks.rb +5 -7
- data/manual/graphics/stroke_cap.rb +10 -11
- data/manual/graphics/stroke_dash.rb +16 -17
- data/manual/graphics/stroke_join.rb +10 -11
- data/manual/graphics/translate.rb +13 -13
- data/manual/graphics/transparency.rb +11 -13
- data/manual/{manual/how_to_read_this_manual.rb → how_to_read_this_manual.rb} +23 -25
- data/manual/images/absolute_position.rb +9 -10
- data/manual/images/fit.rb +9 -10
- data/manual/images/horizontal.rb +13 -14
- data/manual/images/images.rb +31 -30
- data/manual/images/plain_image.rb +6 -7
- data/manual/images/scale.rb +12 -13
- data/manual/images/vertical.rb +19 -17
- data/manual/images/width_and_height.rb +13 -14
- data/manual/layout/boxes.rb +14 -15
- data/manual/layout/content.rb +12 -13
- data/manual/layout/layout.rb +19 -20
- data/manual/layout/simple_grid.rb +8 -9
- data/manual/outline/add_subsection_to.rb +26 -27
- data/manual/outline/insert_section_after.rb +19 -20
- data/manual/outline/outline.rb +23 -22
- data/manual/outline/sections_and_pages.rb +24 -25
- data/manual/repeatable_content/alternate_page_numbering.rb +36 -0
- data/manual/repeatable_content/page_numbering.rb +20 -19
- data/manual/repeatable_content/repeatable_content.rb +26 -22
- data/manual/repeatable_content/repeater.rb +18 -19
- data/manual/repeatable_content/stamp.rb +18 -19
- data/manual/security/encryption.rb +8 -11
- data/manual/security/permissions.rb +20 -15
- data/manual/security/security.rb +20 -20
- data/manual/table.rb +16 -0
- data/manual/text/alignment.rb +17 -18
- data/manual/text/color.rb +13 -13
- data/manual/text/column_box.rb +10 -12
- data/manual/text/fallback_fonts.rb +29 -25
- data/manual/text/font.rb +17 -18
- data/manual/text/font_size.rb +21 -22
- data/manual/text/font_style.rb +12 -10
- data/manual/text/formatted_callbacks.rb +36 -26
- data/manual/text/formatted_text.rb +41 -34
- data/manual/text/free_flowing_text.rb +28 -29
- data/manual/text/inline.rb +23 -26
- data/manual/text/kerning_and_character_spacing.rb +20 -21
- data/manual/text/leading.rb +10 -11
- data/manual/text/line_wrapping.rb +40 -21
- data/manual/text/paragraph_indentation.rb +17 -12
- data/manual/text/positioned_text.rb +19 -20
- data/manual/text/registering_families.rb +33 -30
- data/manual/text/rendering_and_color.rb +11 -12
- data/manual/text/right_to_left_text.rb +31 -20
- data/manual/text/rotation.rb +36 -27
- data/manual/text/single_usage.rb +13 -14
- data/manual/text/text.rb +62 -62
- data/manual/text/text_box_excess.rb +22 -19
- data/manual/text/text_box_extensions.rb +21 -18
- data/manual/text/text_box_overflow.rb +28 -21
- data/manual/text/utf8.rb +16 -17
- data/manual/text/win_ansi_charset.rb +29 -26
- data/prawn.gemspec +45 -43
- data/spec/extensions/encoding_helpers.rb +4 -3
- data/spec/prawn/document/bounding_box_spec.rb +550 -0
- data/spec/prawn/document/column_box_spec.rb +75 -0
- data/spec/prawn/document/security_spec.rb +176 -0
- data/spec/prawn/document_annotations_spec.rb +76 -0
- data/spec/prawn/document_destinations_spec.rb +15 -0
- data/spec/prawn/document_grid_spec.rb +99 -0
- data/spec/prawn/document_reference_spec.rb +27 -0
- data/spec/prawn/document_span_spec.rb +44 -0
- data/spec/prawn/document_spec.rb +805 -0
- data/spec/prawn/font_metric_cache_spec.rb +54 -0
- data/spec/prawn/font_spec.rb +544 -0
- data/spec/prawn/graphics/blend_mode_spec.rb +63 -0
- data/spec/prawn/graphics/transparency_spec.rb +81 -0
- data/spec/prawn/graphics_spec.rb +872 -0
- data/spec/prawn/graphics_stroke_styles_spec.rb +229 -0
- data/spec/prawn/image_handler_spec.rb +53 -0
- data/spec/prawn/images/jpg_spec.rb +20 -0
- data/spec/prawn/images/png_spec.rb +283 -0
- data/spec/prawn/images_spec.rb +229 -0
- data/spec/prawn/measurements_extensions_spec.rb +24 -0
- data/spec/prawn/outline_spec.rb +512 -0
- data/spec/prawn/repeater_spec.rb +166 -0
- data/spec/prawn/soft_mask_spec.rb +74 -0
- data/spec/prawn/stamp_spec.rb +173 -0
- data/spec/prawn/text/box_spec.rb +1110 -0
- data/spec/prawn/text/formatted/arranger_spec.rb +466 -0
- data/spec/prawn/text/formatted/box_spec.rb +849 -0
- data/spec/prawn/text/formatted/fragment_spec.rb +343 -0
- data/spec/prawn/text/formatted/line_wrap_spec.rb +495 -0
- data/spec/prawn/text/formatted/parser_spec.rb +697 -0
- data/spec/prawn/text_draw_text_spec.rb +150 -0
- data/spec/prawn/text_rendering_mode_spec.rb +48 -0
- data/spec/prawn/text_spacing_spec.rb +95 -0
- data/spec/prawn/text_spec.rb +603 -0
- data/spec/prawn/text_with_inline_formatting_spec.rb +35 -0
- data/spec/prawn/transformation_stack_spec.rb +66 -0
- data/spec/prawn/view_spec.rb +63 -0
- data/spec/prawn_manual_spec.rb +35 -0
- data/spec/spec_helper.rb +22 -21
- data.tar.gz.sig +0 -0
- metadata +168 -307
- metadata.gz.sig +0 -0
- data/README.md +0 -109
- data/data/encodings/win_ansi.txt +0 -29
- data/data/images/16bit.alpha +0 -0
- data/data/images/16bit.dat +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/barcode_issue.png +0 -0
- data/data/images/dice.alpha +0 -0
- data/data/images/dice.dat +0 -0
- data/data/images/dice.png +0 -0
- data/data/images/dice_interlaced.png +0 -0
- data/data/images/indexed_color.dat +0 -0
- data/data/images/indexed_color.png +0 -0
- data/data/images/letterhead.jpg +0 -0
- data/data/images/page_white_text.alpha +0 -0
- data/data/images/page_white_text.dat +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/lib/pdf/core/annotations.rb +0 -60
- data/lib/pdf/core/byte_string.rb +0 -9
- data/lib/pdf/core/destinations.rb +0 -90
- data/lib/pdf/core/document_state.rb +0 -78
- data/lib/pdf/core/filter_list.rb +0 -51
- data/lib/pdf/core/filters.rb +0 -36
- data/lib/pdf/core/graphics_state.rb +0 -68
- data/lib/pdf/core/literal_string.rb +0 -16
- data/lib/pdf/core/name_tree.rb +0 -177
- data/lib/pdf/core/object_store.rb +0 -320
- data/lib/pdf/core/outline.rb +0 -315
- data/lib/pdf/core/page.rb +0 -212
- data/lib/pdf/core/page_geometry.rb +0 -126
- data/lib/pdf/core/pdf_object.rb +0 -124
- data/lib/pdf/core/reference.rb +0 -103
- data/lib/pdf/core/stream.rb +0 -98
- data/lib/pdf/core/text.rb +0 -275
- data/lib/pdf/core.rb +0 -35
- data/lib/prawn/compatibility.rb +0 -91
- data/lib/prawn/document/graphics_state.rb +0 -73
- data/lib/prawn/document/snapshot.rb +0 -89
- data/lib/prawn/font/afm.rb +0 -203
- data/lib/prawn/layout.rb +0 -20
- data/lib/prawn/table/cell/image.rb +0 -70
- data/lib/prawn/table/cell/in_table.rb +0 -27
- data/lib/prawn/table/cell/span_dummy.rb +0 -92
- data/lib/prawn/table/cell/subtable.rb +0 -65
- data/lib/prawn/table/cell/text.rb +0 -153
- data/lib/prawn/table/cell.rb +0 -770
- data/lib/prawn/table/cells.rb +0 -295
- data/lib/prawn/table.rb +0 -643
- data/manual/example_file.rb +0 -116
- data/manual/example_package.rb +0 -53
- data/manual/example_section.rb +0 -46
- data/manual/manual/cover.rb +0 -35
- data/manual/manual/foreword.rb +0 -85
- data/manual/manual/manual.rb +0 -35
- 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/templates/full_template.rb +0 -25
- data/manual/templates/page_template.rb +0 -48
- data/manual/templates/templates.rb +0 -27
- data/manual/text/group.rb +0 -29
- data/spec/acceptance/png.rb +0 -23
- data/spec/annotations_spec.rb +0 -74
- data/spec/bounding_box_spec.rb +0 -493
- data/spec/cell_spec.rb +0 -628
- data/spec/column_box_spec.rb +0 -33
- data/spec/destinations_spec.rb +0 -15
- data/spec/document_spec.rb +0 -761
- data/spec/extensions/mocha.rb +0 -44
- data/spec/filters_spec.rb +0 -34
- data/spec/font_metric_cache_spec.rb +0 -52
- data/spec/font_spec.rb +0 -464
- data/spec/formatted_text_arranger_spec.rb +0 -421
- data/spec/formatted_text_box_spec.rb +0 -650
- data/spec/formatted_text_fragment_spec.rb +0 -298
- data/spec/graphics_spec.rb +0 -651
- data/spec/grid_spec.rb +0 -85
- data/spec/image_handler_spec.rb +0 -42
- data/spec/images_spec.rb +0 -157
- data/spec/inline_formatted_text_parser_spec.rb +0 -564
- data/spec/jpg_spec.rb +0 -25
- data/spec/line_wrap_spec.rb +0 -333
- data/spec/measurement_units_spec.rb +0 -23
- data/spec/name_tree_spec.rb +0 -112
- data/spec/object_store_spec.rb +0 -170
- data/spec/outline_spec.rb +0 -448
- data/spec/pdf_object_spec.rb +0 -172
- data/spec/png_spec.rb +0 -240
- data/spec/reference_spec.rb +0 -82
- data/spec/repeater_spec.rb +0 -158
- data/spec/security_spec.rb +0 -158
- data/spec/snapshot_spec.rb +0 -186
- data/spec/soft_mask_spec.rb +0 -117
- data/spec/span_spec.rb +0 -44
- data/spec/stamp_spec.rb +0 -158
- data/spec/stream_spec.rb +0 -58
- data/spec/stroke_styles_spec.rb +0 -211
- data/spec/table/span_dummy_spec.rb +0 -17
- data/spec/table_spec.rb +0 -1355
- data/spec/template_spec.rb +0 -351
- data/spec/text_at_spec.rb +0 -130
- data/spec/text_box_spec.rb +0 -1030
- data/spec/text_rendering_mode_spec.rb +0 -45
- data/spec/text_spacing_spec.rb +0 -93
- data/spec/text_spec.rb +0 -425
- data/spec/text_with_inline_formatting_spec.rb +0 -35
- data/spec/transparency_spec.rb +0 -89
data/manual/example_helper.rb
CHANGED
@@ -1,411 +1,8 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
# Helper for organizing examples
|
4
|
-
#
|
1
|
+
# frozen_string_literal: true
|
5
2
|
|
6
|
-
$LOAD_PATH.unshift
|
3
|
+
$LOAD_PATH.unshift File.join(__dir__, '../lib')
|
7
4
|
require 'prawn'
|
8
|
-
require 'prawn/
|
9
|
-
require 'prawn/layout'
|
5
|
+
require 'prawn/manual_builder'
|
10
6
|
|
11
|
-
|
12
|
-
|
13
|
-
require File.expand_path(File.join(File.dirname(__FILE__), 'example_file'))
|
14
|
-
require File.expand_path(File.join(File.dirname(__FILE__), 'example_section'))
|
15
|
-
require File.expand_path(File.join(File.dirname(__FILE__), 'example_package'))
|
16
|
-
require File.expand_path(File.join(File.dirname(__FILE__), 'syntax_highlight'))
|
17
|
-
|
18
|
-
Prawn.debug = true
|
19
|
-
|
20
|
-
module Prawn
|
21
|
-
|
22
|
-
# The Prawn::Example class holds all the helper methods used to generate the
|
23
|
-
# Prawn by example manual.
|
24
|
-
#
|
25
|
-
# The overall structure is to have single example files grouped by package
|
26
|
-
# folders. Each package has a package builder file (with the same name as the
|
27
|
-
# package folder) that defines the inner structure of subsections and
|
28
|
-
# examples. The manual is then built by loading all the packages and some
|
29
|
-
# standalone pages.
|
30
|
-
#
|
31
|
-
# To see one of the examples check manual/basic_concepts/cursor.rb
|
32
|
-
#
|
33
|
-
# To see one of the package builders check
|
34
|
-
# manual/basic_concepts/basic_concepts.rb
|
35
|
-
#
|
36
|
-
# To see how the manual is built check manual/manual/manual.rb (Yes that's a
|
37
|
-
# whole load of manuals)
|
38
|
-
#
|
39
|
-
class Example < Prawn::Document
|
40
|
-
|
41
|
-
# Values used for the manual design:
|
42
|
-
|
43
|
-
# This is the default value for the margin box
|
44
|
-
#
|
45
|
-
BOX_MARGIN = 36
|
46
|
-
|
47
|
-
# Additional indentation to keep the line measure with a reasonable size
|
48
|
-
#
|
49
|
-
INNER_MARGIN = 30
|
50
|
-
|
51
|
-
# Vertical Rhythm settings
|
52
|
-
#
|
53
|
-
RHYTHM = 10
|
54
|
-
LEADING = 2
|
55
|
-
|
56
|
-
# Colors
|
57
|
-
#
|
58
|
-
BLACK = "000000"
|
59
|
-
LIGHT_GRAY = "F2F2F2"
|
60
|
-
GRAY = "DDDDDD"
|
61
|
-
DARK_GRAY = "333333"
|
62
|
-
BROWN = "A4441C"
|
63
|
-
ORANGE = "F28157"
|
64
|
-
LIGHT_GOLD = "FBFBBE"
|
65
|
-
DARK_GOLD = "EBE389"
|
66
|
-
BLUE = "0000D0"
|
67
|
-
|
68
|
-
# Used to generate the url for the example files
|
69
|
-
#
|
70
|
-
MANUAL_URL = "http://github.com/prawnpdf/prawn/tree/master/manual"
|
71
|
-
|
72
|
-
|
73
|
-
# Loads a package. Used on the manual.
|
74
|
-
#
|
75
|
-
def load_package(package)
|
76
|
-
load_file(package, package)
|
77
|
-
end
|
78
|
-
|
79
|
-
# Loads a page with outline support. Used on the manual.
|
80
|
-
#
|
81
|
-
def load_page(page)
|
82
|
-
load_file("manual", page)
|
83
|
-
|
84
|
-
outline.define do
|
85
|
-
section(page.gsub("_", " ").capitalize, :destination => page_number)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
# Opens a file in a given package and evals the source
|
90
|
-
#
|
91
|
-
def load_file(package, file)
|
92
|
-
start_new_page
|
93
|
-
example = ExampleFile.new(package, "#{file}.rb")
|
94
|
-
eval example.generate_block_source
|
95
|
-
end
|
96
|
-
|
97
|
-
|
98
|
-
# Creates a new ExamplePackage object and yields it to a block in order for
|
99
|
-
# it to be populated with examples, sections and some introduction text.
|
100
|
-
# Used on the package files.
|
101
|
-
#
|
102
|
-
def package(package, &block)
|
103
|
-
ep = ExamplePackage.new(package)
|
104
|
-
ep.instance_eval(&block)
|
105
|
-
ep.render(self)
|
106
|
-
end
|
107
|
-
|
108
|
-
# Renders an ExamplePackage cover page.
|
109
|
-
#
|
110
|
-
# Starts a new page and renders the package introduction text.
|
111
|
-
#
|
112
|
-
def render_package_cover(package)
|
113
|
-
header(package.name)
|
114
|
-
instance_eval &(package.intro_block)
|
115
|
-
|
116
|
-
outline.define do
|
117
|
-
section(package.name, :destination => page_number, :closed => true)
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
# Add the ExampleSection to the document outline within the appropriate
|
122
|
-
# package.
|
123
|
-
#
|
124
|
-
def render_section(section)
|
125
|
-
outline.add_subsection_to(section.package_name) do
|
126
|
-
outline.section(section.name, :closed => true)
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
# Renders an ExampleFile.
|
131
|
-
#
|
132
|
-
# Starts a new page and renders an introductory text, the example source and
|
133
|
-
# evaluates the example source inline whenever that is appropriate according
|
134
|
-
# to the ExampleFile directives.
|
135
|
-
#
|
136
|
-
def render_example(example)
|
137
|
-
start_new_page
|
138
|
-
|
139
|
-
outline.add_subsection_to(example.parent_name) do
|
140
|
-
outline.page(:destination => page_number, :title => example.name)
|
141
|
-
end
|
142
|
-
|
143
|
-
example_header(example.parent_folder_name, example.filename)
|
144
|
-
|
145
|
-
prose(example.introduction_text)
|
146
|
-
|
147
|
-
code(example.source)
|
148
|
-
|
149
|
-
if example.eval?
|
150
|
-
eval_code(example.source)
|
151
|
-
else
|
152
|
-
source_link(example)
|
153
|
-
end
|
154
|
-
|
155
|
-
reset_settings
|
156
|
-
end
|
157
|
-
|
158
|
-
# Render the example header. Used on the example pages of the manual
|
159
|
-
#
|
160
|
-
def example_header(package, example)
|
161
|
-
header_box do
|
162
|
-
register_fonts
|
163
|
-
font('DejaVu', :size => 18) do
|
164
|
-
formatted_text([ { :text => package, :color => BROWN },
|
165
|
-
{ :text => "/", :color => BROWN },
|
166
|
-
{ :text => example, :color => ORANGE }
|
167
|
-
], :valign => :center)
|
168
|
-
end
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
# Register fonts used on the manual
|
173
|
-
#
|
174
|
-
def register_fonts
|
175
|
-
kai_file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf"
|
176
|
-
font_families["Kai"] = {
|
177
|
-
:normal => { :file => kai_file, :font => "Kai" }
|
178
|
-
}
|
179
|
-
|
180
|
-
dejavu_file = "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf"
|
181
|
-
font_families["DejaVu"] = {
|
182
|
-
:normal => { :file => dejavu_file, :font => "DejaVu" }
|
183
|
-
}
|
184
|
-
end
|
185
|
-
|
186
|
-
# Render a block of text after processing code tags and URLs to be used with
|
187
|
-
# the inline_format option.
|
188
|
-
#
|
189
|
-
# Used on the introducory text for example pages of the manual and on
|
190
|
-
# package pages intro
|
191
|
-
#
|
192
|
-
def prose(str)
|
193
|
-
|
194
|
-
# Process the <code> tags
|
195
|
-
str.gsub!(/<code>([^<]+?)<\/code>/,
|
196
|
-
"<font name='Courier'><b>\\1<\/b><\/font>")
|
197
|
-
|
198
|
-
# Process the links
|
199
|
-
str.gsub!(/(https?:\/\/\S+)/,
|
200
|
-
"<color rgb='#{BLUE}'><link href=\"\\1\">\\1</link></color>")
|
201
|
-
|
202
|
-
inner_box do
|
203
|
-
font("Helvetica", :size => 11) do
|
204
|
-
str.split(/\n\n+/).each do |paragraph|
|
205
|
-
|
206
|
-
text(paragraph.gsub(/\s+/," "),
|
207
|
-
:align => :justify,
|
208
|
-
:inline_format => true,
|
209
|
-
:leading => LEADING,
|
210
|
-
:color => DARK_GRAY)
|
211
|
-
|
212
|
-
move_down(RHYTHM)
|
213
|
-
end
|
214
|
-
end
|
215
|
-
end
|
216
|
-
|
217
|
-
move_down(RHYTHM)
|
218
|
-
end
|
219
|
-
|
220
|
-
# Render a code block. Used on the example pages of the manual
|
221
|
-
#
|
222
|
-
def code(str)
|
223
|
-
pre_text = str.gsub(' ', Prawn::Text::NBSP)
|
224
|
-
pre_text = ::CodeRay.scan(pre_text, :ruby).to_prawn
|
225
|
-
|
226
|
-
font('Courier', :size => 9.5) do
|
227
|
-
colored_box(pre_text, :fill_color => DARK_GRAY)
|
228
|
-
end
|
229
|
-
end
|
230
|
-
|
231
|
-
# Renders a dashed line and evaluates the code inline
|
232
|
-
#
|
233
|
-
def eval_code(source)
|
234
|
-
move_down(RHYTHM)
|
235
|
-
|
236
|
-
dash(3)
|
237
|
-
stroke_color(BROWN)
|
238
|
-
stroke_horizontal_line(-BOX_MARGIN, bounds.width + BOX_MARGIN)
|
239
|
-
stroke_color(BLACK)
|
240
|
-
undash
|
241
|
-
|
242
|
-
move_down(RHYTHM*3)
|
243
|
-
begin
|
244
|
-
eval(source)
|
245
|
-
rescue => e
|
246
|
-
puts "Error evaluating example: #{e.message}"
|
247
|
-
puts
|
248
|
-
puts "---- Source: ----"
|
249
|
-
puts source
|
250
|
-
end
|
251
|
-
end
|
252
|
-
|
253
|
-
# Renders a box with the link for the example file
|
254
|
-
#
|
255
|
-
def source_link(example)
|
256
|
-
url = "#{MANUAL_URL}/#{example.parent_folder_name}/#{example.filename}"
|
257
|
-
|
258
|
-
reason = [{ :text => "This code snippet was not evaluated inline. " +
|
259
|
-
"You may see its output by running the " +
|
260
|
-
"example file located here:\n",
|
261
|
-
:color => DARK_GRAY },
|
262
|
-
|
263
|
-
{ :text => url,
|
264
|
-
:color => BLUE,
|
265
|
-
:link => url}
|
266
|
-
]
|
267
|
-
|
268
|
-
font('Helvetica', :size => 9) do
|
269
|
-
colored_box(reason,
|
270
|
-
:fill_color => LIGHT_GOLD,
|
271
|
-
:stroke_color => DARK_GOLD,
|
272
|
-
:leading => LEADING*3)
|
273
|
-
end
|
274
|
-
end
|
275
|
-
|
276
|
-
# Render a page header. Used on the manual lone pages and package
|
277
|
-
# introductory pages
|
278
|
-
#
|
279
|
-
def header(str)
|
280
|
-
header_box do
|
281
|
-
register_fonts
|
282
|
-
font('DejaVu', :size => 24) do
|
283
|
-
text(str, :color => BROWN, :valign => :center)
|
284
|
-
end
|
285
|
-
end
|
286
|
-
end
|
287
|
-
|
288
|
-
# Render the arguments as a bulleted list. Used on the manual package
|
289
|
-
# introductory pages
|
290
|
-
#
|
291
|
-
def list(*items)
|
292
|
-
move_up(RHYTHM)
|
293
|
-
|
294
|
-
inner_box do
|
295
|
-
font("Helvetica", :size => 11) do
|
296
|
-
items.each do |li|
|
297
|
-
float { text("•", :color => DARK_GRAY) }
|
298
|
-
indent(RHYTHM) do
|
299
|
-
text(li.gsub(/\s+/," "),
|
300
|
-
:inline_format => true,
|
301
|
-
:color => DARK_GRAY,
|
302
|
-
:leading => LEADING)
|
303
|
-
end
|
304
|
-
|
305
|
-
move_down(RHYTHM)
|
306
|
-
end
|
307
|
-
end
|
308
|
-
end
|
309
|
-
end
|
310
|
-
|
311
|
-
# Renders the page-wide headers
|
312
|
-
#
|
313
|
-
def header_box(&block)
|
314
|
-
bounding_box([-bounds.absolute_left, cursor + BOX_MARGIN],
|
315
|
-
:width => bounds.absolute_left + bounds.absolute_right,
|
316
|
-
:height => BOX_MARGIN*2 + RHYTHM*2) do
|
317
|
-
|
318
|
-
fill_color LIGHT_GRAY
|
319
|
-
fill_rectangle([bounds.left, bounds.top],
|
320
|
-
bounds.right,
|
321
|
-
bounds.top - bounds.bottom)
|
322
|
-
fill_color BLACK
|
323
|
-
|
324
|
-
indent(BOX_MARGIN + INNER_MARGIN, &block)
|
325
|
-
end
|
326
|
-
|
327
|
-
stroke_color GRAY
|
328
|
-
stroke_horizontal_line(-BOX_MARGIN, bounds.width + BOX_MARGIN, :at => cursor)
|
329
|
-
stroke_color BLACK
|
330
|
-
|
331
|
-
move_down(RHYTHM*3)
|
332
|
-
end
|
333
|
-
|
334
|
-
# Renders a Bounding Box for the inner margin
|
335
|
-
#
|
336
|
-
def inner_box(&block)
|
337
|
-
bounding_box([INNER_MARGIN, cursor],
|
338
|
-
:width => bounds.width - INNER_MARGIN*2,
|
339
|
-
&block)
|
340
|
-
end
|
341
|
-
|
342
|
-
# Renders a Bounding Box with some background color and the formatted text
|
343
|
-
# inside it
|
344
|
-
#
|
345
|
-
def colored_box(box_text, options={})
|
346
|
-
options = { :fill_color => DARK_GRAY,
|
347
|
-
:stroke_color => nil,
|
348
|
-
:text_color => LIGHT_GRAY,
|
349
|
-
:leading => LEADING
|
350
|
-
}.merge(options)
|
351
|
-
|
352
|
-
register_fonts
|
353
|
-
text_options = { :leading => options[:leading],
|
354
|
-
:fallback_fonts => ["DejaVu", "Kai"]
|
355
|
-
}
|
356
|
-
|
357
|
-
box_height = height_of_formatted(box_text, text_options)
|
358
|
-
|
359
|
-
bounding_box([INNER_MARGIN + RHYTHM, cursor],
|
360
|
-
:width => bounds.width - (INNER_MARGIN+RHYTHM)*2) do
|
361
|
-
|
362
|
-
fill_color options[:fill_color]
|
363
|
-
stroke_color options[:stroke_color] || options[:fill_color]
|
364
|
-
fill_and_stroke_rounded_rectangle(
|
365
|
-
[bounds.left - RHYTHM, cursor],
|
366
|
-
bounds.left + bounds.right + RHYTHM*2,
|
367
|
-
box_height + RHYTHM*2,
|
368
|
-
5
|
369
|
-
)
|
370
|
-
fill_color BLACK
|
371
|
-
stroke_color BLACK
|
372
|
-
|
373
|
-
pad(RHYTHM) do
|
374
|
-
formatted_text(box_text, text_options)
|
375
|
-
end
|
376
|
-
end
|
377
|
-
|
378
|
-
move_down(RHYTHM*2)
|
379
|
-
end
|
380
|
-
|
381
|
-
# Draws X and Y axis rulers beginning at the margin box origin. Used on
|
382
|
-
# examples.
|
383
|
-
#
|
384
|
-
def stroke_axis(options={})
|
385
|
-
super({:height => (cursor - 20).to_i}.merge(options))
|
386
|
-
end
|
387
|
-
|
388
|
-
# Reset some of the Prawn settings including graphics and text to their
|
389
|
-
# defaults.
|
390
|
-
#
|
391
|
-
# Used after rendering examples so that each new example starts with a clean
|
392
|
-
# slate.
|
393
|
-
#
|
394
|
-
def reset_settings
|
395
|
-
|
396
|
-
# Text settings
|
397
|
-
font("Helvetica", :size => 12)
|
398
|
-
default_leading 0
|
399
|
-
self.text_direction = :ltr
|
400
|
-
|
401
|
-
# Graphics settings
|
402
|
-
self.line_width = 1
|
403
|
-
self.cap_style = :butt
|
404
|
-
self.join_style = :miter
|
405
|
-
undash
|
406
|
-
fill_color BLACK
|
407
|
-
stroke_color BLACK
|
408
|
-
end
|
409
|
-
|
410
|
-
end
|
411
|
-
end
|
7
|
+
Prawn::ManualBuilder.manual_dir = File.dirname(__FILE__)
|
8
|
+
Prawn::Fonts::AFM.hide_m17n_warning = true
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Blend modes can be used to change the way two layers (images, graphics,
|
4
|
+
# text, etc.) are blended together. The <code>blend_mode</code> method
|
5
|
+
# accepts a single blend mode or an array of blend modes. PDF viewers should
|
6
|
+
# blend the layers based on the first recognized blend mode.
|
7
|
+
#
|
8
|
+
# Valid blend modes in v1.4 of the PDF spec include :Normal, :Multiply, :Screen,
|
9
|
+
# :Overlay, :Darken, :Lighten, :ColorDodge, :ColorBurn, :HardLight, :SoftLight,
|
10
|
+
# :Difference, :Exclusion, :Hue, :Saturation, :Color, and :Luminosity.
|
11
|
+
|
12
|
+
require_relative '../example_helper'
|
13
|
+
|
14
|
+
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
15
|
+
Prawn::ManualBuilder::Example.generate(filename) do
|
16
|
+
start_new_page
|
17
|
+
|
18
|
+
# https://commons.wikimedia.org/wiki/File:Blend_modes_2.-bottom-layer.jpg#/media/File:Blend_modes_2.-bottom-layer.jpg
|
19
|
+
bottom_layer = "#{Prawn::DATADIR}/images/blend_modes_bottom_layer.jpg"
|
20
|
+
|
21
|
+
# https://commons.wikimedia.org/wiki/File:Blend_modes_1.-top-layer.jpg#/media/File:Blend_modes_1.-top-layer.jpg
|
22
|
+
top_layer = "#{Prawn::DATADIR}/images/blend_modes_top_layer.jpg"
|
23
|
+
|
24
|
+
blend_modes = %i[
|
25
|
+
Normal Multiply Screen Overlay Darken Lighten ColorDodge
|
26
|
+
ColorBurn HardLight SoftLight Difference Exclusion Hue
|
27
|
+
Saturation Color Luminosity
|
28
|
+
]
|
29
|
+
blend_modes.each_with_index do |blend_mode, index|
|
30
|
+
x = index % 4 * 135
|
31
|
+
y = cursor - (index / 4 * 200)
|
32
|
+
|
33
|
+
image bottom_layer, at: [x, y], fit: [125, 125]
|
34
|
+
blend_mode(blend_mode) do
|
35
|
+
image top_layer, at: [x, y], fit: [125, 125]
|
36
|
+
end
|
37
|
+
|
38
|
+
y -= 130
|
39
|
+
|
40
|
+
fill_color '009ddc'
|
41
|
+
fill_rectangle [x, y], 75, 25
|
42
|
+
blend_mode(blend_mode) do
|
43
|
+
fill_color 'fdb827'
|
44
|
+
fill_rectangle [x + 50, y], 75, 25
|
45
|
+
end
|
46
|
+
|
47
|
+
y -= 30
|
48
|
+
|
49
|
+
fill_color '000000'
|
50
|
+
text_box blend_mode.to_s, at: [x, y]
|
51
|
+
end
|
52
|
+
end
|
@@ -1,22 +1,21 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
# To define a <code>circle</code> all you need is the center point and the
|
4
4
|
# radius.
|
5
5
|
#
|
6
6
|
# To define an <code>ellipse</code> you provide the center point and two radii
|
7
7
|
# (or axes) values. If the second radius value is ommitted, both radii will be
|
8
8
|
# equal and you will end up drawing a circle.
|
9
|
-
|
10
|
-
|
11
|
-
%w[.. example_helper]))
|
9
|
+
|
10
|
+
require_relative '../example_helper'
|
12
11
|
|
13
12
|
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
14
|
-
Prawn::Example.generate(filename) do
|
13
|
+
Prawn::ManualBuilder::Example.generate(filename) do
|
15
14
|
stroke_axis
|
16
|
-
|
15
|
+
|
17
16
|
stroke_circle [100, 300], 100
|
18
|
-
|
17
|
+
|
19
18
|
fill_ellipse [200, 100], 100, 50
|
20
|
-
|
19
|
+
|
21
20
|
fill_ellipse [400, 100], 50
|
22
21
|
end
|
data/manual/graphics/color.rb
CHANGED
@@ -1,24 +1,22 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
# We can change the stroke and fill colors providing an HTML rgb 6 digit color
|
4
4
|
# code string ("AB1234") or 4 values for CMYK.
|
5
|
-
|
6
|
-
|
7
|
-
%w[.. example_helper]))
|
5
|
+
|
6
|
+
require_relative '../example_helper'
|
8
7
|
|
9
8
|
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
10
|
-
Prawn::Example.generate(filename) do
|
9
|
+
Prawn::ManualBuilder::Example.generate(filename) do
|
11
10
|
stroke_axis
|
12
|
-
|
13
|
-
# Fill with Yellow using RGB
|
14
|
-
fill_color
|
15
|
-
fill_polygon [50, 150], [150, 200], [250, 150],
|
16
|
-
|
17
|
-
|
11
|
+
|
12
|
+
# Fill with Yellow using RGB (Unlike css, there is no leading #)
|
13
|
+
fill_color 'FFFFCC'
|
14
|
+
fill_polygon [50, 150], [150, 200], [250, 150], [250, 50], [150, 0], [50, 50]
|
15
|
+
|
18
16
|
# Stroke with Purple using CMYK
|
19
17
|
stroke_color 50, 100, 0, 0
|
20
18
|
stroke_rectangle [300, 300], 200, 100
|
21
|
-
|
19
|
+
|
22
20
|
# Both together
|
23
21
|
fill_and_stroke_circle [400, 100], 50
|
24
22
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
# Prawn provides helpers for drawing some commonly used lines:
|
4
4
|
#
|
5
5
|
# <code>vertical_line</code> and <code>horizontal_line</code> do just what their
|
@@ -8,21 +8,22 @@
|
|
8
8
|
#
|
9
9
|
# <code>horizontal_rule</code> draws a horizontal line on the current bounding
|
10
10
|
# box from border to border, using the current y position.
|
11
|
-
|
12
|
-
|
13
|
-
%w[.. example_helper]))
|
11
|
+
|
12
|
+
require_relative '../example_helper'
|
14
13
|
|
15
14
|
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
16
|
-
Prawn::Example.generate(filename) do
|
15
|
+
Prawn::ManualBuilder::Example.generate(filename) do
|
17
16
|
stroke_axis
|
18
|
-
|
17
|
+
|
18
|
+
stroke_color 'ff0000'
|
19
|
+
|
19
20
|
stroke do
|
20
21
|
# just lower the current y position
|
21
|
-
move_down 50
|
22
|
+
move_down 50
|
22
23
|
horizontal_rule
|
23
|
-
|
24
|
-
vertical_line
|
25
|
-
|
26
|
-
horizontal_line 200, 500, :
|
24
|
+
|
25
|
+
vertical_line 100, 300, at: 50
|
26
|
+
|
27
|
+
horizontal_line 200, 500, at: 150
|
27
28
|
end
|
28
29
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
# There are two drawing primitives in Prawn: <code>fill</code> and
|
4
4
|
# <code>stroke</code>.
|
5
5
|
#
|
@@ -17,25 +17,24 @@
|
|
17
17
|
# Most of the methods which define drawing paths have methods of the same name
|
18
18
|
# starting with stroke_ and fill_ which create the drawing path and then stroke
|
19
19
|
# or fill it.
|
20
|
-
|
21
|
-
|
22
|
-
%w[.. example_helper]))
|
20
|
+
|
21
|
+
require_relative '../example_helper'
|
23
22
|
|
24
23
|
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
25
|
-
Prawn::Example.generate(filename) do
|
24
|
+
Prawn::ManualBuilder::Example.generate(filename) do
|
26
25
|
stroke_axis
|
27
|
-
|
26
|
+
|
28
27
|
# No block
|
29
28
|
line [0, 200], [100, 150]
|
30
29
|
stroke
|
31
|
-
|
30
|
+
|
32
31
|
rectangle [0, 100], 100, 100
|
33
32
|
fill
|
34
|
-
|
33
|
+
|
35
34
|
# With block
|
36
35
|
stroke { line [200, 200], [300, 150] }
|
37
|
-
fill
|
38
|
-
|
36
|
+
fill { rectangle [200, 100], 100, 100 }
|
37
|
+
|
39
38
|
# Method hook
|
40
39
|
stroke_line [400, 200], [500, 150]
|
41
40
|
fill_rectangle [400, 100], 100, 100
|
@@ -1,5 +1,5 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
# Prawn's fill operators (<code>fill</code> and <code>fill_and_stroke</code>
|
4
4
|
# both accept a <code>:fill_rule</code> option. These rules determine which
|
5
5
|
# parts of the page are counted as "inside" vs. "outside" the path. There are
|
@@ -15,23 +15,24 @@
|
|
15
15
|
#
|
16
16
|
# The differences between the fill rules only come into play with complex
|
17
17
|
# paths; they are identical for simple shapes.
|
18
|
-
|
19
|
-
|
20
|
-
%w[.. example_helper]))
|
18
|
+
|
19
|
+
require_relative '../example_helper'
|
21
20
|
|
22
21
|
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
23
|
-
Prawn::Example.generate(filename) do
|
22
|
+
Prawn::ManualBuilder::Example.generate(filename) do
|
24
23
|
pentagram = [[181, 95], [0, 36], [111, 190], [111, 0], [0, 154]]
|
25
24
|
|
26
25
|
stroke_color 'ff0000'
|
27
26
|
line_width 2
|
28
27
|
|
29
|
-
text_box
|
30
|
-
|
31
|
-
|
28
|
+
text_box 'Nonzero Winding Number',
|
29
|
+
at: [50, 215],
|
30
|
+
width: 170,
|
31
|
+
align: :center
|
32
|
+
polygon(*pentagram.map { |x, y| [x + 50, y] })
|
32
33
|
fill_and_stroke
|
33
34
|
|
34
|
-
text_box
|
35
|
-
polygon(*pentagram.map { |x, y| [x+330, y] })
|
36
|
-
fill_and_stroke(:
|
35
|
+
text_box 'Even-Odd', at: [330, 215], width: 170, align: :center
|
36
|
+
polygon(*pentagram.map { |x, y| [x + 330, y] })
|
37
|
+
fill_and_stroke(fill_rule: :even_odd)
|
37
38
|
end
|