rote 0.3.0.2 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
data/CONTRIBUTORS CHANGED
@@ -11,5 +11,6 @@ suck like a hoover.
11
11
  * Rake magic
12
12
  * better resource management
13
13
  * Page filters
14
+ * The whole dependency caching / file-based block memoize thing!
14
15
  * _Many_ other suggestions for improvements
15
16
 
data/DONE CHANGED
@@ -20,3 +20,9 @@ being implemented.
20
20
  ** RDoc
21
21
  ** TOC
22
22
  ** Tidy
23
+ * Nested layouts
24
+ * Rake dependency caching for incremental builds, cache
25
+ layout and transient deps (contrib).
26
+ * Macro/method to run external commands and capture the output.
27
+ ** (Covers Ruby eval via ruby command)
28
+
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c)2005 Ross Bamford (and contributors). All rights reserved.
1
+ Copyright (c)2005, 2006 Ross Bamford (and contributors). All rights reserved.
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy of
4
4
  this software and associated documentation files (the "Software"), to deal in
data/README CHANGED
@@ -12,12 +12,19 @@ layout, and general documentation / website build tasks.
12
12
 
13
13
  == Prerequisites
14
14
 
15
- Rote uses the following (versions are as per my development environment,
15
+ Rote requires the following (versions are as per my development environment,
16
16
  you may find you can use older versions, you may not).
17
17
 
18
- * Ruby 1.8.x
18
+ * Ruby 1.8.x (http://ruby-lang.org/)
19
19
  * Rake 0.6.2 ('gem install rake')
20
- * RedCloth 3.0.4 ('gem install RedCloth') (_Only required if :textile or :markdown formatting is used_)
20
+
21
+ The following optional dependencies will be used if present:
22
+
23
+ * RubyGems 0.8.11 (http://rubygems.rubyforge.org/)
24
+ * RedCloth 3.0.4 ('gem install RedCloth') (_Only required if Textile formatting is used_)
25
+ * BlueCloth 1.0.0 ('gem install BlueCloth') (_Only required if Markdown or formatting is used_)
26
+ * Syntax 1.0.0 ('gem install syntax') (_Only required if syntax highlighting formatting is used_)
27
+ * HTMLTidy (http://tidy.sourceforge.net/) (_Only required if Tidy filter is used_)
21
28
 
22
29
  RubyGems [http://rubyforge.org/frs/?group_id=126] is *highly recommended*,
23
30
  and makes for not only an easier install but a cleaner library path.
data/Rakefile CHANGED
@@ -6,7 +6,7 @@
6
6
  # This Rakefile is heavily based on Rake's own Rakefile.
7
7
  # Portions copyright (c)2003, 2004 Jim Weirich (jim <AT> weirichhouse.org)
8
8
  #
9
- # $Id: Rakefile,v 1.12 2005/12/12 02:45:24 roscopeco Exp $
9
+ # $Id: Rakefile 128 2005-12-12 02:45:24 +0000 (Mon, 12 Dec 2005) roscopeco $
10
10
  #
11
11
 
12
12
  begin
@@ -204,8 +204,6 @@ else
204
204
  s.executables = ["rote"]
205
205
  s.default_executable = "rote"
206
206
 
207
- s.autorequire = 'rote'
208
-
209
207
  #### Documentation and testing.
210
208
 
211
209
  s.has_rdoc = true
data/TODO CHANGED
@@ -5,17 +5,24 @@ Send any suggestions or patches (preferably as/with tests) to:
5
5
 
6
6
  rosco <at> roscopeco <dot> co <dot> uk
7
7
 
8
+ == For 0.3.x
9
+ * Plugins, maybe allow pseudo-sections to be created
10
+ in COMMON.rb, that get their pages from some supplied code.
11
+ Anything else then stays out of Rote, which is what's needed.
12
+
13
+ == For 0.3.x or 0.4
14
+ * Ability to have multiple views of a section, e.g. user guide (separate
15
+ pages) and user guide (one page) generated from same source.
16
+ * Ability to have standard sets of files (chosen by glob) treated
17
+ as sections and handled in some common way, e.g. apply a
18
+ template and highlighting to a set of Ruby files to make
19
+ a 'source xref' section with appropriate navigation and
20
+ stuff.
21
+ * If layout isn't found with source ext, try with target ext too
22
+ before failing.
23
+
8
24
  == For 1.0
9
25
  * CSS / XML / etc, maybe with the existing builders (integrated with
10
26
  Format::CSS, Format::XML, so on)
11
- * Nested layouts
12
- * Could work as 'plugins', maybe allow pseudo-sections to be created
13
- in COMMON.rb, that get their pages from some supplied code.
14
- Anything else then stays out of Rote, which is what's needed.
15
- * Ability to have multiple views of a section, e.g. user guide (separate
16
- pages) and user guide (one page) generated from same source.
17
- ** Maybe in concert with plugins?
18
- * (maybe?) Rant integration
19
- * Macro that evaluates it's body
20
- * Macro/method to run external commands and capture the output.
21
- * Deprecate 'rote' command supporting Rake tasks.
27
+ * As much compatibility between Page and ActionController as poss,
28
+ allowing ActionView helpers to be optionally mixed in.
@@ -3,7 +3,7 @@
3
3
  p{color:red}. *The guide is still under construction*
4
4
 
5
5
  p. It has not yet been fully updated to cover all new features in 0.3.x.
6
- Although most features are mentioned, in many cases the documentation consists
6
+ Although most features are mentioned, in some cases the documentation consists
7
7
  soley of a link to the relevant "RDoc":<%= link_rel '/rdoc/index.html' %>
8
8
 
9
9
  <a name='top'></a>
@@ -46,17 +46,19 @@ case). This directory will have the following layout:
46
46
  | | |--> rote-tiny.png
47
47
  | |
48
48
  | |--> layouts
49
- | | |--> normal.html
49
+ | | |--> normal.thtml
50
50
  | |
51
51
  | |--> pages
52
52
  | |--> COMMON.rb
53
- | |--> index.html
53
+ | |--> index.thtml
54
54
  | |--> index.rb
55
55
 
56
56
  </pre></code></p>
57
57
 
58
58
  Template sources under the 'pages' directory may have any extension (except
59
- @rb@), and will be rendered to that same name under the output directory.
59
+ @rb@), and will be rendered to the same base-name under the output directory,
60
+ with their file extension supplied by the original, possible via an
61
+ <%= section_link 'extension_mappings', 'extension mapping' %>
60
62
  See the section on Layouts below for details on layout name resolution.
61
63
 
62
64
  Ruby source is optional, and allows you to define instance variables and
@@ -75,13 +77,12 @@ next steps.
75
77
  <%= section 4, 'From the command-line' %>
76
78
 
77
79
  If you are generating a standalone documentation set (i.e. not as part of
78
- some wider build) then you don't need to worry about writing a @Rakefile@ -
80
+ some wider build) and you don't want to worry maintaining a @Rakefile@,
79
81
  you can use the built-in build via the @rote@ command. This works with
80
- a standard directory layout, and wraps invocation of @rake@ to handle
81
- setting up library dependencies and generation of appropriate tasks.
82
+ the standard directory layout above, and wraps invocation of @rake@ on a
83
+ built-in version of the standard Rakefile.
82
84
 
83
- The command-line wrapper expects the above layout, and requires no direct
84
- configuration. To generate an entire documentation set, simply run:
85
+ Given the above layout, you can generate the documentation set by running:
85
86
 
86
87
  <p><pre><code> rote</code></pre></p>
87
88
 
@@ -93,8 +94,9 @@ Being based on Rake, Rote supports last-modified checking, and provides an
93
94
  individual file task for each page in your doc set. For example, running
94
95
  the 'rote' command again with no options will cause it to exit almost
95
96
  immediately, since all output is up to date. If you change a file, and run
96
- rote again, then just that file will be updated. There are a few caveats
97
- with this (see <%= section_link 'Final notes', 'the notes section' %>).
97
+ rote again, then just that file will be updated. Even dependencies that are
98
+ determined dynamically (such as layout files) can be tracked for incremental
99
+ build purposes.
98
100
 
99
101
  The file tasks are named for the target files, so for example to generate
100
102
  just the top-level index.html (regardless of whether it's been modified)
@@ -118,6 +120,17 @@ Further command-line usage information is available with:
118
120
  and Unix installations performed with @install.rb@ should also make a
119
121
  manpage available for the @rote@ command.
120
122
 
123
+ <div class='note'>
124
+ *Note* That, for most purposes, you should prefer to use a Rakefile based
125
+ build, as created by the @rote create@ command. The command-wrapper
126
+ functionality in Rote is maintained only as a quick start option, and
127
+ is not guaranteed to remain supported in 1.0.
128
+
129
+ If you do choose to use a Rakefile approach, do *not* use the 'rote'
130
+ command to build documentation, since it will ignore your local Rakefile
131
+ and can result in inconsistent behaviour.
132
+ </div>
133
+
121
134
  <%= section 4, 'From your Rakefile' %>
122
135
 
123
136
  If you are wanting to build documentation as part of a larger build process, or
@@ -157,9 +170,9 @@ hierarchical structure to the common page code.
157
170
  The default behaviour is to transform all matched pages with ERB, and
158
171
  optionally apply a second render pass with a <%= section_link 'layout' %>,
159
172
  before writing to the same base filename beneath the output directory.
160
- You can customise this behaviour by specifying _extension mappings_ for
161
- specific file extensions - see the <%= section_link 'Rake task configuration' %>
162
- section for details.
173
+ You can customise this behaviour by specifying
174
+ <%= section_link 'extension mappings' %> for specific file extensions -
175
+ see the <%= section_link 'Rake task configuration' %> section for details.
163
176
 
164
177
  <%= section 4, 'Template code and ERB' %>
165
178
 
@@ -170,8 +183,8 @@ variables may be defined to allow information to be passed into templates.
170
183
  There are five places where you might define such variables. The following
171
184
  is in order of evaluation:
172
185
 
173
- * A block supplied to <%= section_link 'extension mappings' %> that matched
174
- this page.
186
+ * A block supplied to the <%= section_link 'extension mappings', 'extension mapping' %>
187
+ that matched this page (if any).
175
188
  * Any COMMON.rb files from the filesystem root down to this directory.
176
189
  * This page's ruby code, _basename_.rb
177
190
  * In the template itself
@@ -188,6 +201,10 @@ You can find details of the methods available in the
188
201
 
189
202
  <%= section 4, 'Layout' %>
190
203
 
204
+ _Layouts_ do exactly what you'd expect - they allow common template to be
205
+ applied across several pages. This is handled via multiple render passes,
206
+
207
+
191
208
  Layouts are stored under the @doc/layouts@ directory (by default). They may
192
209
  be organised into subdirectories, but this hierarchy is not connected to
193
210
  the hierarchy in @pages@. To apply a layout to a page, simply call the
@@ -216,6 +233,29 @@ This pattern shouldn't be unfamiliar. Again, note that Rote doesn't mandate
216
233
  HTML, despite the appearance from the ERB tags - any (textual) format can
217
234
  be templated and laid out.
218
235
 
236
+ h5. Layout code
237
+
238
+ Like page templates, each layout may have associated with it some layout
239
+ code, which is executed just prior to rendering the layout, in the same
240
+ way as the page code.
241
+
242
+ There is no equivalent of @COMMON.rb@ for layout templates, however.
243
+
244
+ h5. Nested layout
245
+
246
+ Layout code (see above) may call the @Page#layout@ method (i.e. to apply
247
+ a layout). This will result in the result of the current rendering being
248
+ passed (via <code>@content_for_layout</code>) to the specified layout
249
+ in a further render pass. In all respects this is no different from the
250
+ initial layout pass - layout code is executed, and rendering performed.
251
+ Obviously, this may result in additional layouts being applied to the page.
252
+
253
+ There are no special requirements for layouts that are used in this way -
254
+ from the user point of view a layout simply needs to include the
255
+ <code>@content_for_layout</code> where appropriate.
256
+
257
+ All layouts are rendered prior to post filtering.
258
+
219
259
  <%= section 4, 'Filters' %>
220
260
 
221
261
  As well as rendering ERB and applying layout (both universal features of @Page@),
@@ -224,9 +264,10 @@ Along with this ability, a number of filters are provided as standard:
224
264
 
225
265
  For example If you're generating HTML, you'll probably want to use some plaintext
226
266
  formatting, rather than writing HTML by hand. Rote directly supports this
227
- (thanks for "RedCloth":http://whytheluckystiff.net/ruby/redcloth) via the
228
- _RedCloth_ filter, which allows Textile or Markdown (or both if you really want)
229
- to be applied to pages.
267
+ (thanks to "RedCloth":http://whytheluckystiff.net/ruby/redcloth and
268
+ "BlueCloth":http://www.deveiate.org/projects/BlueCloth) via _filters_, with both
269
+ Textile and Markdown support out of the box (assuming those libraries are
270
+ available on your machine).
230
271
 
231
272
  h5. Filter chaining
232
273
 
@@ -241,60 +282,163 @@ and _post filtering_.
241
282
  * *Post filtering* takes place on the final output of the render pass,
242
283
  after layout is applied. The @Filters::Tidy@ filter is a post filter.
243
284
 
244
- h5. Standard filters
245
-
246
- Rote supplies the following filters 'out of the box':
247
-
248
- * *"Filters::RDoc":<%= link_rel '/rdoc/classes/Rote/Filters/RDoc.html' %>* -
249
- Supports RDoc formatting with optional custom markup, to any supported output format
250
- (defaults to HTML).
251
-
252
- * *"Filters::RedCloth":<%= link_rel '/rdoc/classes/Rote/Filters/RedCloth.html' %>* -
253
- Supports both Textile and Markdown to HTML.
254
-
255
- * *"Filters::Syntax":<%= link_rel '/rdoc/classes/Rote/Filters/Syntax.html' %>* -
256
- Supports @code@ <%= section_link 'macros' %> with pluggable syntax highlighting
257
- (via the "Syntax library":http://syntax.rubyforge.org/) and Ruby-code support
258
- out of the box.
259
-
260
- * *"Filters::Tidy":<%= link_rel '/rdoc/classes/Rote/Filters/Tidy.html' %>* -
261
- Post filter that corrects markup and semantic errors in HTML markup to produce
262
- valid HTML or XHTML using the "HTML Tidy":http://tidy.sourceforge.net/ command-line
263
- tool.
264
-
265
- * *"Filters::TOC":<%= link_rel '/rdoc/classes/Rote/Filters/TOC.html' %>* -
266
- Supports automatic generation of navigation from headings in documents.
267
-
268
- The first three are page filters, while the The latter two are not. Tidy is a simple
269
- post filter (since HTML Tidy operates on full HTML documents), and should be used
270
- with the @post_filter@ chain. TOC operates somewhat differently, requiring two
271
- render passes - first to enumerate the sections and second to output the TOC. In practice
272
- this means that the TOC is currently generated from layout at present.
273
-
274
285
  Adding filters to a page's chain can be done anywhere you can call that page's filter-chain
275
286
  methods. This could be page code, COMMON.rb, or even inside the template itself. Filters
276
287
  can also be applied to all files with a matching extension by adding filters inside an
277
- <%= section_link 'extension mapping' %> block. Bear in mind that the order in which filters
278
- are added *is* important, since each filters output becomes input for the next. You
279
- must ensure that filters are applied in a compatible order - should you need to prepend
280
- filters or otherwise modify the chain prior to rendering you may do so by directly
281
- accessing the @page_filters@ and @post_filters@ array attributes.
288
+ <%= section_link 'extension mappings', 'extension mapping' %> block. Bear in mind that the
289
+ order in which filters are added *is* important, since each filters output becomes input
290
+ for the next. You must ensure that filters are applied in a compatible order - should you
291
+ need to prepend filters or otherwise modify the chain prior to rendering you may do so by
292
+ directly accessing the @page_filters@ and @post_filters@ array attributes.
282
293
 
283
294
  See <%= section_link 'template code and erb', 'the section on template code' %>
284
295
  for more information on adding code to your pages.
296
+
297
+ h5. Standard filters
285
298
 
286
- Filters are of course very simple to write. See the 'Writing filters' subsection
287
- (in <%= section_link 'Extending Rote' %>) for details.
299
+ Rote supplies the following filters 'out of the box':
300
+
301
+ h6. *"Filters::BlueCloth":<%= link_rel '/rdoc/classes/Rote/Filters/RedCloth.html' %>* -
302
+ Supports conversion of plain-text (Markdown) formatting to HTML.
303
+
304
+ This is a text filter, and should be applied in the _page filter chain_:
305
+
306
+ #:code#ruby#
307
+ # in page code or common.rb
308
+ page_filter Filters::BlueCloth.new
309
+ #:code#
310
+
311
+ h6. *"Filters::Exec":<%= link_rel '/rdoc/classes/Rote/Filters/Exec.html' %>* -
312
+ Pipes the macro body to an external command, and replaces the macro with
313
+ the output of that command.
314
+
315
+ This is a macro filter, and should be applied in the _page filter chain_:
316
+
317
+ #:code#ruby#
318
+ # in page code or common.rb
319
+ page_filter Filters::Exec.new
320
+ #:code#
321
+
322
+ Code can then be inserted in the page like:
323
+
324
+ #:code#
325
+ #:exec#python#
326
+ print "Hello, World"
327
+ #:exec#
328
+ #:code#
329
+
330
+ h6. *"Filters::Eval":<%= link_rel '/rdoc/classes/Rote/Filters/Eval.html' %>* -
331
+ Evaluates the macro body as Ruby code, capturing standard output and using it as
332
+ the macro replacement.
333
+
334
+ This is a macro filter, and should be applied in the _page filter chain_:
335
+
336
+ #:code#ruby#
337
+ # in page code or common.rb
338
+ page_filter Filters::Eval.new
339
+ #:code#
340
+
341
+ Code can then be inserted in the page like:
342
+
343
+ #:code#
344
+ #:eval#
345
+ puts "Hello, World"
346
+ #:eval#
347
+ #:code#
348
+
349
+ h6. *"Filters::RDoc":<%= link_rel '/rdoc/classes/Rote/Filters/RDoc.html' %>* -
350
+ Supports RDoc formatting with optional custom markup, to any supported output format
351
+ (defaults to HTML).
352
+
353
+ This is a text filter, and should be applied in the _page filter chain_:
354
+
355
+ #:code#ruby#
356
+ # in page code or common.rb
357
+ page_filter Filters::RDoc.new
358
+ #:code#
359
+
360
+ h6. *"Filters::RedCloth":<%= link_rel '/rdoc/classes/Rote/Filters/RedCloth.html' %>* -
361
+ Supports conversion of plain-text (Textile) formatting to HTML.
362
+
363
+ This is a text filter, and should be applied in the _page filter chain_:
364
+
365
+ #:code#ruby#
366
+ # in page code or common.rb
367
+ page_filter Filters::RedCloth.new
368
+ #:code#
369
+
370
+ h6. *"Filters::Syntax":<%= link_rel '/rdoc/classes/Rote/Filters/Syntax.html' %>* -
371
+ Supports @code@ <%= section_link 'macros' %> with pluggable syntax highlighting
372
+ (via the "Syntax library":http://syntax.rubyforge.org/) and Ruby-code support
373
+ out of the box.
374
+
375
+ This is a macro filter, and should be applied in the _page filter chain_:
376
+
377
+ #:code#ruby#
378
+ # in page code or common.rb
379
+ page_filter Filters::Syntax.new
380
+ #:code#
381
+
382
+ This filter uses the "Syntax":http://syntax.rubyforge.org/ library, passing the
383
+ macro argument as the language ('ruby', 'xml' and 'yaml' are supported out of the
384
+ box). The output is wrapped in <pre class='[language]'><code> ... </code></pre>
385
+ for output, with highlighting handled by <span> tags, allowing syntax colours and
386
+ styles to be applied via CSS. You can find a full list of the Ruby highlight classes
387
+ in the
388
+ "Syntax documentation":http://syntax.rubyforge.org/chapter-2.html
389
+ but you will need to experiment with the highlighter to find the XML and YAML
390
+ classes.
391
+
392
+ Code to be highlighted is inserted into pages like so:
393
+
394
+ #:code#
395
+ #:code#[language]#
396
+ def amethod
397
+ "some code"
398
+ end
399
+ # :code#
400
+ #:code#
288
401
 
289
- <%= section 4, 'Macros' %>
402
+ <div class='note'>
403
+ *Note* that in the above example, the end tag has an extra whitespace to work around
404
+ a limitation of the Syntax plugin (and macros in general) - a macro cannot contain
405
+ it's own end tag!
406
+ </div>
407
+
408
+ Since macros are rendered separately from the page text, you don't have to worry much
409
+ about spacing and so forth - your code will not be touched by any of the formatting
410
+ filters.
411
+
412
+ h6. *"Filters::Tidy":<%= link_rel '/rdoc/classes/Rote/Filters/Tidy.html' %>* -
413
+ Post filter that corrects markup and semantic errors in HTML markup to produce
414
+ valid HTML or XHTML using the "HTML Tidy":http://tidy.sourceforge.net/ command-line
415
+ tool.
416
+
417
+ This is a *post filter*. It should be applied in the appropriate filter chain:
418
+
419
+ #:code#ruby#
420
+ # in page code or common.rb
421
+ post_filter Filters::Tidy.new
422
+ #:code#
423
+
424
+ h6. *"Filters::TOC":<%= link_rel '/rdoc/classes/Rote/Filters/TOC.html' %>* -
425
+ Supports automatic generation of basic navigation from headings in documents.
426
+ See the RDoc for more details. It should be applied as a page filter, and
427
+ a reference is usually required for use in the layout:
428
+
429
+ #:code#ruby#
430
+ # in page code or common.rb
431
+ post_filter @toc = Filters::TOC.new
432
+ #:code#
290
433
 
291
- There is one more aspect to filters - support for macros. Macro filters (derived from
292
- the standard @Filters::MacroFilter@ class) support the insertion of delimited
293
- sections of text that should be ignored by all filters except that which handles the
294
- macro. The standard @Syntax@ filter is a macro filter.
434
+ Some of the filters support various options to change the way they operate, and
435
+ many support different arguments (the second part of the #macro#args# tags) to
436
+ those shown above - see the RDoc for the individual macros (linked from the headings
437
+ above) for more details.
295
438
 
296
- See the <%= section_link 'extending rote' %> section for information on implementing
297
- your own macros.
439
+ Filters are of course very simple to write. See the 'Writing filters' subsection
440
+ (in <%= section_link 'Extending Rote' %>) for details, including how to implement
441
+ your own macro filters.
298
442
 
299
443
  <%= section 4, 'Format helpers' %>
300
444
 
@@ -328,7 +472,7 @@ include Rote
328
472
 
329
473
  # This defines all our Rake tasks. The symbol we supply here (:doc is
330
474
  # default) gives the base-prefix for the tasks that are generated.
331
- ws = Rote::DocTask.new(:doc) { |doc|
475
+ ws = Rote::DocTask.new(:doc) do |doc|
332
476
  # Output directory and layout sources
333
477
  doc.output_dir = 'html'
334
478
  doc.layout_dir = 'doc/layouts'
@@ -361,7 +505,7 @@ ws = Rote::DocTask.new(:doc) { |doc|
361
505
  # To valid xhtml with Tidy postfilter
362
506
  page.post_filter Filters::Tidy
363
507
  end
364
- }
508
+ end
365
509
  #:code#
366
510
 
367
511
  Please refer to the "RDoc":<%= link_rel '/rdoc/classes/Rote/DocTask.html' %> for specific
@@ -370,7 +514,7 @@ information on each method.
370
514
  <%= section 4, 'Extension mappings' %>
371
515
 
372
516
  The default behaviour when transforming pages is to make each filename
373
- matched by the @pages.include@s relative to the output directory, using
517
+ matched by the @pages.include@ glob relative to the output directory, using
374
518
  the same extension as the input file.
375
519
 
376
520
  If you want to change this behaviour, you may supply an _extension mapping_
@@ -380,22 +524,27 @@ as demonstrated above. The general form is:
380
524
  # Define an extension mapping
381
525
  doc.ext_mapping(/regexp/, 'replacement') do |page|
382
526
 
383
- # call page methods
527
+ # call page methods
384
528
 
385
529
  end
386
530
  #:code#
387
531
 
388
532
  The regexp is matched against processed page extensions (not resources) and
389
533
  the replacement supplies the output extension. The optional block is executed
390
- for each page when it's first instantiated, before any COMMON or page code.
391
- Note that you must not include the '.' in either the regexp or replacement.
534
+ *for each matching page* during instantiation, before any COMMON or page
535
+ code. Note that you *must not* include the leading '.' in either the regexp or
536
+ replacement - doing so will fail to match the desired extensions.
392
537
 
393
538
  For more advanced mappings, you can supply a capturing regexp, and use the
394
- @$n@ notation in the replacement to extract the catures. As shown in the
395
- (contrived) example above:
539
+ @$n@ notation in the replacement to extract the captures. As shown in the
540
+ (contrived) example below:
396
541
 
397
542
  #:code#ruby#
398
543
  doc.ext_mapping(/(html)/, '$1') do |page|
544
+
545
+ # do stuff
546
+
547
+ end
399
548
  #:code#
400
549
 
401
550
  <%= section 4, 'Defining additional tasks' %>
@@ -474,6 +623,9 @@ the publishers supplied with Rake (in @rake/contrib@), or your own. This
474
623
  allows maximum flexibility, and allows Rote to concentrate on creating your
475
624
  documents.
476
625
 
626
+ See the section <%= section_link 'Defining additional tasks' %> for details on
627
+ how to supply your publish tasks.
628
+
477
629
  See the <%= section_link 'rake task configuration' %> section for more details.
478
630
 
479
631
  <%= section 3, 'Extending Rote' %>
@@ -494,7 +646,7 @@ Either type can be a page or post filter - it depends only on the design
494
646
  of the filter and the job it will perform as to which chain it should
495
647
  be used with.
496
648
 
497
- h5. Text filters
649
+ h5. Text Filters
498
650
 
499
651
  Text filters process the text in a page, with all macros replaced by a
500
652
  standard plain-text marker. The purpose of this is to allow macros
@@ -549,12 +701,12 @@ end
549
701
 
550
702
  Note the curly braces in the first example, which cause the block to bind
551
703
  to the filter rather than the method. If @do..end@ were used, the second
552
- form would actually be called and a new filter created. The filter you
704
+ form would actually be called and a new filter created. The block filter you
553
705
  supplied would be discarded.
554
706
 
555
707
  The @post_filter@ method supports the same convenience.
556
708
 
557
- h5. Macro filters
709
+ h5. Macro Filters
558
710
 
559
711
  The standard Syntax filter is a typical macro filter. The following is
560
712
  slightly simplified for brevity (the actual one allows custom macro tags
@@ -591,30 +743,82 @@ with <%= section_link 'extension mappings' %>.
591
743
  <%= section_link 'text filters' %>. The output, however, *will* be processed
592
744
  by any filters that follow the macro filter in the chain.
593
745
 
594
- h5. Duck filters
746
+ h5. Duck Filters
595
747
 
596
748
  This being Ruby, you don't _have_ to inherit one of the above filters to create
597
749
  your own - a filter is just an object with a @filter(text,page)@ method.
598
750
 
599
751
  The standard TOC filter takes this route.
600
752
 
601
- <%= section 3, 'Final notes' %>
753
+ <%= section 4, 'Rake Extensions' %>
602
754
 
603
- <%= section 4, 'Layout dependencies' %>
755
+ Rote supplies a number of non-intrusive extensions a number of the Rake classes,
756
+ in order to support dynamic dependency caching, caching dependency-based block
757
+ memoize, and task reset for use in monitor mode. These features are very new, and
758
+ only lightly documented at present. You are advised to see the
759
+ "RDoc":<%= link_rel '/rdoc' %> and source if you want to find out more.
604
760
 
605
- Because of the way Rote is implemented, it is currently not possible for a
606
- page's file task to depend upon the page's layout, or resources embedded in
607
- it in a format-specific way (as opposed to merely referenced from it as with
608
- HTML/images). When changing these resources it's highly recommended to first
609
- run:
610
-
611
- <p><pre><code> rote clobber</code></pre></p>
612
-
613
- <%= section 4, 'Rake magic' %>
761
+ These extensions were almost exclusively contributed by Jonathan Paisley.
762
+
763
+ h5. Dynamic dependency caching
764
+
765
+ Since layout files are specified in Ruby code, and may be calculated dynamically,
766
+ it's not possible to determine the layout files upon which a given page depends
767
+ without running that page's code (including all COMMON.rb files that apply to it,
768
+ extension mapping blocks, and so forth). This would have (or, had) an adverse
769
+ impact on Rote's incremental build functionality, especially from the point of
770
+ view of source monitoring.
771
+
772
+ This problem is addressed by a small Rake extension that adds the ability to
773
+ dynamically register dependencies on the current task, and to have those
774
+ dependencies cached when Rake exits. Internally, Rote automatically registers
775
+ any layouts loaded by a page, and you can easily register additional dependencies
776
+ from any Ruby code, by calling methods on the @Rake@ module.
777
+
778
+ *Note* that this extension is intended, and tested, for Rote - it is not designed
779
+ to be a general extension (though one could easily be extracted from it). In
780
+ particular it takes advantage of other extended functionality provided by Rote,
781
+ and takes no account, for example, or parallel task execution.
782
+
783
+ By default, the cache is maintained in the project root, in a directory named
784
+ @.rake_cache@. This is managed by Rote, so for the most part can be ignored,
785
+ though you can of course supply an alternate path if you wish (via @Rake.cache_dir=@).
786
+
787
+ h5. Dependency-based block memoize
788
+
789
+ Somewhat related to dependency caching, Rote also provides the ability to memoize
790
+ Ruby block results, caching them to disk, and only execute the block during
791
+ incremental builds. This is handy if, for example, you want to incorporate information
792
+ derived from external commands, for example, or index large files in your documentation.
793
+
794
+ The following (OSX-specific) example illustrates usage of this feature:
795
+
796
+ #:code#ruby#
797
+ def image_size(fn)
798
+ Rake::Task.memoize "image_size" => fn do
799
+ # This code only runs if the cache is out-of-date with
800
+ # respect to the file
801
+ puts "image_size for #{fn}"
802
+
803
+ # OSX-specific stuff here
804
+ s = `sips -g pixelWidth -g pixelHeight #{fn}`
805
+ [s[/pixelWidth: (\d+)/,1], s[/pixelHeight: (\d+)/,1]]
806
+ end
807
+ end
808
+ #:code#
809
+
810
+ h6. Caching and clean builds
811
+
812
+ When performing a clean build, the cache will also be removed (as part of the
813
+ @clobber@ task), and all dependencies will be re-evaluated and cached afresh.
814
+ Caching exists only to allow accurate dependency resolution during incremental
815
+ builds.
816
+
817
+ <%= section 3, 'Final notes' %>
614
818
 
615
819
  Rake is a *very* flexible tool, and supports a wide variety of configuration
616
820
  options and advanced features you can use to fit Rote to your needs. Such
617
- configuration is beyond the scope of this manual - see
821
+ configuration is (far) beyond the scope of this manual - see
618
822
  "Rake's Documentation":http://rake.rubyforge.org/ for information on the
619
823
  features supported by Rake.
620
824