internal package
Foswiki::Plugins::EmptyPlugin
On this page:
- internal package Foswiki::Plugins::EmptyPlugin
- initPlugin($topic, $web, $user) -> $boolean
- earlyInitPlugin()
- initializeUserHandler( $loginName, $url, $pathInfo )
- finishPlugin()
- registrationHandler($web, $wikiName, $loginName, $data )
- commonTagsHandler($text, $topic, $web, $included, $meta )
- beforeCommonTagsHandler($text, $topic, $web, $meta )
- afterCommonTagsHandler($text, $topic, $web, $meta )
- preRenderingHandler( $text, \%map )
- postRenderingHandler( $text )
- beforeEditHandler($text, $topic, $web )
- afterEditHandler($text, $topic, $web, $meta )
- beforeSaveHandler($text, $topic, $web, $meta )
- afterSaveHandler($text, $topic, $web, $error, $meta )
- afterRenameHandler( $oldWeb, $oldTopic, $oldAttachment, $newWeb, $newTopic, $newAttachment )
- beforeUploadHandler(\%attrHash, $meta )
- afterUploadHandler(\%attrHash, $meta )
- mergeHandler( $diff, $old, $new, \%info ) -> $text
- modifyHeaderHandler( \%headers, $query )
- renderFormFieldForEditHandler($name, $type, $size, $value, $attributes, $possibleValues) -> $html
- renderWikiWordHandler($linkText, $hasExplicitLinkLabel, $web, $topic) -> $linkText
- completePageHandler($html, $httpHeaders)
- restExample($session) -> $text
- Deprecated handlers
internal package
Foswiki::Plugins::EmptyPlugin
Foswiki plugins 'listen' to events happening in the core by registering an
interest in those events. They do this by declaring 'plugin handlers'. These
are simply functions with a particular name that, if they exist in your
plugin, will be called by the core.
This is an empty Foswiki plugin. It is a fully defined plugin, but is
disabled by default in a Foswiki installation. Use it as a template
for your own plugins.
To interact with Foswiki use ONLY the official APIs
documented in DevelopingPlugins. Do not reference any
packages, functions or variables elsewhere in Foswiki, as these are
subject to change without prior warning, and your plugin may suddenly stop
working.
Error messages can be output using the Foswiki::Func
writeWarning
and
writeDebug
functions. These logs can be found in the Foswiki/working/logs
directory. You can also print STDERR
; the output will appear in the
webserver error log. The {WarningsAreErrors} configure setting makes
Foswiki less tolerant of errors, and it is recommended to set it during
development. It can be set using configure, in the 'Miscellaneous'
section. Most handlers can also throw exceptions (e.g.
[[http://malat.biz/view/System/PerlDoc?module=Foswiki::OopsException][Foswiki::OopsException]])
For increased performance, all handler functions except initPlugin
are
commented out below. To enable a handler remove the leading #
from
each line of the function. For efficiency and clarity, you should
only uncomment handlers you actually use.
NOTE: When developing a plugin it is important to remember that
Foswiki is tolerant of plugins that do not compile. In this case,
the failure will be silent but the plugin will not be available.
See InstalledPlugins for error messages.
NOTE: Foswiki:Development.StepByStepRenderingOrder helps you decide which
rendering handler to use. When writing handlers, keep in mind that these may
be invoked on included topics. For example, if a plugin generates links to the
current topic, these need to be generated before the afterCommonTagsHandler
is run. After that point in the rendering loop we have lost the information
that the text had been included from another topic.
NOTE: Not all handlers (and not all parameters passed to handlers) are
available with all versions of Foswiki. Where a handler has been added
the POD comment will indicate this with a "Since" line
e.g. Since: Foswiki::Plugins::VERSION 1.1
Deprecated handlers are still available, and can continue to be used to
maintain compatibility with earlier releases, but will be removed at some
point in the future. If you do implement deprecated handlers, then you can
do no harm by simply keeping them in your code, but you are recommended to
implement the alternative as soon as possible.
See http://foswiki.org/Download/ReleaseDates for a breakdown of release
versions.
initPlugin($topic, $web, $user) -> $boolean
-
$topic
- the name of the topic in the current CGI query -
$web
- the name of the web in the current CGI query -
$user
- the login name of the user -
$installWeb
- the name of the web the plugin topic is in (usually the same as$Foswiki::cfg{SystemWebName}
)
Foswiki::Func::writeWarning
and return 0. In this case
%FAILEDPLUGINS% will indicate which plugins failed.
In the case of a catastrophic failure that will prevent the whole
installation from working safely, this handler may use 'die', which
will be trapped and reported in the browser.
Note: Please align macro names with the Plugin name, e.g. if
your Plugin is called FooBarPlugin, name macros FOOBAR and/or
FOOBARSOMETHING. This avoids namespace issues.
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
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
commonTagsHandler($text, $topic, $web, $included, $meta )
-
$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 BEundef
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.
NOTE: Read the developer supplement at
Foswiki:Development.AddToZoneFromPluginHandlers if you are calling
addToZone()
from this handler
Since: $Foswiki::Plugins::VERSION 2.0
beforeCommonTagsHandler($text, $topic, $web, $meta )
-
$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 BEundef
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.
NOTE: Read the developer supplement at
Foswiki:Development.AddToZoneFromPluginHandlers if you are calling
addToZone()
from this handler
afterCommonTagsHandler($text, $topic, $web, $meta )
-
$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 BEundef
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: Read the developer supplement at
Foswiki:Development.AddToZoneFromPluginHandlers if you are calling
addToZone()
from 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.
<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. NOTE: Read the developer supplement at Foswiki:Development.AddToZoneFromPluginHandlers if you are calling
addToZone()
from this handler
Since Foswiki::Plugins::VERSION = '2.0'
postRenderingHandler( $text )
-
$text
- the text that has just been rendered. May be modified in place.
addToZone()
from 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
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.
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.
$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
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)
beforeUploadHandler(\%attrHash, $meta )
-
\%attrHash
- reference to hash of attachment attribute values -
$meta
- the Foswiki::Meta object where the upload will happen
-
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.
{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
-
attachment
=> the attachment name -
comment
- the comment -
user
- the user id
mergeHandler( $diff, $old, $new, \%info ) -> $text
Try to resolve a difference encountered during merge. Thedifferences
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, andnew
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.
{ 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 allradio
,checkbox
andselect
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
modifyHeaderHandler( \%headers, $query )
-
\%headers
- reference to a hash of existing header values -
$query
- reference to CGI query object
$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
renderFormFieldForEditHandler($name, $type, $size, $value, $attributes, $possibleValues) -> $html
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)
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'sblah blah
, forBlahBlah
it'sBlahBlah
, and for Blah Blah it'sBlah Blah
. -
$hasExplicitLinkLabel
- true if the link is of the form[[Link][blah blah]]
(false if it's=[Blah]] or =BlahBlah
) -
$web
,$topic
- specify the link being rendered
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 aContent-length
. That will be computed and added immediately before the page is actually written. This is a string, which must end in \n\n.
restExample($session) -> $text
This is an example of a sub to be called by therest
script. The parameter is: -
$session
- The Foswiki object associated to this session.
view
, diff
, etc. the static
context is used
to indicate that the resulting output will be read offline, such as in a PDF, and
dynamic links (edit, sorting, etc) should not be rendered.
A comprehensive list of core context identifiers used by Foswiki is found in
IfStatements#Context_identifiers. Please be careful not to
overwrite any of these identifiers!
For more information, check CommandAndCGIScripts#rest
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
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
-
attachment
=> the attachment name -
comment
- the comment -
user
- the user id -
tmpFilename
- name of a temporary file containing the attachment data
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)
-
attachment
=> the attachment name -
comment
- the comment -
user
- the user id
afterUploadHandler()
instead.