ikiwiki/doc/plugins/write.mdwn

108 lines
5.1 KiB
Plaintext
Raw Normal View History

ikiwiki [[plugins]] are written in perl. Each plugin 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.
## Note
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.
## Registering plugins
Plugins should, when imported, call IkiWiki::hook to hook into
ikiwiki's processing. The function uses named parameters, and use varies depending on the type of plugin being registered. Note that a plugin can call the function more than once to register multiple hooks. All calls to IkiWiki::hook should be passed a "type" parameter, which gives the type of hook, a "id" paramter, which should be a unique string for this plugin, and a "call" parameter, which is a reference to a function to call for the hook.
## Writing a [[PreProcessorDirective]]
2006-05-03 22:31:16 +02:00
This is probably the most common use of a plugin.
IkiWiki::hook(type => "preprocess", id => "foo", call => \&preprocess);
Replace "foo" with the command name that will be used inside brackers for the preprocessor directive.
2006-05-03 22:31:16 +02:00
Each time the directive is processed, the referenced function (`preprocess` in the example above) is called, and is passed named parameters. A
2006-05-02 08:24:38 +02:00
"page" parameter gives the name of the page that embedded the preprocessor directive. All parameters included in the directive are included
2006-05-03 22:31:16 +02:00
as named parameters as well. Whatever the function returns goes onto the
2006-05-02 08:24:38 +02:00
page in place of the directive.
2006-05-03 22:31:16 +02:00
## Other types of hooks
Beyond PreProcessorDirectives, Other types of hooks that can be used by plugins include:
2006-05-03 22:43:55 +02:00
### checkconfig
IkiWiki::hook(type => "delete", id => "foo", call => \&checkconfig);
This is useful if the plugin needs to check for, or modify ikiwiki's configuration. It's called early in the ikiwiki startup process. It's ok for
the function to call IkiWiki::error if something isn't configured right.
2006-05-03 22:31:16 +02:00
### delete
2006-05-03 22:43:55 +02:00
IkiWiki::hook(type => "delete", id => "foo", call => \&dele);
2006-05-03 22:31:16 +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.
### render
2006-05-03 22:43:55 +02:00
IkiWiki::hook(type => "render", id => "foo", call => \&render);
2006-05-03 22:31:16 +02:00
Each time ikiwiki renders a change or addition (but not deletion) of a page to the wiki, the referenced function is called, and passed the name of the source file that was rendered.
## Error handing in plugins
While a plugin can call ikiwiki's error routine for a fatal error, for
errors that aren't intended to halt the entire wiki build, including bad
parameters passed to a [[PreProcessorDirective]], etc, it's better to just
return the error message as the output of the plugin.
## Html issues
Note that if [[HTMLSanitization]] is enabled, html in
[[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
2006-05-02 08:26:08 +02:00
preprocessor time. Text output by a preprocessor directive will be passed through markdown along with the rest of the page.
## Wiki configuration
A plugin can access the wiki's configuration via the `%IkiWiki::config` hash.
The best way to understand the contents of the hash is to look at
[[ikiwiki.setup]], which sets the hash content to configure the wiki.
## Wiki data
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:
* `%IkiWiki::links` lists the names of each page
2006-05-02 08:26:55 +02:00
that a page links to, in an array reference.
* `%IkiWiki::pagemtime` contains the last modification time of each page
2006-05-02 08:27:16 +02:00
* `%IkiWiki::pagectime` contains the creation time of each page
* `%IkiWiki::renderedfiles` contains the name of the file rendered by a
page
* `%IkiWiki::pagesources` contains the name of the source file for a page.
* `%IkiWiki::depends` contains a [[GlobList]] that is used to specify other
pages that a page depends on. If one of its dependencies is updated, the
page will also get rebuilt.
Many plugins will need to add dependencies to this hash; the best way to do
it is by using the IkiWiki::add_depends function, which takes as its
parameters the page name and a [[GlobList]] of dependencies to add.
## RCS plugins
ikiwiki's support for revision control systems also uses pluggable perl
modules. These are in the `IkiWiki::RCS` namespace, for example
`IkiWiki::RCS::svn`.
Each RCS plugin must support all the IkiWiki::rcs_* functions.
See IkiWiki::RCS::Stub for the full list of functions. It's ok if
rcs_getctime does nothing except for throwing an error.