prawn-manual_builder 0.0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c85c4457c9cc7079dbd6d92ea0778aab34009074
4
+ data.tar.gz: fc8dc917c37b3d59791b9d5112e1f55a23e449f7
5
+ SHA512:
6
+ metadata.gz: 582e12aaa4931c67442fec5b0946e4ea7ce384d84ea64e2477d1fbe10a8fc39637a8303cf1db6dfa8032ac950e180363c693804a2c5d1c5048e91bda90d24bdb
7
+ data.tar.gz: 7cd0ce8266d4544308cd40bf3f10cd35d2f8ff889bf9b4e1d315ce96aa6116c276b57dc5c4f9c54f6137c9bbbef96d4849e56f2b9c780a2c2ec12b9a900f1c6d
@@ -0,0 +1,6 @@
1
+ # Prawn::ManualBuilder
2
+
3
+ This is an experiment to extract manual building functionality from Prawn into
4
+ its own standalone gem, so that it can be used by all Prawn extensions.
5
+
6
+ **This is a work-in-progress and is not remotely ready for use yet!**
Binary file
Binary file
@@ -0,0 +1,34 @@
1
+ require "enumerator"
2
+ require "prawn"
3
+
4
+ module Prawn
5
+ module ManualBuilder
6
+ def self.manual_dir=(dir)
7
+ @manual_dir = dir
8
+ end
9
+
10
+ def self.manual_dir
11
+ @manual_dir || Dir.pwd
12
+ end
13
+
14
+ def self.document_class
15
+ @document_class || Prawn::Document
16
+ rescue NameError
17
+ raise "Prawn::ManualBuilder.document_class was not set. "+
18
+ "Either assign a custom document class, or make sure to install "+
19
+ "and require the Prawn gem."
20
+
21
+ end
22
+
23
+ DATADIR = File.dirname(__FILE__) + "/../../data"
24
+ end
25
+ end
26
+
27
+ require_relative "manual_builder/example"
28
+ require_relative "manual_builder/example_file"
29
+ require_relative "manual_builder/example_section"
30
+ require_relative "manual_builder/example_package"
31
+ require_relative "manual_builder/syntax_highlight"
32
+ require_relative "manual_builder/example"
33
+
34
+
@@ -0,0 +1,391 @@
1
+ module Prawn
2
+ module ManualBuilder
3
+ # The Prawn::ManualBuilder::Example class holds all the helper methods
4
+ # used to generate manuals.
5
+ #
6
+ # The overall structure is to have single example files grouped by package
7
+ # folders. Each package has a package builder file (with the same name as the
8
+ # package folder) that defines the inner structure of subsections and
9
+ # examples. The manual is then built by loading all the packages and some
10
+ # standalone pages.
11
+ #
12
+ # To see one of the examples check manual/basic_concepts/cursor.rb
13
+ #
14
+ # To see one of the package builders check
15
+ # manual/basic_concepts/basic_concepts.rb
16
+ #
17
+ # To see how the manual is built check manual/manual/manual.rb (Yes that's a
18
+ # whole load of manuals)
19
+ class Example < Prawn::ManualBuilder.document_class
20
+
21
+ # Values used for the manual design:
22
+
23
+ # This is the default value for the margin box
24
+ #
25
+ BOX_MARGIN = 36
26
+
27
+ # Additional indentation to keep the line measure with a reasonable size
28
+ #
29
+ INNER_MARGIN = 30
30
+
31
+ # Vertical Rhythm settings
32
+ #
33
+ RHYTHM = 10
34
+ LEADING = 2
35
+
36
+ # Colors
37
+ #
38
+ BLACK = "000000"
39
+ LIGHT_GRAY = "F2F2F2"
40
+ GRAY = "DDDDDD"
41
+ DARK_GRAY = "333333"
42
+ BROWN = "A4441C"
43
+ ORANGE = "F28157"
44
+ LIGHT_GOLD = "FBFBBE"
45
+ DARK_GOLD = "EBE389"
46
+ BLUE = "0000D0"
47
+
48
+ # Used to generate the url for the example files
49
+ #
50
+ MANUAL_URL = "http://github.com/prawnpdf/prawn/tree/master/manual"
51
+
52
+
53
+ # Loads a package. Used on the manual.
54
+ #
55
+ def load_package(package)
56
+ load_file(package, package)
57
+ end
58
+
59
+ # Loads a page with outline support. Used on the manual.
60
+ #
61
+ def load_page(page)
62
+ load_file("manual", page)
63
+
64
+ outline.define do
65
+ section(page.gsub("_", " ").capitalize, :destination => page_number)
66
+ end
67
+ end
68
+
69
+ # Opens a file in a given package and evals the source
70
+ #
71
+ def load_file(package, file)
72
+ start_new_page
73
+ example = ExampleFile.new(package, "#{file}.rb")
74
+ eval example.generate_block_source
75
+ end
76
+
77
+
78
+ # Creates a new ExamplePackage object and yields it to a block in order for
79
+ # it to be populated with examples, sections and some introduction text.
80
+ # Used on the package files.
81
+ #
82
+ def package(package, &block)
83
+ ep = ExamplePackage.new(package)
84
+ ep.instance_eval(&block)
85
+ ep.render(self)
86
+ end
87
+
88
+ # Renders an ExamplePackage cover page.
89
+ #
90
+ # Starts a new page and renders the package introduction text.
91
+ #
92
+ def render_package_cover(package)
93
+ header(package.name)
94
+ instance_eval &(package.intro_block)
95
+
96
+ outline.define do
97
+ section(package.name, :destination => page_number, :closed => true)
98
+ end
99
+ end
100
+
101
+ # Add the ExampleSection to the document outline within the appropriate
102
+ # package.
103
+ #
104
+ def render_section(section)
105
+ outline.add_subsection_to(section.package_name) do
106
+ outline.section(section.name, :closed => true)
107
+ end
108
+ end
109
+
110
+ # Renders an ExampleFile.
111
+ #
112
+ # Starts a new page and renders an introductory text, the example source and
113
+ # evaluates the example source inline whenever that is appropriate according
114
+ # to the ExampleFile directives.
115
+ #
116
+ def render_example(example)
117
+ start_new_page
118
+
119
+ outline.add_subsection_to(example.parent_name) do
120
+ outline.page(:destination => page_number, :title => example.name)
121
+ end
122
+
123
+ example_header(example.parent_folder_name, example.filename)
124
+
125
+ prose(example.introduction_text)
126
+
127
+ code(example.source)
128
+
129
+ if example.eval?
130
+ eval_code(example.source)
131
+ else
132
+ source_link(example)
133
+ end
134
+
135
+ reset_settings
136
+ end
137
+
138
+ # Render the example header. Used on the example pages of the manual
139
+ #
140
+ def example_header(package, example)
141
+ header_box do
142
+ register_fonts
143
+ font('DejaVu', :size => 18) do
144
+ formatted_text([ { :text => package, :color => BROWN },
145
+ { :text => "/", :color => BROWN },
146
+ { :text => example, :color => ORANGE }
147
+ ], :valign => :center)
148
+ end
149
+ end
150
+ end
151
+
152
+ # Register fonts used on the manual
153
+ #
154
+ def register_fonts
155
+ kai_file = "#{Prawn::ManualBuilder::DATADIR}/fonts/gkai00mp.ttf"
156
+ font_families["Kai"] = {
157
+ :normal => { :file => kai_file, :font => "Kai" }
158
+ }
159
+
160
+ dejavu_file = "#{Prawn::ManualBuilder::DATADIR}/fonts/DejaVuSans.ttf"
161
+ font_families["DejaVu"] = {
162
+ :normal => { :file => dejavu_file, :font => "DejaVu" }
163
+ }
164
+ end
165
+
166
+ # Render a block of text after processing code tags and URLs to be used with
167
+ # the inline_format option.
168
+ #
169
+ # Used on the introducory text for example pages of the manual and on
170
+ # package pages intro
171
+ #
172
+ def prose(str)
173
+
174
+ # Process the <code> tags
175
+ str.gsub!(/<code>([^<]+?)<\/code>/,
176
+ "<font name='Courier'><b>\\1<\/b><\/font>")
177
+
178
+ # Process the links
179
+ str.gsub!(/(https?:\/\/\S+)/,
180
+ "<color rgb='#{BLUE}'><link href=\"\\1\">\\1</link></color>")
181
+
182
+ inner_box do
183
+ font("Helvetica", :size => 11) do
184
+ str.split(/\n\n+/).each do |paragraph|
185
+
186
+ text(paragraph.gsub(/\s+/," "),
187
+ :align => :justify,
188
+ :inline_format => true,
189
+ :leading => LEADING,
190
+ :color => DARK_GRAY)
191
+
192
+ move_down(RHYTHM)
193
+ end
194
+ end
195
+ end
196
+
197
+ move_down(RHYTHM)
198
+ end
199
+
200
+ # Render a code block. Used on the example pages of the manual
201
+ #
202
+ def code(str)
203
+ pre_text = str.gsub(' ', Prawn::Text::NBSP)
204
+ pre_text = ::CodeRay.scan(pre_text, :ruby).to_prawn
205
+
206
+ font('Courier', :size => 9.5) do
207
+ colored_box(pre_text, :fill_color => DARK_GRAY)
208
+ end
209
+ end
210
+
211
+ # Renders a dashed line and evaluates the code inline
212
+ #
213
+ def eval_code(source)
214
+ move_down(RHYTHM)
215
+
216
+ dash(3)
217
+ stroke_color(BROWN)
218
+ stroke_horizontal_line(-BOX_MARGIN, bounds.width + BOX_MARGIN)
219
+ stroke_color(BLACK)
220
+ undash
221
+
222
+ move_down(RHYTHM*3)
223
+ begin
224
+ eval(source)
225
+ rescue => e
226
+ puts "Error evaluating example: #{e.message}"
227
+ puts
228
+ puts "---- Source: ----"
229
+ puts source
230
+ end
231
+ end
232
+
233
+ # Renders a box with the link for the example file
234
+ #
235
+ def source_link(example)
236
+ url = "#{MANUAL_URL}/#{example.parent_folder_name}/#{example.filename}"
237
+
238
+ reason = [{ :text => "This code snippet was not evaluated inline. " +
239
+ "You may see its output by running the " +
240
+ "example file located here:\n",
241
+ :color => DARK_GRAY },
242
+
243
+ { :text => url,
244
+ :color => BLUE,
245
+ :link => url}
246
+ ]
247
+
248
+ font('Helvetica', :size => 9) do
249
+ colored_box(reason,
250
+ :fill_color => LIGHT_GOLD,
251
+ :stroke_color => DARK_GOLD,
252
+ :leading => LEADING*3)
253
+ end
254
+ end
255
+
256
+ # Render a page header. Used on the manual lone pages and package
257
+ # introductory pages
258
+ #
259
+ def header(str)
260
+ header_box do
261
+ register_fonts
262
+ font('DejaVu', :size => 24) do
263
+ text(str, :color => BROWN, :valign => :center)
264
+ end
265
+ end
266
+ end
267
+
268
+ # Render the arguments as a bulleted list. Used on the manual package
269
+ # introductory pages
270
+ #
271
+ def list(*items)
272
+ move_up(RHYTHM)
273
+
274
+ inner_box do
275
+ font("Helvetica", :size => 11) do
276
+ items.each do |li|
277
+ float { text("•", :color => DARK_GRAY) }
278
+ indent(RHYTHM) do
279
+ text(li.gsub(/\s+/," "),
280
+ :inline_format => true,
281
+ :color => DARK_GRAY,
282
+ :leading => LEADING)
283
+ end
284
+
285
+ move_down(RHYTHM)
286
+ end
287
+ end
288
+ end
289
+ end
290
+
291
+ # Renders the page-wide headers
292
+ #
293
+ def header_box(&block)
294
+ bounding_box([-bounds.absolute_left, cursor + BOX_MARGIN],
295
+ :width => bounds.absolute_left + bounds.absolute_right,
296
+ :height => BOX_MARGIN*2 + RHYTHM*2) do
297
+
298
+ fill_color LIGHT_GRAY
299
+ fill_rectangle([bounds.left, bounds.top],
300
+ bounds.right,
301
+ bounds.top - bounds.bottom)
302
+ fill_color BLACK
303
+
304
+ indent(BOX_MARGIN + INNER_MARGIN, &block)
305
+ end
306
+
307
+ stroke_color GRAY
308
+ stroke_horizontal_line(-BOX_MARGIN, bounds.width + BOX_MARGIN, :at => cursor)
309
+ stroke_color BLACK
310
+
311
+ move_down(RHYTHM*3)
312
+ end
313
+
314
+ # Renders a Bounding Box for the inner margin
315
+ #
316
+ def inner_box(&block)
317
+ bounding_box([INNER_MARGIN, cursor],
318
+ :width => bounds.width - INNER_MARGIN*2,
319
+ &block)
320
+ end
321
+
322
+ # Renders a Bounding Box with some background color and the formatted text
323
+ # inside it
324
+ #
325
+ def colored_box(box_text, options={})
326
+ options = { :fill_color => DARK_GRAY,
327
+ :stroke_color => nil,
328
+ :text_color => LIGHT_GRAY,
329
+ :leading => LEADING
330
+ }.merge(options)
331
+
332
+ register_fonts
333
+ text_options = { :leading => options[:leading],
334
+ :fallback_fonts => ["DejaVu", "Kai"]
335
+ }
336
+
337
+ box_height = height_of_formatted(box_text, text_options)
338
+
339
+ bounding_box([INNER_MARGIN + RHYTHM, cursor],
340
+ :width => bounds.width - (INNER_MARGIN+RHYTHM)*2) do
341
+
342
+ fill_color options[:fill_color]
343
+ stroke_color options[:stroke_color] || options[:fill_color]
344
+ fill_and_stroke_rounded_rectangle(
345
+ [bounds.left - RHYTHM, cursor],
346
+ bounds.left + bounds.right + RHYTHM*2,
347
+ box_height + RHYTHM*2,
348
+ 5
349
+ )
350
+ fill_color BLACK
351
+ stroke_color BLACK
352
+
353
+ pad(RHYTHM) do
354
+ formatted_text(box_text, text_options)
355
+ end
356
+ end
357
+
358
+ move_down(RHYTHM*2)
359
+ end
360
+
361
+ # Draws X and Y axis rulers beginning at the margin box origin. Used on
362
+ # examples.
363
+ #
364
+ def stroke_axis(options={})
365
+ super({:height => (cursor - 20).to_i}.merge(options))
366
+ end
367
+
368
+ # Reset some of the Prawn settings including graphics and text to their
369
+ # defaults.
370
+ #
371
+ # Used after rendering examples so that each new example starts with a clean
372
+ # slate.
373
+ #
374
+ def reset_settings
375
+
376
+ # Text settings
377
+ font("Helvetica", :size => 12)
378
+ default_leading 0
379
+ self.text_direction = :ltr
380
+
381
+ # Graphics settings
382
+ self.line_width = 1
383
+ self.cap_style = :butt
384
+ self.join_style = :miter
385
+ undash
386
+ fill_color BLACK
387
+ stroke_color BLACK
388
+ end
389
+ end
390
+ end
391
+ end
@@ -0,0 +1,113 @@
1
+ # encoding: utf-8
2
+
3
+ module Prawn
4
+ module ManualBuilder
5
+ # The Prawn::ManualBuilder ExampleFile class is a utility class to ease
6
+ # the manipulation and extraction of source code and comments from the
7
+ # actual example files
8
+ #
9
+ class ExampleFile
10
+ attr_reader :package, :filename
11
+
12
+ # Stores the file data, filename and parent, which will be either an
13
+ # ExampleSection or an ExamplePackage.
14
+ #
15
+ # Available boolean options are:
16
+ #
17
+ # <tt>:eval_source</tt>:: Evals the example source code (default: true)
18
+ # <tt>:full_source</tt>:: Extract the full source code when true. Extract
19
+ # only the code between the generate block when false (default: false)
20
+ #
21
+ def initialize(parent, filename, options={})
22
+ @parent = parent.is_a?(String) ? ExamplePackage.new(parent) : parent
23
+
24
+ @filename = filename
25
+ @data = read_file(@parent.folder_name, filename)
26
+
27
+ @options = {:eval_source => true, :full_source => false}.merge(options)
28
+ end
29
+
30
+ # Return the example source code excluding the initial comments and
31
+ # require calls
32
+ #
33
+ def full_source
34
+ @data.gsub(/# encoding.*?\n.*require.*?\n\n/m, "\n").strip
35
+ end
36
+
37
+ # Return the example source contained inside the first generate block or
38
+ # the full source if no generate block is found
39
+ #
40
+ def generate_block_source
41
+ block = @data.slice(/\w+\.generate.*? do\n(.*)end/m, 1)
42
+
43
+ return full_source unless block
44
+
45
+ block.gsub(/^( ){2}/, "")
46
+ end
47
+
48
+ # Return either the full_source or the generate_block_source according
49
+ # to the options
50
+ #
51
+ def source
52
+ @options[:full_source] ? full_source : generate_block_source
53
+ end
54
+
55
+ # Return true if the example source should be evaluated inline within
56
+ # the manual according to the options
57
+ #
58
+ def eval?
59
+ @options[:eval_source]
60
+ end
61
+
62
+ # Retrieve the comments between the encoding declaration and the require
63
+ # call for example_helper.rb
64
+ #
65
+ # Then removes the '#' signs, reflows the line breaks and return the result
66
+ #
67
+ def introduction_text
68
+ intro = @data.lines.grep(/^#/).join
69
+ intro.gsub!(/\n# (?=\S)/m, ' ')
70
+ intro.gsub!(/^#/, '')
71
+ intro.gsub!("\n", "\n\n")
72
+ intro.rstrip!
73
+ intro
74
+ end
75
+
76
+ # Returns a human friendly version of the example file name
77
+ #
78
+ def name
79
+ @name ||= @filename[/(.*)\.rb/, 1].gsub("_", " ").capitalize
80
+ end
81
+
82
+ # Returns this example's parent original folder name
83
+ #
84
+ def parent_folder_name
85
+ @parent.folder_name
86
+ end
87
+
88
+ # Returns the human friendly version of this example parent name
89
+ #
90
+ def parent_name
91
+ @parent.name
92
+ end
93
+
94
+ # Renders this example to a pdf
95
+ #
96
+ def render(pdf)
97
+ pdf.render_example(self)
98
+ end
99
+
100
+ private
101
+
102
+ # Read the data from a file in a given package
103
+ #
104
+ def read_file(folder_name, filename)
105
+ data = File.read(File.expand_path(File.join(
106
+ Prawn::ManualBuilder.manual_dir, folder_name, filename)))
107
+
108
+ data.encode(::Encoding::UTF_8)
109
+ end
110
+
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,54 @@
1
+ # encoding: utf-8
2
+
3
+ module Prawn
4
+ module ManualBuilder
5
+ # The Prawn::ManualBuilder::ExamplePackage class is a utility class to
6
+ # handle the packaging of individual examples within a hierarchy
7
+ # when building the manual.
8
+ class ExamplePackage
9
+ attr_reader :intro_block, :folder_name
10
+
11
+ def initialize(folder_name)
12
+ @folder_name = folder_name
13
+ @hierarchy = []
14
+ end
15
+
16
+ # Stores a new ExampleSection in the hierarchy and yields it to a block
17
+ #
18
+ def section(name)
19
+ s = ExampleSection.new(self, name)
20
+ yield s
21
+ @hierarchy << s
22
+ end
23
+
24
+ # Stores a new ExampleFile in the hierarchy
25
+ #
26
+ def example(filename, options={})
27
+ @hierarchy << ExampleFile.new(self, "#{filename}.rb", options)
28
+ end
29
+
30
+ # Stores a block with code to be evaluated when rendering the package cover
31
+ #
32
+ def intro(&block)
33
+ @intro_block = block
34
+ end
35
+
36
+ # Returns a human friendly version of the package name
37
+ #
38
+ def name
39
+ @name ||= @folder_name.gsub("_", " ").capitalize
40
+ end
41
+
42
+ # Renders a cover page for the package to a pdf and iterates the examples
43
+ # hierarchy delegating the examples and sections to be rendered as well
44
+ #
45
+ def render(pdf)
46
+ pdf.render_package_cover(self)
47
+
48
+ @hierarchy.each do |node|
49
+ node.render(pdf)
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,47 @@
1
+ # encoding: utf-8
2
+
3
+ module Prawn
4
+ module ManualBuilder
5
+ # The Prawn::ManualBuilder::ExampleSection class is a utility class to
6
+ # handle sections of related examples within an ExamplePackage
7
+ #
8
+ class ExampleSection
9
+ attr_reader :name
10
+
11
+ def initialize(package, name)
12
+ @package = package
13
+ @name = name
14
+ @examples = []
15
+ end
16
+
17
+ # Stores a new ExampleFile in the examples list
18
+ #
19
+ def example(filename, options={})
20
+ @examples << ExampleFile.new(self, "#{filename}.rb", options)
21
+ end
22
+
23
+ # Returns this example's package original folder name
24
+ #
25
+ def folder_name
26
+ @package.folder_name
27
+ end
28
+
29
+ # Returns the human friendly version of this section's package name
30
+ #
31
+ def package_name
32
+ @package.name
33
+ end
34
+
35
+ # Renders the section to a pdf and iterates the examples list delegating the
36
+ # examples to be rendered as well
37
+ #
38
+ def render(pdf)
39
+ pdf.render_section(self)
40
+
41
+ @examples.each do |example|
42
+ example.render(pdf)
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,56 @@
1
+ # encoding: utf-8
2
+
3
+ require "coderay"
4
+
5
+ module Prawn
6
+ module ManualBuilder
7
+ # Registers a to_prawn method on CodeRay. It returns an array of hashes to be
8
+ # used with formatted_text.
9
+ #
10
+ # Usage:
11
+ #
12
+ # CodeRay.scan(string, :ruby).to_prawn
13
+ #
14
+ class PrawnEncoder < CodeRay::Encoders::Encoder
15
+ register_for :to_prawn
16
+
17
+ COLORS = { :default => "FFFFFF",
18
+
19
+ :comment => "AEAEAE",
20
+ :constant => "88A5D2",
21
+ :instance_variable => "E8ED97",
22
+ :integer => "C8FF0E",
23
+ :float => "C8FF0E",
24
+ :inline_delimiter => "EF804F", # #{} within a string
25
+ :keyword => "FEE100",
26
+
27
+ # BUG: There appear to be some problem with this token. Method
28
+ # definitions are considered as ident tokens
29
+ #
30
+ :method => "FF5C00",
31
+ :string => "56D65E",
32
+ :symbol => "C8FF0E"
33
+ }
34
+
35
+ def setup(options)
36
+ super
37
+ @out = []
38
+ @open = []
39
+ end
40
+
41
+ def text_token(text, kind)
42
+ color = COLORS[kind] || COLORS[@open.last] || COLORS[:default]
43
+
44
+ @out << {:text => text, :color => color}
45
+ end
46
+
47
+ def begin_group(kind)
48
+ @open << kind
49
+ end
50
+
51
+ def end_group(kind)
52
+ @open.pop
53
+ end
54
+ end
55
+ end
56
+ end
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: prawn-manual_builder
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Felipe Doria
8
+ - Gregory Brown
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-03-31 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: coderay
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: 1.0.7
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: 1.0.7
28
+ description: A tool for writing manuals for Prawn and Prawn accessories
29
+ email:
30
+ - felipe.doria@gmail.com
31
+ - gregory.t.brown@gmail.com
32
+ executables: []
33
+ extensions: []
34
+ extra_rdoc_files: []
35
+ files:
36
+ - README.md
37
+ - data/fonts/DejaVuSans.ttf
38
+ - data/fonts/Dustismo_Roman.ttf
39
+ - data/fonts/gkai00mp.ttf
40
+ - lib/prawn/manual_builder.rb
41
+ - lib/prawn/manual_builder/example.rb
42
+ - lib/prawn/manual_builder/example_file.rb
43
+ - lib/prawn/manual_builder/example_package.rb
44
+ - lib/prawn/manual_builder/example_section.rb
45
+ - lib/prawn/manual_builder/syntax_highlight.rb
46
+ homepage:
47
+ licenses: []
48
+ metadata: {}
49
+ post_install_message:
50
+ rdoc_options: []
51
+ require_paths:
52
+ - lib
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: 1.9.3
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ requirements: []
64
+ rubyforge_project:
65
+ rubygems_version: 2.2.2
66
+ signing_key:
67
+ specification_version: 4
68
+ summary: A tool for writing manuals for Prawn and Prawn accessories
69
+ test_files: []
70
+ has_rdoc: