Alice browses to a page and clicks Edit.
-* Ikiwiki is run as a cgi. It assigns Alice a session cookie, and,
- by calling the `auth` hooks, sees that she is not yet logged in.
-* The `sessioncgi` hooks are then called, and one of them,
- from the [[editpage]] plugin, notices that the cgi has been told "do=edit".
-* The [[editpage]] plugin calls the `canedit` hook to check if this
- page edit is allowed. The [[signinedit]] plugin has a hook that says not:
- Alice is not signed in.
-* The [[signinedit]] plugin then launches the signin process. A signin
- page is built by calling the `formbuilder_setup` hook.
+* Ikiwiki is run as a cgi. It assigns Alice a session cookie, and, by calling
+ the [[`auth`|plugins/write#auth]] hooks, sees that she is not yet logged in.
+* The [[`sessioncgi`|plugins/write#sessioncgi]] hooks are then called, and one
+ of them, from the [[editpage]] plugin, notices that the cgi has been told
+ "do=edit".
+* The [[editpage]] plugin calls the [[`canedit`|plugins/write#canedit]] hook
+ to check if this page edit is allowed. The [[signinedit]] plugin has a hook
+ that says not: Alice is not signed in.
+* The [[signinedit]] plugin then launches the signin process. A signin page is
+ built by calling the [[`formbuilder_setup`|plugins/write#formbuilder]]
+ hook.
Alice signs in with her openid.
-* The [[openid]] plugin's `formbuilder` hook sees that an openid was
- entered in the signin form, and redirects to Alice's openid provider.
-* Alice's openid provider calls back to ikiwiki. The [[openid]] plugin
- has an `auth` hook that finishes the openid signin process.
+* The [[openid]] plugin's [[`formbuilder`|plugins/write#formbuilder]] hook
+ sees that an openid was entered in the signin form, and redirects to Alice's
+ openid provider.
+* Alice's openid provider calls back to ikiwiki. The [[openid]] plugin has an
+ [[`auth`|plugins/write#auth]] hook that finishes the openid signin process.
* Signin complete, ikiwiki returns to what Alice was doing before; editing
a page.
-* Now all the `canedit` hooks are happy. The [[editpage]] plugin calls
- `formbuilder_setup` to display the page editing form.
+* Now all the [[`canedit`|plugins/write#canedit]] hooks are happy. The
+ [[editpage]] plugin calls
+ [[`formbuilder_setup`|plugins/write#formbuilder]] to display the page
+ editing form.
Alice saves her change to the page.
-* The [[editpage]] plugin's `formbuilder` hook sees that the Save button
- was pressed, and calls the `checkcontent` and `editcontent` hooks.
- Then it saves the page to disk, and branches into the compiler part
- of ikiwiki to refresh the wiki.
+* The [[editpage]] plugin's [[`formbuilder`|plugins/write#formbuilder]] hook
+ sees that the Save button was pressed, and calls the
+ [[`checkcontent`|plugins/write#checkcontent]] and
+ [[`editcontent`|plugins/write#editcontent]] hooks. Then it saves the page
+ to disk, and branches into the compiler part of ikiwiki to refresh the wiki.
## Types of plugins
The function is passed named parameters "page" and "content". Its return
value is ignored.
+### <a name="readtemplate">readtemplate</a>
+
+ hook(type => "readtemplate", id => "foo", call => \&readtemplate);
+
+Runs on the raw source of a page or `*.tmpl` file that is being
+used as a template, before it is parsed by [[!cpan HTML::Template]].
+For instance, the [[plugins/templatebody]] plugin uses this to return
+the content of the [[ikiwiki/directive/templatebody]] directive (if there
+is one) instead of the page's full content.
+
+The function is passed named parameters:
+
+* `id`: the name under which the template was looked up,
+ such as `page.tmpl` or `note`
+* `page`: the name of the template as a page or attachment in the wiki,
+ such as `templates/note`, or `undef` if it's outside the wiki (e.g. in
+ `/usr/share/ikiwiki/templates`)
+* `content`: the content of the corresponding file
+* `untrusted`: true if the template was loaded from the wiki or an underlay,
+ false if it was loaded from a trusted location
+
+It should return the replacement content.
+
### <a name="filter">filter</a>
hook(type => "filter", id => "foo", call => \&filter);
Note that cgi hooks are called as early as possible, before any ikiwiki
state is loaded, and with no session information.
-### auth
+### <a name="auth">auth</a>
hook(type => "auth", id => "foo", call => \&auth);
if the name is set to the name of a user who is not registered,
a basic registration of the user will be automatically performed.
-### sessioncgi
+Auth plugins can use the loginselector helper plugin to let the user
+select which authentication method to use.
+
+### <a name="sessioncgi">sessioncgi</a>
hook(type => "sessioncgi", id => "foo", call => \&sessioncgi);
object and a session object. To check if the user is in fact signed in, you
can check if the session object has a "name" parameter set.
-### canedit
+### <a name="canedit">canedit</a>
hook(type => "canedit", id => "foo", call => \&canedit);
but is passed the named parameters `cgi` (a CGI object), `session` (a
session object), `src`, `srcfile`, `dest` and `destfile`.
-### checkcontent
+### <a name="checkcontent">checkcontent</a>
hook(type => "checkcontent", id => "foo", call => \&checkcontent);
that can be run to perform whatever action is necessary to allow the user
to post the content.
-### editcontent
+### <a name="editcontent">editcontent</a>
hook(type => "editcontent", id => "foo", call => \&editcontent);
It can modify the content as desired, and should return the content.
-### formbuilder
+### <a name="formbuilder">formbuilder</a>
hook(type => "formbuilder_setup", id => "foo", call => \&formbuilder_setup);
hook(type => "formbuilder", id => "foo", call => \&formbuilder);
strictly required.
* `section` can optionally specify which section in the config file
the plugin fits in. The convention is to name the sections the
- same as the tags used for [[plugins|plugin]] on this wiki.
+ same as the tags used for [[plugins]] on this wiki.
### genwrapper
The `%wikistate` hash can be used by a plugin to store persistant state
that is not bound to any one page. To set a value, use
-`$wikistate{$id}{$key}=$value, where `$value` is anything Storable can
+`$wikistate{$id}{$key}=$value`, where `$value` is anything Storable can
serialize, `$key` is any string you like, and `$id` must be the same as the
"id" parameter passed to `hook()` when registering the plugin, so that the
state can be dropped if the plugin is no longer used.
### `%pagesources`
-The `%pagesources` has can be used to look up the source filename
+The `%pagesources` hash can be used to look up the source filename
of a page. So the key is the page name, and the value is the source
filename. Do not modify this hash.
+Attachments also appear in this hash, with the same key and value.
+
$pagesources{"foo"} = "foo.mdwn";
+ $pagesources{"logo/ikiwiki.png"} = "logo/ikiwiki.png";
+
### `%destsources`
The `%destsources` hash records the name of the source file used to
create each destination file. The key is the output filename (ie,
-"foo/index.html"), and the value is the source filename that it was built
-from (eg, "foo.mdwn"). Note that a single source file may create multiple
+"foo/index.html"), and the value is the name of the page that it was built
+from (eg, "foo"). Note that a single source file may create multiple
destination files. Do not modify this hash directly; call `will_render()`.
-
- $destsources{"foo/index.html"} = "foo.mdwn";
+
+Attachments also appear in this hash, with the same key and value.
+
+ $destsources{"foo/index.html"} = "foo";
+ $destsources{"logo/ikiwiki.png"} = "logo/ikiwiki.png";
## Library functions
This hook and `rcs_preprevert` are optional, if not implemented, no revert
web interface will be available.
+### `rcs_find_changes($)`
+
+Finds changes committed since the passed RCS-specific rev. Returns
+a hash of the files changed, a hash of the files deleted, and the
+current rev.
+
+This hook is optional.
+
+### `rcs_get_current_rev()`
+
+Gets a RCS-specific rev, which can later be passed to `rcs_find_changes`.
+
+This hook is optional.
+
### PageSpec plugins
It's also possible to write plugins that add new functions to