nurettin-prawn 1.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +2 -0
- data/GPLv2 +340 -0
- data/GPLv3 +674 -0
- data/Gemfile +18 -0
- data/LICENSE +56 -0
- data/README.md +98 -0
- data/Rakefile +45 -0
- data/data/encodings/win_ansi.txt +29 -0
- 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/Courier-Bold.afm +342 -0
- data/data/fonts/Courier-BoldOblique.afm +342 -0
- data/data/fonts/Courier-Oblique.afm +342 -0
- data/data/fonts/Courier.afm +342 -0
- data/data/fonts/DejaVuSans.ttf +0 -0
- data/data/fonts/Dustismo_Roman.ttf +0 -0
- data/data/fonts/Helvetica-Bold.afm +2827 -0
- data/data/fonts/Helvetica-BoldOblique.afm +2827 -0
- data/data/fonts/Helvetica-Oblique.afm +3051 -0
- data/data/fonts/Helvetica.afm +3051 -0
- data/data/fonts/MustRead.html +19 -0
- data/data/fonts/Symbol.afm +213 -0
- data/data/fonts/Times-Bold.afm +2588 -0
- data/data/fonts/Times-BoldItalic.afm +2384 -0
- data/data/fonts/Times-Italic.afm +2667 -0
- data/data/fonts/Times-Roman.afm +2419 -0
- data/data/fonts/ZapfDingbats.afm +225 -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/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/fractal.jpg +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/rails.dat +0 -0
- data/data/images/rails.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 +1 -0
- 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 +820 -0
- data/data/pdfs/hexagon.pdf +61 -0
- data/data/pdfs/indirect_reference.pdf +86 -0
- data/data/pdfs/multipage_template.pdf +127 -0
- data/data/pdfs/nested_pages.pdf +118 -0
- data/data/pdfs/page_without_mediabox.pdf +193 -0
- data/data/pdfs/resources_as_indirect_object.pdf +83 -0
- data/data/pdfs/two_hexagons.pdf +90 -0
- data/data/pdfs/version_1_6.pdf +61 -0
- data/data/shift_jis_text.txt +1 -0
- data/lib/prawn.rb +29 -0
- data/lib/prawn/compatibility.rb +87 -0
- data/lib/prawn/core.rb +87 -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 +79 -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 +320 -0
- data/lib/prawn/core/page.rb +212 -0
- data/lib/prawn/core/pdf_object.rb +125 -0
- data/lib/prawn/core/reference.rb +119 -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 +288 -0
- data/lib/prawn/core/text/formatted/wrap.rb +153 -0
- data/lib/prawn/document.rb +707 -0
- data/lib/prawn/document/bounding_box.rb +510 -0
- data/lib/prawn/document/column_box.rb +132 -0
- data/lib/prawn/document/graphics_state.rb +136 -0
- data/lib/prawn/document/internals.rb +173 -0
- data/lib/prawn/document/page_geometry.rb +136 -0
- data/lib/prawn/document/snapshot.rb +89 -0
- data/lib/prawn/document/span.rb +55 -0
- data/lib/prawn/encoding.rb +121 -0
- data/lib/prawn/errors.rb +99 -0
- data/lib/prawn/font.rb +386 -0
- data/lib/prawn/font/afm.rb +203 -0
- data/lib/prawn/font/dfont.rb +42 -0
- data/lib/prawn/font/ttf.rb +343 -0
- data/lib/prawn/graphics.rb +523 -0
- data/lib/prawn/graphics/cap_style.rb +46 -0
- data/lib/prawn/graphics/color.rb +231 -0
- data/lib/prawn/graphics/dash.rb +82 -0
- data/lib/prawn/graphics/join_style.rb +47 -0
- data/lib/prawn/graphics/patterns.rb +137 -0
- data/lib/prawn/graphics/transformation.rb +156 -0
- data/lib/prawn/graphics/transparency.rb +99 -0
- data/lib/prawn/images.rb +196 -0
- data/lib/prawn/images/image.rb +65 -0
- data/lib/prawn/images/jpg.rb +85 -0
- data/lib/prawn/images/png.rb +362 -0
- data/lib/prawn/layout.rb +20 -0
- data/lib/prawn/layout/grid.rb +259 -0
- data/lib/prawn/measurement_extensions.rb +46 -0
- data/lib/prawn/measurements.rb +71 -0
- data/lib/prawn/outline.rb +326 -0
- data/lib/prawn/repeater.rb +122 -0
- data/lib/prawn/security.rb +269 -0
- data/lib/prawn/soft_mask.rb +94 -0
- data/lib/prawn/stamp.rb +134 -0
- data/lib/prawn/table.rb +609 -0
- data/lib/prawn/table/cell.rb +776 -0
- data/lib/prawn/table/cell/image.rb +70 -0
- data/lib/prawn/table/cell/in_table.rb +27 -0
- data/lib/prawn/table/cell/span_dummy.rb +88 -0
- data/lib/prawn/table/cell/subtable.rb +65 -0
- data/lib/prawn/table/cell/text.rb +152 -0
- data/lib/prawn/table/cells.rb +260 -0
- data/lib/prawn/text.rb +420 -0
- data/lib/prawn/text/box.rb +141 -0
- data/lib/prawn/text/formatted.rb +4 -0
- data/lib/prawn/text/formatted/box.rb +563 -0
- data/lib/prawn/text/formatted/fragment.rb +253 -0
- data/lib/prawn/text/formatted/parser.rb +217 -0
- data/lib/prawn/utilities.rb +44 -0
- data/manual/basic_concepts/adding_pages.rb +27 -0
- data/manual/basic_concepts/basic_concepts.rb +34 -0
- data/manual/basic_concepts/creation.rb +39 -0
- data/manual/basic_concepts/cursor.rb +33 -0
- data/manual/basic_concepts/measurement.rb +25 -0
- data/manual/basic_concepts/origin.rb +38 -0
- data/manual/basic_concepts/other_cursor_helpers.rb +40 -0
- data/manual/bounding_box/bounding_box.rb +39 -0
- data/manual/bounding_box/bounds.rb +49 -0
- data/manual/bounding_box/canvas.rb +24 -0
- data/manual/bounding_box/creation.rb +23 -0
- data/manual/bounding_box/indentation.rb +46 -0
- data/manual/bounding_box/nesting.rb +45 -0
- data/manual/bounding_box/russian_boxes.rb +40 -0
- data/manual/bounding_box/stretchy.rb +31 -0
- data/manual/document_and_page_options/background.rb +27 -0
- data/manual/document_and_page_options/document_and_page_options.rb +31 -0
- data/manual/document_and_page_options/metadata.rb +23 -0
- data/manual/document_and_page_options/page_margins.rb +38 -0
- data/manual/document_and_page_options/page_size.rb +34 -0
- data/manual/example_file.rb +116 -0
- data/manual/example_helper.rb +430 -0
- data/manual/example_package.rb +53 -0
- data/manual/example_section.rb +46 -0
- data/manual/graphics/circle_and_ellipse.rb +22 -0
- data/manual/graphics/color.rb +24 -0
- data/manual/graphics/common_lines.rb +28 -0
- data/manual/graphics/fill_and_stroke.rb +42 -0
- data/manual/graphics/fill_rules.rb +37 -0
- data/manual/graphics/gradients.rb +37 -0
- data/manual/graphics/graphics.rb +58 -0
- data/manual/graphics/helper.rb +17 -0
- data/manual/graphics/line_width.rb +35 -0
- data/manual/graphics/lines_and_curves.rb +41 -0
- data/manual/graphics/polygon.rb +29 -0
- data/manual/graphics/rectangle.rb +21 -0
- data/manual/graphics/rotate.rb +28 -0
- data/manual/graphics/scale.rb +41 -0
- data/manual/graphics/soft_masks.rb +46 -0
- data/manual/graphics/stroke_cap.rb +31 -0
- data/manual/graphics/stroke_dash.rb +43 -0
- data/manual/graphics/stroke_join.rb +30 -0
- data/manual/graphics/translate.rb +29 -0
- data/manual/graphics/transparency.rb +35 -0
- data/manual/images/absolute_position.rb +23 -0
- data/manual/images/fit.rb +21 -0
- data/manual/images/horizontal.rb +25 -0
- data/manual/images/images.rb +40 -0
- data/manual/images/plain_image.rb +18 -0
- data/manual/images/scale.rb +22 -0
- data/manual/images/vertical.rb +28 -0
- data/manual/images/width_and_height.rb +25 -0
- data/manual/layout/boxes.rb +27 -0
- data/manual/layout/content.rb +25 -0
- data/manual/layout/layout.rb +28 -0
- data/manual/layout/simple_grid.rb +23 -0
- data/manual/manual/cover.rb +26 -0
- data/manual/manual/foreword.rb +13 -0
- data/manual/manual/how_to_read_this_manual.rb +41 -0
- data/manual/manual/manual.rb +36 -0
- data/manual/outline/add_subsection_to.rb +61 -0
- data/manual/outline/insert_section_after.rb +47 -0
- data/manual/outline/outline.rb +32 -0
- data/manual/outline/sections_and_pages.rb +67 -0
- data/manual/repeatable_content/page_numbering.rb +54 -0
- data/manual/repeatable_content/repeatable_content.rb +31 -0
- data/manual/repeatable_content/repeater.rb +55 -0
- data/manual/repeatable_content/stamp.rb +41 -0
- data/manual/security/encryption.rb +31 -0
- data/manual/security/permissions.rb +38 -0
- data/manual/security/security.rb +28 -0
- data/manual/syntax_highlight.rb +52 -0
- data/manual/table/basic_block.rb +53 -0
- data/manual/table/before_rendering_page.rb +26 -0
- data/manual/table/cell_border_lines.rb +24 -0
- data/manual/table/cell_borders_and_bg.rb +31 -0
- data/manual/table/cell_dimensions.rb +30 -0
- data/manual/table/cell_text.rb +38 -0
- data/manual/table/column_widths.rb +30 -0
- data/manual/table/content_and_subtables.rb +39 -0
- data/manual/table/creation.rb +27 -0
- data/manual/table/filtering.rb +36 -0
- data/manual/table/flow_and_header.rb +17 -0
- data/manual/table/image_cells.rb +33 -0
- data/manual/table/position.rb +29 -0
- data/manual/table/row_colors.rb +20 -0
- data/manual/table/span.rb +30 -0
- data/manual/table/style.rb +22 -0
- data/manual/table/table.rb +52 -0
- data/manual/table/width.rb +27 -0
- data/manual/templates/full_template.rb +23 -0
- data/manual/templates/page_template.rb +47 -0
- data/manual/templates/templates.rb +26 -0
- data/manual/text/alignment.rb +44 -0
- data/manual/text/color.rb +24 -0
- data/manual/text/column_box.rb +32 -0
- data/manual/text/fallback_fonts.rb +37 -0
- data/manual/text/font.rb +41 -0
- data/manual/text/font_size.rb +45 -0
- data/manual/text/font_style.rb +23 -0
- data/manual/text/formatted_callbacks.rb +60 -0
- data/manual/text/formatted_text.rb +50 -0
- data/manual/text/free_flowing_text.rb +51 -0
- data/manual/text/group.rb +29 -0
- data/manual/text/inline.rb +43 -0
- data/manual/text/kerning_and_character_spacing.rb +39 -0
- data/manual/text/leading.rb +25 -0
- data/manual/text/line_wrapping.rb +41 -0
- data/manual/text/paragraph_indentation.rb +26 -0
- data/manual/text/positioned_text.rb +38 -0
- data/manual/text/registering_families.rb +48 -0
- data/manual/text/rendering_and_color.rb +37 -0
- data/manual/text/right_to_left_text.rb +43 -0
- data/manual/text/rotation.rb +43 -0
- data/manual/text/single_usage.rb +37 -0
- data/manual/text/text.rb +75 -0
- data/manual/text/text_box_excess.rb +32 -0
- data/manual/text/text_box_extensions.rb +45 -0
- data/manual/text/text_box_overflow.rb +44 -0
- data/manual/text/utf8.rb +28 -0
- data/manual/text/win_ansi_charset.rb +59 -0
- data/prawn.gemspec +46 -0
- data/spec/annotations_spec.rb +90 -0
- data/spec/bounding_box_spec.rb +493 -0
- data/spec/cell_spec.rb +584 -0
- data/spec/column_box_spec.rb +33 -0
- data/spec/data/curves.pdf +66 -0
- data/spec/destinations_spec.rb +15 -0
- data/spec/document_spec.rb +736 -0
- data/spec/extensions/encoding_helpers.rb +6 -0
- data/spec/extensions/mocha.rb +44 -0
- data/spec/font_spec.rb +433 -0
- data/spec/formatted_text_arranger_spec.rb +421 -0
- data/spec/formatted_text_box_spec.rb +640 -0
- data/spec/formatted_text_fragment_spec.rb +298 -0
- data/spec/graphics_spec.rb +651 -0
- data/spec/grid_spec.rb +85 -0
- data/spec/images_spec.rb +140 -0
- data/spec/inline_formatted_text_parser_spec.rb +515 -0
- data/spec/jpg_spec.rb +25 -0
- data/spec/line_wrap_spec.rb +333 -0
- data/spec/measurement_units_spec.rb +23 -0
- data/spec/name_tree_spec.rb +112 -0
- data/spec/object_store_spec.rb +170 -0
- data/spec/outline_spec.rb +426 -0
- data/spec/pdf_object_spec.rb +172 -0
- data/spec/png_spec.rb +240 -0
- data/spec/reference_spec.rb +105 -0
- data/spec/repeater_spec.rb +158 -0
- data/spec/security_spec.rb +126 -0
- data/spec/snapshot_spec.rb +186 -0
- data/spec/soft_mask_spec.rb +117 -0
- data/spec/span_spec.rb +49 -0
- data/spec/spec_helper.rb +36 -0
- data/spec/stamp_spec.rb +159 -0
- data/spec/stroke_styles_spec.rb +193 -0
- data/spec/table_spec.rb +1209 -0
- data/spec/template_spec.rb +351 -0
- data/spec/text_at_spec.rb +129 -0
- data/spec/text_box_spec.rb +1029 -0
- data/spec/text_rendering_mode_spec.rb +45 -0
- data/spec/text_spacing_spec.rb +93 -0
- data/spec/text_spec.rb +421 -0
- data/spec/text_with_inline_formatting_spec.rb +35 -0
- data/spec/transparency_spec.rb +89 -0
- metadata +544 -0
@@ -0,0 +1,45 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Normally when we provide the top left corner of a bounding box we
|
4
|
+
# express the coordinates relative to the margin box. This is not the
|
5
|
+
# case when we have nested bounding boxes. Once nested the inner bounding box
|
6
|
+
# coordinates are relative to the outter bounding box.
|
7
|
+
#
|
8
|
+
# This example shows some nested bounding boxes with fixed and stretchy heights.
|
9
|
+
# Note how the <code>cursor</code> method returns coordinates relative to
|
10
|
+
# the current bounding box.
|
11
|
+
#
|
12
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
13
|
+
%w[.. example_helper]))
|
14
|
+
|
15
|
+
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
16
|
+
Prawn::Example.generate(filename) do
|
17
|
+
def box_content(string)
|
18
|
+
text string
|
19
|
+
transparent(0.5) { stroke_bounds }
|
20
|
+
end
|
21
|
+
|
22
|
+
gap = 20
|
23
|
+
bounding_box([50, cursor], :width => 400, :height => 200) do
|
24
|
+
box_content("Fixed height")
|
25
|
+
|
26
|
+
bounding_box([gap, cursor - gap], :width => 300) do
|
27
|
+
text "Stretchy height"
|
28
|
+
|
29
|
+
bounding_box([gap, bounds.top - gap], :width => 100) do
|
30
|
+
text "Stretchy height"
|
31
|
+
transparent(0.5) { dash(1); stroke_bounds; undash }
|
32
|
+
end
|
33
|
+
|
34
|
+
bounding_box([gap * 7, bounds.top - gap], :width => 100, :height => 50) do
|
35
|
+
box_content("Fixed height")
|
36
|
+
end
|
37
|
+
|
38
|
+
transparent(0.5) { dash(1); stroke_bounds; undash }
|
39
|
+
end
|
40
|
+
|
41
|
+
bounding_box([gap, cursor - gap], :width => 300, :height => 50) do
|
42
|
+
box_content("Fixed height")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# This example is mostly just for fun, and shows how nested bounding boxes
|
4
|
+
# can simplify calculations. See the "Bounding Box" section of the manual
|
5
|
+
# for more basic uses.
|
6
|
+
#
|
7
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
8
|
+
%w[.. example_helper]))
|
9
|
+
|
10
|
+
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
11
|
+
Prawn::Example.generate(filename) do
|
12
|
+
def combine(a1, a2)
|
13
|
+
output = []
|
14
|
+
a1.each do |i1|
|
15
|
+
a2.each do |i2|
|
16
|
+
output += [[i1,i2]]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
output
|
20
|
+
end
|
21
|
+
|
22
|
+
def recurse_bounding_box(max_depth=4, depth=1)
|
23
|
+
width = (bounds.width-15)/2
|
24
|
+
height = (bounds.height-15)/2
|
25
|
+
left_top_corners = combine([5, bounds.right-width-5],
|
26
|
+
[bounds.top-5, height+5])
|
27
|
+
left_top_corners.each do |lt|
|
28
|
+
bounding_box(lt, :width => width, :height => height) do
|
29
|
+
stroke_bounds
|
30
|
+
recurse_bounding_box(max_depth, depth+1) if depth < max_depth
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Set up a bbox from the dashed line to the bottom of the page
|
36
|
+
bounding_box([0, cursor], :width => bounds.width, :height => cursor) do
|
37
|
+
recurse_bounding_box
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Bounding Boxes accept an optional <code>:height</code> parameter. Unless it
|
4
|
+
# is provided the bounding box will be stretchy. It will expand the height to
|
5
|
+
# fit all content generated inside it.
|
6
|
+
#
|
7
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
8
|
+
%w[.. example_helper]))
|
9
|
+
|
10
|
+
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
11
|
+
Prawn::Example.generate(filename) do
|
12
|
+
y_position = cursor
|
13
|
+
bounding_box([0, y_position], :width => 200, :height => 100) do
|
14
|
+
text "This bounding box has a height of 100. If this text gets too large " +
|
15
|
+
"it will flow to the next page."
|
16
|
+
|
17
|
+
transparent(0.5) { stroke_bounds }
|
18
|
+
end
|
19
|
+
|
20
|
+
bounding_box([300, y_position], :width => 200) do
|
21
|
+
text "This bounding box has variable height. No matter how much text is " +
|
22
|
+
"written here, the height will expand to fit."
|
23
|
+
|
24
|
+
text " _" * 100
|
25
|
+
|
26
|
+
text " *" * 100
|
27
|
+
|
28
|
+
transparent(0.5) { stroke_bounds }
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Pass an image path to the <code>:background</code> option and it will be used
|
4
|
+
# as the background for all pages.
|
5
|
+
# This option can only be used on document creation.
|
6
|
+
#
|
7
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
8
|
+
%w[.. example_helper]))
|
9
|
+
|
10
|
+
img = "#{Prawn::DATADIR}/images/letterhead.jpg"
|
11
|
+
|
12
|
+
Prawn::Document.generate("background.pdf",
|
13
|
+
:background => img,
|
14
|
+
:margin => 100
|
15
|
+
) do
|
16
|
+
text "My report caption", :size => 18, :align => :right
|
17
|
+
|
18
|
+
move_down font.height * 2
|
19
|
+
|
20
|
+
text "Here is my text explaning this report. " * 20,
|
21
|
+
:size => 12, :align => :left, :leading => 2
|
22
|
+
|
23
|
+
move_down font.height
|
24
|
+
|
25
|
+
text "I'm using a soft background. " * 40,
|
26
|
+
:size => 12, :align => :left, :leading => 2
|
27
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Examples for stamps and repeaters.
|
4
|
+
#
|
5
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
6
|
+
%w[.. example_helper]))
|
7
|
+
|
8
|
+
Prawn::Example.generate("document_and_page_options.pdf",
|
9
|
+
:page_size => "FOLIO") do
|
10
|
+
|
11
|
+
package "document_and_page_options" do |p|
|
12
|
+
|
13
|
+
p.example "page_size", :eval_source => false, :full_source => true
|
14
|
+
p.example "page_margins", :eval_source => false, :full_source => true
|
15
|
+
p.example "background", :eval_source => false, :full_source => true
|
16
|
+
p.example "metadata", :eval_source => false, :full_source => true
|
17
|
+
|
18
|
+
p.intro do
|
19
|
+
prose("So far we've already seen how to create new documents and start new pages. This chapter expands on the previous examples by showing other options avialable. Some of the options are only available when creating new documents.
|
20
|
+
|
21
|
+
The examples show:")
|
22
|
+
|
23
|
+
list( "How to configure page size",
|
24
|
+
"How to configure page margins",
|
25
|
+
"How to use a background image",
|
26
|
+
"How to add metadata to the generated PDF"
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# To set the document metadata just pass a hash to the <code>:info</code>
|
4
|
+
# option when creating new documents.
|
5
|
+
#
|
6
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
7
|
+
%w[.. example_helper]))
|
8
|
+
|
9
|
+
Prawn::Document.generate("metadata.pdf",
|
10
|
+
:info => {
|
11
|
+
:Title => "My title",
|
12
|
+
:Author => "John Doe",
|
13
|
+
:Subject => "My Subject",
|
14
|
+
:Keywords => "test metadata ruby pdf dry",
|
15
|
+
:Creator => "ACME Soft App",
|
16
|
+
:Producer => "Prawn",
|
17
|
+
:CreationDate => Time.now,
|
18
|
+
:Grok => "Test Property"
|
19
|
+
}) do
|
20
|
+
|
21
|
+
text "This is a test of setting metadata properties via the info option."
|
22
|
+
text "It allows one to specify non standard properties like 'Grok'."
|
23
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# The default margin for pages is 0.5 inch but you can change that with the
|
4
|
+
# <code>:margin</code> option or if you'd like to have different margins you
|
5
|
+
# can use the <code>:left_margin</code>, <code>:right_margin</code>,
|
6
|
+
# <code>:top_margin</code>, <code>:bottom_margin</code> options.
|
7
|
+
#
|
8
|
+
# These options are available both for starting new pages and creating new
|
9
|
+
# documents.
|
10
|
+
#
|
11
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
12
|
+
%w[.. example_helper]))
|
13
|
+
|
14
|
+
Prawn::Document.generate("page_margins.pdf",
|
15
|
+
:margin => 100
|
16
|
+
) do
|
17
|
+
text "100 pts margins."
|
18
|
+
stroke_bounds
|
19
|
+
|
20
|
+
start_new_page(:left_margin => 300)
|
21
|
+
text "300 pts margin on the left."
|
22
|
+
stroke_bounds
|
23
|
+
|
24
|
+
start_new_page(:top_margin => 300)
|
25
|
+
text "300 pts margin both on the top and on the left. Notice that whenever " +
|
26
|
+
"you set an option for a new page it will remain the default for the " +
|
27
|
+
"following pages."
|
28
|
+
stroke_bounds
|
29
|
+
|
30
|
+
start_new_page(:margin => 50)
|
31
|
+
text "50 pts margins. Using the margin option will reset previous specific " +
|
32
|
+
"calls to left, right, top and bottom margins."
|
33
|
+
stroke_bounds
|
34
|
+
|
35
|
+
start_new_page(:margin => [50, 100, 150, 200])
|
36
|
+
text "There is also the shorthand CSS like syntax used here."
|
37
|
+
stroke_bounds
|
38
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Prawn comes with support for most of the common page sizes so you'll only need
|
4
|
+
# to provide specific values if your intended format is not supported. To see a
|
5
|
+
# list with all supported sizes take a look at: https://github.com/prawnpdf/prawn/blob/master/lib/prawn/document/page_geometry.rb
|
6
|
+
#
|
7
|
+
# To define the size use <code>:page_size</code> when creating new documents
|
8
|
+
# and <code>:size</code> when starting new pages. The default page size for new
|
9
|
+
# documents is LETTER (612.00 x 792.00).
|
10
|
+
#
|
11
|
+
# You may also define the orientation of the page to be either portrait
|
12
|
+
# (default) or landscape. Use <code>:page_layout</code> when creating new
|
13
|
+
# documents and <code>:layout</code> when starting new pages.
|
14
|
+
#
|
15
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
16
|
+
%w[.. example_helper]))
|
17
|
+
|
18
|
+
Prawn::Document.generate("page_size.pdf",
|
19
|
+
:page_size => "EXECUTIVE",
|
20
|
+
:page_layout => :landscape
|
21
|
+
) do
|
22
|
+
text "EXECUTIVE landscape page."
|
23
|
+
|
24
|
+
custom_size = [275, 326]
|
25
|
+
|
26
|
+
["A4", "TABLOID", "B7", custom_size ].each do |size|
|
27
|
+
|
28
|
+
start_new_page(:size => size, :layout => :portrait)
|
29
|
+
text "#{size} portrait page."
|
30
|
+
|
31
|
+
start_new_page(:size => size, :layout => :landscape)
|
32
|
+
text "#{size} landscape page."
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Prawn
|
4
|
+
|
5
|
+
# The Prawn::ExampleFile class is a utility class to ease the manipulation
|
6
|
+
# and extraction of source code and comments from the actual example files
|
7
|
+
#
|
8
|
+
class ExampleFile
|
9
|
+
attr_reader :package, :filename
|
10
|
+
|
11
|
+
# Stores the file data, filename and parent, which will be either an
|
12
|
+
# ExampleSection or an ExamplePackage.
|
13
|
+
#
|
14
|
+
# Available boolean options are:
|
15
|
+
#
|
16
|
+
# <tt>:eval_source</tt>:: Evals the example source code (default: true)
|
17
|
+
# <tt>:full_source</tt>:: Extract the full source code when true. Extract
|
18
|
+
# only the code between the generate block when false (default: false)
|
19
|
+
#
|
20
|
+
def initialize(parent, filename, options={})
|
21
|
+
@parent = parent.is_a?(String) ? ExamplePackage.new(parent) : parent
|
22
|
+
|
23
|
+
@filename = filename
|
24
|
+
@data = read_file(@parent.folder_name, filename)
|
25
|
+
|
26
|
+
@options = {:eval_source => true, :full_source => false}.merge(options)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Return the example source code excluding the initial comments and
|
30
|
+
# require calls
|
31
|
+
#
|
32
|
+
def full_source
|
33
|
+
@data.gsub(/# encoding.*?\n.*require.*?\n\n/m, "\n").strip
|
34
|
+
end
|
35
|
+
|
36
|
+
# Return the example source contained inside the first generate block or
|
37
|
+
# the full source if no generate block is found
|
38
|
+
#
|
39
|
+
def generate_block_source
|
40
|
+
block = @data.slice(/\w+\.generate.*? do\n(.*)end/m, 1)
|
41
|
+
|
42
|
+
return full_source unless block
|
43
|
+
|
44
|
+
block.gsub(/^( ){2}/, "")
|
45
|
+
end
|
46
|
+
|
47
|
+
# Return either the full_source or the generate_block_source according
|
48
|
+
# to the options
|
49
|
+
#
|
50
|
+
def source
|
51
|
+
@options[:full_source] ? full_source : generate_block_source
|
52
|
+
end
|
53
|
+
|
54
|
+
# Return true if the example source should be evaluated inline within
|
55
|
+
# the manual according to the options
|
56
|
+
#
|
57
|
+
def eval?
|
58
|
+
@options[:eval_source]
|
59
|
+
end
|
60
|
+
|
61
|
+
# Retrieve the comments between the encoding declaration and the require
|
62
|
+
# call for example_helper.rb
|
63
|
+
#
|
64
|
+
# Then removes the '#' signs, reflows the line breaks and return the result
|
65
|
+
#
|
66
|
+
def introduction_text
|
67
|
+
intro = @data.slice(/# encoding.*?\n(.*)require File\.expand_path/m, 1)
|
68
|
+
intro.gsub!(/\n# (?=\S)/m, ' ')
|
69
|
+
intro.gsub!(/^#/, '')
|
70
|
+
intro.gsub!("\n", "\n\n")
|
71
|
+
intro.rstrip!
|
72
|
+
intro
|
73
|
+
end
|
74
|
+
|
75
|
+
# Returns a human friendly version of the example file name
|
76
|
+
#
|
77
|
+
def name
|
78
|
+
@name ||= @filename[/(.*)\.rb/, 1].gsub("_", " ").capitalize
|
79
|
+
end
|
80
|
+
|
81
|
+
# Returns this example's parent original folder name
|
82
|
+
#
|
83
|
+
def parent_folder_name
|
84
|
+
@parent.folder_name
|
85
|
+
end
|
86
|
+
|
87
|
+
# Returns the human friendly version of this example parent name
|
88
|
+
#
|
89
|
+
def parent_name
|
90
|
+
@parent.name
|
91
|
+
end
|
92
|
+
|
93
|
+
# Renders this example to a pdf
|
94
|
+
#
|
95
|
+
def render(pdf)
|
96
|
+
pdf.render_example(self)
|
97
|
+
end
|
98
|
+
|
99
|
+
private
|
100
|
+
|
101
|
+
# Read the data from a file in a given package
|
102
|
+
#
|
103
|
+
def read_file(folder_name, filename)
|
104
|
+
data = File.read(File.expand_path(File.join(
|
105
|
+
File.dirname(__FILE__), folder_name, filename)))
|
106
|
+
|
107
|
+
# XXX If we ever have manual files with source encodings other than
|
108
|
+
# UTF-8, we will need to fix this to work on Ruby 1.9.
|
109
|
+
if data.respond_to?(:encode!)
|
110
|
+
data.encode!("UTF-8")
|
111
|
+
end
|
112
|
+
data
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,430 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Helper for organizing examples
|
4
|
+
#
|
5
|
+
|
6
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
7
|
+
require 'prawn'
|
8
|
+
require 'prawn/security'
|
9
|
+
require 'prawn/layout'
|
10
|
+
|
11
|
+
require 'enumerator'
|
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
|
+
options = { :height => (cursor - 20).to_i,
|
386
|
+
:width => bounds.width.to_i
|
387
|
+
}.merge(options)
|
388
|
+
|
389
|
+
dash(1, :space => 4)
|
390
|
+
stroke_horizontal_line(-21, options[:width], :at => 0)
|
391
|
+
stroke_vertical_line(-21, options[:height], :at => 0)
|
392
|
+
undash
|
393
|
+
|
394
|
+
fill_circle [0, 0], 1
|
395
|
+
|
396
|
+
(100..options[:width]).step(100) do |point|
|
397
|
+
fill_circle [point, 0], 1
|
398
|
+
draw_text point, :at => [point-5, -10], :size => 7
|
399
|
+
end
|
400
|
+
|
401
|
+
(100..options[:height]).step(100) do |point|
|
402
|
+
fill_circle [0, point], 1
|
403
|
+
draw_text point, :at => [-17, point-2], :size => 7
|
404
|
+
end
|
405
|
+
end
|
406
|
+
|
407
|
+
# Reset some of the Prawn settings including graphics and text to their
|
408
|
+
# defaults.
|
409
|
+
#
|
410
|
+
# Used after rendering examples so that each new example starts with a clean
|
411
|
+
# slate.
|
412
|
+
#
|
413
|
+
def reset_settings
|
414
|
+
|
415
|
+
# Text settings
|
416
|
+
font("Helvetica", :size => 12)
|
417
|
+
default_leading 0
|
418
|
+
self.text_direction = :ltr
|
419
|
+
|
420
|
+
# Graphics settings
|
421
|
+
self.line_width = 1
|
422
|
+
self.cap_style = :butt
|
423
|
+
self.join_style = :miter
|
424
|
+
undash
|
425
|
+
fill_color BLACK
|
426
|
+
stroke_color BLACK
|
427
|
+
end
|
428
|
+
|
429
|
+
end
|
430
|
+
end
|