Difference: TWikiDocumentation (1 vs. 48)

Revision 4806 Jan 2007 - Main.TWikiContributor

Line: 1 to 1
 

TWiki Reference Manual (TWiki-4.1.2, Sat, 03 Mar 2007, build 13046)

Installing Add-Ons

Creating new Add-Ons


TWiki Contribs

Reusable code that may be used over several plugins and add-ons.

Overview

TWiki contribs extend the functionality of TWiki, typically used by plugins and add-ons. They may also provide alternative implementations for sections of the TWiki core e.g. user management, or when an extension just can't be implemented as a plugin because it requires very close access to TWiki internals.

Relevant links on TWiki.org:

See other types of extensions: TWikiAddOns, TWikiPlugins, TWikiSkins

TWiki Contribs Installed on this TWiki

Number of topics: 6
<--/patternSearchResultCount-->

Installing Contribs

Creating new Contribs

 

TWiki Plugins

Add functionality to TWiki with readily available Plugins; create Plugins based on APIs

Overview

You can add Plugins to extend TWiki functionality, without altering the core code. A plug-in approach lets you:

  • add virtually unlimited features while keeping the main TWiki code compact and efficient;
  • heavily customize an installation and still do clean updates to new versions of TWiki;
  • rapidly develop new TWiki functions in Perl using the Plugin API.

Everything to do with TWiki Plugins - demos, new releases, downloads, development, general discussion - is available at TWiki.org, in the TWiki:Plugins web.

TWiki Plugins are developed and contributed by interested members of the community. Plugins are provided on an 'as is' basis; they are not a part of TWiki, but are independently developed and maintained.

Relevant links on TWiki.org:

See other types of extensions: TWikiAddOns, TWikiContribs, TWikiSkins

Installing Plugins

Each TWiki Plugin comes with its own documentation: step-by-step installation instructions, a detailed description of any special requirements, version details, and a working example for testing. Many Plugins have an install script that automates these steps for you.

Special Requirements: Some Plugins need certain Perl modules to be preinstalled on the host system. Plugins may also use other resources, like graphics, other modules, applications, and templates. You should be able to find detailed instructions in the Plugin's documentation.

Each Plugin has a standard release topic, located in the TWiki:Plugins web at TWiki.org. There's usually a number of other related topics, such as a developers page, and an appraisal page.

On-Site Pretesting

The recommended approach to testing new Plugins before making them public is to create a second local TWiki installation, and test the Plugin there. You can allow selected users access to the test area. Once you are satisifed that it won't compromise your main installation, you can install it there as well.

InstalledPlugins shows which Plugins are: 1) installed, 2) loading properly, and 3) what TWiki:Codev.PluginHandlers they invoke. Any failures are shown in the Errors section. The %FAILEDPLUGINS% variable can be used to debug failures. You may also want to check your webserver error log and the various TWiki log files.

Some Notes on Plugin Performance

The performance of the system depends to some extent on the number of Plugins installed and on the Plugin implementation. Some Plugins impose no measurable performance decrease, some do. For example, a Plugin might use many Perl libraries that need to be initialized with each page view (unless you run mod_perl). You can only really tell the performance impact by installing the Plugin and by measuring the performance with and without the new Plugin. Use the TWiki:Plugins.PluginBenchmarkAddOn, or test manually with the Apache ab utility. Example on Unix:
time wget -qO /dev/null /bin/view/TWiki/AbcPlugin

TIP If you need to install an "expensive" Plugin, but you only need its functionality only in a subset of your data, you can disable it elsewhere by defining the %DISABLEDPLUGINS% TWiki variable.

Define DISABLEDPLUGINS to be a comma-separated list of names of plugins to disable. Define it in Main.TWikiPreferences to disable those plugins everywhere, in the WebPreferences topic to disable them in an individual web, or in a topic to disable them in that topic. For example,

   * Set DISABLEDPLUGINS = SpreadSheetPlugin, EditTablePlugin

Managing Installed Plugins

Some Plugins require additional settings or offer extra options that you have to select. Also, you may want to make a Plugin available only in certain webs, or temporarily disable it. And may want to list all available Plugins in certain topics. You can handle all of these management tasks with simple procedures:

Enabling Plugins

Plugins can be enabled and disabled with the configure script. An installed Plugin needs to be enabled before it can be used.

Plugin Evaluation Order

By default, TWiki executes Plugins in alphabetical order on Plugin name. It is possible to change the order, for example to evaluate database variables before the speadsheet CALCs. This can be done with {PluginsOrder} in the Plugins section of configure.

Plugin-Specific Settings

Plugins are usually configured by variables accessible though the configure interface, but in some cases (usually older plugins) TWiki preferences are used. If a TWiki variable is defined in a Plugin topic e.g:

  • Set SETTING = Create dynamic foo bar reports
Then these settings can be retrieved as preferences variables like %<pluginname>_<var>%. For example, %RUBBERPLUGIN_SETTING% shows the value of SETTING in the RubberPlugin topic.

Listing Active Plugins

Plugin status variables let you list all active Plugins wherever needed.

%ACTIVATEDPLUGINS%

On this TWiki site, the enabled Plugins are: SpreadSheetPlugin, CommentPlugin, EditTablePlugin, InterwikiPlugin, PreferencesPlugin, SlideShowPlugin, SmiliesPlugin, TablePlugin, TwistyPlugin, WysiwygPlugin.

%PLUGINDESCRIPTIONS%

  • SpreadSheetPlugin (any TWiki, 10197): Add spreadsheet calculation like "$SUM( $ABOVE() )" to TWiki tables and other topic text
  • CommentPlugin (Dakar, 11359): Allows users to quickly post comments to a page without an edit/preview/save cycle
  • EditTablePlugin (any TWiki, 11646): Edit TWiki tables using edit fields, date pickers and drop down boxes
  • InterwikiPlugin (Dakar, $Rev: 11935$): Link ExternalSite:Page text to external sites based on aliases defined in a rules topic
  • PreferencesPlugin (Dakar, 9839): Allows editing of preferences using fields predefined in a form
  • SlideShowPlugin (Any TWiki, $Rev: 12847$): Create web based presentations based on topics with headings.
  • SmiliesPlugin (Dakar, 8154): Render smilies as icons, like smile for  :-) or eek! for = :eek:=
  • TablePlugin (1.020, 12339): Control attributes of tables and sorting of table columns
  • TwistyPlugin (1.2.0, $Rev: 12154$): Twisty section JavaScript library to open/close content dynamically
  • WysiwygPlugin (Dakar, 12422): Translator framework for Wysiwyg editors

%FAILEDPLUGINS%

PluginErrors
SpreadSheetPlugin none
CommentPlugin none
EditTablePlugin none
InterwikiPlugin none
PreferencesPlugin none
SlideShowPlugin none
SmiliesPlugin none
TablePlugin none
TwistyPlugin none
WysiwygPlugin none
HandlerPlugins
beforeCommonTagsHandlerPreferencesPlugin
TwistyPlugin
WysiwygPlugin
beforeEditHandlerWysiwygPlugin
beforeSaveHandlerCommentPlugin
WysiwygPlugin
commonTagsHandlerSpreadSheetPlugin
CommentPlugin
EditTablePlugin
SlideShowPlugin
SmiliesPlugin
initPluginSpreadSheetPlugin
CommentPlugin
EditTablePlugin
InterwikiPlugin
PreferencesPlugin
SlideShowPlugin
SmiliesPlugin
TablePlugin
TwistyPlugin
WysiwygPlugin
modifyHeaderHandlerWysiwygPlugin
postRenderingHandlerEditTablePlugin
PreferencesPlugin
TwistyPlugin
WysiwygPlugin
preRenderingHandlerInterwikiPlugin
SmiliesPlugin
TablePlugin
10 plugins

The TWiki Plugin API

The Application Programming Interface (API) for TWiki Plugins provides the specifications for hooking into the core TWiki code from your external Perl Plugin module.

Available Core Functions

The TWikiFuncDotPm module (lib/TWiki/Func.pm) describes all the interfaces available to Plugins. Plugins should only use the interfaces described in this module.

ALERT! Note: If you use other core functions not described in Func.pm, you run the risk of creating security holes. Also, your Plugin will likely break and require updating when you upgrade to a new version of TWiki.

Predefined Hooks

In addition to TWiki core functions, Plugins can use predefined hooks, or callbacks, as described in the lib/TWiki/Plugins/EmptyPlugin.pm module.

  • All but the initPlugin are disabled. To enable a callback, remove DISABLE_ from the function name.

TWiki:Codev/StepByStepRenderingOrder helps you decide which rendering handler to use.

Hints on Writing Fast Plugins

  • Delay initialization as late as possible. For example, if your Plugin is a simple syntax processor, you might delay loading extra Perl modules until you actually see the syntax in the text.
  • For example, use an eval block like this:
    eval { require IPC::Run }
    return "<font color=\"red\">SamplePlugin: Can't load required modules ($@)</font>" if $@;
  • You can use a flag to avoid running the initialization twice
  • The TWiki:Plugins.PluginBenchmarkAddOn comes in handy to measure and fine-tune the performance of your Plugin

Plugin Version Detection

To eliminate the incompatibility problems bound to arise from active open Plugin development, a Plugin versioning system is provided for automatic compatibility checking.

  • All modules require a $VERSION='0.000' variable, beginning at 1.000.

  • The initPlugin handler should check all dependencies and return TRUE if the initialization is OK or FALSE if something went wrong.
    • The Plugin initialization code does not register a Plugin that returns FALSE (or that has no initPlugin handler).

  • $TWiki::Plugins::VERSION in the TWiki::Plugins module contains the TWiki Plugin API version, currently 1.11.
    • You can also use the %PLUGINVERSION{}% variable to query the Plugin API version or the version of installed Plugins.

Security

  • Badly written Plugins can open huge security holes in TWiki. This is especially true if care isn't taken to prevent execution of arbitrary commands on the server.
  • Don't allow sensitive configuration data to be edited by users. it is better to add sensitive configuration options to the %TWiki::cfg hash than adding it as preferences in the Plugin topic
  • Always use the TWiki::Sandbox to execute commands.
  • Always audit the Plugins you install, and make sure you are happy with the level of security provided. While every effort is made to monitor Plugin authors activities, at the end of the day they are uncontrolled user contributions.

Creating Plugins

With a reasonable knowledge of the Perl scripting language, you can create new Plugins or modify and extend existing ones. Basic plug-in architecture uses an Application Programming Interface (API), a set of software instructions that allow external code to interact with the main program. The TWiki Plugin API Plugins by providing a programming interface for TWiki.

Anatomy of a Plugin

A basic TWiki Plugin consists of two elements:

  • a Perl module, ex: MyFirstPlugin.pm
  • a documentation topic, ex: MyFirstPlugin.txt

The Perl module can be a block of code that connects with TWiki alone, or it can include other elements, like other Perl modules (including other Plugins), graphics, TWiki templates, external applications (ex: a Java applet), or just about anything else it can call. In particular, files that should be web-accessible (graphics, Java applets ...) are best placed as attachments of the MyFirstPlugin topic. Other needed Perl code is best placed in a lib/TWiki/Plugins/MyFirstPlugin/ directory.

The Plugin API handles the details of connecting your Perl module with main TWiki code. When you're familiar with the Plugin API, you're ready to develop Plugins.

Creating the Perl Module

Copy file lib/TWiki/Plugins/EmptyPlugin.pm to <name>Plugin.pm. The EmptyPlugin.pm module contains mostly empty functions, so it does nothing, but it's ready to be used. Customize it. Refer to the Plugin API specs for more information.

If your Plugin uses its own modules and objects, you must include the name of the Plugin in the package name. For example, write Package MyFirstPlugin::Attrs; instead of just Package Attrs;. Then call it using:

use TWiki::Plugins::MyFirstPlugin::Attrs;
$var = MyFirstPlugin::Attrs->new();

Measuring and Improving the Plugin Performance

A high quality Plugin performs well. You can use the TWiki:Plugins.PluginBenchmarkAddOn to measure your TWiki:Plugins.PluginBenchmarks. The data is needed as part of the Documentation Topic.

See also Hints on Writing Fast Plugins.

Writing the Documentation Topic

The Plugin documentation topic contains usage instructions and version details. It serves the Plugin files as FileAttachments for downloading. (The doc topic is also included in the distribution package.) To create a documentation topic:

  1. Copy the Plugin topic template from TWiki.org. To copy the text, go to TWiki:Plugins/PluginPackage and:
    • enter the Plugin name in the "How to Create a Plugin" section
    • click Create
    • select all in the Edit box & copy
    • Cancel the edit
    • go back to your site to the TWiki web
    • In the GoBox enter your Plugin name, for example MyFirstPlugin, press enter and create the new topic
    • paste & save new Plugin topic on your site
  2. Customize your Plugin topic.
    • Important: In case you plan to publish your Plugin on TWiki.org, use Interwiki names for author names and links to TWiki.org topics, such as TWiki:Main/TWikiGuest. This is important because links should work properly in a Plugin topic installed on any TWiki, not just on TWiki.org.
  3. Document the performance data you gathered while measuring the performance
  4. Save your topic, for use in packaging and publishing your Plugin.

OUTLINE: Doc Topic Contents
Check the Plugins web on TWiki.org for the latest Plugin doc topic template. Here's a quick overview of what's covered:

Syntax Rules: <Describe any special text formatting that will be rendered.>"

Example: <Include an example of the Plugin in action. Possibly include a static HTML version of the example to compare if the installation was a success!>"

Plugin Settings: <Description and settings for custom Plugin %VARIABLES%, and those required by TWiki.>"

  • Plugins Preferences <If user settings are needed, explain... Entering values works exactly like TWikiPreferences and WebPreferences: six (6) spaces and then:>"
    • Set <EXAMPLE = value added>

Plugin Installation Instructions: <Step-by-step set-up guide, user help, whatever it takes to install and run, goes here.>"

Plugin Info: <Version, credits, history, requirements - entered in a form, displayed as a table. Both are automatically generated when you create or edit a page in the TWiki:Plugins web.>"

Packaging for Distribution

The TWiki:Plugins.BuildContrib is a powerful build environment that is used by the TWiki project to build TWiki itself, as well as many of the Plugins. You don't have to use it, but it is highly recommended!

If you don't want (or can't) use the BuildContrib, then a minimum Plugin release consists of a Perl module with a WikiName that ends in Plugin, ex: MyFirstPlugin.pm, and a documentation page with the same name(MyFirstPlugin.txt).

  1. Distribute the Plugin files in a directory structure that mirrors TWiki. If your Plugin uses additional files, include them all:
    • lib/TWiki/Plugins/MyFirstPlugin.pm
    • data/TWiki/MyFirstPlugin.txt
    • pub/TWiki/MyFirstPlugin/uparrow.gif [a required graphic]
  2. Create a zip archive with the Plugin name (MyFirstPlugin.zip) and add the entire directory structure from Step 1. The archive should look like this:
    • lib/TWiki/Plugins/MyFirstPlugin.pm
    • data/TWiki/MyFirstPlugin.txt
    • pub/TWiki/MyFirstPlugin/uparrow.gif

Publishing for Public Use

You can release your tested, packaged Plugin to the TWiki community through the TWiki:Plugins web. All Plugins submitted to TWiki.org are available for download and further development in TWiki:Plugins/PluginPackage.

Publish your Plugin by following these steps:

  1. Post the Plugin documentation topic in the TWiki:Plugins/PluginPackage:
    • enter the Plugin name in the "How to Create a Plugin" section, for example MyFirstPlugin
    • paste in the topic text from Writing the Documentation Topic and save
  2. Attach the distribution zip file to the topic, ex: MyFirstPlugin.zip
  3. Link from the doc page to a new, blank page named after the Plugin, and ending in Dev, ex: MyFirstPluginDev. This is the discussion page for future development. (User support for Plugins is handled in TWiki:Support.)
  4. Put the Plugin into the SVN repository, see TWiki:Plugins/ReadmeFirst (optional)

NEW Once you have done the above steps once, you can use the BuildContrib to upload updates to your Plugin.

Thank you very much for sharing your Plugin with the TWiki community smile

Recommended Storage of Plugin Specific Data

Plugins sometimes need to store data. This can be Plugin internal data such as cache data, or data generated for browser consumption such as images. Plugins should store data using TWikiFuncDotPm functions that support saving and loading of topics and attachments.

Plugin Internal Data

You can create a Plugin "work area" using the TWiki::Func::getWorkArea() function, which gives you a persistant directory where you can store data files. By default they will not be web accessible. The directory is guaranteed to exist, and to be writable by the webserver user. For convenience, TWiki::Func::storeFile() and TWiki::Func::readFile() are provided to persistently store and retrieve simple data in this area.

Web Accessible Data

Topic-specific data such as generated images can be stored in the topic's attachment area, which is web accessible. Use the TWiki::Func::saveAttachment() function to store the data.

Recommendation for file name:

  • Prefix the filename with an underscore (the leading underscore avoids a nameclash with files attached to the same topic)
  • Identify where the attachment originated from, typically by including the Plugin name in the file name
  • Use only alphanumeric characters, underscores, dashes and periods to avoid platform dependency issues and URL issues
  • Example: _FooBarPlugin_img123.gif

Web specific data can be stored in the Plugin's attachment area, which is web accessible. Use the TWiki::Func::saveAttachment() function to store the data.

Recommendation for file names in Plugin attachment area:

  • Prefix the filename with an underscore
  • Include the name of the web in the filename
  • Use only alphanumeric characters, underscores, dashes and periods to avoid platform dependency issues and URL issues
  • Example: _Main_roundedge-ul.gif

Maintaining Plugins

Discussions and Feedback on Plugins

Each published Plugin has a Plugin development topic on TWiki.org. Plugin development topics are named after your Plugin and end in Dev, such as MyFirstPluginDev. The Plugin development topic is a great resource to discuss feature enhancements and to get feedback from the TWiki community.

Maintaining Compatibility with Earlier TWiki Versions

The Plugin interface (TWikiFuncDotPm functions and handlers) evolve over time. TWiki 4.0 introduced new API functions to address the needs of Plugin authors. It also deprecated some functions. Some Plugins written for earlier TWiki releases using unofficial TWiki internal functions no longer work on the TWiki 4.0 codebase. All this means that some Plugins need to be updated to work on the TWiki 4.0 codebase.

Organizations typically do not upgrade to the latest TWiki for many months. However, many administrators still would like to install the latest versions of a Plugin on their older TWiki installation. This need is fullfilled if Plugins are maintained in a compatible manner.

TIP Tip: Plugins can be written to be compatible with older and newer TWiki releases. This can be done also for Plugins using unofficial TWiki internal functions of an earlier release that no longer work on the latest TWiki codebase. TWiki:TWiki.TWikiPluginsSupplement#MaintainPlugins has more.

Handling deprecated functions

From time-to-time, the TWiki developers will add new functions to the interface (either to TWikiFuncDotPm, or new handlers). Sometimes these improvements mean that old functions have to be deprecated to keep the code manageable. When this happens, the deprecated functions will be supported in the interface for at least one more TWiki release, and probably longer, though this cannot be guaranteed.

When a plugin defines deprecated handlers, a warning will be shown in the list generated by %FAILEDPLUGINS%. Admins who see these warnings should check TWiki.org and if necessary, contact the plugin author, for an updated version of the plugin.

Updated plugins may still need to define deprecated handlers for compatibility with old TWiki versions. In this case, the plugin package that defines old handlers can suppress the warnings in %FAILEDPLUGINS%.

This is done by defining a map from the handler name to the TWiki::Plugins version in which the handler was first deprecated. For example, if we need to define the endRenderingHandler for compatibility with TWiki::Plugins versions before 1.1, we would add this to the plugin:

package TWiki::Plugins::SinkPlugin;
use vars qw( %TWikiCompatibility );
$TWikiCompatibility{endRenderingHandler} = 1.1;
If the currently-running TWiki version is 1.1 or later, then the handler will not be called and the warning will not be issued. TWiki with versions of TWiki::Plugins before 1.1 will still call the handler as required.

Revision 4727 Mar 2005 - Main.TWikiContributor

Line: 1 to 1
 

TWiki Reference Manual (TWiki-4.1.2, Sat, 03 Mar 2007, build 13046)

Related Topics: UserDocumentationCategory, SearchHelp, TWikiVariables#VarSEARCH, SearchPatternCookbook, RegularExpression

-- Contributors: TWiki:Main.PeterThoeny, TWiki:Main.CrawfordCurrie


 

File Attachments

Each topic can have one or more files of any type attached to it by using the Attach screen to upload (or download) files from your local PC. Attachments are stored under revision control: uploads are automatically backed up; all previous versions of a modified file can be retrieved.

What Are Attachments Good For?

File Attachments can be used to archive data, or to create powerful customized groupware solutions, like file sharing and document management systems, and quick Web page authoring.

Document Management System

  • You can use Attachments to store and retrieve documents (in any format, with associated graphics, and other media files); attach documents to specific TWiki topics; collaborate on documents with full revision control; distribute documents on a need-to-know basis using web and topic-level access control; create a central reference library that's easy to share with an user group spread around the world.

File Sharing

  • For file sharing, FileAttachments on a series of topics can be used to quickly create a well-documented, categorized digital download center for all types of files: documents; graphics and other media; drivers and patches; applications; anything you can safely upload!

Web Authoring

  • Through your Web browser, you can easily upload graphics (or sound files, or anything else you want to link to on a page) and place them on a single page, or use them across a web, or site-wide.
    • NOTE: You can also add graphics - any files - directly, typically by FTP upload. This requires FTP access, and may be more convenient if you have a large number of files to load. FTP-ed files can't be managed using browser-based Attachment controls. You can use your browser to create TWikiVariables shortcuts, like this %H% = HELP.

Uploading Files

  • Click on the Attach link at the bottom of the page. The Attach screen lets you browse for a file, add a comment, and upload it. The uploaded file will show up in the File Attachment table.
    • NOTE: The topic must already exist. It is a two step process if you want to attach a file to a non-existing topic; first create the topic, then add the file attachment.
    • Any type of file can be uploaded. Some files that might pose a security risk are renamed, ex: *.php files are renamed to *.php.txt so that no one can place code that would be read in a .php file.
    • The previous upload path is retained for convenience. In case you make some changes to the local file and want to upload it, again you can copy the previous upload path into the Local file field.
    • TWiki can limit the file size. This is defined by the %ATTACHFILESIZELIMIT% variable of the TWikiPreferences, currently set at 10000 KB.
      • ALERT! It's not recommended to upload files greater than a few hundred K through a browser. Large files can be extremely slow-loading, and often time out. Use an FTP site for large file uploads.
  • Automatic attachments:
    • When enabled, all files in a topic's attachment directory are shown as attachments to the topic - even if they were directly copied to the directory and never attached by using an 'Attach' link. This is a convenient way to quickly "attach" files to a topic without uploading them one by one; although at the cost of losing audit trail and version control.
    • To enable this feature, set the {AutoAttachPubDir} configuration option.
    • NOTE: The automatic attachment feature can only be used by an administrator who has access to the server's file system.

Downloading Files

  • ALERT! NOTE: There is no access control on individual attachments. If you need control over single files, create a separate topic per file and set topic-level access restrictions for each.

Moving Attachment Files

An attachment can be moved between topics.

  • Click Manage on the Attachment to be moved.
  • On the control screen, select the new web and/or topic.
  • Click Move. The attachment and its version history are moved. The original location is stored as topic Meta Data.

Deleting Attachments

Move unwanted Attachments to web Trash, topic TrashAttachment.

Linking to Attached Files

  • Once a file is attached it can be referenced in the topic. Example:
    1. Attach file: Sample.txt
    2. Edit topic and enter: %ATTACHURL%/Sample.txt
    3. Preview: %ATTACHURL%/Sample.txt text appears as: /pub/TWiki/FileAttachment/Sample.txt, a link to the text file.

  • To reference an attachment located in another topic, enter:
    • %PUBURLPATH%/%WEB%/OtherTopic/Sample.txt (if it's within the same web)
    • %PUBURLPATH%/Otherweb/OtherTopic/Sample.txt (if it's in a different web)

  • Attached HTML files and text files can be inlined in a topic. Example:
    1. Attach file: Sample.txt
    2. Edit topic and write text: %INCLUDE{"%ATTACHURL%/Sample.txt"}%
      • Content of attached file is shown inlined.
      • Read more about INCLUDE in TWikiVariables

  • GIF, JPG and PNG images can be attached and shown embedded in a topic. Example:
    1. Attach file: Smile.gif
    2. Edit topic and write text: %ATTACHURL%/Smile.gif
    3. Preview: text appears as /pub/TWiki/FileAttachment/Smile.gif, an image.

File Attachment Contents Table

Files attached to a topic are displayed in a directory table, displayed at the bottom of the page, or optionally, hidden and accessed when you click Attach.

Topic attachments
I Attachment Action Size Date Who Comment
txttxt Sample.txt manage 0.1 K 22 Jul 2000 - 19:37 TWikiContributor Just a sample
gifgif Smile.gif manage 0.1 K 22 Jul 2000 - 19:38 TWikiContributor Smiley face
<--//twikiAttachments-->

File Attachment Controls

Clicking on a Manage link takes you to a new page that looks a bit like this (depending on what skin is selected):

Attach new file

Select a new local file to update attachment Sample.txt (UploadingUser)
Upload up to 10000 KB.

<-- /twikiFormStep-->

Comment

Describe the file so other people know what it is.

<-- /twikiFormStep-->

Properties

Images will be displayed, for other attachments a link will be created.

Attachments will not be shown in topic view page.

<-- /twikiFormStep-->
<-- /twikiFormStep-->
<-- /twikiFormSteps-->
or Cancel
<--/patternTopicActions-->

  • The first table is a list of all attachments, including their attributes. An h means the attachment is hidden, it isn't listed when viewing a topic.

  • The second table is all the versions of the attachment. Click on View to see that version. If it's the most recent version, you'll be taken to an URL that always displays the latest version, which is usually what you want.
    • To change the comment on an attachment, enter a new comment and then click Change properties. Note that the comment listed against the specific version will not change, however the comment displayed when viewing the topic does change.
    • To hide/unhide an attachment, enable the Hide file checkbox, then click Change properties.

Known Issues

  • Unlike topics, attachments are not locked during editing. As a workaround, you can change the comment to indicate an attachment file is being worked on - the comment on the specific version isn't lost, it's there when you list all versions of the attachment.
  • Attachments are not secured. Anyone can read them if they know the name of the web, topic and attachment.


Line: 57 to 52
 

TWiki Skins

Skins overlay regular templates to give different looks and feels to TWiki screens.

Overview

TWiki uses TWikiTemplates files as the basis of all the screens it uses to interact with users. Each screen has an associated template file that contains the basic layout of the screen. This is then filled in by the code to generate what you see in the browser.

TWiki ships with a default set of template files that give a basic look-and-feel. TWiki also includes support for skins that can be selected to give different, more sophisticated, look and feels. A default TWiki installation will usually start up with the PatternSkin already selected. Skins may also be defined by third parties and loaded into a TWiki installation to give more options. To see how TWiki looks when no skin is selected, view this topic with a non-existant skin.

Topic text is not affected by the choice of skin, though a skin can be defined to use a CSS (Cascading Style Sheet), which can sometimes give a radically different appearance to the text.

Relevant links on TWiki.org:

See other types of extensions: TWikiAddOns, TWikiContribs, TWikiPlugins

Changing the default TWiki skin

TWiki default ships with the skin PatternSkin activated. If you want to modify the layout, colors or even the templates to suit your own needs, have a look first at the topics PatternSkinCustomization and PatternSkinCssCookbook.

Defining Skins

You may want to define your own skin, for example to comply with corporate web guidelines, or because you have a aesthetic vision that you want to share.

The TWikiTemplates files used for skins are located in the twiki/templates directory and are named according to the skin: <scriptname>.<skin>.tmpl. Skin files may also be defined in TWiki topics - see TWikiTemplates for details.

To start creating a new skin, copy the default TWikiTemplates (like view.tmpl), or copy an existing skin to use as a base for your own skin. You should only need to copy the files you intend to customise, as TWiki can be configured to fall back to another skin if a template is not defined in your skin. Name the files as described above (for example view.myskin.tmpl.

For your own TWiki skin you are encouraged to show a small 80x31 pixel This site is powered by the TWiki collaboration platform logo at the bottom of your skin:

<a href="http://twiki.org/"><img src="%PUBURL%/%TWIKIWEB%/TWikiLogos/T-logo-80x15.gif" alt="This site is powered by the TWiki collaboration platform" width="80" height="15" title="This site is powered by the TWiki collaboration platform" border="0" /></a>

The standard TWiki skins show the logo in the %WEBCOPYRIGHT% variable.

ALERT! Note: Two skin names have reserved meanings; text skin, and skin names starting with rss have hard-coded meanings.

The following template files are used for TWiki screens, and are referenced in the TWiki core code. If a skin doesn't define its own version of a template file, then TWiki will fall back to the next skin in the skin path, or finally, to the default version of the template file.

(Certain template files are expected to provide certain TMPL:DEFs - these are listed in sub-bullets)

  • addform - used to select a new form for a topic
  • attachagain - used when refreshing an existing attachment
  • attachnew - used when attaching a new file to a topic
  • attachtables - defines the format of attachments at the bottom of the standard topic view
    • ATTACH:files:footer, ATTACH:files:header, ATTACH:files:row, ATTACH:versions:footer, ATTACH:versions:header, ATTACH:versions:row
  • changeform - used to change the form in a topic
  • changes - used by the changes script
  • edit - used for the edit screen
  • form
  • formtables - used to defined the format of forms
    • FORM:display:footer, FORM:display:header, FORM:display:row
  • login - used for loggin in when using the TemplateLoginManager
    • LOG_IN, LOG_IN_BANNER, LOG_OUT, LOGGED_IN_BANNER, NEW_USER_NOTE, UNRECOGNISED_USER
  • moveattachment - used when moving an attachment
  • oopsaccessdenied - used to format Access Denied messages
    • no_such_topic, no_such_web, only_group, topic_access
  • oopsattention - used to format Attention messages
    • already_exists, bad_email, bad_ver_code, bad_wikiname, base_web_missing, confirm, created_web, delete_err, invalid_web_color, invalid_web_name, in_a_group, mandatory_field, merge_notice, missing_action, missing_fields, move_err, missing_action, no_form_def, no_users_to_reset, notwikiuser, oversized_upload, password_changed, password_mismatch, problem_adding, remove_user_done, rename_err, rename_not_wikiword, rename_topic_exists, rename_web_err, rename_web_exists, rename_web_prerequisites, reset_bad, reset_ok, save_error, send_mail_error, thanks, topic_exists, unrecognized_action, upload_name_changed, web_creation_error, web_exists, web_missing, wrong_password, zero_size_upload
  • oopschangelanguage - used to prompt for a new language when internationalisation is enabled
  • oopsgeneric - a basic dialog for user information; provides "ok" button only
  • oopslanguagechanged - used to confirm a new language when internationalisation is enabled
  • oopsleaseconflict - used to format lease Conflict messages
    • lease_active, lease_old
  • preview - used for previewing edited topics before saving
  • rdiff - used for viewing topic differences
  • registernotify - used by the user registration system
  • registernotifyadmin - used by the user registration system
  • rename - used when renaming a topic
  • renameconfirm - used when renaming a topic
  • renamedelete - used when renaming a topic
  • renameweb - used when renaming a web
  • renamewebconfirm - used when renaming a web
  • renamewebdelete - used when renaming a web
  • searchbookview - used to format inline search results in book view
  • searchformat - used to format inline search results
  • search - used by the search CGI script
  • settings
  • view - used by the view CGI script
  • viewprint - used to create the printable view

twiki.tmpl is a master template conventionally used by other templates, but not used directly by code.

ALERT! Note: It is best to create these templates for your skin. If you TMPL:INCLUDE the default templates, or templates from other skins, when you are defining your own skin, you run the risk that the included file might change and break your skin.

Partial customisation, or adding in new features to an existing skin

You can use recusion in the TMPL:INCLUDE chain (eg twiki.classic.tmpl contains %TMPL:INCLUDE{"twiki"}%, the templating system will include the next twiki.SKIN in the skin path. For example, to create a customisation of pattern skin, where you only want to remove the edit & WYSIWYG buttons from view page, you create only a view.yourlocal.tmpl:

%TMPL:INCLUDE{"view"}%
%TMPL:DEF{"edit_topic_link"}%%TMPL:END%
%TMPL:DEF{"edit_wysiwyg_link"}%%TMPL:END%
and then set SKIN=yourlocal,pattern.

Because ClassicSkin and the default templates use the same Template definition names, you can over-ride the edit links in them (or any skin derived from them) using the same view.yourlocal.tmpl (just set SKIN=yourlocal,classic either in TWikiPreferences for globally, or a Web's Webname.WebPreferences for a particular web)

Variables in Skins

You can use template variables, TWikiVariables, and other predefined variables to compose your skins. Some commonly used variables in skins:

Variable: Expanded to:
%WEBLOGONAME% Filename of web logo
%WEBLOGOIMG% Image URL of web logo
%WEBLOGOURL% Link of web logo
%WEBLOGOALT% Alt text of web logo
%WIKILOGOURL% Link of page logo
%WIKILOGOIMG% Image URL of page logo
%WIKILOGOALT% Alt text of page logo
%WEBBGCOLOR% Web-specific background color, defined in the WebPreferences
%WIKITOOLNAME% The name of your TWiki site
%SCRIPTURL% The script URL of TWiki
%SCRIPTURLPATH% The script URL path
%SCRIPTSUFFIX% The script suffix, ex: .pl, .cgi
%WEB% The name of the current web.
%TOPIC% The name of the current topic.
%WEBTOPICLIST% Common links of current web, defined in the WebPreferences. It includes a Go box
%TEXT% The topic text, e.g. the content that can be edited
%META{"form"}% TWikiForm, if any
%META{"attachments"}% FileAttachment table
%META{"parent"}% The topic parent
%EDITTOPIC% Edit link
%REVTITLE% The revision title, if any, ex: (r1.6)
%REVINFO% Revision info, ex: r1.6 - 24 Dec 2002 - 08:12 GMT - TWikiGuest
%WEBCOPYRIGHT% Copyright notice, defined in the WebPreferences
%BROADCASTMESSAGE% Broadcast message at the beginning of your view template, can be used to alert users of scheduled downtimes; can be set in TWikiPreferences

The "Go" Box and Navigation Box

The default skins include a "Go" box, also called "Jump" box, to jump to a topic.

The box also understands URLs, e.g. you can type http://www.google.com/ to jump to an external web site. The feature is handy if you build a skin that has a select box of frequently used links, like Intranet home, employee database, sales database and such. A little JavaScript gets into action on the onchange method of the select tag to fill the selected URL into the "Go" box field, then submits the form.

Here is an example form that has a select box and the "Go" box for illustration purposes. You need to have JavaScript enabled for this to work:

Bare bones header, for demo only
Navigate:
Jump:

Note: Redirect to a URL only works if it is enabled in configure (Miscellaneous, {AllowRedirectUrl}).

Using Cascading Style Sheets

CSS files are gererally attachments to the skin topic that are included in the the skin templates - in the case of PatternSkin in the template styles.pattern.tmpl.

  • To see how CSS is used in the default TWiki skin, see: PatternSkin
  • If you write a complete new skin, this is the syntax to use in a template file:
<style type='text/css' media='all'>@import url('%PUBURLPATH%/%TWIKIWEB%/MySkin/mystyle.css');</style>

Attachment Tables

Controlling the look and feel of attachment tables is a little bit more complex than for the rest of a skin. By default, the attachment table is a standard TWiki table, and the look is controlled in the same way as other tables. In a very few cases you may want to change the content of the table as well.

The format of standard attachment tables is defined through the use of special TWiki template macros which by default, are defined in the attachtables.tmpl template using the %TMPL:DEF macro syntax described in TWikiTemplates. These macros are:

Macro Description
ATTACH:files:header Standard title bar
ATTACH:files:row Standard row
ATTACH:files:footer Footer for all screens
ATTACH:files:header:A Title bar for upload screens, with attributes column
ATTACH:files:row:A Row for upload screen
ATTACH:files:footer:A Footer for all screens

The format of tables of file versions in the Upload screen can also be changed, using the macros:

Macro Description
ATTACH:versions:header Header for versions table on upload screen
ATTACH:versions:row Row format for versions table on upload screen
ATTACH:versions:footer Footer for versions table on upload screen

The ATTACH:row macros are expanded for each file in the attachment table, using the following special tags:

Tag Description
%A_URL% URL that will recover the file
%A_REV% Revision of this file
%A_ICON% A file icon suitable for representing the attachment content
%A_FILE% The name of the file
%A_SIZE% The size of the file
%A_DATE% The date the file was uploaded
%A_USER% The user who uploaded it
%A_COMMENT% The comment they put in when uploading it
%A_ATTRS% The attributes of the file as seen on the upload screen e.g "h" for a hidden file

Packaging and Publishing Skins

See TWiki:Plugins/SkinPackagingHowTo and TWiki:Plugins/SkinDeveloperFAQ

Browsing Installed Skins

You can try out all installed skins in the TWikiSkinBrowser.

Activating Skins

TWiki uses a skin search path, which lets you combine skins additively. The skin path is defined using a combination of TWikiVariables and URL parameters.

TWiki works by asking for a template for a particular function - for example, 'view'. The detail of how templates are searched for is described in TWikiTemplates, but in summary, the templates directory is searched for a file called view.skin.tmpl, where skin is the name of the skin e.g. pattern. If no template is found, then the fallback is to use view.tmpl. Each skin on the path is searched for in turn. For example, if you have set the skin path to local,pattern then view.local.tmpl will be searched for first, then view.pattern.tmpl and finally view.tmpl.

The basic skin is defined by a SKIN setting:

  • Set SKIN = catskin, bearskin

You can also add a parameter to the URL, such as ?skin=catskin,bearskin:

Setting SKIN (or the ?skin parameter in the URL) replaces the existing skin path setting, for the current page only. You can also extend the existing skin path as well, using covers.

  • Set COVER = ruskin

This pushes a different skin to the front of the skin search path (so for our example above, that final skin path will be ruskin, catskin, bearskin). There is also an equivalent cover URL parameter. The difference between setting SKIN vs. COVER is that if the chosen template is not found (e.g., for included templates), SKIN will fall back onto the next skin in line, or the default skin, if only one skin was present, while COVER will always fall back onto the current skin.

An example would be invoking the printable mode, which is achieved by applying ?cover=print. The view.print.tmpl simply invokes the viewprint template for the current skin which then can appropriately include all other used templates for the current skin. Where the printable mode be applied by using SKIN, all skins would have the same printable appearance.

The full skin path is built up as follows: SKIN setting (or ?skin if it is set), then COVER setting is added, then ?cover.

Hard-Coded Skins

The text skin is reserved for TWiki internal use.

Skin names starting with rss also have a special meaning; if one or more of the skins in the skin path starts with 'rss' then 8-bit characters will be encoded as XML entities in the output, and the content-type header will be forced to text/xml.

Related Topics: TWikiSkinBrowser, AdminDocumentationCategory, DeveloperDocumentationCategory, TWiki:TWiki.TWikiSkinsSupplement

-- Contributors: TWiki:Main.PeterThoeny, TWiki:Main.MikeMannix, TWiki:Main.CrawfordCurrie

Deleted:
<
<

TWiki Formatted Search

Inline search feature allows flexible formatting of search result

The default output format of a %SEARCH{...}% is a table consisting of topic names and topic summaries. Use the format="..." parameter to customize the search result. The format parameter typically defines a bullet or a table row containing variables, such as %SEARCH{ "food" format="| $topic | $summary |" }%. See %SEARCH{...}% for other search parameters, such as separator="".

Syntax

Two parameters can be used to specify a customized search result:

1. header="..." parameter

Use the header parameter to specify the header of a search result. It should correspond to the format of the format parameter. This parameter is optional.
Example: header="| *Topic:* | *Summary:* |"

Variables that can be used in the header string:

Name: Expands To:
$web Name of the web
$n or $n() New line. Use $n() if followed by alphanumeric character, e.g. write Foo$n()Bar instead of Foo$nBar
$nop or $nop() Is a "no operation". This variable gets removed; useful for nested search
$quot Double quote ("). Alternatively write \" to escape it
$percnt Percent sign (%)
$dollar Dollar sign ($)

2. format="..." parameter

Use the format parameter to specify the format of one search hit.
Example: format="| $topic | $summary |"

Variables that can be used in the format string:

Name: Expands To:
$web Name of the web
$topic Topic name
$topic(20) Topic name, "- " hyphenated each 20 characters
$topic(30, -<br />) Topic name, hyphenated each 30 characters with separator "-<br />"
$topic(40, ...) Topic name, shortended to 40 characters with "..." indication
$parent Name of parent topic; empty if not set
$parent(20) Name of parent topic, same hyphenation/shortening like $topic()
$text Formatted topic text. In case of a multiple="on" search, it is the line found for each search hit.
$locked LOCKED flag (if any)
$date Time stamp of last topic update, e.g. 22 Aug 2019 - 12:53
$isodate Time stamp of last topic update, e.g. 2019-08-22T12:53Z
$rev Number of last topic revision, e.g. 4
$username Login name of last topic update, e.g. jsmith
$wikiname Wiki user name of last topic update, e.g. JohnSmith
$wikiusername Wiki user name of last topic update, like Main.JohnSmith
$createdate Time stamp of topic revision 1
$createusername Login name of topic revision 1, e.g. jsmith
$createwikiname Wiki user name of topic revision 1, e.g. JohnSmith
$createwikiusername Wiki user name of topic revision 1, e.g. Main.JohnSmith
$summary Topic summary, just the plain text, all formatting and line breaks removed; up to 162 characters
$summary(50) Topic summary, up to 50 characters shown
$summary(showvarnames) Topic summary, with %ALLTWIKI{...}% variables shown as ALLTWIKI{...}
$summary(noheader) Topic summary, with leading ---+ headers removed
Note: The tokens can be combined, for example $summary(100, showvarnames, noheader)
$changes Summary of changes between latest rev and previous rev
$changes(n) Summary of changes between latest rev and rev n
$formname The name of the form attached to the topic; empty if none
$formfield(name) The field value of a form field; for example, $formfield(TopicClassification) would get expanded to PublicFAQ. This applies only to topics that have a TWikiForm
$formfield(name, 10) Form field value, "- " hyphenated each 10 characters
$formfield(name, 20, -<br />) Form field value, hyphenated each 20 characters with separator "-<br />"
$formfield(name, 30, ...) Form field value, shortended to 30 characters with "..." indication
$pattern(reg-exp) A regular expression pattern to extract some text from a topic (does not search meta data; use $formfield instead). In case of a multiple="on" search, the pattern is applied to the line found in each search hit.
• Specify a RegularExpression that covers the whole text (topic or line), which typically starts with .*, and must end in .*
• Put text you want to keep in parenthesis, like $pattern(.*?(from here.*?to here).*)
• Example: $pattern(.*?\*.*?Email\:\s*([^\n\r]+).*) extracts the e-mail address from a bullet of format * Email: ...
• This example has non-greedy .*? patterns to scan for the first occurance of the Email bullet; use greedy .* patterns to scan for the last occurance
• Limitation: Do not use .*) inside the pattern, e.g. $pattern(.*foo(.*)bar.*) does not work, but $pattern(.*foo(.*?)bar.*) does
• Note: Make sure that the integrity of a web page is not compromised; for example, if you include an HTML table make sure to include everything including the table end tag
$count(reg-exp) Count of number of times a regular expression pattern appears in the text of a topic (does not search meta data). Follows guidelines for use and limitations outlined above under $pattern(reg-exp). Example: $count(.*?(---[+][+][+][+]) .*) counts the number of <H4> headers in a page.
$n or $n() New line. Use $n() if followed by alphanumeric character, e.g. write Foo$n()Bar instead of Foo$nBar
$nop or $nop() Is a "no operation". This variable gets removed; useful for nested search
$quot Double quote ("). Alternatively write \" to escape it
$percnt Percent sign (%)
$dollar Dollar sign ($)

Examples

Here are some samples of formatted searches. The SearchPatternCookbook has other examples, such as creating a picklist of usernames, searching for topic children and more.

Bullet list showing topic name and summary

Write this:

%SEARCH{ "FAQ" scope="topic" nosearch="on" nototal="on" header="   * *Topic: Summary:*" format="   * [[$topic]]: $summary" }%

To get this:

  • Topic: Summary:
  • TWikiFAQ: Frequently Asked Questions About TWiki This is a real FAQ, and also a demo of an easily implemented knowledge base solution. To see how it's done, view the source ...
  • TWikiFaqTemplate: FAQ: Answer: Back to: TWikiFAQ
  • TextFormattingFAQ: Text Formatting FAQ The most frequently asked questions about text formatting are answered. Also, TextFormattingRules contains the complete TWiki shorthand system ...

Table showing form field values of topics with a form

In a web where there is a form that contains a TopicClassification field, an OperatingSystem field and an OsVersion field we could write:

| *Topic:* | *OperatingSystem:* | *OsVersion:* |
%SEARCH{ "[T]opicClassification.*?value=\"[P]ublicFAQ\"" scope="text" type="regex" nosearch="on" nototal="on" format="| [[$topic]] | $formfield(OperatingSystem) | $formfield(OsVersion) |" }%

To get this:

Topic: OperatingSystem: OsVersion:
IncorrectDllVersionW32PTH10DLL OsWin 95/98
WinDoze95Crash OsWin 95

Extract some text from a topic using regular expression

Write this:

%SEARCH{ "__Back to\:__ TWikiFAQ" scope="text" type="regex" nosearch="on" nototal="on" header="TWiki FAQs:" format="   * $pattern(.*?FAQ\:[\n\r]*([^\n\r]+).*) [[$topic][Answer...]]" }%

To get this:

TWiki FAQs:

  • How can I create a simple TWiki Form based application? Answer...
  • How do I delete or rename a topic? Answer...
  • How do I delete or rename a file attachment? Answer...
  • Why does the topic revision not increase when I edit a topic? Answer...
  • TWiki has a GPL (GNU General Public License). What is GPL? Answer...
  • I've problems with the WebSearch. There is no Search Result on any inquiry. By clicking the Index topic it's the same problem. Answer...
  • What happens if two of us try to edit the same topic simultaneously? Answer...
  • I would like to install TWiki on my server. Can I get the source? Answer...
  • What does the "T" in TWiki stand for? Answer...
  • So what is this WikiWiki thing exactly? Answer...
  • Everybody can edit any page, this is scary. Doesn't that lead to chaos? Answer...

Nested Search

Search can be nested. For example, search for some topics, then form a new search for each topic found in the first search. The idea is to build the nested search string using a formatted search in the first search.

Here is an example. Let's search for all topics that contain the word "culture" (first search), and let's find out where each topic found is linked from (second search).

  • First search:
    • %SEARCH{ "culture" format="   * $topic is referenced by: (list all references)" nosearch="on" nototal="on" }%
  • Second search. For each hit we want this search:
    • %SEARCH{ "(topic found in first search)" format="$topic" nosearch="on" nototal="on" separator=", " }%
  • Now let's nest the two. We need to escape the second search, e.g. the first search will build a valid second search string. Note that we escape the second search so that it does not get evaluated prematurely by the first search:
    • Use $percnt to escape the leading percent of the second search
    • Use \" to escape the double quotes
    • Use $dollar to escape the $ of $topic
    • Use $nop to escape the }% sequence

Write this:

%SEARCH{ "culture" format="   * $topic is referenced by:$n      * $percntSEARCH{ \"$topic\" format=\"$dollartopic\" nosearch=\"on\" nototal=\"on\" separator=\", \" }$nop%" nosearch="on" nototal="on" }%

To get this:

Note: Nested search can be slow, especially if you nest more then 3 times. Nesting is limited to 16 levels. For each new nesting level you need to "escape the escapes", e.g. write $dollarpercntSEARCH{ for level three, $dollardollarpercntSEARCH{ for level four, etc.

Most recently changed pages

Write this:

%SEARCH{ "\.*" scope="topic" type="regex" nosearch="on" nototal="on" order="modified" reverse="on"  format="| [[$topic]] | $wikiusername  | $date |" limit="7" }%

To get this:

TWikiPreferences UgoDallago 28 May 2015 - 09:23
WebPreferences UgoDallago 04 Feb 2010 - 14:40
WysiwygPlugin TWikiContributor 16 Jan 2007 - 04:12
WikiReferences TWikiContributor 17 Nov 2006 - 06:10
WebTopicViewTemplate TWikiContributor 15 Nov 2006 - 19:43
WhatDoesTWikiStandFor TWikiContributor 16 Oct 2006 - 03:59
WikiWord TWikiContributor 04 Oct 2006 - 20:12

Search with conditional output

A regular expression search is flexible, but there are limitations. For example, you cannot show all topics that are up to exactly one week old, or create a report that shows all records with invalid form fields or fields within a certain range, etc. You need some additional logic to format output based on a condition:

  1. Specify a search which returns more hits then you need
  2. For each search hit apply a spreadsheet formula to determine if the hit is needed
  3. If needed, format and output the result
  4. Else supress the search hit

This requires the TWiki:Plugins.SpreadSheetPlugin. The following example shows all topics that are up to exactly one week old.

Write this:

%CALC{$SET(weekold, $TIMEADD($TIME(), -7, day))}%
%SEARCH{ "." scope="topic" type="regex" nosearch="on" nototal="on" order="modified" reverse="on" format="$percntCALC{$IF($TIME($date) < $GET(weekold), <nop>, | [[$topic]] | $wikiusername | $date | $rev |)}$percnt" limit="100" }%

  • The first line sets the weekold variable to the serialized date of exactly one week ago
  • The SEARCH has a deferred CALC. The $percnt makes sure that the CALC gets executed once for each search hit
  • The CALC compares the date of the topic with the weekold date
  • If topic is older, a <nop> is returned, which gets removed at the end of the TWiki rendering process
  • Otherwise, the search hit is formatted and returned

To get this:

Embedding search forms to return a formatted result

Use an HTML form and an embedded formatted search on the same topic. You can link them together with an %URLPARAM{"..."}% variable. Example:

Write this:

<form action="%SCRIPTURLPATH{"view"}%/%WEB%/%TOPIC%">
Find Topics: 
<input type="text" name="q" size="32" value="%URLPARAM{"q"}%" />&nbsp;<input type="submit" class="twikiSubmit" value="Search" />
</form>
Result:
%SEARCH{ search="%URLPARAM{"q"}%" format="   * $web.$topic: %BR% $summary" nosearch="on" }%

To get this:

Find Topics:  
Result:
Number of topics: 0
<--/patternSearchResultCount-->

Related Topics: UserDocumentationCategory, SearchHelp, TWikiVariables#VarSEARCH, SearchPatternCookbook, RegularExpression

-- Contributors: TWiki:Main.PeterThoeny, TWiki:Main.CrawfordCurrie

 

TWiki Meta Data

Additional topic data, program-generated or from TWikiForms, is stored in META variable name/value pairs

Overview

TWikiMetaData uses META variables to store topic data that's separate from the main free-form content. This includes program-generated info like FileAttachment and topic movement data, and user-defined TWikiForms info. Use META variables to format and display Meta Data.

Meta Data Syntax

  • Format is the same as in TWikiVariables, except all fields have a key.
    • %META:<type>{key1="value1" key2="value2" ...}%

  • Order of fields within the meta variables is not defined, except that if there is a field with key name, this appears first for easier searching (note the order of the variables themselves is defined).

  • Each meta variable is on one line.

  • \n (new line) is represented in values by %_N_ and " (double-quotes) by %_Q_%.

Example of Format
%META:TOPICINFO{version="1.6" date="976762663" author="LastEditorWikiName" format="1.0"}%
   text of the topic
%META:TOPICMOVED{from="Codev.OldName" to="Codev.NewName"
   by="TopicMoverWikiName" date="976762680"}%
%META:TOPICPARENT{name="NavigationByTopicContext"}%
%META:FILEATTACHMENT{name="Sample.txt" version="1.3" ... }%
%META:FILEATTACHMENT{name="Smile.gif" version="1.1" ... }%
%META:FORM{name="WebFormTemplate"}%
%META:FIELD{name="OperatingSystem" value="OsWin"}%
%META:FIELD{name="TopicClassification" value="PublicFAQ"}%

Meta Data Specifications

The current version of Meta Data is 1.0, with support for the following variables.

META:TOPICINFO

Key Comment
version Same as RCS version
date integer, unix time, seconds since start 1970
author last to change topic, is the REMOTE_USER
format Format of this topic, will be used for automatic format conversion

META:TOPICMOVED

This is optional, exists if topic has ever been moved. If a topic is moved more than once, only the most recent META:TOPICMOVED meta variable exists in the topic, older ones are to be found in the rcs history.

%META:TOPICMOVED{from="Codev.OldName" to="Codev.NewName" by="talintj" date="976762680"}%

Key Comment
from Full name, i.e., web.topic
to Full name, i.e., web.topic
by Who did it, is the REMOTE_USER, not WikiName
date integer, unix time, seconds since start 1970

Notes:

  • at present version number is not supported directly, it can be inferred from the RCS history.
  • there is only one META:TOPICMOVED in a topic, older move information can be found in the RCS history.

META:TOPICPARENT

Key Comment
name The topic from which this was created, typically when clicking on a ? questionmark link, or by filling out a form. Normally just TopicName, but it can be a full Web.TopicName format if the parent is in a different Web.

META:FILEATTACHMENT

Key Comment
name Name of file, no path. Must be unique within topic
version Same as RCS revision
path Full path file was loaded from
size In bytes
date integer, unix time, seconds since start 1970
user the REMOTE_USER, not WikiName
comment As supplied when file uploaded
attr h if hidden, optional

Extra fields that are added if an attachment is moved:

Key Comment
movedfrom full topic name - web.topic
movedby the REMOTE_USER, not WikiName
movedto full topic name - web.topic
moveddate integer, unix time, seconds since start 1970

META:FORM

Key Comment
name A topic name - the topic represents one of the TWikiForms. Can optionally include the web name (i.e., web.topic), but doesn't normally

META:FIELD

Should only be present if there is a META:FORM entry. Note that this data is used when viewing a topic, the form template definition is not read.

Key Name
name Ties to entry in TWikiForms template, is title with all bar alphanumerics and . removed
title Full text from TWikiForms template
value Value user has supplied via form

Recommended Sequence

There is no absolute need for Meta Data variables to be listed in a specific order within a topic, but it makes sense to do so a couple of good reasons:

  • form fields remain in the order they are defined
  • the diff function output appears in a logical order

The recommended sequence is:

  • META:TOPICINFO
  • META:TOPICPARENT (optional)
  • text of topic
  • META:TOPICMOVED (optional)
  • META:FILEATTACHMENT (0 or more entries)
  • META:FORM (optional)
  • META:FIELD (0 or more entries; FORM required)

Viewing Meta Data in Page Source

When viewing a topic the Raw Text link can be clicked to show the text of a topic (i.e., as seen when editing). This is done by adding raw=on to URL. raw=debug shows the meta data as well as the topic data, ex: debug view for this topic

Rendering Meta Data

Meta Data is rendered with the %META% variable. This is mostly used in the view, preview and edit scripts.

You can render form fields in topic text by using the FORMFIELD variable. Example:
%FORMFIELD{"TopicClassification"}%
For details, see VarFORMFIELD.

Current support covers:

Variable usage: Comment:
%META{"form"}% Show form data, see TWikiForms.
%META{"formfield"}% Show form field value. Parameter: name="field_name". Example:
%META{ "formfield" name="TopicClassification" }%
%META{"attachments"}% Show attachments, except for hidden ones. Options:
all="on": Show all attachments, including hidden ones.
%META{"moved"}% Details of any topic moves.
%META{"parent"}% Show topic parent. Options:
dontrecurse="on": By default recurses up tree, at some cost.
nowebhome="on": Suppress WebHome.
prefix="...": Prefix for parents, only if there are parents, default "".
suffix="...": Suffix, only appears if there are parents, default "".
separator="...": Separator between parents, default is " > ".

Note: SEARCH can also be used to render meta data, see examples in FormattedSearch and SearchPatternCookbook.

Known Issues

At present, there is no Meta Data support for Plugins. However, the format is readily extendable and the Meta.pm code that supports the format needs only minor alteration.

Related Topics: DeveloperDocumentationCategory, UserDocumentationCategory

-- Contributors: TWiki:Main.JohnTalintyre, TWiki:Main.MikeMannix, TWiki:Main.PeterThoeny, TWiki:Main.CrawfordCurrie

Line: 67 to 59
 

TWiki Plugins

Add functionality to TWiki with readily available Plugins; create Plugins based on APIs

Overview

You can add Plugins to extend TWiki functionality, without altering the core code. A plug-in approach lets you:

  • add virtually unlimited features while keeping the main TWiki code compact and efficient;
  • heavily customize an installation and still do clean updates to new versions of TWiki;
  • rapidly develop new TWiki functions in Perl using the Plugin API.

Everything to do with TWiki Plugins - demos, new releases, downloads, development, general discussion - is available at TWiki.org, in the TWiki:Plugins web.

TWiki Plugins are developed and contributed by interested members of the community. Plugins are provided on an 'as is' basis; they are not a part of TWiki, but are independently developed and maintained.

Relevant links on TWiki.org:

See other types of extensions: TWikiAddOns, TWikiContribs, TWikiSkins

Installing Plugins

Each TWiki Plugin comes with its own documentation: step-by-step installation instructions, a detailed description of any special requirements, version details, and a working example for testing. Many Plugins have an install script that automates these steps for you.

Special Requirements: Some Plugins need certain Perl modules to be preinstalled on the host system. Plugins may also use other resources, like graphics, other modules, applications, and templates. You should be able to find detailed instructions in the Plugin's documentation.

Each Plugin has a standard release topic, located in the TWiki:Plugins web at TWiki.org. There's usually a number of other related topics, such as a developers page, and an appraisal page.

On-Site Pretesting

The recommended approach to testing new Plugins before making them public is to create a second local TWiki installation, and test the Plugin there. You can allow selected users access to the test area. Once you are satisifed that it won't compromise your main installation, you can install it there as well.

InstalledPlugins shows which Plugins are: 1) installed, 2) loading properly, and 3) what TWiki:Codev.PluginHandlers they invoke. Any failures are shown in the Errors section. The %FAILEDPLUGINS% variable can be used to debug failures. You may also want to check your webserver error log and the various TWiki log files.

Some Notes on Plugin Performance

The performance of the system depends to some extent on the number of Plugins installed and on the Plugin implementation. Some Plugins impose no measurable performance decrease, some do. For example, a Plugin might use many Perl libraries that need to be initialized with each page view (unless you run mod_perl). You can only really tell the performance impact by installing the Plugin and by measuring the performance with and without the new Plugin. Use the TWiki:Plugins.PluginBenchmarkAddOn, or test manually with the Apache ab utility. Example on Unix:
time wget -qO /dev/null /bin/view/TWiki/AbcPlugin

TIP If you need to install an "expensive" Plugin, but you only need its functionality only in a subset of your data, you can disable it elsewhere by defining the %DISABLEDPLUGINS% TWiki variable.

Define DISABLEDPLUGINS to be a comma-separated list of names of plugins to disable. Define it in Main.TWikiPreferences to disable those plugins everywhere, in the WebPreferences topic to disable them in an individual web, or in a topic to disable them in that topic. For example,

   * Set DISABLEDPLUGINS = SpreadSheetPlugin, EditTablePlugin

Managing Installed Plugins

Some Plugins require additional settings or offer extra options that you have to select. Also, you may want to make a Plugin available only in certain webs, or temporarily disable it. And may want to list all available Plugins in certain topics. You can handle all of these management tasks with simple procedures:

Enabling Plugins

Plugins can be enabled and disabled with the configure script. An installed Plugin needs to be enabled before it can be used.

Plugin Evaluation Order

By default, TWiki executes Plugins in alphabetical order on Plugin name. It is possible to change the order, for example to evaluate database variables before the speadsheet CALCs. This can be done with {PluginsOrder} in the Plugins section of configure.

Plugin-Specific Settings

Plugins are usually configured by variables accessible though the configure interface, but in some cases (usually older plugins) TWiki preferences are used. If a TWiki variable is defined in a Plugin topic e.g:

  • Set SETTING = Create dynamic foo bar reports
Then these settings can be retrieved as preferences variables like %<pluginname>_<var>%. For example, %RUBBERPLUGIN_SETTING% shows the value of SETTING in the RubberPlugin topic.

Listing Active Plugins

Plugin status variables let you list all active Plugins wherever needed.

%ACTIVATEDPLUGINS%

On this TWiki site, the enabled Plugins are: SpreadSheetPlugin, CommentPlugin, EditTablePlugin, InterwikiPlugin, PreferencesPlugin, SlideShowPlugin, SmiliesPlugin, TablePlugin, TwistyPlugin, WysiwygPlugin.

%PLUGINDESCRIPTIONS%

  • SpreadSheetPlugin (any TWiki, 10197): Add spreadsheet calculation like "$SUM( $ABOVE() )" to TWiki tables and other topic text
  • CommentPlugin (Dakar, 11359): Allows users to quickly post comments to a page without an edit/preview/save cycle
  • EditTablePlugin (any TWiki, 11646): Edit TWiki tables using edit fields, date pickers and drop down boxes
  • InterwikiPlugin (Dakar, $Rev: 11935$): Link ExternalSite:Page text to external sites based on aliases defined in a rules topic
  • PreferencesPlugin (Dakar, 9839): Allows editing of preferences using fields predefined in a form
  • SlideShowPlugin (Any TWiki, $Rev: 12847$): Create web based presentations based on topics with headings.
  • SmiliesPlugin (Dakar, 8154): Render smilies as icons, like smile for  :-) or eek! for = :eek:=
  • TablePlugin (1.020, 12339): Control attributes of tables and sorting of table columns
  • TwistyPlugin (1.2.0, $Rev: 12154$): Twisty section JavaScript library to open/close content dynamically
  • WysiwygPlugin (Dakar, 12422): Translator framework for Wysiwyg editors

%FAILEDPLUGINS%

PluginErrors
SpreadSheetPlugin none
CommentPlugin none
EditTablePlugin none
InterwikiPlugin none
PreferencesPlugin none
SlideShowPlugin none
SmiliesPlugin none
TablePlugin none
TwistyPlugin none
WysiwygPlugin none
HandlerPlugins
beforeCommonTagsHandlerPreferencesPlugin
TwistyPlugin
WysiwygPlugin
beforeEditHandlerWysiwygPlugin
beforeSaveHandlerCommentPlugin
WysiwygPlugin
commonTagsHandlerSpreadSheetPlugin
CommentPlugin
EditTablePlugin
SlideShowPlugin
SmiliesPlugin
initPluginSpreadSheetPlugin
CommentPlugin
EditTablePlugin
InterwikiPlugin
PreferencesPlugin
SlideShowPlugin
SmiliesPlugin
TablePlugin
TwistyPlugin
WysiwygPlugin
modifyHeaderHandlerWysiwygPlugin
postRenderingHandlerEditTablePlugin
PreferencesPlugin
TwistyPlugin
WysiwygPlugin
preRenderingHandlerInterwikiPlugin
SmiliesPlugin
TablePlugin
10 plugins

The TWiki Plugin API

The Application Programming Interface (API) for TWiki Plugins provides the specifications for hooking into the core TWiki code from your external Perl Plugin module.

Available Core Functions

The TWikiFuncDotPm module (lib/TWiki/Func.pm) describes all the interfaces available to Plugins. Plugins should only use the interfaces described in this module.

ALERT! Note: If you use other core functions not described in Func.pm, you run the risk of creating security holes. Also, your Plugin will likely break and require updating when you upgrade to a new version of TWiki.

Predefined Hooks

In addition to TWiki core functions, Plugins can use predefined hooks, or callbacks, as described in the lib/TWiki/Plugins/EmptyPlugin.pm module.

  • All but the initPlugin are disabled. To enable a callback, remove DISABLE_ from the function name.

TWiki:Codev/StepByStepRenderingOrder helps you decide which rendering handler to use.

Hints on Writing Fast Plugins

  • Delay initialization as late as possible. For example, if your Plugin is a simple syntax processor, you might delay loading extra Perl modules until you actually see the syntax in the text.
  • For example, use an eval block like this:
    eval { require IPC::Run }
    return "<font color=\"red\">SamplePlugin: Can't load required modules ($@)</font>" if $@;
  • You can use a flag to avoid running the initialization twice
  • The TWiki:Plugins.PluginBenchmarkAddOn comes in handy to measure and fine-tune the performance of your Plugin

Plugin Version Detection

To eliminate the incompatibility problems bound to arise from active open Plugin development, a Plugin versioning system is provided for automatic compatibility checking.

  • All modules require a $VERSION='0.000' variable, beginning at 1.000.

  • The initPlugin handler should check all dependencies and return TRUE if the initialization is OK or FALSE if something went wrong.
    • The Plugin initialization code does not register a Plugin that returns FALSE (or that has no initPlugin handler).

  • $TWiki::Plugins::VERSION in the TWiki::Plugins module contains the TWiki Plugin API version, currently 1.11.
    • You can also use the %PLUGINVERSION{}% variable to query the Plugin API version or the version of installed Plugins.

Security

  • Badly written Plugins can open huge security holes in TWiki. This is especially true if care isn't taken to prevent execution of arbitrary commands on the server.
  • Don't allow sensitive configuration data to be edited by users. it is better to add sensitive configuration options to the %TWiki::cfg hash than adding it as preferences in the Plugin topic
  • Always use the TWiki::Sandbox to execute commands.
  • Always audit the Plugins you install, and make sure you are happy with the level of security provided. While every effort is made to monitor Plugin authors activities, at the end of the day they are uncontrolled user contributions.

Creating Plugins

With a reasonable knowledge of the Perl scripting language, you can create new Plugins or modify and extend existing ones. Basic plug-in architecture uses an Application Programming Interface (API), a set of software instructions that allow external code to interact with the main program. The TWiki Plugin API Plugins by providing a programming interface for TWiki.

Anatomy of a Plugin

A basic TWiki Plugin consists of two elements:

  • a Perl module, ex: MyFirstPlugin.pm
  • a documentation topic, ex: MyFirstPlugin.txt

The Perl module can be a block of code that connects with TWiki alone, or it can include other elements, like other Perl modules (including other Plugins), graphics, TWiki templates, external applications (ex: a Java applet), or just about anything else it can call. In particular, files that should be web-accessible (graphics, Java applets ...) are best placed as attachments of the MyFirstPlugin topic. Other needed Perl code is best placed in a lib/TWiki/Plugins/MyFirstPlugin/ directory.

The Plugin API handles the details of connecting your Perl module with main TWiki code. When you're familiar with the Plugin API, you're ready to develop Plugins.

Creating the Perl Module

Copy file lib/TWiki/Plugins/EmptyPlugin.pm to <name>Plugin.pm. The EmptyPlugin.pm module contains mostly empty functions, so it does nothing, but it's ready to be used. Customize it. Refer to the Plugin API specs for more information.

If your Plugin uses its own modules and objects, you must include the name of the Plugin in the package name. For example, write Package MyFirstPlugin::Attrs; instead of just Package Attrs;. Then call it using:

use TWiki::Plugins::MyFirstPlugin::Attrs;
$var = MyFirstPlugin::Attrs->new();

Measuring and Improving the Plugin Performance

A high quality Plugin performs well. You can use the TWiki:Plugins.PluginBenchmarkAddOn to measure your TWiki:Plugins.PluginBenchmarks. The data is needed as part of the Documentation Topic.

See also Hints on Writing Fast Plugins.

Writing the Documentation Topic

The Plugin documentation topic contains usage instructions and version details. It serves the Plugin files as FileAttachments for downloading. (The doc topic is also included in the distribution package.) To create a documentation topic:

  1. Copy the Plugin topic template from TWiki.org. To copy the text, go to TWiki:Plugins/PluginPackage and:
    • enter the Plugin name in the "How to Create a Plugin" section
    • click Create
    • select all in the Edit box & copy
    • Cancel the edit
    • go back to your site to the TWiki web
    • In the GoBox enter your Plugin name, for example MyFirstPlugin, press enter and create the new topic
    • paste & save new Plugin topic on your site
  2. Customize your Plugin topic.
    • Important: In case you plan to publish your Plugin on TWiki.org, use Interwiki names for author names and links to TWiki.org topics, such as TWiki:Main/TWikiGuest. This is important because links should work properly in a Plugin topic installed on any TWiki, not just on TWiki.org.
  3. Document the performance data you gathered while measuring the performance
  4. Save your topic, for use in packaging and publishing your Plugin.

OUTLINE: Doc Topic Contents
Check the Plugins web on TWiki.org for the latest Plugin doc topic template. Here's a quick overview of what's covered:

Syntax Rules: <Describe any special text formatting that will be rendered.>"

Example: <Include an example of the Plugin in action. Possibly include a static HTML version of the example to compare if the installation was a success!>"

Plugin Settings: <Description and settings for custom Plugin %VARIABLES%, and those required by TWiki.>"

  • Plugins Preferences <If user settings are needed, explain... Entering values works exactly like TWikiPreferences and WebPreferences: six (6) spaces and then:>"
    • Set <EXAMPLE = value added>

Plugin Installation Instructions: <Step-by-step set-up guide, user help, whatever it takes to install and run, goes here.>"

Plugin Info: <Version, credits, history, requirements - entered in a form, displayed as a table. Both are automatically generated when you create or edit a page in the TWiki:Plugins web.>"

Packaging for Distribution

The TWiki:Plugins.BuildContrib is a powerful build environment that is used by the TWiki project to build TWiki itself, as well as many of the Plugins. You don't have to use it, but it is highly recommended!

If you don't want (or can't) use the BuildContrib, then a minimum Plugin release consists of a Perl module with a WikiName that ends in Plugin, ex: MyFirstPlugin.pm, and a documentation page with the same name(MyFirstPlugin.txt).

  1. Distribute the Plugin files in a directory structure that mirrors TWiki. If your Plugin uses additional files, include them all:
    • lib/TWiki/Plugins/MyFirstPlugin.pm
    • data/TWiki/MyFirstPlugin.txt
    • pub/TWiki/MyFirstPlugin/uparrow.gif [a required graphic]
  2. Create a zip archive with the Plugin name (MyFirstPlugin.zip) and add the entire directory structure from Step 1. The archive should look like this:
    • lib/TWiki/Plugins/MyFirstPlugin.pm
    • data/TWiki/MyFirstPlugin.txt
    • pub/TWiki/MyFirstPlugin/uparrow.gif

Publishing for Public Use

You can release your tested, packaged Plugin to the TWiki community through the TWiki:Plugins web. All Plugins submitted to TWiki.org are available for download and further development in TWiki:Plugins/PluginPackage.

Publish your Plugin by following these steps:

  1. Post the Plugin documentation topic in the TWiki:Plugins/PluginPackage:
    • enter the Plugin name in the "How to Create a Plugin" section, for example MyFirstPlugin
    • paste in the topic text from Writing the Documentation Topic and save
  2. Attach the distribution zip file to the topic, ex: MyFirstPlugin.zip
  3. Link from the doc page to a new, blank page named after the Plugin, and ending in Dev, ex: MyFirstPluginDev. This is the discussion page for future development. (User support for Plugins is handled in TWiki:Support.)
  4. Put the Plugin into the SVN repository, see TWiki:Plugins/ReadmeFirst (optional)

NEW Once you have done the above steps once, you can use the BuildContrib to upload updates to your Plugin.

Thank you very much for sharing your Plugin with the TWiki community smile

Recommended Storage of Plugin Specific Data

Plugins sometimes need to store data. This can be Plugin internal data such as cache data, or data generated for browser consumption such as images. Plugins should store data using TWikiFuncDotPm functions that support saving and loading of topics and attachments.

Plugin Internal Data

You can create a Plugin "work area" using the TWiki::Func::getWorkArea() function, which gives you a persistant directory where you can store data files. By default they will not be web accessible. The directory is guaranteed to exist, and to be writable by the webserver user. For convenience, TWiki::Func::storeFile() and TWiki::Func::readFile() are provided to persistently store and retrieve simple data in this area.

Web Accessible Data

Topic-specific data such as generated images can be stored in the topic's attachment area, which is web accessible. Use the TWiki::Func::saveAttachment() function to store the data.

Recommendation for file name:

  • Prefix the filename with an underscore (the leading underscore avoids a nameclash with files attached to the same topic)
  • Identify where the attachment originated from, typically by including the Plugin name in the file name
  • Use only alphanumeric characters, underscores, dashes and periods to avoid platform dependency issues and URL issues
  • Example: _FooBarPlugin_img123.gif

Web specific data can be stored in the Plugin's attachment area, which is web accessible. Use the TWiki::Func::saveAttachment() function to store the data.

Recommendation for file names in Plugin attachment area:

  • Prefix the filename with an underscore
  • Include the name of the web in the filename
  • Use only alphanumeric characters, underscores, dashes and periods to avoid platform dependency issues and URL issues
  • Example: _Main_roundedge-ul.gif

Maintaining Plugins

Discussions and Feedback on Plugins

Each published Plugin has a Plugin development topic on TWiki.org. Plugin development topics are named after your Plugin and end in Dev, such as MyFirstPluginDev. The Plugin development topic is a great resource to discuss feature enhancements and to get feedback from the TWiki community.

Maintaining Compatibility with Earlier TWiki Versions

The Plugin interface (TWikiFuncDotPm functions and handlers) evolve over time. TWiki 4.0 introduced new API functions to address the needs of Plugin authors. It also deprecated some functions. Some Plugins written for earlier TWiki releases using unofficial TWiki internal functions no longer work on the TWiki 4.0 codebase. All this means that some Plugins need to be updated to work on the TWiki 4.0 codebase.

Organizations typically do not upgrade to the latest TWiki for many months. However, many administrators still would like to install the latest versions of a Plugin on their older TWiki installation. This need is fullfilled if Plugins are maintained in a compatible manner.

TIP Tip: Plugins can be written to be compatible with older and newer TWiki releases. This can be done also for Plugins using unofficial TWiki internal functions of an earlier release that no longer work on the latest TWiki codebase. TWiki:TWiki.TWikiPluginsSupplement#MaintainPlugins has more.

Handling deprecated functions

From time-to-time, the TWiki developers will add new functions to the interface (either to TWikiFuncDotPm, or new handlers). Sometimes these improvements mean that old functions have to be deprecated to keep the code manageable. When this happens, the deprecated functions will be supported in the interface for at least one more TWiki release, and probably longer, though this cannot be guaranteed.

When a plugin defines deprecated handlers, a warning will be shown in the list generated by %FAILEDPLUGINS%. Admins who see these warnings should check TWiki.org and if necessary, contact the plugin author, for an updated version of the plugin.

Updated plugins may still need to define deprecated handlers for compatibility with old TWiki versions. In this case, the plugin package that defines old handlers can suppress the warnings in %FAILEDPLUGINS%.

This is done by defining a map from the handler name to the TWiki::Plugins version in which the handler was first deprecated. For example, if we need to define the endRenderingHandler for compatibility with TWiki::Plugins versions before 1.1, we would add this to the plugin:

package TWiki::Plugins::SinkPlugin;
use vars qw( %TWikiCompatibility );
$TWikiCompatibility{endRenderingHandler} = 1.1;
If the currently-running TWiki version is 1.1 or later, then the handler will not be called and the warning will not be issued. TWiki with versions of TWiki::Plugins before 1.1 will still call the handler as required.


Changed:
<
<

Warning: Can't find topic TWiki.TWikiFuncModule

>
>
Official list of stable TWiki functions for Plugin developers

This module defines official functions that Plugins can use to interact with the TWiki engine and content.

Refer to EmptyPlugin and lib/TWiki/Plugins/EmptyPlugin.pm for a template Plugin and documentation on how to write a Plugin.

Plugins should only use functions published in this module. If you use functions in other TWiki libraries you might create a security hole and you will probably need to change your Plugin when you upgrade TWiki.

Deprecated functions will still work in older code, though they should not be called in new Plugins and should be replaced in older Plugins as soon as possible.

The version of the TWiki::Func module is defined by the VERSION number of the TWiki::Plugins module, currently 1.11. This can be shown by the %PLUGINVERSION% variable. The 'Since' field in the function documentation refers to the VERSION number and the date that the function was addded.

Note: Beware! These methods should only ever be called from the context of a TWiki Plugin. They require a Plugins SESSION context to be established before they are called, and will not work if simply called from another TWiki module. For example,

use TWiki;
print TWiki::Func::getSkin(),"\n";
will fail with Can't call method "getSkin" on an undefined value at TWiki/Func.pm line 83.

If you want to call the methods outside the context of a plugin, you can create a Plugins SESSION object. For example, the script:

use TWiki:
$TWiki::Plugins::SESSION = new TWiki();
print TWiki::Func::getSkin(),"\n";
will work happily.

Environment

getSkin( ) -> $skin

Get the skin path, set by the SKIN and COVER preferences variables or the skin and cover CGI parameters

Return: $skin Comma-separated list of skins, e.g. 'gnu,tartan'. Empty string if none.

Since: TWiki::Plugins::VERSION 1.000 (29 Jul 2001)

getUrlHost( ) -> $host

Get protocol, domain and optional port of script URL

Return: $host URL host, e.g. "http://example.com:80"

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

getScriptUrl( $web, $topic, $script, ... ) -> $url

Compose fully qualified URL

  • $web - Web name, e.g. 'Main'
  • $topic - Topic name, e.g. 'WebNotify'
  • $script - Script name, e.g. 'view'
  • ... - an arbitrary number of name,value parameter pairs that will be url-encoded and added to the url. The special parameter name '#' is reserved for specifying an anchor. e.g. getScriptUrl('x','y','view','#'=>'XXX',a=>1,b=>2) will give .../view/x/y?a=1&b=2#XXX

Return: $url URL, e.g. "http://example.com:80/cgi-bin/view.pl/Main/WebNotify"

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

getViewUrl( $web, $topic ) -> $url

Compose fully qualified view URL

  • $web - Web name, e.g. 'Main'. The current web is taken if empty
  • $topic - Topic name, e.g. 'WebNotify'
Return: $url URL, e.g. "http://example.com:80/cgi-bin/view.pl/Main/WebNotify"

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

getOopsUrl( $web, $topic, $template, $param1, $param2, $param3, $param4 ) -> $url

Compose fully qualified 'oops' dialog URL

  • $web - Web name, e.g. 'Main'. The current web is taken if empty
  • $topic - Topic name, e.g. 'WebNotify'
  • $template - Oops template name, e.g. 'oopsmistake'. The 'oops' is optional; 'mistake' will translate to 'oopsmistake'.
  • $param1 ... $param4 - Parameter values for %PARAM1% ... %PARAMn% variables in template, optional
Return: $url URL, e.g. "http://example.com:80/cgi-bin/oops.pl/ Main/WebNotify?template=oopslocked&param1=joe"

This might be used like this:

   my $url = TWiki::Func::getOopsUrl($web, $topic, 'oopsmistake', 'I made a boo-boo');
   TWiki::Func::redirectCgiQuery( undef, $url );
   return 0;

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

Since TWiki::Plugins::VERSION 1.1, the recommended approach is to throw an oops exception.

   use Error qw( :try );

   throw TWiki::OopsException($web, $topic, undef, 0, [ 'I made a boo-boo' ]);
and let TWiki handle the cleanup.

getPubUrlPath( ) -> $path

Get pub URL path

Return: $path URL path of pub directory, e.g. "/pub"

Since: TWiki::Plugins::VERSION 1.000 (14 Jul 2001)

getCgiQuery( ) -> $query

Get CGI query object. Important: Plugins cannot assume that scripts run under CGI, Plugins must always test if the CGI query object is set

Return: $query CGI query object; or 0 if script is called as a shell script

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

getSessionValue( $key ) -> $value

Get a session value from the client session module

  • $key - Session key
Return: $value Value associated with key; empty string if not set

Since: TWiki::Plugins::VERSION 1.000 (27 Feb 200)

setSessionValue( $key, $value ) -> $boolean

Set a session value.

  • $key - Session key
  • $value - Value associated with key
Return: true if function succeeded

Since: TWiki::Plugins::VERSION 1.000 (17 Aug 2001)

clearSessionValue( $key ) -> $boolean

Clear a session value that was set using setSessionValue.

  • $key - name of value stored in session to be cleared. Note that you cannot clear AUTHUSER.
Return: true if the session value was cleared

Since: TWiki::Plugins::VERSION 1.1

getContext() -> \%hash

Get a hash of context identifiers representing the currently active context.

The context is a set of identifiers that are set during specific phases of TWiki processing. For example, each of the standard scripts in the 'bin' directory each has a context identifier - the view script has 'view', the edit script has 'edit' etc. So you can easily tell what 'type' of script your Plugin is being called within. The core context identifiers are listed in the TWikiTemplates topic. Please be careful not to overwrite any of these identifiers!

Context identifiers can be used to communicate between Plugins, and between Plugins and templates. For example, in FirstPlugin?.pm, you might write:

sub initPlugin {
   TWiki::Func::getContext()->{'MyID'} = 1;
   ...
This can be used in SecondPlugin.pm like this:
sub initPlugin {
   if( TWiki::Func::getContext()->{'MyID'} ) {
      ...
   }
   ...
or in a template, like this:
%TMPL:DEF{"ON"}% Not off %TMPL:END%
%TMPL:DEF{"OFF"}% Not on %TMPL:END%
%TMPL:P{context="MyID" then="ON" else="OFF"}%
or in a topic:
%IF{"context MyID" then="MyID is ON" else="MyID is OFF"}%
Note: all plugins have an automatically generated context identifier if they are installed and initialised. For example, if the FirstPlugin? is working, the context ID 'FirstPlugin' will be set.

Since: TWiki::Plugins::VERSION 1.1

Preferences

getPreferencesValue( $key, $web ) -> $value

Get a preferences value from TWiki or from a Plugin

  • $key - Preferences key
  • $web - Name of web, optional. Current web if not specified; does not apply to settings of Plugin topics
Return: $value Preferences value; empty string if not set

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

  • Example for Plugin setting:
    • MyPlugin? topic has: * Set COLOR = red
    • Use "MYPLUGIN_COLOR" for $key
    • my $color = TWiki::Func::getPreferencesValue( "MYPLUGIN_COLOR" );

  • Example for preferences setting:
    • WebPreferences topic has: * Set WEBBGCOLOR = #FFFFC0
    • my $webColor = TWiki::Func::getPreferencesValue( 'WEBBGCOLOR', 'Sandbox' );

NOTE: As of TWiki4.1, if $NO_PREFS_IN_TOPIC is enabled in the plugin, then preferences set in the plugin topic will be ignored.

getPluginPreferencesValue( $key ) -> $value

Get a preferences value from your Plugin

  • $key - Plugin Preferences key w/o PLUGINNAME_ prefix.
Return: $value Preferences value; empty string if not set

Note: This function will will only work when called from the Plugin.pm file itself. it will not work if called from a sub-package (e.g. TWiki::Plugins::MyPlugin::MyModule)

Since: TWiki::Plugins::VERSION 1.021 (27 Mar 2004)

NOTE: As of TWiki4.1, if $NO_PREFS_IN_TOPIC is enabled in the plugin, then preferences set in the plugin topic will be ignored.

getPreferencesFlag( $key, $web ) -> $value

Get a preferences flag from TWiki or from a Plugin

  • $key - Preferences key
  • $web - Name of web, optional. Current web if not specified; does not apply to settings of Plugin topics
Return: $value Preferences flag '1' (if set), or "0" (for preferences values "off", "no" and "0")

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

  • Example for Plugin setting:
    • MyPlugin? topic has: * Set SHOWHELP = off
    • Use "MYPLUGIN_SHOWHELP" for $key
    • my $showHelp = TWiki::Func::getPreferencesFlag( "MYPLUGIN_SHOWHELP" );

NOTE: As of TWiki4.1, if $NO_PREFS_IN_TOPIC is enabled in the plugin, then preferences set in the plugin topic will be ignored.

getPluginPreferencesFlag( $key ) -> $boolean

Get a preferences flag from your Plugin

  • $key - Plugin Preferences key w/o PLUGINNAME_ prefix.
Return: false for preferences values "off", "no" and "0", or values not set at all. True otherwise.

Note: This function will will only work when called from the Plugin.pm file itself. it will not work if called from a sub-package (e.g. TWiki::Plugins::MyPlugin::MyModule)

Since: TWiki::Plugins::VERSION 1.021 (27 Mar 2004)

NOTE: As of TWiki4.1, if $NO_PREFS_IN_TOPIC is enabled in the plugin, then preferences set in the plugin topic will be ignored.

getWikiToolName( ) -> $name

Get toolname as defined in TWiki.cfg

Return: $name Name of tool, e.g. 'TWiki'

Since: TWiki::Plugins::VERSION 1.000 (27 Feb 2001)

getMainWebname( ) -> $name

Get name of Main web as defined in TWiki.cfg

Return: $name Name, e.g. 'Main'

Since: TWiki::Plugins::VERSION 1.000 (27 Feb 2001)

getTwikiWebname( ) -> $name

Get name of TWiki documentation web as defined in TWiki.cfg

Return: $name Name, e.g. 'TWiki'

Since: TWiki::Plugins::VERSION 1.000 (27 Feb 2001)

User Handling and Access Control

getDefaultUserName( ) -> $loginName

Get default user name as defined in the configuration as DefaultUserLogin

Return: $loginName Default user name, e.g. 'guest'

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

getWikiName( ) -> $wikiName

Get Wiki name of logged in user

Return: $wikiName Wiki Name, e.g. 'JohnDoe'

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

getWikiUserName( ) -> $wikiName

Get Wiki name of logged in user with web prefix

Return: $wikiName Wiki Name, e.g. "Main.JohnDoe"

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

wikiToUserName( $wikiName ) -> $loginName

Translate a Wiki name to a login name based on Main.TWikiUsers topic

  • $wikiName - Wiki name, e.g. 'Main.JohnDoe' or 'JohnDoe'
Return: $loginName Login name of user, e.g. 'jdoe'

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

userToWikiName( $loginName, $dontAddWeb ) -> $wikiName

Translate a login name to a Wiki name based on Main.TWikiUsers topic

  • $loginName - Login name, e.g. 'jdoe'
  • $dontAddWeb - Do not add web prefix if "1"
Return: $wikiName Wiki name of user, e.g. 'Main.JohnDoe' or 'JohnDoe'

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

isGuest( ) -> $boolean

Test if logged in user is a guest (TWikiGuest?)

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

permissionsSet( $web ) -> $boolean

Test if any access restrictions are set for this web, ignoring settings on individual pages

  • $web - Web name, required, e.g. 'Sandbox'

Since: TWiki::Plugins::VERSION 1.000 (27 Feb 2001)

checkAccessPermission( $type, $wikiName, $text, $topic, $web, $meta ) -> $boolean

Check access permission for a topic based on the TWiki.TWikiAccessControl rules

  • $type - Access type, required, e.g. 'VIEW', 'CHANGE'.
  • $wikiName - WikiName of remote user, required, e.g. "PeterThoeny". If $wikiName is '', 0 or undef then access is always permitted.
  • $text - Topic text, optional. If 'perl false' (undef, 0 or ''), topic $web.$topic is consulted. $text may optionally contain embedded %META:PREFERENCE tags. Provide this parameter if:
    1. You are setting different access controls in the text to those defined in the stored topic,
    2. You already have the topic text in hand, and want to help TWiki avoid having to read it again,
    3. You are providing a $meta parameter.
  • $topic - Topic name, required, e.g. 'PrivateStuff'
  • $web - Web name, required, e.g. 'Sandbox'
  • $meta - Meta-data object, as returned by readTopic. Optional. If undef, but $text is defined, then access controls will be parsed from $text. If defined, then metadata embedded in $text will be ignored. This parameter is always ignored if $text is undefined. Settings in $meta override Set settings in $text.
A perl true result indicates that access is permitted.

Note the wierd parameter order is due to compatibility constraints with earlier TWiki releases.

Tip if you want, you can use this method to check your own access control types. For example, if you:

  • Set ALLOWTOPICSPIN = IncyWincy?
in ThatWeb.ThisTopic, then a call to checkAccessPermissions('SPIN', 'IncyWincy', undef, 'ThisTopic', 'ThatWeb', undef) will return true.

Since: TWiki::Plugins::VERSION 1.000 (27 Feb 2001)

Webs, Topics and Attachments

getListOfWebs( $filter ) -> @webs

  • $filter - spec of web types to recover
Gets a list of webs, filtered according to the spec in the $filter, which may include one of:
  1. 'user' (for only user webs)
  2. 'template' (for only template webs i.e. those starting with "_")
$filter may also contain the word 'public' which will further filter out webs that have NOSEARCHALL set on them. 'allowed' filters out webs the current user can't read.

For example, the deprecated getPublicWebList function can be duplicated as follows:

   my @webs = TWiki::Func::getListOfWebs( "user,public" );

Since: TWiki::Plugins::VERSION 1.1

webExists( $web ) -> $boolean

Test if web exists

  • $web - Web name, required, e.g. 'Sandbox'

Since: TWiki::Plugins::VERSION 1.000 (14 Jul 2001)

createWeb( $newWeb, $baseWeb, $opts )

  • $newWeb is the name of the new web.
  • $baseWeb is the name of an existing web (a template web). If the base web is a system web, all topics in it will be copied into the new web. If it is a normal web, only topics starting with 'Web' will be copied. If no base web is specified, an empty web (with no topics) will be created. If it is specified but does not exist, an error will be thrown.
  • $opts is a ref to a hash that contains settings to be modified in
the web preferences topic in the new web.

use Error qw( :try );
use TWiki::AccessControlException;

try {
    TWiki::Func::createWeb( "Newweb" );
} catch Error::Simple with {
    my $e = shift;
    # see documentation on Error::Simple
} catch TWiki::AccessControlException with {
    my $e = shift;
    # see documentation on TWiki::AccessControlException
} otherwise {
    ...
};

Since: TWiki::Plugins::VERSION 1.1

moveWeb( $oldName, $newName )

Move (rename) a web.

use Error qw( :try );
use TWiki::AccessControlException;

try {
    TWiki::Func::moveWeb( "Oldweb", "Newweb" );
} catch Error::Simple with {
    my $e = shift;
    # see documentation on Error::Simple
} catch TWiki::AccessControlException with {
    my $e = shift;
    # see documentation on TWiki::AccessControlException
} otherwise {
    ...
};

To delete a web, move it to a subweb of Trash

TWiki::Func::moveWeb( "Deadweb", "Trash.Deadweb" );

Since: TWiki::Plugins::VERSION 1.1

getTopicList( $web ) -> @topics

Get list of all topics in a web

  • $web - Web name, required, e.g. 'Sandbox'
Return: @topics Topic list, e.g. ( 'WebChanges',  'WebHome', 'WebIndex', 'WebNotify' )

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

topicExists( $web, $topic ) -> $boolean

Test if topic exists

  • $web - Web name, optional, e.g. 'Main'.
  • $topic - Topic name, required, e.g. 'TokyoOffice', or "Main.TokyoOffice"
$web and $topic are parsed as described in the documentation for normalizeWebTopicName.

Since: TWiki::Plugins::VERSION 1.000 (14 Jul 2001)

checkTopicEditLock( $web, $topic, $script ) -> ( $oopsUrl, $loginName, $unlockTime )

Check if a lease has been taken by some other user.

  • $web Web name, e.g. "Main", or empty
  • $topic Topic name, e.g. "MyTopic", or "Main.MyTopic"
Return: ( $oopsUrl, $loginName, $unlockTime ) - The $oopsUrl for calling redirectCgiQuery(), user's $loginName, and estimated $unlockTime in minutes, or ( '', '', 0 ) if no lease exists.
  • $script The script to invoke when continuing with the edit

Since: TWiki::Plugins::VERSION 1.010 (31 Dec 2002)

setTopicEditLock( $web, $topic, $lock )

  • $web Web name, e.g. "Main", or empty
  • $topic Topic name, e.g. "MyTopic", or "Main.MyTopic"
  • $lock 1 to lease the topic, 0 to clear the lease=

Takes out a "lease" on the topic. The lease doesn't prevent anyone from editing and changing the topic, but it does redirect them to a warning screen, so this provides some protection. The edit script always takes out a lease.

It is impossible to fully lock a topic. Concurrent changes will be merged.

Since: TWiki::Plugins::VERSION 1.010 (31 Dec 2002)

saveTopic( $web, $topic, $meta, $text, $options ) -> $error

  • $web - web for the topic
  • $topic - topic name
  • $meta - reference to TWiki::Meta object
  • $text - text of the topic (without embedded meta-data!!!
  • \%options - ref to hash of save options \%options may include:
    dontlog don't log this change in twiki log
    comment comment for save
    minor True if this is a minor change, and is not to be notified
Return: error message or undef.

Since: TWiki::Plugins::VERSION 1.000 (29 Jul 2001)

For example,

my( $meta, $text ) = TWiki::Func::readTopic( $web, $topic )
$text =~ s/APPLE/ORANGE/g;
TWiki::Func::saveTopic( $web, $topic, $meta, $text, { comment => 'refruited' } );

Note: Plugins handlers ( e.g. beforeSaveHandler ) will be called as appropriate.

saveTopicText( $web, $topic, $text, $ignorePermissions, $dontNotify ) -> $oopsUrl

Save topic text, typically obtained by readTopicText(). Topic data usually includes meta data; the file attachment meta data is replaced by the meta data from the topic file if it exists.

  • $web - Web name, e.g. 'Main', or empty
  • $topic - Topic name, e.g. 'MyTopic', or "Main.MyTopic"
  • $text - Topic text to save, assumed to include meta data
  • $ignorePermissions - Set to "1" if checkAccessPermission() is already performed and OK
  • $dontNotify - Set to "1" if not to notify users of the change
Return: $oopsUrl Empty string if OK; the $oopsUrl for calling redirectCgiQuery() in case of error

This method is a lot less efficient and much more dangerous than saveTopic.

Since: TWiki::Plugins::VERSION 1.010 (31 Dec 2002)

my $text = TWiki::Func::readTopicText( $web, $topic );

# check for oops URL in case of error:
if( $text =~ /^http.*?\/oops/ ) {
    TWiki::Func::redirectCgiQuery( $query, $text );
    return;
}
# do topic text manipulation like:
$text =~ s/old/new/g;
# do meta data manipulation like:
$text =~ s/(META\:FIELD.*?name\=\"TopicClassification\".*?value\=\")[^\"]*/$1BugResolved/;
$oopsUrl = TWiki::Func::saveTopicText( $web, $topic, $text ); # save topic text

moveTopic( $web, $topic, $newWeb, $newTopic )

  • $web source web - required
  • $topic source topic - required
  • $newWeb dest web
  • $newTopic dest topic
Renames the topic. Throws an exception if something went wrong. If $newWeb is undef, it defaults to $web. If $newTopic is undef, it defaults to $topic.

The destination topic must not already exist.

Rename a topic to the $TWiki::cfg{TrashWebName} to delete it.

Since: TWiki::Plugins::VERSION 1.1

use Error qw( :try );

try {
    moveTopic( "Work", "TokyoOffice", "Trash", "ClosedOffice" );
} catch Error::Simple with {
    my $e = shift;
    # see documentation on Error::Simple
} catch TWiki::AccessControlException with {
    my $e = shift;
    # see documentation on TWiki::AccessControlException
} otherwise {
    ...
};

getRevisionInfo($web, $topic, $rev, $attachment ) -> ( $date, $user, $rev, $comment )

Get revision info of a topic or attachment

  • $web - Web name, optional, e.g. 'Main'
  • $topic - Topic name, required, e.g. 'TokyoOffice'
  • $rev - revsion number, or tag name (can be in the format 1.2, or just the minor number)
  • $attachment -attachment filename
Return: ( $date, $user, $rev, $comment ) List with: ( last update date, login name of last user, minor part of top revision number ), e.g. ( 1234561, 'phoeny', "5" )
$date in epochSec
$user Wiki name of the author (not login name)
$rev actual rev number
$comment WHAT COMMENT?

NOTE: if you are trying to get revision info for a topic, use $meta->getRevisionInfo instead if you can - it is significantly more efficient, and returns a user object that contains other user information.

NOTE: prior versions of TWiki may under some circumstances have returned the login name of the user rather than the wiki name; the code documentation was totally unclear, and we have been unable to establish the intent. However the wikiname is obviously more useful, so that is what is returned.

Since: TWiki::Plugins::VERSION 1.000 (29 Jul 2001)

getRevisionAtTime( $web, $topic, $time ) -> $rev

Get the revision number of a topic at a specific time.

  • $web - web for topic
  • $topic - topic
  • $time - time (in epoch secs) for the rev
Return: Single-digit revision number, or undef if it couldn't be determined (either because the topic isn't that old, or there was a problem)

Since: TWiki::Plugins::VERSION 1.1

readTopic( $web, $topic, $rev ) -> ( $meta, $text )

Read topic text and meta data, regardless of access permissions.

  • $web - Web name, required, e.g. 'Main'
  • $topic - Topic name, required, e.g. 'TokyoOffice'
  • $rev - revision to read (default latest)
Return: ( $meta, $text ) Meta data object and topic text

$meta is a perl 'object' of class TWiki::Meta. This class is fully documented in the source code documentation shipped with the release, or can be inspected in the lib/TWiki/Meta.pm file.

This method ignores topic access permissions. You should be careful to use checkAccessPermissions to ensure the current user has read access to the topic.

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

readTopicText( $web, $topic, $rev, $ignorePermissions ) -> $text

Read topic text, including meta data

  • $web - Web name, e.g. 'Main', or empty
  • $topic - Topic name, e.g. 'MyTopic', or "Main.MyTopic"
  • $rev - Topic revision to read, optional. Specify the minor part of the revision, e.g. "5", not "1.5"; the top revision is returned if omitted or empty.
  • $ignorePermissions - Set to "1" if checkAccessPermission() is already performed and OK; an oops URL is returned if user has no permission
Return: $text Topic text with embedded meta data; an oops URL for calling redirectCgiQuery() is returned in case of an error

This method is more efficient than readTopic, but returns meta-data embedded in the text. Plugins authors must be very careful to avoid damaging meta-data. You are recommended to use readTopic instead, which is a lot safer..

Since: TWiki::Plugins::VERSION 1.010 (31 Dec 2002)

attachmentExists( $web, $topic, $attachment ) -> $boolean

Test if attachment exists

  • $web - Web name, optional, e.g. Main.
  • $topic - Topic name, required, e.g. TokyoOffice, or Main.TokyoOffice
  • $attachment - attachment name, e.g.=logo.gif=
$web and $topic are parsed as described in the documentation for normalizeWebTopicName.

Since: TWiki::Plugins::VERSION 1.1

readAttachment( $web, $topic, $name, $rev ) -> $data

  • $web - web for topic
  • $topic - topic
  • $name - attachment name
  • $rev - revision to read (default latest)
Read an attachment from the store for a topic, and return it as a string. The names of attachments on a topic can be recovered from the meta-data returned by readTopic. If the attachment does not exist, or cannot be read, undef will be returned. If the revision is not specified, the latest version will be returned.

View permission on the topic is required for the read to be successful. Access control violations are flagged by a TWiki::AccessControlException. Permissions are checked for the current user.

my( $meta, $text ) = TWiki::Func::readTopic( $web, $topic );
my @attachments = $meta->find( 'FILEATTACHMENT' );
foreach my $a ( @attachments ) {
   try {
       my $data = TWiki::Func::readAttachment( $web, $topic, $a->{name} );
       ...
   } catch TWiki::AccessControlException with {
   };
}

Since: TWiki::Plugins::VERSION 1.1

saveAttachment( $web, $topic, $attachment, $opts )

  • $web - web for topic
  • $topic - topic to atach to
  • $attachment - name of the attachment
  • $opts - Ref to hash of options
$opts may include:
dontlog don't log this change in twiki log
comment comment for save
hide if the attachment is to be hidden in normal topic view
stream Stream of file to upload
file Name of a file to use for the attachment data. ignored if stream is set. Local file on the server.
filepath Client path to file
filesize Size of uploaded data
filedate Date

Save an attachment to the store for a topic. On success, returns undef. If there is an error, an exception will be thrown.

    try {
        TWiki::Func::saveAttachment( $web, $topic, 'image.gif',
                                     { file => 'image.gif',
                                       comment => 'Picture of Health',
                                       hide => 1 } );
   } catch Error::Simple with {
      # see documentation on Error
   } otherwise {
      ...
   };

Since: TWiki::Plugins::VERSION 1.1

moveAttachment( $web, $topic, $attachment, $newWeb, $newTopic, $newAttachment )

  • $web source web - required
  • $topic source topic - required
  • $attachment source attachment - required
  • $newWeb dest web
  • $newTopic dest topic
  • $newAttachment dest attachment
Renames the topic. Throws an exception on error or access violation. If $newWeb is undef, it defaults to $web. If $newTopic is undef, it defaults to $topic. If $newAttachment is undef, it defaults to $attachment. If all of $newWeb, $newTopic and $newAttachment are undef, it is an error.

The destination topic must already exist, but the destination attachment must not exist.

Rename an attachment to $TWiki::cfg{TrashWebName}.TrashAttament to delete it.

use Error qw( :try );

try {
   # move attachment between topics
   moveAttachment( "Countries", "Germany", "AlsaceLorraine.dat",
                     "Countries", "France" );
   # Note destination attachment name is defaulted to the same as source
} catch TWiki::AccessControlException with {
   my $e = shift;
   # see documentation on TWiki::AccessControlException
} catch Error::Simple with {
   my $e = shift;
   # see documentation on Error::Simple
};

Since: TWiki::Plugins::VERSION 1.1

Assembling Pages

readTemplate( $name, $skin ) -> $text

Read a template or skin. Embedded template directives get expanded

  • $name - Template name, e.g. 'view'
  • $skin - Comma-separated list of skin names, optional, e.g. 'print'
Return: $text Template text

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

loadTemplate ( $name, $skin, $web ) -> $text

  • $name - template file name
  • $skin - comma-separated list of skins to use (default: current skin)
  • $web - the web to look in for topics that contain templates (default: current web)
Return: expanded template text (what's left after removal of all %TMPL:DEF% statements)

Since: TWiki::Plugins::VERSION 1.1

Reads a template and extracts template definitions, adding them to the list of loaded templates, overwriting any previous definition.

How TWiki searches for templates is described in TWikiTemplates.

If template text is found, extracts include statements and fully expands them.

expandTemplate( $def ) -> $string

Do a , only expanding the template (not expanding any variables other than %TMPL)

  • $def - template name
Return: the text of the expanded template

Since: TWiki::Plugins::VERSION 1.1

A template is defined using a %TMPL:DEF% statement in a template file. See the documentation on TWiki templates for more information.

writeHeader( $query, $contentLength )

Prints a basic content-type HTML header for text/html to standard out

  • $query - CGI query object. If not given, the default CGI query will be used. In most cases you should not pass this parameter.
  • $contentLength - Length of content
Return: none

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

redirectCgiQuery( $query, $url, $passthru )

Redirect to URL

  • $query - CGI query object. Ignored, only there for compatibility. The session CGI query object is used instead.
  • $url - URL to redirect to
  • $passthru - enable passthrough.

Return: none

Print output to STDOUT that will cause a 302 redirect to a new URL. Nothing more should be printed to STDOUT after this method has been called.

The $passthru parameter allows you to pass the parameters that were passed to the current query on to the target URL, as long as it is another URL on the same TWiki installation. If $passthru is set to a true value, then TWiki will save the current URL parameters, and then try to restore them on the other side of the redirect. Parameters are stored on the server in a cache file (see {PassthroughDir} in =configure).

Note that if $passthru is set, then any parameters in $url will be lost when the old parameters are restored. if you want to change any parameter values, you will need to do that in the current CGI query before redirecting e.g.

my $query = TWiki::Func::getCgiQuery();
$query->param(-name => 'text', -value => 'Different text');
TWiki::Func::redirectCgiQuery(
  undef, TWiki::Func::getScriptUrl($web, $topic, 'edit'), 1);
$passthru does nothing if $url does not point to a script in the current TWiki installation.

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

addToHEAD( $id, $header )

Adds $header to the HTML header (the tag). This is useful for Plugins that want to include some javascript custom css.

  • $id - Unique ID to prevent the same HTML from being duplicated. Plugins should use a prefix to prevent name clashes (e.g EDITTABLEPLUGIN_JSCALENDAR)
  • $header - the HTML to be added to the section. The HTML must be valid in a HEAD tag - no checks are performed.

All TWiki variables present in $header will be expanded before being inserted into the section.

Note that this is not the same as the HTTP header, which is modified through the Plugins modifyHeaderHandler.

Since: TWiki::Plugins::VERSION 1.1

example:

TWiki::Func::addToHEAD('PATTERN_STYLE','<link id="twikiLayoutCss" rel="stylesheet" type="text/css" href="%PUBURL%/TWiki/PatternSkin/layout.css" media="all" />')

expandCommonVariables( $text, $topic, $web ) -> $text

Expand all common %VARIABLES%

  • $text - Text with variables to expand, e.g. 'Current user is %WIKIUSER%'
  • $topic - Current topic name, e.g. 'WebNotify'
  • $web - Web name, optional, e.g. 'Main'. The current web is taken if missing
Return: $text Expanded text, e.g. 'Current user is TWikiGuest'

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

See also: expandVariablesOnTopicCreation

renderText( $text, $web ) -> $text

Render text from TWiki markup into XHTML as defined in TWiki.TextFormattingRules

  • $text - Text to render, e.g. '*bold* text and =fixed font='
  • $web - Web name, optional, e.g. 'Main'. The current web is taken if missing
Return: $text XHTML text, e.g. '<b>bold</b> and <code>fixed font</code>'

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

internalLink( $pre, $web, $topic, $label, $anchor, $createLink ) -> $text

Render topic name and link label into an XHTML link. Normally you do not need to call this funtion, it is called internally by renderText()

  • $pre - Text occuring before the TWiki link syntax, optional
  • $web - Web name, required, e.g. 'Main'
  • $topic - Topic name to link to, required, e.g. 'WebNotify'
  • $label - Link label, required. Usually the same as $topic, e.g. 'notify'
  • $anchor - Anchor, optional, e.g. '#Jump'
  • $createLink - Set to '1' to add question linked mark after topic name if topic does not exist;
    set to '0' to suppress link for non-existing topics
Return: $text XHTML anchor, e.g. '<a href='/cgi-bin/view/Main/WebNotify#Jump'>notify</a>'

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

E-mail

sendEmail ( $text, $retries ) -> $error

  • $text - text of the mail, including MIME headers
  • $retries - number of times to retry the send (default 1)
Send an e-mail specified as MIME format content. To specify MIME format mails, you create a string that contains a set of header lines that contain field definitions and a message body such as:
To: liz@windsor.gov.uk
From: serf@hovel.net
CC: george@whitehouse.gov
Subject: Revolution

Dear Liz,

Please abolish the monarchy (with King George's permission, of course)

Thanks,

A. Peasant
Leave a blank line between the last header field and the message body.

Since: TWiki::Plugins::VERSION 1.1

wikiToEmail( $wikiName ) -> $email

  • $wikiName - wiki name of the user
Get the e-mail address(es) of the named user. If the user has multiple e-mail addresses (for example, the user is a group), then the list will be comma-separated.

Since: TWiki::Plugins::VERSION 1.1

Creating New Topics

expandVariablesOnTopicCreation ( $text ) -> $text

Expand the limited set of variables that are always expanded during topic creation

  • $text - the text to process
Return: text with variables expanded

Since: TWiki::Plugins::VERSION 1.1

Expands only the variables expected in templates that must be statically expanded in new content.

The expanded variables are:

  • %DATE% Signature-format date
  • %SERVERTIME% See TWikiVariables
  • %GMTIME% See TWikiVariables
  • %USERNAME% Base login name
  • %WIKINAME% Wiki name
  • %WIKIUSERNAME% Wiki name with prepended web
  • %URLPARAM{...}% - Parameters to the current CGI query
  • %NOP% No-op

See also: expandVariables

Special handlers

Special handlers can be defined to make functions in plugins behave as if they were built-in to TWiki.

registerTagHandler( $var, \&fn, $syntax )

Should only be called from initPlugin.

Register a function to handle a simple variable. Handles both %VAR% and %VAR{...}%. Registered variables are treated the same as TWiki internal variables, and are expanded at the same time. This is a lot more efficient than using the commonTagsHandler.

  • $var - The name of the variable, i.e. the 'MYVAR' part of %MYVAR%. The variable name must match /^[A-Z][A-Z0-9_]*$/ or it won't work.
  • \&fn - Reference to the handler function.
  • $syntax can be 'classic' (the default) or 'context-free'. 'classic' syntax is appropriate where you want the variable to support classic TWiki syntax i.e. to accept the standard %MYVAR{ "unnamed" param1="value1" param2="value2" }% syntax, as well as an unquoted default parameter, such as %MYVAR{unquoted parameter}%. If your variable will only use named parameters, you can use 'context-free' syntax, which supports a more relaxed syntax. For example, %MYVAR{param1=value1, value 2, param3="value 3", param4='value 5"}%

Since: TWiki::Plugins::VERSION 1.1

The variable handler function must be of the form:

sub handler(\%session, \%params, $topic, $web)
where:
  • \%session - a reference to the TWiki session object (may be ignored)
  • \%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.
  • $topic - name of the topic in the query
  • $web - name of the web in the query
for example, to execute an arbitrary command on the server, you might do this:
sub initPlugin{
   TWiki::Func::registerTagHandler('EXEC', \&boo);
}

sub boo {
    my( $session, $params, $topic, $web ) = @_;
    my $cmd = $params->{_DEFAULT};

    return "NO COMMAND SPECIFIED" unless $cmd;

    my $result = `$cmd 2>&1`;
    return $params->{silent} ? '' : $result;
}
}
would let you do this: %EXEC{"ps -Af" silent="on"}%

Registered tags differ from tags implemented using the old TWiki approach (text substitution in commonTagsHandler) in the following ways:

  • registered tags are evaluated at the same time as system tags, such as %SERVERTIME. commonTagsHandler is only called later, when all system tags have already been expanded (though they are expanded again after commonTagsHandler returns).
  • registered tag names can only contain alphanumerics and _ (underscore)
  • registering a tag FRED defines both %FRED{...}% and also %FRED%.
  • registered tag handlers cannot return another tag as their only result (e.g. return '%SERVERTIME%';). It won't work.

registerRESTHandler( $alias, \&fn, )

Should only be called from initPlugin.

Adds a function to the dispatch table of the REST interface

  • $alias - The name .
  • \&fn - Reference to the function.

Since: TWiki::Plugins::VERSION 1.1

The handler function must be of the form:

sub handler(\%session)
where:
  • \%session - a reference to the TWiki session object (may be ignored)

From the REST interface, the name of the plugin must be used as the subject of the invokation.

Example


The EmptyPlugin has the following call in the initPlugin handler:

   TWiki::Func::registerRESTHandler('example', \&restExample);

This adds the restExample function to the REST dispatch table for the EmptyPlugin under the 'example' alias, and allows it to be invoked using the URL

http://server:port/bin/rest/EmptyPlugin/example

note that the URL

http://server:port/bin/rest/EmptyPlugin/restExample

(ie, with the name of the function instead of the alias) will not work.

Searching

searchInWebContent($searchString, $web, \@topics, \%options ) -> \%map

Search for a string in the content of a web. The search is over all content, including meta-data. Meta-data matches will be returned as formatted lines within the topic content (meta-data matches are returned as lines of the format %META:\w+{.*}%)

  • $searchString - the search string, in egrep format
  • $web - The web to search in
  • \@topics - reference to a list of topics to search
  • \%option - reference to an options hash
The \%options hash may contain the following options:
  • type - if regex will perform a egrep-syntax RE search (default '')
  • casesensitive - false to ignore case (defaulkt true)
  • files_without_match - true to return files only (default false). If files_without_match is specified, it will return on the first match in each topic (i.e. it will return only one match per topic, and will not return matching lines).

The return value is a reference to a hash which maps each matching topic name to a list of the lines in that topic that matched the search, as would be returned by 'grep'.

To iterate over the returned topics use:

my $result = TWiki::Func::searchInWebContent( "Slimy Toad", $web, \@topics,
   { casesensitive => 0, files_without_match => 0 } );
foreach my $topic (keys %$result ) {
   foreach my $matching_line ( @{$result->{$topic}} ) {
      ...etc

Since: TWiki::Plugins::VERSION 1.1

Plugin-specific file handling

getWorkArea( $pluginName ) -> $directorypath

Gets a private directory for Plugin use. The Plugin is entirely responsible for managing this directory; TWiki will not read from it, or write to it.

The directory is guaranteed to exist, and to be writable by the webserver user. By default it will not be web accessible.

The directory and it's contents are permanent, so Plugins must be careful to keep their areas tidy.

Since: TWiki::Plugins::VERSION 1.1 (Dec 2005)

readFile( $filename ) -> $text

Read file, low level. Used for Plugin workarea.

  • $filename - Full path name of file
Return: $text Content of file, empty if not found

NOTE: Use this function only for the Plugin workarea, not for topics and attachments. Use the appropriate functions to manipulate topics and attachments.

Since: TWiki::Plugins::VERSION 1.000 (07 Dec 2002)

saveFile( $filename, $text )

Save file, low level. Used for Plugin workarea.

  • $filename - Full path name of file
  • $text - Text to save
Return: none

NOTE: Use this function only for the Plugin workarea, not for topics and attachments. Use the appropriate functions to manipulate topics and attachments.

Since: TWiki::Plugins::VERSION 1.000 (07 Dec 2002)

General Utilities

getRegularExpression( $name ) -> $expr

Retrieves a TWiki predefined regular expression or character class.

  • $name - Name of the expression to retrieve. See notes below
Return: String or precompiled regular expression matching as described below.

Since: TWiki::Plugins::VERSION 1.020 (9 Feb 2004)

Note: TWiki internally precompiles several regular expressions to represent various string entities in an I18N-compatible manner. Plugins authors are encouraged to use these in matching where appropriate. The following are guaranteed to be present. Others may exist, but their use is unsupported and they may be removed in future TWiki versions.

In the table below, the expression marked type 'String' are intended for use within character classes (i.e. for use within square brackets inside a regular expression), for example:

   my $upper = TWiki::Func::getRegularExpression('upperAlpha');
   my $alpha = TWiki::Func::getRegularExpression('mixedAlpha');
   my $capitalized = qr/[$upper][$alpha]+/;
Those expressions marked type 'RE' are precompiled regular expressions that can be used outside square brackets. For example:
   my $webRE = TWiki::Func::getRegularExpression('webNameRegex');
   my $isWebName = ( $s =~ m/$webRE/ );

Name Matches Type
upperAlpha Upper case characters String
upperAlphaNum Upper case characters and digits String
lowerAlpha Lower case characters String
lowerAlphaNum Lower case characters and digits String
numeric Digits String
mixedAlpha Alphabetic characters String
mixedAlphaNum Alphanumeric characters String
wikiWordRegex WikiWords RE
webNameRegex User web names RE
anchorRegex #AnchorNames RE
abbrevRegex Abbreviations e.g. GOV, IRS RE
emailAddrRegex email@address'NOSPAM'.com RE
tagNameRegex Standard variable names e.g. %THIS_BIT% (THIS_BIT only) RE

normalizeWebTopicName($web, $topic) -> ($web, $topic)

Parse a web and topic name, supplying defaults as appropriate.

  • $web - Web name, identifying variable, or empty string
  • $topic - Topic name, may be a web.topic string, required.
Return: the parsed Web/Topic pair

Since: TWiki::Plugins::VERSION 1.1

Input Return
( 'Web', 'Topic' ) ( 'Web', 'Topic' )
( '', 'Topic' ) ( 'Main', 'Topic' )
( '', '' ) ( 'Main', 'WebHome' )
( '', 'Web/Topic' ) ( 'Web', 'Topic' )
( '', 'Web/Subweb/Topic' ) ( 'Web/Subweb', 'Topic' )
( '', 'Web.Topic' ) ( 'Web', 'Topic' )
( '', 'Web.Subweb.Topic' ) ( 'Web/Subweb', 'Topic' )
( 'Web1', 'Web2.Topic' ) ( 'Web2', 'Topic' )

Note that hierarchical web names (SubWeb?) are only available if hierarchical webs are enabled in configure.

The symbols %USERSWEB%, %SYSTEMWEB%, %DOCWEB%, %MAINWEB% and %TWIKIWEB% can be used in the input to represent the web names set in $cfg{UsersWebName} and $cfg{SystemWebName}. For example:

Input Return
( '%USERSWEB%', 'Topic' ) ( 'Main', 'Topic' )
( '%SYSTEMWEB%', 'Topic' ) ( 'TWiki', 'Topic' )
( '', '%DOCWEB%.Topic' ) ( 'TWiki', 'Topic' )

writeWarning( $text )

Log Warning that may require admin intervention to data/warning.txt

  • $text - Text to write; timestamp gets added
Return: none

Since: TWiki::Plugins::VERSION 1.020 (16 Feb 2004)

writeDebug( $text )

Log debug message to data/debug.txt

  • $text - Text to write; timestamp gets added
Return: none

Since: TWiki::Plugins::VERSION 1.020 (16 Feb 2004)

formatTime( $time, $format, $timezone ) -> $text

Format the time in seconds into the desired time string

  • $time - Time in epoc seconds
  • $format - Format type, optional. Default e.g. '31 Dec 2002 - 19:30'. Can be '$iso' (e.g. '2002-12-31T19:30Z'), '$rcs' (e.g. '2001/12/31 23:59:59', '$http' for HTTP header format (e.g. 'Thu, 23 Jul 1998 07:21:56 GMT'), or any string with tokens '$seconds, $minutes, $hours, $day, $wday, $month, $mo, $year, $ye, $tz' for seconds, minutes, hours, day of month, day of week, 3 letter month, 2 digit month, 4 digit year, 2 digit year, timezone string, respectively
  • $timezone - either not defined (uses the displaytime setting), 'gmtime', or 'servertime'
Return: $text Formatted time string
Note: if you used the removed formatGmTime, add a third parameter 'gmtime'

Since: TWiki::Plugins::VERSION 1.020 (26 Feb 2004)

isValidWikiWord ( $text ) -> $boolean

Check for a valid WikiWord or WikiName

  • $text - Word to test

Since: TWiki::Plugins::VERSION 1.100 (Dec 2005)

extractParameters($attr ) -> %params

Extract all parameters from a variable string and returns a hash of parameters

  • $attr - Attribute string
Return: %params Hash containing all parameters. The nameless parameter is stored in key _DEFAULT

Since: TWiki::Plugins::VERSION 1.025 (26 Aug 2004)

  • Example:
    • Variable: %TEST{ 'nameless' name1="val1" name2="val2" }%
    • First extract text between {...} to get: 'nameless' name1="val1" name2="val2"
    • Then call this on the text:
  • params = TWiki::Func::extractParameters( $text );=
    • The %params hash contains now:
      _DEFAULT => 'nameless'
      name1 => "val1"
      name2 => "val2"

extractNameValuePair( $attr, $name ) -> $value

Extract a named or unnamed value from a variable parameter string - Note: | Function TWiki::Func::extractParameters is more efficient for extracting several parameters

  • $attr - Attribute string
  • $name - Name, optional
Return: $value Extracted value

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

  • Example:
    • Variable: %TEST{ 'nameless' name1="val1" name2="val2" }%
    • First extract text between {...} to get: 'nameless' name1="val1" name2="val2"
    • Then call this on the text:
      my $noname = TWiki::Func::extractNameValuePair( $text );
      my $val1  = TWiki::Func::extractNameValuePair( $text, "name1" );
      my $val2  = TWiki::Func::extractNameValuePair( $text, "name2" );

Deprecated functions

From time-to-time, the TWiki developers will add new functions to the interface (either to TWikiFuncDotPm, or new handlers). Sometimes these improvements mean that old functions have to be deprecated to keep the code manageable. When this happens, the deprecated functions will be supported in the interface for at least one more TWiki release, and probably longer, though this cannot be guaranteed.

Updated plugins may still need to define deprecated handlers for compatibility with old TWiki versions. In this case, the plugin package that defines old handlers can suppress the warnings in %FAILEDPLUGINS%.

This is done by defining a map from the handler name to the TWiki::Plugins version in which the handler was first deprecated. For example, if we need to define the endRenderingHandler for compatibility with TWiki::Plugins versions before 1.1, we would add this to the plugin:

package TWiki::Plugins::SinkPlugin;
use vars qw( %TWikiCompatibility );
$TWikiCompatibility{endRenderingHandler} = 1.1;
If the currently-running TWiki version is 1.1 or later, then the handler will not be called and the warning will not be issued. TWiki with versions of TWiki::Plugins before 1.1 will still call the handler as required.

The following functions are retained for compatibility only. You should stop using them as soon as possible.

getScriptUrlPath( ) -> $path

Get script URL path

DEPRECATED since 1.1 - use getScriptUrl instead.

Return: $path URL path of TWiki scripts, e.g. "/cgi-bin"

WARNING: you are strongly recommended not to use this function, as the {ScriptUrlPaths} URL rewriting rules will not apply to urls generated using it.

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

getPublicWebList( ) -> @webs

DEPRECATED since 1.1 - use getListOfWebs instead.

Get list of all public webs, e.g. all webs that do not have the NOSEARCHALL flag set in the WebPreferences

Return: @webs List of all public webs, e.g. ( 'Main',  'Know', 'TWiki' )

Since: TWiki::Plugins::VERSION 1.000 (07 Dec 2002)

formatGmTime( $time, $format ) -> $text

DEPRECATED since 1.1 - use formatTime instead.

Format the time to GM time

  • $time - Time in epoc seconds
  • $format - Format type, optional. Default e.g. '31 Dec 2002 - 19:30', can be 'iso' (e.g. '2002-12-31T19:30Z'), 'rcs' (e.g. '2001/12/31 23:59:59', 'http' for HTTP header format (e.g. 'Thu, 23 Jul 1998 07:21:56 GMT')
Return: $text Formatted time string

Since: TWiki::Plugins::VERSION 1.000 (7 Dec 2002)

getDataDir( ) -> $dir

DEPRECATED since 1.1 - use the "Webs, Topics and Attachments" functions to manipulate topics instead

Get data directory (topic file root)

Return: $dir Data directory, e.g. '/twiki/data'

This function violates store encapsulation and is therefore deprecated.

Since: TWiki::Plugins::VERSION 1.000 (07 Dec 2002)

getPubDir( ) -> $dir

DEPRECATED since 1.1 - use the "Webs, Topics and Attachments" functions to manipulateattachments instead

Get pub directory (file attachment root). Attachments are in $dir/Web/TopicName

Return: $dir Pub directory, e.g. '/htdocs/twiki/pub'

This function violates store encapsulation and is therefore deprecated.

Use readAttachment and saveAttachment instead.

Since: TWiki::Plugins::VERSION 1.000 (07 Dec 2002)

checkDependencies( $moduleName, $dependenciesRef ) -> $error

DEPRECATED since 1.1 - use TWiki:Plugins.BuildContrib and define DEPENDENCIES that can be statically evaluated at install time instead. It is a lot more efficient.

Since: TWiki::Plugins::VERSION 1.025 (01 Aug 2004)


TWiki CGI and Command Line Scripts

Programs on the TWiki server performing actions such as rendering, saving and renaming topics.

The TWiki scripts are located in the twiki/bin and twiki/tools directories. This topic describes the interfaces to some of those scripts. All scripts in the twiki/bin directory can be called from the CGI (Common Gateway Interface) environment or from the command line. The scripts in the twiki/tools directory can only be called from the command line.

CGI Scripts

Details on CGI scripts located in the twiki/bin directory.

General Information

CGI environment

In the CGI environment parameters are passed to the scripts via the URL and URL parameters. Environment variables are also used to determine the user performing the action. If the environment is not set up, the default TWiki user is used (usually guest).

Command-line

You must be have the twiki/bin directory on the perl path to run the scripts from the command line. To avoid issues with file permissions, run the scripts as the web server user such as nobody or www.

Parameters are passed on the command line using '-name' - for example,

$ cd /usr/local/twiki/bin
$ save -topic MyWeb.MyTopic -user admin -action save -text "New text of the topic"
All parameters require a value, even if that is the empty string.

Common parameters

All the scripts accept a number of common parameters. The first two components of the URL after the script name are taken as the web and the topic, respectively. Standard URL parameters are:

Parameter Description Default
topic If this is set to a URL, TWiki will immediately redirect to that URL. Otherwise it overrides the URL and is taken as the topic name (you can pass Web.TopicName)  
user Command-line only; set the name of the user performing the action. Note: this usage is inherently insecure, as it bypasses webserver login constraints. For this reason only authorised users should be allowed to execute scripts from the command line.  
skin Overrides the default skin path (see TWikiSkins)  
cover Specifies temporary skin path to prepend to the skin path for this script only (see TWikiSkins)  

attach

Despite the name, this script doesn't actually attach a file to a topic - for that, use upload. This script is part of the transactions sequence executed when a file is uploaded from the browser. it just generates the "new attachment" page for a topic.

Parameter Description Default
filename Name of existing attachment (if provided, this is a "manage attachment" action) none (in which case this is a "new attachment" action)

changes

Shows all the changes in the given web.

The changes script can receive one parameter:

Parameter Description Default
minor If 0, show only major changes. If 1, show all the changes (both minor and major) 0

The main difference between invoking this script and using WebChanges is that WebChanges is based on a %SEARCH%, while this script reads the changes file in each web, making it much faster.

NOTE: The result from changes script and the topic WebChanges can be different, if the changes file is deleted from a web. In particular, in new installations the changes script will return no results while the WebChanges topic will.

configure

configure is the browser script used for inspection and configuration of the TWiki configuration. None of the parameters to this script are useable for any purpose except configure. See configure.

edit

The edit scipt understands the following parameters, typically supplied by HTML input fields:

Parameter Description Default
action Optional. Use the editaction template instead of the standard edit. If action=text, then hide the form. If action=form hide the normal text area and only edit the form.  
onlynewtopic If set, error if topic already exists  
onlywikiname If set, error if topic name is not a WikiWord  
templatetopic The name of the template topic, copied to get the initial content  
text Initial text for the topic  
topicparent The parent topic  
formtemplate Name of the form to instantiate in the topic. Overrides the form set in the templatetopic if defined.  
contenttype Optional parameter that defines the application type to write into the CGI header. Defaults to text/html. May be used to invoke alternative client applications  
anyname Any parameter can passed to the new topic; if the template topic contains %URLPARAM{"anyname"}%, it will be replaced by its value  
breaklock If set, any lease conflicts will be ignored, and the edit will proceed even if someone is already editing the topic.  
redirectto If the user continues from edit to save, and if the save process is successful, save will redirect to this topic or URL. The parameter value can be a TopicName, a Web.TopicName, or a URL.
Note: Redirect to a URL only works if it is enabled in configure (Miscellaneous {AllowRedirectUrl}).
 

Form field values are passed in parameters named 'field' - for example, if I have a field Status the parameter name is Status.

  1. The first sequence of ten or more X characters in the topic name will be converted on save to a number such that the resulting topic name is unique in the target web.

NOTE: most skins support the definition of EDIT_SKIN, which is used as the value of the cover parameter in edit URLs. This allows you to override the default edit skin on a web, topic or user basis.

login

Used for logging in when TWiki login is being used (e.g TemplateLoginManager).
Parameter Description Default
origurl URL that was being accessed when an access violation occurred. the login process will redirect to this URL if it is successful none
username username of user logging in none
password password of user logging in none

logon

Used for logging in when Web Server authentication is being used (e.g. ApacheLoginManager). The script does nothing; it is purely a placeholder for triggering the login process. The webserver will be set up to require a valid user to access this script, thus triggering the webserver login process.

manage

Performs a range of management functions.
Parameter Description
<-- -->
up
Default
action One of createweb, deleteUserAccount, editSettings or saveSettings none

action=createweb

Parameter Description Default
newweb Name of the new web ''
baseweb Name of the web to copy to create the new web ''
webbgcolor value for WEBBGCOLOR ''
sitemapwhat Value for SITEMAPWHAT ''
sitemapuseto Value for SITEMAPUSETO ''
nosearchall Value for NOSEARCHALL ''

action=deleteUserAccount

Unregisters (removes) the currently logged-in user.
Parameter Description Default
password Users' password none

action=editSettings

No parameters

action=bulkRegister

See BulkRegistration.
Parameter Description Default
OverwriteHomeTopics Whether to overwrite existing home topics or not false
EmailUsersWithDetails Whether to mail registered users or not false
LogTopic Topic to save the log in Same as topic name, with 'Result' appended.

action=saveSettings

Parameter Description Default
text Text of the topic ''
originalrev Revision that the edit started on Most recent revision
All other parameters may be interpreted as form fields, depending on the current form definition in the topic.

oops

This script is mainly used for rendering pages containing error messages, though it is also used for some functional actions such as manage pages (move topic etc).

oops templates are used with the oops script to generate system messages. This is done to make internationalisation or other local customisations simple.

The oops script supports the following parameters:

Parameter Description Default
template Name of the template file to display  
def Optional, can be set to the name of a single definition within template. This definition will be instantiated in the template wherever %INSTANTIATE% is seen. This lets you use a single template file for many messages. For an example, see oopsmanagebad.tmpl.  
paramN Where N is an integer from 1 upwards. These values will be substituted into template for %PARAM1% etc.  

passwd

Parameter Description Default
action one of changePassword or resetPassword none
Other parameters as described under manage, action=changePassword.

action=changePassword

Parameter Description Default
username Username  
oldpassword Existing password (plain text)  
password New password (plain text)  
passwordA New password confirmation (plain text)  
TopicName ?  

preview

This script is deprecated. Its functions are covered by the save script.

rdiff

Renders the differences between version of a TWiki topic

Parameter Description Default
rev1 the higher revision  
rev2 the lower revision  
render the rendering style {sequential, sidebyside, raw, debug} DIFFRENDERSTYLE, sequential
type {history, diff, last} history diff, version to version, last version to previous diff
context number of lines of context  
TODO:
  • add a {word} render style

register

Parameter Description Default
action register or verify or resetPassword or approve  

rename

Used for renaming topics.

Parameter Description Default
skin skin(s) to use  
newweb new web name  
newtopic new topic name  
breaklock    
attachment    
confirm if defined, requires a second level of confirmation  
currentwebonly if defined, searches current web only for links to this topic  
nonwikiword if defined, a non-wikiword is acceptable for the new topic name  

resetpasswd

Reset the password for a single or multiple users
Parameter Description Default
LoginName list of usernames to reset none - error if not set
Introduction message to be sent alongside the reset, most often used to announce to the user that they have been given an account. ''

This is used by BulkResetPassword and ResetPassword. Only users belonging to the TWikiAdminGroup can provide a list of LoginNames, non-admins can only provide a single LoginName.

BulkRegistration provides the means to create multiple accounts but it does not announce those accounts to the users who own them. BulkResetPassword is used to assign the passwords, the Introduction is used to explain why they are receiving the mail.

rest

This REST (Representational State Transfer) script can be invoked via http in the same way as the other TWiki scripts (see Invocation Examples, below) to execute a function that is associated to a "subject" and a "verb" (see below). These functions are usually registered by plugins using the TWiki::Func::registerRESTHandler method. The rest script will print the result directly to the browser unless the endPoint parameter is specified, in which case it will output a redirect to the given topic.

The rest script supports the following parameters:

username If TemplateLogin, or a similar login manager not embedded in the web server, is used, then you need to pass a username and password to the server. The username and password parameters are used for this purpose.
password See username
topic If defined as the full name (including web) of a topic, then when the script starts up plugins will be passed this as the "current" topic. If not defined, then %USERWEB%.WebHome will be passed to plugins.
endPoint Where to redirect the response once the request is served, in the form "Web.Topic"

The function is free to use any other query parameters for its own purposes.

ALERT! The rest script should always require authentication in any TWiki that has logins. Otherwise there is a risk of opening up major security holes. So make sure you add it to the list of authenticated scripts if you are using ApacheLogin.

Invocation Examples

The rest script assumes that it will be called with URL in the form:

http://my.host/bin/rest/<subject>/<verb>

where <subject> must be the WikiWord name of one of the installed TWikiPlugins, and the <verb> is the alias for the function registered using the TWiki::Func::registerRESTHandler method. The <subject> and <verb> are then used to lookup and call the registered function.

<subject> and <verb> are checked for illegal characters exactly in the same way as the web and topic names.

As an example, the EmptyPlugin has registered a function to be used with the rest script under the subject EmptyPlugin and the verb example. Click below to see the rest script in action (run as TWikiGuest).

Call the Plugin

Note that for Plugins to register REST handlers, they must be enabled in configure.

save

The save script performs a range of save-related functions, as selected by the action parameter.

Parameter Description Default
action_save=1 default; save, return to view, dontnotify is off  
action_quietsave=1 save, and return to view, dontnotify is on  
action_checkpoint save and redirect to the edit script, dontnotify is on  
action_cancel exit without save, return to view  
action_preview preview edited text  
action_addform Redirect to the "change form" page.  
action_replaceform... Redirect to the "change form" page.  
action_delRev Administrators only delete the most recent revision of the topic - all other parameters are ignored. You have to be a member of TWikiAdminGroup to use this, and not all store implementations will support it.  
action_repRev Administrators only replace the text of the most recent revision of the topic with the text in the text parameter. text must included embedded meta-data tags. All other parameters are ignored. You have to be a member of TWikiAdminGroup to use this, and not all store implementations will support it.  
onlynewtopic If set, error if topic already exists  
onlywikiname If set, error if topic name is not a WikiWord  
dontnotify if defined, suppress change notification  
templatetopic Name of a topic to use as a template for the text and form  
text New text of the topic  
forcenewrevision if set, forces a revision even if TWiki thinks one isn't needed  
topicparent If 'none' remove any current topic parent. If the name of a topic, set the topic parent to this.  
formtemplate if defined, use the named template for the form  
editaction When action is checkpoint, add form or replace form..., this is used as the action parameter to the edit script that is redirected to after the save is complete.  
originalrev Revision on which the edit started.  
edit The script to use to edit the topic when action is checkpoint edit
editparams The parameter string to use to edit the topic  
redirectto The save process will redirect to this topic or URL if it is successful. (Typically this would be the URL that was being viewed when edit was invoked). The parameter value can be a TopicName, a Web.TopicName, or a URL.
Note: Redirect to a URL only works if it is enabled in configure (Miscellaneous {AllowRedirectUrl}).
view topic being edited

Any errors will cause a redirect to an oops page.

The parameters are interpreted in according to the following rules.

  1. The first sequence of ten or more X characters in the topic name will be converted to a number such that the resulting topic name is unique in the target web.
  2. When the action is save, checkpoint, quietsave, or preview:
    1. The new text is taken from the text parameter, if it is defined,
      • otherwise it is taken from the templatetopic, if it is defined,
      • otherwise it is taken from the previous version of the topic, if any,
    2. The name of the new form is taken from the formtemplate, if defined
      • otherwise it is taken from the templatetopic, if defined,
      • otherwise it is taken from the previous version of the topic, if any,
      • otherwise no form is attached.
    3. The value for each field in the form is taken from the query, if it is defined
      • otherwise it is taken from the templatetopic, if defined,
      • otherwise it is taken from the previous version of the topic, if any,
      • otherwise it defaults to the empty string.

Merging is only enabled if the topic text comes from text and originalrev is > 0 and is not the same as the revision number of the most recent revision. If merging is enabled both the topic and the meta-data are merged.

Form field values are passed in parameters named 'field' - for example, if I have a field Status the parameter name is Status.

search

CGI gateway to the %SEARCH% functionality driven by the following CGI parameters:

Parameter: Description: Default:
"text" Search term. Is a keyword search, literal search or regular expression search, depending on the type parameter. SearchHelp has more required
search="text" (Alternative to above) N/A
web="Name"
web="Main, Know"
web="all"
Comma-separated list of webs to search. See TWikiVariables#VarSEARCH for more details. Current web
topic="WebPreferences"
topic="*Bug"
Limit search to topics: A topic, a topic with asterisk wildcards, or a list of topics separated by comma. All topics in a web
excludetopic="Web*"
excludetopic="WebHome, WebChanges"
Exclude topics from search: A topic, a topic with asterisk wildcards, or a list of topics separated by comma. None
type="keyword"
type="literal"
type="regex"
Do a keyword search like soap "web service" -shampoo; a literal search like web service; or RegularExpression search like soap;web service;!shampoo %SEARCHVAR- DEFAULTTYPE% preferences setting (literal)
scope="topic"
scope="text"
scope="all"
Search topic name (title); the text (body) of topic; or all (both) "text"
order="topic"
order="created"
order="modified"
order="editby"
order=
 "formfield(name)"
Sort the results of search by the topic names, topic creation time, last modified time, last editor, or named field of TWikiForms. The sorting is done web by web; in case you want to sort across webs, create a formatted table and sort it with TablePlugin's initsort Sort by topic name
limit="all"
limit="16"
Limit the number of results returned. This is done after sorting if order is specified All results
date="..." limits the results to those pages with latest edit time in the given TimeInterval. All results
reverse="on" Reverse the direction of the search Ascending search
casesensitive="on" Case sensitive search Ignore case
bookview="on" BookView search, e.g. show complete topic text Show topic summary
nonoise="on" Shorthand for nosummary="on" nosearch="on" nototal="on" zeroresults="off" noheader="on" noempty="on" Off
nosummary="on" Show topic title only Show topic summary
nosearch="on" Suppress search string Show search string
noheader="on" Suppress search header
Topics: Changed: By:
Show search header
nototal="on" Do not show number of topics found Show number
zeroresults="off" Suppress all output if there are no hits zeroresults="on", displays: "Number of topics: 0"
noempty="on" Suppress results for webs that have no hits. Show webs with no hits
header="..."
format="..."
Custom format results: see FormattedSearch for usage, variables & examples Results in table
expandvariables="on" Expand variables before applying a FormattedSearch on a search hit. Useful to show the expanded text, e.g. to show the result of a SpreadSheetPlugin %CALC{}% instead of the formula Raw text
multiple="on" Multiple hits per topic. Each hit can be formatted. The last token is used in case of a regular expression ";" and search Only one hit per topic
nofinalnewline="on" If on, the search variable does not end in a line by itself. Any text continuing immediately after the search tag on the same line will be rendered as part of the table generated by the search, if appropriate. off
separator=", " Line separator between hits Newline "$n"

statistics

Refresh the WebStatistics topics in range of webs.
Parameter Description Default
webs comma-separated list of webs to run stats on all accessible webs
logdate YYYYMM to generate statistics for current month

for example:

  1. from browser http://focus.cs.unibo.it/bin/statistics updates all user webs
  2. from browser http://focus.cs.unibo.it/bin/statistics?webs=TWiki,Main,Sandbox updates TWiki,Main,Sandbox
  3. from browser http://focus.cs.unibo.it/bin/statistics/TWiki updates TWiki
  4. from command line twiki/bin/statistics updates all user webs
  5. from command line twiki/bin/statistics -webs=TWiki,Main,Sandbox updates TWiki,Main,Sandbox
  6. from command line twiki/bin/statistics TWiki.WebHome updates TWiki

see TWikiSiteTools#WebStatistics_site_statistics for updating statistics using cron.

twiki

Single-script interface to the functionality of all the other scripts. Experimental, not for production use. Read the code if you want to know more.

upload

Uploads an attachment to a topic. The HTTP request is expected to be in multipart/form-data format.
Parameter Description Default
hidefile if defined, will not show file in attachment table  
filepath local (client) path name of the file being uploaded. This is used to look up the data for the file in the HTTP query.  
filename deprecated, do not use  
filecomment Comment to associate with file in attachment table  
createlink if defined, will create a link to file at end of topic  
changeproperties if defined, this is a property change operation only - no file will be uploaded. null

You can use a tool like curl to upload files from the command line using this script.

view

Used for viewing topics.

Parameter Description Default
raw=on Shows the text of the topic in a scrollable textarea  
raw=debug As raw=on, but also shows the metadata (forms etc) associated with the topic.  
raw=text Shows only the source of the topic, as plain text (Content-type: text/plain). Only shows the body text, not the form or other meta-data.
raw=all Shows only the source of the topic, as plain text (Content-type: text/plain), with embedded meta-data. This may be useful if you want to extract the source of a topic to a local file on disc.  
section Allows to view only a part of the topic delimited by a named section (see VarSTARTSECTION). If the given section is not present, no topic content is displayed.  
contenttype Allows you to specify a different Content-Type: (e.g. contenttype=text/plain)  
rev Revision to view (e.g. rev=45)  
template Allows you to specify a different skin template, overriding the 'view' template the view script would normally use. The default template is view. For example, you could specify /bin/view/TWiki/TWikiScripts?template=edit. This is mainly useful when you have specialised templates for a TWiki Application.  

ALERT! For historical reasons, the view script has a special interpretation of the text skin. In earlier TWiki versions the skin=text parameter was used like this: http://.../view/MyWeb/MyTopic?skin=text&contenttype=text/plain&raw=on which shows the topic as plain text; useful for those who want to download plain text for the topic. Using skin=text this way is DEPRECATED, use raw=text instead.

viewfile

Used for viewing attachments. Normally, a site will publish the attachments (pub) directory using a URL. However if it contains sensitive information, you will want to protect attachments using TWikiAccessControls. In this case, you can use the viewfile script to give access to attachments while still checking access controls.

Parameter Description Default
filename name of attachment  
rev Revision to view  

Command Line Scripts

Details on command line scripts located in the twiki/tools directory.

geturl.pl

This is a very simple script to get the content of a web site. It is marked as deprecated and might be removed (or enhanced) in a future TWiki release. Its functions are covered by the standard wget and curl commands.
  • Usage: geturl.pl <host> <path> [<port> [<header>]]
  • Example: geturl.pl some.domain /some/dir/file.html 80
  • Will get: http://some.domain:80/some/dir/file.html

rewriteshebang.pl

Simple script to rewrite the #!/usr/bin/perl shebang lines specific to your local Perl installation. It will rewrite the first line of all your TWiki cgi scripts so they use a different shebang line. Use it if your perl is in a non-standard location, or you want to use a different interpreter (such as 'speedy').

tick_twiki.pl

This script executes a number of non-essential regular administration tasks that will help keep your TWiki healthy and happy, such as removing expired sessions and lease files.

It is intended to be run as a cron job or a scheduled task once a week. Example crontab entry:
0 0 * * 0 cd /usr/twiki/bin && perl ../tools/tick_twiki.pl

Note: The script has to be run by a user who can write files created by the webserver user.

Related Topics: AdminDocumentationCategory, DeveloperDocumentationCategory

 

TWiki Site Tools

Utilities for searching, navigation, and monitoring site activity

TWiki Site Tools include utilities for navigating, searching and keeping up with site activity. Preferences can be configured by web or site-wide. You are currently in the TWiki web. In particular, TWiki provides two highly configurable, automated site monitoring tools, WebNotify, to e-mail alerts when topics are edited, and WebStatistics, to generate detailed activity reports.

WebNotify - recent changes alert

Each TWiki web has an automatic e-mail alert service that sends a list of recent changes on a preset schedule, like once a day. Users can subscribe and unsubscribe using WebNotify in each web. The Perl script mailnotify is called by a background process at regular intervals. The script sends an automated e-mail to subscribed users if topics were changed in a web since the script was last run.

Web Changes Notification Service

Each TWiki web has an automatic e-mail notification service that sends you an e-mail with links to all of the topics modified since the last alert.

Users subscribe to email notifications using their WikiName or an alternative email address, and can specify the webs/topics they wish to track using one of these bullet list formats:

three spaces * [ webname . ] wikiName - SMTP mail address
three spaces * [ webName . ] wikiName
three spaces * SMTP mail address
three spaces * SMTP mail address : topics
three spaces * [ webname . ] wikiName : topics

In the above examples, topics is a space-separated list of topic names. The user may further customize the specific content they will receive using the following formats:

  • Specify topics without a Web. prefix
  • Topics must exist in this web.
  • Topics may be specified using * wildcards
  • Each topic may optionally be preceded by a '+' or '-' sign. The '+' sign means "subscribe to this topic" (the same as not putting anything). The '-' sign means "unsubscribe" or "don't send notifications regarding this topic". This allows users to elect to filter out certain topics (and their children, to an arbitrary depth). Topic filters ('-') take precedence over topic includes ('+').
  • Each topic may optionally be followed by an integer in parentheses, indicating the depth of the tree of children below that topic. Changes in all these children will be detected and reported along with changes to the topic itself. Note This uses the TWiki "Topic parent" feature.
  • Each topic may optionally be immediately followed by an exclamation mark ! or a question mark ? with no intervening spaces, indicating that the topic (and children if there is a tree depth specifier as well) should be mailed out as complete topics instead of change summaries. ! causes the topic to be mailed every time even if there have been no changes, ? will mail the topic only if there have been changes to it. This only makes sense for subscriptions.

For example: Subscribe Daisy to all changes to topics in this web.

   * daisy.cutter@flowers.com
Subscribe Daisy to all changes in all webs that start with Web.
   * daisy.cutter@flowers.com: Web*
Subscribe Daisy to changes to topics starting with Petal, and their immediate children, WeedKillers and children to a depth of 3, and all topics that match start with Pretty and end with Flowers e.g. PrettyPinkFlowers
   * DaisyCutter: Petal* (1) WeedKillers (3) Pretty*Flowers
Subscribe StarTrekFan to changes to all topics that start with Star except those that end in Wars, sInTheirEyes or shipTroopers.
   * StarTrekFan: Star* - *Wars - *sInTheirEyes - *shipTroopers
Subscribe Daisy to the full content of NewsLetter whenever it has changed
   * daisy@flowers.com: NewsLetter?
Subscribe buttercup to NewsLetter and its immediate children, even if it hasn't changed.
   * buttercup@flowers.com: NewsLetter! (1)
Subscribe GardenGroup (which includes Petunia) to all changed topics under AllnewsLetters to a depth of 3. Then unsubscribe Petunia from the ManureNewsLetter, which she would normally get as a member of GardenGroup?:
   * GardenGroup: AllNewsLetters? (3)
   * petunia@flowers.com: - ManureNewsLetter
A user may be listed many times in the WebNotify topic. Where a user has several lines in WebNotify that all match the same topic, they will only be notified about changes that topic once (though they will still receive individual mails for news topics).

If a TWiki group is listed for notification, the group will be recursively expanded to the e-mail addresses of all members.

TIP Tip: List names in alphabetical order to make it easier to find the names.

Note for System Administrators: Notification is supported by an add-on to the TWiki kernel called the MailerContrib. See the MailerContrib topic for details of how to set up this service.

Note: If you prefer a news feed, point your reader to WebRss (for RSS 1.0 feeds) or WebAtom (for ATOM 1.0 feeds). Learn more at WebRssBase and WebAtomBase, respectively.

You can also use %MAINWEB% instead of Main, but this is not necessary even if you have renamed the main web by configuring {MainWebName} in configure.

WebSearch - search TWiki site

WebSearch is an extremely fast and flexible search facility, part of the core TWiki feature set. WebSearchAdvanced offers more options, including:

  • topic title or full-text search
  • regular expressions
  • search within web or site-wide
  • index-style A-Z alphabetical listing sorted topic title
  • many more

See also: SearchHelp for help; TWikiVariables and FormattedSearch for including hard-coded searches in text.

WebChanges - what's new

To check for the most recently edited topics while on-site, use the WebChanges link, usually located in the toolbar. It lists the most recently modified topics, newest first, along with the first couple of lines of the page content.

This is simply a preset SEARCH. The number of topics listed by the limit parameter.:

%SEARCH{ ".*" web="TWiki" type="regex" nosearch="on" order="modified"
reverse="on" limit="50" }%

WebIndex - list of topics

WebIndex lists all web topics in alphabetical order, with the first couple of lines of text. This is simply a preset SEARCH:

%SEARCH{ "\.*" scope="topic" type="regex" nosearch="on" }%

WebStatistics - site statistics

You can generate a listing manually, or on an automated schedule, of visits to individual pages, on a per web basis. Compiled as a running total on a monthly basis. Includes totals for Topic Views, Topic Saves, Attachment Uploads, Most Popular Topics with number of views, and Top Contributors showing total of saves and attachment uploads. Previous months are saved.

Configuring for automatic operation

  • You can automatically generate usage statistics for all webs. To enable this:
    • Make sure variable {Log}{view}, {Log}{save} and *{Log}{upload} in are set in configure. This will generate log file entries (see below).
    • The WebStatistics topic must be present in all webs where you want to have statistics. You can use the topic in the Main web as a template.
    • Call the twiki/bin/statistics script from a cron job, once a day is recommended. This will update the WebStatistics topics in all webs.
    • Attention: The script must run as the same user as the CGI scripts are running, which is user nobody on many systems. Example crontab entry:
      0 0 * * * (cd /path/to/twiki/bin; ./statistics >/dev/null 2>&1)
    • There is a workaround in case you can't run the script as user nobody : Run the utility twiki/tools/geturl.pl in your cron job and specify the URL of the twiki/bin/statistics script as a parameter. Example:
      0 0 * * * (cd /path/to/twiki/tools; ./geturl.pl mydomain.com /urlpath/to/twiki/bin/statistics >/dev/null 2>&1)

When running from the command line or a cron job, you can pass parameters to the script like this:

./statistics -logdate 200605 -webs TWiki,Sandbox

Generating statistics manually by URL

  • The twiki/bin/statistics script can also be executed as a CGI script, just enter the URL in your browser. Examples:
    • Update current month for all webs you have access to:
      /bin/statistics
    • Update current month for Main web only:
      /bin/statistics/Main
    • Update Aug 2019 for Main web:
      /bin/statistics/Main?logdate=201908
    • Update Aug 2019 for the ProjectX, ProjectY and ProjectZ webs:
      /bin/statistics?logdate=201908;webs=ProjectX,ProjectY,ProjectZ

Log Files

TWiki generates monthly log files which are used by the statistics script

  • The log file is defined by the {LogFileName} setting in configure
  • The file name is log<year><month>.txt
  • Example path name: twiki/logs/log201908.txt
  • Each access gets logged as:
    | <time> | <wikiusername> | <action> | <web>.<topic> | <extra info> | <IP address> |
  • Example log entry:
    | 22 Aug 2019 - 14:53 | TWikiGuest | view | WebRss |  | 66.124.232.02 |
  • Actions are logged if enabled in configure by the {Log}{action} flags
  • Logged actions:
    Script Action name Extra info
    attach attach when viewing attach screen of previous uploaded attachment: filename
    changes changes  
    edit edit when editing non-existing topic: (not exist)
    rdiff rdiff higher and lower revision numbers: 4 3
    register regstart WikiUserName, e-Mail address, LoginName: user attempts to register
    register register E-mail address: user successfully registers
    register bulkregister WikiUserName of new, e-mail address, admin ID
    rename rename when moving topic: moved to Newweb.NewTopic
    rename move when moving attachment: Attachment filename moved to Newweb.NewTopic
    passwd resetpasswd LoginName, WikiName, E-mail address, success code from addUserPassword
    passwd changepasswd LoginName, WikiName
    save save when replacing existing revision: repRev 3
    when user checks the minor changes box: dontNotify
    when user changes attributes to an exising attachment: filename.ext
    save cmd special admin parameter used when saving
    search search search string
    upload upload filename
    view view when viewing non-existing topic: (not exist)
    when viewing previous topic revision: r3

E-mail

Configuring outgoing mail

Outgoing mail is required for TWikiRegistration and for recent changes alert.

TWiki will use the Net::SMTP module if it is installed on your system. Set this with the SMTPMAILHOST variable in TWikiPreferences.

The notify e-mail uses the default changes.tmpl template, or a skin if activated in the TWikiPreferences.

mailnotify also relies on two hidden files in each twiki/data/Web directory: .changes and .mailnotify. Make sure both are writable by your web server process. .changes contains a list of changes; go ahead and make this empty. .mailnotify contains a timestamp of the last time notification was done.

You can use an external mail program, such as sendmail, if the Net::SMTP module is not installed. Set the program path in {MailProgram} in configure.

  • HELP Net::SMTP can be easily disabled (if there is an installation error) by setting SMTPMAILHOST in TWikiPreferences to an empty value.

  • TIP You can set a separate SMTPSENDERHOST variable to define the mail sender host (some SMTP installations require this).

Setting the automatic e-mail schedule

For Unix platforms: Edit the cron table so that mailnotify is called in an interval of your choice. Please consult man crontab of how to modify the table that schedules program execution at certain intervals. Example:

% crontab -e
0 2 * * * (cd /path/to/twiki/bin; ./mailnotify -q)
The above line will run mailnotify nightly at 02:00. The -q switch suppresses all normal output.

For ISP installations: Many ISPs don't allow hosted accounts direct cron access, as it's often used for things that can heavily load the server. Workaround scripts are available.

On Windows: You can use a scheduled task if you have administrative privileges. TWiki:Codev/CronTabWin is a free scheduler for Windows.

Site Permissions

  • TWikiAccessControl describes how to restrict read and write access to topics and webs, by users and groups
  • SitePermissions lists the permissions settings of the webs on this TWiki site

Related Topics: AdminDocumentationCategory, AdminToolsCategory

Line: 81 to 76
 

Manage Users

Register users on your TWiki site; change/reset/install passwords; remove user accounts

Authentication and Access Control

Register User

It is not necessary to have user home pages in the TWiki system for Authentication to work - see TWikiUserAuthentication for details.

  • TWikiRegistration is for users to fill out a form
  • NewUserTemplate can be changed to customize user home pages, it can optionally use the UserForm to define user fields as meta data
  • BulkRegistration is for administrators to use to set up one or more accounts: either from a table or from an external file

Change, Reset and Install Passwords

  • ChangePassword is for users who can remember their password and want to change it
  • ResetPassword is for users who cannot remember their password; a system generated password is e-mailed to them
  • BulkResetPassword if for administrators who want to reset many passwords at once

Changing User Account Names

To change the user's WikiName:

  • Rename the user's TWiki homepage in the Main web, such as from JaneSmith to JaneMiller.
    • Fix backlinks in the Main web only
    • Make sure the group topics are updated (if any.)
  • Edit the Main.TWikiUsers topic and move the user's entry so that the list is in proper alphabetical order.
  • Recreate the old topic with a pointer to the new topic, so that links in other webs work properly. Example content:
    %M% Jane Smith is now known as JaneMiller

If external authentication is used and you want to change the login name:

  • The login name needs to be changed in the directory server, such as AD or LDAP
  • In TWiki's Main.TWikiUsers topic, fix the mapping from login name to WikiName such as from:
       * JohnSmith - john - 13 Sep 2006
    to:
       * JohnSmith - jsmith - 13 Sep 2006

Removing User Accounts

To remove a user account (FredQuimby, who logs in as "fred"):

  1. If you are using a .htpasswd file, edit the .htpasswd file to delete the line starting fred:
    • Warning: Do not use the Apache htpasswd program with .htpasswd files generated by TWiki! htpasswd wipes out email addresses that TWiki plants in the info fields of this file.
  2. Remove the FredQuimby - fred line from the Main.TWikiUsers topic
  3. Remove FredQuimby from all groups and from all the ALLOWWEB/ALLOWTOPIC... declarations, if any.
    Note: If you fail to do this you risk creating a security hole, as the next user to register with the wikiname FredQuimby will inherit the old FredQuimby's permissions.
  4. [optional] Delete their user topic Main.FredQuimby (including attachments, if any.)

Note: Consider leaving the user topic file in place so their past signatures and revision author entries don't end up looking like AnUncreatedTopic?. If you want to make it clear the user is no longer with the organization or has been banished, replace the topic content with a note to that effect. The existance of the UserName topic should also prevent that user name from being re-used, sealing the potential security hole regarding inherited permissions..

Related Topics: AdminDocumentationCategory

Changed:
<
<

Warning: Can't find topic TWiki.AppendixFileSystem

>
>

Appendix A: TWiki Development Timeline

TWiki Release 4.1 (Edinburgh), 16 Jan 2007

New Features and Enhancements of TWiki Release 4.1

  • Easier Installation and Upgrade
    • Plugins can now be installed from the configure script.
    • The loading of plugin preferences settings has been moved earlier in the preferences evaluation order so that plugin settings can be redefined in Main.TWikiPreferences, WebPreferences and in topics. To make TWiki upgrades easier, it is recommended to set the plugin settings in Main.TWikiPreferences, and not to customize the settings in the plugin topic. For example, to change the TEMPLATES setting of the CommentPlugin, create a new COMMENTPLUGIN_TEMPLATES setting in Main.TWikiPreferences.
    • Plugin settings can now be defined in configure instead of in the plugin topic (requires that the individual plugin has implemented this). TWiki performs slightly better by not looking for preferences settings in plugin topics.
    • Configure no longer shows many unnecessary errors when run first time.
    • The webmaster email address is now defined in configure instead of TWikiPreferences.
    • Default file access rights in the distribution package have been changed to be more universally defined and in line with the default access rights for new topics.

  • Usability Enhancements
    • Redesigned result page when typing incomplete topic name into the Jump box, so that it is possible to quickly navigate to a topic, also in a very large TWiki installation. For example, "I know there is a topic about Ajax somewhere in the Eng web. OK, let my type Eng.ajax into the Jump box... Here we go, the third link is the AjaxCookbook I was looking for."
    • Many user documentation improvements.
    • URL parameters maintained in Table of Contents links so you can stay in a temporary skin (e.g. print) and keep URLPARAM values when you click the TOC links
    • Attachment tables now sorted alphabetically.
    • Better printing of tables and verbatim text in PatternSkin.

  • Application Platform Enhancements
    • Auto-incremented topic name on save with AUTOINC<n> in topic name; used by TWiki applications to create topic based database records.
    • The edit and save scripts support a redirectto parameter to redirect to a topic or a URL; for security, redirect to URL needs to be enabled with a {AllowRedirectUrl} configure flag.
    • CommentPlugin supports the redirectto parameter to redirect to a URL or link to TWiki topic after submitting comment.
    • The topic URL parameter also respects the {AllowRedirectUrl} configure flag so redirects to URLs can be disabled which could be abused for phishing attacks.
    • The view script supports a section URL parameter to view just a named section within a topic. Useful for simple AJAX type applications.
    • New plugin handler for content move.
    • Enhancements for Ajax based applications with TWiki:Plugins/YahooUserInterfaceContrib and TWiki:Plugins.TWikiAjaxContrib (available at twiki.org).

  • Search Enhancements
    • METASEARCH handles a format parameter like SEARCH.
    • Topic not found / WebTopicViewTemplate search now case insensitive.
    • FormattedSearch header supporting $nop, $quot, $percnt, $dollar.
    • Add search by createdate option to SEARCH.
    • New newline option for SEARCH to protect e.g. formfields from being altered during rendering in SEARCH.

  • Skins and Templates Enhancements
    • Support for templates to have text rendering affecting aspect outside of textarea.
    • Pattern skin dependence on TwistyPlugin instead of TwistyContrib (performance improvement.)
    • Don't strip newlines from the front of TMPL:DEFs.

  • Miscellaneous Feature Enhancements
    • Change in WikiWord definition: Numbers are treated as lower case letters, e.g. Y2K is now a WikiWord.
    • Configurable template load path. Advanced feature for those that work with customized templates.
    • Added %VBAR% to TWikiPreferences for vertical bar symbol.
    • On topic creation, force initial letter of topic name to be upper case.
    • Allow date format in form fields.
    • Enhance REVINFO{} variable with same date qualifiers as GMTIME{}.
    • WebTopicCreator - adding ability to select a template from any topic name ending in ...Template
    • Functionality of TWiki:Plugins.DateFieldPlugin merged into core

  • Enhancements of Pre-installed Plugins
    • CommentPlugin: Supports removal of comment prompt after a comment is made.
    • EditTablePlugin: Default date format based on JSCalendarContrib instead of plugin topic.
    • InterwikiPlugin: Supports custom link formats.
    • SlideShowPlugin: Preserves URL parameters in slideshow
    • SpreadSheetPlugin: New functions $LISTRAND(), $LISTSHUFFLE(), $LISTTRUNCATE().
    • TablePlugin: New attribute cellborder.
    • TablePlugin: Highlight the sorted column with custom colors; includes also a general cosmetic update of default colors.
    • TablePlugin: Support for initsort on more than one table. A table with the initsort option is initsorted UNLESS it is sorted by clicking on a column header. If you click on a header of another table all other tables goes back to the default sort defined by initsort or not sorted if no initsort, and the new table is sorted based on the user clicking on a table header.

  • Bugfixes
    • More than 200 bugs fixed since 4.0.5

Hall of Fame of TWiki Release 4.1

Although many more people have been involved in creating TWiki-4.1, special thanks go to the most active contributors in the following areas:

If you find an omission please fix it at TWiki:TWiki.TWikiHistory. For the full list of contributors see TWikiContributor.

Note: Sequence of contributors under "Spec, code, testing", "Templates and skins" and "Documentation" is based on number of SVN check-ins for core and default extensions from 2006-02 to 2006-12. Sequence of contributors under "TWiki.org wiki champions" and "Customer support" is based on TWiki.org web statistics from 2006-02 to 2006-12.

See more details on the TWiki 4.1 release at TWikiReleaseNotes04x01.

TWiki Release 4.0.0 (Dakar), 01 Feb 2006

Major New Features

  • Much simpler install and configuration
  • Integrated session support
  • Webserver-independent login/logout
  • Security sandbox blocking exploits for remote command execution on the server
  • Edit conflict resolution with automatic merge
  • Multilingual UI
  • E-mail confirmations for registration
  • WYSIWYG editor (beta)
  • Hierarchical sub-webs (beta)

Many, many people worked on TWiki-4.0.0. The credits in the table below only list the people who worked on individual enhancements. If you find an omission please fix it at TWiki:TWiki.TWikiHistory. There were many other contributors; for a full list, visit TWikiContributor.

Most of the redesign, refactoring and new documentation work in Dakar release was done by Crawford Currie. Michael Sparks provided ideas and proof of concept for several improvements. Other people who gave large amounts of their time and patience to less sexy aspects of the work, such as testing, infrastructure and documentation, are AntonAylward, KennethLavrsen, LynnwoodBrown, MichaelDaum, Peter Thoeny, SteffenPoulsen, Sven Dowideit, WillNorris.

Installation & configuration Contributor
Much simpler install and configuration Crawford Currie, LynnwoodBrown, ArthurClemens
mod_perl safe code for better performance Crawford Currie
Security
Security sandbox blocking exploits for remote command execution on the server Florian Weimer, Crawford Currie, Sven Dowideit
Reworked access permission model Crawford Currie
Internationalization & localization
User Interface Internationalisation AntonioTerceiro
Chinese translation CheDong
Danish translation SteffenPoulsen
Dutch translation ArthurClemens
French translation BenVoui
German translation AndreUlrich
Italian translation MassimoMancini
Polish translation ZbigniewKulesza
Portuguese translation AntonioTerceiro, CarlinhosCecconi
Spanish translation WillNorris, MiguelABayona
Swedish translation Erik Åman
New features for users
Edit conflict resolution with automatic merge Crawford Currie
Fine grained change notification on page level and parent/child relationship Crawford Currie
WYSIWYG editor Crawford Currie, ColasNahaboo, DamienMandrioli, RomainRaugi
Integrated session support GregAbbas, Crawford Currie
Webserver-independent login/logout Crawford Currie
Registration process with e-mail confirmation MartinCleaver
Tip of the Day box in TWiki Home PaulineCheung, Peter Thoeny, AntonAylward
ATOM feeds Peter Thoeny
"Force New Revision" check box for topic save WillNorris
New features for TWiki administrators and wiki application developers
Improved preferences handling ThomasWeigert, Crawford Currie
Named include sections RafaelAlvarez
Create topic names with consecutive numbers Sven Dowideit
Parameterized includes Crawford Currie
Dynamic form option definitions of TWikiForms with FormattedSearch MartinCleaver
SEARCH enhancements with new parameters excludeweb, newline, noempty, nofinalnewline, nonoise, recurse, zeroresults Crawford Currie, ArthurClemens, Peter Thoeny, ThomasWeigert
FormattedSearch enhancements with $changes, $count, $formfield(name, 30, ...), $summary(expandvar), $summary(noheaders), $summary(showvarnames) ColasNahaboo, Crawford Currie, Peter Thoeny, Sven Dowideit
New TWikiVariables ACTIVATEDPLUGINS, ALLVARIABLES, AUTHREALM, EMAILS, FAILEDPLUGINS, HTTP, HTTPS, ICONURL, ICONURLPATH, IF, LANGUAGES, LOCALSITEPREFS, LOGIN, LOGOUT, MAKETEXT, META, PLUGINDESCRIPTIONS, QUERYSTRING, STARTSECTION/ENDSECTION, SESSION_VARIABLE, SESSIONID, SESSIONVAR, SPACEOUT, USERLANGUAGE, WIKIHOMEURL ArthurClemens, AntonioTerceiro, Crawford Currie, GregAbbas, Peter Thoeny, Sven Dowideit, WillNorris and many more
TWiki form with hidden type and other form enhancements LynnwoodBrown, ThomasWeigert
Support topic-specific templates for TWiki applications ThomasWeigert
Direct save feature for one-click template-based topic creation LynnwoodBrown, Crawford Currie, ThomasWeigert
Automatic Attachments showing all files in the attachment directory MartinCleaver
Rename, move or delete webs PeterNixon
Hierarchical subwebs (beta) PeterNixon
New features for Plugin developers
REST (representational state transfer) interface for Plugins RafaelAlvarez, TWiki:Main.MartinCleaver, Sven Dowideit
New and improved Plugins APIs Crawford Currie, ThomasWeigert
Improvements in the TWiki engine room
Major OO redesign and refactoring of codebase Crawford Currie
Automatic build system Crawford Currie
Extensive test suite, unit tests and testcases Crawford Currie
TWiki:Codev.DevelopBranch , DEVELOP branch Bugs system Sven Dowideit
Documentation, logo artwork, skins:
Documentation Crawford Currie, LynnwoodBrown, Peter Thoeny, Sven Dowideit and others
Design of TWikiLogos with big "T" in a speech bubble ArthurClemens, Peter Thoeny
Improved templates and PatternSkin ArthurClemens

See more details at TWikiReleaseNotes04x00

01-Sep-2004 Release (Cairo)

Major New Features

  • Automatic upgrade script, and easier first-time installation
  • Attractive new skins, using a standard set of CSS classes, and a skin browser to help you choose
  • New easier-to-use save options
  • Many improvements to SEARCH
  • Improved support for internationalisation
  • Better topic management screens
  • More pre-installed Plugins: CommentPlugin, EditTablePlugin, RenderListPlugin, SlideShowPlugin, SmiliesPlugin, SpreadSheetPlugin, TablePlugin
  • Improved Plugins API and more Plugin callbacks
  • Better support for different authentication methods
  • Many user interface and usability improvements
  • And many, many more enhancements

Details of New Features and Enhancements of 01-Sep-2004 Release Developer, Sponsor
Install: Ship with an automatic upgrade script to facilitate TWiki upgrades. Details TWiki:Main.MartinGregory TWiki:Main.SvenDowideit
Install: New testenv function to change the locks in the TWiki database to the web server user id (automates installation step). Details TWiki:Main.MattWilkie TWiki:Main.SvenDowideit
Install: The shipped .htaccess.txt now needs to be edited before it is valid, to help reduce chances of error. Details TWiki:Main.CrawfordCurrie TWiki:Main.SvenDowideit
Install: Configurable password file handling for different types of encryption. Details TWiki:Main.PavelGoran TWiki:Main.SvenDowideit
Install: Remove office locations from registration. Details TWiki:Main.PeterThoeny
Install: Changes to support shorter URLs with Apache Rewrite rules. Details TWiki:Main.AntonioBellezza TWiki:Main.WalterMundt
Install: Remove the Know web from the distribution. Details TWiki:Main.PeterThoeny
Internationalization: Support use of UTF-8 URLs for I18N characters in TWiki page and attachment names. Details TWiki:Main.RichardDonkin
Authentication: Authenticate users when creating new topic in view restricted web. Details TWiki:Main.JonathanGraehl TWiki:Main.SvenDowideit
Preferences: TWiki Preferences need to be secured properly. Details TWiki:Main.PeterThoeny
Preferences: Use TWiki Forms to set user preferences. Details TWiki:Main.JohnTalintyre
Skins: New pre-installed skins PatternSkin and DragonSkin. Details TWiki:Main.ArthurClemens TWiki:Main.PeterThoeny
Skins: New skin browser to choose from installed skins. Details TWiki:Main.PeterThoeny
Skins: Documented set of CSS classes that are used in standard skins. Details TWiki:Main.ArthurClemens TWiki:Main.SvenDowideit
Skins: Added CSS class names to Diff output. Details TWiki:Main.SvenDowideit
Skins: Templates can now be read from user topics, as well as from files in the templates diretcory. Details TWiki:Main.CrawfordCurrie TWiki:Main.WalterMundt
Skins: Ensure that the default template gets overridden by a template passed in. Details TWiki:Main.MartinCleaver TWiki:Main.WalterMundt
Skin: Convey an important broadcast message to all users, e.g. scheduled server downtime. Details TWiki:Main.PeterThoeny
Skin: Balanced pastel colors for TWiki webs. Details TWiki:Main.ArthurClemens
Rendering: Use exclamation point prefix to escape TWiki markup rendering. Details TWiki:Main.ArthurClemens
Rendering: Ordered lists with uppercase & lowercase letters, uppercase & lowercase Roman numerals. Details TWiki:Main.DanBoitnott TWiki:Main.PeterThoeny
Rendering: Allow custom styles for the "?" of uncreated topics. Details TWiki:Main.SvenDowideit
Rendering: Render IRC and NNTP as a URL. Details TWiki:Main.PeterThoeny
Rendering: Make acronym linking more strict by requiring a trailing boundary, e.g. excluding TLAfoobar. Details TWiki:Main.CrawfordCurrie TWiki:Main.SvenDowideit
Rendering: TWiki Form with Label type. Details TWiki:Main.PeterThoeny
Rendering: Web names can now be WikiWords. Details TWiki:Main.PeterThoeny
Rendering: New syntax for definition list with dollar sign and colon. Details TWiki:Main.AdamTheo TWiki:Main.PeterThoeny
Rendering: Table with multi-span rows, functionality provided by Table Plugin. Details TWiki:Main.WalterMundt
Variables: New title parameter for TOC variable. Details TWiki:Main.PeterThoeny TWiki:Main.ArthurClemens
Variables: New REVINFO variable in templates supports flexible display of revision information. Details TWiki:Main.PeterThoeny TWiki:Main.SvenDowideit
Variables: Set times to be displayed as gmtime or servertime. Details TWiki:Main.SueBlake TWiki:Main.SvenDowideit
Variables: Properly encode parameters for form fields with ENCODE variable. Details TWiki:Main.PeterThoeny
Variables: Expand USERNAME and WIKINAME in Template Topics. Details TWiki:Main.PeterThoeny
Variables: Expand same variables in new user template as in template topics. Details TWiki:Main.PeterThoeny
Variables: Optionally warn when included topic does not exist; with the option to create the included topic. Details TWiki:Main.PeterThoeny
Variables: In topic text show file-types of attached files as icons. Details TWiki:Main.PeterThoeny
Variables: New variable FORMFIELD returns the value of a field in the form attached to a topic.. Details TWiki:Main.DavidSachitano TWiki:Main.SvenDowideit
Variables: Meta data rendering for form fields with META{"formfield"}. Details TWiki:Main.PeterThoeny
Variables: New PLUGINVERSION variable. Details TWiki:Main.PeterThoeny
Variables: URLPARAM now has a default="..." argument, for when no value has been given. Details TWiki:Main.PeterThoeny
Variables: URLPARAM variable with newline parameter. Details TWiki:Main.PeterThoeny
Variables: URLPARAM variable with new multiple=on parameter. Details TWiki:Main.PaulineCheung TWiki:Main.PeterThoeny
Search: New switch for search to perform an AND NOT search. Details TWiki:Main.PeterThoeny
Search: Keyword search to search with implicit AND. Details TWiki:Main.PeterThoeny
Search: Multiple searches in same topic with new multiple="on" paramter. Details TWiki:Main.PeterThoeny
Search: Remove limitation on number of topics to search in a web. Details TWiki:Main.PeterThoeny
Search: Exclude topics from search with an excludetopic parameter. Details TWiki:Main.PeterThoeny
Search: Expand Variables on Formatted Search with expandvariables Flag. Details TWiki:Main.PeterThoeny
Search: Formatted Search with Web Form variable to retrieve the name of the form attached to a topic. Details TWiki:Main.FrankSmith TWiki:Main.PeterThoeny
Search: Formatted Search with Conditional Output. Details TWiki:Main.PeterThoeny
Search: Formatted Search with $parent token to get the parent topic. Details TWiki:Main.PeterThoeny
Search: New separator parameter to SEARCH supports better SEARCH embedding. Details TWiki:Main.PeterThoeny
Search: Improved search performance when sorting result by topic name. Details TWiki:Main.PeterThoeny
Search: New scope=all search parameter to search in topic name and topic text at the same time. Details TWiki:Main.PeterThoeny
Search: New topic parameter for AND search on topic text and topic name. Details TWiki:Main.PeterThoeny
Search modules uses Perl-style keyword parameters (code cleanup). Details TWiki:Main.PeterThoeny
Search: New $wikiname variable in format parameter of formatted search. Details TWiki:Main.ArthurClemens
Search: Sort search by topic creation date. Details TWiki:Main.PeterThoeny
Search: Topic creation date and user in Formatted Search. Details TWiki:Main.CoreyFruitman TWiki:Main.SvenDowideit
Search: Increase levels of nested search from 2 to 16. Details TWiki:Main.PeterThoeny
Plugins: New pre-installed Plugins CommentPlugin, EditTablePlugin, RenderListPlugin, SlideShowPlugin, SmiliesPlugin, SpreadSheetPlugin, TablePlugin. Details TWiki:Main.PeterThoeny
Plugins: New callback afterSaveHandler, called after a topic is saved. Details TWiki:Main.WalterMundt
Plugins: New callbacks beforeAttachmentSaveHandler and afterAttachmentSaveHandler, used to intervene on attachment save event. Details TWiki:Main.MartinCleaver TWiki:Main.WalterMundt
Plugins: New callbacks beforeCommonTagsHandler and afterCommonTagsHandler. Details TWiki:Main.PeterThoeny
Plugins: New callback renderFormFieldForEditHandler to render form field for edit. Details TWiki:Main.JohnTalintyre
Plugins: New callback renderWikiWordHandler to custom render links. Details TWiki:Main.MartinCleaver TWiki:Main.WalterMundt
Plugins: New function TWiki::Func::formatTime to format time into a string. Details TWiki:Main.SvenDowideit
Plugins: New function TWiki::Func::getRegularExpression to get predefined regular expressions. Details TWiki:Main.RichardDonkin
Plugins: New functions TWiki::Func::getPluginPreferences* to get Plugin preferences. Details TWiki:Main.WalterMundt
Plugins: New function TWiki::Func::extractParameters to extract all parameters from a variable string. Details TWiki:Main.PeterThoeny
Plugins: New function TWiki::Func::checkDependencies to check for module dependency. Details TWiki:Main.CrawfordCurrie TWiki:Main.SvenDowideit
Plugins: A recommendation for where a Plugin can store its data. Details TWiki:Main.PeterThoeny
UI: Show tool-tip topic info on WikiWord links. Details TWiki:Main.PeterThoeny
UI: Save topic and continue edit feature. Details TWiki:Main.ColasNahaboo
UI: Change topic with direct save (without edit/preview/save cycle) and checkpoint save. Details TWiki:Main.MattWilkie TWiki:Main.SvenDowideit
UI: In attachment table, change 'action' to 'manage'. Details TWiki:Main.PeterThoeny TWiki:Main.ArthurClemens
UI: Smaller usability enhancements on the file attachment table. Details TWiki:Main.PeterThoeny TWiki:Main.ArthurClemens
UI: Removes anchor links from header content and places them before the text to fix 'header becomes link'. Details TWiki:Main.ArthurClemens
UI: Improved functionality of the More screen. Details TWiki:Main.PeterThoeny TWiki:Main.ArthurClemens
UI: Quick reference chart of most used markup is now listed on the edit screen. Details TWiki:Main.ArthurClemens
UI: Flag for edit script to avoid overwrite of existing topic text and form data. Details TWiki:Main.NielsKoldso TWiki:Main.PeterThoeny
UI: Disable Escape key in IE textarea to prevent it cancelling work. Details TWiki:Main.CrawfordCurrie TWiki:Main.PeterThoeny
UI: Improved warning message on unsaved topic. Details TWiki:Main.MartinGregory TWiki:Main.SvenDowideit
UI: Reverse order of words in page title for better multi-window/tab navigation. Details TWiki:Main.ArthurClemens
UI: Provides a framework to create and modify a topic without going through edit->preview->save sequence. Details TWiki:Main.AndreUlrich TWiki:Main.SvenDowideit
UI: Set the topic parent to none in More screen, e.g. remove the current topic parent. Details TWiki:Main.PeterThoeny
UI: Use templates to define how file attachments are displayed. Was previously hard-coded. Details TWiki:Main.CrawfordCurrie TWiki:Main.SvenDowideit
UI: Topic diff shows unified diff with unchanged context. Details TWiki:Main.SvenDowideit
UI: Diff feature shows TWiki form changes in nice tables. Details TWiki:Main.SvenDowideit
Code refactoring: The log entry for a save now has a dontNotify flag in the extra field if the user checked the minor changes flag. Details TWiki:Main.PeterThoeny
Code refactoring: Server-side include of attachments accelerates INCLUDE. Details TWiki:Main.CrawfordCurrie TWiki:Main.PeterThoeny
Code refactoring: Move functionality out of bin scripts and into included modules. Details TWiki:Main.CrawfordCurrie TWiki:Main.SvenDowideit
Code refactoring: Move bin script functionality into TWiki::UI modules. Details TWiki:Main.CrawfordCurrie TWiki:Main.PeterThoeny
Code refactoring: Optimize preferences handling for better performance. Details TWiki:Main.PavelGoran TWiki:Main.WalterMundt
Code refactoring: Refactor variable expansion for edit and register. Details TWiki:Main.CrawfordCurrie TWiki:Main.PeterThoeny
Code refactoring: Move savemulti script into TWiki::UI::Save. Details TWiki:Main.MattWilkie TWiki:Main.SvenDowideit
Code refactoring: Topic search is done natively in Perl, it does not depend anymore on system calls with pipes. Details TWiki:Main.PeterThoeny
Code refactoring: Fix logical error in upload script which prevented MIME filename from being used. Details TWiki:Main.WalterMundt

Bug Fixes of 01-Sep-2004 Release Developer, Sponsor
Fix: Consistently create headings with empty anchor tags. Details TWiki:Main.PeterThoeny
Fix: TOC does not work for headings containing & without spaces surrounding it. Details TWiki:Main.PeterThoeny
Fix: Backslash line break breaks TWiki form definitions. Details TWiki:Main.CrawfordCurrie TWiki:Main.PeterThoeny
Fix: Rename fixes unrelated topic references. Details TWiki:Main.RichardDonkin
Fix: Bug with infinite recursion in search. Details TWiki:Main.PeterThoeny
Fix: Can't send mail with full 'From' address. Details TWiki:Main.PeterThoeny
Fix: All scripts change to $bin before execute (for mod_perl2). Details TWiki:Main.PeterThoeny
Fix: Several RSS readers do not show all entries seen in the WebChanges list; repeated updates to the same topics get lost. Details TWiki:Main.ArthurClemens
Fix: TWiki::Access::checkAccessPermission function improperly handles Main and TWiki webs. Details TWiki:Main.SvenDowideit
Fix: Topic save returns error CI Date precedes date in revision. Details TWiki:Main.PeterThoeny
Fix: Double quotes got replaced by " in TWiki forms. Details TWiki:Main.MichaelSparks TWiki:Main.PeterThoeny
Fix: Duplicated Wiki name in .htpasswd entry for sha1 encoding. Details TWiki:Main.PeterThoeny
Fix: When viewing a previous version of a topic, the view script substitutes only one occurrence of the variable EDITTOPIC. Details TWiki:Main.PeterThoeny
Fix: Form default values are not working for text fields. Details TWiki:Main.ThomasWeigert TWiki:Main.SvenDowideit
Fix: Formatted searches using a $pattern which unbalanced parenthesis crash TWiki. Details TWiki:Main.PeterThoeny
Fix: Formatted Search uses title but should use name for formfield parameter. Details TWiki:Main.PeterThoeny
Fix: GMTIME variable returns unwanted GMT text. Details TWiki:Main.SvenDowideit
Fix: Include from other Web links ACRONYMS. Details TWiki:Main.PeterThoeny
Fix: Including an HTML file is very slow. Details TWiki:Main.JohnTalintyre
Fix: includeUrl() mess up absolute URLs. Details TWiki:Main.SvenDowideit
Fix: Filter out fixed font rendering in TOC to avoid unrendered = equal signs in TOC. Details TWiki:Main.PeterThoeny
Fix: The initializeUserHandler is broken for session Plugins. Details TWiki:Main.JohnTalintyre
Fix: SEARCH fails with very large webs. Details TWiki:Main.PeterThoeny
Fix: Security alert: User could gain view access rights of another user. Details TWiki:Main.KimCovil TWiki:Main.PeterThoeny
Fix: 'print to closed file handle' error of log files are not writable. Details TWiki:Main.MartinGregory TWiki:Main.SvenDowideit
Fix: Meta data handler can't process CR-LF line endings. Details TWiki:Main.PeterThoeny
Fix: METAFIELD meta data is not shown in view raw=on mode. Details TWiki:Main.PeterThoeny
Fix: Minor XHTML non-compliance in templates and code. Details TWiki:Main.PeterThoeny
Fix: Getting pages from virtual hosts fails. Details TWiki:Main.JohnTalintyre
Fix: Create new web fails if RCS files do not exist. Details TWiki:Main.ClausBrunzema TWiki:Main.SvenDowideit
Fix: Metacharacters can be passed through to the shell in File Attach. Details TWiki:Main.PeterThoeny
Fix: Ability to delete non-WikiWord topics without confirmation. Details TWiki:Main.PeterThoeny
Fix: + symbol in password reset fails. Details TWiki:Main.PeterThoeny
Fix: Pathinfo cleanup for hosted sites. Details TWiki:Main.MikeSalisbury TWiki:Main.SvenDowideit
Fix: Software error in SEARCH if regular expression pattern has unmached parenthesis. Details TWiki:Main.PeterThoeny
Fix: Pipe chars in the comment field of the attachment table are not escaped. Details TWiki:Main.PeterThoeny
Fix: Link escaping in preview fails for not quoted hrefs. Details TWiki:Main.TedPavlic TWiki:Main.PeterThoeny
Fix: Preview expands variables twice. Details TWiki:Main.PeterThoeny
Fix: Using a proxy with TWiki fails; no proxy-HTTP request, minimal request not HTTP 1.0, requests marked 1.1 are at best 1.0. Details TWiki:Main.MichaelSparks TWiki:Main.JohnTalintyre
Fix: Runaway view processes with TWiki::Sore::RcsLite. Details TWiki:Main.SvenDowideit
Fix: Regex Error in WebTopicList with topics that have meta characters in the name. Details TWiki:Main.PeterThoeny
Fix: Rename script misses some ref-by topics. Details TWiki:Main.JohnTalintyre
Fix: Links to self within the page being renamed are not changed. Details TWiki:Main.SvenDowideit
Fix: Rename topic does 'Main.Main.UserName' for attachments. Details TWiki:Main.PeterThoeny
Fix: Revision date is set to Jan 1970 when using RCS Lite. Details TWiki:Main.SvenDowideit
Fix: The new dynamically-created SiteMap is very nice, but somewhat slow. Details TWiki:Main.PeterThoeny
Fix: The makeAnchorName function did not produce the same results if called iteratively, resulting in problems trying to link to headers.. Details TWiki:Main.WalterMundt
Fix: Statistics page does not provide links to non-wikiword topics. Details TWiki:Main.PeterThoeny
Fix: Make TOC link URI references relative. Details TWiki:Main.MartinGregory TWiki:Main.PeterThoeny
Fix: TWiki hangs when used on Apache 2.0. Details TWiki:Main.SvenDowideit
Fix: TOC incorrectly strips out links in headers. Details TWiki:Main.PeterThoeny
Fix: The HTML tags that are generated by TOC do not close properly. Details TWiki:Main.PeterThoeny
Fix: TOC on INCLUDEd topic ignores STOPINCLUDE. Details TWiki:Main.WillNorris TWiki:Main.PeterThoeny
Fix: Quotes in tooltip message can break a TWiki form. Details TWiki:Main.PeterThoeny
Fix: Better error message if the file attachment directory is not writable. Details TWiki:Main.CrawfordCurrie TWiki:Main.SvenDowideit
Fix: Image size of PNG files. Details TWiki:Main.ArthurClemens
Fix: The testenv script distinguishes between real user ID and effective user ID. Details TWiki:Main.RichardDonkin
Fix: Variables in square bracket links dont work in form fields. Details TWiki:Main.SvenDowideit
Fix: Variable with Parameters in Form Fields Disappear. Details TWiki:Main.PeterThoeny
Fix: Verbatim tag should escape HTML entities. Details TWiki:Main.PeterThoeny
Fix: Field names of TWiki Forms can be WikiWords, this is used to link to a help topic. Details TWiki:Main.PeterThoeny
Fix: Clean up the WebRssBase INCLUDES to use VARIABLES set in TWikiPreferences. Details TWiki:Main.SvenDowideit
Fix: Resolving variables in included topics. Details TWiki:Main.OliverKrueger TWiki:Main.SvenDowideit

01-Feb-2003 Release (Beijing)

01-Dec-2001 Release (Athens)

01-Sep-2001 Release

01-Dec-2000 Release

01-May-2000 Release

  • 21 Apr 2000 - TWiki:Main.PeterThoeny
    • New TWikiVariables %HTTP_HOST% , %REMOTE_ADDR% , %REMOTE_PORT% and %REMOTE_USER% .
  • 21 Apr 2000 - TWiki:Main.JohnAltstadt, TWiki:Main.PeterThoeny
    • TWikiRegistration is done separately for Intranet use (depends on remote_user) or Internet use (depends on .htpasswd file).
  • 20 Mar 2000 - TWiki:Main.PeterThoeny
    • Uploading a file (topic file attachment) will optionally create a link to the uploaded file at the end of the topic. The preference variable %ATTACHLINKBOX% controls the default state of the link check box in the attach file page.
  • 11 Mar 2000 - TWiki:Main.PeterThoeny
    • Better security with taint checking ( Perl -T option )
  • 25 Feb 2000 - TWiki:Main.PeterThoeny
    • New preference variables %EDITBOXWIDTH% and %EDITBOXHEIGHT% to specify the edit box size.
  • 25 Feb 2000 - TWiki:Main.PeterThoeny
    • Edit preferences topics to set TWiki variables. There are three level of preferences Site-level (TWikiPreferences), web-level (WebPreferences in each web) and user-level preferences (for each of the TWikiUsers). With this, discontinue use of server side include of wikiwebs.inc , wikiwebtable.inc , weblist.inc , webcopyright.inc and webcolors.inc files.
  • 11 Feb 2000 - TWiki:Main.PeterThoeny
    • New variable %SCRIPTSUFFIX% / $scriptSuffix containing an optional file extension of the TWiki Perl script. Templates have been changed to use this variable. This allows you to rename the Perl script files to have a file extension like for example ".cgi".
  • 11 Feb 2000 - TWiki:Main.PeterThoeny
    • New variable %SCRIPTURLPATH% / $scriptUrlPath containing the script URL without the domain name. Templates have been changed to use this variable instead of %SCRIPTURL% . This is for performance reasons.
  • 07 Feb 2000 - TWiki:Main.PeterThoeny
    • Changed the syntax for server side include variable from %INCLUDE:"filename.ext"% to %INCLUDE{"filename.ext"}% . (Previous syntax still supported. Change was done because of inline search syntax)
  • 07 Feb 2000 - TWiki:Main.PeterThoeny
    • Inline search. New variable %SEARCH{"str" ...}% to show a search result embedded in a topic text. TWikiVariables has more on the syntax. Inline search combined with the category table feature can be used for example to create a simple bug tracking system.
  • 04 Feb 2000 - TWiki:Main.PeterThoeny
    • Access statistics. Each web has a WebStatistics topic that shows monthy statistics with number of topic views and changes, most popular topics, and top contributors. (It needs to be enabled, TWikiDocumentation has more.)
  • 29 Jan 2000 - TWiki:Main.PeterThoeny
    • Fixed bug where TWiki would not initialize correctly under certain circumstances, i.e. when running it under mod_perl. Sub initialize in wiki.pm did not handle $thePathInfo correctly.
  • 24 Jan 2000 - TWiki:Main.PeterThoeny
  • 10 Jan 2000 - TWiki:Main.PeterThoeny
    • No more escaping for '%' percent characters. (Number of consecutive '%' entered and displayed is identical.)
  • 03 Oct 1999 - TWiki:Main.PeterThoeny
    • Limit the number of revisions shown at the bottom of the topic. Example
      Topic TWikiHistory . { ..... Diffs r1.10 > r1.9 > r1.8 > r1.7 >... }
      Additional revisions can be selected by pressing the >... link.

01-Sep-1999 Release

  • 31 Aug 1999 - TWiki:Main.PeterThoeny
    • Fixed Y2K bug. (Date in year 2000 had wrong format.)
  • 08 Aug 1999 - TWiki:Main.PeterThoeny
    • New text formatting rule for creating tables. Text gets rendered as a table if enclosed in " " vertical bars. Example line as it is written and how it shows up
  • 03 Aug 1999 - TWiki:Main.PeterThoeny
    • Online registration of new user using web form in TWikiRegistration. Authentication of users.
  • 22 Jul 1999 - TWiki:Main.PeterThoeny
    • Flags $doLogTopic* in wikicfg.pm to selectively log topic view, edit, save, rdiff, attach, search and changes to monthly log file.
  • 21 Jul 1999 - TWiki:Main.PeterThoeny
    • Flag $doRemovePortNumber in wikicfg.pm to optionally remove the port number from the TWiki URL. Example www.some.domain:1234/twiki gets www.some.domain/twiki .
  • 15 Jul 1999 - TWiki:Main.PeterThoeny
    • Search path for include files in %INCLUDE:"file.inc"% variable. Search first in the current web, then in parent data directory. Useful to overload default include text in the data directory by web-specific text, like for example webcopyright.inc text.
  • 07 Jul 1999 - TWiki:Main.ChristopheVermeulen
    • Link a plural topic to a singular topic in case the plural topic does not exist. Example TestVersion / TestVersions , TestPolicy / TestPolicies , TestAddress / TestAddresses , TestBox / TestBoxes .

01-Jul-1999 Release

  • 23 Jun 1999 - TWiki:Main.PeterThoeny
    • New TextFormattingRules to write bold italic text by enclosing words with double underline characters.
  • 23 Jun 1999 - TWiki:Main.PeterThoeny
    • Separate wiki.pm into configuration (wikicfg.pm) and TWiki core (wiki.pm) . This is to ease the upgrade of TWiki installations, it also allows customized extensions to TWiki without affecting the TWiki core.
  • 21 May 1999 - TWiki:Main.DavidWarman
    • Externalize copyright text at the bottom of every page into a web-specific webcopyright.inc file. This is to easily customize the copyright text.
  • 20 May 1999 - TWiki:Main.PeterThoeny
    • Added meta tag so that robots index only /view/ of topics, not /edit/, /attach/ e.t.c. Tag <META NAME="ROBOTS" CONTENT="NOINDEX">
  • 20 May 1999 - TWiki:Main.PeterThoeny
    • New variables %WIKIHOMEURL% (link when pressing the icon on the upper left corner) and %WIKITOOLNAME% (the name of the wiki tool TWiki ).
  • 15 Apr 1999 - TWiki:Main.PeterThoeny
    • Topic locking Warn user if a topic has been edited by an other person within one hour. This is to prevent contention, e.g. simultaneous topic updates.
  • 26 Mar 1999 - TWiki:Main.PeterThoeny
    • File attachments Upload and download any file as a topic attachment by using the browser. FileAttachment has more.
  • 26 Mar 1999 - TWiki:Main.PeterThoeny
    • New variables %PUBURL% (Public directory URL) and %ATTACHURL% (URL of topic file attachment).
  • 09 Feb 1999 - TWiki:Main.PeterThoeny
    • New text formatting rule for creating fixed font text . Words get showns in fixed font by enclosing them in "=" equal signs. Example Writing =fixed font= will show up as fixed font .
  • 09 Feb 1999 - TWiki:Main.PeterThoeny
    • No new topic revision is created if the same person saves a topic again within one hour.
  • 03 Feb 1999 - TWiki:Main.PeterThoeny
    • Possible to view complete revision history of a topic on one page. Access at the linked date in the Changes page, or the Diffs link at the bottom of each topic, e.g.
      Topic TWikiHistory . { Edit Ref-By Diffs r1.3 > r1.2 > r1.1 }
      Revision r1.3 1998/11/10 01:34 by PeterThoeny
  • 04 Jan 1999 - TWiki:Main.PeterThoeny
    • Fixed bug when viewing differences between topic revisions that include HTML table tags like <table>, <tr>, <td>.

1998 Releases

  • 08 Dec 1998 - TWiki:Main.PeterThoeny
    • Signature is shown below the text area when editing a topic. Use this to easily copy & paste your signature into the text.
  • 07 Dec 1998 - TWiki:Main.PeterThoeny
    • Possible to add a category table to a TWiki topic. This permits storing and searching for more structured information. Editing a topic shows a HTML form with the usual text area and a table with selectors, checkboxes, radio buttons and text fields. TWikiDocumentation has more on setup. The TWiki.Know web uses this category table to set classification, platform and OS version.
  • 18 Nov 1998 - TWiki:Main.PeterThoeny
    • Internal log of topic save actions to the file data/logYYYYMM.txt, where YYYYMM the year and month in numeric format is. Intended for auditing only, not accessible from the web.
  • 10 Nov 1998 - TWiki:Main.PeterThoeny
    • The e-mail notification and the Changes topic have now a topic date that is linked. Clicking on the link will show the difference between the two most recent topic revisions.
  • 10 Nov 1998 - TWiki:Main.PeterThoeny
    • View differences between topic revisions. Each topic has a list of revisions (e.g. r1.3) and differences thereof (e.g. >) at the bottom
      Topic TWikiHistory . { Edit Ref-By r1.3 > r1.2 > r1.1 }
      Revision r1.3 1998/11/10 01:34 by TWiki:Main.PeterThoeny
  • 26 Oct 1998 - TWiki:Main.PeterThoeny
    • Added preview of topic changes before saving the topic. This was necessary to prevent unneeded revisions.
  • 26 Oct 1998 - TWiki:Main.PeterThoeny
    • Added revision control using RCS. Each topic has now a list of revisions at the bottom and a revision info, e.g.
      Topic TWikiHistory . { Edit Ref-By r1.3 r1.2 r1.1 }
      Revision r1.3 1998/10/26 01:34:00 by TWiki:Main.PeterThoeny
  • 14 Oct 1998 - TWiki:Main.PeterThoeny
    • Refered-By Find out which topics have a link to the current topic. Each topic has a Ref-By link for that. Note Only references from the current web are shown, not references from other webs.
  • 13 Oct 1998 - TWiki:Main.PeterThoeny
  • 24 Sep 1998 - TWiki:Main.PeterThoeny
    • Corrected templates for automatic e-mail notification so that MS Outlook can display attachment as an HTML file.
  • 13 Aug 1998 - TWiki:Main.PeterThoeny
  • 07 Aug 1998 - TWiki:Main.PeterThoeny
    • Automatic e-mail notification when something has changed in a TWiki web. Each web has a topic WebNotify where one can subscribe and unsubscribe.
  • 06 Aug 1998 - TWiki:Main.PeterThoeny
    • Added server side include of files. Syntax is %INCLUDE:"filename.ext"%
  • 05 Aug 1998 - TWiki:Main.PeterThoeny
    • Signature and date is inserted automatically when creating a new topic.
  • 04 Aug 1998 - TWiki:Main.PeterThoeny
    • Separate templates for text of non existing topic and default text of new topic. (template file templates/Web/notedited.tmpl)
  • 04 Aug 1998 - TWiki:Main.PeterThoeny
    • Warn user if new topic name is not a valid Wiki name. (template file templates/Web/notwiki.tmpl)
  • 31 Jul 1998 - TWiki:Main.PeterThoeny
    • Support for quoted text with a '>' at the beginning of the line.
  • 28 Jul 1998 - TWiki:Main.PeterThoeny
    • Added TWiki variables, enclosed in % signs %TOPIC% (Topic name), %WEB% (web name), %SCRIPTURL% (script URL), %DATE% (current date), %WIKIWEBMASTER% (Wiki webmaster address), %WIKIVERSION% (Wiki version), %USERNAME% (user name), %WIKIUSERNAME% (Wiki user name).
  • 28 Jul 1998 - TWiki:Main.PeterThoeny
    • Topic WebChanges shows Wiki username instead of Intranet username, e.g. PeterThoeny instead of thoeny in case the Wiki username exists. Implementation Automatic lookup of Wiki username in topic TWikiUsers.
  • 28 Jul 1998 - TWiki:Main.PeterThoeny
    • Topic index. (Technically speaking a simple '.*' search on topic names.)
  • 28 Jul 1998 - TWiki:Main.PeterThoeny
    • Topic WebSearch allows full text search and and topic search with/without regular expressions.
  • 27 Jul 1998 - TWiki:Main.PeterThoeny
    • Added automatic links to topics in other TWiki webs by specifying <web name>.<topic name>, e.g. Know.WebSeach .
  • 23 Jul 1998 - TWiki:Main.PeterThoeny
    • Installed initial version, based on the JOS Wiki. See WikiWikiClones for details.

Dev Flow

The typical TWiki development flow...

Related Topics: DeveloperDocumentationCategory


Appendix B: Encode URLs With UTF8

Use internationalised characters within WikiWords and attachment names

This topic addresses implemented UTF-8 support for URLs only. The overall plan for UTF-8 support for TWiki is described in TWiki:Codev.ProposedUTF8SupportForI18N.

Current Status

To simplify use of internationalised characters within WikiWords and attachment names, TWiki now supports UTF-8 URLs, converting on-the-fly to virtually any character set, including ISO-8859-*, KOI8-R, EUC-JP, and so on.

Support for UTF-8 URL encoding avoids having to configure the browser to turn off this encoding in URLs (the default in Internet Explorer, Opera Browser and some Mozilla Browser URLs) and enables support of browsers where only this mode is supported (e.g. Opera Browser for Symbian smartphones). A non-UTF-8 site character set (e.g. ISO-8859-*) is still used within TWiki, and in fact pages are stored and viewed entirely in the site character set - the browser dynamically converts URLs from the site character set into UTF-8, and TWiki converts them back again.

System requirements are updated as follows:

  • ASCII or ISO-8859-1-only sites do not require any additional CPAN modules to be installed.
  • Perl 5.8 sites using any character set do not require additional modules, since CPAN:Encode is installed as part of Perl.
  • This feature still works on Perl 5.005_03 as per TWikiSystemRequirements, or Perl 5.6, as long as CPAN:Unicode::MapUTF8 is installed.

The following 'non-ASCII-safe' character encodings are now excluded from use as the site character set, since they interfere with TWiki markup: ISO-2022-*, HZ-*, Shift-JIS, MS-Kanji, GB2312, GBK, GB18030, Johab and UHC. However, many multi-byte character sets work fine, e.g. EUC-JP, EUC-KR, EUC-TW, and EUC-CN. In addition, UTF-8 can already be used, with some limitations, for East Asian languages where EUC character encodings are not acceptable - see TWiki:Codev.ProposedUTF8SupportForI18N.

It's now possible to override the site character set defined in the {SiteLocale} setting in configure - this enables you to have a slightly different spelling of the character set in the server locale (e.g. 'eucjp') and the HTTP header sent to the browser (e.g. 'euc-jp').

This feature should also support use of Mozilla Browser with TWiki:Codev.TWikiOnMainframe (as long as mainframe web server can convert or pass through UTF-8 URLs) - however, this specific combination is not tested. Other browser-server combinations should not have any problems.

Please note that use of UTF-8 as the site character set is not yet supported - see Phase 2 of TWiki:Codev.ProposedUTF8SupportForI18N for plans and work to date in this area.

This feature is complete in TWiki releases newer than February 2004.

Note for skin developers: is no longer required (TWiki:Plugins.InternationalisingYourSkin).

Details of Implementation

URLs are not allowed to contain non-ASCII (8th bit set) characters: http://www.w3.org/TR/html4/appendix/notes.html#non-ascii-chars

The overall plan for UTF-8 support for TWiki is described in two phases in TWiki:/Codev.ProposedUTF8SupportForI18N - this page addresses the first phase, in which UTF-8 is supported for URLs only.

UTF-8 URL translation to virtually any character set is supported as of TWiki Release 01 Sep 2004, but full UTF-8 support (e.g. pages in UTF-8) is not supported yet - this will be phase 2.

The code automatically detects whether a URL is UTF-8 or not, taking care to avoid over-long and illegal UTF-8 encodings that could introduce TWiki:Codev.MajorSecurityProblemWithIncludeFileProcessing (tested against a comprehensive UTF-8 test file, which IE 5.5 fails quite dangerously, and Opera Browser passes). Any non-ASCII URLs that are not valid UTF-8 are then assumed to be directly URL-encoded as a single-byte or multi-byte character set (as now), e.g. EUC-JP.

The main point is that you can use TWiki with international characters in WikiWords without changing your browser setup from the default, and you can also still use TWiki using non-UTF-8 URLs. This works on any Perl version from 5.005_03 onwards and corresponds to Phase 1 of TWiki:Codev.ProposedUTF8SupportForI18N. You can have different users using different URL formats transparently on the same server.

UTF-8 URLs are automatically converted to the current {Site}{Charset}, using modules such as CPAN:Encode if needed.

TWiki generates the whole page in the site charset, e.g. ISO-8859-1 or EUC-JP, but the browser dynamically UTF-8 encodes the attachment's URL when it's used. Since Apache serves attachment downloads without TWiki being involved, TWiki's code can't do its UTF-8 decoding trick, so TWiki URL-encodes such URLs in ISO-8859-1 or whatever when generating the page, to bypass this URL encoding, ensuring that the URLs and filenames seen by Apache remain in the site charset.

TWiki:Codev.TWikiOnMainframe uses EBCDIC web servers that typically translate their output to ASCII, UTF-8 or ISO-8859-1 (and URLs in the other direction) since there are so few EBCDIC web browsers. Such web servers don't work with even ISO-8859-1 URLs if they are URL encoded, since the automated translation is bypassed for URL-encoded characters. For TWiki on Mainframe, TWiki assumes that the web server will automatically translate UTF-8 URLs into EBCDIC URLs, as long as URL encoding is turned off in TWiki pages.

Testing and Limitation

It should work with TWiki:Codev.TWikiOnMainframe. Tested with IE 5.5, Opera 7.11 and Mozilla (Firebird 0.7).

Opera Browser on the P800 smartphone is working for page viewing but leads to corrupt page names when editing pages.

For up to date information see TWiki:Codev.EncodeURLsWithUTF8

 

Appendix C: TWiki CSS

Listing of CSS class names emitted from TWiki core code and standard plugins, for the Dakar release.

Who should read this document?

Most html elements generated by TWiki core code now have Cascading Style Sheet (CSS) tags. Skin builders and others who want to change the appearance of the default TWiki installation or any of the skins can use this document to see what styles can be created for these html elements.

Naming conventions

  1. All TWiki class names have the prefix twiki. So: twikiAlert, twikiToc, etcetera. Remember that CSS class names are case sensitive - TWiki CSS uses lowercase tw.
  2. If you define your own CSS classes, it is preferable that you do not use the twiki prefix to prevent undesired overriding effects.

A wide range of standard styles are used in the TWiki core code and topics, and more are used in plugins. The following is an exhaustive list of all styles defined by the Pattern skin. For the most part, the names are the only documentation of the purpose of the style. For more information on how these styles are used, read the code (sorry!)

TWiki styles in core code

.twikiAlert Client.pm, Form.pm, Statistics.pm
.twikiFirstCol Render.pm
.twikiForm Render.pm
.twikiNew Changes.pm, Search.pm
.twikiHelp Changes.pm
.twikiTopRow Manage.pm
.twikiSummary Manage.pm
.twikiGrayText Manage.pm
.twikiCheckBox Manage.pm
.twikiLink Render.pm
.twikiNewLink Render.pm
.twikiAnchorLink Render.pm
.twikiCurrentWebHomeLink Render.pm
.twikiCurrentTopicLink Render.pm
.twikiEmulatedLink Preview.pm
.twikiWebIndent TWiki.pm

.twikiEditFormDateField Form.pm
.twikiEditFormTextField Form.pm
.twikiEditFormLabelField Form.pm
.twikiEditFormTextAreaField Form.pm
.twikiEditFormCheckboxButton Form.pm
.twikiEditFormCheckboxField Form.pm
.twikiRadioButton Form.pm
.twikiEditFormRadioField Form.pm
.twikiEditFormError Form.pm

.twikiDiffTable RDiff.pm
.twikiDiffDeletedHeader RDiff.pm
.twikiDiffDeletedMarker RDiff.pm
.twikiDiffDeletedText RDiff.pm
.twikiDiffAddedHeader RDiff.pm
.twikiDiffAddedMarker RDiff.pm
.twikiDiffAddedText RDiff.pm
.twikiDiffChangedHeader RDiff.pm
.twikiDiffChangedText RDiff.pm
.twikiDiffUnchangedText RDiff.pm
.twikiDiffUnchangedTextContents RDiff.pm
.twikiDiffLineNumberHeader RDiff.pm

.twikiToc TWiki.pm
.twikiTocTitle TWiki.pm

TWiki Styles in Plugins

.twikiTable