X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/ed463de21f4229a2e25083c623d8f8b8bab6138f..d4c61b72813b880d86b316770f2e3819a6428202:/doc/plugins/write.mdwn diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn index 8492b1756..c10d73cf9 100644 --- a/doc/plugins/write.mdwn +++ b/doc/plugins/write.mdwn @@ -30,6 +30,16 @@ 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. +An optional "scan" parameter, if set to a true value, makes the hook be +called during the preliminary scan that ikiwiki makes of updated pages, +before begining to render pages. This parameter should be set to true 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. + +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. + ## Types of hooks In roughly the order they are called. @@ -64,6 +74,14 @@ Runs on the raw source of a page, before anything else touches it, and can make arbitrary changes. The function is passed named parameters `page` and `content` and should return the filtered content. +### scan + + hook(type => "scan", id => "foo", call => \&scan); + +This is identical to a preprocess hook (see below), except that it is +called in the initial pass that scans pages for data that will be used in +later passes. Scan hooks are the only hook that should modify + ### preprocess Adding a [[PreProcessorDirective]] is probably the most common use of a @@ -105,13 +123,13 @@ return the htmlized content. hook(type => "pagetemplate", id => "foo", call => \&pagetemplate); -[[Templates]] are filled out for many different things in ikiwiki, -like generating a page, or part of a blog page, or an rss feed, or a cgi. -This hook allows modifying those templates. The function is passed named +[[Templates]] are filled out for many different things in ikiwiki, like +generating a page, or part of a blog page, or an rss feed, or a cgi. This +hook allows modifying those templates. The function is passed named parameters. The "page" and "destpage" parameters are the same as for a -preprocess hook. The "template" parameter is a `HTML::Template` object that -is the template that will be used to generate the page. The function can -manipulate that template object. +preprocess hook. The "template" parameter is a [[cpan HTML::Template]] +object that is the template that will be used to generate the page. The +function can manipulate that template object. The most common thing to do is probably to call $template->param() to add a new custom parameter to the template. @@ -161,6 +179,55 @@ called in turn, and passed a CGI object. The hook should examine the parameters, and if it will handle this CGI request, output a page and terminate the program. +### auth + + hook(type => "auth", id => "foo", call => \&auth); + +This hook can be used to implement a different authentication method than +the standard web form. When a user needs to be authenticated, each registered +auth hook is called in turn, and passed a CGI object and a session object. + +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. + +### 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); + hook(type => "formbuilder", id => "foo", call => \&formbuilder); + +These hooks allow tapping into the parts of ikiwiki that use [[cpan +CGI::FormBuilder]] to generate web forms. These hooks are passed named +parameters: `cgi`, `session`, and `form`. These are, respectively, the +`CGI` object, the user's `CGI::Session`, and a `CGI::FormBuilder`. + +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 +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. + +Form validation and display can be overridden by the formbuilder hook. +By default, ikiwiki will do a basic validation and display of the form, +but if this hook is registered, it will stop that and let the hook take +over. This hook is passed an additional named parameter: `buttons` is an +array of the submit buttons for the form. + ### savestate hook(type => "savestate", id => "foo", call => \&savestate); @@ -220,9 +287,11 @@ the id can be controled by the user. 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 @@ -232,8 +301,8 @@ appear on the wiki page, rather than calling error(). #### `template($;@)` -Creates and returns a HTML::Template object. The first parameter is the -name of the file in the template directory. The optional remaining +Creates and returns a [[cpan HTML::Template]] object. The first parameter +is the name of the file in the template directory. The optional remaining parameters are passed to HTML::Template->new. #### `htmlpage($)` @@ -245,10 +314,12 @@ page created from it. (Ie, it appends ".html".) 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($$)` @@ -290,14 +361,20 @@ in binary mode. 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. @@ -329,6 +406,10 @@ path to the first file found. 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 @@ -340,3 +421,12 @@ See IkiWiki::RCS::Stub for the full list of functions. It's ok if 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.