Chapter 1
Introduction
ERBook is an extensible document processor that emits any document you can imagine from eRuby templates that allow scripting and dynamic content generation.
A working XHTML (web page) format is provided, while LaTeX (PDF), UNIX manual page, and plain text formats are planned… patches are welcome!
ERBook is exciting because:- Its documents are scriptable eRuby templates.
- It lets you define your own document formats.
- Its core contains less than 300 lines of code.
These features distinguish ERBook from the competition, which offers neither scriptable documents nor definable document formats:
1.1 Logistics
- Release notes — history of project releases.
- Source code — obtain via Git or browse online.
- API reference — documentation for source code.
To get help or provide feedback, simply contact the authors.
Version numbers
ERBook releases are numbered in major.minor.patch form according to the RubyGems rational versioning policy, which can be summarized thus:
What increased in the version number? | The increase indicates that the release: | ||
Is backward compatible? | Has new features? | Has bug fixes? | |
---|---|---|---|
major | No | Yes | Yes |
minor | Yes | Yes | Yes |
patch | Yes | No | Yes |
1.2 License
Copyright 2006 Suraj N. Kurapati sunaku@gmail.com
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1.3 Credits
The “erbook.png” image and its “erbook.svg” source utilize the “cartoon owl sitting on a book” graphic, which was created and released into the public domain by Jens Vierbuchen on July 7, 2008.
1.4 Reviews
Vitor Peres in ruby-talk:
I actually felt like printing [this manual], because it’s just so well-thought typographically… Even if [ERBook] weren’t great by itself, I’d feel good just looking at the manual.
Ara T. Howard in ruby-talk:
[this manual is] a insanely complete and nice looking bit of documentation [… ERBook] looks like a great project
Martin DeMello in ruby-talk:
Very nice work indeed!
Chapter 2
Setup
2.2 Installation
You can install ERBook by running this command:
gem install erbook
To check whether the installation was sucessful, run this command:
erbook -v
If the installation was successful, you will see output like this:
project: ERBook version: 6.0.0 release: 2009-01-19 website: http://snk.tuxfamily.org/lib/erbook/ install: /home/sun/src/erbook
Otherwise, you can contact the author for help.
2.3 Manifest
You will see the following items inside ERBook’s installation directory, whose path you can determine by running this command:
erbook -v
-
bin/
- erbook — the main ERBook executable.
-
fmt/ — contains the predefined set of format specification files. If you ever need to install your custom format specification file globally, then put it inside this directory.
-
latex.yaml — high-quality typesetting
-
man.yaml — manual page for UNIX
-
xhtml.yaml — web page for the Internet
-
text.yaml — plain text, nothing fancy
-
lib/
-
erbook.rb — the main ERBook library.
-
erbook/
-
to_xhtml.rb — provides methods (see Section 5.1.1. Text to XHTML conversion) for the Chapter 5.1. XHTML (web page) format.
-
rdoc.rb — provides RDoc parse trees to Ruby code.
-
-
-
doc/ — contains this manual and other documentation.
-
erbook.svg — source file of the ERBook logo.
-
index.erb — source file of this manual.
-
api/ — API reference documentation.
-
-
LICENSE — project license and copyright notice.
Chapter 3
Theory of operation
When you run ERBook, it does the following:
-
Loads the format specification file.
-
Creates an input document by:
-
Reading the input (the content of either the input file or the standard input stream) into memory.
-
Evaluating include directives in the input.
-
-
Transforms the input document into a processed document by:
-
Building a document tree data structure from nodes present in the input document.
-
Replacing every node in the input document with the result of its node output template.
-
-
Transforms the processed document into an output document according to the document output template.
-
Prints the output document to the standard output stream.
Although there is only one document being processed here, we refer to it using three distinct terms: input, processed, and output; because the content of the document changes radically with every transformation.
3.1 Nodes
A node is a block of text that appears like this:
<% node_type node_argument1, node_argument2, ... do |node_object| %> node_content <% end %>
Or like this:
<% node_type node_argument1, node_argument2, ... do %> node_content <% end %>
Or like this:
<%= node_type node_argument1, node_argument2, ... %>
Alternatively, you may omit the leading ”<” and trailing “%>” characters from an eRuby directive if the directive spans an entire line. So, the above examples become:
% node_type node_argument1, node_argument2, ... do |node_object| node_content % end
And:
% node_type node_argument1, node_argument2, ... do node_content % end
And:
%= node_type node_argument1, node_argument2, ...
Technically, nodes are Ruby method invocations composed of the following:
Component | Description |
---|---|
node_type | name of the method being invoked |
node_argument1, node_argument2, ... | arguments for the method invocation |
node_content | a block argument being passed to the method invocation |
node_object | a ERBook::Document::Node object (see Section 3.1.1. The ERBook::Document::Node class) representing this method invocation |
A format specification file defines what types of nodes an input document may use.
3.1.1 The ERBook::Document::Node
class
When ERBook builds a document tree from the nodes in an input document, it stores information about these nodes into ERBook::Document::Node
objects. A ERBook::Document::Node
object has the following properties (methods):
Property | Type | Description |
---|---|---|
type | String | Name of the type of this node. |
args | Array | Arguments passed to this node. |
content | String | The block of text passed to this node. |
output | String | Result of the node output template for the content of this node. |
digest | String | A unique identifier for the content of this node. |
trace | Array | A stack trace describing the location of this node in the input document. |
index | String | A LaTeX-style section number for this node. This property is only present if the index parameter is enabled in the definition of this type of node. |
number | Integer | An order-of-occurrence number for this node. This property is only present if the number parameter is enabled in the definition of this type of node. |
depth | Integer | Distance from the root of the document tree to this node. |
parent | ERBook::Document::Node | The ERBook::Document::Node object which contains this node. The value of this property will be nil if this node is a root of the document tree. |
children | Array of ERBook::Document::Node | List of child nodes from the document tree. |
Furthermore, the ERBook::Document::Node
class is derived from Ruby’s OpenStruct
class, so you can define new properties for ERBook::Document::Node
objects dynamically.
3.2 Format specification file
A format specification file is a plain-text file marked up in YAML syntax. Through the following parameters, it defines (1) what types of nodes an input document may contain, (2) how the content of those nodes is transformed into output, and (3) how the processed document is transformed into the output document.
Parameter | Type | Description |
---|---|---|
desc | String | A short description of the output format. |
code | String | Ruby code that will be loaded before the input document is processed. This source code will be evaluated inside the main ERBook executable, so any file-system or path-dependent portions of this source code should take appropriate precautions. |
nodes | Hash | A listing of node definitions. |
output | String | An eRuby template for the final output document. See Section 3.2.2. Document output template. |
3.2.1 Node definition
A node definition is a mapping from a name (the “node type”) to the following set of parameters:
Parameter | Type | Description |
---|---|---|
index | Boolean | Assign a LaTeX-style section number to this node? |
number | Boolean | Assign an order-of-occurrence number to this node? |
silent | Boolean | Suppress the output of this node? |
output | String | An eRuby template for the content of this node. See Section 3.2.1.1. Node output template. |
inline | Boolean | Is node’s output an in-line string of text that can be embedded anywhere in the document? |
You may define additional parameters in a node definition if you want.
3.2.1.1 Node output template
A node output template (the output parameter in a node definition) is an eRuby template that transforms a node’s content into output. During the processing stage, ERBook replaces all nodes in the input document with the result of this template unless the silent parameter is enabled in this node’s definition.
The following variables are available for use in this template:
Variable | Type | Description |
---|---|---|
@node | ERBook::Document::Node | The node for which this template is being evaluated. |
@roots | Array of ERBook::Document::Node | All root nodes in the document tree. |
@nodes | Array of ERBook::Document::Node | All nodes in the document tree. |
@nodes_by_type | Hash | Mapping from node type (String ) to array of ERBook::Document::Node objects having that type. |
@format | Hash | Data from the format specification file. |
ERBook also provides the following mappings inside the @format
variable:
Expression | Type | Description |
---|---|---|
@format[:name] | String | Short-hand name of the current format. |
@format[:file] | String | Path of the current format specification file. |
3.2.2 Document output template
A document output template (the output parameter in a format specification file) is an eRuby template that transforms a processed document into the final output document.
The following variables are available for use in this template:
Variable | Type | Description |
---|---|---|
@content | String | Content of the processed document. |
@roots | Array of ERBook::Document::Node | All root nodes in the document tree. |
@nodes | Array of ERBook::Document::Node | All nodes in the document tree. |
@nodes_by_type | Hash | Mapping from node type (String ) to array of ERBook::Document::Node objects having that type. |
@format | Hash | Data from the format specification file. |
ERBook also provides the following mappings inside the @format
variable:
Expression | Type | Description |
---|---|---|
@format[:name] | String | Short-hand name of the current format. |
@format[:file] | String | Path of the current format specification file. |
3.2.3 Creating your own document format
Here is a working example to help you digest all that you’ve learned so far about format specification files. A few things to notice in this example are:
-
We define a
generate_name()
method in Example 1. HelloWorld format specification file and make use of it in the Example 2. Input document for HelloWorld format. This shows how to provide format-specific functionality to an input document. -
We define a
$style
variable in Example 2. Input document for HelloWorld format and make use of it in Example 1. HelloWorld format specification file. This shows how to pass parameters from an input document to your format specification file.
To run this example:
-
Save the code shown in Example 1. HelloWorld format specification file to a file named HelloWorld.spec
-
Save the text shown in Example 2. Input document for HelloWorld format to a file named HelloWorld.input
-
Run this command:
erbook HelloWorld.spec HelloWorld.input > HelloWorld.output
-
Examine the HelloWorld.output file to your satisfaction!
Example 1. HelloWorld format specification file
desc: An example format.
code: |
class ERBook::Node
def name
# dynamically compute (and store)
# the name of this node on demand
@name ||= generate_name
end
private
# Returns a random, yet pronounceable, name.
def generate_name
letters = ('a'..'z').to_a - %w[ c q w x ] # redundant sounds
vowels = %w[a e i o u]
consonants = letters - vowels
sets = [consonants, vowels]
length = 3 + rand(5)
name = (0...length).map do |i|
# alternate between consonants and vowels
set = sets[i % sets.length]
# choose a random letter from the set
set[rand(set.length)]
end.join
name
end
end
nodes:
hello:
index: true
number: true
silent: false
output: |
<h3><%= @node.type %> #<%= @node.index %>: <%= @node.name.inspect %></h3>
My name is <%= @node.name.inspect %> and these are my properties:
<dl style="<%= $style %>">
<dt>args</dt>
<dd><code><%= @node.args.inspect %></code></dd>
<dt>index</dt>
<dd><code><%= @node.index.inspect %></code></dd>
<dt>number</dt>
<dd><code><%= @node.number.inspect %></code></dd>
<dt>trace</dt>
<dd><pre><%= @node.trace.join("\n") %></pre></dd>
<dt>content</dt>
<dd><%= @node.content %></dd>
</dl>
output: |
Welcome to the "<%= @format[:name] %>" format.
<%= @content %>
That's all folks!
Example 2. Input document for HelloWorld format
<% $style = "border-left: thick dotted LightGrey; padding-left: 1em;" %>
<% hello "Pretentious", 1, 2, 3 do %>
<big>I'm</big> the very first node, oh _yes_ I am! *sneer*
<% hello "Bashful", 4, 5, 6 do %>
Hi, I... *hide*
<% hello "Hopeful", rand do %>
*sigh*
<% hello "Confused", (rand * rand) do %>
Huh?
<% end %>
<% end %>
<% hello "Raving", __FILE__ do %>
Oh it's *on* now! You're going *down*!
<% end %>
<% end %>
<% hello "Sleepy", Time.now do %>
*yawn* Just five more minutes...
<% hello "Peaceful", Dir.pwd do %>
So _be_ happy my friend, *happy*!
<%= hello "Lonely (as you can see, I have no block)" %>
<% end %>
<% end %>
<% end %>
<% hello "Snappy" do %>
Zip! Zap! Wake up, you sap!
_Whoo I'm wild!_ ;-)
<% end %>
<%= hello "Independent (no block, no parents, I am _free_!)" %>
Example 3. Output of HelloWorld format
Welcome to the “HelloWorld” format.
hello #1: nil
My name is nil and these are my properties:
- args
["Pretentious", 1, 2, 3]
- index
"1"
- number
1
- trace
doc/HelloWorld.input:1:in `initialize'
- content
- I'm the very first node, oh _yes_ I am! *sneer*
hello #1.1: nil
My name is nil and these are my properties:- args
["Bashful", 4, 5, 6]
- index
"1.1"
- number
2
- trace
doc/HelloWorld.input:3:in `initialize' doc/HelloWorld.input:1:in `initialize'
- content
- Hi, I... *hide*
hello #1.1.1: nil
My name is nil and these are my properties:- args
["Hopeful", 0.206825122967076]
- index
"1.1.1"
- number
3
- trace
doc/HelloWorld.input:5:in `initialize' doc/HelloWorld.input:3:in `initialize' doc/HelloWorld.input:1:in `initialize'
- content
- *sigh*
hello #1.1.1.1: nil
My name is nil and these are my properties:- args
["Confused", 0.491025424447163]
- index
"1.1.1.1"
- number
4
- trace
doc/HelloWorld.input:7:in `initialize' doc/HelloWorld.input:5:in `initialize' doc/HelloWorld.input:3:in `initialize' doc/HelloWorld.input:1:in `initialize'
- content
- Huh?
hello #1.1.2: nil
My name is nil and these are my properties:- args
["Raving", "doc/HelloWorld.input"]
- index
"1.1.2"
- number
5
- trace
doc/HelloWorld.input:9:in `initialize' doc/HelloWorld.input:3:in `initialize' doc/HelloWorld.input:1:in `initialize'
- content
- Oh it's *on* now! You're going *down*!
hello #1.2: nil
My name is nil and these are my properties:- args
["Sleepy", Mon Jan 19 04:46:00 -0800 2009]
- index
"1.2"
- number
6
- trace
doc/HelloWorld.input:11:in `initialize' doc/HelloWorld.input:1:in `initialize'
- content
- *yawn* Just five more minutes...
hello #1.2.1: nil
My name is nil and these are my properties:- args
["Peaceful", "/home/sun/src/erbook"]
- index
"1.2.1"
- number
7
- trace
doc/HelloWorld.input:13:in `initialize' doc/HelloWorld.input:11:in `initialize' doc/HelloWorld.input:1:in `initialize'
- content
- So _be_ happy my friend, *happy*!
hello #1.2.1.1: nil
My name is nil and these are my properties:- args
["Lonely (as you can see, I have no block)"]
- index
"1.2.1.1"
- number
8
- trace
doc/HelloWorld.input:15:in `initialize' doc/HelloWorld.input:13:in `initialize' doc/HelloWorld.input:11:in `initialize' doc/HelloWorld.input:1:in `initialize'
- content
hello #2: nil
My name is nil and these are my properties:
- args
["Snappy"]
- index
"2"
- number
9
- trace
doc/HelloWorld.input:17:in `initialize'
- content
- Zip! Zap! Wake up, you sap! _Whoo I'm wild!_ ;-)
hello #3: nil
My name is nil and these are my properties:
- args
["Independent (no block, no parents, I am _free_!)"]
- index
"3"
- number
10
- trace
doc/HelloWorld.input:20:in `initialize'
- content
That’s all folks!
Chapter 4
Usage
4.1 Command-line interface
ERBook - Extensible document processor based on eRuby * The standard input stream will be read if an input file is not specified. * The final output document will be written to the standard output stream. * If an error occurs, the input document will be written to the standard output stream, so that you can investigate line numbers in the error. Usage: erbook [Option...] FormatName [InputFile] erbook [Option...] FormatFile [InputFile] FormatName: latex: high-quality typesetting man: manual page for UNIX xhtml: web page for the Internet text: plain text, nothing fancy Option: --unindent, -u: Unindent node content hierarchically --manual, -m: Show the user manual --version, -v: Print version and exit --help, -h: Show this message
The first command-line argument to erbook is either the name of a predefined format (FormatName) or the path to a format specification file (FormatFile).
Predefined formats are simply short-hand names of format specification files located in the fmt/ subdirectory of the erbook installation directory (see Section 2.3. Manifest).
4.1.1 Saving the output to a file
Simply redirect the standard ouput stream (STDOUT) to a file like this:
erbook > YOUR_PATH_HERE
In the above example, YOUR_PATH_HERE is the path of the file in which the output should be saved.
Important 1. Save XHTML output as .xhtml
When you use the XHTML format, ensure that the file extension of your saved output document is either .xhtml or .xml. Alternatively, ensure that your saved output document is served to web browsers under the application/xhtml+xml mime type.
Otherwise, most web browsers will not display the icons and graphics embedded in the saved XHTML output document because they will treat it as HTML instead of as XML. See this QuirksMode.org bug report for details.
4.2 Including external documents
The include directive allows you to insert the content of an arbitrary file at a certain place in the input document. It is written like this:
<%# include YOUR_PATH_HERE #%>
In the above example, YOUR_PATH_HERE is the path of the file whose content you wish to insert into the input document.
You can divide a large document into separate files for easier editing and stitch them together, dynamically, into a single document using the include directive.
4.3 Unindenting nodes hierarchically
When writing erbook documents, I prefer to indent the content of nodes according to their depth because my text editor of choice automatically folds blocks of text based on indentation.
If you also prefer to write documents in this way, be sure to pass the --unindent option to erbook so that the indentation will not affect the resulting output.
Part 5
Formats
This part describes the default formats provided along with ERBook. The format specification files for these formats can be found in the fmt/ directory of the ERBook installation directory (see Section 2.3. Manifest).
These formats are meant to serve as working examples. If you require more functionality from one of these formats, simply make a copy of the corresponding format specification file and edit the copy to suit your needs. If you would like to contribute or discuss your enhancements to these default formats, you can contact the author.
Chapter 5.1
XHTML (web page)
This format generates a monolithic XHTML document that allows users to easily search for a particular topic using nothing more than their web browser’s built-in text search mechanism. This facilitates offline reading, where an Internet search engine is not available.
When viewing an XHTML document in a graphical web browser, you will notice navigation menus to the left of chapters, sections, figures, admonitions, and so on. These menus contain hyperlinks that make it easy to navigate the XHTML document, especially for users of text-only web browsers.
Furthermore, the XHTML document comes equipped with a stylesheet that makes it suitable for printing. In particular, users of web browsers that support CSS3 selectors will notice that all hyperlinks have been expanded to include their target URL next to them. Try the “print preview” function of your web browser to see how the XHTML document would appear when printed.
5.1.1 Text to XHTML conversion
The lib/erbook/to_xhtml.rb file inside ERBook’s installation directory (see Section 2.3. Manifest) defines the following methods:
-
String#to_xhtml
- Transforms this string into XHTML while ensuring that the result contains one or more block-level elements at the root. -
String.to_inline_xhtml
- Transforms this string into an inline XHTML string (one that does not contain any block-level XHTML elements at the root).
The default implementation of the String#to_xhtml
method employs the Markdown markup system. If you do not like Markdown or wish to use a different markup system for text in your documents, then simply edit the to_xhtml.rb file and adjust the source code of the default String#to_xhtml
and String.to_inline_xhtml
methods accordingly.
For example, if you replace the entire to_xhtml.rb file with the following code, then the output of all nodes will appear within red boxes in the final output document.
class String # Transforms this string into XHTML while ensuring that the # result contains one or more block-level elements at the root. def to_xhtml '<p style="border: thin solid red">' + self + '</p>' end # Transforms this string into an *inline* XHTML string (one that # does not contain any block-level XHTML elements at the root). def to_inline_xhtml self end end
In addition to supporting Markdown syntax, the default implementation has some additional features which are described in the following subsections.
5.1.1.1 Syntax coloring for source code
Syntax coloring is automatically added to source code found inside the <code> and </code> HTML tags. The syntax coloring library, CodeRay, currently supports the following programming languages:
- Ruby
- C
- Delphi
- HTML
- RHTML (Rails)
- Nitro-XHTML
5.1.1.1.1 Specifying the programming language
Because different programming languages have different syntax coloring schemes, you can specify the language of your source code using the lang
attribute to ensure that only the appropriate coloring scheme is used. Note that unless the lang
attribute is specified, Ruby is assumed to be the programming language of all source code by default.
For example, here is some source code without the lang
attribute:
# Ruby ########################### def hello puts "Hello world!" end /* C ****************************/ #include <stdio.h> int main(int argc, char **argv) { printf("Hello world!\n"); return 0; } <!-- HTML -----------------------> <html> <body> Hello world! <body> </html>
And here is the same source code with a lang="c"
attribute:
# Ruby ###########################
def hello
puts "Hello world!"
end
/* C ****************************/
#include <stdio.h>
int main(int argc, char **argv) {
printf("Hello world!\n");
return 0;
}
<!-- HTML ----------------------->
<html>
<body>
Hello world!
<body>
</html>
And here is the same source code with a lang="html"
attribute:
# Ruby ###########################
def hello
puts "Hello world!"
end
/* C ****************************/
#include <stdio.h>
int main(int argc, char **argv) {
printf("Hello world!\n");
return 0;
}
<!-- HTML ----------------------->
<html>
<body>
Hello world!
<body>
</html>
5.1.2 Parameters
The XHTML format accepts the following document parameters. To disable the default value for a particular parameter, simply set that parameter to nil
. For example, to disable the $authors
parameter, you would write $authors = nil
in your input document.
Parameter | Type | Default value | Description |
---|---|---|---|
$title | String | "$title" | Title of the document. |
$subtitle | String | "$subtitle" | Secondary title of the document. |
$authors | Hash | {"$authors" => nil} | A mapping of author name to author URL. You can obfuscate e-mail addresses using the provided String#to_xml_entities method like this: { "Y. Matsumoto" => "mailto:matz@ruby.invalid".to_xml_entities } |
$date | String | Time.now.strftime("%d %B %Y") | Date when the document was written. |
$logo | String | nil | Arbitrary content that goes above the document title in the default header. |
$feeds | Hash | nil | A mapping of feed URL to feed format. Here is an example: $feeds = { "my_rss_feed.xml" => "rss", "my_atom_feed.xml" => "atom" } |
5.1.3 Methods
The XHTML format provides the following methods. In the method declarations shown below,
- a pound sign (#) indicates that the method is an instance method, meaning that it can only be invoked on instances of a class, not on the classes themselves.
- a double colon sign (::) indicates that the method is a class method, meaning that it can only be invoked on a class.
ERBook::Document::Node#title_link(title = nil)
Returns a hyperlink to this node containing its title.
ERBook::Document::Node#index_link()
Returns a hyperlink to this node containing its LaTeX-style index number.
ERBook::Document::Node#number_link()
Returns a hyperlink to this node containing its occurrence number.
ERBook::Document::Node::navigation(here_frag, list_frag, prev_frag, next_frag)
Calculates a local navigation menu containing links to the given URI fragments (which can be nil).
ERBook::Document::Node#xref_link(label = nil)
Returns a hyperlink to this node.
@param [String] label
Optional label (may contain XHTML) for the hyperlink. If not specified, the title and designation of this node will be used as the label instead.
ERBook::Template#verbatim(content)
Protects the given content from the text-to-XHTML conversion process.
ERBook::Template#hyperlink(url, label = url, title = nil)
Returns XHTML for a hyperlink to the given URL of the given label and mouse-hover title.
ERBook::Template#embed_image_file(path, format = path[/\w+/], atts = {})
Returns an <img/> tag that embeds the given image file.
path: | path to the image file |
format: | format of the image file (e.g. PNG, JPEG, GIF, etc.) |
atts: | additional attributes for the <img> tag |
ERBook::Template#embed_image_data(data, format, atts = {})
Returns an <img/> tag that embeds the given raw image data.
data: | raw image data |
format: | format of the image file (e.g. PNG, JPEG, GIF, etc.) |
atts: | additional attributes for the <img> tag |
String#to_uri_fragment()
Transforms this string into a valid URI fragment. See www.nmt.edu/tcc/help/pubs/xhtml/id-type.html
Chapter 5.1.4
Nodes
Unless otherwise noted, all nodes defined by the XHTML format accept two arguments, in this order:
- a required title for the node
- an optional unique identifier for the node
The second argument is used by the cross-referencing nodes (see Section 5.1.4.1.4. xref and Section 5.1.4.5.2. cite), which allow you to refer to another node in the document by its unique identifier.
Furthermore, node definitions in the XHTML format have two additional parameters:
Parameter | Type | Description |
---|---|---|
toc | Boolean | Include this node in the Table of Contents (TOC)? |
lof | Boolean | Include this node in the List of Figures (LOF)? |
5.1.4.1 Structural nodes
The nodes described in this section form the overall structure of the output document.
5.1.4.1.1 header
This node overrides the logo, title, list of authors, and date when the document was written, all of which are shown at the top of the document.
5.1.4.1.2 footer
This node overrides (1) the date when this document was generated and (2) the hyperlink to the ERBook website, shown at the bottom of the document. The hyperlink is there as a way of saying thanks for ERBook, the wonderful little utility you have grown so fond of! ;-)
5.1.4.1.3 abstract
A summary of the entire document. This is what most readers will skim through, if you are lucky. Alas, nobody reads entire documents these days! :-(
5.1.4.1.4 xref
A cross-reference; a hyperlink that takes you to any node in the document.
The first argument of this node is either the unique identifier or the user-defined title of the node you wish to cross-reference. If no nodes in the document have the given identifier or user-defined title, then an error will be raised.
The second argument of this node overrides the default link text of the cross-reference.
For example, this node in the input document:
<%= xref "SpecFile" %>
appears in the output document like this: Section 3.2. Format specification file.
As another example, this node in the input document:
<%= xref "SpecFile", "custom link text" %>
appears in the output document like this: custom link text.
5.1.4.2 Organizational nodes
The nodes described in this section are meant to help organize the document’s content logically. Based on how deeply these nodes are nested in the document, their heading will be larger (shallow depth) or smaller (deep depth).
5.1.4.2.1 node
A placeholder that simply passes its content to the output.
This node has no real use in the writing of a document. It mainly helps programmers define “virtual” nodes that simply wrap some user-provided content. Programmers can then manipluate the content of those virtual nodes when processing the document.
This is how a node node appears.
5.1.4.3 Admonition nodes
An admonition is basically a box that is indented more deeply than the text surrounding it. It is typically used to convey extraneous or pertinent information about the application of ideas discussed in the surrounding text.
I like to follow the KDE guidelines[1] when determining which admonition to use in my documents.
5.1.4.3.1 warning
Use a warning node when “data loss could occur if you follow the procedure being described.” [1]
5.1.4.3.2 caution
bq. A note of caution. Use this for example when the reader may lose easily recovered or replaceable information (e.g. user settings), or when they could cause data loss if they don’t correctly follow the procedure being outlined. [1]
5.1.4.3.3 important
Use an important node when:
bq. When there is no danger of data loss, but you wish to make clear to the reader a consequence that isn’t immediately obvious (e.g. when changing the font for one instance of a program also changes the default setting, and this isn’t clear from the GUI.) [1]
5.1.4.3.4 note
Use a note node to convey:
bq. Information the user should be aware of, but is peripheral to the actual task being described. [1]
5.1.4.3.5 tip
Use a tip node when:
bq. When you’re giving a hint to make things easier or more productive for the reader. [1]
5.1.4.5 Bibliographical nodes
The nodes in this section deal with attribution of ideas—an important weapon against plagiarism.
5.1.4.5.1 reference
This node stores bibliography information about an information source that is relevant to your document.
If you wish to cite a certain source in several places in your document, start by creating a reference node first and then use a cite node (see Section 5.1.4.5.2. cite) to perform the citation.
5.1.4.5.2 cite
A citation to a reference node (see Section 5.1.4.5.1. reference) in the document’s bibliography.
The first argument of this node is the unique identifier of the reference node you wish to cite. You can specify additional arguments to give more detail about the citation.
For example, this node in the input document:
<%= cite "xhtml.nodes.reference.example" %>
appears in the output document like this: [2]
As another example, this node in the input document:
<%= cite "xhtml.nodes.reference.example", "chapter 10", "page 53", "..." %>
appears in the output document like this: [2, chapter 10, page 53, ...]
Chapter 5.2
Plain text
This format is not yet implemented. Patches are welcome! :-)
http://en.wikipedia.org/wiki/Plain_text
Chapter 5.3
LaTeX (PDF)
This format is not yet implemented. Patches are welcome! :-)
http://www.latex-project.org
Chapter 5.4
UNIX manual page
This format is not yet implemented. Patches are welcome! :-)
http://en.wikipedia.org/wiki/Man_page
Chapter 6
Project history
6.1 Version 6.0.0 (2009-01-19)
This release improves the appearance & usability of the XHTML format, refactors the core logic into reusable libraries, fixes some bugs and improves variable names.
Incompatible changes
-
Renamed
@types
to@nodes_by_type
and@spec
to@format
in XHTML format. -
Moved the core logic of the erbook executable into the
ERBook::Document
andERBook::Document::Template
classes.
New features
-
Addded navigation menus beside every segment in the user manual. These menus allow you to jump to the next/previous segment, whereas previously you always had to go back to the table of contents and select a new segment.
-
A star is drawn beside a reverse jump target in the table of contents, so the user can continue where they left off.
-
Added “inline” node definition parameter (see Section 3.2.1. Node definition).
-
Added
$subtitle
parameter to XHTML format. -
Document parameters for the XHTML format, such as
$title
, can now be disabled by setting them tonil
. -
Relative file paths can now be specified in <%#include#%> directives.
-
Added a “node” node (see Section 5.1.4.2.1. node), which serves as a pass-through container, in the XHTML format.
-
Allow user to type
<pre>
blocks on single lines without affecting the display of their content. -
Initial newline in the body of
<code>
is now stripped. This allows users to write their code blocks normally:<code>
foo
bar
</code>Instead of abnormally to avoid an extra leading newline:
<code>foo
bar
</code> -
Paragraph nodes are now included in the table of contents.
Bug fixes
-
Input to unindentation algorithm was being partially unindented beforehand by the logic that silences code-only eRuby directives. This corrupted the unindentation algorithm’s output in some cases.
-
<pre>
blocks now expand to fit their content in the XHTML format. No more scrollbars! -
<a/>
without href was treated as external hyperlink.
Housekeeping
-
Revised the project logo to emphasize the owl mascot.
-
Replaced dull MediaWiki hyperlink colors with more lively colors in XHTML format.
-
Wrote more API documentation and use Inochi to simplify project maintenance.