See
PublishedAPI for packages intended to be used by Plugin and Contrib authors, or
browse all packages.
See also
Developing plugins,
Developer's Bible,
Technical Overview
internal package Foswiki::Plugins::WikiDrawPlugin
saveDrawing($session) → $text
This is an example of a sub to be called by the
rest script. The parameter is:
-
$session - The Foswiki object associated to this session.
Additional parameters can be recovered via the query object in the $session, for example:
my $query = $session->{request};
my $web = $query->{param}->{web}[0];
If your rest handler adds or replaces equivalent functionality to a standard script
provided with Foswiki, it should set the appropriate context in its switchboard entry.
A list of contexts are defined in
IfStatements
For more information, check
CommandAndCGIScripts
For information about handling error returns from REST handlers, see
Foswiki:Support.Faq1
Since: Foswiki::Plugins::VERSION 2.0
earlyInitPlugin()
This handler is called before any other handler, and before it has been
determined if the plugin is enabled or not. Use it with great care!
If it returns a non-null error string, the plugin will be disabled.
initializeUserHandler( $loginName, $url, $pathInfo )
-
$loginName - login name recovered from $ENV{REMOTE_USER}
-
$url - request url
-
$pathInfo - pathinfo from the CGI query
Allows a plugin to set the username. Normally Foswiki gets the username
from the login manager. This handler gives you a chance to override the
login manager.
Return the
login name.
This handler is called very early, immediately after
earlyInitPlugin.
Since: Foswiki::Plugins::VERSION = '2.0'
finishPlugin()
Called when Foswiki is shutting down, this handler can be used by the plugin
to release resources - for example, shut down open database connections,
release allocated memory etc.
Note that it's important to break any cycles in memory allocated by plugins,
or that memory will be lost when Foswiki is run in a persistent context
e.g. mod_perl.
registrationHandler($web, $wikiName, $loginName, $data )
-
$web - the name of the web in the current CGI query
-
$wikiName - users wiki name
-
$loginName - users login name
-
$data - a hashref containing all the formfields POSTed to the registration script
Called when a new user registers with this Foswiki.
Note that the handler is not called when the user submits the registration
form if {Register}{NeedVerification} is enabled. It is then called when
the user submits the activation code.
Since: Foswiki::Plugins::VERSION = '2.0'
-
$text - text to be processed
-
$topic - the name of the topic in the current CGI query
-
$web - the name of the web in the current CGI query
-
$included - Boolean flag indicating whether the handler is invoked on an included topic
-
$meta - meta-data object for the topic MAY BE undef
This handler is called by the code that expands %MACROS% syntax in
the topic body and in form fields. It may be called many times while
a topic is being rendered.
Only plugins that have to parse the entire topic content should implement
this function. For expanding macros with trivial syntax it is
far more
efficient to use
Foswiki::Func::registerTagHandler (see
initPlugin).
Internal Foswiki macros, (and any macros declared using
Foswiki::Func::registerTagHandler) are expanded
before, and then again
after, this function is called to ensure all %MACROS% are expanded.
NOTE: when this handler is called, <verbatim> blocks have been
removed from the text (though all other blocks such as <pre> and
<noautolink> are still present).
NOTE: meta-data is
not embedded in the text passed to this
handler. Use the
$meta object.
Since: $
Foswiki::Plugins::VERSION 2.0
-
$text - text to be processed
-
$topic - the name of the topic in the current CGI query
-
$web - the name of the web in the current CGI query
-
$meta - meta-data object for the topic MAY BE undef
This handler is called before Foswiki does any expansion of its own
internal variables. It is designed for use by cache plugins. Note that
when this handler is called, <verbatim> blocks are still present
in the text.
NOTE: This handler is called once for each call to
commonTagsHandler i.e. it may be called many times during the
rendering of a topic.
NOTE: meta-data is
not embedded in the text passed to this
handler.
NOTE: This handler is not separately called on included topics.
-
$text - text to be processed
-
$topic - the name of the topic in the current CGI query
-
$web - the name of the web in the current CGI query
-
$meta - meta-data object for the topic MAY BE undef
This handler is called after Foswiki has completed expansion of %MACROS%.
It is designed for use by cache plugins. Note that when this handler
is called, <verbatim> blocks are present in the text.
NOTE: This handler is called once for each call to
commonTagsHandler i.e. it may be called many times during the
rendering of a topic.
NOTE: meta-data is
not embedded in the text passed to this
handler.
preRenderingHandler( $text, \%map )
-
$text - text, with the head, verbatim and pre blocks replaced with placeholders
-
\%removed - reference to a hash that maps the placeholders to the removed blocks.
Handler called immediately before Foswiki syntax structures (such as lists) are
processed, but after all variables have been expanded. Use this handler to
process special syntax only recognised by your plugin.
Placeholders are text strings constructed using the tag name and a
sequence number e.g. 'pre1', "verbatim6", "head1" etc. Placeholders are
inserted into the text inside <!--!marker!--> characters so the
text will contain <!--!pre1!--> for placeholder pre1.
Each removed block is represented by the block text and the parameters
passed to the tag (usually empty) e.g. for
<pre class='slobadob'>
XYZ
</pre>
the map will contain:
$removed->{'pre1'}{text}: XYZ
$removed->{'pre1'}{params}: class="slobadob"
Iterating over blocks for a single tag is easy. For example, to prepend a
line number to every line of every pre block you might use this code:
foreach my $placeholder ( keys %$map ) {
if( $placeholder =~ /^pre/i ) {
my $n = 1;
$map->{$placeholder}{text} =~ s/^/$n++/gem;
}
}
NOTE: This handler is called once for each rendered block of text i.e.
it may be called several times during the rendering of a topic.
NOTE: meta-data is
not embedded in the text passed to this
handler.
Since
Foswiki::Plugins::VERSION = '2.0'
postRenderingHandler( $text )
-
$text - the text that has just been rendered. May be modified in place.
NOTE: This handler is called once for each rendered block of text i.e.
it may be called several times during the rendering of a topic.
NOTE: meta-data is
not embedded in the text passed to this
handler.
Since
Foswiki::Plugins::VERSION = '2.0'
beforeEditHandler($text, $topic, $web )
-
$text - text that will be edited
-
$topic - the name of the topic in the current CGI query
-
$web - the name of the web in the current CGI query
This handler is called by the edit script just before presenting the edit text
in the edit box. It is called once when the
edit script is run.
NOTE: meta-data may be embedded in the text passed to this handler
(using %META: tags)
Since: Foswiki::Plugins::VERSION = '2.0'
afterEditHandler($text, $topic, $web, $meta )
-
$text - text that is being previewed
-
$topic - the name of the topic in the current CGI query
-
$web - the name of the web in the current CGI query
-
$meta - meta-data for the topic.
This handler is called by the preview script just before presenting the text.
It is called once when the
preview script is run.
NOTE: this handler is
not called unless the text is previewed.
NOTE: meta-data is
not embedded in the text passed to this
handler. Use the
$meta object.
Since: $
Foswiki::Plugins::VERSION 2.0
beforeSaveHandler($text, $topic, $web, $meta )
-
$text - text with embedded meta-data tags
-
$topic - the name of the topic in the current CGI query
-
$web - the name of the web in the current CGI query
-
$meta - the metadata of the topic being saved, represented by a Foswiki::Meta object.
This handler is called each time a topic is saved.
NOTE: meta-data is embedded in
$text (using %META: tags). If you modify
the
$meta object, then it will override any changes to the meta-data
embedded in the text. Modify
either the META in the text
or the
$meta
object, never both. You are recommended to modify the
$meta object rather
than the text, as this approach is proof against changes in the embedded
text format.
Since: Foswiki::Plugins::VERSION = 2.0
afterSaveHandler($text, $topic, $web, $error, $meta )
-
$text - the text of the topic excluding meta-data tags (see beforeSaveHandler)
-
$topic - the name of the topic in the current CGI query
-
$web - the name of the web in the current CGI query
-
$error - any error string returned by the save.
-
$meta - the metadata of the saved topic, represented by a Foswiki::Meta object
This handler is called each time a topic is saved.
NOTE: meta-data is embedded in $text (using %META: tags)
Since: Foswiki::Plugins::VERSION 2.0
afterRenameHandler( $oldWeb, $oldTopic, $oldAttachment, $newWeb, $newTopic, $newAttachment )
-
$oldWeb - name of old web
-
$oldTopic - name of old topic (empty string if web rename)
-
$oldAttachment - name of old attachment (empty string if web or topic rename)
-
$newWeb - name of new web
-
$newTopic - name of new topic (empty string if web rename)
-
$newAttachment - name of new attachment (empty string if web or topic rename)
This handler is called just after the rename/move/delete action of a web, topic or attachment.
Since: Foswiki::Plugins::VERSION = '2.0'
beforeUploadHandler(\%attrHash, $meta )
-
\%attrHash - reference to hash of attachment attribute values
-
$meta - the Foswiki::Meta object where the upload will happen
This handler is called once when an attachment is uploaded. When this
handler is called, the attachment has
not been recorded in the database.
The attributes hash will include at least the following attributes:
-
attachment => the attachment name - must not be modified
-
user - the user id - must not be modified
-
comment - the comment - may be modified
-
stream - an input stream that will deliver the data for the attachment. The stream can be assumed to be seekable, and the file pointer will be positioned at the start. It is not necessary to reset the file pointer to the start of the stream after you are done, nor is it necessary to close the stream.
The handler may wish to replace the original data served by the stream
with new data. In this case, the handler can set the
{stream} to a
new stream.
For example:
sub beforeUploadHandler {
my ( $attrs, $meta ) = @_;
my $fh = $attrs->{stream};
local $/;
# read the whole stream
my $text = <$fh>;
# Modify the content
$text =~ s/investment bank/den of thieves/gi;
$fh = new File::Temp();
print $fh $text;
$attrs->{stream} = $fh;
}
Since: Foswiki::Plugins::VERSION = 2.1
afterUploadHandler(\%attrHash, $meta )
-
\%attrHash - reference to hash of attachment attribute values
-
$meta - a Foswiki::Meta object where the upload has happened
This handler is called just after the after the attachment
meta-data in the topic has been saved. The attributes hash
will include at least the following attributes, all of which are read-only:
-
attachment => the attachment name
-
comment - the comment
-
user - the user id
Since: Foswiki::Plugins::VERSION = 2.1
mergeHandler( $diff, $old, $new, \%info ) → $text
Try to resolve a difference encountered during merge. The
differences
array is an array of hash references, where each hash contains the
following fields:
-
$diff => one of the characters '+', '-', 'c' or ' '.
- '+' -
new contains text inserted in the new version
- '-' -
old contains text deleted from the old version
- 'c' -
old contains text from the old version, and new text from the version being saved
- ' ' -
new contains text common to both versions, or the change only involved whitespace
-
$old => text from version currently saved
-
$new => text from version being saved
-
\%info is a reference to the form field description { name, title, type, size, value, tooltip, attributes, referenced }. It must not be wrtten to. This parameter will be undef when merging the body text of the topic.
Plugins should try to resolve differences and return the merged text.
For example, a radio button field where we have
{ diff=>'c', old=>'Leafy', new=>'Barky' } might be resolved as
'Treelike'. If the plugin cannot resolve a difference it should return
undef.
The merge handler will be called several times during a save; once for
each difference that needs resolution.
If any merges are left unresolved after all plugins have been given a
chance to intercede, the following algorithm is used to decide how to
merge the data:
-
new is taken for all radio, checkbox and select fields to resolve 'c' conflicts
- '+' and '-' text is always included in the the body text and text fields
-
<del>conflict</del> <ins>markers</ins> are used to mark 'c' merges in text fields
The merge handler is called whenever a topic is saved, and a merge is
required to resolve concurrent edits on a topic.
Since: Foswiki::Plugins::VERSION = 2.0
modifyHeaderHandler( \%headers, $query )
-
\%headers - reference to a hash of existing header values
-
$query - reference to CGI query object
Lets the plugin modify the HTTP headers that will be emitted when a
page is written to the browser. \%headers= will contain the headers
proposed by the core, plus any modifications made by other plugins that also
implement this method that come earlier in the plugins list.
$headers->{expires} = '+1h';
Note that this is the HTTP header which is
not the same as the HTML
<HEAD> tag. The contents of the <HEAD> tag may be manipulated
using the
Foswiki::Func::addToHEAD method.
Since: Foswiki::Plugins::VERSION 2.0
This handler is called before built-in types are considered. It generates
the HTML text rendering this form field, or false, if the rendering
should be done by the built-in type handlers.
-
$name - name of form field
-
$type - type of form field (checkbox, radio etc)
-
$size - size of form field
-
$value - value held in the form field
-
$attributes - attributes of form field
-
$possibleValues - the values defined as options for form field, if any. May be a scalar (one legal value) or a ref to an array (several legal values)
Return HTML text that renders this field. If false, form rendering
continues by considering the built-in types.
Since: Foswiki::Plugins::VERSION 2.0
Note that you can also extend the range of available
types by providing a subclass of
Foswiki::Form::FieldDefinition to implement
the new type (see
Foswiki::Extensions.JSCalendarContrib and
Foswiki::Extensions.RatingContrib for examples). This is the preferred way to
extend the form field types.
renderWikiWordHandler($linkText, $hasExplicitLinkLabel, $web, $topic) → $linkText
-
$linkText - the text for the link i.e. for [[Link][blah blah]] it's blah blah, for BlahBlah it's BlahBlah, and for BlahBlah it's Blah Blah.
-
$hasExplicitLinkLabel - true if the link is of the form [[Link][blah blah]] (false if it's =[Blah]] or =BlahBlah)
-
$web, $topic - specify the topic being rendered
Called during rendering, this handler allows the plugin a chance to change
the rendering of labels used for links.
Return the new link text.
Since: Foswiki::Plugins::VERSION 2.0
completePageHandler($html, $httpHeaders)
This handler is called on the ingredients of every page that is
output by the standard CGI scripts. It is designed primarily for use by
cache and security plugins.
-
$html - the body of the page (normally <html>..$lt;/html>)
-
$httpHeaders - the HTTP headers. Note that the headers do not contain a Content-length. That will be computed and added immediately before the page is actually written. This is a string, which must end in \n\n.
Since: Foswiki::Plugins::VERSION 2.0
restExample($session) → $text
This is an example of a sub to be called by the
rest script. The parameter is:
-
$session - The Foswiki object associated to this session.
Additional parameters can be recovered via the query object in the $session, for example:
my $query = $session->{request};
my $web = $query->{param}->{web}[0];
If your rest handler adds or replaces equivalent functionality to a standard script
provided with Foswiki, it should set the appropriate context in its switchboard entry.
A list of contexts are defined in
IfStatements
For more information, check
CommandAndCGIScripts
For information about handling error returns from REST handlers, see
Foswiki:Support.Faq1
Since: Foswiki::Plugins::VERSION 2.0
Deprecated handlers
redirectCgiQueryHandler($query, $url )
-
$query - the CGI query
-
$url - the URL to redirect to
This handler can be used to replace Foswiki's internal redirect function.
If this handler is defined in more than one plugin, only the handler
in the earliest plugin in the INSTALLEDPLUGINS list will be called. All
the others will be ignored.
Deprecated in: Foswiki::Plugins::VERSION 2.1
This handler was deprecated because it cannot be guaranteed to work, and
caused a significant impediment to code improvements in the core.
beforeAttachmentSaveHandler(\%attrHash, $topic, $web )
-
\%attrHash - reference to hash of attachment attribute values
-
$topic - the name of the topic in the current CGI query
-
$web - the name of the web in the current CGI query
This handler is called once when an attachment is uploaded. When this
handler is called, the attachment has
not been recorded in the database.
The attributes hash will include at least the following attributes:
-
attachment => the attachment name
-
comment - the comment
-
user - the user id
-
tmpFilename - name of a temporary file containing the attachment data
Deprecated in: Foswiki::Plugins::VERSION 2.1
The efficiency of this handler (and therefore it's impact on performance)
is very bad. Please use
beforeUploadHandler() instead.
afterAttachmentSaveHandler(\%attrHash, $topic, $web )
-
\%attrHash - reference to hash of attachment attribute values
-
$topic - the name of the topic in the current CGI query
-
$web - the name of the web in the current CGI query
-
$error - any error string generated during the save process (always undef in 2.1)
This handler is called just after the save action. The attributes hash
will include at least the following attributes:
-
attachment => the attachment name
-
comment - the comment
-
user - the user id
Deprecated in: Foswiki::Plugins::VERSION 2.1
This handler has a number of problems including security and performance
issues. Please use
afterUploadHandler() instead.