rote 0.2.4.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/CONTRIBUTORS CHANGED
@@ -6,9 +6,10 @@ Without the help and guidance of these people, Rote would almost certainly
6
6
  suck like a hoover.
7
7
 
8
8
  ===== Jonathan Paisley <jp-www at dcs gla ac uk>
9
- * Auto -run tasks
9
+ * Auto _monitor tasks
10
10
  * COMMON.rb inheritance (with BOC)
11
11
  * Rake magic
12
12
  * better resource management
13
- * Many other suggestions for improvements
13
+ * Page filters
14
+ * _Many_ other suggestions for improvements
14
15
 
data/DONE ADDED
@@ -0,0 +1,22 @@
1
+ = Rote project -- Done list
2
+
3
+ These were TODO items, but are now not. Other things have been done too, of
4
+ course - these are just the ones that spent some time as a TODO before
5
+ being implemented.
6
+
7
+ * More flexible markup rendering
8
+ * Source monitoring / render on update
9
+ * Better COMMON.rb handling
10
+ * Proper page/resource/ruby dependencies
11
+ * Support layout-specific code.
12
+ * Remove implicit output filename restriction
13
+ * Support optional filtering post-layout
14
+ * Support macros, separate macro and text processing
15
+ * Support ordered regexp extension mapping
16
+ ** Support per-extension-mapping blocks
17
+ * Support filters
18
+ ** Syntax
19
+ ** RedCloth
20
+ ** RDoc
21
+ ** TOC
22
+ ** Tidy
data/README CHANGED
@@ -118,8 +118,17 @@ though, so flame him if it breaks your day ;P
118
118
  As you may have guessed, Rote's hosting and development services are provided
119
119
  by http://RubyForge.org .
120
120
 
121
- Thanks to Yukihiro Matsumoto for a remarkable platform, Masatoshi Seki for
121
+ The people who have been instrumental in making Rote a better piece of
122
+ software, without direct involvement in the development process. Without the
123
+ ideas, suggestions, bug reports and guidance from these people, rote would
124
+ probably be totally useless to anyone but me. Keeping a list like this
125
+ accurate and up to date is a recipe for disaster, so I'll take the safe
126
+ option and say 'thanks, everyone' :)
127
+
128
+ Thanks also to Yukihiro Matsumoto for a remarkable platform, Masatoshi Seki for
122
129
  embedding it in text, Jim Weirich for an elegant build tool, and Dean Allen
123
- for making markup easy in Ruby. Thanks too to the many people who've contributed
130
+ for making markup easy in Ruby. Thanks to the authors of all the libraries and
131
+ tools used by Rote, and thanks too to the many people who've contributed
124
132
  and improved these things over the years - as ever, we stand on the shoulders
125
133
  of giants.
134
+
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.11 2005/12/05 14:45:15 roscopeco Exp $
9
+ # $Id: Rakefile,v 1.12 2005/12/12 02:45:24 roscopeco Exp $
10
10
  #
11
11
 
12
12
  begin
@@ -22,11 +22,18 @@ require 'rake/rdoctask'
22
22
 
23
23
  # This needs to go at the front of the libpath
24
24
  # Otherwise, any pre-installed rote gets found,
25
- # and used from there.
26
- $:[0,1] = 'lib'
25
+ # and used from there. This is only necessary
26
+ # for Rote's build, to make sure we always unit-
27
+ # test and build doc with the working copy.
28
+ $LOAD_PATH.unshift 'lib'
27
29
  require 'rote'
30
+ require 'rote/filters/redcloth'
31
+ require 'rote/filters/syntax'
32
+ require 'rote/filters/tidy'
33
+ require 'rote/format/html'
34
+ include Rote
28
35
 
29
- # CLEAN.include('testdata')
36
+ CLEAN.include('tidy.log')
30
37
  CLOBBER.include('TAGS')
31
38
  CLOBBER.include('html')
32
39
 
@@ -111,6 +118,7 @@ rd = Rake::RDocTask.new("rdoc") { |rdoc|
111
118
  rdoc.rdoc_files.include('README', 'LICENSE', 'TODO', 'CONTRIBUTORS')
112
119
  rdoc.rdoc_files.include('lib/**/*.rb', 'doc/**/*.rdoc')
113
120
  rdoc.rdoc_files.exclude(/\bcontrib\b/)
121
+ rdoc.rdoc_files.exclude('lib/rote/project/**/*')
114
122
  }
115
123
 
116
124
  # Create a task build the website / docs
@@ -120,6 +128,19 @@ ws = Rote::DocTask.new(:doc) { |site|
120
128
  site.pages.dir = 'doc/pages'
121
129
  site.pages.include('**/*')
122
130
 
131
+ site.ext_mapping(/(html)/, '$1') do |page|
132
+ # Let's use the HTML stuff everywhere ...
133
+ page.extend Rote::Format::HTML
134
+
135
+ # use 'page' layout, textile formatting, ruby syntax, Tidy to xhtml
136
+ page.layout 'page'
137
+
138
+ page.page_filter Filters::RedCloth.new(:textile)
139
+ page.page_filter Filters::Syntax.new
140
+
141
+ page.post_filter Filters::Tidy.new
142
+ end
143
+
123
144
  site.res.dir = 'doc/res'
124
145
  site.res.include('**/*.png')
125
146
  site.res.include('**/*.gif')
data/TODO CHANGED
@@ -5,16 +5,14 @@ Send any suggestions or patches (preferably as/with tests) to:
5
5
 
6
6
  rosco <at> roscopeco <dot> co <dot> uk
7
7
 
8
- * More flexible markup rendering
8
+ == For 1.0
9
+ * CSS / XML / etc, maybe with the existing builders (integrated with
10
+ Format::CSS, Format::XML, so on)
9
11
  * Nested layouts
10
- * Better COMMON.rb handling
11
- * Find and Integrate test run / coverage reports
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.
12
15
  * Ability to have multiple views of a section, e.g. user guide (separate
13
16
  pages) and user guide (one page) generated from same source.
14
- * Auto-link within section
15
- * Index and glossary support
16
- * statistics
17
- * (maybe?) Automatic navigation / TOC
17
+ ** Maybe in concert with plugins?
18
18
  * (maybe?) Rant integration
19
- * Ability to define rules for input.ext -> output.ext
20
- * Support ruby source templates (.rbt, auto rename to .rb on output).
@@ -25,6 +25,9 @@
25
25
  <a class='nav' href='<%= link_rel nav[:url] %>'><%= nav[:title] %></a>
26
26
  <% unless i == (@navigation.length - 1) %>|<% end %>
27
27
  <% end %>
28
+ <% unless @toc.nil? or @toc.links.empty? %>
29
+ <div id="subnav"><%= @toc.links.select { |l| l.tag == 'h3' }.join(' - ') %></div>
30
+ <% end %>
28
31
  </td>
29
32
  </tr>
30
33
 
data/doc/pages/COMMON.rb CHANGED
@@ -2,20 +2,9 @@
2
2
  #
3
3
  # Instead of being executed once (as you might expect), this is evaluated
4
4
  # for each Page's binding as the instance is created.
5
- #
6
- # At the moment, COMMON.rb code isn't automatically inherited from
7
- # parent directories - you have to use the 'inherit_common' hack provided
8
- # by Page to inherit from the immediate parent directory ONLY (setting
9
- # up chains of COMMONs if you have deep nesting - Ugh!). This limitation
10
- # will be removed very soon.
11
-
12
5
  @site_title = 'Rote'
13
6
  @base_url = 'http://rote.rubyforge.org/'
14
7
 
15
- # default to 'page' layout and textile formatting
16
- layout 'page'
17
- format_opts << :textile
18
-
19
8
  # this is used to construct the navbar and frontpage. Note that we use absolute
20
9
  # (root-relative) URLs here, and fix them from each page with 'link_rel'.
21
10
  @navigation = [
@@ -1,6 +1,9 @@
1
- # inherit common.rb from above
2
- inherit_common
1
+ require 'rote/filters/toc'
3
2
 
3
+ page_filter @toc = Filters::TOC.new
4
+
5
+ # Some helpers for writing out links and sections within
6
+ # the text
4
7
  def section_anchor(name)
5
8
  name.downcase.gsub(/\s/,'_')
6
9
  end
@@ -12,7 +15,6 @@ end
12
15
  def section(level, name, toplink = true)
13
16
  %Q{
14
17
  #{"[#{section_link('Top')}]" if toplink}
15
- <a name='#{section_anchor(name)}'></a>
16
18
  h#{level}. #{name}
17
19
  }
18
20
  end
@@ -1,30 +1,17 @@
1
1
  <% @page_title = 'User guide' %>
2
2
 
3
- *This guide is still very much under construction!*
3
+ p{color:red}. *The guide is still under construction*
4
+
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
7
+ soley of a link to the relevant "RDoc":<%= link_rel '/rdoc/index.html' %>
8
+
9
+ <a name='top'></a>
4
10
 
5
11
  It is assumed that you have installed Rote already. If not, please
6
- consult the <a href="<%= link_rel '/rdoc/files/README.html' %>">README</a>
12
+ consult the "README":<%= link_rel '/rdoc/files/README.html' %>
7
13
  for installation instructions.
8
14
 
9
- <a name='top'></a>
10
- h3. Contents
11
-
12
- * <%= section_link 'Conventions' %>
13
- * <%= section_link 'Starting out with Rote' %>
14
- ** <%= section_link 'Creating a project' %>
15
- ** <%= section_link 'From the command-line' %>
16
- ** <%= section_link 'From your Rakefile' %>
17
- * <%= section_link 'Creating templates' %>
18
- ** <%= section_link 'Basics' %>
19
- ** <%= section_link 'Formatting' %>
20
- ** <%= section_link 'Template code and ERB' %>
21
- ** <%= section_link 'Applying layout' %>
22
- * <%= section_link 'Resources' %>
23
- * <%= section_link 'Source monitoring' %>
24
- ** <%= section_link 'Auto-refresh Task' %>
25
- * <%= section_link 'Definining additional tasks' %>
26
- * <%= section_link 'Publishing' %>
27
-
28
15
  <%= section 3, 'Conventions', false %>
29
16
 
30
17
  *Task names* - Rote's standard tasks are always referred to with the base-name
@@ -51,7 +38,7 @@ case). This directory will have the following layout:
51
38
  <p><code><pre>
52
39
  someproject
53
40
  |
54
- |--> Rakefile
41
+ |--> Rakefile
55
42
  |
56
43
  |--> doc
57
44
  | |--> res
@@ -135,82 +122,44 @@ manpage available for the @rote@ command.
135
122
 
136
123
  If you are wanting to build documentation as part of a larger build process, or
137
124
  commandline setup, then you'll want to get started on integrating Rote with
138
- your own (existing) @Rakefile@. Fortunately, this is very easy to do. Try
139
- something like:
140
-
141
- <pre><code>
142
- # Rakefile
143
- require 'rote'
125
+ your own (existing) @Rakefile@. If you bootstrap a project with the
126
+ @rote create@ command, you'll get a Rakefile which you can modify to suit
127
+ your requirements.
144
128
 
145
- ws = Rote::DocTask.new(:doc) { |site|
146
- site.output_dir = 'html'
147
- site.layout_dir = 'doc/layouts'
148
-
149
- site.pages.dir = 'doc/pages'
150
- site.pages.include('**/*')
151
-
152
- site.res.dir = 'doc/res/'
153
- site.res.include('**/*.png')
154
- site.res.include('**/*.gif')
155
- site.res.include('**/*.jpg')
156
- site.res.include('**/*.css')
157
- }
158
- </code></pre>
159
-
160
- Save this as @Rakefile@, and fire up:
129
+ There is nothing special about this Rakefile, and it can use any of the other
130
+ Rake tasks, or indeed any other Ruby code. It is run with a command like:
161
131
 
162
132
  <pre><code> rake doc</code></pre>
163
133
 
164
134
  If all goes well, you should see each command and transformation output to your
165
135
  console as Rote runs.
166
136
 
167
- *Note* that it's safe to include all files in the @pages@ list, since @rb@
168
- files are implicitly excluded (as page code).
137
+ See the main Rote @Rakefile@ for an example of integrating Rote with your
138
+ software project, including linking to Rdoc generation and so on. The
139
+ <%= section_link 'Rake task configuration' %> section has more information
140
+ on the options supported by Rote's task library.
169
141
 
170
142
  <%= section 3, 'Creating templates' %>
171
143
 
172
- <%= section 4, 'The Basics', false %>
173
-
174
- As mentioned, templates are simply text files in the @doc/pages@ directory. The
175
- layout below that directory is retained when transforming pages, and is
176
- also used to provide simple hierarchical structure to the common page code.
177
-
178
- By default, any file with an extension other than @rb@ will be processed
179
- as a page template (with it's associated ruby source). The output will have
180
- the same filename and path, relative to the output directory.
144
+ p=. *Wherever directories and files are mentioned, they refer to the appropriate*
145
+ *path/name/etc supplied during <%= section_link 'rake task configuration' %>*.
146
+ *In all cases the default settings can be seen in the layout created by the*
147
+ *@rote create foo@ command.*
181
148
 
182
- <%= section 4, 'Applying formatting' %>
183
-
184
- If you're generating HTML, you'll probably want to use some plaintext
185
- formatting, rather than writing HTML by hand. Rote directly supports
186
- the Textile, Markdown and Rdoc textual formatting styles.
187
- The formatting applied to a given page is controlled by that page's @format_opts@
188
- array. All three are disabled by default - to enable formatting you must add
189
- appropriate symbols to the array, for example in page code or COMMON.rb:
190
-
191
- <p><pre><code> format_opts << :textile << :markdown << :rdoc</code></pre></p>
149
+ <%= section 4, 'The Basics', false %>
192
150
 
193
- This can be done in page code, COMMON.rb, or even inside the template itself.
194
- See <%= section_link 'template code and erb', 'the section on template code' %>
195
- for more information on adding code to your templates. Obviously you don't have
196
- to use all three, and order isn't significant - formatting is applied as Textile,
197
- then Markdown, then Rdoc.
198
-
199
- *Some additional notes on formatting*
151
+ As mentioned, templates are simply files in the specifed pages directory
152
+ (@doc/pages@ by default) that match the supplied glob (default: all files,
153
+ though ruby source is implicitly excluded). The directory layout beneath the
154
+ page root is retained when transforming pages, and is also used to provide
155
+ hierarchical structure to the common page code.
200
156
 
201
- * You cannot directly assign to @format_opts@, from page code since Ruby
202
- interprets assignments with no receiver as local variable sets rather than
203
- method calls, resulting in much head scratching as to why your options are
204
- being ignored. Always use the << :opt syntax.
205
-
206
- * Note that *Formatting is applied _after_ any ERB has been evaluated.*
207
- This allows you to output formatting from your code and have it rendered
208
- properly.
209
-
210
- * that the options you supply are passed directly to RedCloth, so you can
211
- exercise much more control over the formatting by using the feature-specific
212
- symbols defined by RedCloth, rather than the blanket :textile and :markdown
213
- symbols.
157
+ The default behaviour is to transform all matched pages with ERB, and
158
+ optionally apply a second render pass with a <%= section_link 'layout' %>,
159
+ 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.
214
163
 
215
164
  <%= section 4, 'Template code and ERB' %>
216
165
 
@@ -218,19 +167,24 @@ All templates may contain embedded Ruby code (ERB), delimited by the standard
218
167
  &lt;&#37; ... &#37;&gt; (for executed code) and &lt;&#37;= ... &#37;&gt; (for
219
168
  output) tags. Any (valid) Ruby code may be placed in the templates, and
220
169
  variables may be defined to allow information to be passed into templates.
221
- There are four places where you might define such variables. The following
170
+ There are five places where you might define such variables. The following
222
171
  is in order of evaluation:
223
172
 
224
- * This directory's COMMON.rb, or the parent directory's COMMON.rb if
225
- @inherit_common@ is used.
173
+ * A block supplied to <%= section_link 'extension mappings' %> that matched
174
+ this page.
175
+ * Any COMMON.rb files from the filesystem root down to this directory.
226
176
  * This page's ruby code, _basename_.rb
227
- * In a block passed to Page.new
228
177
  * In the template itself
229
178
 
230
- When a @Rote::Page@ instance is created, Rote looks for these, and if found
231
- evaluates them, in order, in the same binding as the template is later rendered
232
- in (i.e. the @Page@ instance binding). Therefore, you can define
233
- instance variables to pass data around, or even helper methods if you wish.
179
+ When a @Page@ instance is created, Rote looks for these, and if found evaluates
180
+ them, in order, in the same binding as the template is later rendered in (i.e.
181
+ the @Page@ instance binding). Therefore, you can define instance variables to
182
+ pass data around, or even helper methods if you wish.
183
+
184
+ Template code is used to support a great deal of flexibility in Rote, from
185
+ selecting layouts to mixing in format helpers to controlling the filter chain.
186
+ You can find details of the methods available in the
187
+ "@Rote::Page@ RDoc":<%= link_rel '/rdoc/classes/Rote/Page.html' %>
234
188
 
235
189
  <%= section 4, 'Layout' %>
236
190
 
@@ -262,6 +216,92 @@ This pattern shouldn't be unfamiliar. Again, note that Rote doesn't mandate
262
216
  HTML, despite the appearance from the ERB tags - any (textual) format can
263
217
  be templated and laid out.
264
218
 
219
+ <%= section 4, 'Filters' %>
220
+
221
+ As well as rendering ERB and applying layout (both universal features of @Page@),
222
+ Rote provides the ability to apply custom _filters_ to a page or set of pages.
223
+ Along with this ability, a number of filters are provided as standard:
224
+
225
+ For example If you're generating HTML, you'll probably want to use some plaintext
226
+ 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.
230
+
231
+ h5. Filter chaining
232
+
233
+ In order to filter a given page, filter instances are added to that page's
234
+ filter chain. There are actually two separate chains, for _page filtering_
235
+ and _post filtering_.
236
+
237
+ * *Page filtering* takes place on the page content itself, after any
238
+ ERB is executed, but before the layout pass is applied. Most of the
239
+ standard filters are pre-filters.
240
+
241
+ * *Post filtering* takes place on the final output of the render pass,
242
+ after layout is applied. The @Filters::Tidy@ filter is a post filter.
243
+
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
+ Adding filters to a page's chain can be done anywhere you can call that page's filter-chain
275
+ methods. This could be page code, COMMON.rb, or even inside the template itself. Filters
276
+ 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.
282
+
283
+ See <%= section_link 'template code and erb', 'the section on template code' %>
284
+ for more information on adding code to your pages.
285
+
286
+ Filters are of course very simple to write. See the 'Writing filters' subsection
287
+ (in <%= section_link 'Extending Rote' %>) for details.
288
+
289
+ <%= section 4, 'Macros' %>
290
+
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.
295
+
296
+ See the <%= section_link 'extending rote' %> section for information on implementing
297
+ your own macros.
298
+
299
+ <%= section 4, 'Format helpers' %>
300
+
301
+ p{color:red}. *TODO* This section is under construction.
302
+ Please see "@Rote::Format::HTML@":<%= link_rel '/rdoc/classes/Rote/Format/HTML.html' %>
303
+ for currently available information.
304
+
265
305
  <%= section 3, 'Resources' %>
266
306
 
267
307
  Of course, you're likely to have resources for your site (images, sounds, etc)
@@ -274,6 +314,100 @@ output, and will be preserved during the copy. Resources are copied only if
274
314
  necessary (determined by existence and last-modified timestamp), in a similar
275
315
  way to pages.
276
316
 
317
+ <%= section 3, 'Rake task configuration' %>
318
+
319
+ <%= section 4, 'Reference Rakefile' %>
320
+
321
+ The following Rakefile demonstrates most of the methods you can use to customise
322
+ Rote's rake task configuration.
323
+
324
+ #:code#ruby#
325
+ # Rakefile
326
+ require 'rote'
327
+ include Rote
328
+
329
+ # This defines all our Rake tasks. The symbol we supply here (:doc is
330
+ # default) gives the base-prefix for the tasks that are generated.
331
+ ws = Rote::DocTask.new(:doc) { |doc|
332
+ # Output directory and layout sources
333
+ doc.output_dir = 'html'
334
+ doc.layout_dir = 'doc/layouts'
335
+
336
+ # Page directory and include globs.
337
+ doc.pages.dir = 'doc/pages'
338
+ doc.pages.include('**/*')
339
+
340
+ # Resource directory and include globs. This directory
341
+ # could be the same as the pages directory.
342
+ doc.res.dir = 'doc/res/'
343
+ doc.res.include('**/*.png')
344
+ doc.res.include('**/*.gif')
345
+ doc.res.include('**/*.jpg')
346
+ doc.res.include('**/*.css')
347
+
348
+ # Define an extension mapping
349
+ doc.ext_mapping(/(html)/, '$1') do |page|
350
+ # Let's use the HTML helpers everywhere ...
351
+ page.extend Format::HTML
352
+
353
+ # use 'page' layout on all html files
354
+ # This can also be set from COMMON.rb
355
+ page.layout 'page'
356
+
357
+ # textile formatting, ruby syntax
358
+ page.page_filter Filters::RedCloth.new(:textile)
359
+ page.page_filter Filters::Syntax.new
360
+
361
+ # To valid xhtml with Tidy postfilter
362
+ page.post_filter Filters::Tidy
363
+ end
364
+ }
365
+ #:code#
366
+
367
+ Please refer to the "RDoc":<%= link_rel '/rdoc/classes/Rote/DocTask.html' %> for specific
368
+ information on each method.
369
+
370
+ <%= section 4, 'Extension mappings' %>
371
+
372
+ The default behaviour when transforming pages is to make each filename
373
+ matched by the @pages.include@s relative to the output directory, using
374
+ the same extension as the input file.
375
+
376
+ If you want to change this behaviour, you may supply an _extension mapping_
377
+ as demonstrated above. The general form is:
378
+
379
+ #:code#ruby#
380
+ # Define an extension mapping
381
+ doc.ext_mapping(/regexp/, 'replacement') do |page|
382
+
383
+ # call page methods
384
+
385
+ end
386
+ #:code#
387
+
388
+ The regexp is matched against processed page extensions (not resources) and
389
+ 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.
392
+
393
+ 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:
396
+
397
+ #:code#ruby#
398
+ doc.ext_mapping(/(html)/, '$1') do |page|
399
+ #:code#
400
+
401
+ <%= section 4, 'Defining additional tasks' %>
402
+
403
+ The command-line build will automatically look for a file in the top-level
404
+ directory (above @doc@) named @local.rf@. If found, this file will be
405
+ evaluated by Rake, making any tasks defined within it available to your
406
+ build. This can be used to define an <%= section_link 'auto refresh task' %>
407
+ for the <%= section_link 'source monitoring', 'monitor' %> feature, for example,
408
+ or to define tasks to publish your site (most likely using one of Rake's
409
+ directory publishers).
410
+
277
411
  <%= section 3, 'Source monitoring' %>
278
412
 
279
413
  When making changes to a documentation set, you frequently need to render out
@@ -310,7 +444,7 @@ because it just might make me reconsider.
310
444
  When you're done with Rote simply hit CTRL-C (or use @kill@) to stop monitoring
311
445
  and exit.
312
446
 
313
- <%= section 4, 'Auto-refresh task' %>
447
+ <%= section 4, 'Auto refresh task' %>
314
448
 
315
449
  When using Source monitoring, it's often handy to be able to inform some other
316
450
  program that something has changed. For example, you may want to automatically
@@ -320,27 +454,18 @@ in your source set (_after_ rendering, of course).
320
454
 
321
455
  The following (Mac) example uses OSA script to refresh the Safari browser when
322
456
  your rendered documentation changes:
323
- <pre><code>
324
- require 'osx/aeosa'
457
+
458
+ #:code#ruby#
459
+ require 'osx/aeosa'
325
460
 
326
- task :doc_refresh do
327
- OSX.do_osascript('tell application "Safari" to do javascript "window.location.reload();" in document 1')
328
- end
329
- </code></pre>
461
+ task :doc_refresh do
462
+ OSX.do_osascript('tell application "Safari" to do javascript "window.location.reload();" in document 1')
463
+ end
464
+ #:code#ruby#
330
465
 
331
466
  As with all rake tasks, multiple actions can be associated, and you can of course
332
467
  add prerequisites to the @refresh@ task as with any other Rake task.
333
468
 
334
- <%= section 3, 'Defining additional tasks' %>
335
-
336
- The command-line build will automatically look for a file in the top-level
337
- directory (above @doc@) named @local.rf@. If found, this file will be
338
- evaluated by Rake, making any tasks defined within it available to your
339
- build. This can be used to define an <%= section_link 'auto-refresh task' %>
340
- for the <%= section_link 'source monitoring', 'monitor' %> feature, for example,
341
- or to define tasks to publish your site (most likely using one of Rake's
342
- directory publishers).
343
-
344
469
  <%= section 3, 'Publishing' %>
345
470
 
346
471
  Rote does not provide any direct support for publishing your site at present,
@@ -349,20 +474,148 @@ the publishers supplied with Rake (in @rake/contrib@), or your own. This
349
474
  allows maximum flexibility, and allows Rote to concentrate on creating your
350
475
  documents.
351
476
 
477
+ See the <%= section_link 'rake task configuration' %> section for more details.
478
+
479
+ <%= section 3, 'Extending Rote' %>
480
+
481
+ Although Rote is designed to be as quick and easy to use as possible,
482
+ with sensible default configuration and reasonable convention throughout,
483
+ it also has ample flexibility when it comes to generating more complex
484
+ documentation sets. Thanks to it's 'option for every default' and simple
485
+ extension points, Rote should scale to even complex documentation sets
486
+ quite easily.
487
+
488
+ <%= section 4, 'Writing filters' %>
489
+
490
+ *Filters* do exactly what they say on the tin - they filter the output of
491
+ a page, perhaps rendering markup or inserting additional text. Filters
492
+ can be divided into two general categories: *Text filters* and *Macro filters*.
493
+ Either type can be a page or post filter - it depends only on the design
494
+ of the filter and the job it will perform as to which chain it should
495
+ be used with.
496
+
497
+ h5. Text filters
498
+
499
+ Text filters process the text in a page, with all macros replaced by a
500
+ standard plain-text marker. The purpose of this is to allow macros
501
+ to coexist with plain-text formatting without causing markup clashes.
502
+
503
+ Most of the standard filters are text filters. The RedCloth filter
504
+ is representative:
505
+
506
+ #:code#ruby#
507
+ class RedCloth < TextFilter
508
+ def initialize(*redcloth_opts)
509
+ super()
510
+ @redcloth_opts = redcloth_opts
511
+ end
512
+
513
+ def handler(text,page)
514
+ rc = ::RedCloth.new(text)
515
+ # hack around a RedCloth warning
516
+ rc.instance_eval { @lite_mode = false }
517
+ rc.to_html(*@redcloth_opts)
518
+ end
519
+ end
520
+ #:code#
521
+
522
+ (again, this example is slightly simplified with respect to auxiliary
523
+ functionality for the sake of clarity).
524
+
525
+ As mentioned above, @TextFilter@ also provides help with writing non-macro
526
+ filters that removes much of the headache of working around macros (which
527
+ must not be modified by any filter except that which handles the macro).
528
+
529
+ Text filters can optionally access the macro data using the @macros@ array.
530
+
531
+ If you want to implement a one-off filter quickly, there's no need to
532
+ create a new subclass - you can supply a block directly to TextFilter,
533
+ which is executed to render the textual content:
534
+
535
+ #:code#ruby#
536
+ page.page_filter Rote::Filters::TextFilter.new { |page, text|
537
+ text.gsub(/foo/,'bar')
538
+ }
539
+ #:code#
540
+
541
+ For text filters, a convenience in the implementation of @page_filter@
542
+ allows the above to be shortened to:
543
+
544
+ #:code#ruby#
545
+ page.page_filter do |page, text|
546
+ text.gsub(/foo/,'bar')
547
+ end
548
+ #:code#
549
+
550
+ Note the curly braces in the first example, which cause the block to bind
551
+ 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
553
+ supplied would be discarded.
554
+
555
+ The @post_filter@ method supports the same convenience.
556
+
557
+ h5. Macro filters
558
+
559
+ The standard Syntax filter is a typical macro filter. The following is
560
+ slightly simplified for brevity (the actual one allows custom macro tags
561
+ to be supplied):
562
+
563
+ #:code#ruby#
564
+ class Syntax < MacroFilter
565
+ def macro_code(lang, body)
566
+ converter = ::Syntax::Convertors::HTML.for_syntax(lang)
567
+ "<pre class='#{lang}'><code>#{converter.convert(body,false)}</code></pre>"
568
+ end
569
+ end
570
+ #:code#
571
+
572
+ As you can see, a macro filter simply inherits @Rote::Filters::MacroFilter@
573
+ and implements one or more @macro_XXXX@ methods, which is passed the arguments
574
+ supplied to the macro (used here to indicate the code language) and the
575
+ raw macro body.
576
+
577
+ If you want to implement a macro quickly, perhaps across a section or set of
578
+ pages, you can use @MacroFilter@ itself, supplying a block:
579
+
580
+ #:code#ruby#
581
+ page.page_filter Rote::Filters::MacroFilter.new([:foomacro]) { |tag, args, body
582
+ "FooMacro Replacement!"
583
+ }
584
+ #:code#
585
+
586
+ This can be done from any page code, a COMMON.rb (see
587
+ <%= section_link 'Template code and ERB' %>), or on a per-extension basis
588
+ with <%= section_link 'extension mappings' %>.
589
+
590
+ *Note* that macro data is passed raw, and excluded from rendering by
591
+ <%= section_link 'text filters' %>. The output, however, *will* be processed
592
+ by any filters that follow the macro filter in the chain.
593
+
594
+ h5. Duck filters
595
+
596
+ This being Ruby, you don't _have_ to inherit one of the above filters to create
597
+ your own - a filter is just an object with a @filter(text,page)@ method.
598
+
599
+ The standard TOC filter takes this route.
600
+
352
601
  <%= section 3, 'Final notes' %>
353
602
 
354
- Currently, there isn't enough checking involved on source resources when
355
- building pages - Basically, only templates are considered when Rake decides
356
- what to update. If you change common or page code you'll need to run:
603
+ <%= section 4, 'Layout dependencies' %>
604
+
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:
357
610
 
358
611
  <p><pre><code> rote clobber</code></pre></p>
359
612
 
360
- to make sure everything gets updated. This will also apply if you have
361
- interdependencies between pages and resources, but in that situation you
362
- _could_ work around it if you wished by manually (!) specifying the
363
- appropriate resources as dependencies to the appropriate page task.
364
- Such configuration is beyond the scope of this manual - see
365
- "Rake's Documentation":http://rake.rubyforge.org/ for information on
366
- dependency configuration and resolution in Rake.
613
+ <%= section 4, 'Rake magic' %>
614
+
615
+ Rake is a *very* flexible tool, and supports a wide variety of configuration
616
+ options and advanced features you can use to fit Rote to your needs. Such
617
+ configuration is beyond the scope of this manual - see
618
+ "Rake's Documentation":http://rake.rubyforge.org/ for information on the
619
+ features supported by Rake.
367
620
 
368
621
  [<%= section_link 'Top' %>]