Variables
Flexible variable declaration and propagation is the heart of the
FileWiki system. While some variables affect the FileWiki system,
they are basically used as input to the template processor. Every page
merges its vars
from various locations (see "Propagation" below).
Declaration
Variables are declared in a simple "key=value" or "key value"
format. Variable expansion is performed in occurrence of either
$myvar
, ${myvar}
, or ${{myvar}}
(see "Variable Expansion"
below).
- Lines starting with '#' (hash) are ignored
- Trailing whitespaces are cut off
- Double quotes are removed at beginning and end of value
- Keys starting with '+' (plus) are appended to an array
- Values starting with '\\' are multi-line, with '\\' on last line
Example:
title=FileWiki Documentation
menu=$title
This results in both "title" and "menu" variables to have the value "Summary". This is equivalent to:
title "FileWiki Documentation"
menu $title
Propagation
tree vars
Parsed from file "tree.vars" in every directory.
tree.vars
are propagated to dir.vars
and page.vars
, and are
persistent within sub-directories. tree.vars
in sub-directories
supersede the tree.vars
of the parent directory.
dir vars
Parsed from file "dir.vars" in every directory.
Used for the directory node. Consider the dir.vars
as metadata for the
directory they are located in. dir.vars
are not propagated, but are
accessible on a page via the DIR
variable.
page vars
Parsed from file "<source_file>.vars".
page.vars
supersede the tree.vars
for a page. Consider the
page.vars
as metadata for a page. Every source page can have
page.vars
.
nested vars
Parsed from within the source files (if supported by the plugin enabled).
Nested vars supersede the page.vars
. FileWiki starts to parse nested
variables from the source file after it first encounters a line
starting with <filewiki_vars>
or [filewiki_vars]
, up to
</filewiki_vars>
or [/filewiki_vars]
.
Note that the nested.vars
are stripped off the source file when
processing the input filters.
Example:
Page text...
<filewiki_vars>
key=value
...
</filewiki_vars>
Page text...
As a special feature for pages which are also parsed outside FileWiki
(e.g. perl modules), a "un-comment" character is defined by the first
character preceding <filewiki_vars>
.
Example (equivalent to example above):
File text (e.g. Perl code)...
#<filewiki_vars>
#key=value
#...
#</filewiki_vars>
File text...
In this example, the "un-comment" character is set to '#', and all variables are parsed.
Variable Expansion
Early Expansion
Variable early expansion happens directly at the time the key/value line is read from disk. This is the common case for propagating variables through directories.
Early expansion for expressions is accepted in form:
$KEY
: expand to the value of variableKEY
, or "" ifKEY
is not found.${KEY_EXPR}
: expression in form${KEY0[|KEY1...]}
, returning the first valid value from KEYn.${KEY_EXPR[/MATCH/REPLACE]}
: performs a regular expressions/MATCH/REPLACE/
on the value ofKEY_EXPR
.${KEY_EXPR[//MATCH/REPLACE]}
: performs a global regular expressions/MATCH/REPLACE/g
on the value ofKEY_EXPR
.
Examples:
OUTPUT_DIR /tmp/filewiki/htdocs
URI_PREFIX $OUTPUT_DIR
stylesheet $URI_PREFIX/filewiki.css
debug_name XXX${NAME}XXX
Late Expansion
Variable late expansion happens after all variables are read by a page or directory node. This is particulary useful if you want to define a variable derived from internal variables set by plugins. Note that setting system variables on late-expansion time might lead to undefined behaviour, as the plugins might rely on these variables before late-expansion happens.
Late expansion has the same semantics as early expansion, except that
double brackets are used: ${{...}}
Example:
commit_msg This page was committed by: ${{GIT_AUTHOR_NAME}}.
date ${{NAME/^(\d\d\d\d-\d\d-\d\d)-/$1}}
title ${{NAME/^\d\d\d\d-\d\d-\d\d-(.*)/$1}}
For files named like "yyyy-mm-dd-myfile", this sets a variables
date
and title
from the source file name.
Logical Expressions
Expressions in form $((...))
are executed at late expansion time.
Logical expressions are accepted in form:
$(( [[!]CONDITION:] EXPR0 || EXPR1 || ... ))
: expands to expressionEXPR0
, or toEXPR1
..., whichever expression resolves to true first. Expands to an empty string ifCONDITION
resolves to false.
Example:
date $(( ${{EXIF_TIME}} || ${{NAME/^(\d\d\d\d-\d\d-\d\d)-/$1}} || ${{MTIME}} ))
title $((IS_DIR: ${{NAME/^\d\d\d\d-\d\d-\d\d-/}} ))
This sets variable date
from EXIF_TIME, falling back to the date
prefix of NAME, finally falling back to MTIME. Sets variable title
to the title portion of NAME, but only if IS_DIR
variable is set
(i.e. only for a directory node).