# Plugin for TWiki Enterprise Collaboration Platform, http://TWiki.org/ # # Copyright (C) 2000-2003 Andrea Sterbini, a.sterbini@flashnet.it # Copyright (C) 2001-2006 Peter Thoeny, peter@thoeny.org # and TWiki Contributors. All Rights Reserved. TWiki Contributors # are listed in the AUTHORS file in the root of this distribution. # NOTE: Please extend that file, not this notice. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. For # more details read LICENSE in the root of this distribution. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # For licensing info read LICENSE file in the TWiki root. =pod ---+ package XmlXslPlugin =cut # change the package name and $pluginName!!! package TWiki::Plugins::XmlXslPlugin; # Always use strict to enforce variable scoping use strict; require TWiki::Func; # The plugins API require TWiki::Plugins; # For the API version # $VERSION is referred to by TWiki, and is the only global variable that # *must* exist in this package. use vars qw( $VERSION $RELEASE $SHORTDESCRIPTION $debug $pluginName $NO_PREFS_IN_TOPIC ); # This should always be $Rev: 15942 (22 Jan 2008) $ so that TWiki can determine the checked-in # status of the plugin. It is used by the build automation tools, so # you should leave it alone. $VERSION = '$Rev: 15942 (22 Jan 2008) $'; # This is a free-form string you can use to "name" your own plugin version. # It is *not* used by the build automation tools, but is reported as part # of the version number in PLUGINDESCRIPTIONS. $RELEASE = 'TWiki-4.2'; # Short description of this plugin # One line description, is shown in the %TWIKIWEB%.TextFormattingRules topic: $SHORTDESCRIPTION = 'Empty Plugin used as a template for new Plugins'; # You must set $NO_PREFS_IN_TOPIC to 0 if you want your plugin to use preferences # stored in the plugin topic. This default is required for compatibility with # older plugins, but imposes a significant performance penalty, and # is not recommended. Instead, use $TWiki::cfg entries set in LocalSite.cfg, or # if you want the users to be able to change settings, then use standard TWiki # preferences that can be defined in your Main.TWikiPreferences and overridden # at the web and topic level. $NO_PREFS_IN_TOPIC = 1; # Name of this Plugin, only used in this module $pluginName = 'XmlXslPlugin'; =pod ---++ initPlugin($topic, $web, $user, $installWeb) -> $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 is installed in REQUIRED Called to initialise the plugin. If everything is OK, should return a non-zero value. On non-fatal failure, should write a message using TWiki::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. You may also call =TWiki::Func::registerTagHandler= here to register a function to handle variables that have standard TWiki syntax - for example, =%MYTAG{"my param" myarg="My Arg"}%. You can also override internal TWiki variable handling functions this way, though this practice is unsupported and highly dangerous! __Note:__ Please align variables names with the Plugin name, e.g. if your Plugin is called FooBarPlugin, name variables FOOBAR and/or FOOBARSOMETHING. This avoids namespace issues. =cut sub initPlugin { my( $topic, $web, $user, $installWeb ) = @_; # check for Plugins.pm versions if( $TWiki::Plugins::VERSION < 1.026 ) { TWiki::Func::writeWarning( "Version mismatch between $pluginName and Plugins.pm" ); return 0; } # Example code of how to get a preference value, register a variable handler # and register a RESTHandler. (remove code you do not need) # Set plugin preferences in LocalSite.cfg, like this: # $TWiki::cfg{Plugins}{XmlXslPlugin}{ExampleSetting} = 1; # Always provide a default in case the setting is not defined in # LocalSite.cfg. See TWiki.TWikiPlugins for help in adding your plugin # configuration to the =configure= interface. # my $setting = $TWiki::cfg{Plugins}{XmlXslPlugin}{ExampleSetting} || 0; $debug = $TWiki::cfg{Plugins}{XmlXslPlugin}{Debug} || 0; # register the _EXAMPLETAG function to handle %EXAMPLETAG{...}% # This will be called whenever %EXAMPLETAG% or %EXAMPLETAG{...}% is # seen in the topic text. TWiki::Func::registerTagHandler( 'EXAMPLETAG', \&_EXAMPLETAG ); # Allow a sub to be called from the REST interface # using the provided alias TWiki::Func::registerRESTHandler('example', \&restExample); # Plugin correctly initialized return 1; } # The function used to handle the %EXAMPLETAG{...}% variable # You would have one of these for each variable you want to process. sub _EXAMPLETAG { my($session, $params, $theTopic, $theWeb) = @_; # $session - a reference to the TWiki session object (if you don't know # what this is, just ignore it) # $params= - a reference to a TWiki::Attrs object containing parameters. # This can be used as a simple hash that maps parameter names # to values, with _DEFAULT being the name for the default # parameter. # $theTopic - name of the topic in the query # $theWeb - name of the web in the query # Return: the result of processing the variable # For example, %EXAMPLETAG{'hamburger' sideorder="onions"}% # $params->{_DEFAULT} will be 'hamburger' # $params->{sideorder} will be 'onions' } =pod ---++ 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 BE =undef= This handler is called by the code that expands %TAGS% syntax in the topic body and in form fields. It may be called many times while a topic is being rendered. For variables with trivial syntax it is far more efficient to use =TWiki::Func::registerTagHandler= (see =initPlugin=). Plugins that have to parse the entire topic content should implement this function. Internal TWiki variables (and any variables declared using =TWiki::Func::registerTagHandler=) are expanded _before_, and then again _after_, this function is called to ensure all %TAGS% 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:* $TWiki::Plugins::VERSION 1.000 =cut sub commonTagsHandler { # do not uncomment, use $_[0], $_[1]... instead ### my ( $text, $topic, $web, $meta ) = @_; TWiki::Func::writeDebug( "- ${pluginName}::commonTagsHandler( $_[2].$_[1] )" ) if $debug; # do custom extension rule, like for example: # $_[0] =~ s/%XYZ%/&handleXyz()/ge; # $_[0] =~ s/%XYZ{(.*?)}%/&handleXyz($1)/ge; my $ctr = 0; $_[0] =~ s/%XMLXSLTRANSFORM{(.*)}%/&applyXmlToXsl($1, $ctr++)/ge; } =pod ---++ 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 TWiki::Plugins::VERSION = '1.026' =cut sub DISABLE_postRenderingHandler { # do not uncomment, use $_[0], $_[1]... instead #my $text = shift; # $_[0] =~ s/%XMLXSLTRANSFORM{(.*)}%/&applyXmlToXsl($1,$2)/ge; } sub applyXmlToXsl { my $theArgs = $_[0]; my $ctr = $_[1]; my $scriptGeneric = &getScriptGenericText($ctr); my $xmlsource = &TWiki::Func::extractNameValuePair( $theArgs, "xml" ); my $xslsource = &TWiki::Func::extractNameValuePair( $theArgs, "xsl" ); my $csssource = &TWiki::Func::extractNameValuePair( $theArgs, "css" ) || ""; my $id = &TWiki::Func::extractNameValuePair( $theArgs, "id" ) || "id$ctr"; # must always start with a letter TWiki::Func::writeDebug( "apply: xmlsource='$xmlsource'\nxslsource='$xslsource'\n" ) if $debug; my $script = <<'END'; END $script =~ s/%ID%/$id/g; $script =~ s/%XML%/$xmlsource/g; $script =~ s/%XSL%/$xslsource/g; return $scriptGeneric . "
" . $script; } sub getScriptGenericText { return "" if $_[0] > 0; my $script = <<'END'; END return $script; } 1;