2007-08-13 19:22:15 +02:00
|
|
|
Ikiwiki's plugin interface allows all kinds of useful [[plugins]] to be
|
|
|
|
written to extend ikiwiki in many ways. Despite the length of this page,
|
|
|
|
it's not really hard. This page is a complete reference to everything a
|
|
|
|
plugin might want to do. There is also a quick [[tutorial]].
|
|
|
|
|
2008-07-21 13:31:57 +02:00
|
|
|
[[!toc levels=2]]
|
2007-08-13 19:22:15 +02:00
|
|
|
|
|
|
|
## Types of plugins
|
|
|
|
|
2007-08-13 05:07:31 +02:00
|
|
|
Most ikiwiki [[plugins]] are written in perl, like ikiwiki. This gives the
|
|
|
|
plugin full access to ikiwiki's internals, and is the most efficient.
|
|
|
|
However, plugins can actually be written in any language that supports XML
|
|
|
|
RPC. These are called [[external]] plugins.
|
|
|
|
|
|
|
|
A plugin written in perl is a perl module, in the `IkiWiki::Plugin`
|
|
|
|
namespace. The name of the plugin is typically in lowercase, such as
|
|
|
|
`IkiWiki::Plugin::inline`. Ikiwiki includes a `IkiWiki::Plugin::skeleton`
|
|
|
|
that can be fleshed out to make a useful plugin.
|
|
|
|
`IkiWiki::Plugin::pagecount` is another simple example. All perl plugins
|
|
|
|
should `use IkiWiki` to import the ikiwiki plugin interface. It's a good
|
|
|
|
idea to include the version number of the plugin interface that your plugin
|
|
|
|
expects: `use IkiWiki 2.00`.
|
|
|
|
|
|
|
|
An external plugin is an executable program. It can be written in any
|
|
|
|
language. Its interface to ikiwiki is via XML RPC, which it reads from
|
|
|
|
ikiwiki on its standard input, and writes to ikiwiki on its standard
|
|
|
|
output. For more details on writing external plugins, see [[external]].
|
|
|
|
|
|
|
|
Despite these two types of plugins having such different interfaces,
|
|
|
|
they're the same as far as how they hook into ikiwiki. This document will
|
|
|
|
explain how to write both sorts of plugins, albeit with an emphasis on perl
|
|
|
|
plugins.
|
2006-05-02 04:34:33 +02:00
|
|
|
|
2006-09-07 17:42:01 +02:00
|
|
|
## Considerations
|
2006-05-02 04:34:33 +02:00
|
|
|
|
|
|
|
One thing to keep in mind when writing a plugin is that ikiwiki is a wiki
|
|
|
|
*compiler*. So plugins influence pages when they are built, not when they
|
|
|
|
are loaded. A plugin that inserts the current time into a page, for
|
|
|
|
example, will insert the build time. Also, as a compiler, ikiwiki avoids
|
|
|
|
rebuilding pages unless they have changed, so a plugin that prints some
|
|
|
|
random or changing thing on a page will generate a static page that won't
|
|
|
|
change until ikiwiki rebuilds the page for some other reason, like the page
|
|
|
|
being edited.
|
|
|
|
|
2006-09-07 17:42:01 +02:00
|
|
|
## Registering plugins
|
2006-05-02 04:34:33 +02:00
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
Plugins should, when imported, call `hook()` to hook into ikiwiki's
|
2006-05-04 06:29:37 +02:00
|
|
|
processing. The function uses named parameters, and use varies depending on
|
2008-07-10 06:36:57 +02:00
|
|
|
the type of hook being registered -- see below. A plugin can call
|
|
|
|
the function more than once to register multiple hooks.
|
|
|
|
|
|
|
|
All calls to `hook()` should be passed a "type" parameter, which gives the
|
|
|
|
type of hook, a "id" parameter, which should be a unique string for this
|
|
|
|
plugin, and a "call" parameter, which tells what function to call for the
|
|
|
|
hook.
|
2006-05-02 04:34:33 +02:00
|
|
|
|
2006-11-20 21:37:27 +01:00
|
|
|
An optional "last" parameter, if set to a true value, makes the hook run
|
|
|
|
after all other hooks of its type. Useful if the hook depends on some other
|
|
|
|
hook being run first.
|
|
|
|
|
2006-09-07 17:42:01 +02:00
|
|
|
## Types of hooks
|
2006-05-02 04:34:33 +02:00
|
|
|
|
2006-08-23 03:54:40 +02:00
|
|
|
In roughly the order they are called.
|
2006-05-03 22:31:16 +02:00
|
|
|
|
2006-09-07 17:42:01 +02:00
|
|
|
### getopt
|
2006-07-28 07:26:49 +02:00
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
hook(type => "getopt", id => "foo", call => \&getopt);
|
2006-07-28 07:26:49 +02:00
|
|
|
|
|
|
|
This allows for plugins to perform their own processing of command-line
|
|
|
|
options and so add options to the ikiwiki command line. It's called during
|
|
|
|
command line processing, with @ARGV full of any options that ikiwiki was
|
|
|
|
not able to process on its own. The function should process any options it
|
2006-07-28 07:36:37 +02:00
|
|
|
can, removing them from @ARGV, and probably recording the configuration
|
2006-09-10 00:50:27 +02:00
|
|
|
settings in %config. It should take care not to abort if it sees
|
2006-07-28 07:26:49 +02:00
|
|
|
an option it cannot process, and should just skip over those options and
|
|
|
|
leave them in @ARGV.
|
|
|
|
|
2006-09-07 17:42:01 +02:00
|
|
|
### checkconfig
|
2006-05-03 22:43:55 +02:00
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
hook(type => "checkconfig", id => "foo", call => \&checkconfig);
|
2006-05-03 22:43:55 +02:00
|
|
|
|
2006-07-28 07:36:37 +02:00
|
|
|
This is useful if the plugin needs to check for or modify ikiwiki's
|
|
|
|
configuration. It's called early in the startup process. The
|
2006-05-04 06:29:37 +02:00
|
|
|
function is passed no values. It's ok for the function to call
|
2006-09-10 00:50:27 +02:00
|
|
|
`error()` if something isn't configured right.
|
2006-05-04 06:29:37 +02:00
|
|
|
|
2008-01-29 19:07:17 +01:00
|
|
|
### refresh
|
|
|
|
|
|
|
|
hook(type => "refresh", id => "foo", call => \&refresh);
|
|
|
|
|
|
|
|
This hook is called just before ikiwiki scans the wiki for changed files.
|
|
|
|
It's useful for plugins that need to create or modify a source page. The
|
|
|
|
function is passed no values.
|
|
|
|
|
2007-05-09 02:48:09 +02:00
|
|
|
### needsbuild
|
|
|
|
|
|
|
|
hook(type => "needsbuild", id => "foo", call => \&needsbuild);
|
|
|
|
|
2008-01-29 19:07:17 +01:00
|
|
|
This allows a plugin to manipulate the list of files that need to be
|
2007-05-09 02:48:09 +02:00
|
|
|
built when the wiki is refreshed. The function is passed a reference to an
|
|
|
|
array of pages that will be rebuilt, and can modify the array, either
|
|
|
|
adding or removing files from it.
|
|
|
|
|
2008-07-10 06:36:57 +02:00
|
|
|
### scan
|
|
|
|
|
|
|
|
hook(type => "scan", id => "foo", call => \&scan);
|
|
|
|
|
|
|
|
This hook is called early in the process of building the wiki, and is used
|
|
|
|
as a first pass scan of the page, to collect metadata about the page. It's
|
|
|
|
mostly used to scan the page for WikiLinks, and add them to `%links`.
|
|
|
|
Present in IkiWiki 2.40 and later.
|
|
|
|
|
|
|
|
The function is passed named parameters "page" and "content". Its return
|
|
|
|
value is ignored.
|
|
|
|
|
2006-09-07 17:42:01 +02:00
|
|
|
### filter
|
2006-05-04 06:29:37 +02:00
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
hook(type => "filter", id => "foo", call => \&filter);
|
2006-05-04 06:29:37 +02:00
|
|
|
|
|
|
|
Runs on the raw source of a page, before anything else touches it, and can
|
2007-05-17 21:55:11 +02:00
|
|
|
make arbitrary changes. The function is passed named parameters "page",
|
|
|
|
"destpage", and "content". It should return the filtered content.
|
2006-05-05 07:41:11 +02:00
|
|
|
|
2006-09-07 17:42:01 +02:00
|
|
|
### preprocess
|
2006-08-23 03:54:40 +02:00
|
|
|
|
2007-12-08 21:59:08 +01:00
|
|
|
Adding a [[ikiwiki/PreProcessorDirective]] is probably the most common use
|
|
|
|
of a plugin.
|
2006-08-23 03:54:40 +02:00
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
hook(type => "preprocess", id => "foo", call => \&preprocess);
|
2006-08-23 03:54:40 +02:00
|
|
|
|
2008-07-31 22:27:32 +02:00
|
|
|
Replace "foo" with the command name that will be used for the preprocessor
|
2007-03-06 23:37:05 +01:00
|
|
|
directive.
|
2006-08-23 03:54:40 +02:00
|
|
|
|
2008-07-31 22:27:32 +02:00
|
|
|
Each time the directive is processed, the referenced function (`preprocess`
|
|
|
|
in the example above) is called. Whatever the function returns goes onto
|
|
|
|
the page in place of the directive. Or, if the function aborts using
|
|
|
|
`error()`, the directive will be replaced with the error message.
|
|
|
|
|
|
|
|
The function is passed named parameters. First come the parameters set
|
|
|
|
in the preprocessor directive. These are passed in the same order as
|
|
|
|
they're in the directive, and if the preprocessor directive contains a bare
|
|
|
|
parameter (example: `\[[!foo param]]`), that parameter will be passed with
|
|
|
|
an empty value.
|
|
|
|
|
|
|
|
After the parameters from the preprocessor directive some additional ones
|
|
|
|
are passed: A "page" parameter gives the name of the page that embedded the
|
|
|
|
preprocessor directive, while a "destpage" parameter gives the name of the
|
|
|
|
page the content is going to (different for inlined pages), and a "preview"
|
|
|
|
parameter is set to a true value if the page is being previewed.
|
|
|
|
|
|
|
|
If `hook` is passed an optional "scan" parameter, set to a true value, this
|
|
|
|
makes the hook be called during the preliminary scan that ikiwiki makes of
|
|
|
|
updated pages, before begining to render pages. This should be done if the
|
|
|
|
hook modifies data in `%links`. Note that doing so will make the hook be
|
|
|
|
run twice per page build, so avoid doing it for expensive hooks. (As an
|
|
|
|
optimisation, if your preprocessor hook is called in a void context, you
|
|
|
|
can assume it's being run in scan mode, and avoid doing expensive things at
|
|
|
|
that point.)
|
2007-05-06 19:10:34 +02:00
|
|
|
|
2006-08-23 03:54:40 +02:00
|
|
|
Note that if the [[htmlscrubber]] is enabled, html in
|
2007-12-08 21:59:08 +01:00
|
|
|
[[ikiwiki/PreProcessorDirective]] output is sanitised, which may limit what
|
|
|
|
your plugin can do. Also, the rest of the page content is not in html
|
|
|
|
format at preprocessor time. Text output by a preprocessor directive will
|
|
|
|
be linkified and passed through markdown (or whatever engine is used to
|
|
|
|
htmlize the page) along with the rest of the page.
|
2006-08-23 03:54:40 +02:00
|
|
|
|
2008-02-12 04:48:27 +01:00
|
|
|
### linkify
|
|
|
|
|
|
|
|
hook(type => "linkify", id => "foo", call => \&linkify);
|
|
|
|
|
|
|
|
This hook is called to convert [[WikiLinks|WikiLink]] on the page into html
|
|
|
|
links. The function is passed named parameters "page", "destpage", and
|
2008-03-28 05:57:49 +01:00
|
|
|
"content". It should return the linkified content. Present in IkiWiki 2.40
|
|
|
|
and later.
|
2008-02-12 04:48:27 +01:00
|
|
|
|
|
|
|
Plugins that implement linkify must also implement a scan hook, that scans
|
|
|
|
for the links on the page and adds them to `%links`.
|
|
|
|
|
2006-09-07 17:42:01 +02:00
|
|
|
### htmlize
|
2006-07-04 00:08:04 +02:00
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
hook(type => "htmlize", id => "ext", call => \&htmlize);
|
2006-07-04 00:08:04 +02:00
|
|
|
|
2008-07-10 06:36:57 +02:00
|
|
|
Runs on the source of a page and turns it into html. The id parameter
|
2006-07-04 00:08:04 +02:00
|
|
|
specifies the filename extension that a file must have to be htmlized using
|
|
|
|
this plugin. This is how you can add support for new and exciting markup
|
|
|
|
languages to ikiwiki.
|
|
|
|
|
2006-08-28 20:17:59 +02:00
|
|
|
The function is passed named parameters: "page" and "content" and should
|
|
|
|
return the htmlized content.
|
|
|
|
|
2006-09-07 17:42:01 +02:00
|
|
|
### pagetemplate
|
2006-05-26 03:10:58 +02:00
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
hook(type => "pagetemplate", id => "foo", call => \&pagetemplate);
|
2006-05-26 03:10:58 +02:00
|
|
|
|
2007-08-21 06:35:22 +02:00
|
|
|
[[Templates|wikitemplates]] are filled out for many different things in
|
2007-07-26 22:50:55 +02:00
|
|
|
ikiwiki, like generating a page, or part of a blog page, or an rss feed, or
|
|
|
|
a cgi. This hook allows modifying the variables available on those
|
|
|
|
templates. The function is passed named parameters. The "page" and
|
|
|
|
"destpage" parameters are the same as for a preprocess hook. The "template"
|
2008-07-21 13:31:57 +02:00
|
|
|
parameter is a [[!cpan HTML::Template]] object that is the template that
|
2007-07-26 22:50:55 +02:00
|
|
|
will be used to generate the page. The function can manipulate that
|
|
|
|
template object.
|
2006-07-28 01:08:03 +02:00
|
|
|
|
2007-05-28 20:22:20 +02:00
|
|
|
The most common thing to do is probably to call `$template->param()` to add
|
2006-08-12 19:51:32 +02:00
|
|
|
a new custom parameter to the template.
|
2006-05-26 03:10:58 +02:00
|
|
|
|
2007-07-26 22:50:55 +02:00
|
|
|
### templatefile
|
|
|
|
|
|
|
|
hook(type => "templatefile", id => "foo", call => \&templatefile);
|
|
|
|
|
2007-11-17 22:32:51 +01:00
|
|
|
This hook allows plugins to change the [[template|wikitemplates]] that is
|
2007-07-26 22:50:55 +02:00
|
|
|
used for a page in the wiki. The hook is passed a "page" parameter, and
|
|
|
|
should return the name of the template file to use, or undef if it doesn't
|
|
|
|
want to change the default ("page.tmpl"). Template files are looked for in
|
|
|
|
/usr/share/ikiwiki/templates by default.
|
|
|
|
|
2006-09-07 17:42:01 +02:00
|
|
|
### sanitize
|
2006-06-02 08:11:22 +02:00
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
hook(type => "sanitize", id => "foo", call => \&sanitize);
|
2006-06-02 08:11:22 +02:00
|
|
|
|
|
|
|
Use this to implement html sanitization or anything else that needs to
|
2006-08-04 09:41:02 +02:00
|
|
|
modify the body of a page after it has been fully converted to html.
|
2006-08-28 20:17:59 +02:00
|
|
|
|
2008-06-04 07:24:23 +02:00
|
|
|
The function is passed named parameters: "page", "destpage", and "content",
|
|
|
|
and should return the sanitized content.
|
2006-06-02 08:11:22 +02:00
|
|
|
|
2008-07-17 21:16:56 +02:00
|
|
|
### postscan
|
|
|
|
|
|
|
|
hook(type => "postscan", id => "foo", call => \&postscan);
|
|
|
|
|
|
|
|
This hook is called once the full page body is available (but before the
|
|
|
|
format hook). The most common use is to update search indexes. Added in
|
|
|
|
ikiwiki 2.54.
|
|
|
|
|
|
|
|
The function is passed named parameters "page" and "content". Its return
|
|
|
|
value is ignored.
|
|
|
|
|
2006-09-07 17:42:01 +02:00
|
|
|
### format
|
2006-08-04 09:41:02 +02:00
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
hook(type => "format", id => "foo", call => \&format);
|
2006-08-04 09:41:02 +02:00
|
|
|
|
2006-08-28 20:17:59 +02:00
|
|
|
The difference between format and sanitize is that sanitize only acts on
|
|
|
|
the page body, while format can modify the entire html page including the
|
2008-06-29 05:08:24 +02:00
|
|
|
header and footer inserted by ikiwiki, the html document type, etc. (It
|
|
|
|
should not rely on always being passed the entire page, as it won't be
|
|
|
|
when the page is being previewed.)
|
2006-08-28 20:17:59 +02:00
|
|
|
|
|
|
|
The function is passed named parameters: "page" and "content", and
|
|
|
|
should return the formatted content.
|
2006-08-04 09:41:02 +02:00
|
|
|
|
2006-09-07 17:42:01 +02:00
|
|
|
### delete
|
2006-05-03 22:31:16 +02:00
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
hook(type => "delete", id => "foo", call => \&delete);
|
2006-05-03 22:31:16 +02:00
|
|
|
|
2006-05-04 06:29:37 +02:00
|
|
|
Each time a page or pages is removed from the wiki, the referenced function
|
|
|
|
is called, and passed the names of the source files that were removed.
|
2006-05-03 22:31:16 +02:00
|
|
|
|
2006-09-07 17:42:01 +02:00
|
|
|
### change
|
2006-05-03 22:31:16 +02:00
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
hook(type => "change", id => "foo", call => \&render);
|
2006-05-03 22:31:16 +02:00
|
|
|
|
2006-05-05 07:10:00 +02:00
|
|
|
Each time ikiwiki renders a change or addition (but not deletion) to the
|
|
|
|
wiki, the referenced function is called, and passed the names of the
|
|
|
|
source files that were rendered.
|
2006-05-03 22:31:16 +02:00
|
|
|
|
2006-09-07 17:42:01 +02:00
|
|
|
### cgi
|
2006-05-03 23:03:35 +02:00
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
hook(type => "cgi", id => "foo", call => \&cgi);
|
2006-05-03 23:03:35 +02:00
|
|
|
|
2006-05-04 06:29:37 +02:00
|
|
|
Use this to hook into ikiwiki's cgi script. Each registered cgi hook is
|
|
|
|
called in turn, and passed a CGI object. The hook should examine the
|
2008-02-03 06:23:04 +01:00
|
|
|
parameters, and if it will handle this CGI request, output a page
|
|
|
|
(including the http headers) and terminate the program.
|
|
|
|
|
|
|
|
Note that cgi hooks are called as early as possible, before any ikiwiki
|
|
|
|
state is loaded, and with no session information.
|
2006-05-03 23:03:35 +02:00
|
|
|
|
2006-11-20 14:01:27 +01:00
|
|
|
### auth
|
2006-11-20 02:52:18 +01:00
|
|
|
|
2006-11-20 21:37:27 +01:00
|
|
|
hook(type => "auth", id => "foo", call => \&auth);
|
2006-11-20 02:52:18 +01:00
|
|
|
|
2008-07-10 06:36:57 +02:00
|
|
|
This hook can be used to implement an authentication method. When a user
|
|
|
|
needs to be authenticated, each registered auth hook is called in turn, and
|
|
|
|
passed a CGI object and a session object.
|
2006-11-20 02:52:18 +01:00
|
|
|
|
|
|
|
If the hook is able to authenticate the user, it should set the session
|
|
|
|
object's "name" parameter to the authenticated user's name. Note that
|
|
|
|
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.
|
|
|
|
|
2007-08-05 23:38:27 +02:00
|
|
|
### sessioncgi
|
|
|
|
|
|
|
|
hook(type => "sessioncgi", id => "foo", call => \&sessioncgi);
|
|
|
|
|
|
|
|
Unlike the cgi hook, which is run as soon as possible, the sessioncgi hook
|
|
|
|
is only run once a session object is available. It is passed both a CGI
|
|
|
|
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.
|
|
|
|
|
2007-02-02 03:33:03 +01:00
|
|
|
### 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 the hook has no opinion about whether the edit can proceed, return
|
2008-01-07 22:34:13 +01:00
|
|
|
`undef`, and the next plugin will be asked to decide. 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, or a function
|
|
|
|
that can be run to log the user in or perform other action necessary for
|
|
|
|
them to be able to edit the page.
|
|
|
|
|
|
|
|
This hook should avoid directly redirecting the user to a signin page,
|
|
|
|
since it's sometimes used to test to see which pages in a set of pages a
|
|
|
|
user can edit.
|
2007-02-02 03:33:03 +01:00
|
|
|
|
2007-08-26 23:33:25 +02:00
|
|
|
### editcontent
|
|
|
|
|
|
|
|
hook(type => "editcontent", id => "foo", call => \&editcontent);
|
|
|
|
|
|
|
|
This hook is called when a page is saved (or previewed) using the web
|
|
|
|
interface. It is passed named parameters: `content`, `page`, `cgi`, and
|
|
|
|
`session`. These are, respectively, the new page content as entered by the
|
|
|
|
user, the page name, a `CGI` object, and the user's `CGI::Session`.
|
|
|
|
|
|
|
|
It can modify the content as desired, and should return the content.
|
|
|
|
|
2006-11-20 21:37:27 +01:00
|
|
|
### formbuilder
|
|
|
|
|
|
|
|
hook(type => "formbuilder_setup", id => "foo", call => \&formbuilder_setup);
|
|
|
|
hook(type => "formbuilder", id => "foo", call => \&formbuilder);
|
|
|
|
|
2008-07-21 13:31:57 +02:00
|
|
|
These hooks allow tapping into the parts of ikiwiki that use [[!cpan
|
2006-11-20 21:37:27 +01:00
|
|
|
CGI::FormBuilder]] to generate web forms. These hooks are passed named
|
2007-08-17 07:34:59 +02:00
|
|
|
parameters: `cgi`, `session`, `form`, and `buttons`. These are, respectively,
|
|
|
|
the `CGI` object, the user's `CGI::Session`, a `CGI::FormBuilder`, and a
|
|
|
|
reference to an array of names of buttons to go on the form.
|
2006-11-20 21:37:27 +01:00
|
|
|
|
2007-04-07 03:34:14 +02:00
|
|
|
Each time a form is set up, the `formbuilder_setup` hook is called.
|
|
|
|
Typically the `formbuilder_setup` hook will check the form's title, and if
|
2006-11-20 21:37:27 +01:00
|
|
|
it's a form that it needs to modify, will call various methods to
|
|
|
|
add/remove/change fields, tweak the validation code for the fields, etc. It
|
|
|
|
will not validate or display the form.
|
|
|
|
|
2007-12-12 09:01:15 +01:00
|
|
|
Just before a form is displayed to the user, the `formbuilder` hook is
|
|
|
|
called. It can be used to validate the form, but should not display it.
|
2006-11-20 21:37:27 +01:00
|
|
|
|
2006-09-07 17:42:01 +02:00
|
|
|
### savestate
|
2006-07-30 02:20:11 +02:00
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
hook(type => "savestate", id => "foo", call => \&savestate);
|
2006-07-30 02:20:11 +02:00
|
|
|
|
2008-07-10 06:36:57 +02:00
|
|
|
This hook is called whenever ikiwiki normally saves its state, just before
|
2006-07-30 02:20:11 +02:00
|
|
|
the state is saved. The function can save other state, modify values before
|
|
|
|
they're saved, etc.
|
|
|
|
|
2008-07-24 00:14:20 +02:00
|
|
|
## renamepage
|
|
|
|
|
|
|
|
hook(type => "renamepage", id => "foo", call => \&renamepage);
|
|
|
|
|
|
|
|
This hook is called by the [[plugins/rename]] plugin when it renames
|
|
|
|
something. The hook is passed named parameters: `page`, `oldpage`,
|
|
|
|
`newpage`, and `content`, and should try to modify the content to reflect
|
|
|
|
the name change. For example, by converting links to point to the new page.
|
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
## Plugin interface
|
|
|
|
|
|
|
|
To import the ikiwiki plugin interface:
|
|
|
|
|
2008-07-10 06:36:57 +02:00
|
|
|
use IkiWiki '2.00';
|
2006-08-23 03:54:40 +02:00
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
This will import several variables and functions into your plugin's
|
|
|
|
namespace. These variables and functions are the ones most plugins need,
|
|
|
|
and a special effort will be made to avoid changing them in incompatible
|
|
|
|
ways, and to document any changes that have to be made in the future.
|
2006-08-23 03:54:40 +02:00
|
|
|
|
2007-08-13 05:07:31 +02:00
|
|
|
Note that IkiWiki also provides other variables and functions that are not
|
2006-09-10 00:50:27 +02:00
|
|
|
exported by default. No guarantee is made about these in the future, so if
|
|
|
|
it's not exported, the wise choice is to not use it.
|
2006-05-02 04:34:33 +02:00
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
### %config
|
|
|
|
|
|
|
|
A plugin can access the wiki's configuration via the `%config`
|
2006-05-04 06:29:37 +02:00
|
|
|
hash. The best way to understand the contents of the hash is to look at
|
2006-05-02 04:34:33 +02:00
|
|
|
[[ikiwiki.setup]], which sets the hash content to configure the wiki.
|
|
|
|
|
2007-12-08 23:40:50 +01:00
|
|
|
### %pagestate
|
|
|
|
|
|
|
|
The `%pagestate` hash can be used by plugins to save state that they will need
|
|
|
|
next time ikiwiki is run. The hash holds per-page state, so to set a value,
|
|
|
|
use `%pagestate{$page}{$id}{$key}=$value`, and to retrieve the value,
|
|
|
|
use `%pagestate{$page}{$id}{$key}`.
|
|
|
|
|
2008-06-01 18:59:33 +02:00
|
|
|
The `$value` can be anything that perl's Storable module is capable of
|
|
|
|
serializing. `$key` can be any string you like, but `$id` must be the same
|
|
|
|
as the "id" parameter passed to `hook()` when registering the plugin. This
|
|
|
|
is so ikiwiki can know when to delete pagestate for plugins that are no
|
|
|
|
longer used.
|
2007-12-08 23:40:50 +01:00
|
|
|
|
|
|
|
When pages are deleted, ikiwiki automatically deletes their pagestate too.
|
|
|
|
|
2007-12-16 22:19:16 +01:00
|
|
|
Note that page state does not persist across wiki rebuilds, only across
|
|
|
|
wiki updates.
|
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
### Other variables
|
2006-05-02 04:34:33 +02:00
|
|
|
|
|
|
|
If your plugin needs to access data about other pages in the wiki. It can
|
|
|
|
use the following hashes, using a page name as the key:
|
|
|
|
|
2007-08-13 05:07:31 +02:00
|
|
|
* `%links` lists the names of each page that a page links to, in an array
|
2006-09-10 00:50:27 +02:00
|
|
|
reference.
|
2007-04-10 03:18:03 +02:00
|
|
|
* `%destsources` contains the name of the source file used to create each
|
|
|
|
destination file.
|
|
|
|
* `%pagesources` contains the name of the source file for each page.
|
2006-09-10 00:50:27 +02:00
|
|
|
|
2006-10-09 01:57:37 +02:00
|
|
|
Also, the %IkiWiki::version variable contains the version number for the
|
|
|
|
ikiwiki program.
|
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
### Library functions
|
|
|
|
|
|
|
|
#### `hook(@)`
|
|
|
|
|
|
|
|
Hook into ikiwiki's processing. See the discussion of hooks above.
|
|
|
|
|
2006-10-15 21:33:52 +02:00
|
|
|
Note that in addition to the named parameters described above, a parameter
|
2007-05-28 20:22:20 +02:00
|
|
|
named `no_override` is supported, If it's set to a true value, then this hook
|
2006-10-15 21:33:52 +02:00
|
|
|
will not override any existing hook with the same id. This is useful if
|
|
|
|
the id can be controled by the user.
|
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
#### `debug($)`
|
|
|
|
|
|
|
|
Logs a debugging message. These are supressed unless verbose mode is turned
|
|
|
|
on.
|
|
|
|
|
2007-02-15 03:22:08 +01:00
|
|
|
#### `error($;$)`
|
2006-09-10 00:50:27 +02:00
|
|
|
|
2007-02-15 03:22:08 +01:00
|
|
|
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.
|
2006-09-10 00:50:27 +02:00
|
|
|
|
2008-07-13 20:41:40 +02:00
|
|
|
If called inside a preprocess hook, error() does not abort the entire
|
|
|
|
wiki build, but instead replaces the [[ikiwiki/PreProcessorDirective]] with
|
|
|
|
a version containing the error message.
|
|
|
|
|
|
|
|
In other hooks, error() is a fatal error, so use with care. Try to avoid
|
|
|
|
dying on bad input when building a page, as that will halt
|
|
|
|
the entire wiki build and make the wiki unusable.
|
2006-09-10 00:50:27 +02:00
|
|
|
|
|
|
|
#### `template($;@)`
|
|
|
|
|
2008-07-21 13:31:57 +02:00
|
|
|
Creates and returns a [[!cpan HTML::Template]] object. The first parameter
|
2006-11-20 21:37:27 +01:00
|
|
|
is the name of the file in the template directory. The optional remaining
|
2007-05-28 20:22:20 +02:00
|
|
|
parameters are passed to `HTML::Template->new`.
|
2006-09-10 00:50:27 +02:00
|
|
|
|
|
|
|
#### `htmlpage($)`
|
|
|
|
|
|
|
|
Passed a page name, returns the base name that will be used for a the html
|
|
|
|
page created from it. (Ie, it appends ".html".)
|
|
|
|
|
|
|
|
#### `add_depends($$)`
|
|
|
|
|
2007-12-08 21:59:08 +01:00
|
|
|
Makes the specified page depend on the specified [[ikiwiki/PageSpec]].
|
2006-09-10 00:50:27 +02:00
|
|
|
|
2007-04-27 04:55:52 +02:00
|
|
|
#### `pagespec_match($$;@)`
|
2006-09-10 00:50:27 +02:00
|
|
|
|
2007-12-08 21:59:08 +01:00
|
|
|
Passed a page name, and [[ikiwiki/PageSpec]], returns true if the
|
|
|
|
[[ikiwiki/PageSpec]] matches the page.
|
2007-04-27 04:55:52 +02:00
|
|
|
|
|
|
|
Additional named parameters can be passed, to further limit the match.
|
|
|
|
The most often used is "location", which specifies the location the
|
|
|
|
PageSpec should match against. If not passed, relative PageSpecs will match
|
|
|
|
relative to the top of the wiki.
|
2006-09-10 00:50:27 +02:00
|
|
|
|
|
|
|
#### `bestlink($$)`
|
|
|
|
|
|
|
|
Given a page and the text of a link on the page, determine which
|
|
|
|
existing page that link best points to. Prefers pages under a
|
|
|
|
subdirectory with the same name as the source page, failing that
|
|
|
|
goes down the directory tree to the base looking for matching
|
2007-12-08 21:59:08 +01:00
|
|
|
pages, as described in [[ikiwiki/SubPage/LinkingRules]].
|
2006-09-10 00:50:27 +02:00
|
|
|
|
2007-02-20 04:05:47 +01:00
|
|
|
#### `htmllink($$$;@)`
|
2006-07-28 01:47:13 +02:00
|
|
|
|
|
|
|
Many plugins need to generate html links and add them to a page. This is
|
2006-09-10 00:50:27 +02:00
|
|
|
done by using the `htmllink` function. The usual way to call
|
|
|
|
`htmlllink` is:
|
2006-07-28 06:43:45 +02:00
|
|
|
|
|
|
|
htmllink($page, $page, $link)
|
2006-07-28 01:47:13 +02:00
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
Why is `$page` repeated? Because if a page is inlined inside another, and a
|
2006-07-28 01:47:13 +02:00
|
|
|
link is placed on it, the right way to make that link is actually:
|
2006-07-28 06:43:45 +02:00
|
|
|
|
|
|
|
htmllink($page, $destpage, $link)
|
2006-07-28 01:47:13 +02:00
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
Here `$destpage` is the inlining page. A `destpage` parameter is passed to
|
|
|
|
some of the hook functions above; the ones that are not passed it are not used
|
2006-07-28 01:47:13 +02:00
|
|
|
during inlining and don't need to worry about this issue.
|
|
|
|
|
2007-02-20 04:05:47 +01:00
|
|
|
After the three required parameters, named parameters can be used to
|
|
|
|
control some options. These are:
|
2006-09-10 00:50:27 +02:00
|
|
|
|
2007-02-20 04:05:47 +01:00
|
|
|
* 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
|
2007-09-22 18:32:24 +02:00
|
|
|
* rel - set to add a rel attribute to the link
|
|
|
|
* class - set to add a css class to the link
|
2006-09-10 00:50:27 +02:00
|
|
|
|
|
|
|
#### `readfile($;$)`
|
|
|
|
|
|
|
|
Given a filename, reads and returns the entire file.
|
|
|
|
|
|
|
|
The optional second parameter, if set to a true value, makes the file be read
|
|
|
|
in binary mode.
|
|
|
|
|
|
|
|
A failure to read the file will result in it dying with an error.
|
|
|
|
|
2007-02-15 03:22:08 +01:00
|
|
|
#### `writefile($$$;$$)`
|
2006-09-10 00:50:27 +02:00
|
|
|
|
|
|
|
Given a filename, a directory to put it in, and the file's content,
|
|
|
|
writes a file.
|
|
|
|
|
2007-02-15 03:22:08 +01:00
|
|
|
The optional fourth parameter, if set to a true value, makes the file be
|
2006-09-10 00:50:27 +02:00
|
|
|
written in binary mode.
|
|
|
|
|
2007-02-15 03:22:08 +01:00
|
|
|
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.)
|
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
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.
|
|
|
|
|
2007-06-15 19:30:20 +02:00
|
|
|
#### `will_render($$)`
|
2006-10-08 23:56:50 +02:00
|
|
|
|
|
|
|
Given a page name and a destination file name (not including the base
|
|
|
|
destination directory), register that the page will result in that file
|
2008-02-05 00:34:47 +01:00
|
|
|
being rendered.
|
|
|
|
|
|
|
|
It's important to call this before writing to any file in the destination
|
|
|
|
directory, and it's important to call it consistently every time, even if
|
|
|
|
the file isn't really written this time -- unless you delete any old
|
|
|
|
version of the file. In particular, in preview mode, this should still be
|
|
|
|
called even if the file isn't going to be written to during the preview.
|
2006-10-08 23:56:50 +02:00
|
|
|
|
2007-09-22 20:46:25 +02:00
|
|
|
Ikiwiki uses this information to automatically clean up rendered files when
|
2008-03-12 18:34:44 +01:00
|
|
|
the page that rendered them goes away or is changed to no longer render
|
2007-09-22 20:46:25 +02:00
|
|
|
them. will_render also does a few important security checks.
|
|
|
|
|
2006-09-10 00:50:27 +02:00
|
|
|
#### `pagetype($)`
|
|
|
|
|
|
|
|
Given the name of a source file, returns the type of page it is, if it's
|
|
|
|
a type that ikiwiki knowns how to htmlize. Otherwise, returns undef.
|
|
|
|
|
|
|
|
#### `pagename($)`
|
|
|
|
|
|
|
|
Given the name of a source file, returns the name of the wiki page
|
|
|
|
that corresponds to that file.
|
|
|
|
|
2008-05-02 19:02:07 +02:00
|
|
|
#### `srcfile($;$)`
|
2006-09-10 00:50:27 +02:00
|
|
|
|
|
|
|
Given the name of a source file in the wiki, searches for the file in
|
2007-08-28 03:59:01 +02:00
|
|
|
the source directory and the underlay directories (most recently added
|
|
|
|
underlays first), and returns the full path to the first file found.
|
|
|
|
|
2008-05-02 19:02:07 +02:00
|
|
|
Normally srcfile will fail with an error message if the source file cannot
|
|
|
|
be found. The second parameter can be set to a true value to make it return
|
|
|
|
undef instead.
|
|
|
|
|
2007-08-28 03:59:01 +02:00
|
|
|
#### `add_underlay($)`
|
|
|
|
|
|
|
|
Adds a directory to the set of underlay directories that ikiwiki will
|
|
|
|
search for files.
|
|
|
|
|
|
|
|
If the directory name is not absolute, ikiwiki will assume it is in
|
|
|
|
the parent directory of the configured underlaydir.
|
2006-09-10 00:50:27 +02:00
|
|
|
|
2007-11-13 22:14:48 +01:00
|
|
|
#### `displaytime($;$)`
|
2006-09-10 00:50:27 +02:00
|
|
|
|
|
|
|
Given a time, formats it for display.
|
|
|
|
|
2007-11-13 22:14:48 +01:00
|
|
|
The optional second parameter is a strftime format to use to format the
|
|
|
|
time.
|
|
|
|
|
2006-12-29 05:38:40 +01:00
|
|
|
#### `gettext`
|
|
|
|
|
|
|
|
This is the standard gettext function, although slightly optimised.
|
|
|
|
|
2008-07-25 22:16:44 +02:00
|
|
|
#### `urlto($$;$)`
|
2007-04-01 21:59:42 +02:00
|
|
|
|
2007-07-17 22:09:16 +02:00
|
|
|
Construct a relative url to the first parameter from the page named by the
|
|
|
|
second. The first parameter can be either a page name, or some other
|
|
|
|
destination file, as registered by `will_render`.
|
2007-04-01 21:59:42 +02:00
|
|
|
|
2008-07-25 22:16:44 +02:00
|
|
|
If the third parameter is passed and is true, an absolute url will be
|
|
|
|
constructed instead of the default relative url.
|
|
|
|
|
2007-04-01 21:59:42 +02:00
|
|
|
#### `targetpage($$)`
|
|
|
|
|
|
|
|
Passed a page and an extension, returns the filename that page will be
|
|
|
|
rendered to.
|
|
|
|
|
2008-07-10 06:19:35 +02:00
|
|
|
## Miscellaneous
|
|
|
|
|
|
|
|
### Internal use pages
|
2008-01-29 21:05:49 +01:00
|
|
|
|
2008-01-29 23:16:51 +01:00
|
|
|
Sometimes it's useful to put pages in the wiki without the overhead of
|
|
|
|
having them be rendered to individual html files. Such internal use pages
|
|
|
|
are collected together to form the RecentChanges page, for example.
|
2008-01-29 21:05:49 +01:00
|
|
|
|
|
|
|
To make an internal use page, register a filename extension that starts
|
2008-01-29 23:16:51 +01:00
|
|
|
with "_". Internal use pages cannot be edited with the web interface,
|
|
|
|
generally shouldn't contain wikilinks or preprocessor directives (use
|
|
|
|
either on them with extreme caution), and are not matched by regular
|
|
|
|
PageSpecs glob patterns, but instead only by a special `internal()`
|
|
|
|
[[ikiwiki/PageSpec]].
|
2008-01-29 21:05:49 +01:00
|
|
|
|
2008-07-10 06:19:35 +02:00
|
|
|
### RCS plugins
|
2006-05-02 20:44:39 +02:00
|
|
|
|
2007-08-21 06:25:03 +02:00
|
|
|
ikiwiki's support for [[revision_control_systems|rcs]] also uses pluggable
|
|
|
|
perl modules. These are in the `IkiWiki::RCS` namespace, for example
|
2006-05-02 20:44:39 +02:00
|
|
|
`IkiWiki::RCS::svn`.
|
|
|
|
|
2007-05-28 20:22:20 +02:00
|
|
|
Each RCS plugin must support all the `IkiWiki::rcs_*` functions.
|
2006-05-02 20:44:39 +02:00
|
|
|
See IkiWiki::RCS::Stub for the full list of functions. It's ok if
|
2007-05-28 20:22:20 +02:00
|
|
|
`rcs_getctime` does nothing except for throwing an error.
|
2006-05-04 16:59:30 +02:00
|
|
|
|
2007-08-21 06:25:03 +02:00
|
|
|
See [[RCS_details|rcs/details]] for some more info.
|
2007-02-12 03:44:47 +01:00
|
|
|
|
2008-07-10 06:19:35 +02:00
|
|
|
### PageSpec plugins
|
2007-02-12 03:44:47 +01:00
|
|
|
|
|
|
|
It's also possible to write plugins that add new functions to
|
2007-12-08 21:59:08 +01:00
|
|
|
[[PageSpecs|ikiwiki/PageSpec]]. Such a plugin should add a function to the
|
2007-02-12 03:44:47 +01:00
|
|
|
IkiWiki::PageSpec package, that is named `match_foo`, where "foo()" is
|
2007-12-08 21:59:08 +01:00
|
|
|
how it will be accessed in a [[ikiwiki/PageSpec]]. The function will be passed
|
2007-04-27 04:55:52 +02:00
|
|
|
two parameters: The name of the page being matched, and the thing to match
|
|
|
|
against. It may also be passed additional, named parameters. It should return
|
2007-04-27 10:34:09 +02:00
|
|
|
a IkiWiki::SuccessReason object if the match succeeds, or an
|
|
|
|
IkiWiki::FailReason object if the match fails.
|
2008-07-10 06:19:35 +02:00
|
|
|
|
|
|
|
### Setup plugins
|
|
|
|
|
|
|
|
The ikiwiki setup file is loaded using a pluggable mechanism. If you
|
|
|
|
look at the top of [[ikiwiki.setup]], it starts with
|
|
|
|
'use IkiWiki::Setup::Standard', and the rest of the file is passed to
|
|
|
|
that module's import method.
|
|
|
|
|
|
|
|
It's possible to write other modules in the `IkiWiki::Setup::` namespace that
|
|
|
|
can be used to configure ikiwiki in different ways. These modules should,
|
|
|
|
when imported, populate `$IkiWiki::Setup::raw_setup` with a reference
|
|
|
|
to a hash containing all the config items.
|
|
|
|
|
|
|
|
By the way, to parse a ikiwiki setup file, a program just needs to
|
2008-07-23 02:33:51 +02:00
|
|
|
do something like:
|
|
|
|
`use IkiWiki::Setup; my %setup=IkiWiki::Setup::load($filename)`
|