prawn 1.0.0 → 1.1.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.
Files changed (160) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +4 -2
  3. data/lib/prawn.rb +5 -3
  4. data/lib/prawn/document.rb +7 -7
  5. data/lib/prawn/document/bounding_box.rb +1 -1
  6. data/lib/prawn/document/column_box.rb +3 -3
  7. data/lib/prawn/document/internals.rb +1 -1
  8. data/lib/prawn/font.rb +24 -8
  9. data/lib/prawn/font/afm.rb +4 -4
  10. data/lib/prawn/font_metric_cache.rb +1 -1
  11. data/lib/prawn/grid.rb +3 -1
  12. data/lib/prawn/image_handler.rb +3 -1
  13. data/lib/prawn/images/jpg.rb +1 -1
  14. data/lib/prawn/measurement_extensions.rb +1 -1
  15. data/lib/prawn/outline.rb +3 -1
  16. data/lib/prawn/security.rb +1 -1
  17. data/lib/prawn/security/arcfour.rb +4 -2
  18. data/lib/prawn/table.rb +14 -2
  19. data/lib/prawn/table/cell.rb +1 -1
  20. data/lib/prawn/table/cells.rb +1 -50
  21. data/lib/prawn/table/column_width_calculator.rb +131 -10
  22. data/lib/prawn/text.rb +1 -1
  23. data/lib/prawn/text/formatted.rb +2 -0
  24. data/lib/prawn/text/formatted/arranger.rb +1 -1
  25. data/lib/prawn/text/formatted/box.rb +5 -5
  26. data/lib/prawn/text/formatted/line_wrap.rb +1 -1
  27. data/lib/prawn/text/formatted/wrap.rb +2 -0
  28. data/lib/prawn/utilities.rb +3 -3
  29. data/manual/absolute_position.pdf +0 -0
  30. data/manual/basic_concepts/adding_pages.rb +3 -3
  31. data/manual/basic_concepts/basic_concepts.rb +6 -6
  32. data/manual/basic_concepts/cursor.rb +5 -5
  33. data/manual/basic_concepts/measurement.rb +2 -2
  34. data/manual/basic_concepts/origin.rb +3 -3
  35. data/manual/basic_concepts/other_cursor_helpers.rb +6 -6
  36. data/manual/bounding_box/bounding_box.rb +6 -6
  37. data/manual/bounding_box/bounds.rb +6 -6
  38. data/manual/bounding_box/canvas.rb +2 -2
  39. data/manual/bounding_box/creation.rb +3 -3
  40. data/manual/bounding_box/indentation.rb +9 -9
  41. data/manual/bounding_box/nesting.rb +8 -8
  42. data/manual/bounding_box/russian_boxes.rb +1 -1
  43. data/manual/bounding_box/stretchy.rb +8 -8
  44. data/manual/{manual/manual.rb → contents.rb} +6 -9
  45. data/manual/{manual/cover.rb → cover.rb} +6 -6
  46. data/manual/document_and_page_options/background.rb +2 -2
  47. data/manual/document_and_page_options/document_and_page_options.rb +4 -4
  48. data/manual/document_and_page_options/metadata.rb +2 -2
  49. data/manual/document_and_page_options/page_margins.rb +2 -2
  50. data/manual/document_and_page_options/page_size.rb +3 -3
  51. data/manual/example_helper.rb +5 -409
  52. data/manual/graphics/circle_and_ellipse.rb +4 -4
  53. data/manual/graphics/color.rb +4 -4
  54. data/manual/graphics/common_lines.rb +5 -5
  55. data/manual/graphics/fill_and_stroke.rb +5 -5
  56. data/manual/graphics/fill_rules.rb +1 -1
  57. data/manual/graphics/gradients.rb +1 -1
  58. data/manual/graphics/graphics.rb +8 -8
  59. data/manual/graphics/helper.rb +1 -1
  60. data/manual/graphics/line_width.rb +5 -5
  61. data/manual/graphics/lines_and_curves.rb +5 -5
  62. data/manual/graphics/polygon.rb +4 -4
  63. data/manual/graphics/rectangle.rb +3 -3
  64. data/manual/graphics/rotate.rb +5 -5
  65. data/manual/graphics/scale.rb +5 -5
  66. data/manual/graphics/soft_masks.rb +1 -1
  67. data/manual/graphics/stroke_cap.rb +3 -3
  68. data/manual/graphics/stroke_dash.rb +1 -1
  69. data/manual/graphics/stroke_join.rb +4 -4
  70. data/manual/graphics/translate.rb +5 -5
  71. data/manual/graphics/transparency.rb +5 -5
  72. data/manual/{manual/how_to_read_this_manual.rb → how_to_read_this_manual.rb} +16 -17
  73. data/manual/images/absolute_position.rb +3 -3
  74. data/manual/images/fit.rb +2 -2
  75. data/manual/images/horizontal.rb +3 -3
  76. data/manual/images/images.rb +7 -7
  77. data/manual/images/plain_image.rb +1 -1
  78. data/manual/images/scale.rb +3 -3
  79. data/manual/images/vertical.rb +3 -3
  80. data/manual/images/width_and_height.rb +3 -3
  81. data/manual/layout/boxes.rb +4 -4
  82. data/manual/layout/content.rb +3 -3
  83. data/manual/layout/layout.rb +5 -5
  84. data/manual/layout/simple_grid.rb +2 -2
  85. data/manual/outline/add_subsection_to.rb +7 -7
  86. data/manual/outline/insert_section_after.rb +5 -5
  87. data/manual/outline/outline.rb +6 -6
  88. data/manual/outline/sections_and_pages.rb +9 -9
  89. data/manual/repeatable_content/page_numbering.rb +3 -3
  90. data/manual/repeatable_content/repeatable_content.rb +5 -5
  91. data/manual/repeatable_content/repeater.rb +4 -4
  92. data/manual/repeatable_content/stamp.rb +4 -4
  93. data/manual/security/encryption.rb +2 -2
  94. data/manual/security/permissions.rb +2 -2
  95. data/manual/security/security.rb +5 -5
  96. data/manual/table/basic_block.rb +5 -5
  97. data/manual/table/before_rendering_page.rb +1 -1
  98. data/manual/table/cell_border_lines.rb +4 -4
  99. data/manual/table/cell_borders_and_bg.rb +4 -4
  100. data/manual/table/cell_dimensions.rb +3 -3
  101. data/manual/table/cell_text.rb +6 -6
  102. data/manual/table/column_widths.rb +4 -4
  103. data/manual/table/content_and_subtables.rb +5 -5
  104. data/manual/table/creation.rb +2 -2
  105. data/manual/table/filtering.rb +6 -6
  106. data/manual/table/flow_and_header.rb +2 -2
  107. data/manual/table/image_cells.rb +1 -1
  108. data/manual/table/position.rb +1 -1
  109. data/manual/table/row_colors.rb +3 -3
  110. data/manual/table/span.rb +1 -1
  111. data/manual/table/style.rb +3 -3
  112. data/manual/table/table.rb +7 -7
  113. data/manual/table/width.rb +3 -3
  114. data/manual/text/alignment.rb +1 -1
  115. data/manual/text/color.rb +1 -1
  116. data/manual/text/column_box.rb +1 -1
  117. data/manual/text/fallback_fonts.rb +3 -3
  118. data/manual/text/font.rb +7 -7
  119. data/manual/text/font_size.rb +9 -9
  120. data/manual/text/font_style.rb +3 -3
  121. data/manual/text/formatted_callbacks.rb +3 -3
  122. data/manual/text/formatted_text.rb +3 -3
  123. data/manual/text/free_flowing_text.rb +6 -6
  124. data/manual/text/inline.rb +5 -5
  125. data/manual/text/kerning_and_character_spacing.rb +7 -7
  126. data/manual/text/leading.rb +4 -4
  127. data/manual/text/line_wrapping.rb +4 -4
  128. data/manual/text/paragraph_indentation.rb +3 -3
  129. data/manual/text/positioned_text.rb +3 -3
  130. data/manual/text/registering_families.rb +6 -6
  131. data/manual/text/rendering_and_color.rb +2 -2
  132. data/manual/text/right_to_left_text.rb +2 -2
  133. data/manual/text/rotation.rb +4 -4
  134. data/manual/text/single_usage.rb +3 -3
  135. data/manual/text/text.rb +9 -9
  136. data/manual/text/text_box_excess.rb +2 -2
  137. data/manual/text/text_box_extensions.rb +3 -3
  138. data/manual/text/text_box_overflow.rb +4 -4
  139. data/manual/text/utf8.rb +5 -5
  140. data/manual/text/win_ansi_charset.rb +1 -1
  141. data/prawn.gemspec +5 -3
  142. data/spec/acceptance/png.rb +5 -3
  143. data/spec/cell_spec.rb +1 -0
  144. data/spec/column_box_spec.rb +1 -1
  145. data/spec/extensions/encoding_helpers.rb +2 -0
  146. data/spec/extensions/mocha.rb +2 -0
  147. data/spec/font_spec.rb +15 -0
  148. data/spec/measurement_units_spec.rb +2 -0
  149. data/spec/repeater_spec.rb +2 -0
  150. data/spec/soft_mask_spec.rb +2 -0
  151. data/spec/stamp_spec.rb +2 -0
  152. data/spec/table_spec.rb +103 -10
  153. data/spec/text_spec.rb +1 -1
  154. data/spec/transparency_spec.rb +2 -0
  155. metadata +42 -18
  156. data/lib/prawn/layout.rb +0 -17
  157. data/manual/example_file.rb +0 -111
  158. data/manual/example_package.rb +0 -53
  159. data/manual/example_section.rb +0 -46
  160. data/manual/syntax_highlight.rb +0 -52
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- #
2
+ #
3
3
  # Bounding Boxes accept an optional <code>:height</code> parameter. Unless it
4
4
  # is provided the bounding box will be stretchy. It will expand the height to
5
5
  # fit all content generated inside it.
@@ -8,24 +8,24 @@ require File.expand_path(File.join(File.dirname(__FILE__),
8
8
  %w[.. example_helper]))
9
9
 
10
10
  filename = File.basename(__FILE__).gsub('.rb', '.pdf')
11
- Prawn::Example.generate(filename) do
11
+ Prawn::ManualBuilder::Example.generate(filename) do
12
12
  y_position = cursor
13
13
  bounding_box([0, y_position], :width => 200, :height => 100) do
14
14
  text "This bounding box has a height of 100. If this text gets too large " +
15
15
  "it will flow to the next page."
16
-
16
+
17
17
  transparent(0.5) { stroke_bounds }
18
18
  end
19
-
19
+
20
20
  bounding_box([300, y_position], :width => 200) do
21
21
  text "This bounding box has variable height. No matter how much text is " +
22
22
  "written here, the height will expand to fit."
23
-
23
+
24
24
  text " _" * 100
25
-
25
+
26
26
  text " *" * 100
27
-
27
+
28
28
  transparent(0.5) { stroke_bounds }
29
29
  end
30
-
30
+
31
31
  end
@@ -1,19 +1,16 @@
1
1
  # encoding: utf-8
2
2
  #
3
3
  # Generates the Prawn by example manual.
4
- #
5
4
 
6
- Encoding.default_external = Encoding::UTF_8
5
+ require_relative "example_helper"
7
6
 
8
- require File.expand_path(File.join(File.dirname(__FILE__),
9
- %w[.. example_helper]))
7
+ Encoding.default_external = Encoding::UTF_8
10
8
 
11
- Prawn::Example.generate("manual.pdf",
12
- :skip_page_creation => true,
13
- :page_size => "FOLIO") do
9
+ Prawn::ManualBuilder::Example.generate("manual.pdf",
10
+ :skip_page_creation => true, :page_size => "FOLIO") do
14
11
 
15
- load_page "cover"
16
- load_page "how_to_read_this_manual"
12
+ load_page "", "cover"
13
+ load_page "", "how_to_read_this_manual"
17
14
 
18
15
  # Core chapters
19
16
  load_package "basic_concepts"
@@ -1,18 +1,18 @@
1
1
  # encoding: utf-8
2
2
  #
3
- # Prawn manual how to read this manual page.
3
+ # Prawn manual how to read this manual page.
4
4
  #
5
- require File.expand_path(File.join(File.dirname(__FILE__),
6
- %w[.. example_helper]))
5
+
6
+ require_relative "example_helper"
7
7
 
8
8
  filename = File.basename(__FILE__).gsub('.rb', '.pdf')
9
- Prawn::Example.generate(filename) do
9
+ Prawn::ManualBuilder::Example.generate(filename) do
10
10
  move_down 200
11
11
 
12
12
  image "#{Prawn::DATADIR}/images/prawn.png",
13
13
  :scale => 0.9,
14
14
  :at => [10, cursor]
15
-
15
+
16
16
  formatted_text_box([ {:text => "Prawn\n",
17
17
  :styles => [:bold],
18
18
  :size => 100}
@@ -38,5 +38,5 @@ Prawn::Example.generate(filename) do
38
38
  git_commit,
39
39
  :size => 12}
40
40
  ], :at => [390, cursor - 620])
41
-
41
+
42
42
  end
@@ -2,7 +2,7 @@
2
2
  #
3
3
  # Pass an image path to the <code>:background</code> option and it will be used
4
4
  # as the background for all pages.
5
- # This option can only be used on document creation.
5
+ # This option can only be used on document creation.
6
6
  #
7
7
  require File.expand_path(File.join(File.dirname(__FILE__),
8
8
  %w[.. example_helper]))
@@ -17,7 +17,7 @@ Prawn::Document.generate("background.pdf",
17
17
 
18
18
  move_down font.height * 2
19
19
 
20
- text "Here is my text explaning this report. " * 20,
20
+ text "Here is my text explaning this report. " * 20,
21
21
  :size => 12, :align => :left, :leading => 2
22
22
 
23
23
  move_down font.height
@@ -5,11 +5,11 @@
5
5
  require File.expand_path(File.join(File.dirname(__FILE__),
6
6
  %w[.. example_helper]))
7
7
 
8
- Prawn::Example.generate("document_and_page_options.pdf",
8
+ Prawn::ManualBuilder::Example.generate("document_and_page_options.pdf",
9
9
  :page_size => "FOLIO") do
10
-
10
+
11
11
  package "document_and_page_options" do |p|
12
-
12
+
13
13
  p.example "page_size", :eval_source => false, :full_source => true
14
14
  p.example "page_margins", :eval_source => false, :full_source => true
15
15
  p.example "background", :eval_source => false, :full_source => true
@@ -27,6 +27,6 @@ Prawn::Example.generate("document_and_page_options.pdf",
27
27
  "How to add metadata to the generated PDF"
28
28
  )
29
29
  end
30
-
30
+
31
31
  end
32
32
  end
@@ -13,11 +13,11 @@ Prawn::Document.generate("metadata.pdf",
13
13
  :Author => "John Doe",
14
14
  :Subject => "My Subject",
15
15
  :Keywords => "test metadata ruby pdf dry",
16
- :Creator => "ACME Soft App",
16
+ :Creator => "ACME Soft App",
17
17
  :Producer => "Prawn",
18
18
  :CreationDate => Time.now
19
19
  }) do
20
-
20
+
21
21
  text "This is a test of setting metadata properties via the info option."
22
22
  text "While the keys are arbitrary, the above example sets common attributes."
23
23
  end
@@ -20,7 +20,7 @@ Prawn::Document.generate("page_margins.pdf",
20
20
  start_new_page(:left_margin => 300)
21
21
  text "300 pts margin on the left."
22
22
  stroke_bounds
23
-
23
+
24
24
  start_new_page(:top_margin => 300)
25
25
  text "300 pts margin both on the top and on the left. Notice that whenever " +
26
26
  "you set an option for a new page it will remain the default for the " +
@@ -31,7 +31,7 @@ Prawn::Document.generate("page_margins.pdf",
31
31
  text "50 pts margins. Using the margin option will reset previous specific " +
32
32
  "calls to left, right, top and bottom margins."
33
33
  stroke_bounds
34
-
34
+
35
35
  start_new_page(:margin => [50, 100, 150, 200])
36
36
  text "There is also the shorthand CSS like syntax used here."
37
37
  stroke_bounds
@@ -22,12 +22,12 @@ Prawn::Document.generate("page_size.pdf",
22
22
  text "EXECUTIVE landscape page."
23
23
 
24
24
  custom_size = [275, 326]
25
-
25
+
26
26
  ["A4", "TABLOID", "B7", custom_size ].each do |size|
27
-
27
+
28
28
  start_new_page(:size => size, :layout => :portrait)
29
29
  text "#{size} portrait page."
30
-
30
+
31
31
  start_new_page(:size => size, :layout => :landscape)
32
32
  text "#{size} landscape page."
33
33
  end
@@ -1,411 +1,7 @@
1
- # encoding: utf-8
2
- #
3
- # Helper for organizing examples
4
- #
1
+ # encoding: UTF-8
5
2
 
6
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
7
- require 'prawn'
8
- require 'prawn/security'
9
- require 'prawn/layout'
3
+ require_relative "../lib/prawn"
4
+ require_relative "../lib/prawn/table"
5
+ require "prawn/manual_builder"
10
6
 
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
- 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__)