prawn 0.15.0 → 1.0.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. data/COPYING +2 -2
  2. data/LICENSE +1 -1
  3. data/README.md +96 -0
  4. data/Rakefile +27 -30
  5. data/data/fonts/Action Man.dfont +0 -0
  6. data/data/fonts/Activa.ttf +0 -0
  7. data/data/fonts/Chalkboard.ttf +0 -0
  8. data/data/fonts/DejaVuSans.ttf +0 -0
  9. data/data/fonts/Dustismo_Roman.ttf +0 -0
  10. data/data/fonts/comicsans.ttf +0 -0
  11. data/data/fonts/gkai00mp.ttf +0 -0
  12. data/data/images/16bit.alpha +0 -0
  13. data/data/images/16bit.dat +0 -0
  14. data/data/images/dice.alpha +0 -0
  15. data/data/images/dice.dat +0 -0
  16. data/data/images/page_white_text.alpha +0 -0
  17. data/data/images/page_white_text.dat +0 -0
  18. data/data/images/rails.dat +0 -0
  19. data/data/images/rails.png +0 -0
  20. data/data/pdfs/nested_pages.pdf +13 -13
  21. data/lib/prawn.rb +21 -85
  22. data/lib/prawn/compatibility.rb +51 -0
  23. data/lib/prawn/core.rb +85 -0
  24. data/lib/prawn/core/annotations.rb +61 -0
  25. data/lib/prawn/core/byte_string.rb +9 -0
  26. data/lib/prawn/core/destinations.rb +90 -0
  27. data/lib/prawn/core/document_state.rb +78 -0
  28. data/lib/prawn/core/literal_string.rb +16 -0
  29. data/lib/prawn/core/name_tree.rb +177 -0
  30. data/lib/prawn/core/object_store.rb +264 -0
  31. data/lib/prawn/core/page.rb +215 -0
  32. data/lib/prawn/core/pdf_object.rb +108 -0
  33. data/lib/prawn/core/reference.rb +115 -0
  34. data/lib/prawn/core/text.rb +268 -0
  35. data/lib/prawn/core/text/formatted/arranger.rb +294 -0
  36. data/lib/prawn/core/text/formatted/line_wrap.rb +273 -0
  37. data/lib/prawn/core/text/formatted/wrap.rb +153 -0
  38. data/lib/prawn/document.rb +122 -155
  39. data/lib/prawn/document/bounding_box.rb +7 -36
  40. data/lib/prawn/document/column_box.rb +10 -38
  41. data/lib/prawn/document/graphics_state.rb +74 -11
  42. data/lib/prawn/document/internals.rb +23 -24
  43. data/lib/prawn/document/page_geometry.rb +136 -0
  44. data/lib/prawn/document/snapshot.rb +6 -7
  45. data/lib/prawn/document/span.rb +10 -12
  46. data/lib/prawn/encoding.rb +10 -9
  47. data/lib/prawn/errors.rb +30 -15
  48. data/lib/prawn/font.rb +104 -136
  49. data/lib/prawn/font/afm.rb +44 -46
  50. data/lib/prawn/font/dfont.rb +3 -4
  51. data/lib/prawn/font/ttf.rb +50 -31
  52. data/lib/prawn/graphics.rb +57 -302
  53. data/lib/prawn/graphics/cap_style.rb +3 -4
  54. data/lib/prawn/graphics/color.rb +5 -13
  55. data/lib/prawn/graphics/dash.rb +31 -53
  56. data/lib/prawn/graphics/gradient.rb +84 -0
  57. data/lib/prawn/graphics/join_style.rb +7 -9
  58. data/lib/prawn/graphics/transformation.rb +9 -10
  59. data/lib/prawn/graphics/transparency.rb +1 -3
  60. data/lib/prawn/images.rb +59 -69
  61. data/lib/prawn/images/image.rb +22 -6
  62. data/lib/prawn/images/jpg.rb +14 -20
  63. data/lib/prawn/images/png.rb +118 -61
  64. data/lib/prawn/layout.rb +15 -10
  65. data/lib/prawn/layout/grid.rb +54 -66
  66. data/lib/prawn/measurement_extensions.rb +6 -10
  67. data/lib/prawn/measurements.rb +21 -27
  68. data/lib/prawn/outline.rb +308 -6
  69. data/lib/prawn/repeater.rb +8 -10
  70. data/lib/prawn/security.rb +33 -55
  71. data/lib/prawn/security/arcfour.rb +0 -1
  72. data/lib/prawn/stamp.rb +3 -5
  73. data/lib/prawn/table.rb +60 -188
  74. data/lib/prawn/table/cell.rb +44 -272
  75. data/lib/prawn/table/cell/image.rb +3 -2
  76. data/lib/prawn/table/cell/in_table.rb +2 -4
  77. data/lib/prawn/table/cell/subtable.rb +2 -2
  78. data/lib/prawn/table/cell/text.rb +18 -41
  79. data/lib/prawn/table/cells.rb +48 -142
  80. data/lib/prawn/text.rb +25 -32
  81. data/lib/prawn/text/box.rb +6 -12
  82. data/lib/prawn/text/formatted.rb +4 -5
  83. data/lib/prawn/text/formatted/box.rb +59 -96
  84. data/lib/prawn/text/formatted/fragment.rb +23 -34
  85. data/lib/prawn/text/formatted/parser.rb +5 -15
  86. data/prawn.gemspec +13 -24
  87. data/spec/annotations_spec.rb +32 -16
  88. data/spec/bounding_box_spec.rb +17 -119
  89. data/spec/cell_spec.rb +42 -112
  90. data/spec/destinations_spec.rb +5 -5
  91. data/spec/document_spec.rb +111 -155
  92. data/spec/extensions/mocha.rb +0 -1
  93. data/spec/font_spec.rb +99 -149
  94. data/spec/formatted_text_arranger_spec.rb +43 -43
  95. data/spec/formatted_text_box_spec.rb +44 -43
  96. data/spec/formatted_text_fragment_spec.rb +8 -8
  97. data/spec/graphics_spec.rb +68 -151
  98. data/spec/grid_spec.rb +15 -26
  99. data/spec/images_spec.rb +30 -51
  100. data/spec/inline_formatted_text_parser_spec.rb +20 -69
  101. data/spec/jpg_spec.rb +4 -4
  102. data/spec/line_wrap_spec.rb +28 -28
  103. data/spec/measurement_units_spec.rb +6 -6
  104. data/spec/name_tree_spec.rb +112 -0
  105. data/spec/object_store_spec.rb +106 -17
  106. data/spec/outline_spec.rb +63 -103
  107. data/spec/pdf_object_spec.rb +170 -0
  108. data/spec/png_spec.rb +25 -25
  109. data/spec/reference_spec.rb +65 -8
  110. data/spec/repeater_spec.rb +10 -10
  111. data/spec/security_spec.rb +12 -44
  112. data/spec/snapshot_spec.rb +7 -7
  113. data/spec/span_spec.rb +15 -10
  114. data/spec/spec_helper.rb +8 -32
  115. data/spec/stamp_spec.rb +30 -29
  116. data/spec/stroke_styles_spec.rb +18 -36
  117. data/spec/table_spec.rb +111 -706
  118. data/spec/template_spec.rb +297 -0
  119. data/spec/text_at_spec.rb +33 -19
  120. data/spec/text_box_spec.rb +64 -100
  121. data/spec/text_rendering_mode_spec.rb +5 -5
  122. data/spec/text_spacing_spec.rb +4 -4
  123. data/spec/text_spec.rb +64 -84
  124. data/spec/transparency_spec.rb +5 -5
  125. metadata +290 -463
  126. checksums.yaml +0 -7
  127. data/.yardopts +0 -10
  128. data/Gemfile +0 -11
  129. data/data/images/16bit.color +0 -0
  130. data/data/images/dice.color +0 -0
  131. data/data/images/indexed_color.dat +0 -0
  132. data/data/images/indexed_color.png +0 -0
  133. data/data/images/page_white_text.color +0 -0
  134. data/lib/prawn/font_metric_cache.rb +0 -47
  135. data/lib/prawn/graphics/patterns.rb +0 -138
  136. data/lib/prawn/image_handler.rb +0 -36
  137. data/lib/prawn/soft_mask.rb +0 -96
  138. data/lib/prawn/table/cell/span_dummy.rb +0 -93
  139. data/lib/prawn/table/column_width_calculator.rb +0 -61
  140. data/lib/prawn/text/formatted/arranger.rb +0 -290
  141. data/lib/prawn/text/formatted/line_wrap.rb +0 -266
  142. data/lib/prawn/text/formatted/wrap.rb +0 -150
  143. data/lib/prawn/utilities.rb +0 -46
  144. data/manual/basic_concepts/adding_pages.rb +0 -27
  145. data/manual/basic_concepts/basic_concepts.rb +0 -34
  146. data/manual/basic_concepts/creation.rb +0 -39
  147. data/manual/basic_concepts/cursor.rb +0 -33
  148. data/manual/basic_concepts/measurement.rb +0 -25
  149. data/manual/basic_concepts/origin.rb +0 -38
  150. data/manual/basic_concepts/other_cursor_helpers.rb +0 -40
  151. data/manual/bounding_box/bounding_box.rb +0 -39
  152. data/manual/bounding_box/bounds.rb +0 -49
  153. data/manual/bounding_box/canvas.rb +0 -24
  154. data/manual/bounding_box/creation.rb +0 -23
  155. data/manual/bounding_box/indentation.rb +0 -46
  156. data/manual/bounding_box/nesting.rb +0 -45
  157. data/manual/bounding_box/russian_boxes.rb +0 -40
  158. data/manual/bounding_box/stretchy.rb +0 -31
  159. data/manual/document_and_page_options/background.rb +0 -27
  160. data/manual/document_and_page_options/document_and_page_options.rb +0 -32
  161. data/manual/document_and_page_options/metadata.rb +0 -23
  162. data/manual/document_and_page_options/page_margins.rb +0 -38
  163. data/manual/document_and_page_options/page_size.rb +0 -34
  164. data/manual/document_and_page_options/print_scaling.rb +0 -20
  165. data/manual/example_file.rb +0 -111
  166. data/manual/example_helper.rb +0 -411
  167. data/manual/example_package.rb +0 -53
  168. data/manual/example_section.rb +0 -46
  169. data/manual/graphics/circle_and_ellipse.rb +0 -22
  170. data/manual/graphics/color.rb +0 -24
  171. data/manual/graphics/common_lines.rb +0 -30
  172. data/manual/graphics/fill_and_stroke.rb +0 -42
  173. data/manual/graphics/fill_rules.rb +0 -37
  174. data/manual/graphics/gradients.rb +0 -37
  175. data/manual/graphics/graphics.rb +0 -58
  176. data/manual/graphics/helper.rb +0 -24
  177. data/manual/graphics/line_width.rb +0 -35
  178. data/manual/graphics/lines_and_curves.rb +0 -41
  179. data/manual/graphics/polygon.rb +0 -29
  180. data/manual/graphics/rectangle.rb +0 -21
  181. data/manual/graphics/rotate.rb +0 -28
  182. data/manual/graphics/scale.rb +0 -41
  183. data/manual/graphics/soft_masks.rb +0 -46
  184. data/manual/graphics/stroke_cap.rb +0 -31
  185. data/manual/graphics/stroke_dash.rb +0 -48
  186. data/manual/graphics/stroke_join.rb +0 -30
  187. data/manual/graphics/translate.rb +0 -29
  188. data/manual/graphics/transparency.rb +0 -35
  189. data/manual/images/absolute_position.rb +0 -23
  190. data/manual/images/fit.rb +0 -21
  191. data/manual/images/horizontal.rb +0 -25
  192. data/manual/images/images.rb +0 -40
  193. data/manual/images/plain_image.rb +0 -18
  194. data/manual/images/scale.rb +0 -22
  195. data/manual/images/vertical.rb +0 -28
  196. data/manual/images/width_and_height.rb +0 -25
  197. data/manual/layout/boxes.rb +0 -27
  198. data/manual/layout/content.rb +0 -25
  199. data/manual/layout/layout.rb +0 -28
  200. data/manual/layout/simple_grid.rb +0 -23
  201. data/manual/manual/cover.rb +0 -36
  202. data/manual/manual/foreword.rb +0 -85
  203. data/manual/manual/how_to_read_this_manual.rb +0 -41
  204. data/manual/manual/manual.rb +0 -34
  205. data/manual/outline/add_subsection_to.rb +0 -61
  206. data/manual/outline/insert_section_after.rb +0 -47
  207. data/manual/outline/outline.rb +0 -32
  208. data/manual/outline/sections_and_pages.rb +0 -67
  209. data/manual/repeatable_content/page_numbering.rb +0 -54
  210. data/manual/repeatable_content/repeatable_content.rb +0 -31
  211. data/manual/repeatable_content/repeater.rb +0 -55
  212. data/manual/repeatable_content/stamp.rb +0 -41
  213. data/manual/security/encryption.rb +0 -31
  214. data/manual/security/permissions.rb +0 -38
  215. data/manual/security/security.rb +0 -28
  216. data/manual/syntax_highlight.rb +0 -52
  217. data/manual/table/basic_block.rb +0 -53
  218. data/manual/table/before_rendering_page.rb +0 -26
  219. data/manual/table/cell_border_lines.rb +0 -24
  220. data/manual/table/cell_borders_and_bg.rb +0 -31
  221. data/manual/table/cell_dimensions.rb +0 -30
  222. data/manual/table/cell_text.rb +0 -38
  223. data/manual/table/column_widths.rb +0 -30
  224. data/manual/table/content_and_subtables.rb +0 -39
  225. data/manual/table/creation.rb +0 -27
  226. data/manual/table/filtering.rb +0 -36
  227. data/manual/table/flow_and_header.rb +0 -17
  228. data/manual/table/image_cells.rb +0 -33
  229. data/manual/table/position.rb +0 -29
  230. data/manual/table/row_colors.rb +0 -20
  231. data/manual/table/span.rb +0 -30
  232. data/manual/table/style.rb +0 -22
  233. data/manual/table/table.rb +0 -52
  234. data/manual/table/width.rb +0 -27
  235. data/manual/text/alignment.rb +0 -44
  236. data/manual/text/color.rb +0 -24
  237. data/manual/text/column_box.rb +0 -32
  238. data/manual/text/fallback_fonts.rb +0 -37
  239. data/manual/text/font.rb +0 -41
  240. data/manual/text/font_size.rb +0 -45
  241. data/manual/text/font_style.rb +0 -23
  242. data/manual/text/formatted_callbacks.rb +0 -60
  243. data/manual/text/formatted_text.rb +0 -54
  244. data/manual/text/free_flowing_text.rb +0 -51
  245. data/manual/text/group.rb +0 -31
  246. data/manual/text/inline.rb +0 -43
  247. data/manual/text/kerning_and_character_spacing.rb +0 -39
  248. data/manual/text/leading.rb +0 -25
  249. data/manual/text/line_wrapping.rb +0 -41
  250. data/manual/text/paragraph_indentation.rb +0 -26
  251. data/manual/text/positioned_text.rb +0 -38
  252. data/manual/text/registering_families.rb +0 -48
  253. data/manual/text/rendering_and_color.rb +0 -37
  254. data/manual/text/right_to_left_text.rb +0 -43
  255. data/manual/text/rotation.rb +0 -43
  256. data/manual/text/single_usage.rb +0 -37
  257. data/manual/text/text.rb +0 -75
  258. data/manual/text/text_box_excess.rb +0 -32
  259. data/manual/text/text_box_extensions.rb +0 -45
  260. data/manual/text/text_box_overflow.rb +0 -44
  261. data/manual/text/utf8.rb +0 -28
  262. data/manual/text/win_ansi_charset.rb +0 -59
  263. data/spec/acceptance/png.rb +0 -23
  264. data/spec/column_box_spec.rb +0 -65
  265. data/spec/extensions/encoding_helpers.rb +0 -9
  266. data/spec/font_metric_cache_spec.rb +0 -52
  267. data/spec/image_handler_spec.rb +0 -54
  268. data/spec/soft_mask_spec.rb +0 -117
  269. data/spec/table/span_dummy_spec.rb +0 -17
@@ -1,111 +0,0 @@
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
- data.encode(::Encoding::UTF_8)
108
- end
109
-
110
- end
111
- end
@@ -1,411 +0,0 @@
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
- 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