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.
+### canedit
+
+ hook(type => "canedit", id => "foo", call => \&pagelocked);
+
+This hook can be used to implement arbitrary access methods to control when
+a page can be edited using the web interface (commits from revision control
+bypass it). When a page is edited, each registered canedit hook is called
+in turn, and passed the page name, a CGI object, and a session object.
+
+If edit can proceed, the hook should return "". If the edit is not allowed
+by this hook, the hook should return an error message for the user to see.
+If the hook has no opinion about whether the edit can proceed, return
+`undef`, and the next plugin will be asked to decide.
+
### formbuilder
hook(type => "formbuilder_setup", id => "foo", call => \&formbuilder_setup);
Logs a debugging message. These are supressed unless verbose mode is turned
on.
-#### `error($)`
+#### `error($;$)`
-Aborts with an error message.
+Aborts with an error message. If the second parameter is passed, it is a
+function that is called after the error message is printed, to do any final
+cleanup.
Note that while any plugin can use this for a fatal error, plugins should
try to avoid dying on bad input, as that will halt the entire wiki build
Makes the specified page depend on the specified [[PageSpec]].
-#### `pagespec_match($$)`
+#### `pagespec_match($$;$)`
-Passed a page name, and a [[PageSpec]], returns true if the [[PageSpec]]
-matches the page.
+Passed a page name, a [[PageSpec]], and the location the [[PageSpec]] should
+be matched against, returns true if the [[PageSpec]] matches the page. (If
+the third parameter is not passed, relative PageSpecs will match relative to
+the top of the wiki.)
#### `bestlink($$)`
goes down the directory tree to the base looking for matching
pages, as described in [[SubPage/LinkingRules]].
-#### `htmllink($$$;$$$)`
+#### `htmllink($$$;@)`
Many plugins need to generate html links and add them to a page. This is
done by using the `htmllink` function. The usual way to call
some of the hook functions above; the ones that are not passed it are not used
during inlining and don't need to worry about this issue.
-The remaining three optional parameters to `htmllink` are:
+After the three required parameters, named parameters can be used to
+control some options. These are:
-1. noimageinline - set to true to avoid turning links into inline html images
-1. forcesubpage - set to force a link to a subpage
-1. linktext - set to force the link text to something
+* noimageinline - set to true to avoid turning links into inline html images
+* forcesubpage - set to force a link to a subpage
+* linktext - set to force the link text to something
+* anchor - set to make the link include an anchor
#### `readfile($;$)`
A failure to read the file will result in it dying with an error.
-#### `writefile($$$;$)`
+#### `writefile($$$;$$)`
Given a filename, a directory to put it in, and the file's content,
writes a file.
-The optional second parameter, if set to a true value, makes the file be
+The optional fourth parameter, if set to a true value, makes the file be
written in binary mode.
+The optional fifth parameter can be used to pass a function reference that
+will be called to handle writing to the file. The function will be called
+and passed a file descriptor it should write to, and an error recovery
+function it should call if the writing fails. (You will not normally need to
+use this interface.)
+
A failure to write the file will result in it dying with an error.
If the destination directory doesn't exist, it will first be created.
Given a time, formats it for display.
+#### `gettext`
+
+This is the standard gettext function, although slightly optimised.
+
## RCS plugins
ikiwiki's support for revision control systems also uses pluggable perl
rcs\_getctime does nothing except for throwing an error.
See [[about_RCS_backends]] for some more info.
+
+## PageSpec plugins
+
+It's also possible to write plugins that add new functions to
+[[PageSpecs|PageSpec]]. Such a plugin should add a function to the
+IkiWiki::PageSpec package, that is named `match_foo`, where "foo()" is
+how it will be accessed in a [[PageSpec]]. The function will be passed two
+parameters: The name of the page being matched, and the thing to match
+against. It should return true if the page matches.