**_Notes:_**
-- This topic is updated by the statistics script. (You can also [force](http://www.dementia.org/twiki/statistics/%WEB%) an update)
-- %SYSTEMWEB%.TWikiDocumentation tells you how to enable the automatic updates of the statistics.
+- Do not edit this topic, it is updated automatically. (You can also [force](http://www.dementia.org/twiki/statistics/%WEB%) an update)
+- [[TWikiSiteTools|SYSTEMWEB/TWikiSiteTools#WebStatistics_site_statistics]] tells you how to enable the automatic updates of the statistics.
- Suggestion: You could archive this topic once a year and delete the previous year's statistics from the table.
> </tr>
> <tr>
> <td align="right"> Version: </td>
-> <td> 15675 (22 Jan 2008) </td>
+> <td> 15675 (04 Aug 2008) </td>
> </tr>
> <tr>
> <td align="right"> Dependencies: </td>
# <a name="Bulk Registration"></a> Bulk Registration
-Administrators can use this topic to register (i.e. create logins and [[UserTopics]]) for a group of people quickly. Create a table in the REGISTERTOPIC named below, setting each row to represent each user and each column to correspond to the metadata. Then press the button on this page to perform registration for those users. Unlike normal registration the administrator is assumed to have correct e-mail addresses for the users, so no verification is required. Note that the new users are not notified that they have an account. This is so you can prepare and verify the accounts before announcing them. To announce them use the [[BulkResetPassword]] feature: this will assign a new random password and notify users.
+Administrators can use this topic to register (i.e. create logins and user topics) for a group of people in one batch.
-## <a name="Bulk Registration usage"></a> Bulk Registration usage
-
-Any fields you define in this table will end up in the User's topic. If a form (such as [[UserForm]]) is attached to [[NewUserTemplate]] then the data will go in as META:FIELDS, meaning that you can use SEARCH formfield constructs to search.
+Unlike normal registration the administrator is assumed to have correct e-mail addresses for the users, so **no verification is required.** Note that the new users are not notified that they have an account. This is so you can prepare and verify the accounts before announcing them. To announce them use the [[BulkResetPassword]] feature: this will assign a new random password and notify users.
-If you use the [[UserForm]] then ensure that it contains all the fields you define here. Otherwise they will disappear when the user edits their home topic!
+## <a name="Bulk Registration usage"></a> Bulk Registration usage
-### <a name="Mandatory fields"></a> Mandatory fields
+Note: this is an administrator job - only admistrators can run this.
-- WikiName
-- FirstName
-- LastName
+If you are administrator, you will take these actions:
-### <a name="Optional fields"></a> Optional fields
+1. (First time use) Create new bulk registration topics (see [[Settings|Main/WebHome#Settings]] below).
+2. In the REGISTERTOPIC topic: create a table of new users. An example table is provided below to copy.
+3. Return to this topic and press the button "Bulk Register" to create the new topics.
+4. Read %LOGTOPIC% to verify if all has gone well.
+5. When you are ready, use the [[BulkResetPassword]] page to assign passwords and notify the users of their new accounts.
-- [[LoginName]] - if not set will register with [[WikiName]]
+Below are the details.
## <a name="Settings"></a> Settings
- Set this to 1 to make the bulk registration overwrite any existing user topics. By default, existing user topics are left alone.
- Set OVERWRITEHOMETOPICS = 0
+## <a name="The user table"></a> The user table
+
+This table is a template for user data that will be written to the new user topics. If you stick to these basic fields you can just use the first example below. If you want to write more data (like phone number or country) read the section [[Customizing user data|Main/WebHome#CustomizingUserData]] as well.
+
### <a name="Example format"></a> Example format
-The following should be inserted into your REGISTERTOPIC as a table.
+The following should be inserted into your %REGISTERTOPIC% as a table. This is the most simple format:
- | FirstName | LastName | Email | WikiName | CustomFieldThis | SomeOtherRandomField | WhateverYouLike |
- | Test | User | you@example.com | TestUser | A | B | C |
+ <noautolink>
+ %EDITTABLE{}%
+ | FirstName | LastName | Email | WikiName |
+ | Test | User | you@example.com | TestUser |
+ </noautolink>
+
+**Usage:**
+
+1. Copy this text to your clipboard
+2. Click through and paste this on %REGISTERTOPIC%.
+3. Add and customize entries, save table. Note that the first row must not contain bolded entries, so don't apply any formatting.
+4. Return here
+
+<a name="CustomizingUserData"></a>
-To use this:
+### <a name="Customizing user data"></a> Customizing user data
-1. Make sure that the Custom fields appear on the [[UserForm]]
-2. Copy the above table to your clipboard
-3. Click through and paste this on %REGISTERTOPIC%, save the topic and return here.
-4. Click the Bulk register button below
-5. Read %LOGTOPIC%
-6. When you are ready, use the [[BulkResetPassword]] page to assign passwords and notify the users of their new accounts.
+You can write additional data to the new user topics. Do this by enhancing the user table with additional field names as table headers.
-Notes:
+Any fields you define in this table will end up in the User's topic. If a form (such as [[UserForm]]) is attached to [[NewUserTemplate]] then the data will go in as META:FIELDS, meaning that you can use SEARCH formfield constructs to search.
+
+If you use the [[UserForm]] then ensure that it contains all the fields you define here. Otherwise they will disappear when the user edits their home topic!
+
+#### <a name="Mandatory fields"></a> Mandatory fields
+
+- WikiName
+- FirstName
+- LastName
+
+#### <a name="Optional fields"></a> Optional fields
+
+- [[LoginName]] - if not set will register with [[WikiName]]
+
+#### <a name="Customized table example"></a> Customized table example
+
+Make sure that the extra fields also appear on the [[UserForm]].
+
+ <noautolink>
+ %EDITTABLE{}%
+ | FirstName | LastName | Email | WikiName | CustomFieldThis | SomeOtherRandomField | WhateverYouLike |
+ | Test | User | you@example.com | TestUser | A | B | C |
+ </noautolink>
-1. The first row of the table dictates the heading format and that the fieldnames must be plain, i.e. **must not contain bolded** entries.
-2. You are responsible for ensuring that the fieldnames appear in the [[TWiki.UserForm|TWiki/UserForm]]
-3. Only administrators can run this.
+----
**Sorry, the password system is currently read only, please contact 0**<br />
</tr>
<tr>
<td align="right"> Skin Version: </td>
- <td> 21 May 2007 (v1.001) </td>
+ <td> 03 Aug 2008 </td>
</tr>
<tr>
<td align="right"> Change History: </td>
<td> </td>
</tr>
<tr>
+ <td align="right"> 03 May 2008 </td>
+ <td> TWiki 4.2.1 release version </td>
+ </tr>
+ <tr>
<td align="right"> 21 May 2007 </td>
<td> Bugs:Item3969 - 8bit email fix (TWiki:Main.WillNorris) </td>
</tr>
</tr>
<tr>
<td><code>action</code></td>
- <td> Action added to action table directly above comment box (requires TWiki:Plugins/ActionTrackerPlugin) </td>
+ <td> Action added to action table directly above comment box (see <a href="#Installation">Plugin Installation Instructions</a> below for immportant notes) </td>
</tr>
<tr>
<td><code>table</code></td>
These can be set in TWikiPreferences, in WebPreferences or in individual topics.
+#Installation
+
## <a name="Plugin Installation Instructions"></a> Plugin Installation Instructions
- This plugin is pre-installed in most TWiki releases. However if you need to upgrade the plugin for any reason:
- Manually resolve the dependencies listed below. None
- Use `configure` to enable the plugin
+Note that if you want to use the `action` template then you must also:
+
+1. Install the TWiki:Plugins/ActionTrackerPlugin;
+2. Put the CommentPlugin **before** the ActionTrackerPlugin in the `{PluginsOrder}` configuration option (in `configure`)
+
## <a name="Plugin Info"></a> Plugin Info
Another great TWiki extension from the [ **WikiRing** ](http://wikiring.com) - working together to improve your wiki experience!
</tr>
<tr>
<td align="right"> Plugin Version: </td>
- <td> 15776 (22 Jan 2008) </td>
+ <td> 03 Aug 2008 17302 (04 Aug 2008) </td>
</tr>
<tr>
<td align="right"> Change History: </td>
<td> </td>
</tr>
<tr>
+ <td align="right"> 03 Aug 2008 </td>
+ <td> The TWiki 4.2.1 release version </td>
+ </tr>
+ <tr>
+ <td align="right"> 11 Apr 2008 </td>
+ <td> TWikibug:Item5518 corrected the template definition for bulletabove </td>
+ </tr>
+ <tr>
<td align="right"> 5 Sep 2007 </td>
<td> TWikibug:Item3689 corrected <code>location</code> handling TWikibug:Item4181 added [[Main/VarCOMMENT]] TWikibug:Item4402 corrected access check </td>
</tr>
> %COMMENT{type="bulletabove" inputsize="20"}%
- %TMPL:DEF{PROMPT:bulletabove}%<input class="twikiInputField" name="bullet_above_item" id="bullet_above_item" type="text" size="%inputsize|40" value="%URLPARAM{"bullet_above_item"}%" /> <input %DISABLED% type="submit" value="%button|Add item%" class="twikiButton" />%TMPL:END%
+ %TMPL:DEF{PROMPT:bulletabove}%<input class="twikiInputField" name="bullet_above_item" id="bullet_above_item" type="text" size="%inputsize|40%" value="%URLPARAM{"bullet_above_item"}%" /> <input %DISABLED% type="submit" value="%button|Add item%" class="twikiButton" />%TMPL:END%
%TMPL:DEF{OUTPUT:bulletabove}% * %URLPARAM{"bullet_above_item"}%%POS:BEFORE%
%TMPL:END%
### <a name="Using TWiki Variables in the For"></a> Using TWiki Variables in the Format Parameter
-TWiki variables like `%Y%` in `<initial value>` (of text input field) and `<label text>` (of fixed label) will get expanded when a new row is added.
-
-This is useful to write variables like dates into the table.
-
-> For example:
->
-> %EDITTABLE{ format="| label, 0, %SERVERTIME{"$day $mon $year $hour:$min"}% |" }%
->
-> ... will get expanded to
->
-> `29 Jun 2010 12:07`
->
-> when the new row is created.
-
-To prevent variable expansion: escape the format variable with [[formatting tokens|TWiki/FormatTokens]] (particularly `$percnt`).
-
-> For example:
->
-> %EDITTABLE{ format="| text, 20, $percntY$percnt |" }%
->
-> ... will create a new row with
->
-> `$percntY$percnt`
->
-> . In view mode this is temporarily translated to
->
-> `%Y%`
->
-> and subsequent rendered as %Y%.
+By default, variables in `<initial value>` (of text input field) and `<label text>` (of fixed label) get expanded when a new row is added. This can be used for example to add a timestamp to a label. You can escape characters with format tokens if you do not want that.
+
+Any TWiki variable inside a table cell will be preserved. For instance, `%TOPIC%` will not get expanded to the current topic name.
+
+The format tokens are the same as with [[FormattedSearch]]:
+
+<table border="1" cellpadding="0" cellspacing="0">
+ <tr>
+ <th bgcolor="#99CCCC"><strong> Escape: </strong></th>
+ <th bgcolor="#99CCCC"><strong> Expands To: </strong></th>
+ </tr>
+ <tr>
+ <td><code>$n</code> or <code>$n()</code></td>
+ <td> New line. Use <code>$n()</code> if followed by alphanumeric character, e.g. write <code>Foo$n()Bar</code> instead of <code>Foo$nBar</code></td>
+ </tr>
+ <tr>
+ <td><code>$nop</code> or <code>$nop()</code></td>
+ <td> Is a "no operation". </td>
+ </tr>
+ <tr>
+ <td><code>$quot</code></td>
+ <td> Double quote (<code>"</code>) </td>
+ </tr>
+ <tr>
+ <td><code>$percnt</code></td>
+ <td> Percent sign (<code>%</code>) </td>
+ </tr>
+ <tr>
+ <td><code>$dollar</code></td>
+ <td> Dollar sign (<code>$</code>) </td>
+ </tr>
+</table>
<a name="DateField"></a>
</tr>
<tr>
<td valign="top"><pre>
+%TABLE{"headerrows="1"}%
%EDITTABLE{ format="| label | text, 40 |" changerows="off" }%
|*Key*|*Value*|
| Name: | John Smith |
- Set DEBUG to 1 to get debug messages in `data/debug.txt`. Default: `0`
- Set DEBUG = 0
-- Set JAVASCRIPTINTERFACE to 1 to be able to directly move and delete row without page refresh.
+- Set JAVASCRIPTINTERFACE to 1 to be able to directly move and delete row without page refresh. Can be overridden with parameter `javascriptinterface`.
- Set JAVASCRIPTINTERFACE = 1
- Default for change rows flag: `on`, `off`, `add`
- This Plugin does not support TWiki table formatting like Multi-span cells (e.g. `| ... ||`) and cell justification (e.g. `| centered | right |`)
- There is a performance issue when editing a large table, say, with more then 50 rows
-- Variables like `%ATTACHURL%` get expanded unless they are in a label
- You cannot put two `%EDITTABLE{}%` statements on the same line in the source
- You can include %-vars now in select values, by quoting them with <nop>, as in %<nop>X% for %X%, say for instance: <br />`select,1,%<nop>X%,%<nop>Y%`
</tr>
<tr>
<td align="right"> Copyright: </td>
- <td> © 2002-2007, TWiki:Main.PeterThoeny (<a href="http://www.twiki.net/" target="_top">TWIKI.NET</a>) and TWiki Contributors </td>
+ <td> © 2002-2008, TWiki:Main.PeterThoeny (<a href="http://www.twiki.net/" target="_top">TWIKI.NET</a>) and TWiki Contributors </td>
</tr>
<tr>
<td align="right"> License: </td>
</tr>
<tr>
<td align="right"> Plugin Version: </td>
- <td> 4.7.10 (08 Jan 2008) </td>
+ <td> 4.8.4 (03 Aug 2008) </td>
</tr>
<tr>
<td align="right"> Change History: </td>
<td> </td>
</tr>
<tr>
+ <td align="right"> 03 Aug 2008: </td>
+ <td> 4.8.4 TWiki 4.2.1 release version </td>
+ </tr>
+ <tr>
+ <td align="right"> 19 Jul 2008: </td>
+ <td> 4.8.3 Bugfix release </td>
+ </tr>
+ <tr>
+ <td align="right"> 20 Mar 2008: </td>
+ <td> 4.8: Arthur Clemens: Code refactoring; disabled table sort when editing; removed usage of <code>$percnt</code> to prevent variable expansion (is now done automatically); made Javascript interface aware of headers and footers, and of <code>changerows="off"</code>; improved feedback on row move. </td>
+ </tr>
+ <tr>
<td align="right"> 25 Dec 2007: </td>
<td> 4.7.1: Arthur Clemens: Added warning if <code>include</code> parameter topic does not exist. </td>
</tr>
</table>
**_Related Topics:_** [[VarEDITTABLE]], [[TWikiPreferences]], [[TWikiPlugins]]
-
--- TWiki:Main/PeterThoeny - 07 Oct 2007
</tr>
<tr>
<td align="right"> Plugin Version: </td>
- <td> 15942 (22 Jan 2008) </td>
+ <td> 15942 (04 Aug 2008) </td>
</tr>
<tr>
<td align="right"> Change History: </td>
- %X% 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.
+ - To enable this feature, set the \{AutoAttachPubFiles\} configuration option.
- **_NOTE:_** The automatic attachment feature can only be used by an administrator who has access to the server's file system.
## <a name="Downloading Files"></a> Downloading Files
<div>
<ul>
- <li>
- <ul>
- <li><a href="#Usage"> Usage</a><ul>
- <li><a href="#Displaying the Parent - Current"> Displaying the Parent - Current - Children block</a></li>
- <li><a href="#Displaying child topics"> Displaying child topics</a></li>
- </ul>
- </li>
+ <li><a href="#Usage"> Usage</a><ul>
+ <li><a href="#Displaying the Parent - Current"> Displaying the Parent - Current - Children block</a></li>
+ <li><a href="#Displaying child topics"> Displaying child topics</a></li>
</ul>
</li>
- <li><a href="#TWiki Installation Error">TWiki Installation Error</a></li>
- <li><a href="#TWiki Installation Error">TWiki Installation Error</a></li>
- <li><a href="#TWiki Installation Error">TWiki Installation Error</a></li>
</ul>
</div>
**Child topics:**
-<div style="display: none">
- <div>
- <div>
- <h1><a name="TWiki Installation Error"></a> TWiki Installation Error </h1>Incorrect format of searchformat template (missing sections? There should be 4 %SPLIT% tags)</div>
- <div>
- <ul>
- <li> WebHome </li>
- </ul>
- </div>
- <div>
- <h1><a name="TWiki Installation Error"></a> TWiki Installation Error </h1>Incorrect format of searchformat template (missing sections? There should be 4 %SPLIT% tags)</div>
- </div>
- <p>
- </p>
- <div>
- <div>
- <h1><a name="TWiki Installation Error"></a> TWiki Installation Error </h1>Incorrect format of searchformat template (missing sections? There should be 4 %SPLIT% tags)</div>
- </div>
+When included in [[WebLeftBar]] (using default Pattern skin) this is styled to:
+
+<div id="patternLeftBarContents">
<p>
</p>
</div>
+
+ %STARTSECTION{name="all"}%<div class="twikiHierarchicalNavigation">
+ <ul>
+ %SEARCH{
+ "parent"
+ type="query"
+ topic="%BASETOPIC%"
+ web="%BASEWEB%"
+ nonoise="on"
+ format="<li class='twikiParentTopic'><img src='%ICONURL{parent_gray}%' width='16' height='16' alt='' border='0' /> [[$web.$parent][$parent]]</li>"
+ }%
+ <li class='twikiCurrentTopic' style='font-weight:bold;'><nop>%BASETOPIC%</li>%INCLUDE{"%TOPIC%" section="childlist"}%
+ </ul>
+ </div><!--/twikiHierarchicalNavigation-->%ENDSECTION{name="all"}%
+
+ %STARTSECTION{name="children"}%<div class="twikiHierarchicalNavigation">
+ <ul>%INCLUDE{"%TOPIC%" section="childlist"}%</ul>
+ </div><!--/twikiHierarchicalNavigation-->%ENDSECTION{name="children"}%</div>%ENDSECTION{name="children"}%
+
+ %STARTSECTION{name="childlist"}%%SEARCH{
+ "parent.name='%BASETOPIC%'"
+ web="%BASEWEB%"
+ type="query"
+ nonoise="on"
+ format="<li class='childTopic'><img src='%ICONURL{line_ur_gray}%' width='16' height='16' alt='' border='0' /> [[$web.$topic][$topic]]</li>"
+ }%%ENDSECTION{name="childlist"}%
</tr>
<tr>
<td> ingroup </td>
- <td><code>'X' ingroup 'Y'</code> is true if user 'X' is in group 'Y' </td>
+ <td><code>'X' ingroup 'Y'</code> is true if user 'X' is in group 'Y'. 'X' can be a login name or a wikiname. </td>
</tr>
<tr>
<td> defined </td>
1. TWiki variable defined or not
- %IF{"defined WIKINAME" then="WIKINAME is defined" else="WIKINAME is not defined"}%
+ %IF{"defined 'WIKINAME'" then="WIKINAME is defined" else="WIKINAME is not defined"}%
2. Compare TWiki variable
- You are %IF{ "$ WIKINAME='TWikiGuest' and not defined OPEN_DAY" then="not" }% allowed to
+ You are %IF{ "$ WIKINAME='TWikiGuest' and not defined 'OPEN_DAY'" then="not" }% allowed to
%IF{ "context view" then="view" else="edit"}% this TWiki today.
3. URL parameter
- %IF{ "defined search" then="Search: $percntURLPARAM{search}$percnt" else="No search passed in"}%
+ %IF{ "defined 'search'" then="Search: $percntURLPARAM{search}$percnt" else="No search passed in"}%
4. Range test on URL parameter
<td> Set if absolute URLs are required </td>
</tr>
<tr>
+ <td> attach </td>
+ <td> in attach script (see [[Main/TWikiScripts]]) </td>
+ </tr>
+ <tr>
<td> authenticated </td>
<td> a user is authenticated </td>
</tr>
<td> if active links such as 'edit' and 'attach' should be disabled </td>
</tr>
<tr>
+ <td> login & logon </td>
+ <td> in login / logon script (see [[Main/TWikiScripts]]) </td>
+ </tr>
+ <tr>
+ <td> manage </td>
+ <td> in manage script (see [[Main/TWikiScripts]]) </td>
+ </tr>
+ <tr>
<td> mirror </td>
<td> if this is a mirror </td>
</tr>
<td> in preview script (see [[Main/TWikiScripts]]) </td>
</tr>
<tr>
+ <td> register </td>
+ <td> in register script (see [[Main/TWikiScripts]]) </td>
+ </tr>
+ <tr>
+ <td> rename </td>
+ <td> in rename script (see [[Main/TWikiScripts]]) </td>
+ </tr>
+ <tr>
+ <td> resetpasswd </td>
+ <td> in resetpasswd script (see [[Main/TWikiScripts]]) </td>
+ </tr>
+ <tr>
<td> rss </td>
<td> if this is an RSS skin rendering </td>
</tr>
<td> in search script (see [[Main/TWikiScripts]]) </td>
</tr>
<tr>
+ <td> statistics </td>
+ <td> in statistics script (see [[Main/TWikiScripts]]) </td>
+ </tr>
+ <tr>
<td> textareas_hijacked </td>
<td> provided for use by editors that highjack textareas, and want to signal this fact. This is used by skins, for example, so they can suppress extra controls when textareas have been hijacked. </td>
</tr>
<tr>
+ <td> upload </td>
+ <td> in upload script (see [[Main/TWikiScripts]]) </td>
+ </tr>
+ <tr>
<td> view </td>
<td> in view script (see [[Main/TWikiScripts]]) </td>
</tr>
<tr>
+ <td> viewfile </td>
+ <td> in viewfile script (see [[Main/TWikiScripts]]) </td>
+ </tr>
+ <tr>
<td> rest </td>
<td> in rest script (see [[Main/TWikiScripts]]) </td>
</tr>
Administrators can enable and disable plugins using [<img src="http://www.dementia.org/twiki//view/Main/WebHome/wrench.gif" width="16" height="16" alt="wrench" /> configure](http://www.dementia.org/twiki/configure).
-## <a name="Contrib Modules"></a> Contrib Modules
+## <a name="All Contrib Modules"></a> All Contrib Modules
+
+This list includs Plugins, some some of which may be disabed in configure, or due to other reasons. See %SYSTEMWEB%.TWikiSkinBrowser for an overview of the installed Skins.
# <a name="TWiki Installation Error"></a> TWiki Installation Error
**_Note:_** The diagnostics are provided by the `%FAILEDPLUGINS%` variable
-**_Related Topics:_** [[TWikiPlugins]], [[TWikiPreferences]], [[AdminDocumentationCategory]], [[AdminToolsCategory]]
+**_Related Topics:_** [[TWikiPlugins]], [[TWikiPreferences]], [[AdminDocumentationCategory]], [[AdminToolsCategory]], [[TWikiSkinBrowser]]
</tr>
<tr>
<td align="right"> Plugin Version: </td>
- <td> 16052 (22 Jan 2008) </td>
+ <td> 03 Aug 2008 17302 (04 Aug 2008) </td>
</tr>
<tr>
<td align="right"> Change History: </td>
<td> </td>
</tr>
<tr>
+ <td align="right"> 03 Aug 2008: </td>
+ <td> TWiki 4.2.1 release version </td>
+ </tr>
+ <tr>
+ <td align="right"> 22 Jan 2008: </td>
+ <td> TWiki 4.2.0 release version </td>
+ </tr>
+ <tr>
<td align="right"> 25 Nov 2007: </td>
<td> 15752 - TWikibug:Item5006 - Renamed Bugs rule to TWikibug rule (PTh) </td>
</tr>
....
}
-The first parameter to `showCalendar` is the id of the textfield, and the second parameter is the . See the Mishoo documentation for details of the '$e %B %Y' parameter.
+The first parameter to `showCalendar` is the id of the textfield, and the second parameter is the date format. Default format is '%e %B %Y'.
+
+All available date specifiers:
+
+ %a - abbreviated weekday name
+ %A - full weekday name
+ %b - abbreviated month name
+ %B - full month name
+ %C - century number
+ %d - the day of the month ( 00 .. 31 )
+ %e - the day of the month ( 0 .. 31 )
+ %H - hour ( 00 .. 23 )
+ %I - hour ( 01 .. 12 )
+ %j - day of the year ( 000 .. 366 )
+ %k - hour ( 0 .. 23 )
+ %l - hour ( 1 .. 12 )
+ %m - month ( 01 .. 12 )
+ %M - minute ( 00 .. 59 )
+ %n - a newline character
+ %p - "PM" or "AM"
+ %P - "pm" or "am"
+ %S - second ( 00 .. 59 )
+ %s - number of seconds since Epoch (since Jan 01 1970 00:00:00 UTC)
+ %t - a tab character
+ %U, %W, %V - the week number
+ The week 01 is the week that has the Thursday in the current year,
+ which is equivalent to the week that contains the fourth day of January.
+ Weeks start on Monday.
+ %u - the day of the week ( 1 .. 7, 1 = MON )
+ %w - the day of the week ( 0 .. 6, 0 = SUN )
+ %y - year without the century ( 00 .. 99 )
+ %Y - year including the century ( ex. 1979 )
+ %% - a literal % character
`addHEAD` can be called from `commonTagsHandler` for adding the header to all pages, or from `beforeEditHandler` just for edit pages etc.
</tr>
<tr>
<td align="right"> Version: </td>
- <td> 16236 (22 Jan 2008) of the Mishoo calendar </td>
+ <td> 03 Aug 2008 </td>
</tr>
<tr>
<td align="right"> Copyright ©: </td>
<td> None </td>
</tr>
<tr>
- <td> Change History: </td>
+ <td align="right"> Change History: </td>
<td> </td>
</tr>
<tr>
+ <td align="right"> 03 Aug 2008 </td>
+ <td> TWiki 4.2.1 release version incl new calendar icon </td>
+ </tr>
+ <tr>
<td align="right"> 6 Sep 2007 </td>
<td> Bugs:Item4030 Added doc for using the calendar in user forms </td>
</tr>
Each web can optionally contain a topic called WebNotify.
-Users subscribe to email notifications using their [[WikiName]] or an alternative email address, and can specify the webs/topics they wish to track, WWhole groups of users can also be subscribed for notification.
+Users subscribe to email notifications using their [[WikiName]] or an alternative email address, and can specify the webs/topics they wish to track, Whole groups of users can also be subscribed for notification.
The general format of a subscription is:
Users may further customize the specific content they will receive using the following controls:
-- You can use `*` in a topic name, where it is treated as a [wildcard character](http://en.wikipedia.org/wiki/Wildcard_character). A `*` will match zero or more other characters - so, for example, `Fred*` will match all topic names starting with `Fred`, `*Fred` will match all topic names _ending_ with `Fred`, and `*` will match _all_ topic names.
-- Each topic may optionally be preceded by a '+' or '-' sign. The '+' sign means "subscribe to this topic". The '-' sign means "unsubscribe" or "don't send notifications regarding this particular topic". This allows users to elect to filter out certain topics. Topic filters ('-') take precedence over topic includes ('+') i.e. if you unsubscribe from a topic it will cancel out any subscriptions to that topic.
-- 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_, and ? will mail the topic only if there have been changes to it. This only makes sense for subscriptions, and is intended for mailshotting regular newletters.
+- **Using wild-card character in topic names** - You can use `*` in a topic name, where it is treated as a [wildcard character](http://en.wikipedia.org/wiki/Wildcard_character). A `*` will match zero or more other characters - so, for example, `Fred*` will match all topic names starting with `Fred`, `*Fred` will match all topic names _ending_ with `Fred`, and `*` will match _all_ topic names.
+- **Unsubscribing to specific topics** - Each topic may optionally be preceded by a '+' or '-' sign. The '+' sign means "subscribe to this topic". The '-' sign means "unsubscribe" or "don't send notifications regarding this particular topic". This allows users to elect to filter out certain topics. Topic filters ('-') take precedence over topic includes ('+') i.e. if you unsubscribe from a topic it will cancel out any subscriptions to that topic.
+- **Including child-topics in subscription** - 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.
+- **Subscribing to entire topic ("news mode")** - 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_, and ? will mail the topic only if there have been changes to it. One can limit the content of the subscribed topic to send out by inserting %STARTPUBLISH% and %STOPPUBLISH% markers within the topic. Note that "news mode" subscriptions require a corresponding cron job that includes the "-news" option (see [[details|Main/TOPIC#Setting_up_your_cron_job_s]]).
-For example: Subscribe Daisy to all changes to topics in this web.
+Examples: Subscribe Daisy to all changes to topics in this web.
* daisy.cutter@flowers.com
</tr>
<tr>
<td><code>-news</code></td>
- <td> Run in news mode (process NewsNotify instead of WebNotify) </td>
+ <td> Run in "news mode" (process subscriptions that include "!" or "?" following the topic) </td>
</tr>
<tr>
<td><code><i>web1 web2 ... webN</i></code></td>
will generate newsletters from **all** webs every week on midnight Saturday.
+%X% Note: Multiple instances of mailnotify script are not allowed to be executed simutaneously. If you need to run the script multiple times with different options, make sure the cron jobs are scheduled so a previous run has finished before the next starts. You can also write a small script that runs mailnotify in sequence as described in TWiki:Support.DuplicateNotificationsFromMailerCon.
+
## <a name="Developer Notes"></a> Developer Notes
The changes mails sent to users are based on a TWiki template called `mailnotify`. This template must contain the following definitions.
</tr>
<tr>
<td align="right"> Version: </td>
- <td> 16078 (22 Jan 2008) </td>
+ <td> 03 Aug 2008 </td>
</tr>
<tr>
<td align="right"> Change History: </td>
<td> </td>
</tr>
<tr>
+ <td align="right"> 03 Aug 2008 </td>
+ <td> TWiki 4.2.1 release version </td>
+ </tr>
+ <tr>
+ <td align="right"> 27 Jul 2008 </td>
+ <td> TWikibug:Item5776: TWiki:Main.KennethLavrsen added note to warn against running multiple instances of mailnotify at the same time. </td>
+ </tr>
+ <tr>
+ <td align="right"> 15 May 2008 </td>
+ <td> TWikibug:Item5232: TWiki:Main.CrawfordCurrie added support for non-ascii alphanumerics in topic names to [[Main/WebNotify]]. TWikibug:Item5630: TWiki:Main.SvenDowideit fixed some spelling errors </td>
+ </tr>
+ <tr>
+ <td align="right"> 25 Jan 2008 </td>
+ <td> TWikibug:Item4812: added TWiki:Main.BobGoldstein's noexpand patch for groups </td>
+ </tr>
+ <tr>
<td align="right"> 2 Nov 2007 </td>
- <td> Bugs:Item4818: added quotes to support non-alphabetic and other wierd group names Bugs:Item4887: corrected minor rendering error Bugs:Item4917: removed dependence on symbolic web names </td>
+ <td> TWikibug:Item4818: added quotes to support non-alphabetic and other wierd group names TWikibug:Item4887: corrected minor rendering error TWikibug:Item4917: removed dependence on symbolic web names </td>
</tr>
<tr>
<td align="right"> 9 Sep 2007 </td>
- <td> Bugs:Item4326 workaround for possible error in WebNotify API in old releases, Should not affect most users. </td>
+ <td> TWikibug:Item4326 workaround for possible error in WebNotify API in old releases, Should not affect most users. </td>
</tr>
<tr>
<td align="right"> 6 Sep 2007 </td>
- <td> Bugs:Item4488 doc tweaks </td>
+ <td> TWikibug:Item4488 doc tweaks </td>
</tr>
<tr>
<td align="right"> 14550 </td>
- <td> Bugs:Item4461 - 'Changed' link now points to most recent changes, not the entire history </td>
+ <td> TWikibug:Item4461 - 'Changed' link now points to most recent changes, not the entire history </td>
</tr>
<tr>
<td align="right"> 22 Jun 2007 </td>
- <td> Bugs:Item4284 - added access control checks and email filter </td>
+ <td> TWikibug:Item4284 - added access control checks and email filter </td>
</tr>
<tr>
<td align="right"> 21 May 2007 </td>
- <td> Bugs:Item3969 - 8bit email fix (TWiki:Main.WillNorris) </td>
+ <td> TWikibug:Item3969 - 8bit email fix (TWiki:Main.WillNorris) </td>
</tr>
<tr>
<td align="right"> 13623 </td>
- <td> Bugs:Item4014 no changes was resetting the notify time to 0. Thanks to TWiki:Main.JeffCrawford for nailing this down. </td>
+ <td> TWikibug:Item4014 no changes was resetting the notify time to 0. Thanks to TWiki:Main.JeffCrawford for nailing this down. </td>
</tr>
<tr>
<td align="right"> 12496 </td>
- <td><a href="http://develop.twiki.org/~twiki4/cgi-bin/view/Bugs/Item3415" rel="nofollow">Item3415</a> mailnotify did not send notifications to intranet users because of wrong call to findUser. </td>
+ <td> TWikibug:Item3415 mailnotify did not send notifications to intranet users because of wrong call to findUser. </td>
</tr>
<tr>
<td align="right"> 11672 </td>
</tr>
<tr>
<td align="right"> 11534 </td>
- <td><a href="http://develop.twiki.org/~twiki4/cgi-bin/view/Bugs/Item2153" rel="nofollow">Item2153</a> Clarified docs. <a href="http://develop.twiki.org/~twiki4/cgi-bin/view/Bugs/Item2698" rel="nofollow">Item2698</a> Improved error reporting. </td>
+ <td> TWikibug:Item2153 Clarified docs. TWikibug:Item2698 Improved error reporting. </td>
</tr>
<tr>
<td align="right"> 8808 </td>
- <td><a href="http://develop.twiki.org/~twiki4/cgi-bin/view/Bugs/Item1654" rel="nofollow">Item1654</a> mailnotify must enter the command_line context </td>
+ <td> TWikibug:Item1654 mailnotify must enter the command_line context </td>
</tr>
<tr>
<td align="right"> 8625 </td>
- <td><a href="http://develop.twiki.org/~twiki4/cgi-bin/view/Bugs/Item1508" rel="nofollow">Item1508</a> Making the dashes in the separatator clearer </td>
+ <td> TWikibug:Item1508 Making the dashes in the separatator clearer </td>
</tr>
<tr>
<td align="right"> 8606 </td>
- <td><a href="http://develop.twiki.org/~twiki4/cgi-bin/view/Bugs/Item1508" rel="nofollow">Item1508</a> [[Main/MailerContrib]]: Brushing up HTML mailnotify template </td>
+ <td> TWikibug:Item1508 [[Main/MailerContrib]]: Brushing up HTML mailnotify template </td>
</tr>
<tr>
<td align="right"> 8602 </td>
- <td><a href="http://develop.twiki.org/~twiki4/cgi-bin/view/Bugs/Item1508" rel="nofollow">Item1508</a> [[Main/MailerContrib]]: Cleaning up plaintext e-mail template, removing TEXTAREA </td>
+ <td> TWikibug:Item1508 [[Main/MailerContrib]]: Cleaning up plaintext e-mail template, removing TEXTAREA </td>
</tr>
<tr>
<td align="right"> 8522 </td>
- <td><a href="http://develop.twiki.org/~twiki4/cgi-bin/view/Bugs/Item1511" rel="nofollow">Item1511</a> arguments to getScriptUrl in wrong order :-( </td>
+ <td> TWikibug:Item1511 arguments to getScriptUrl in wrong order :-( </td>
</tr>
<tr>
<td align="right"> 8434 </td>
- <td><a href="http://develop.twiki.org/~twiki4/cgi-bin/view/Bugs/Item1465" rel="nofollow">Item1465</a> Fix 'TWiki.' to '%TWIKIEB%.' </td>
+ <td> TWikibug:Item1465 Fix 'TWiki.' to '%TWIKIEB%.' </td>
</tr>
<tr>
<td align="right"> 8398 </td>
- <td><a href="http://develop.twiki.org/~twiki4/cgi-bin/view/Bugs/Item1460" rel="nofollow">Item1460</a> polished up the comment a bit </td>
+ <td> TWikibug:Item1460 polished up the comment a bit </td>
</tr>
<tr>
<td align="right"> 8308 </td>
- <td><a href="http://develop.twiki.org/~twiki4/cgi-bin/view/Bugs/Item1362" rel="nofollow">Item1362</a> moving mailnotify cron script </td>
+ <td> TWikibug:Item1362 moving mailnotify cron script </td>
</tr>
<tr>
<td align="right"> 7848 </td>
- <td><a href="http://develop.twiki.org/~twiki4/cgi-bin/view/Bugs/Item1167" rel="nofollow">Item1167</a> forced all mail operations to generate absolute URLs </td>
+ <td> TWikibug:Item1167 forced all mail operations to generate absolute URLs </td>
</tr>
<tr>
<td align="right"> 7568 </td>
- <td><a href="http://develop.twiki.org/~twiki4/cgi-bin/view/Bugs/Item910" rel="nofollow">Item910</a> use SCRIPTURL{view} instead of complex url expr </td>
+ <td> TWikibug:tem910 use SCRIPTURL{view} instead of complex url expr </td>
</tr>
<tr>
<td align="right"> 6864 </td>
- <td><a href="http://develop.twiki.org/~twiki4/cgi-bin/view/Bugs/Item624" rel="nofollow">Item624</a> mailer templates moved the the right places </td>
+ <td> TWikibug:tem624 mailer templates moved the the right places </td>
</tr>
<tr>
<td align="right"> 6861 </td>
- <td><a href="http://develop.twiki.org/~twiki4/cgi-bin/view/Bugs/Item624" rel="nofollow">Item624</a> Added proper templates support for plain text mails </td>
+ <td> TWikibug:tem624 Added proper templates support for plain text mails </td>
</tr>
<tr>
<td align="right"> 6809 </td>
- <td><a href="http://develop.twiki.org/~twiki4/cgi-bin/view/Bugs/Item623" rel="nofollow">Item623</a> don't print anything if verbosity is switched off. </td>
+ <td> TWikibug:tem623 don't print anything if verbosity is switched off. </td>
</tr>
<tr>
<td align="right"> 6659 </td>
- <td><a href="http://develop.twiki.org/~twiki4/cgi-bin/view/Bugs/Item528" rel="nofollow">Item528</a> Updated [[Main/MailerContrib]]. it's working and the sendmail parameter is used. </td>
+ <td> TWikibug:tem528 Updated [[Main/MailerContrib]]. it's working and the sendmail parameter is used. </td>
</tr>
<tr>
<td align="right"> 6474 </td>
- <td><a href="http://develop.twiki.org/~twiki4/cgi-bin/view/Bugs/Item420" rel="nofollow">Item420</a> removed spurious remove_obsolete_locks from [[Main/MailerContrib]]</td>
+ <td> TWikibug:tem420 removed spurious remove_obsolete_locks from [[Main/MailerContrib]]</td>
</tr>
<tr>
<td align="right"> 5924 </td>
- <td><a href="http://develop.twiki.org/~twiki4/cgi-bin/view/Bugs/Item153" rel="nofollow">Item153</a> fix mail URL-fixing scheme </td>
+ <td> TWikibug:tem153 fix mail URL-fixing scheme </td>
</tr>
<tr>
<td align="right"> 5269 </td>
### <a name="Permissions"></a> Permissions
-You may only rename a web if you have permissions to rename all the topics within that web, including any topics in that web's subwebs. You will also need permissions to update any topics containing references to that web.
+You may only rename a web if you have the following permissions
+
+- You must be allowed to rename and changes topics in the web you want to rename
+- You must be allowed to rename topics in the parent web of the web you want to rename
+- If the web is a root web (i.e. it has no parent web) then you must have permission to both create and rename root webs. These permissions are controlled by the ALLOWROOTCHANGE preference, which can be set in [[%USERSWEB%.TWikiPreferences|USERSWEB/TWikiPreferences]].
+- If you move the web to another parent web you must be allowed to create and change topics in the new parent web.
+
+When you rename a web TWiki will try and update all links that refer to the old web. You should note that links only get updated in topics that you are allowed to edit. If you use access rights in the TWiki installation it is generally best to let an administrator rename webs to avoid too many broken links.
### <a name="Edit Conflicts"></a> Edit Conflicts
}
blockquote {
background-color:%ACTIVE_FORM_BACKGROUND%;
- border-color:%NEUTRAL_BORDER%;
+ border-color:%ACTIVE_FORM_BACKGROUND% %ACTIVE_FORM_BACKGROUND% %ACTIVE_FORM_BACKGROUND% %NEUTRAL_BORDER%;
+
}
blockquote h2 {
background:none;
}
.patternSigLine {
color:%MUTED_TEXT%;
- background-color:%ATTACHMENT_AND_FORM_BACKGROUND%;
- border-color:%SEPARATOR_BORDER%;
}
.patternToolBar a:link .twikiAccessKey,
.patternToolBar a:visited .twikiAccessKey {
%TMPL:INCLUDE\{"WebCreateNewTopic"\}%
+%\{"hide page top controls"\}% %TMPL:DEF\{"top"\}%%TMPL:END%
+
%TMPL:DEF\{"script:topictemplate"\}%%TMPL:END%
%TMPL:DEF\{"formstartstep"\}%
</tr>
<tr>
<td align="right"> Plugin Version: </td>
- <td> 15487 (22 Jan 2008) </td>
+ <td> 15487 (04 Aug 2008) </td>
</tr>
<tr>
<td align="right"> Change History: </td>
<li><a href="#Constants"> Constants</a></li>
<li><a href="#Operators"> Operators</a></li>
<li><a href="#Putting it all together"> Putting it all together</a></li>
+ <li><a href="#Gotcha"> Gotcha</a></li>
<li><a href="#Examples"> Examples</a><ul>
<li><a href="#Query examples"> Query examples</a></li>
<li><a href="#Search examples"> Search examples</a></li>
- `author`
- `date`
- `format`
- - `version`
+ - `rev` - topic revision (`12`) to match `%REVINFO{'$rev'}%` and [[FormattedSearch]] `$rev`
+ - `version` - internal Store topic version (`1.12` for rcs based Stores)
- `META:TOPICMOVED`
- `by`
- `date`
A query matches if the query returns one or more values when it is applied to the topic. So if I have a very simple query, such as `"attachments"`, then this will return TRUE for all topics that have one or more attachments. If I write `"attachments[size>1024 AND name ~ '*.gif']"` then it will return TRUE for all topics that have at least one attachment larger than 1024 bytes with a name ending in `.gif`.
+## <a name="Gotcha"></a> Gotcha
+
+- Remember that in the query language, TWiki topic names are _constants_. You cannot write `Main.UserTopic/UserForm.firstName` because `Main.UserTopic` will be interpreted as a form field name. If you want to refer to topics you **must** enclose the topic name in quotes i.e. `'Main.UserTopic'/UserForm.firstName`
+
## <a name="Examples"></a> Examples
### <a name="Query examples"></a> Query examples
- `(Firstname='Emma' OR Firstname='John') AND Lastname='Peel'` - shortcut form of the previous query
- `HistoryForm[name='Age'].value>2` - true if the topic has a `HistoryForm`, and the form has a field called `Age` with a value > 2
- `HistoryForm.Age > 2` - shortcut for the previous query
-- =preferences[name='FaveColour' AND value='Tangerine'] - true if the topic has the given preference setting and value
+- `preferences[name='FaveColour' AND value='Tangerine']` - true if the topic has the given preference setting and value
- <code>Person/([[ClothesForm]][name='Headgear'].value ~ '\*Bowler\*' AND attachments[name~'\*hat.gif' AND date < d2n('2007-01-01')])</code> - true if the form attached to the topic has a field called `Person` that has a value that is the name of a topic, and that topic contains the form `ClothesForm`, with a field called `Headgear`, and the value of that field contains the string `'Bowler'`, and the topic also has at least one attachment that has a name matching `*hat.gif` and a date before 1st Jan 2007. (Phew!)
### <a name="Search examples"></a> Search examples
# <a name="%WIKITOOLNAME% Site Map"></a> %WIKITOOLNAME% Site Map
-<table bgcolor="#000000" border="0" cellpadding="3" cellspacing="2" width="100%">
- <tr bgcolor="#eeeeee">
- <th> Web </th>
- <th> %WIKITOOLNAME% Site Map </th>
- <th> Use to... </th>
- </tr>
+<table border="1" cellpadding="0" cellspacing="0">
<tr>
- <td>
- <h1><a name="TWiki Installation Error"></a> TWiki Installation Error </h1>Incorrect format of searchformat template (missing sections? There should be 4 %SPLIT% tags) </td>
+ <th bgcolor="#99CCCC"><strong> TWiki Web </strong></th>
+ <th bgcolor="#99CCCC"><strong> Description of Web </strong></th>
+ <th bgcolor="#99CCCC"><strong> Used to... </strong></th>
+ <th bgcolor="#99CCCC"><strong> Links </strong></th>
</tr>
- <tr bgcolor="#ffffff">
- <td colspan="3">You can use color coding by web for identification and reference. This table is updated automatically based on WebPreferences settings of the individual webs. Contact if you need a separate collaboration web for your team. See also [[Main/AdminToolsCategory]].</td>
+</table>
+
+# <a name="TWiki Installation Error"></a> TWiki Installation Error
+
+Incorrect format of searchformat template (missing sections? There should be 4 %SPLIT% tags)
+
+<table border="1" cellpadding="0" cellspacing="0">
+ <tr>
+ <td colspan="4"> You can use color coding by web for identification and reference. This table is updated automatically based on WebPreferences settings of the individual webs. Contact if you need a separate collaboration web for your team. See also [[Main/AdminToolsCategory]]. </td>
</tr>
</table>
-<table border="0" cellpadding="3" cellspacing="2">
- <tr bgcolor="#ffffff">
- <td valign="top"> Legend of icons: </td>
- <td valign="top"> </td>
- <td valign="top"><img alt="Home of web" border="0" height="16" src="http://www.dementia.org/twiki//view/%SYSTEMWEB%/TWikiDocGraphics/home.gif" width="16" /> = Go to the home of the web%BR% <img alt="Search web" border="0" height="16" src="http://www.dementia.org/twiki//view/%SYSTEMWEB%/TWikiDocGraphics/searchtopic.gif" width="16" /> = Search the web </td>
- <td valign="top"> </td>
- <td valign="top"><img alt="Recent changes in the web" border="0" height="16" src="http://www.dementia.org/twiki//view/%SYSTEMWEB%/TWikiDocGraphics/recentchanges.gif" width="16" /> = See recent changes in the web%BR% <img alt="Get notified of changes to the web" border="0" height="16" src="http://www.dementia.org/twiki//view/%SYSTEMWEB%/TWikiDocGraphics/notify.gif" width="16" /> = Subscribe to get notified of changes by e-mail </td>
+
+<table border="1" cellpadding="0" cellspacing="0">
+ <tr>
+ <td> Legend: </td>
+ <td><img align="top" alt="home" border="0" height="16" src="http://www.dementia.org/twiki//view/Main/WebHome/home.gif" width="16" /> Go to the home of the web </td>
+ <td><img align="top" alt="recentchanges" border="0" height="16" src="http://www.dementia.org/twiki//view/Main/WebHome/recentchanges.gif" width="16" /> See recent changes in the web </td>
+ </tr>
+ <tr>
+ <td> ^ </td>
+ <td><img align="top" alt="searchtopic" border="0" height="16" src="http://www.dementia.org/twiki//view/Main/WebHome/searchtopic.gif" width="16" /> Search the web </td>
+ <td><img align="top" alt="notify" border="0" height="16" src="http://www.dementia.org/twiki//view/Main/WebHome/notify.gif" width="16" /> Subscribe to get notified of changes by e-mail </td>
</tr>
</table>
</tr>
<tr>
<td align="right"> Plugin Version: </td>
- <td> 29 Sep 2007 (15091) </td>
+ <td> 02 Aug 2008 </td>
</tr>
<tr>
<td align="right"> Change History: </td>
<td> </td>
</tr>
<tr>
+ <td align="right"> 02 Aug 2008: </td>
+ <td> Fixed corruption of preview </td>
+ </tr>
+ <tr>
<td align="right"> 29 Sep 2007: </td>
<td> Added %SYSTEMWEB%.VarSLIDESHOWSTART and %SYSTEMWEB%.VarSLIDESHOWEND to have them listed in %SYSTEMWEB%.TWikiVariables </td>
</tr>
- `users` TWiki::Users singleton
- `webName` Name of web found in URL path, or `web` URL parameter, or \{UsersWebName\}
-This package has smell factor of **32**
+This package has smell factor of **34**
## <a name="TWiki::Form"></a> [[TWiki::Form|Main/TWikiFormDotPm]]
Handle conversion of plural topic names to singular form.
- This package has smell factor of *3*
+ This package doesn't smell
---++ [[TWikiPrefsDotPm][TWiki::Prefs]]
This module implements all the search functionality.
- This package has smell factor of *15*
+ This package has smell factor of *14*
---++ [[TWikiStoreDotPm][TWiki::Store]]
Search .txt files in $dir for $searchString. See RcsFile::searchInWebContent
for details.
- This package has smell factor of *1*
+ This package has smell factor of *3*
---++ [[TWikiStoreSearchAlgorithmsPurePerlDotPm][TWiki::Store::SearchAlgorithms::PurePerl]]
UI functions for web, topic and user management
- This package has smell factor of *5*
+ This package has smell factor of *4*
---++ [[TWikiUIOopsDotPm][TWiki::UI::Oops]]
The null prefix is reserver for the TWikiUserMapping for compatibility
with old TWiki releases.
- __Note:__ in all the following documentation, =$user= refers to a
+ __Note:__ in all the following documentation, =$cUID= refers to a
*canonical user id*.
This package has smell factor of *1*
This package has smell factor of *1*
+ ---++ [[TWikiUsersBaseUserMappingDotPm][TWiki::Users::BaseUserMapping]]
+
+ User mapping is the process by which TWiki maps from a username (a login name)
+ to a display name and back. It is also where groups are maintained.
+
+ The BaseMapper provides support for a small number of predefined users.
+ No registration - this is a read only usermapper. It uses the mapper
+ prefix 'BaseUserMapping_'.
+
+ ---++ Users
+ * TWikiAdmin - uses the password that was set in Configure (IF its not null)
+ * TWikiGuest
+ * UnknownUser
+ * TWikiContributor - 1 Jan 2005
+ * TWikiRegistrationAgent - 1 Jan 2005
+
+ ---+++ Groups
+ * $TWiki::cfg{SuperAdminGroup}
+ * TWikiBaseGroup
+
+ This package has smell factor of *2*
+
---++ [[TWikiUsersDotPm][TWiki::Users]]
This package provides services for the lookup and manipulation of login and
wiki names of users, and their authentication.
login name may have many emails.
*NOTE:*
- * wherever the code references $user, its a canonical_id
+ * wherever the code references $cUID, its a canonical_id
* wherever the code references $group, its a group_name
+ * $name may be a group or a cUID
This package has smell factor of *5*
This package doesn't smell
- There were a total of *192* smells
+ There were a total of *193* smells
<li><a href="#How TWiki evaluates ALLOW/DENY s"> How TWiki evaluates ALLOW/DENY settings</a></li>
</ul>
</li>
+ <li><a href="#Access control and INCLUDE"> Access control and INCLUDE</a></li>
<li><a href="#Access Control quick recipes"> Access Control quick recipes</a><ul>
<li><a href="#Obfuscating Webs"> Obfuscating Webs</a></li>
<li><a href="#Restrict Access to Whole TWiki S"> Restrict Access to Whole TWiki Site</a></li>
The same rules apply to ALLOWTOPICCHANGE/DENYTOPICCHANGE and APPLYTOPICRENAME/DENYTOPICRENAME. Setting ALLOWTOPICCHANGE or ALLOWTOPICRENAME to en empty value means the same as not defining it. Setting DENYTOPICCHANGE or DENYTOPICRENAME to an empty value means that anyone can edit or rename the topic.
-%X% _The setting to an empty has caused confusion and great debate and it has been decided that the empty setting syntax will be replaced by something which is easier to understand in the 4.2 version of TWiki. A method to upgrade will be provided. Please read the release notes carefully when you upgrade._
+%X% If the same setting is defined multiple times the last one overrides the previous. They are not OR'ed together.
+
+%X% _The setting to an empty has caused confusion and great debate and it has been decided that the empty setting syntax will be replaced by something which is easier to understand in a later version of TWiki. A method to upgrade will be provided. Please read the release notes carefully when you upgrade._
See "How TWiki evaluates ALLOW/DENY settings" below for more on how ALLOW and DENY interacts.
- everyone else will be **DENIED**
7. If you got this far, access is **PERMITTED**
+## <a name="Access control and INCLUDE"></a> Access control and INCLUDE
+
+ALLOWTOPICVIEW and ALLOWTOPICCHANGE only applies to the topic in which the settings are defined. If a topic A includes another topic B, topic A does not inherit the access rights of the included topic B.
+
+Examples: Topic A includes topic B
+
+- If the included topic B has ALLOWTOPICCHANGE set to block editing for a user, it does not prevent editing the including topic A.
+- If the included topic B has ALLOWTOPICVIEW set to block view for a user, the user can still view topic A but he cannot see the included topic B. He will see a message _No permission to view B_
+
## <a name="Access Control quick recipes"></a> Access Control quick recipes
### <a name="Obfuscating Webs"></a> Obfuscating Webs
### <a name="Hide Control Settings"></a> Hide Control Settings
-**_%T% Tip:_** To hide access control settings from normal browser viewing, you can put them into the topic-local settings. You can access those settings via the "More" screen, as explained in [[TWikiVariables|Main/TWikiVariables#Setting_Preferences_Variables]].
+**_%T% Tip:_** To hide access control settings from normal browser viewing, you can put them into the _topic preference settings_ by clicking the link `Edit topic preference settings` under `More topic actions` menu. Preferences set in this manner are not visible in the topic text, but take effect nevertheless. Access control settings added as topic preference settings are stored in the topic meta data and they override settings defined in the topic text.
Alternatively, place them in HTML comment markers, but this exposes the access setting during ordinary editing.
<td bgcolor="#ffffff" style=""><code>%ICON{group}%</code></td>
</tr>
<tr>
+ <td bgcolor="#ffffff" style=""><img alt="Active user" src="http://www.dementia.org/twiki//view/useractive.gif" title="Active user" /></td>
+ <td bgcolor="#ffffff" style=""><code>useractive.gif</code></td>
+ <td bgcolor="#ffffff" style=""> Active user </td>
+ <td bgcolor="#ffffff" style=""><code>%ICON{useractive}%</code></td>
+ </tr>
+ <tr>
+ <td bgcolor="#ffffff" style=""><img alt="Inactive user" src="http://www.dementia.org/twiki//view/userinactive.gif" title="Inactive user" /></td>
+ <td bgcolor="#ffffff" style=""><code>userinactive.gif</code></td>
+ <td bgcolor="#ffffff" style=""> Inactive user </td>
+ <td bgcolor="#ffffff" style=""><code>%ICON{userinactive}%</code></td>
+ </tr>
+ <tr>
<td bgcolor="#ffffff" style=""><img alt="Building" src="http://www.dementia.org/twiki//view/building.gif" title="Building" /></td>
<td bgcolor="#ffffff" style=""><code>building.gif</code></td>
<td bgcolor="#ffffff" style=""> Building </td>
<td bgcolor="#ffffff" style=""><code>%ICON{line_ur}%</code></td>
</tr>
<tr>
+ <td bgcolor="#ffffff" style=""><img alt="" src="http://www.dementia.org/twiki//view/line_ur_gray.gif" title="" /></td>
+ <td bgcolor="#ffffff" style=""><code>line_ur_gray.gif</code></td>
+ <td bgcolor="#ffffff" style=""> Line graph up-right, gray </td>
+ <td bgcolor="#ffffff" style=""><code>%ICON{line_ur_gray}%</code></td>
+ </tr>
+ <tr>
<td bgcolor="#ffffff" style=""><img alt="" src="http://www.dementia.org/twiki//view/dot_ld.gif" title="" /></td>
<td bgcolor="#ffffff" style=""><code>dot_ld.gif</code></td>
<td bgcolor="#ffffff" style=""> Dot graph left-down </td>
<td bgcolor="#ffffff" style=""> Empty transparent 16x16 spacer </td>
<td bgcolor="#ffffff" style=""><code>%ICON{empty}%</code></td>
</tr>
+ <tr>
+ <td bgcolor="#ffffff" style=""><img alt="" src="http://www.dementia.org/twiki//view/parent_gray.gif" title="" /></td>
+ <td bgcolor="#ffffff" style=""><code>parent_gray.gif</code></td>
+ <td bgcolor="#ffffff" style=""> Parent arrow </td>
+ <td bgcolor="#ffffff" style=""><code>%ICON{parent_gray}%</code></td>
+ </tr>
</table>
### <a name="Filetype icons"></a><a name=" Filetype icons"></a> <img src="http://www.dementia.org/twiki//view/Main/WebHome/gif.gif" width="16" height="16" alt="gif" /> Filetype icons
<td bgcolor="#ffffff" style=""><code>%ICON{as}%</code></td>
</tr>
<tr>
+ <td bgcolor="#ffffff" style=""><img alt="air" src="http://www.dementia.org/twiki//view/air.gif" title="air" /></td>
+ <td bgcolor="#ffffff" style=""><code>air.gif</code></td>
+ <td bgcolor="#ffffff" style=""> Adobe Air </td>
+ <td bgcolor="#ffffff" style=""><code>%ICON{air}%</code></td>
+ </tr>
+ <tr>
<td bgcolor="#ffffff" style=""><img alt="bat" src="http://www.dementia.org/twiki//view/bat.gif" title="bat" /></td>
<td bgcolor="#ffffff" style=""><code>bat.gif</code></td>
<td bgcolor="#ffffff" style=""> MS-DOS batch file </td>
<td bgcolor="#ffffff" style=""><code>%ICON{c}%</code></td>
</tr>
<tr>
+ <td bgcolor="#ffffff" style=""><img alt="css" src="http://www.dementia.org/twiki//view/css.gif" title="css" /></td>
+ <td bgcolor="#ffffff" style=""><code>css.gif</code></td>
+ <td bgcolor="#ffffff" style=""> Cascading Style Sheet file </td>
+ <td bgcolor="#ffffff" style=""><code>%ICON{css}%</code></td>
+ </tr>
+ <tr>
<td bgcolor="#ffffff" style=""><img alt="dll" src="http://www.dementia.org/twiki//view/dll.gif" title="dll" /></td>
<td bgcolor="#ffffff" style=""><code>dll.gif</code></td>
<td bgcolor="#ffffff" style=""> Dynamic Linked Library; Microsoft application file </td>
<li><a href="#get_CanonicalUserID( $user ) ->"> getCanonicalUserID( $user ) -> $cUID</a></li>
<li><a href="#get_WikiName( $user ) -> $wikiNa"> getWikiName( $user ) -> $wikiName</a></li>
<li><a href="#get_WikiUserName( $user ) -> $wi"> getWikiUserName( $user ) -> $wikiName</a></li>
- <li><a href="#wiki_ToUserName( $wikiName ) ->"> wikiToUserName( $wikiName ) -> $loginName</a></li>
+ <li><a href="#wiki_ToUserName( $id ) -> $login"> wikiToUserName( $id ) -> $loginName</a></li>
<li><a href="#user_ToWikiName( $loginName, $do"> userToWikiName( $loginName, $dontAddWeb ) -> $wikiName</a></li>
<li><a href="#email_ToWikiNames( $email, $dont"> emailToWikiNames( $email, $dontAddWeb ) -> @wikiNames</a></li>
- <li><a href="#wiki_NameToEmails( $wikiname ) -"> wikiNameToEmails( $wikiname ) -> @emails</a></li>
+ <li><a href="#wikiname_ToEmails( $user ) -> @e"> wikinameToEmails( $user ) -> @emails</a></li>
<li><a href="#isGuest( ) -> $boolean"> isGuest( ) -> $boolean</a></li>
- <li><a href="#is_AnAdmin( $login ) -> $boolean"> isAnAdmin( $login ) -> $boolean</a></li>
- <li><a href="#is_GroupMember( $group, $login )"> isGroupMember( $group, $login ) -> $boolean</a></li>
+ <li><a href="#is_AnAdmin( $id ) -> $boolean"> isAnAdmin( $id ) -> $boolean</a></li>
+ <li><a href="#is_GroupMember( $group, $id ) ->"> isGroupMember( $group, $id ) -> $boolean</a></li>
<li><a href="#eachUser() -> $iterator"> eachUser() -> $iterator</a></li>
- <li><a href="#eachMembership($wikiname) -> $it"> eachMembership($wikiname) -> $iterator</a></li>
+ <li><a href="#eachMembership($id) -> $iterator"> eachMembership($id) -> $iterator</a></li>
<li><a href="#eachGroup() -> $iterator"> eachGroup() -> $iterator</a></li>
<li><a href="#isGroup( $group ) -> $boolean"> isGroup( $group ) -> $boolean</a></li>
<li><a href="#each_GroupMember($group) -> $ite"> eachGroupMember($group) -> $iterator</a></li>
- <li><a href="#check_AccessPermission( $type, $"> checkAccessPermission( $type, $wikiName, $text, $topic, $web, $meta ) -> $boolean</a></li>
+ <li><a href="#check_AccessPermission( $type, $"> checkAccessPermission( $type, $id, $text, $topic, $web, $meta ) -> $boolean</a></li>
</ul>
</li>
<li><a href="#Webs, Topics and Attachments"> Webs, Topics and Attachments</a><ul>
### <a name="get_CanonicalUserID( $user ) - $"></a> getCanonicalUserID( $user ) -> $cUID
-Return the cUID of the specified user. A cUID is a unique identifier which is assigned by TWiki for each user. BEWARE: While the default [[TWikiUserMapping]] uses a cUID that looks like a user's [[LoginName]], some characters are modified to make them compatible with rcs. Additionally, other usermappings will use other conventions - the [[JoomlauserMapping]] for example, has cUIDs like 'JoomlaeUserMapping\_1234'.
+- `$user` can be a login, wikiname or web.wikiname
-If $user is undefined Get the cUID of logged in user, and will generally be 'BaseUserMapping\_666'
+Return the cUID of the specified user. A cUID is a unique identifier which is assigned by TWiki for each user. BEWARE: While the default [[TWikiUserMapping]] uses a cUID that looks like a user's [[LoginName]], some characters are modified to make them compatible with rcs. Other usermappings may use other conventions - the JoomlaUserMapping for example, has cUIDs like 'JoomlaeUserMapping\_1234'.
-- $user can be a cUID, login, wikiname or web.wikiname
+If $user is undefined, it assumes the currently logged-in user.
-Return: `$cUID` an internal unique and transportable escaped identifier for registered users (they can be autogenerated for an authenticated but unregistered user)
+Return: `$cUID`, an internal unique and portable escaped identifier for registered users. This may be autogenerated for an authenticated but unregistered user.
**Since:** TWiki::Plugins::VERSION 1.2
**Since:** TWiki::Plugins::VERSION 1.000 (7 Dec 2002)
-### <a name="wiki_ToUserName( $wikiName ) - $"></a> wikiToUserName( $wikiName ) -> $loginName
+### <a name="wiki_ToUserName( $id ) - $loginN"></a> wikiToUserName( $id ) -> $loginName
-Translate a Wiki name (or login name or cUID, if it can) to a login name.
+Translate a Wiki name to a login name.
-- `$wikiName` - Wiki name, e.g. `'Main.JohnDoe'` or `'JohnDoe'`
+- `$id` - Wiki name, e.g. `'Main.JohnDoe'` or `'JohnDoe'`. Since TWiki 4.2.1, $id may also be a login name. This will normally be transparent, but should be borne in mind if you have login names that are also legal wiki names.
Return: `$loginName` Login name of user, e.g. `'jdoe'`, or undef if not matched.
Translate a login name to a Wiki name
-- `$loginName` - Login name, e.g. `'jdoe'`
+- `$loginName` - Login name, e.g. `'jdoe'`. Since TWiki 4.2.1 this may also be a wiki name. This will normally be transparent, but may be relevant if you have login names that are also valid wiki names.
- `$dontAddWeb` - Do not add web prefix if `"1"`
Return: `$wikiName` Wiki name of user, e.g. `'Main.JohnDoe'` or `'JohnDoe'`
-userToWikiName will always return a name, if the user does not exist in the mapping, the $loginName parameter is returned. (backward compatibility)
+userToWikiName will always return a name. If the user does not exist in the mapping, the $loginName parameter is returned. (backward compatibility)
**Since:** TWiki::Plugins::VERSION 1.000 (7 Dec 2002)
**Since:** TWiki::Plugins::VERSION 1.2
-### <a name="wiki_NameToEmails( $wikiname ) -"></a> wikiNameToEmails( $wikiname ) -> @emails
+### <a name="wikiname_ToEmails( $user ) - @em"></a> wikinameToEmails( $user ) -> @emails
+
+- `$user` - wikiname of user to look up
-- `$wikiname` - wikiname of user to look up
+Returns the registered email addresses of the named user. If $user is undef, returns the registered email addresses for the logged-in user.
-Returns the registered email addresses of the named user. If $wikiname is undef, returns the registered email addresses for the logged-in user.
+Since TWiki 4.2.1, $user may also be a login name, or the name of a group.
**Since:** TWiki::Plugins::VERSION 1.2
**Since:** TWiki::Plugins::VERSION 1.000 (7 Dec 2002)
-### <a name="is_AnAdmin( $login ) - $boolean"></a> isAnAdmin( $login ) -> $boolean
+### <a name="is_AnAdmin( $id ) - $boolean"></a> isAnAdmin( $id ) -> $boolean
Find out if the user is an admin or not. If the user is not given, the currently logged-in user is assumed.
-- $login can be either a login, or a CUID
+- $id can be either a login name or a [[WikiName]]
**Since:** TWiki::Plugins::VERSION 1.2
-### <a name="is_GroupMember( $group, $login )"></a> isGroupMember( $group, $login ) -> $boolean
+### <a name="is_GroupMember( $group, $id ) -"></a><a name="is_GroupMember( $group, $id ) - "></a> isGroupMember( $group, $id ) -> $boolean
-Find out if $login is in the named group. e.g.
+Find out if $id is in the named group. e.g.
if( TWiki::Func::isGroupMember( "HesperionXXGroup", "jordi" )) {
...
If `$user` is `undef`, it defaults to the currently logged-in user.
-- $login can be a login name, or a cUID, or [[WikiName]]
+- $id can be a login name or a [[WikiName]]
**Since:** TWiki::Plugins::VERSION 1.2
**Since:** TWiki::Plugins::VERSION 1.2
-### <a name="eachMembership($wikiname) - $ite"></a> eachMembership($wikiname) -> $iterator
+### <a name="eachMembership($id) - $iterator"></a> eachMembership($id) -> $iterator
-Get an iterator over the names of all groups that the user is a member of. If `$wikiname` is `undef`, defaults to the currently logged-in user.
+- `$id` - [[WikiName]] or login name of the user. If `$id` is `undef`, defaults to the currently logged-in user.
+
+Get an iterator over the names of all groups that the user is a member of.
**Since:** TWiki::Plugins::VERSION 1.2
**Since:** TWiki::Plugins::VERSION 1.2
-### <a name="check_AccessPermission( $type, $"></a> checkAccessPermission( $type, $wikiName, $text, $topic, $web, $meta ) -> $boolean
+### <a name="check_AccessPermission( $type, $"></a> checkAccessPermission( $type, $id, $text, $topic, $web, $meta ) -> $boolean
Check access permission for a topic based on the [[%SYSTEMWEB%.TWikiAccessControl|SYSTEMWEB/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**.
+- `$id` - [[WikiName]] of remote user, required, e.g. `"PeterThoeny"`. From TWiki 4.2.1, $id may also be a login name. If `$id` 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,
A perl true result indicates that access is permitted.
-**Note** the wierd parameter order is due to compatibility constraints with earlier TWiki releases.
+**Note** the weird 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:
my $iterator = TWiki::Func::eachChangeSince(
$web, time() - 7 * 24 * 60 * 60); # the last 7 days
- while ($it->hasNext()) {
- my $change = $it->next();
+ while ($iterator->hasNext()) {
+ my $change = $iterator->next();
# $change is a perl hash that contains the following fields:
# topic => topic name
# user => wikiname - wikiname of user who made the change
<td> don't log this change in twiki log </td>
</tr>
<tr>
- <td><code>comment</code></td>
- <td> comment for save </td>
+ <td><code>forcenewrevision</code></td>
+ <td> force the save to increment the revision counter </td>
</tr>
<tr>
<td><code>minor</code></td>
my( $meta, $text ) = TWiki::Func::readTopic( $web, $topic )
$text =~ s/APPLE/ORANGE/g;
- TWiki::Func::saveTopic( $web, $topic, $meta, $text, { comment => 'refruited' } );
+ TWiki::Func::saveTopic( $web, $topic, $meta, $text, { forcenewrevision => 1 } );
**_Note:_** Plugins handlers ( e.g. `beforeSaveHandler` ) will be called as appropriate.
### <a name="wiki_ToEmail( $wikiName ) - $ema"></a> wikiToEmail( $wikiName ) -> $email
-- `$wikiName` - wiki name of the user
+- `$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
+**Deprecated** in favour of wikinameToEmails, because this function only returns a single email address, where a user may in fact have several.
+
+Since TWiki 4.2.1, $wikiName may also be a login name.
+
## <a name="Creating New Topics"></a> Creating New Topics
### <a name="expand_VariablesOnTopicCreation"></a><a name="expand_VariablesOnTopicCreation "></a> expandVariablesOnTopicCreation ( $text ) -> $text
<div>
<ul>
<li><a href="#Appendix A: TWiki Development Ti"> Appendix A: TWiki Development Time-line</a><ul>
- <li><a href="#TWiki Release 4.2 (Freetown), 22"> TWiki Release 4.2 (Freetown), 22 Jan 2008</a></li>
+ <li><a href="#TWiki Release 4.2.1 (Freetown) r"> TWiki Release 4.2.1 (Freetown) released 00:13:28 04 August 2008</a></li>
<li><a href="#TWiki Release 4.1 (Edinburgh), 1"> TWiki Release 4.1 (Edinburgh), 16 Jan 2007</a></li>
<li><a href="#TWiki Release 4.0.0 (Dakar), 01"> TWiki Release 4.0.0 (Dakar), 01 Feb 2006</a></li>
<li><a href="#01-Sep-2004 Release (Cairo)"> 01-Sep-2004 Release (Cairo)</a></li>
<a name="FreetownRelease"></a>
-## <a name="TWiki Release 4.2 (Freetown), 22"></a> TWiki Release 4.2 (Freetown), 22 Jan 2008
+## <a name="TWiki Release 4.2.1 (Freetown) r"></a> TWiki Release 4.2.1 (Freetown) released 00:13:28 04 August 2008
+
+Patch release following the 4.2.0 released 22 Jan 2008
**_New Features and Enhancements of TWiki Release 4.2_**
Many people have been involved in creating TWiki 4.2. Special thanks go to the most active contributors in the following areas:
- Release management led by TWiki:Main.KennethLavrsen, ably assisted by TWiki:Main.SvenDowideit
-- Design and development driven by TWiki:Main.CrawfordCurrie, TWiki:Main.ArthurClemens, and TWiki:Main.SvenDowideit
+- Design and development driven by TWiki:Main.CrawfordCurrie, TWiki:Main.ArthurClemens, [[KennethLavrsen]] and TWiki:Main.SvenDowideit
- Testing driven by TWiki:Main.KennethLavrsen
Many thanks also to the contributors in the following areas:
</tr>
<tr>
<td> Perl </td>
- <td> 5.8.4 or higher is recommended </td>
+ <td> 5.8.4 or higher is recommended. TWiki will run in perl 5.6.1 but only with Wysiwyg editor disabled. Wysiwyg requires unicode support which is provided by perl 5.8.1 and forward. </td>
</tr>
<tr>
<td> RCS </td>
<td> </td>
</tr>
<tr>
+ <td> CGI </td>
+ <td> Versions 2.89 and 3.37 must be avoided. Most version from 3.15 and onwards should work. </td>
+ </tr>
+ <tr>
<td> CGI::Carp </td>
<td> >=1.26 </td>
</tr>
- You may use the 'collaborate with TWiki' logo on a Web site that is powered by the TWiki collaboration platform.
- You may use the 'collaborate with TWiki' logo in product description and promotional material IF and ONLY IF such use can in no way be interpreted as anything other than an attribution. Using the TWiki name and artwork in a manner that implies endorsement of a product or service is not allowed.
-TWiki™, the TWiki logo and the "Collaborate with TWiki" tagline are a trademarks of TWiki:Main.PeterThoeny. The TWiki logo is Copyright 2005 by TWiki:Main.PeterThoeny, TWiki:Main.ArthurClemens and [[TWikiContributors]].
+TWiki<sup>®</sup> is a registered trademarks of TWiki founder [Peter Thoeny](http://twiki.org/cgi-bin/view/Main/PeterThoeny), [TWIKI.NET](http://twiki.net/). The TWiki logo and the "Collaborate with TWiki" tagline are trademarks of Peter Thoeny. The TWiki logo is Copyright 2005 by TWiki:Main.PeterThoeny, TWiki:Main.ArthurClemens and [[TWikiContributors]].
## <a name="Background and Feedback"></a> Background and Feedback
# <a name="TWiki Plugins"></a> TWiki Plugins
-_Add functionality to TWiki with readily available Plugins; create Plugins based on APIs_
+_Add functionality to TWiki with readily available plugins; create plugins based on APIs_
<div>
<ul>
## <a name="Overview"></a> Overview
-You can add Plugins to extend TWiki functionality, without altering the core code. A plug-in approach lets you:
+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.
+- 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.
+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.
+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:_**
## <a name="Installing Plugins"></a> 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.
+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.
+**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.
+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.
<a name="PreTesting"></a>
### <a name="On-Site Pretesting"></a> 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 satisfied that it won't compromise your main installation, you can install it there as well.
+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 satisfied 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 <code>[[%FAILEDPLUGINS%|Main/VarFAILEDPLUGINS]]</code> variable can be used to debug failures. You may also want to check your webserver error log and the various TWiki log files.
+[[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 <code>[[%FAILEDPLUGINS%|Main/VarFAILEDPLUGINS]]</code> variable can be used to debug failures. You may also want to check your webserver error log and the various TWiki log files.
### <a name="Some Notes on Plugin Performance"></a> 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:%BR% `time wget -qO /dev/null http://www.dementia.org/twiki/view/%SYSTEMWEB%/AbcPlugin`
+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:%BR% `time wget -qO /dev/null http://www.dementia.org/twiki/view/%SYSTEMWEB%/AbcPlugin`
-%T% 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.
+%T% 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 %USERSWEB%.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,
## <a name="Managing Installed Plugins"></a> 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:
+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:
### <a name="Enabling Plugins"></a> Enabling Plugins
-Plugins can be enabled and disabled with the [configure](http://www.dementia.org/twiki/configure) script. An installed Plugin needs to be enabled before it can be used.
+Plugins can be enabled and disabled with the [configure](http://www.dementia.org/twiki/configure) script. An installed plugin needs to be enabled before it can be used.
### <a name="Plugin Evaluation Order"></a> 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 spreadsheet CALCs. This can be done with `{PluginsOrder}` in the Plugins section of [configure](http://www.dementia.org/twiki/configure).
+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 spreadsheet CALCs. This can be done with `{PluginsOrder}` in the plugins section of [configure](http://www.dementia.org/twiki/configure).
### <a name="Plugin-Specific Settings"></a> Plugin-Specific Settings
-Plugins are usually configured by variables accessible though the [configure](http://www.dementia.org/twiki/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:
+Some plugins are configured with plugin preferences variables, newer plugins with configure variables.
-- Set SETTING = Create dynamic foo bar reports
+Configure variables are accessible though the [configure](http://www.dementia.org/twiki/configure) interface.
-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.
+Plugin preferences variables are defined in the plugin topic and can be overloaded. The SHORTDESCRIPTION preferences variable is always present, it is needed for the TWiki:Plugins repository on twiki.org. Example preferences variable defined in the [[TablePlugin]] topic:
+
+- `Set SHORTDESCRIPTION = Control attributes of tables and sorting of table columns`
+
+Preferences variables of active plugins can be retrieved anywhere in TWiki with `%<pluginname>_<var>%`, such as `%TABLEPLUGIN_SHORTDESCRIPTION%`. They can also be redefined with the `%<pluginname>_<var>%` setting at a lower level in the [[Main.TWikiPreferences|Main/TWikiPreferences]] or at the web level. For an easier upgrade it is recommended to customize plugin preferences variables in Main.TWikiPreferences only.
### <a name="Listing Active Plugins"></a> Listing Active Plugins
-Plugin status variables let you list all active Plugins wherever needed.
+Plugin status variables let you list all active plugins wherever needed.
-This site is running TWiki version **TWiki-4.1.2, Sat, 03 Mar 2007, build 13046**, Plugin API version **1\.11**
+This site is running TWiki version **TWiki-4.1.2, Sat, 03 Mar 2007, build 13046**, plugin API version **1\.11**
<a name="ActivatedPlugins"></a>
#### <a name="=%ACTIVATEDPLUGINS%="></a> `%ACTIVATEDPLUGINS%`
-On this TWiki site, the enabled Plugins are: [[SpreadSheetPlugin]], [[CommentPlugin]], [[EditTablePlugin]], [[InterwikiPlugin]], [[PreferencesPlugin]], [[SlideShowPlugin]], [[SmiliesPlugin]], [[TablePlugin]], [[TwistyPlugin]].
+On this TWiki site, the enabled plugins are: [[SpreadSheetPlugin]], [[CommentPlugin]], [[EditTablePlugin]], [[InterwikiPlugin]], [[PreferencesPlugin]], [[SlideShowPlugin]], [[SmiliesPlugin]], [[TablePlugin]], [[TwistyPlugin]].
#### <a name="=%PLUGINDESCRIPTIONS%="></a> `%PLUGINDESCRIPTIONS%`
## <a name="The TWiki Plugin API"></a> 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.
+The Application Programming Interface (API) for TWiki plugins provides the specifications for hooking into the core TWiki code from your external Perl plugin module.
### <a name="Available Core Functions"></a> 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.
+The [[TWikiFuncDotPm]] module (`lib/TWiki/Func.pm`) describes **all** the interfaces available to plugins. Plugins should **only** use the interfaces described in this module.
-**_%X% 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.
+**_%X% 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.
### <a name="Predefined Hooks"></a> 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.
+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.
### <a name="Hints on Writing Fast Plugins"></a> 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.
+- 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:%BR% `eval { require IPC::Run }` %BR% `return "<font color=\"red\">SamplePlugin: Can't load required modules ($@)</font>" if $@;`
- Keep the main plugin package as small as possible; create other packages that are loaded if and only if they are used. For example, create sub-packages of BathPlugin in `lib/TWiki/Plugins/BathPlugin/`.
- Avoid using preferences in the plugin topic; set `$NO_PREFS_IN_TOPIC` if you possibly can, as that will stop TWiki from reading the plugin topic for every page. Use [[Config.spec|Main/WebHome#ConfigSpec]] instead.
### <a name="Version Detection"></a> Version Detection
-To eliminate the incompatibility problems that are bound to arise from active open Plugin development, a Plugin versioning system is provided for automatic compatibility checking.
+To eliminate the incompatibility problems that are bound to arise from active open plugin development, a plugin versioning system is provided for automatic compatibility checking.
- All plugin packages require a `$VERSION` variable. This should be an integer, or a subversion version id.
- The `initPlugin` handler should check all dependencies and return 1 if the initialization is OK or 0 if something went wrong.
- - The Plugin initialization code does not register a Plugin that returns 0 (or that has no `initPlugin` handler).
+ - The plugin initialization code does not register a plugin that returns 0 (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 <code>[[%PLUGINVERSION{}%|Main/VarPLUGINVERSION]]</code> variable to query the Plugin API version or the version of installed Plugins.
+- `$TWiki::Plugins::VERSION` in the `TWiki::Plugins` module contains the TWiki plugin API version, currently **1\.11**.
+ - You can also use the <code>[[%PLUGINVERSION{}%|Main/VarPLUGINVERSION]]</code> variable to query the plugin API version or the version of installed plugins.
### <a name="Security"></a> 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
- - See TWiki:Plugins.MailInContrib for an example of this
+- 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.
+ - [[Integrating with configure|Main/WebHome#ConfigSpec]] describes the steps
+ - TWiki:Plugins.MailInContrib has an example
- TWiki:Plugins.BuildContrib can help you with this
- 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.
+- 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.
<a name="CreatePlugins"></a>
## <a name="Creating Plugins"></a> 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|Main/WebHome#PluginAPI]] Plugins by providing a programming interface for TWiki.
+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|Main/WebHome#PluginAPI]] provides the programming interface for TWiki.
### <a name="Anatomy of a Plugin"></a> Anatomy of a Plugin
-A (very) basic TWiki Plugin consists of two files:
+A (very) basic TWiki plugin consists of two files:
- a Perl module, e.g. `MyFirstPlugin.pm`
- a documentation topic, e.g. `MyFirstPlugin.txt`
-The Perl module can be a block of code that talks to 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 Perl module can be a block of code that talks to 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|Main/WebHome#PluginAPI]], you're ready to develop Plugins.
+The plugin API handles the details of connecting your Perl module with main TWiki code. When you're familiar with the [[Plugin API|Main/WebHome#PluginAPI]], you're ready to develop plugins.
-_The TWiki::Plugins.BuildContrib module provides a lot of support for plugins development, including a plugin creator, automatic publishing support, and automatic installation script writer. If you plan on writing more than one plugin, you probably need it_.
+_The TWiki:Plugins.BuildContrib module provides a lot of support for plugins development, including a plugin creator, automatic publishing support, and automatic installation script writer. If you plan on writing more than one plugin, you probably need it_.
### <a name="Creating the Perl Module"></a> 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|Main/WebHome#PluginAPI]] 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:
+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();
### <a name="Writing the Documentation Topic"></a> Writing the Documentation Topic
-The Plugin documentation topic contains usage instructions and version details. It serves the Plugin files as %SYSTEMWEB%.FileAttachments for downloading. (The doc topic is also included _in_ the [[distribution package|Main/WebHome#CreatePluginPackage]].) To create a documentation topic:
+The plugin documentation topic contains usage instructions and version details. It serves the plugin files as %SYSTEMWEB%.FileAttachments for downloading. (The doc topic is also included _in_ the [[distribution package|Main/WebHome#CreatePluginPackage]].) 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
+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 %SYSTEMWEB% 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/admin. This is important because links should work properly in a Plugin topic installed on any TWiki, not just on TWiki.org.
+ - 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/admin. 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|Main/WebHome#MeasurePerformance]]
-4. **Save** your topic, for use in [[packaging|Main/WebHome#CreatePluginPackage]] and [[publishing|Main/WebHome#PublishPlugin]] your Plugin.
+4. **Save** your topic, for use in [[packaging|Main/WebHome#CreatePluginPackage]] and [[publishing|Main/WebHome#PublishPlugin]] your plugin.
> **OUTLINE: Doc Topic Contents**
>
> <br />
>
-> Check the Plugins web on TWiki.org for the latest Plugin doc topic template. Here's a quick overview of what's covered:
+> 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!_>"
+> **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._>"
+> **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 %SYSTEMWEB%.TWikiPreferences and [[WebPreferences]]: six (6) spaces and then:_>"
> - **Set <_EXAMPLE = value added_>**
### <a name="Packaging for Distribution"></a> 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!
+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`).
+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:
+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:
+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`
### <a name="Measuring and Improving the Plug"></a> 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.
+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|Main/WebHome#FastPluginHints]].
### <a name="Publishing for Public Use"></a> 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.
+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:
+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`
+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|Main/WebHome#CreatePluginTopic]] 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)
+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)
-%N% Once you have done the above steps once, you can use the BuildContrib to upload updates to your Plugin.
+%N% 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 :-)
+Thank you very much for sharing your plugin with the TWiki community :-)
<a name="RecommendedStorageOfPluginData"></a>
## <a name="Recommended Storage of Plugin Sp"></a> 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.
+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.
### <a name="Plugin Internal Data"></a> Plugin Internal Data
-You can create a Plugin "work area" using the `TWiki::Func::getWorkArea()` function, which gives you a persistent 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.
+You can create a plugin "work area" using the `TWiki::Func::getWorkArea()` function, which gives you a persistent 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.
### <a name="Web Accessible Data"></a> Web Accessible Data
Recommendation for file name:
- Prefix the filename with an underscore (the leading underscore avoids a name clash with files attached to the same topic)
-- Identify where the attachment originated from, typically by including the Plugin name in the file name
+- 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`
+- Example: `_GaugePlugin_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.
+**_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:
+Recommendation for file names in plugin attachment area:
- Prefix the filename with an underscore
- Include the name of the web in the filename
`Config.spec` files are also used for other (non-plugin) extensions. in this case they are stored under the `Contrib` directory instead of the `Plugins` directory.
+TWiki:TWiki/SpecifyingConfigurationItemsForExtensions has supplemental documentation on configure settings.
+
<a name="MaintainPlugins"></a>
## <a name="Maintaining Plugins"></a> Maintaining Plugins
### <a name="Discussions and Feedback on Plug"></a> 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.
+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.
### <a name="Maintaining Compatibility with E"></a> 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.
+The plugin interface ([[TWikiFuncDotPm]] functions and plugin handlers) evolve over time. TWiki introduces new API functions to address the needs of plugin authors. Plugins using unofficial TWiki internal functions may no longer work on a TWiki upgrade.
-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 fulfilled if Plugins are maintained in a compatible manner.
+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 fulfilled if plugins are maintained in a compatible manner.
-**_%T% 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.
+**_%T% 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. Here is an example; the TWiki:TWiki.TWikiPluginsSupplement#MaintainPlugins has more details.
+
+ if( $TWiki::Plugins::VERSION >= 1.1 ) {
+ @webs = TWiki::Func::getListOfWebs( 'user,public' );
+ } else {
+ @webs = TWiki::Func::getPublicWebList( );
+ }
### <a name="Handling deprecated functions"></a> Handling deprecated functions
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.
**_Related Topics:_** [[DeveloperDocumentationCategory]], [[AdminDocumentationCategory]], TWiki:TWiki.TWikiPluginsSupplement
+
+-- **_Contributors:_** TWiki:Main.PeterThoeny, TWiki:Main.AndreaSterbini, TWiki:Main.MikeMannix, TWiki:Main.CrawfordCurrie, TWiki:Main.ArthurClemens, TWiki:Main.WillNorris
[[I18N]] - Only apply plural processing if site language is English, or if a built-in English-language web (Main, TWiki or Plugins). Plurals apply to names ending in 's', where topic doesn't exist with plural name.
-SMELL: this is highly langauge specific, and shoud be overridable on a per-installation basis.
+Note that this is highly langauge specific, and need to be enabled on a per-installation basis with $TWiki::cfg\{PluralToSingular\}.
<li><a href="#Miscellaneous Settings"> Miscellaneous Settings</a></li>
<li><a href="#Access Control Settings"> Access Control Settings</a></li>
<li><a href="#Creating New Preference Variable"> Creating New Preference Variables</a></li>
+ <li><a href="#Protected System Settings"> Protected System Settings</a></li>
<li><a href="#Related Topics"> Related Topics</a></li>
</ul>
</div>
### <a name="Legacy support"></a> Legacy support
- Support for legacy "EDITTOPIC", used to be hard-coded, now replaced by TMPL:P conditional instantiation
- - Set EDITURL = <http://www.dementia.org/twiki/edit/%WEB%/%TOPIC%?t=1277827703>
+ - Set EDITURL = <http://www.dementia.org/twiki/edit/%WEB%/%TOPIC%?t=1277827909>
- Set EDITTOPIC = [Edit](%EDITURL% Edit Topic - deprecated usage - please see release notes)
## <a name="Plugins Settings"></a> Plugins Settings
- %X% The sequential order of the preference settings is significant. Define preferences that use other preferences FIRST. For example, set <code>**WEBCOPYRIGHT**</code> before <code>**WIKIWEBMASTER**</code> since the copyright notice uses the TWiki administrator e-mail address.
- %X% In order to protect your custom variables from being overwritten when upgrading the [[%SYSTEMWEB%.%TOPIC%|SYSTEMWEB/TOPIC]] topic, it is recommended that custom variables are defined in [[%USERSWEB%.%TOPIC%|USERSWEB/TOPIC]].
+## <a name="Protected System Settings"></a> Protected System Settings
+
+The following settings are declared final to protect them as read only. These are system variables that should never be attempted set or altered in any preference topic or topic settings.
+
+- Set FINALPREFERENCES = WEB, TOPIC
+
## <a name="Related Topics"></a> Related Topics
- [[WebPreferences]] has preferences of the %WEB% web.
<option>Cyprus</option>
<option>Czech Republic</option>
<option>Denmark</option>
+ <option>Dominican Republic</option>
<option>Ecuador</option>
<option>Egypt</option>
<option>El Salvador</option>
<option>Switzerland</option>
<option>Syria</option>
<option>Taiwan</option>
+ <option>Tajikistan</option>
<option>Tanzania</option>
<option>Thailand</option>
- <option>Tajikistan</option>
+ <option>Trinidad and Tobago</option>
<option>Tunisia</option>
<option>Turkey</option>
<option>Turkmenistan</option>
-# <a name="TWiki Release 4.1.2 (Edinburgh),"></a><a name=" TWiki Release 4.1.2 (Edinburgh)"></a> TWiki Release 4.1.2 (Edinburgh), 04:18:52 22 January 2008
+# <a name="TWiki Release 4.1.2 (Edinburgh),"></a><a name=" TWiki Release 4.1.2 (Edinburgh)"></a> TWiki Release 4.1.2 (Edinburgh), 00:13:28 04 August 2008
_Note: This is the release note for the previous major release version 4.1.X. This note and the [[TWikiReleaseNotes04x00]] are included with 4.2.X because they contain valuable information for people upgrading from earlier versions. Both for the admin and the users. See [[TWikiReleaseNotes04x02]] for the 4.2.X release notes_
## <a name="TWiki 4.1.2 Patch Release Detail"></a> TWiki 4.1.2 Patch Release Details
-The 4.1.2 release was built from SVN <http://svn.twiki.org/svn/twiki/Patch04x01> revision 16278 (22 Jan 2008) (04:18:52 22 January 2008).
+The 4.1.2 release was built from SVN <http://svn.twiki.org/svn/twiki/Patch04x01> revision 17311 (04 Aug 2008) (00:13:28 04 August 2008).
TWiki 4.1.1 Fixes
-# <a name="TWiki Release 4.2.0 (Freetown),"></a><a name=" TWiki Release 4.2.0 (Freetown),"></a> TWiki Release 4.2.0 (Freetown), 04:18:52 22 January 2008
+# <a name="TWiki Release 4.2.1 (Freetown),"></a><a name=" TWiki Release 4.2.1 (Freetown),"></a> TWiki Release 4.2.1 (Freetown), 00:13:28 04 August 2008
<div>
<ul>
<li><a href="#Introduction"> Introduction</a></li>
<li><a href="#Pre-installed Extensions"> Pre-installed Extensions</a></li>
<li><a href="#New Features Highlights"> New Features Highlights</a></li>
+ <li><a href="#Important Changes since 4.2.0"> Important Changes since 4.2.0</a><ul>
+ <li><a href="#Perl 5.8 is now minimum requirem"> Perl 5.8 is now minimum requirement with Wysiwyg</a></li>
+ <li><a href="#TWiki now installs and works wit"> TWiki now installs and works with Perl 5.10.0.</a></li>
+ <li><a href="#The RCS files in subdirectories"> The RCS files in subdirectories feature removed</a></li>
+ <li><a href="#The Japanese language file has b"> The Japanese language file has been renamed</a></li>
+ <li><a href="#Highlights of bug fixes since 4."> Highlights of bug fixes since 4.2.0</a></li>
+ </ul>
+ </li>
<li><a href="#Important Changes since 4.1.2"> Important Changes since 4.1.2</a><ul>
<li><a href="#New WYSIWYG Editor"> New WYSIWYG Editor</a></li>
<li><a href="#NEWTOPICLINKSYMBOL removed"> NEWTOPICLINKSYMBOL removed</a></li>
<li><a href="#TWiki 4.2.0 Minor Release - Deta"> TWiki 4.2.0 Minor Release - Details</a></li>
<li><a href="#Fixes"> Fixes</a></li>
<li><a href="#Enhancements"> Enhancements</a></li>
+ <li><a href="#TWiki 4.2.1 Minor Release - Deta"> TWiki 4.2.1 Minor Release - Details</a></li>
+ <li><a href="#Fixes"> Fixes</a></li>
+ <li><a href="#Enhancements"> Enhancements</a></li>
</ul>
</div>
## <a name="Introduction"></a> Introduction
-TWiki Release 4.2.0 is a minor release. TWiki releases are either major (major new features and changes in architecture), minor (enhancements and bug fixes), or patch releases (bug fixes only) which can be installed as upgrades on production installations.
+TWiki 4.2.0 was released 22 Jan 2008 and introduced some hot new features that make TWiki a better user experience for both beginners and experienced application developers. It also contained quite a number of bugfixes since 4.1.2.
-TWiki Release 4.2.0 introduces some good enhancements and quite many bug fixes since 4.1.2.
+TWiki 4.2.1 is a patch release which only contains bug fixes. More than 150 bugs have been fixed since the release of 4.2.1 in all areas of TWiki.
-The development team has done everything to maintain full compatibility with topics generated in TWiki-4.0 and there are no changes to the topic format when using normal TWikiUserMapping
+It is highly recommended to upgrade TWiki 4.2.0 to 4.2.1. Users will find the 4.2.1 much more stable in daily use.
## <a name="Pre-installed Extensions"></a> Pre-installed Extensions
-TWiki 4.2.0 is shipped with
+TWiki 4.2.1 is shipped with
- **Plugins:** CommentPlugin, EditTablePlugin, EmptyPlugin, InterwikiPlugin, PreferencesPlugin, RenderListPlugin, SlideShowPlugin, SmiliesPlugin, SpreadSheetPlugin, TablePlugin, TinyMCEPlugin, TwistyPlugin, WysiwygPlugin
- **Contribs:** BehaviourContrib, JSCalendarContrib, MailerContrib, TipsContrib, TWikiUserMappingContrib, TwistyContrib
- Table of Content (TOC) feature enhanced
- User Mapping (mapping between login name and WikiName) code has been extended to allow pluggable modules to integrate with all sorts of alternative authentication and Management schemes. For normal cases you use the default TWikiUserMapping which is using the Main.TWikiUsers topic to map between login and WikiName. A new BaseUserMapping is provided for TWikis where you only have guests and an administrator. In this case you use the login and password given in configure to login as an admin.
+## <a name="Important Changes since 4.2.0"></a> Important Changes since 4.2.0
+
+### <a name="Perl 5.8 is now minimum requirem"></a> Perl 5.8 is now minimum requirement with Wysiwyg
+
+In TWiki 4.2.1 the support of international characters has been improved. Especially when using the Wysiwyg editor. This requires that perl internally works with unicode and that the Encode CPAN lib is installed. For this reason Perl 5.8.X is required for Wysiwyg support. TWiki will run with perl 5.6.1 if WysiwygPlugin is disabled.
+
+### <a name="TWiki now installs and works wit"></a> TWiki now installs and works with Perl 5.10.0.
+
+Newer distributions of Linux now ships with Perl 5.10.0. TWiki has been tested with Perl 5.10.0 and it should work fine. If the CGI library is version 3.37 you will need to update it to a newer version as the 3.37 contains some fatal bugs. Simply updating your perl using the standard update feature in your distribution may be enough to cure this problem.
+
+### <a name="The RCS files in subdirectories"></a><a name="The RCS files in subdirectories "></a> The RCS files in subdirectories feature removed
+
+The feature related to the config option TWiki::cfg\{RCS\}\{useSubDir\} has been removed. It never really worked and there are all sorts of issues related to it with respect to distribution of extensions and packaged applications, and it does not really add any performance advantages. So instead of trying to repair a bad feature that never really worked it was decided to remove it.
+
+The removal was announced in a news letter and in a proposal topic, and discussed at several release meetings, and noone objected against its removal.
+
+If you have run TWiki with this feature (maybe with a self implemented fix of the code) you will need to simply copy all the ,v files in all RCS directories to the directory above (where you find the .txt file or the attached filed) when you upgrade to 4.2.1.
+
+### <a name="The Japanese language file has b"></a> The Japanese language file has been renamed
+
+We decided to rename the locale/jp.po to locale/ja.po to match the rule that the file has the same name as the code for the locale.
+
+For those using the Japanese language file you need to do the following if you upgrade TWiki
+
+- Delete the old jp.po file
+- Delete the locale/languages.cache file (it gets recreated by TWiki first time it runs with language files)
+- Rename the entry `$TWiki::cfg{Languages}{jp}{Enabled} = 1;` in the lib/LocalSite.cfg to `$TWiki::cfg{Languages}{ja}{Enabled} = 1;`
+
+### <a name="Highlights of bug fixes since 4."></a> Highlights of bug fixes since 4.2.0
+
+- Much more stable Wysiwyg editor
+ - Better support for non-English characters
+ - Better handling of bullet points
+ - Pickaxe feature which enables quick swap between Wysiwyg and raw edit is more stable
+ - Attachment of files within Wysiwyg editor working better
+ - Linking feature fixed
+- More stable EditTablePlugin
+- Better support for UTF8 though UTF8 is still regarded as experimental and features such as wiki words do not work with non-english characters. UTF8 will be a good choice for languages such as Chinese, Japanese and Korean
+- Better support for non English charsets
+- Easier configuration of language settings in configure
+- Renaming of webs much improved
+- Compatibility with perl 5.10
+- Fixes related to mandatory fields in forms
+- Universal edit button with Firefox extension
+- Access controls using login ID instead of wikiname which was broken in 4.2.0 works again
+- Search features have had a few bugs fixed
+- Several bugs related to attaching files have been fixed
+- Some cross site scripting possibilities have been eliminated
+- Plugins that uses beforeAttachmentSaveHandler now works stable (e.g. BlackListPlugin)
+- The feature of having RCS files (the ,v file) in a separate directory never worked. Feature has now been removed as it really does not give any advantages.
+- User mapping feature improved to ensure 1:1 mapping between canonical user ID and login ID which is important for security
+
+See the full list of bug fixes at the bottom of this topic.
+
## <a name="Important Changes since 4.1.2"></a> Important Changes since 4.1.2
### <a name="New WYSIWYG Editor"></a> New WYSIWYG Editor
## <a name="TWiki 4.2.0 Minor Release - Deta"></a> TWiki 4.2.0 Minor Release - Details
-The 4.2.0 release was built from SVN <http://svn.twiki.org/svn/twiki/branches/TWikiRelease04x02> revision 16278 (22 Jan 2008).
+The 4.2.0 release was built from SVN <http://svn.twiki.org/svn/twiki/branches/TWikiRelease04x02> revision 17311 (04 Aug 2008).
## <a name="Fixes"></a> Fixes
</tr>
<tr>
<td>[[BUGS/Item5210]]</td>
- <td> EDITTABLE with a simple text input in which the user has put %BR% gets trunkated at the first BR </td>
+ <td> EDITTABLE with a simple text input in which the user has put %BR gets trunkated at the first BR </td>
</tr>
<tr>
<td>[[BUGS/Item5123]]</td>
</tr>
<tr>
<td>[[BUGS/Item4848]]</td>
- <td> TWiki:Plugins.EditTablePlugin textarea bug! </td>
+ <td> EditTablePlugin textarea bug! </td>
</tr>
<tr>
<td>[[BUGS/Item4846]]</td>
</tr>
<tr>
<td>[[BUGS/Item4432]]</td>
- <td align="right"> causes an internal server error </td>
+ <td> %VAR causes an internal server error </td>
</tr>
<tr>
<td>[[BUGS/Item4426]]</td>
</tr>
<tr>
<td>[[BUGS/Item4425]]</td>
- <td> Empty bullets get a <code><br /></code> tag. </td>
+ <td> Empty bullets get a br tag. </td>
</tr>
<tr>
<td>[[BUGS/Item4403]]</td>
</tr>
<tr>
<td>[[BUGS/Item3832]]</td>
- <td>[[Main/BracketLinks]] are not updated during page renames </td>
+ <td> bracket links are not updated during page renames </td>
</tr>
<tr>
<td>[[BUGS/Item3829]]</td>
</tr>
<tr>
<td>[[BUGS/Item3703]]</td>
- <td> in the size field of a form will crash the forms code </td>
+ <td> & nbsp; in the size field of a form will crash the forms code </td>
</tr>
<tr>
<td>[[BUGS/Item3690]]</td>
</tr>
</table>
+## <a name="TWiki 4.2.1 Minor Release - Deta"></a> TWiki 4.2.1 Minor Release - Details
+
+The 4.2.1 release was built from SVN <http://svn.twiki.org/svn/twiki/branches/TWikiRelease04x02> revision 17311 (04 Aug 2008).
+
+## <a name="Fixes"></a> Fixes
+
+<table border="1" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>[[BUGS/Item5876]]</td>
+ <td> Make query search ref more clear in VarSEARCH. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5873]]</td>
+ <td> REVINFO shows unknown user instead of the author value when it cannot map. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5868]]</td>
+ <td> ApacheHtpasswdUser compile error </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5866]]</td>
+ <td> shortcircuit TWiki::_processTags shortpath for 10-30% TWiki render speed improvement </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5854]]</td>
+ <td> Forking search result collation regex can cause many spurious log entries </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5850]]</td>
+ <td> ResetPassword/ChangePassword combo "Oops: we could not recognize you" </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5849]]</td>
+ <td> regex SEARCH on Native Windows crashes when there are [^] chars or mismatched "s in the regex. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5844]]</td>
+ <td> Automatic statistics denied by default server configuration </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5834]]</td>
+ <td> Edit in ClassicSkin with action=form still displays the text field for the topic </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5833]]</td>
+ <td> Double header in Classic skin when editing with action=text </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5832]]</td>
+ <td> EDITACTION only works on Edit but not Edit Raw </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5831]]</td>
+ <td> EDITACTION parameter does get replaced properly in the changeform templates if combined with setting EDITACTION </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5826]]</td>
+ <td> improved the security of the password generated for resetPassword </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5823]]</td>
+ <td> Adding MD5 Password Feature </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5819]]</td>
+ <td> Document that 4.2.1 with Wysiwyg will no longer work with Perl 5.6 </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5810]]</td>
+ <td> %IF in a set statement fails </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5808]]</td>
+ <td> TWiki.InstalledPlugins lists Contribs and AddOns but no Skins </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5798]]</td>
+ <td> urlHost field initialized too late in TWiki::new </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5796]]</td>
+ <td> SubscribePlugin and perl 5.8.4 exposes a taint issue in the latest MailerContrib </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5794]]</td>
+ <td> potential dataloss bug in EditTablePlugin 4.8.2 </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5790]]</td>
+ <td> LOCAL_SEARCH does expand nop'ed TML </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5789]]</td>
+ <td> don't rely on the author info being present in attachment meta data </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5787]]</td>
+ <td> square bracket url links don't escape their contents well enough </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5786]]</td>
+ <td> improve TemplateOopsAttentionNotFound message </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5776]]</td>
+ <td> MailerContrib cannot run multiple instances at the same time (document this fact) </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5772]]</td>
+ <td> base and current revisions reversed in diff URL of MailerContrib notify message </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5744]]</td>
+ <td> When renaming webs you get a File does not exist .. twiki_renamedelete.js </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5743]]</td>
+ <td> Easy to goof up web renaming because the default new webname includes subweb. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5741]]</td>
+ <td> REVTITLE isn't rendered except on rdiff </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5739]]</td>
+ <td> twiki_httpd_conf.txt is inconsistent in the paths it has as default. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5727]]</td>
+ <td> configure and perl 5.10 dies with Use of uninitialized value $filename in substitution (s///) at (eval 41) line 23 </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5726]]</td>
+ <td> Changing a form when the old form has mandatory fields which are empty causes bogus error </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5725]]</td>
+ <td> Editing in Classic skin gives missing Save and Cancel buttons </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5724]]</td>
+ <td> When you Edit Raw and then add form you end up in Wysiwyg edit mode </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5721]]</td>
+ <td> TinyMCE not honouring Template Topic in special cases. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5716]]</td>
+ <td> universal edit button work </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5711]]</td>
+ <td> Registration of Zyc ends in the end of TWiki users instead of the last entry in list of users </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5703]]</td>
+ <td> Putting setting with empty value in 'Topic Preference' interface does not work. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5701]]</td>
+ <td> tempatetopic not implemented as per the docco in TWikiScripts </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5690]]</td>
+ <td> Chinese is fail on newest TinyMCEPlugin / WysiwygPlugin </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5688]]</td>
+ <td> Documentation of eachChangeSince uses $iterator and $it </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5687]]</td>
+ <td> TWikiScripts docco for formtemplate is missing details. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5677]]</td>
+ <td> META tag does not show form field data in 4.2 </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5674]]</td>
+ <td> IF and Query have problems if some part of an evaluated statement is undef </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5668]]</td>
+ <td> twiki form Hidden Labels aren't being hidden in view mode. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5667]]</td>
+ <td> Named jp.po to ja.po to match locale. Fixed the translation of the word Japanese </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5656]]</td>
+ <td> CGI::charset called in BEGIN{} breaks mod_perl preloading of TWiki.pm </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5655]]</td>
+ <td> Query and IF info.version value is not compatible with the common external representation of topic revision </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5649]]</td>
+ <td> INCLUDE{"WebHome" section=""} returns nothing. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5648]]</td>
+ <td> LINKTOOLTIPINFO format cannot be changed </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5643]]</td>
+ <td> REVINFO with topic= set to a non-existant topic returns stupid values. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5638]]</td>
+ <td> readdir/closedir attempted on invalid dirhandle on perl-5.10 </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5636]]</td>
+ <td> Main Web preferences lists nonexistant topic in WEBFORM </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5633]]</td>
+ <td> Documentation mistakes in TWikiFuncDotPm/saveTopic </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5632]]</td>
+ <td> moveAttachment creates duplicates when topic/web are the same as the source </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5631]]</td>
+ <td> WebStatistics topic was linking to the massive TWikiDocumentation topic </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5630]]</td>
+ <td> spooling erra's in the WebNotify topics </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5629]]</td>
+ <td> registration email does not explicitly tell the user what their login is. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5627]]</td>
+ <td> Image and Attachment references are trashed when using short URLs </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5626]]</td>
+ <td> Encoding problem with iso-8859 and umlauts </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5622]]</td>
+ <td> Jumping text with blockindent on IE </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5620]]</td>
+ <td> Core: edit window no longer has focus on load </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5615]]</td>
+ <td> ActionTracker with CommentPlugin order Dependencies </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5612]]</td>
+ <td> Selecting "All Public Webs" option not sticking in UI </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5609]]</td>
+ <td> Bug in lib/TWiki/Prefs/PrefsCache.pm (CGI::H3 should be CGI::h3) </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5602]]</td>
+ <td> Web Rename not following ALLOWWEBRENAME Preference </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5601]]</td>
+ <td> registerHandler should be called once per registration </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5597]]</td>
+ <td> default skin search template is broken for webchanges </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5593]]</td>
+ <td> raw=on broken on topics with a view_template </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5588]]</td>
+ <td> INCLUDE of attached HTML files fails in subwebs </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5562]]</td>
+ <td> Query type Search does not report with large number of topics </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5559]]</td>
+ <td> TWikiJavascript does not enable partial js usage. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5556]]</td>
+ <td> it appears that BuildContrib defaults all unspecified permissions to 664? </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5554]]</td>
+ <td> Missuse of sort and loops </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5547]]</td>
+ <td> "action" parameter for "edit" script fail in 4.2 </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5542]]</td>
+ <td> After you enable {UserInterfaceInternationalisation} first view shows an error </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5540]]</td>
+ <td> TWikiUserMapping: single character erroneously reported as a group </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5536]]</td>
+ <td> robots.txt is missing some obvious scripts - like login </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5535]]</td>
+ <td> IF{"$BANNER" does not really work. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5534]]</td>
+ <td> missing contexts for several bin scripts </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5533]]</td>
+ <td> tmpl login script does not do writeCompletePage, so it does not get addToHEAD bits. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5529]]</td>
+ <td> SEARCHes of type word do not work if word is non-English and with TWiki running utf-8 </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5526]]</td>
+ <td> WebSearch link "Get notified on changes on this search" breaks when search string contains quote </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5518]]</td>
+ <td> "URLPARAM{" in Comment Box when type="bulletabove" </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5517]]</td>
+ <td> Wrong call $session->{i18n} </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5516]]</td>
+ <td> LanguageSelector javascript breaks on topic names with underscores </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5514]]</td>
+ <td> suppressTWikiSaveValidation and validateTWikiMandatoryFields Javascript errors in IE and Firefox </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5509]]</td>
+ <td> IF & query String matching may be incorrectly greedy. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5501]]</td>
+ <td> IF allows does not work correctly if the topic does not exist. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5499]]</td>
+ <td> TWiki::UI::Resister::changePassword sends login, not cUID to TWiki::Users::setPassword </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5495]]</td>
+ <td> add twikiBroadcastMessage class div to default & classic skins </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5491]]</td>
+ <td> FileAttachment documentation fix - {AutoAttachPubDir} should read {AutoAttachPubFiles} </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5490]]</td>
+ <td> %REVTITLE2% not substituted in RDiff.pm </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5478]]</td>
+ <td> Personal left bar is potentially buggy in layout </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5467]]</td>
+ <td> Pickaxe saves absolute URL instead of ATTACHURL </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5466]]</td>
+ <td> default and classic search.tmpl's have one table per topic result </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5462]]</td>
+ <td> Hide Attachment option does not work </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5461]]</td>
+ <td> default skin does not show the form attached to the topic. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5458]]</td>
+ <td> Rename web drop all link refer to the web </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5457]]</td>
+ <td> TinyMCE breaks Cyrillic Encoding (cp1251 or KOI8-R) </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5451]]</td>
+ <td> MailInContrib reveals error in Password.pm, that has been carried over to LdapContrib </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5450]]</td>
+ <td> MailInContrib docs refer to bin/mailincron but actually its in tools </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5449]]</td>
+ <td> TWiki::Sandbox::sysCommand leaves an extra process if command fails </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5447]]</td>
+ <td> If <code>manage</code> requires login, impossible to change password </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5443]]</td>
+ <td> Searches order="editby" are sorted by login ID (cUID) instead of WikiName making result look random </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5432]]</td>
+ <td> Image links inserted with Manage Attachment only work with lower case file extension </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5431]]</td>
+ <td> Register.pm redirects to TWikiUsers topic on error, even though that topic may not exist </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5430]]</td>
+ <td> reset password message has some errors </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5428]]</td>
+ <td> Topic save error with form does not remove nop </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5426]]</td>
+ <td> RSS feeds failing due to newlines at top of page. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5418]]</td>
+ <td> readme.txt refers to missing 'install instructions' TWikiDocumentation.html </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5412]]</td>
+ <td> "You are trying to templatetopic a topic that does not exist" makes no sense </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5410]]</td>
+ <td> WebSearchAdvanced does not regex search when you select that it should </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5405]]</td>
+ <td> TWikiHierarchicalNavigation seach broken </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5399]]</td>
+ <td> DISPLAYTIME documentation improved </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5393]]</td>
+ <td> Adding bullet right after a heading adds annoying html paragraph tags </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5387]]</td>
+ <td> Issue with multi-span rows and the EditRowPlugin / TablePlugin </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5382]]</td>
+ <td> TWiki.pm sets wrong urlHost if https protocol and ShorterUrlCookbook is used </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5348]]</td>
+ <td> Comment regarding FINALPREFERENCES should also mention subwebs. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5345]]</td>
+ <td> Logging in as admin still redirects to main home </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5344]]</td>
+ <td> PatternSkin small bug fixes and enhancements after 4.2 </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5343]]</td>
+ <td> Can't set parent to none anymore </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5339]]</td>
+ <td> Attachment uploaded by name not shown as TWiki link in 4.2 for attachments uploaded by TWiki 4.1.2 </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5324]]</td>
+ <td> Oops allows the template url parameter to pass through without filtering. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5316]]</td>
+ <td> PHP flag in pub-htaccess.txt is not working with PHP running as CGI </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5314]]</td>
+ <td> TinyMCE breaks Chinese, Japanese, Korean Unicode Encoding upon entering "Edit Twiki Markup" from WYSIWYG </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5311]]</td>
+ <td> deep recursion in getEmails() </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5307]]</td>
+ <td> Plugins with beforeAttachmentSaveHandler break file attachments with TWiki 4.2.0 </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5294]]</td>
+ <td> Wysywig & TinyMCE corrupt some topics. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5293]]</td>
+ <td> DATE in TWiki.pm to follow configured displaytime </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5288]]</td>
+ <td> META tag doesn't call expandStandardEscapes() and crashes (trunk only does not affect 4.2.1) </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5287]]</td>
+ <td> Linking is totally broken - in 4.2 WikiWord links do not work - in 4.1.2 buttons are disabled </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5284]]</td>
+ <td> You cannot paste into Wysiwyg in IE unless you are in Intranet security zone (documentation issue) </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5283]]</td>
+ <td> EditTablePlugin dollar percent expansion does not work well together with SpreadSheetPlugin </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5276]]</td>
+ <td> Link to Release Notes 4.1 in distribution documentation of 4.2.0 </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5258]]</td>
+ <td> Preview does not set ORIGINALREV and other values in edit.tmpl, so continuing from there has problems </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5257]]</td>
+ <td> TinyMCE pads bullets incl. "set" variables with trailing spaces breaking some plugins and TWiki apps. </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5232]]</td>
+ <td> Locales problem in WebNotify.pm and Subscibe.pmI </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5206]]</td>
+ <td> Image not shown , when inserting image with Image button and not using any path </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5182]]</td>
+ <td> "save" does not treat bad templatetopic as an error </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5176]]</td>
+ <td> %SCRIPTSUFFIX is added twice in TOC links </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5124]]</td>
+ <td> Registration confirmation should contain name, not WikiName </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5118]]</td>
+ <td> Difference from 4.1.2 - 4.2: Apache loginname no longer works with access control lists </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5116]]</td>
+ <td> WYSIWYG Line Returns Removed In Opera </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item5053]]</td>
+ <td> Dropdown in TinyMCE help text is confusing </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item4946]]</td>
+ <td> urlDecode() not working for characters represented by Unicode code points </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item4922]]</td>
+ <td> add the other meta field infos to the output of FORMFIELD{format=""} </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item4863]]</td>
+ <td> Removal of RcsDirs feature (was RcsWrap does not support RcsDirs) </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item4824]]</td>
+ <td> Security bug: TWiki's user management code needs rework again </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item4780]]</td>
+ <td> Twisty addToHEAD does not work in login template </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item4741]]</td>
+ <td> %META{"formfield" ....} does not expand </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item4289]]</td>
+ <td> Document effect if INCLUDE on access control settings </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item4288]]</td>
+ <td> Document what happens if access control set more than once </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item3824]]</td>
+ <td> Possible to hijack TOPIC or WEB variable making editing a topic with one of these defined impossible </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item3715]]</td>
+ <td> Simplify I18N configuration </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item3502]]</td>
+ <td> preview of a slideshow is corrupted </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item3048]]</td>
+ <td> Documented that CGI version 2.89 causes character entities to not be escaped in Raw View </td>
+ </tr>
+ <tr>
+ <td>[[BUGS/Item1861]]</td>
+ <td> Document EDITACTION </td>
+ </tr>
+</table>
+
+## <a name="Enhancements"></a> Enhancements
+
+None!
+
**_Related Topic:_** [[TWikiHistory]]
### <a name="=edit="></a> `edit`
-The `edit` scipt understands the following parameters, typically supplied by HTML input fields:
+The `edit` script understands the following parameters, typically supplied by HTML input fields:
<table border="1" cellpadding="0" cellspacing="0">
<tr>
</tr>
<tr>
<td><code>action</code></td>
- <td> 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. </td>
+ <td> 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. You can change the Edit/Edit Raw buttons to always append the action parameter in skins like Pattern and Classic by setting the topic or preference variable [[Main/VarEDITACTION]] to the value <code>text</code> or <code>form</code>. To edit the topic once the EDITACTION is defined as form simply remove the action=form from the browser URL of the edit script and reload the edit window </td>
<td> </td>
</tr>
<tr>
</tr>
<tr>
<td><code>templatetopic</code></td>
- <td> The name of the template topic, copied to get the initial content </td>
+ <td> The name of the template topic, copied to get the initial content (new topic <em>only</em>) </td>
<td> </td>
</tr>
<tr>
</tr>
<tr>
<td><code>formtemplate</code></td>
- <td> Name of the form to instantiate in the topic. Overrides the form set in the <code>templatetopic</code> if defined. </td>
+ <td> Name of the form to instantiate in the topic. Overrides the form set in the <code>templatetopic</code> if defined. (will remove the form is set to 'none') </td>
<td> </td>
</tr>
<tr>
</tr>
<tr>
<td><code>templatetopic</code></td>
- <td> Name of a topic to use as a template for the text and form </td>
+ <td> Name of a topic to use as a template for the text and form (new topic <em>only</em>) </td>
<td> </td>
</tr>
<tr>
</tr>
<tr>
<td><code>formtemplate</code></td>
- <td> if defined, use the named template for the form </td>
+ <td> if defined, use the named template for the form (will remove the form is set to 'none') </td>
<td> </td>
</tr>
<tr>
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 `templatetopic`, if it is defined, (new topic _only_)
- 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 `templatetopic`, if defined, (new topic _only_)
- 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 `templatetopic`, if defined, (new topic _only_)
- otherwise it is taken from the previous version of the topic, if any,
- otherwise it defaults to the empty string.
## <a name="Disclaimer"></a> Disclaimer
-- TWiki™, the TWiki logo and the "Collaborate with TWiki" tagline are trademarks of TWiki:Main.PeterThoeny - founder of TWiki.
-- TWiki is developed as Free Software under the [[GNU/GPL|Main/GnuGeneralPublicLicense]]
+- TWiki<sup>®</sup> is a registered trademarks of TWiki founder [Peter Thoeny](http://twiki.org/cgi-bin/view/Main/PeterThoeny), [TWIKI.NET](http://twiki.net/). The [[TWiki logo|Main/TWikiLogos]] and the "Collaborate with TWiki" tagline are trademarks of Peter Thoeny.
+- TWiki is developed as Free Software under the [[GNU/GPL|Main/GnuGeneralPublicLicense]].
- TWiki has its root in the GPLed JosWiki. Many thanks to Markus Peter and Dave Harris for creating JosWiki!
- TWiki's home address is <http://twiki.org/>
- The latest TWiki release is available from <http://twiki.org/download.html>
- This site is powered by TWiki version **TWiki-4.1.2, Sat, 03 Mar 2007, build 13046**
**_Related Topics:_** [[UserDocumentationCategory]]
+
+-- **_Contributors:_** TWiki:Main.MikeMannix, TWiki:Main.PeterThoeny
`twiki.tmpl` is a master template conventionally used by other templates, but not used directly by code.
-**_%X% 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.
+**_%X% Note:_** Make sure templates do not end with a newline. Any newline will expand to an empty `<p />` in the generated html. It will produce invalid html, and may break the page layout.
### <a name="Partial customisation, or adding"></a> Partial customisation, or adding in new features to an existing skin
## <a name="Template Topics"></a> Template Topics
-The second type of template in TWiki are template topics. Template topics define the default text for new topics. There are three types of template topic:
+The second type of template in TWiki are template topics. Template topics define the default text for new topics. There are four types of template topic:
<table border="1" cellpadding="0" cellspacing="0">
<tr>
<td>[[Main/WebTopicEditTemplate]]</td>
<td> Default text used in a new topic. </td>
</tr>
+ <tr>
+ <td> <MyCustomNamed>Template </td>
+ <td> Whenever you create a topic ending in the word "Template", it is automatically added to the list of available templates in the "Use Template" drop down field on the WebCreateNewTopic page. </td>
+ </tr>
</table>
When you create a new topic using the `edit` script, TWiki locates a topic to use as a content template according to the following search order:
</tr>
<tr>
<td align="right"> Contrib Version: </td>
- <td> 4.2.0 </td>
+ <td> 4.2.1 </td>
</tr>
<tr>
<td align="right"> Copyright: </td>
<td> </td>
</tr>
<tr>
+ <td align="right"> 4.2.1 </td>
+ <td> 03 Aug 2008 - Distributed with TWiki 4.2.1 </td>
+ </tr>
+ <tr>
+ <td align="right"> 4.2.0 </td>
+ <td> 22 Jan 2008 - Distributed with TWiki 4.2.0 </td>
+ </tr>
+ <tr>
<td align="right"> Dependencies: </td>
<td> None </td>
</tr>
The null prefix is reserver for the [[TWikiUserMapping]] for compatibility with old TWiki releases.
-**_Note:_** in all the following documentation, `$user` refers to a **canonical user id**.
+**_Note:_** in all the following documentation, `$cUID` refers to a **canonical user id**.
<div>
<ul>
<li><a href="#ObjectMethod *login_TemplateName"> ObjectMethod loginTemplateName <tt>() -> $templateFile</tt></a></li>
<li><a href="#ObjectMethod *supportsRegistrati"> ObjectMethod supportsRegistration <tt>() -> $boolean</tt></a></li>
<li><a href="#ObjectMethod <strong>handlesUser</strong> ($cUI"> ObjectMethod handlesUser <tt>($cUID,$login,$wikiname) -> $boolean</tt></a></li>
- <li><a href="#ObjectMethod *get_CanonicalUserI"> ObjectMethod getCanonicalUserID <tt>($login,$dontcheck) -> cUID</tt></a></li>
+ <li><a href="#ObjectMethod <strong>login2cUID</strong> ($logi"> ObjectMethod login2cUID <tt>($login,$dontcheck) -> cUID</tt></a></li>
<li><a href="#ObjectMethod <strong>get_LoginName</strong> ($c"> ObjectMethod getLoginName <tt>($cUID) -> login</tt></a></li>
- <li><a href="#ObjectMethod <strong>addUser</strong> ($login,$"> ObjectMethod addUser <tt>($login,$wikiname,$password,$emails) -> cUID</tt></a></li>
- <li><a href="#ObjectMethod <strong>removeUser</strong> ($user"> ObjectMethod removeUser <tt>($user) -> $boolean</tt></a></li>
- <li><a href="#ObjectMethod <strong>get_WikiName</strong> ($cU"> ObjectMethod getWikiName <tt>($cUID) -> wikiname</tt></a></li>
+ <li><a href="#ObjectMethod <strong>addUser</strong> ($login,$"> ObjectMethod addUser <tt>($login,$wikiname,$password,$emails) -> $cUID</tt></a></li>
+ <li><a href="#ObjectMethod <strong>removeUser</strong> ($cUID"> ObjectMethod removeUser <tt>($cUID) -> $boolean</tt></a></li>
+ <li><a href="#ObjectMethod <strong>get_WikiName</strong> ($cU"> ObjectMethod getWikiName <tt>($cUID) -> $wikiname</tt></a></li>
<li><a href="#ObjectMethod <strong>userExists</strong> ($cUID"> ObjectMethod userExists <tt>($cUID) -> $boolean</tt></a></li>
- <li><a href="#ObjectMethod <strong>eachUser</strong> () -> li"> ObjectMethod eachUser <tt>() -> listIteratorofcUIDs</tt></a></li>
+ <li><a href="#ObjectMethod <strong>eachUser</strong> () -> TW"> ObjectMethod eachUser <tt>() -> TWiki::ListIteratorofcUIDs</tt></a></li>
<li><a href="#ObjectMethod *each_GroupMember*"> ObjectMethod eachGroupMember <tt>($group) -> TWiki::ListIteratorofcUIDs</tt></a></li>
- <li><a href="#ObjectMethod <strong>isGroup</strong> ($user) -"> ObjectMethod isGroup <tt>($user) -> boolean</tt></a></li>
- <li><a href="#ObjectMethod <strong>eachGroup</strong> () ->"> ObjectMethod eachGroup <tt>() -> ListIteratorofgroupnames</tt></a></li>
- <li><a href="#ObjectMethod <strong>eachMembership</strong> ($"> ObjectMethod eachMembership <tt>($cUID) -> ListIteratorofgroupsthisuserisin</tt></a></li>
- <li><a href="#ObjectMethod <strong>isAdmin</strong> ($user) -"> ObjectMethod isAdmin <tt>($user) -> $boolean</tt></a></li>
- <li><a href="#ObjectMethod <strong>is_InGroup</strong> ($user"> ObjectMethod isInGroup <tt>($user,$group,$scanning) -> bool</tt></a></li>
+ <li><a href="#ObjectMethod <strong>isGroup</strong> ($name) -"> ObjectMethod isGroup <tt>($name) -> boolean</tt></a></li>
+ <li><a href="#ObjectMethod <strong>eachGroup</strong> () -> T"> ObjectMethod eachGroup <tt>() -> TWiki::ListIteratorofgroupnames</tt></a></li>
+ <li><a href="#ObjectMethod <strong>eachMembership</strong> ($"> ObjectMethod eachMembership <tt>($cUID) -> TWiki::ListIteratorofgroupsthisuserisin</tt></a></li>
+ <li><a href="#ObjectMethod <strong>isAdmin</strong> ($cUID) -"> ObjectMethod isAdmin <tt>($cUID) -> $boolean</tt></a></li>
+ <li><a href="#ObjectMethod <strong>is_InGroup</strong> ($cUID"> ObjectMethod isInGroup <tt>($cUID,$group) -> $bool</tt></a></li>
<li><a href="#ObjectMethod *find_UserByEmail*"> ObjectMethod findUserByEmail <tt>($email) -> \@users</tt></a></li>
- <li><a href="#ObjectMethod <strong>getEmails</strong> ($user)"> ObjectMethod getEmails <tt>($user) -> @emailAddress</tt></a></li>
- <li><a href="#ObjectMethod <strong>setEmails</strong> ($user,"> ObjectMethod setEmails <tt>($user,@emails)</tt></a></li>
+ <li><a href="#ObjectMethod <strong>getEmails</strong> ($name)"> ObjectMethod getEmails <tt>($name) -> @emailAddress</tt></a></li>
+ <li><a href="#ObjectMethod <strong>setEmails</strong> ($cUID,"> ObjectMethod setEmails <tt>($cUID,@emails)</tt></a></li>
<li><a href="#ObjectMethod *find_UserByWikiNam"> ObjectMethod findUserByWikiName <tt>($wikiname) -> listofcUIDsassociatedwiththatwikiname</tt></a></li>
- <li><a href="#ObjectMethod <strong>checkPassword</strong> ($u"> ObjectMethod checkPassword <tt>($userName,$passwordU) -> $boolean</tt></a></li>
- <li><a href="#ObjectMethod <strong>setPassword</strong> ($use"> ObjectMethod setPassword <tt>($user,$newPassU,$oldPassU) -> $boolean</tt></a></li>
+ <li><a href="#ObjectMethod <strong>checkPassword</strong> ($l"> ObjectMethod checkPassword <tt>($login,$passwordU) -> $boolean</tt></a></li>
+ <li><a href="#ObjectMethod <strong>setPassword</strong> ($cUI"> ObjectMethod setPassword <tt>($cUID,$newPassU,$oldPassU) -> $boolean</tt></a></li>
<li><a href="#ObjectMethod <strong>passwordError</strong> ()"> ObjectMethod passwordError <tt>() -> $string</tt></a></li>
- <li><a href="#ObjectMethod *ASSERT_IS_CANONICA"> ObjectMethod ASSERT_IS_CANONICAL_USER_ID <tt>($user_id) -> $boolean</tt></a></li>
- <li><a href="#ObjectMethod *ASSERT_IS_USER_LOG"> ObjectMethod ASSERT_IS_USER_LOGIN_ID <tt>($user_login) -> $boolean</tt></a></li>
- <li><a href="#ObjectMethod *ASSERT_IS_USER_DIS"> ObjectMethod ASSERT_IS_USER_DISPLAY_NAME <tt>($user_display) -> $boolean</tt></a></li>
</ul>
</li>
</ul>
Called by the TWiki::Users object to determine which loaded mapping to use for a given user (must be fast).
-Default is **false**
+The user can be identified by any of $cUID, $login or $wikiname. Any of these parameters may be undef, and they should be tested in order; cUID first, then login, then wikiname.
-## <a name="ObjectMethod <strong>get_CanonicalUserI"></a> [[ObjectMethod]] \*getCanonicalUserID `($login,$dontcheck) -> cUID`
+## <a name="ObjectMethod <strong>login2cUID</strong> ($logi"></a> [[ObjectMethod]] **login2cUID** `($login,$dontcheck) -> cUID`
-Convert a login name to the corresponding canonical user name. The canonical name can be any string of 7-bit alphanumeric and underscore characters, and must correspond 1:1 to the login name. (undef on failure)
+Convert a login name to the corresponding canonical user name. The canonical name can be any string of 7-bit alphanumeric and underscore characters, and must map 1:1 to the login name. (undef on failure)
-(if dontcheck is true, return a cUID for a nonexistant user too - used for registration)
+(if $dontcheck is true, return a cUID for a nonexistant user too. This is used for registration)
Subclasses **must** implement this method.
+Note: This method was previously (in TWiki 4.2.0) known as getCanonicalUserID. The name was changed to avoid confusion with TWiki::Users::getCanonicalUserID, which has a more generic function. However to support older user mappers, getCanonicalUserID will still be called if login2cUID is not defined.
+
## <a name="ObjectMethod <strong>get_LoginName</strong> ($c"></a> [[ObjectMethod]] **getLoginName** `($cUID) -> login`
Converts an internal cUID to that user's login (undef on failure)
Subclasses **must** implement this method.
-## <a name="ObjectMethod <strong>addUser</strong> ($login,$"></a> [[ObjectMethod]] **addUser** `($login,$wikiname,$password,$emails) -> cUID`
+## <a name="ObjectMethod <strong>addUser</strong> ($login,$"></a> [[ObjectMethod]] **addUser** `($login,$wikiname,$password,$emails) -> $cUID`
-Add a user to the persistant mapping that maps from usernames to wikinames and vice-versa, via a **canonical user id** (cUID).
+Add a user to the persistant mapping that maps from usernames to wikinames and vice-versa.
$login and $wikiname must be acceptable to $TWiki::cfg\{NameFilter\}. $login must **always** be specified. $wikiname may be undef, in which case the user mapper should make one up.
Throws an Error::Simple if user adding is not supported (the default).
-## <a name="ObjectMethod <strong>removeUser</strong> ($user"></a> [[ObjectMethod]] **removeUser** `($user) -> $boolean`
+## <a name="ObjectMethod <strong>removeUser</strong> ($cUID"></a> [[ObjectMethod]] **removeUser** `($cUID) -> $boolean`
Delete the users entry from this mapper. Throws an Error::Simple if user removal is not supported (the default).
-## <a name="ObjectMethod <strong>get_WikiName</strong> ($cU"></a> [[ObjectMethod]] **getWikiName** `($cUID) -> wikiname`
+## <a name="ObjectMethod <strong>get_WikiName</strong> ($cU"></a> [[ObjectMethod]] **getWikiName** `($cUID) -> $wikiname`
Map a canonical user name to a wikiname.
Subclasses **must** implement this method.
-## <a name="ObjectMethod <strong>eachUser</strong> () - lis"></a> [[ObjectMethod]] **eachUser** `() -> listIteratorofcUIDs`
+## <a name="ObjectMethod <strong>eachUser</strong> () - TWi"></a> [[ObjectMethod]] **eachUser** `() -> TWiki::ListIteratorofcUIDs`
-Called from TWiki::Users. See the documentation of the corresponding method in that module for details.
+Get an iterator over the list of all the registered users **not** including groups.
Subclasses **must** implement this method.
## <a name="ObjectMethod <strong>each_GroupMember*"></a><a name="ObjectMethod *each_GroupMember</strong> "></a> [[ObjectMethod]] **eachGroupMember** `($group) -> TWiki::ListIteratorofcUIDs`
-Called from TWiki::Users. See the documentation of the corresponding method in that module for details.
+Return a iterator over the canonical user ids of users that are members of this group. Should only be called on groups.
+
+Note that groups may be defined recursively, so a group may contain other groups. This method should **only** return users i.e. all contained groups should be fully expanded.
Subclasses **must** implement this method.
-## <a name="ObjectMethod <strong>isGroup</strong> ($user) -"></a> [[ObjectMethod]] **isGroup** `($user) -> boolean`
+## <a name="ObjectMethod <strong>isGroup</strong> ($name) -"></a> [[ObjectMethod]] **isGroup** `($name) -> boolean`
-Called from TWiki::Users. See the documentation of the corresponding method in that module for details.
+Establish if a user refers to a group or not. If $name is not a group name it will probably be a canonical user id, though that should not be assumed.
Subclasses **must** implement this method.
-## <a name="ObjectMethod <strong>eachGroup</strong> () - _L"></a> [[ObjectMethod]] **eachGroup** <tt>() -> [[ListIteratorofgroupnames]]</tt>
+## <a name="ObjectMethod <strong>eachGroup</strong> () - TW"></a> [[ObjectMethod]] **eachGroup** `() -> TWiki::ListIteratorofgroupnames`
-Called from TWiki::Users. See the documentation of the corresponding method in that module for details.
+Get an iterator over the list of all the groups.
Subclasses **must** implement this method.
-## <a name="ObjectMethod <strong>eachMembership</strong> ($"></a> [[ObjectMethod]] **eachMembership** <tt>($cUID) -> [[ListIteratorofgroupsthisuserisin]]</tt>
+## <a name="ObjectMethod <strong>eachMembership</strong> ($"></a> [[ObjectMethod]] **eachMembership** `($cUID) -> TWiki::ListIteratorofgroupsthisuserisin`
-Called from TWiki::Users. See the documentation of the corresponding method in that module for details.
+Return an iterator over the names of groups that $cUID is a member of.
Subclasses **must** implement this method.
-## <a name="ObjectMethod <strong>isAdmin</strong> ($user) -"></a> [[ObjectMethod]] **isAdmin** `($user) -> $boolean`
-
-True if the user is an administrator. Default is **false**
+## <a name="ObjectMethod <strong>isAdmin</strong> ($cUID) -"></a> [[ObjectMethod]] **isAdmin** `($cUID) -> $boolean`
-## <a name="ObjectMethod <strong>is_InGroup</strong> ($user"></a> [[ObjectMethod]] **isInGroup** `($user,$group,$scanning) -> bool`
+True if the user is an administrator.
-Called from TWiki::Users. See the documentation of the corresponding method in that module for details.
+## <a name="ObjectMethod <strong>is_InGroup</strong> ($cUID"></a> [[ObjectMethod]] **isInGroup** `($cUID,$group) -> $bool`
-Default is **false**
+Test if the user identified by $cUID is in the given group. The default implementation iterates over all the members of $group, which is rather inefficient.
## <a name="ObjectMethod <strong>find_UserByEmail*"></a><a name="ObjectMethod *find_UserByEmail</strong> "></a> [[ObjectMethod]] **findUserByEmail** `($email) -> \@users`
Return a list of canonical user names for the users that have this email registered with the password manager or the user mapping manager.
-Returns an empty list by default.
-
-## <a name="ObjectMethod <strong>getEmails</strong> ($user)"></a> [[ObjectMethod]] **getEmails** `($user) -> @emailAddress`
+## <a name="ObjectMethod <strong>getEmails</strong> ($name)"></a> [[ObjectMethod]] **getEmails** `($name) -> @emailAddress`
-If this is a user, return their email addresses. If it is a group, return the addresses of everyone in the group.
+If $name is a cUID, return that user's email addresses. If it is a group, return the addresses of everyone in the group.
Duplicates should be removed from the list.
-By default, returns the empty list.
+## <a name="ObjectMethod <strong>setEmails</strong> ($cUID,"></a> [[ObjectMethod]] **setEmails** `($cUID,@emails)`
-## <a name="ObjectMethod <strong>setEmails</strong> ($user,"></a> [[ObjectMethod]] **setEmails** `($user,@emails)`
-
-Set the email address(es) for the given user. Does nothing by default.
+Set the email address(es) for the given user.
## <a name="ObjectMethod <strong>find_UserByWikiNam"></a> [[ObjectMethod]] \*findUserByWikiName `($wikiname) -> listofcUIDsassociatedwiththatwikiname`
-Called from TWiki::Users. See the documentation of the corresponding method in that module for details.
+- `$wikiname` - wikiname to look up
+
+Return a list of canonical user names for the users that have this wikiname. Since a single wikiname might be used by multiple login ids, we need a list.
+
+Note that if $wikiname is the name of a group, the group will **not** be expanded.
Subclasses **must** implement this method.
-## <a name="ObjectMethod <strong>checkPassword</strong> ($u"></a> [[ObjectMethod]] **checkPassword** `($userName,$passwordU) -> $boolean`
+## <a name="ObjectMethod <strong>checkPassword</strong> ($l"></a> [[ObjectMethod]] **checkPassword** `($login,$passwordU) -> $boolean`
-Finds if the password is valid for the given user.
+Finds if the password is valid for the given login. This is called using a login name rather than a cUID because the user may not have been mapped at the time it is called.
Returns 1 on success, undef on failure.
Default behaviour is to return 1.
-## <a name="ObjectMethod <strong>setPassword</strong> ($use"></a> [[ObjectMethod]] **setPassword** `($user,$newPassU,$oldPassU) -> $boolean`
+## <a name="ObjectMethod <strong>setPassword</strong> ($cUI"></a> [[ObjectMethod]] **setPassword** `($cUID,$newPassU,$oldPassU) -> $boolean`
If the $oldPassU matches matches the user's password, then it will replace it with $newPassU.
Returns a string indicating the error that happened in the password handlers TODO: these delayed errors should be replaced with Exceptions.
-returns undef if no error 9the default)
-
-## <a name="ObjectMethod <strong>ASSERT_IS_CANONICA"></a> [[ObjectMethod]] \*ASSERT\_IS\_CANONICAL\_USER\_ID `($user_id) -> $boolean`
-
-Used for debugging to ensure we are actually passing a canonical\_id
-
-## <a name="ObjectMethod <strong>ASSERT_IS_USER_LOG"></a> [[ObjectMethod]] \*ASSERT\_IS\_USER\_LOGIN\_ID `($user_login) -> $boolean`
-
-Used for debugging to ensure we are actually passing a user login
-
-## <a name="ObjectMethod <strong>ASSERT_IS_USER_DIS"></a> [[ObjectMethod]] \*ASSERT\_IS\_USER\_DISPLAY\_NAME `($user_display) -> $boolean`
-
-Used for debugging to ensure we are actually passing a user display\_name (commonly a [[WikiWord]] Name)
-
-Returns true by default.
+returns undef if no error (the default)
--- /dev/null
+# <a name="Package <code>TWiki::Users::_BaseUser"></a> Package =TWiki::Users::BaseUserMapping
+
+User mapping is the process by which TWiki maps from a username (a login name) to a display name and back. It is also where groups are maintained.
+
+The [[BaseMapper]] provides support for a small number of predefined users. No registration - this is a read only usermapper. It uses the mapper prefix 'BaseUserMapping\_'.
+
+## <a name="Users"></a> Users
+
+- [[TWikiAdmin]] - uses the password that was set in Configure (IF its not null)
+- [[TWikiGuest]]
+- [[UnknownUser]]
+- [[TWikiContributor]] - 1 Jan 2005
+- [[TWikiRegistrationAgent]] - 1 Jan 2005
+
+### <a name="Groups"></a> Groups
+
+- $TWiki::cfg\{SuperAdminGroup\}
+- [[TWikiBaseGroup]]
+
+<div>
+ <ul>
+ <li><a href="#Package =TWiki::Users::_BaseUser"> Package TWiki::Users::BaseUserMapping</a><ul>
+ <li><a href="#Users"> Users</a><ul>
+ <li><a href="#Groups"> Groups</a></li>
+ </ul>
+ </li>
+ <li><a href="#ClassMethod <strong>new</strong> ($session)"> ClassMethod new <tt>($session)</tt></a></li>
+ <li><a href="#ObjectMethod <strong>finish</strong> ()"> ObjectMethod finish <tt>()</tt></a></li>
+ <li><a href="#ObjectMethod *login_TemplateName"> ObjectMethod loginTemplateName <tt>() -> templateFile</tt></a></li>
+ <li><a href="#ObjectMethod <strong>handlesUser</strong> ($cUI"> ObjectMethod handlesUser <tt>($cUID,$login,$wikiname) -> $boolean</tt></a></li>
+ <li><a href="#ObjectMethod <strong>login2cUID</strong> ($logi"> ObjectMethod login2cUID <tt>($login) -> $cUID</tt></a></li>
+ <li><a href="#ObjectMethod <strong>get_LoginName</strong> ($c"> ObjectMethod getLoginName <tt>($cUID) -> login</tt></a></li>
+ <li><a href="#ObjectMethod <strong>get_WikiName</strong> ($cU"> ObjectMethod getWikiName <tt>($cUID) -> wikiname</tt></a></li>
+ <li><a href="#ObjectMethod <strong>userExists</strong> ($user"> ObjectMethod userExists <tt>($user) -> $boolean</tt></a></li>
+ <li><a href="#ObjectMethod <strong>eachUser</strong> () -> li"> ObjectMethod eachUser <tt>() -> listIteratorofcUIDs</tt></a></li>
+ <li><a href="#ObjectMethod *each_GroupMember*"> ObjectMethod eachGroupMember <tt>($group) -> listIteratorofcUIDs</tt></a></li>
+ <li><a href="#ObjectMethod <strong>isGroup</strong> ($name) -"> ObjectMethod isGroup <tt>($name) -> boolean</tt></a></li>
+ <li><a href="#ObjectMethod <strong>eachGroup</strong> () ->"> ObjectMethod eachGroup <tt>() -> ListIteratorofgroupnames</tt></a></li>
+ <li><a href="#ObjectMethod <strong>eachMembership</strong> ($"> ObjectMethod eachMembership <tt>($cUID) -> ListIteratorofgroupsthisuserisin</tt></a></li>
+ <li><a href="#ObjectMethod <strong>isAdmin</strong> ($cUID) -"> ObjectMethod isAdmin <tt>($cUID) -> $boolean</tt></a></li>
+ <li><a href="#ObjectMethod <strong>getEmails</strong> ($name)"> ObjectMethod getEmails <tt>($name) -> @emailAddress</tt></a></li>
+ <li><a href="#ObjectMethod *find_UserByWikiNam"> ObjectMethod findUserByWikiName <tt>($wikiname) -> listofcUIDsassociatedwiththatwikiname</tt></a></li>
+ <li><a href="#ObjectMethod <strong>checkPassword</strong> ($l"> ObjectMethod checkPassword <tt>($login,$passwordU) -> $boolean</tt></a></li>
+ <li><a href="#ObjectMethod <strong>setPassword</strong> ($cUI"> ObjectMethod setPassword <tt>($cUID,$newPassU,$oldPassU) -> $boolean</tt></a></li>
+ <li><a href="#ObjectMethod <strong>passwordError</strong> ()"> ObjectMethod passwordError <tt>() -> $string</tt></a></li>
+ </ul>
+ </li>
+ </ul>
+</div>
+
+## <a name="ClassMethod <strong>new</strong> ($session)"></a> [[ClassMethod]] **new** `($session)`
+
+Construct the [[BaseUserMapping]] object
+
+## <a name="ObjectMethod <strong>finish</strong> ()"></a> [[ObjectMethod]] **finish** `()`
+
+Break circular references.
+
+## <a name="ObjectMethod <strong>login_TemplateName"></a> [[ObjectMethod]] \*loginTemplateName `() -> templateFile`
+
+allows [[UserMappings]] to come with customised login screens - that should preffereably only over-ride the UI function
+
+## <a name="ObjectMethod <strong>handlesUser</strong> ($cUI"></a> [[ObjectMethod]] **handlesUser** `($cUID,$login,$wikiname) -> $boolean`
+
+See baseclass for documentation.
+
+In the [[BaseUserMapping]] case, we know all the details of the users we specialise in.
+
+## <a name="ObjectMethod <strong>login2cUID</strong> ($logi"></a> [[ObjectMethod]] **login2cUID** `($login) -> $cUID`
+
+Convert a login name to the corresponding canonical user name. The canonical name can be any string of 7-bit alphanumeric and underscore characters, and must correspond 1:1 to the login name. (undef on failure)
+
+## <a name="ObjectMethod <strong>get_LoginName</strong> ($c"></a> [[ObjectMethod]] **getLoginName** `($cUID) -> login`
+
+converts an internal cUID to that user's login (undef on failure)
+
+## <a name="ObjectMethod <strong>get_WikiName</strong> ($cU"></a> [[ObjectMethod]] **getWikiName** `($cUID) -> wikiname`
+
+Map a canonical user name to a wikiname
+
+## <a name="ObjectMethod <strong>userExists</strong> ($user"></a> [[ObjectMethod]] **userExists** `($user) -> $boolean`
+
+Determine if the user already exists or not.
+
+## <a name="ObjectMethod <strong>eachUser</strong> () - lis"></a> [[ObjectMethod]] **eachUser** `() -> listIteratorofcUIDs`
+
+See baseclass for documentation.
+
+## <a name="ObjectMethod <strong>each_GroupMember*"></a><a name="ObjectMethod *each_GroupMember</strong> "></a> [[ObjectMethod]] **eachGroupMember** `($group) -> listIteratorofcUIDs`
+
+See baseclass for documentation.
+
+The basemapper implementation assumes that there are no nested groups in the basemapper.
+
+## <a name="ObjectMethod <strong>isGroup</strong> ($name) -"></a> [[ObjectMethod]] **isGroup** `($name) -> boolean`
+
+See baseclass for documentation.
+
+## <a name="ObjectMethod <strong>eachGroup</strong> () - _L"></a> [[ObjectMethod]] **eachGroup** <tt>() -> [[ListIteratorofgroupnames]]</tt>
+
+See baseclass for documentation.
+
+## <a name="ObjectMethod <strong>eachMembership</strong> ($"></a> [[ObjectMethod]] **eachMembership** <tt>($cUID) -> [[ListIteratorofgroupsthisuserisin]]</tt>
+
+See baseclass for documentation.
+
+## <a name="ObjectMethod <strong>isAdmin</strong> ($cUID) -"></a> [[ObjectMethod]] **isAdmin** `($cUID) -> $boolean`
+
+True if the user is an admin
+
+- is a member of the $TWiki::cfg\{SuperAdminGroup\}
+
+## <a name="ObjectMethod <strong>getEmails</strong> ($name)"></a> [[ObjectMethod]] **getEmails** `($name) -> @emailAddress`
+
+If $name is a cUID, return their email addresses. If it is a group, return the addresses of everyone in the group.
+
+## <a name="ObjectMethod <strong>find_UserByWikiNam"></a> [[ObjectMethod]] \*findUserByWikiName `($wikiname) -> listofcUIDsassociatedwiththatwikiname`
+
+See baseclass for documentation.
+
+## <a name="ObjectMethod <strong>checkPassword</strong> ($l"></a> [[ObjectMethod]] **checkPassword** `($login,$passwordU) -> $boolean`
+
+Finds if the password is valid for the given user.
+
+Returns 1 on success, undef on failure.
+
+## <a name="ObjectMethod <strong>setPassword</strong> ($cUI"></a> [[ObjectMethod]] **setPassword** `($cUID,$newPassU,$oldPassU) -> $boolean`
+
+If the $oldPassU matches matches the user's password, then it will replace it with $newPassU.
+
+If $oldPassU is not correct and not 1, will return 0.
+
+If $oldPassU is 1, will force the change irrespective of the existing password, adding the user if necessary.
+
+Otherwise returns 1 on success, undef on failure.
+
+## <a name="ObjectMethod <strong>passwordError</strong> ()"></a><a name="ObjectMethod <strong>passwordError</strong> () "></a> [[ObjectMethod]] **passwordError** `() -> $string`
+
+returns a string indicating the error that happened in the password handlers TODO: these delayed error's should be replaced with Exceptions.
+
+returns undef if no error
**NOTE:**
-- wherever the code references $user, its a canonical\_id
+- wherever the code references $cUID, its a canonical\_id
- wherever the code references $group, its a group\_name
+- $name may be a group or a cUID
<div>
<ul>
<li><a href="#ObjectMethod <strong>finish</strong> ()"> ObjectMethod finish <tt>()</tt></a></li>
<li><a href="#ObjectMethod *login_TemplateName"> ObjectMethod loginTemplateName <tt>() -> templateFile</tt></a></li>
<li><a href="#ObjectMethod *supportsRegistrati"> ObjectMethod supportsRegistration <tt>() -> boolean</tt></a></li>
- <li><a href="#ObjectMethod <strong>initialiseUser</strong> ($"> ObjectMethod initialiseUser <tt>($login) -> cUID</tt></a></li>
+ <li><a href="#ObjectMethod <strong>initialiseUser</strong> ($"> ObjectMethod initialiseUser <tt>($login) -> $cUID</tt></a></li>
<li><a href="#randomPassword()"> randomPassword()</a></li>
<li><a href="#ObjectMethod <strong>addUser</strong> ($login,$"> ObjectMethod addUser <tt>($login,$wikiname,$password,$emails) -> $cUID</tt></a></li>
- <li><a href="#StaticMethod <strong>forceCUID</strong> ($cUID)"> StaticMethod forceCUID <tt>($cUID) -> $cUID</tt></a></li>
- <li><a href="#ObjectMethod *get_CanonicalUserI"> ObjectMethod getCanonicalUserID <tt>($login) -> $user</tt></a></li>
+ <li><a href="#StaticMethod <strong>map_Login2cUID</strong> ($"> StaticMethod mapLogin2cUID <tt>($login) -> $cUID</tt></a></li>
+ <li><a href="#ObjectMethod *get_CanonicalUserI"> ObjectMethod getCanonicalUserID <tt>($identifier) -> $cUID</tt></a></li>
<li><a href="#ObjectMethod *find_UserByWikiNam"> ObjectMethod findUserByWikiName <tt>($wn) -> \@users</tt></a></li>
<li><a href="#ObjectMethod *find_UserByEmail*"> ObjectMethod findUserByEmail <tt>($email) -> \@users</tt></a></li>
- <li><a href="#ObjectMethod <strong>getEmails</strong> ($user)"> ObjectMethod getEmails <tt>($user) -> @emailAddress</tt></a></li>
- <li><a href="#ObjectMethod <strong>setEmails</strong> ($user,"> ObjectMethod setEmails <tt>($user,@emails)</tt></a></li>
+ <li><a href="#ObjectMethod <strong>getEmails</strong> ($name)"> ObjectMethod getEmails <tt>($name) -> @emailAddress</tt></a></li>
+ <li><a href="#ObjectMethod <strong>setEmails</strong> ($cUID,"> ObjectMethod setEmails <tt>($cUID,@emails)</tt></a></li>
<li><a href="#ObjectMethod <strong>isAdmin</strong> ($cUID) -"> ObjectMethod isAdmin <tt>($cUID) -> $boolean</tt></a></li>
- <li><a href="#ObjectMethod <strong>is_InList</strong> ($user,"> ObjectMethod isInList <tt>($user,$list) -> $boolean</tt></a></li>
- <li><a href="#ObjectMethod <strong>get_LoginName</strong> ($c"> ObjectMethod getLoginName <tt>($cUID) -> $string</tt></a></li>
+ <li><a href="#ObjectMethod <strong>is_InList</strong> ($cUID,"> ObjectMethod isInList <tt>($cUID,$list) -> $boolean</tt></a></li>
+ <li><a href="#ObjectMethod <strong>get_LoginName</strong> ($c"> ObjectMethod getLoginName <tt>($cUID) -> $login</tt></a></li>
<li><a href="#ObjectMethod <strong>get_WikiName</strong> ($cU"> ObjectMethod getWikiName <tt>($cUID) -> $wikiName</tt></a></li>
- <li><a href="#ObjectMethod <strong>web_DotWikiName</strong> ("> ObjectMethod webDotWikiName <tt>($user) -> $webDotWiki</tt></a></li>
+ <li><a href="#ObjectMethod <strong>web_DotWikiName</strong> ("> ObjectMethod webDotWikiName <tt>($cUID) -> $webDotWiki</tt></a></li>
<li><a href="#ObjectMethod <strong>userExists</strong> ($cUID"> ObjectMethod userExists <tt>($cUID) -> $boolean</tt></a></li>
- <li><a href="#ObjectMethod <strong>eachUser</strong> () -> $i"> ObjectMethod eachUser <tt>() -> $iterator</tt></a></li>
- <li><a href="#ObjectMethod <strong>eachGroup</strong> () -> $"> ObjectMethod eachGroup <tt>() -> $iterator</tt></a></li>
+ <li><a href="#ObjectMethod <strong>eachUser</strong> () -> TW"> ObjectMethod eachUser <tt>() -> TWiki::IteratorofcUIDs</tt></a></li>
+ <li><a href="#ObjectMethod <strong>eachGroup</strong> () -> T"> ObjectMethod eachGroup <tt>() -> TWiki::ListIteratorofgroupnames</tt></a></li>
<li><a href="#ObjectMethod *each_GroupMember*"> ObjectMethod eachGroupMember <tt>($group) -> $iterator</tt></a></li>
- <li><a href="#ObjectMethod <strong>isGroup</strong> ($user) -"> ObjectMethod isGroup <tt>($user) -> boolean</tt></a></li>
- <li><a href="#ObjectMethod <strong>is_InGroup</strong> ($user"> ObjectMethod isInGroup <tt>($user,$group) -> $boolean</tt></a></li>
+ <li><a href="#ObjectMethod <strong>isGroup</strong> ($name) -"> ObjectMethod isGroup <tt>($name) -> boolean</tt></a></li>
+ <li><a href="#ObjectMethod <strong>is_InGroup</strong> ($cUID"> ObjectMethod isInGroup <tt>($cUID,$group) -> $boolean</tt></a></li>
<li><a href="#ObjectMethod <strong>eachMembership</strong> ($"> ObjectMethod eachMembership <tt>($cUID) -> $iterator</tt></a></li>
- <li><a href="#ObjectMethod <strong>checkPassword</strong> ($u"> ObjectMethod checkPassword <tt>($userName,$passwordU) -> $boolean</tt></a></li>
- <li><a href="#ObjectMethod <strong>setPassword</strong> ($use"> ObjectMethod setPassword <tt>($user,$newPassU,$oldPassU) -> $boolean</tt></a></li>
+ <li><a href="#ObjectMethod <strong>checkLogin</strong> ($logi"> ObjectMethod checkLogin <tt>($login,$passwordU) -> $boolean</tt></a></li>
+ <li><a href="#ObjectMethod <strong>setPassword</strong> ($cUI"> ObjectMethod setPassword <tt>($cUID,$newPassU,$oldPassU) -> $boolean</tt></a></li>
<li><a href="#ObjectMethod <strong>passwordError</strong> ()"> ObjectMethod passwordError <tt>() -> $string</tt></a></li>
- <li><a href="#ObjectMethod <strong>removeUser</strong> ($user"> ObjectMethod removeUser <tt>($user) -> $boolean</tt></a></li>
- <li><a href="#ObjectMethod *ASSERT_IS_CANONICA"> ObjectMethod ASSERT_IS_CANONICAL_USER_ID <tt>($user_id) -> $boolean</tt></a></li>
- <li><a href="#ObjectMethod *ASSERT_IS_USER_LOG"> ObjectMethod ASSERT_IS_USER_LOGIN_ID <tt>($user_login) -> $boolean</tt></a></li>
- <li><a href="#ObjectMethod *ASSERT_IS_USER_DIS"> ObjectMethod ASSERT_IS_USER_DISPLAY_NAME <tt>($user_display) -> $boolean</tt></a></li>
+ <li><a href="#ObjectMethod <strong>removeUser</strong> ($cUID"> ObjectMethod removeUser <tt>($cUID) -> $boolean</tt></a></li>
</ul>
</li>
</ul>
#return 1 if the main [[UserMapper]] supports registration (ie can create new users)
-## <a name="ObjectMethod <strong>initialiseUser</strong> ($"></a> [[ObjectMethod]] **initialiseUser** `($login) -> cUID`
+## <a name="ObjectMethod <strong>initialiseUser</strong> ($"></a> [[ObjectMethod]] **initialiseUser** `($login) -> $cUID`
+
+Given a login (which must have been authenticated) determine the cUID that corresponds to that user. This method is used from TWiki.pm to map the $REMOTE\_USER to a cUID.
## <a name="randomPassword()"></a> randomPassword()
-Static function that returns a random password
+Static function that returns a random password. This function is not used in this module; it is provided as a service for other modules, such as custom mappers and registration modules.
## <a name="ObjectMethod <strong>addUser</strong> ($login,$"></a> [[ObjectMethod]] **addUser** `($login,$wikiname,$password,$emails) -> $cUID`
The return value is the canonical user id that is used by TWiki to identify the user.
-## <a name="StaticMethod <strong>forceCUID</strong> ($cUID)"></a> [[StaticMethod]] **forceCUID** `($cUID) -> $cUID`
+## <a name="StaticMethod <strong>map_Login2cUID</strong> ($"></a> [[StaticMethod]] **mapLogin2cUID** `($login) -> $cUID`
+
+This function maps an arbitrary string into a valid cUID. The transformation is reversible, but the function is not idempotent (a cUID passed to this function will NOT be returned unchanged). The generated cUID will be unique for the given login name.
-This function ensures that any cUID's are able to be used for rcs, and other internals not capable of coping with user identifications that contain more than 7 bit ascii.
+This static function is designed to be called from custom user mappers that support 1:1 login-to-cUID mappings.
-repeated calls must result in the same result (sorry, can't spell the word for it)so the '\_' must not be re-encoded
+## <a name="ObjectMethod <strong>get_CanonicalUserI"></a> [[ObjectMethod]] \*getCanonicalUserID `($identifier) -> $cUID`
-Please, call this function in any custom Usermapper to simplifyyour mapping code.
+Works out the TWiki canonical user identifier for the user who either (1) logs in with the login name $identifier or (2) has the wikiname $identifier.
-## <a name="ObjectMethod <strong>get_CanonicalUserI"></a> [[ObjectMethod]] \*getCanonicalUserID `($login) -> $user`
+The canonical user ID is an alphanumeric string that is unique to the login name, and can be mapped back to a login name and the corresponding wiki name using the methods of this class.
-Works out the unique TWiki identifier for the user who logs in with the given login. The canonical user ID is an alphanumeric string that is unique to the login name, and can be mapped back to a login name and the corresponding wiki name using the methods of this class.
+Note that if the login name to wiki name mapping is not 1:1, this method will map a wikiname to one of the login names that corresponds to the wiki name, but there is no guarantee which one.
-returns undef if the user does not exist.
+Returns undef if the user does not exist.
## <a name="ObjectMethod <strong>find_UserByWikiNam"></a> [[ObjectMethod]] \*findUserByWikiName `($wn) -> \@users`
Return a list of canonical user names for the users that have this email registered with the user mapping managers.
-## <a name="ObjectMethod <strong>getEmails</strong> ($user)"></a> [[ObjectMethod]] **getEmails** `($user) -> @emailAddress`
+## <a name="ObjectMethod <strong>getEmails</strong> ($name)"></a> [[ObjectMethod]] **getEmails** `($name) -> @emailAddress`
-If this is a user, return their email addresses. If it is a group, return the addresses of everyone in the group.
+If $name is a cUID, return their email addresses. If it is a group, return the addresses of everyone in the group.
The password manager and user mapping manager are both consulted for emails for each user (where they are actually found is implementation defined).
Duplicates are removed from the list.
-## <a name="ObjectMethod <strong>setEmails</strong> ($user,"></a> [[ObjectMethod]] **setEmails** `($user,@emails)`
+## <a name="ObjectMethod <strong>setEmails</strong> ($cUID,"></a> [[ObjectMethod]] **setEmails** `($cUID,@emails)`
Set the email address(es) for the given user. The password manager is tried first, and if it doesn't want to know the user mapping manager is tried.
- is $TWiki::cfg\{SuperAdminGroup\}
- is a member of the $TWiki::cfg\{SuperAdminGroup\}
-## <a name="ObjectMethod <strong>is_InList</strong> ($user,"></a> [[ObjectMethod]] **isInList** `($user,$list) -> $boolean`
+## <a name="ObjectMethod <strong>is_InList</strong> ($cUID,"></a> [[ObjectMethod]] **isInList** `($cUID,$list) -> $boolean`
-Return true if $user is in a list of user **wikinames** and group ids.
+Return true if $cUID is in a list of user **wikinames**, **logins** and group ids.
-$list is a comma-separated wikiname and group list. The list may contain the conventional web specifiers (which are ignored).
+The list may contain the conventional web specifiers (which are ignored).
-## <a name="ObjectMethod <strong>get_LoginName</strong> ($c"></a> [[ObjectMethod]] **getLoginName** `($cUID) -> $string`
+## <a name="ObjectMethod <strong>get_LoginName</strong> ($c"></a> [[ObjectMethod]] **getLoginName** `($cUID) -> $login`
-Get the login name of a user.
+Get the login name of a user. Returns undef if the user is not known.
## <a name="ObjectMethod <strong>get_WikiName</strong> ($cU"></a> [[ObjectMethod]] **getWikiName** `($cUID) -> $wikiName`
Get the wikiname to display for a canonical user identifier.
-can return undef if the user is not in the mapping system (or the special case from initialiseUser)
+Can return undef if the user is not in the mapping system (or the special case from initialiseUser)
-## <a name="ObjectMethod <strong>web_DotWikiName</strong> ("></a> [[ObjectMethod]] **webDotWikiName** `($user) -> $webDotWiki`
+## <a name="ObjectMethod <strong>web_DotWikiName</strong> ("></a> [[ObjectMethod]] **webDotWikiName** `($cUID) -> $webDotWiki`
Return the fully qualified wikiname of the user
Determine if the user already exists or not. A user exists if they are known to to the user mapper.
-## <a name="ObjectMethod <strong>eachUser</strong> () - $it"></a> [[ObjectMethod]] **eachUser** `() -> $iterator`
+## <a name="ObjectMethod <strong>eachUser</strong> () - TWi"></a> [[ObjectMethod]] **eachUser** `() -> TWiki::IteratorofcUIDs`
Get an iterator over the list of all the registered users **not** including groups.
...
}
-## <a name="ObjectMethod <strong>eachGroup</strong> () - $i"></a> [[ObjectMethod]] **eachGroup** `() -> $iterator`
+## <a name="ObjectMethod <strong>eachGroup</strong> () - TW"></a> [[ObjectMethod]] **eachGroup** `() -> TWiki::ListIteratorofgroupnames`
Get an iterator over the list of all the groups.
Note that groups may be defined recursively, so a group may contain other groups. This method should **only** return users i.e. all contained groups should be fully expanded.
-## <a name="ObjectMethod <strong>isGroup</strong> ($user) -"></a> [[ObjectMethod]] **isGroup** `($user) -> boolean`
-
-Establish if a user refers to a group or not.
-
-The default implementation is to check if the wikiname of the user ends with 'Group'. Subclasses may override this behaviour to provide alternative interpretations. The $TWiki::cfg\{SuperAdminGroup\} is recognized as a group no matter what it's name is.
+## <a name="ObjectMethod <strong>isGroup</strong> ($name) -"></a> [[ObjectMethod]] **isGroup** `($name) -> boolean`
-QUESTION: is the $user parameter here a string, or a canonical\_id??
+Establish if a $name refers to a group or not. If $name is not a group name it will probably be a canonical user id, though that should not be assumed.
-## <a name="ObjectMethod <strong>is_InGroup</strong> ($user"></a> [[ObjectMethod]] **isInGroup** `($user,$group) -> $boolean`
+## <a name="ObjectMethod <strong>is_InGroup</strong> ($cUID"></a> [[ObjectMethod]] **isInGroup** `($cUID,$group) -> $boolean`
-Test if user is in the given group.
+Test if the user identified by $cUID is in the given group.
## <a name="ObjectMethod <strong>eachMembership</strong> ($"></a> [[ObjectMethod]] **eachMembership** `($cUID) -> $iterator`
Return an iterator over the groups that $cUID is a member of.
-## <a name="ObjectMethod <strong>checkPassword</strong> ($u"></a> [[ObjectMethod]] **checkPassword** `($userName,$passwordU) -> $boolean`
+## <a name="ObjectMethod <strong>checkLogin</strong> ($logi"></a> [[ObjectMethod]] **checkLogin** `($login,$passwordU) -> $boolean`
-Finds if the password is valid for the given user.
+Finds if the password is valid for the given user. This method is called using the login name rather than the $cUID so that it can be called with a user who can be authenticated, but may not be mappable to a cUID (yet).
Returns 1 on success, undef on failure.
TODO: add special check for [[BaseMapping]] admin user's login, and if its there (and we're in sudo\_context?) use that..
-## <a name="ObjectMethod <strong>setPassword</strong> ($use"></a> [[ObjectMethod]] **setPassword** `($user,$newPassU,$oldPassU) -> $boolean`
+## <a name="ObjectMethod <strong>setPassword</strong> ($cUI"></a> [[ObjectMethod]] **setPassword** `($cUID,$newPassU,$oldPassU) -> $boolean`
If the $oldPassU matches matches the user's password, then it will replace it with $newPassU.
## <a name="ObjectMethod <strong>passwordError</strong> ()"></a><a name="ObjectMethod <strong>passwordError</strong> () "></a> [[ObjectMethod]] **passwordError** `() -> $string`
-returns a string indicating the error that happened in the password handlers TODO: these delayed error's should be replaced with Exceptions.
+Returns a string indicating the error that happened in the password handlers TODO: these delayed error's should be replaced with Exceptions.
returns undef if no error
-## <a name="ObjectMethod <strong>removeUser</strong> ($user"></a> [[ObjectMethod]] **removeUser** `($user) -> $boolean`
+## <a name="ObjectMethod <strong>removeUser</strong> ($cUID"></a> [[ObjectMethod]] **removeUser** `($cUID) -> $boolean`
Delete the users entry. Removes the user from the password manager and user mapping manager. Does **not** remove their personal topics, which may still be linked.
-
-## <a name="ObjectMethod <strong>ASSERT_IS_CANONICA"></a> [[ObjectMethod]] \*ASSERT\_IS\_CANONICAL\_USER\_ID `($user_id) -> $boolean`
-
-used for debugging to ensure we are actually passing a canonical\_id
-
-These ASSERTS have been disabled, as they have been made dangerous and misleading due to the legacy cUID code
-
-## <a name="ObjectMethod <strong>ASSERT_IS_USER_LOG"></a> [[ObjectMethod]] \*ASSERT\_IS\_USER\_LOGIN\_ID `($user_login) -> $boolean`
-
-used for debugging to ensure we are actually passing a user login
-
-These ASSERTS have been disabled, as they have been made dangerous and misleading due to the legacy cUID code
-
-## <a name="ObjectMethod <strong>ASSERT_IS_USER_DIS"></a> [[ObjectMethod]] \*ASSERT\_IS\_USER\_DISPLAY\_NAME `($user_display) -> $boolean`
-
-used for debugging to ensure we are actually passing a user display\_name (commonly a [[WikiWord]] Name)
-
-These ASSERTS have been disabled, as they have been made dangerous and misleading due to the legacy cUID code
<li><a href="#ObjectMethod *is_ManagingEmails*"> ObjectMethod isManagingEmails <tt>() -> $boolean</tt></a></li>
<li><a href="#ObjectMethod <strong>getEmails</strong> ($login"> ObjectMethod getEmails <tt>($login) -> @emails</tt></a></li>
<li><a href="#ObjectMethod <strong>setEmails</strong> ($login"> ObjectMethod setEmails <tt>($login,@emails) -> $boolean</tt></a></li>
- <li><a href="#ObjectMethod *find_LoginByEmail*"> ObjectMethod findLoginByEmail <tt>($email) -> \@users</tt></a></li>
+ <li><a href="#ObjectMethod *find_UserByEmail*"> ObjectMethod findUserByEmail <tt>($email) -> \@users</tt></a></li>
<li><a href="#ObjectMethod <strong>can_FetchUsers</strong> ()"> ObjectMethod canFetchUsers <tt>() -> boolean</tt></a></li>
<li><a href="#ObjectMethod <strong>fetchUsers</strong> () ->"> ObjectMethod fetchUsers <tt>() -> newTWiki::ListIterator(\@users)</tt></a></li>
</ul>
Set the email address(es) for the given login name. Returns true if the emails were set successfully. Default behaviour is a nop, which will result in the user mapping manager taking over. Called by Users.pm. Only used if `isManagingEmails` -> `true`.
-## <a name="ObjectMethod <strong>find_LoginByEmail*"></a> [[ObjectMethod]] \*findLoginByEmail `($email) -> \@users`
+## <a name="ObjectMethod <strong>find_UserByEmail*"></a><a name="ObjectMethod *find_UserByEmail</strong> "></a> [[ObjectMethod]] **findUserByEmail** `($email) -> \@users`
Returns an array of login names that relate to a email address. Defaut behaviour is a nop, which will result in the user mapping manager being asked for its opinion. If subclass implementations return a value for this, then the user mapping manager will **not** be asked. Only used if `isManagingEmails` -> `true`.
Most predefined variables return values that were either set in the configuration when TWiki was installed, or taken from server info (such as current username, or date and time). Some, like `%SEARCH%`, are powerful and general tools.
-- %X% Predefined variables can be overridden by [[preferences variables|Main/WebHome#PreferencesVariables]]
+- %X% Predefined variables can be overridden by [[preferences variables|Main/WebHome#PreferencesVariables]] (except TOPIC and WEB)
- %X% Plugins may extend the set of predefined variables (see individual Plugins topics for details)
- %T% **Take the time to thoroughly read through ALL preference variables.** If you actively configure your site, review variables periodically. They cover a wide range of functions, and it can be easy to miss the one perfect variable for something you have in mind. For example, see `%INCLUDINGTOPIC%`, `%INCLUDE%`, and the mighty `%SEARCH%`.
</tr>
<tr>
<td align="right" bgcolor="#ffffff" style=""> Copyright: </td>
- <td bgcolor="#ffffff" style=""> © 2001-2007, TWiki:Main/JohnTalintyre, <a href="mailto:Peter@Thoeny.org">Peter@Thoeny.org</a> (<a href="http://www.twiki.net/" target="_top">TWIKI.NET</a>), TWiki Contributors </td>
+ <td bgcolor="#ffffff" style=""> © 2001-2008, TWiki:Main/JohnTalintyre, <a href="mailto:Peter@Thoeny.org">Peter@Thoeny.org</a> (<a href="http://www.twiki.net/" target="_top">TWIKI.NET</a>), TWiki Contributors </td>
</tr>
<tr>
<td align="right" bgcolor="#ecf2f8" style=""> License: </td>
</tr>
<tr>
<td align="right" bgcolor="#ffffff" style=""> Plugin Version: </td>
- <td bgcolor="#ffffff" style=""> 1.032 (22 Dec 2007) </td>
+ <td bgcolor="#ffffff" style=""> 1.034 (03 Aug 2008) </td>
</tr>
<tr>
<td align="right" bgcolor="#ecf2f8" style=""> Change History: </td>
<td bgcolor="#ecf2f8" style=""> </td>
</tr>
<tr>
+ <td align="right" bgcolor="#ffffff" style=""> 03 Aug 2008 </td>
+ <td bgcolor="#ffffff" style=""> 1.034 TWiki 4.2.1 release version </td>
+ </tr>
+ <tr>
+ <td align="right" bgcolor="#ecf2f8" style=""> 20 Mar 2008 </td>
+ <td bgcolor="#ecf2f8" style=""> 1.033 TWikibug:Item5387: allow rowspanned columns to contain HTML tags; otherwise it is impossible to add an invisible anchor to a rowspanned cell </td>
+ </tr>
+ <tr>
<td align="right" bgcolor="#ffffff" style=""> 16 Dec 2007 </td>
<td bgcolor="#ffffff" style=""> 1.030: Kenneth Lavrsen: Fixed the problem of tables being sorted by by [[Main/TablePlugin]] while the table is being edited by plugins such as [[Main/EditTablePlugin]]. This required adding a new attribute <code>disableallsort</code> so plugins such as [[Main/EditTablePlugin]] can temporarily disable all sorting for a table. Additionally the CGI variable (URL parameter or hidden formfield) <code>sort</code> can be set to "off" which disables all header sorting in the topic. This is used by plugins such as [[Main/EditTablePlugin]] to disable the sorting by clicking header fields during editing of tables. Ref: TWikibug:Item5135 and TWikibug:Item2690. </td>
</tr>
**_NOTES:_**
-- This plugin comes pre-installed on TWiki 4.2.0. You should only need to re-install if there is an upgrade to the plugin.
+- This plugin comes pre-installed on TWiki 4.2.X. You should only need to re-install if there is an upgrade to the plugin.
- It requires the very latest revision of [[WysiwygPlugin]]. It will **not** work with the version shipped with TWiki 4.1.2.
- When installed, it **replaces** the old "textarea" editor. If you want to maintain access to the old editor from the standard screens, follow the instructions under [[Configuring the buttons on TWiki < 4.2.0|Main/WebHome#InstallingOnOldTWikis]].
This setting contains all the options passed to the [[TinyMCE]] editor on startup. For a full explanation of the available options, and guidance on reconfiguring [[TinyMCE]], see the [Moxicode TinyMCE Wiki](http://wiki.moxiecode.com/index.php/TinyMCE:Configuration). Note the inclusion of the Pattern Skin standard CSS files in the `content_css` setting.
- * Set INIT = mode : "exact",
+ * Set INIT = mode:"textareas",
+ editor_selector : "twikiTextarea",
save_on_tinymce_forms: true,
- elements : "text",
cleanup : true,
theme : "advanced",
convert_urls : true,
</tr>
<tr>
<td align="right"> Plugin Version: </td>
- <td> 16268 (22 Jan 2008) </td>
+ <td> 03 Aug 2008 17302 (04 Aug 2008) </td>
</tr>
<tr>
<td align="right"> Copyright: </td>
- <td> © 2007 Crawford Currie <a href="http://c-dot.co.uk" target="_top">http://c-dot.co.uk</a></td>
+ <td> © 2007-2008 Crawford Currie <a href="http://c-dot.co.uk" target="_top">http://c-dot.co.uk</a></td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>
<tr>
- <td> 20 Dec 2007 </td>
+ <td align="right"> 03 Aug 2008 </td>
+ <td> TWiki 4.2.1 release version </td>
+ </tr>
+ <tr>
+ <td align="right"> 04 May 2008 </td>
+ <td> TWikibug:Item5547: Change mechanism by which TMCE recognises textareas to camp on. Use class instead of element name. </td>
+ </tr>
+ <tr>
+ <td align="right"> 12 Apr 2008 </td>
+ <td> TWikibug:Item4946: I think I have finally fixed non-iso-8859-1 character sets. Painful. </td>
+ </tr>
+ <tr>
+ <td align="right"> 31 Mar 2008 </td>
+ <td> TWikibug:Item5314: TWikibug:Item5457: Fixed pickaxe mode for editing UTF-8. Characters above 255 are converted to entitites, which is a bit of a PITA, but at least it no longer corrupts topics. <strong>NOTE: YOU MUST UPGRADE [[Main/WysiwygPlugin]] TO 16600 OR LATER</strong></td>
+ </tr>
+ <tr>
+ <td align="right"> 28 Mar 2008 </td>
+ <td> TWikibug:Item5432: added upper case file extensions for images TWikibug:Item5206: fixed expansion of simple filenames entered in image popup TWikibug:Item5462: fixed hide attachment switch </td>
+ </tr>
+ <tr>
+ <td align="right"> 25 Jan 2008 </td>
+ <td> TWikibug:Item5287: links entered through dialog weren't working </td>
+ </tr>
+ <tr>
+ <td align="right"> 24 Jan 2008 </td>
+ <td> TWikibug:Item4840: TWikibug:Item5138: UTF8 fixes, TWikibug:Item5022: made TT font size same as verbatim. Had to add a new style to do it, as TMCE didn't want to play with TT or CODE tags. TWikibug:Item5138: post-conversion of 8-bit entities to characters to aid searching, TWikibug:Item5254: non-fatal JS error fixed, TWikibug:Item5263: remove preview on WYSIWYG edit, TWikibug:Item5116: added Opera to bad browsers filter </td>
+ </tr>
+ <tr>
+ <td align="right"> 20 Dec 2007 </td>
<td> TWikibug:Item5047: disable save and preview during page load TWikibug:Item5111: make the entry in the format menu sensitive to where the cursor is TWikibug:Item5022: made TT font size same as verbatim. Had to add a new style to do it, as TMCE didn't want to play with TT or CODE tags. </td>
</tr>
<tr>
</tr>
<tr>
<td align="left">TWiki::Plugins::WysiwygPlugin</td>
- <td align="left">>=14523</td>
+ <td align="left">>=16650</td>
<td align="left">Translator module</td>
</tr>
</table>
# <a name="TinyMCE Editor Help Summary"></a><a name=" _TinyMCE Editor Help Summary"></a> TinyMCE Editor Help Summary
-<table>
+<table border="0" cellpadding="0" cellspacing="0" id="tinyMceInfo">
<tr>
- <td rowspan="3" style="vertical-align: top; background-color: #f9f9f9" width="100px">
- <p>
- </p><select><option>Normal</option>
- <option>Heading 1</option>
- <option>Heading 2</option>
- <option>Heading 3</option>
- <option>Heading 4</option>
- <option>Heading 5</option>
- <option>Heading 6</option>
- <option>VERBATIM</option>
- <option>LITERAL</option>
- <option>Protect on save</option>
- <option>Protect forever</option></select></td>
- <td rowspan="3" style="vertical-align: top">
+ <td><img alt="format dropdown" height="188" src="http://www.dementia.org/twiki//view/%SYSTEMWEB%/TinyMCEQuickHelp/Format_Drop_Down.gif" width="124" /></td>
+ <td>
<ul>
<li><code><b>Normal</b></code> - Normal text style </li>
- <li><code><b>Heading 1-6</b></code> - Headings. 1 is largest </li>
- <li><code><b>VERBATIM</b></code> - Text is shown in monospace with line breaks.%BR% <em>Wraps <verbatim> tags around the selected text. No TWiki Variables are interpreted inside verbatim tags</em></li>
- <li><code><b>LITERAL</b></code> - Styled content is saved exactly as it appears in the editor.%BR% <em>Saves the selected content as raw HTML and wraps it in <literal> tags</em></li>
- <li><code><b>Protect on save</b></code> - Prevent any change to the selected text when the edit is saved.%BR% <em>Use this to save advanced TWiki Variables where you do not want the Wysiwyg editor to modify the text during save</em></li>
- <li><code><b>Protect forever</b></code> - Content is saved exactly as it is typed, and the protection is still there in future edit sessions.%BR% <em>Content is wrapped in <sticky> tags</em></li>
+ <li><code><b>Heading 1-6</b></code> - Headings; 1 is largest </li>
+ <li><code><b>VERBATIM</b></code> - Text is shown in monospace with line breaks. Wraps <verbatim> tags around the selected text. No TWiki variables are interpreted inside verbatim tags. </li>
+ <li><code><b>LITERAL</b></code> - Styled content is saved exactly as it appears in the editor. Saves the selected content as raw HTML and wraps it in <literal> tags. </li>
+ <li><code><b>Protect on save</b></code> - Prevent any change to the selected text when the edit is saved. Use this to save advanced TWiki variables where you do not want the Wysiwyg editor to modify the text during save. </li>
+ <li><code><b>Protect forever</b></code> - Content is saved exactly as it is typed, and the protection is still there in future edit sessions. Content is wrapped in <sticky> tags. </li>
</ul>
</td>
- <td style="vertical-align: top; background-color: #f9f9f9"><img alt="indent" src="http://www.dementia.org/twiki//view/%WEB%/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/images/indent.gif" /> <img alt="outdent" src="http://www.dementia.org/twiki//view/%WEB%/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/images/outdent.gif" /></td>
- <td style="vertical-align: top">
+ <td rowspan="4"><strong>Setting a TWiki variable</strong><ol>
+ <li> Create a list item using the toolbar button</li>
+ <li> In the list item, type <code>Set NAME = value</code></li>
+ <li> Select the value, and assign the <code><b>Protect on save</b></code> style to it (only required if the value contains any TWiki Markup Language or if you style it e.g. to add bold, or if it's sensitive to the number of spaces) </li>
+ </ol><strong>Using a TWiki Variable</strong><ul>
+ <li> Just type it in. When the topic is saved, what you type will be saved just as you wrote it. </li>
+ <li> If any part of your variable parameters is sensitive to spacing, then select the entire TWiki variable and assign the <code><b>PROTECTED</b></code> style to it before you save. </li>
+ </ul><span>[[TWiki/TWikiVariables]]</span><p><strong>Editing the raw text instead of Wysiwyg</strong></p>
<ul>
- <li> If the cursor is in a list item, change the indent </li>
- <li> Otherwise mark text with <BLOCKQUOTE> tags (the default TWiki skin shows blockquotes indented with a blue background)</li>
+ <li> Select <img alt="the pickaxe" src="http://www.dementia.org/twiki//view/%WEB%/TinyMCEPlugin/tinymce/jscripts/tiny_mce/plugins/twikibuttons/images/hide.gif" /> , or use the <em>Raw Edit</em> link in the bottom action bar. </li>
</ul>
</td>
</tr>
<tr>
- <td style="vertical-align: top; background-color: #f9f9f9"><img alt="link" src="http://www.dementia.org/twiki//view/%WEB%/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/images/link.gif" /> <img alt="unlink" src="http://www.dementia.org/twiki//view/%WEB%/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/images/unlink.gif" /></td>
- <td style="vertical-align: top">
+ <td><img alt="indent" src="http://www.dementia.org/twiki//view/%WEB%/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/images/indent.gif" /> <img alt="outdent" src="http://www.dementia.org/twiki//view/%WEB%/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/images/outdent.gif" /></td>
+ <td>
<ul>
- <li> Links can either point to a URL or to the name of a TWiki topic. </li>
- <li> E.g. <code>http://twiki.org</code>, <code>TopicNames</code>, <code>Webname.TopicNames</code>, or <code>Webname.Subweb.WebName</code>. </li>
+ <li> If the cursor is in a list item, changes the indent. Otherwise marks text with <blockquote> tags.</li>
</ul>
</td>
</tr>
<tr>
- <td style="vertical-align: top; background-color: #f9f9f9"><img alt="anchor" src="http://www.dementia.org/twiki//view/%WEB%/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/images/anchor.gif" /></td>
- <td style="vertical-align: top">
+ <td><img alt="link" src="http://www.dementia.org/twiki//view/%WEB%/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/images/link.gif" /> <img alt="unlink" src="http://www.dementia.org/twiki//view/%WEB%/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/images/unlink.gif" /></td>
+ <td>
<ul>
- <li> An anchor is a hidden mark you can use to link to a certain part of a topic, e.g a heading or a paragraph. An anchor must be a WikiWord. </li>
+ <li> Links can either point to a URL or to the name of a TWiki topic. For example <code>http://twiki.org</code>, <code>TopicNames</code>, <code>Webname.TopicNames</code>, or <code>Webname.Subweb.WebName</code>.</li>
</ul>
</td>
</tr>
<tr>
- </tr>
- <tr>
- <td colspan="2" width="50%">
- <h3><a name="Setting a TWiki variable"></a> Setting a TWiki variable </h3>
- <ol>
- <li> Create a list item using the toolbar button</li>
- <li> In the list item, type <code>Set NAME = value</code></li>
- <li> Select the value, and assign the <code><b>Protect on save</b></code> style to it (only required if the value contains any TWiki Markup Language or if you style it e.g. to add bold, or if it's sensitive to the number of spaces) </li>
- </ol>
- </td>
- <td colspan="2">
- <h3><a name="Using a TWiki Variable"></a> Using a TWiki Variable </h3>
+ <td><img alt="anchor" src="http://www.dementia.org/twiki//view/%WEB%/TinyMCEPlugin/tinymce/jscripts/tiny_mce/themes/advanced/images/anchor.gif" /></td>
+ <td>
<ul>
- <li> Just type it in. When the topic is saved, what you type will be saved just as you wrote it. </li>
- <li> If any part of your variable parameters is sensitive to spacing, then select the entire TWiki variable and assign the <code><b>PROTECTED</b></code> style to it before you save. </li>
+ <li> An anchor is a hidden mark you can use to link to a certain part of a topic, for example a heading or a paragraph. An anchor must be a WikiWord. </li>
</ul>
</td>
</tr>
</table>
-
-### <a name="Editing the raw text instead of"></a><a name="Editing the raw text instead of "></a> Editing the raw text instead of Wysiwyg
-
-- Select  , or use the _Raw Edit_ link in the bottom action bar.
</tr>
<tr>
<td align="right"> Version: </td>
- <td> 15675 (22 Jan 2008) </td>
+ <td> 15675 (04 Aug 2008) </td>
</tr>
<tr>
<td align="right"> Change History: </td>
<table border="1" cellpadding="0" cellspacing="0">
<tr>
- <td> Authors: </td>
+ <td align="right"> Authors: </td>
<td> TWiki:Main.RafaelAlvarez, TWiki:Main.ArthurClemens </td>
</tr>
<tr>
- <td> Copyright ©: </td>
+ <td align="right"> Copyright ©: </td>
<td> 2005 Rafael Alvarez; 2006, 2007 Arthur Clemens </td>
</tr>
<tr>
- <td> License: </td>
+ <td align="right"> License: </td>
<td><a href="http://www.gnu.org/copyleft/gpl.html" target="_top">GPL</a></td>
</tr>
<tr>
- <td> Dependencies: </td>
+ <td align="right"> Dependencies: </td>
<td> None </td>
</tr>
<tr>
- <td> Plugin Version: </td>
- <td> 24 Nov 2007 (version 1.4.8) </td>
+ <td align="right"> Plugin Version: </td>
+ <td> 03 Aug 2008 (version 1.4.10) </td>
</tr>
<tr>
- <td> Change History: </td>
+ <td align="right"> Change History: </td>
<td> </td>
</tr>
<tr>
- <td> 24 Nov 2007 </td>
+ <td align="right"> 03 Aug 2008 </td>
+ <td> 1.4.10 TWiki 4.2.1 release version </td>
+ </tr>
+ <tr>
+ <td align="right"> 13 Dec 2007 </td>
+ <td> 1.4.9 fix to the loading order of javascript files in head </td>
+ </tr>
+ <tr>
+ <td align="right"> 24 Nov 2007 </td>
<td> 1.4.6 - 1.4.8 Arthur Clemens - Added format tokens. </td>
</tr>
<tr>
- <td> 07 Oct 2007 </td>
+ <td align="right"> 07 Oct 2007 </td>
<td> 1.4.5 Arthur Clemens - Fix html tag with show/hide controls. </td>
</tr>
<tr>
- <td> 25 Sep 2007 </td>
+ <td align="right"> 25 Sep 2007 </td>
<td> 1.4.4 Arthur Clemens - Fix rendering of headers when <code>prefix</code> is used. </td>
</tr>
<tr>
- <td> 11 Jul 2007 </td>
+ <td align="right"> 11 Jul 2007 </td>
<td> 1.4.3 Arthur Clemens - Fix invalid html when <code>prefix</code> and <code>suffix</code> is used. </td>
</tr>
<tr>
- <td> 23 Jun 2007 </td>
+ <td align="right"> 23 Jun 2007 </td>
<td> 1.4.2 Arthur Clemens - Fixed bugs with parameters <code>firststart</code> and <code>noscript</code> (since version 1.4). </td>
</tr>
<tr>
- <td> 20 Jun 2007 </td>
+ <td align="right"> 20 Jun 2007 </td>
<td> 1.4 Arthur Clemens - Updated to work without ugly inserted javascript 'init' calls. This will change nothing to the functionality, but it will produce cleaner HTML, while at the same time the twisty is still set immediately (not at page onload) and graceful fallback in case of no javascript is maintained. </td>
</tr>
<tr>
- <td> 19 Jun 2006 </td>
+ <td align="right"> 19 Jun 2006 </td>
<td> 1.3 Arthur Clemens - Updated with TWiki 4 JavaScript files. </td>
</tr>
<tr>
- <td> 25 Oct 2006 </td>
+ <td align="right"> 25 Oct 2006 </td>
<td> 1.2 New variables to set default values: <code>TWISTYSHOWLINK</code>, <code>TWISTYHIDELINK</code>, <code>TWISTYMODE</code>, <code>TWISTYREMEMBER</code>; property <code>id</code> is no longer required as this is automatically set (still recommended in some cases with <code>remember="on"</code>); property value <code>remember="off"</code> will clear a previously stored cookie; new properties <code>prefix</code> and <code>suffix</code>; JavaScript to collapse or expand all Twisties on the page. </td>
</tr>
<tr>
- <td> 27 Sep 2006 </td>
+ <td align="right"> 27 Sep 2006 </td>
<td> 1.101 Fixes JavaScript handling when AllowInlineScript in configure is not set </td>
</tr>
<tr>
- <td> 11 June 2006 </td>
+ <td align="right"> 11 June 2006 </td>
<td> 1.100 Added parameters <code>start</code>, <code>firststart</code>, <code>noscript</code> and <code>class</code>; complete JavaScript rewrite for speed </td>
</tr>
<tr>
- <td> 12 Sep 2005 </td>
+ <td align="right"> 12 Sep 2005 </td>
<td> 1.000 First Version </td>
</tr>
<tr>
- <td> Home: </td>
+ <td align="right"> Home: </td>
<td><a href="http://TWiki.org/cgi-bin/view/Plugins/%TOPIC%" target="_top">http://TWiki.org/cgi-bin/view/Plugins/%TOPIC%</a></td>
</tr>
<tr>
- <td> Feedback: </td>
+ <td align="right"> Feedback: </td>
<td><a href="http://TWiki.org/cgi-bin/view/Plugins/%TOPIC%Dev" target="_top">http://TWiki.org/cgi-bin/view/Plugins/%TOPIC%Dev</a></td>
</tr>
<tr>
- <td> Appraisal: </td>
+ <td align="right"> Appraisal: </td>
<td><a href="http://TWiki.org/cgi-bin/view/Plugins/%TOPIC%Appraisal" target="_top">http://TWiki.org/cgi-bin/view/Plugins/%TOPIC%Appraisal</a></td>
</tr>
</table>
<a name="VarDISPLAYTIME"></a>
-### <a name="DISPLAYTIME -- display time"></a> DISPLAYTIME -- display time
+### <a name="DISPLAYTIME -- display date and"></a><a name="DISPLAYTIME -- display date and "></a> DISPLAYTIME -- display date and time
- Syntax: `%DISPLAYTIME%`
-- Expands to: `29 Jun 2010 - 16:09`
-- Date format defined as \{DefaultDateFormat\} in [configure](http://www.dementia.org/twiki/configure)
+- Expands to: `29 Jun 2010 - 16:12`
+- Date part of the format is displayed as defined by the \{DefaultDateFormat\} in [configure](http://www.dementia.org/twiki/configure). The time is shown as hh:mm (24 hour clock)
- Related: [[DISPLAYTIME{"format"}|Main/VarDISPLAYTIME2]], [[GMTIME|Main/VarGMTIME]], [[SERVERTIME|Main/VarSERVERTIME]]
### <a name="DISPLAYTIME{"format"} -- formatt"></a> DISPLAYTIME\{"format"\} -- formatted display time
-- Formatted time - either GMT or Local server time, depending on setting in [configure](http://www.dementia.org/twiki/configure). Same format qualifiers as `%GMTIME%`
+- Formatted time - either GMT or Local server time, depending on \{DisplayTimeValues\} setting in [configure](http://www.dementia.org/twiki/configure). Same format qualifiers as `%GMTIME%`
- Syntax: `%DISPLAYTIME{"format"}%`
-- Example: `%DISPLAYTIME{"$hou:$min"}%` expands to `16:09`
+- Example: `%DISPLAYTIME{"$hou:$min"}%` expands to `16:12`
- Related: [[DISPLAYTIME|Main/VarDISPLAYTIME]], [[GMTIME|Main/VarGMTIME]], [[SERVERTIME|Main/VarSERVERTIME]]
<tr>
<td><code>changerows</code></td>
<td> Rows can be added and removed if <code>"on"</code><br /> Rows can be added but not removed if <code>"add"</code><br /> Rows cannot be added or removed if <code>"off"</code></td>
- <td><code>CHANGEROWS</code> %BR% Plugin setting </td>
+ <td><code>CHANGEROWS</code> %BR% plugin setting </td>
</tr>
<tr>
<td><code>quietsave</code></td>
<td> Quiet Save button is shown if <code>"on"</code>, hidden if <code>"off"</code></td>
- <td><code>QUIETSAVE</code> %BR% Plugin setting </td>
+ <td><code>QUIETSAVE</code> %BR% plugin setting </td>
</tr>
<tr>
<td><code>include</code></td>
<tr>
<td><code>editbutton</code></td>
<td> Set edit button text, e.g. <code>"Edit this table"</code>; set button image with alt text, e.g. <code>"Edit table, %PUBURL%/%TWIKIWEB%/TWikiDocGraphics/edittopic.gif"</code>; hide edit button at the end of the table with <code>"hide"</code> (Note: Button is automatically hidden if an edit button is present in a cell) </td>
- <td><code>EDITBUTTON</code> %BR% Plugin setting </td>
+ <td><code>EDITBUTTON</code> %BR% plugin setting </td>
+ </tr>
+ <tr>
+ <td><code>javascriptinterface</code></td>
+ <td> Use javascript to directly move and delete row without page refresh. Enable with <code>"on"</code>, disable with <code>"off"</code>. </td>
+ <td><code>JAVASCRIPTINTERFACE</code> %BR% plugin setting </td>
</tr>
</table>
</tr>
<tr>
<td><code>format="..."</code></td>
- <td> Format string. <code>$value</code> expands to the field value, and <code>$title</code> expands to the fieldname </td>
+ <td> Format string. <code>$value</code> expands to the field value, and <code>$title</code> expands to the fieldname (also expands $name, $attributes, $type, $size and $definingTopic) </td>
<td><code>"$value"</code></td>
</tr>
<tr>
</tr>
<tr>
<td><code>section="name"</code></td>
- <td> Includes only the specified named section, as defined in the included topic by the [[Main/VarSTARTSECTION]] and [[Main/VarENDSECTION]] variables. Nothing is shown if the named section does not exists. </td>
+ <td> Includes only the specified named section, as defined in the included topic by the [[Main/VarSTARTSECTION]] and [[Main/VarENDSECTION]] variables. Nothing is shown if the named section does not exists. <code>section=""</code> is equivalent to not specifying a section </td>
<td> </td>
</tr>
<tr>
</tr>
</table>
- Example: `%SEARCH{"wiki" web="%USERSWEB%" scope="topic"}%`
-- Example with format: `%SEARCH{"FAQ" scope="topic" nosearch="on" nototal="on" header="| *Topic: * | *Summary: * |" format="| $topic | $summary |"%` _(displays results in a table with header - [[details|Main/FormattedSearch]])_
+- Example with format: `%SEARCH{"FAQ" scope="topic" nosearch="on" nototal="on" header="| *Topic: * | *Summary: * |" format="| $topic | $summary |"}%` _(displays results in a table with header - [[details|Main/FormattedSearch]])_
- %H% Hint: If the TWiki:Plugins.TablePlugin is installed, you may set a `%TABLE{}%` variable just before the `%SEARCH{}%` to alter the output of a search. Example: `%TABLE{ tablewidth="90%" }%`
-- Related: [[METASEARCH|Main/VarMETASEARCH]], [[TOPICLIST|Main/VarTOPICLIST]], [[WEBLIST|Main/VarWEBLIST]], [[FormattedSearch]], [[SearchHelp]], [[SearchPatternCookbook]], [[RegularExpression]]
+- Related: [[METASEARCH|Main/VarMETASEARCH]], [[TOPICLIST|Main/VarTOPICLIST]], [[WEBLIST|Main/VarWEBLIST]], [[FormattedSearch]], [[QuerySearch]], [[SearchHelp]], [[SearchPatternCookbook]], [[RegularExpression]]
</tr>
</table>
- Example: `%URLPARAM{"skin"}%` returns `print` for a `.../view/%WEB%/%INCLUDINGTOPIC%?skin=print` URL
-- **_%X% Note:_** URL parameters passed into HTML form fields must be entity [[ENCODEd|Main/VarENCODE]].
-- **_%X% Note:_** Double quotes in URL parameters must be escaped when passed into other TWiki variables.%BR% Example: `%SEARCH{ "%URLPARAM{ "search" encode="quotes" }%" noheader="on" }%`
-- **_%X% Note:_** When used in a template topic, this variable will be expanded when the template is used to create a new topic. See [[TWikiTemplates#TemplateTopicsVars]] for details.
-- **_%X% Note:_** There is a risk that this variable could be misused for cross-site scripting.
+- **_%X% Notes:_**
+ - URL parameters passed into HTML form fields must be entity [[ENCODEd|Main/VarENCODE]].
+ - Double quotes in URL parameters must be escaped when passed into other TWiki variables.%BR% Example: `%SEARCH{ "%URLPARAM{ "search" encode="quotes" }%" noheader="on" }%`
+ - When used in a template topic, this variable will be expanded when the template is used to create a new topic. See [[TWikiTemplates#TemplateTopicsVars]] for details.
+ - Watch out for TWiki internal parameters, such as `rev`, `skin`, `template`, `topic`, `web`; they have a special meaning in TWiki. Common parameters and view script specific parameters are documented at [[TWikiScripts]].
+ - If you have `%URLPARAM{` in the value of a URL parameter, it will be modified to `%<nop>URLPARAM{`. This is to prevent an infinite loop during expansion.
+ - There is a risk that this variable could be misused for cross-site scripting.
- Related: [[ENCODE|Main/VarENCODE]], [[SEARCH|Main/VarSEARCH]], [[FormattedSearch]], [[QUERYSTRING|Main/VarQUERYSTRING]]
-
-**_Note_** If you have `%URLPARAM{` in the value of a URL parameter, it will be modified to `%<nop>URLPARAM{`. This is to prevent an infinite loop during expansion.
<a name="VarUSERINFO"></a>
-### <a name="USERINFO{"_WikiName"} -- retriev"></a> USERINFO\{"WikiName"\} -- retrieve details about a user
+### <a name="USERINFO{"name"} -- retrieve det"></a> USERINFO\{"name"\} -- retrieve details about a user
- Syntax: `%USERINFO%`
- Expands to: `admin, Main.admin, ` (comma-separated list of the username, wikiusername, and emails)
- Retrieve information about another user:
- Example: `%USERINFO{ "TWikiGuest" format="$username is really $wikiname" }%`
- Expands to: ``
- - **_Note:_** The parameter should be the wikiname of a user. You can only get information about another user if the `{AntiSpam}{HideUserDetails}` configuration option is not enabled, or if you are an admin. _(User details are hidden in this TWiki)_
+ - **_Note:_** The parameter should be the wikiname of a user. Since TWiki 4.2.1, you can also pass a login name. You can only get information about another user if the `{AntiSpam}{HideUserDetails}` configuration option is not enabled, or if you are an admin. _(User details are hidden in this TWiki)_
- Related: [[USERNAME|Main/VarUSERNAME]], [[WIKINAME|Main/VarWIKINAME]], [[WIKIUSERNAME|Main/VarWIKIUSERNAME]], [[TWikiUserAuthentication]], [[ChangeEmailAddress]]
-<div style="float: right; width: 255px; padding: 1em; text-align: center"><a href="http://twiki.org"><img alt="Collaborate with TWiki -- visit TWiki.org" border="0" height="67" src="http://www.dementia.org/twiki//view/%SYSTEMWEB%/TWikiLogos/T-logo-235x67-t.gif" style="margin: .3em 0" title="Collaborate with TWiki -- visit TWiki.org" width="235" /></a><br />The official TWiki site is <a href="http://twiki.org"><span>twiki.org</span></a></div>
+<div style="float: right; width: 255px; padding: 1em; text-align: center"><a href="http://twiki.org"><img alt="Collaborate with TWiki -- visit TWiki.org" border="0" height="67" src="http://www.dementia.org/twiki//view/%SYSTEMWEB%/TWikiLogos/T-logo-235x67-t.gif" style="margin: .3em 0" title="Collaborate with TWiki -- visit TWiki.org" width="235" /></a><br />The official TWiki<sup>®</sup> site is <a href="http://twiki.org"><span>twiki.org</span></a></div>
# <a name="Welcome to the %WEB% Web"></a><a name=" Welcome to the %WEB% Web"></a> Welcome to the %WEB% Web
## <a name="Disclaimer"></a> Disclaimer
-- TWiki™, the [[TWiki logo|Main/TWikiLogos]] and the "Collaborate with TWiki" tagline are trademarks of [Peter Thoeny](http://twiki.org/cgi-bin/view/Main/PeterThoeny)
-- **_Note_**: Twiki (with a lower case "w") is a robot character from the _Buck Rogers™ in the 25th Century_ TV series. TWiki (with an upper case "W") is not affiliated with the Dille Family Trust, the registered trademark owner of the _Buck Rogers_ name
-- TWiki is developed as Free Software under the [[GNU/GPL|Main/GnuGeneralPublicLicense]]
-- Get the latest version from [TWiki.org downloads](http://TWiki.org/download.html)
+- TWiki<sup>®</sup> is a registered trademarks of TWiki founder [Peter Thoeny](http://twiki.org/cgi-bin/view/Main/PeterThoeny), [TWIKI.NET](http://twiki.net/). The [[TWiki logo|Main/TWikiLogos]] and the "Collaborate with TWiki" tagline are trademarks of Peter Thoeny.
+- Twiki (with a lower case "w") is a robot character from the _Buck Rogers™ in the 25th Century_ TV series. TWiki (with an upper case "W") is not affiliated with the Dille Family Trust, the registered trademark owner of the _Buck Rogers_ name.
+- TWiki is developed as Free Software under the [[GNU/GPL|Main/GnuGeneralPublicLicense]].
+- Get the latest version from [TWiki.org downloads](http://TWiki.org/download.html).
- [[TextFormattingRules]]
- [[TWikiVariables]]
- [[FormattedSearch]]
+- [[QuerySearch]]
- [[TWikiDocGraphics]]
- [[TWikiSkinBrowser]]
- [[InstalledPlugins]]
<div> Hello [[Main/Admin]]%BR%<ul>
<li>[[Main/WebHome?logout=1]]</li>
</ul>
- <div>
- <ul>
- <li><a href="http://www.dementia.org/twiki/edit/%USERSWEB%/adminLeftBar?templatetopic=%SYSTEMWEB%.WebLeftBarPersonalTemplate&topicparent=admin">Create personal sidebar</a></li>
- </ul>
- </div>
+ <div> $percntINCLUDE{$quot$percntMAINWEB$percnt.$percntWIKINAME$percntLeftBar$quot warn=$quot<ul>
+ <li><a href="http://www.dementia.org/twiki/edit/Main/adminLeftBar?templatetopic=TWiki.WebLeftBarPersonalTemplate&topicparent=admin">Create personal sidebar</a></li>
+ </ul>$quot }$percnt </div>
</div>
- Users or groups allowed to change or rename this %TOPIC% topic: (e.g., %USERSWEB%.WebAdministratorsGroup)
- Set ALLOWTOPICCHANGE = %USERSWEB%.TWikiAdminGroup
-- Web preferences that are **not** allowed to be overridden by user or topic preferences:
+- Web preferences that are **not** allowed to be overridden by sub-web, user or topic preferences:
- Set FINALPREFERENCES = NOSEARCHALL, ATTACHFILESIZELIMIT, WIKIWEBMASTER, WEBCOPYRIGHT, WEBTOPICLIST, DENYWEBVIEW, ALLOWWEBVIEW, DENYWEBCHANGE, ALLOWWEBCHANGE, ALLOWWEBRENAME, DENYWEBRENAME
<tr>
<th>Search where:</th>
<td><input id="textbody" name="scope" type="radio" value="text" /><label for="textbody"> Text body</label> <input id="topictitle" name="scope" type="radio" value="topic" /><label for="topictitle"> Topic title</label> <input checked id="both" name="scope" type="radio" value="all" /><label for="both"> Both body and title</label>
- <hr /><input id="web" name="web" type="checkbox" /><label for="web"> All public webs</label><span>(otherwise search %INCLUDINGWEB% Web only)</span></td>
+ <hr /><input id="web" name="web" type="checkbox" value="all" /><label for="web"> All public webs</label><span>(otherwise search %INCLUDINGWEB% Web only)</span></td>
</tr>
</table>
</form>
<td><input id="textbody" name="scope" type="radio" value="text" /><label for="textbody"> Text body</label>
<br /><input id="topictitle" name="scope" type="radio" value="topic" /><label for="topictitle"> Topic title</label>
<br /><input checked id="both" name="scope" type="radio" value="all" /><label for="both"> Both body and title</label>
- <hr /><input id="web" name="web" type="checkbox" /><label for="web"> All public webs</label><span>(otherwise search %INCLUDINGWEB% Web only)</span></td>
+ <hr /><input id="web" name="web" type="checkbox" value="all" /><label for="web"> All public webs</label><span>(otherwise search %INCLUDINGWEB% Web only)</span></td>
</tr>
<tr>
<th>Sort results by:</th>
<li> If you already know the name of the topic, enter the name of the topic into the [[SYSTEMWEB/GoBox]] at the top </li>
<li><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=\.*">List all topics in the %INCLUDINGWEB% web in alphabetical order</a></li>
<li> List topics that start with the letter: <a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Ea">A</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Eb">B</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Ec">C</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Ed">D</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Ee">E</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Ef">F</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Eg">G</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Eh">H</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Ei">I</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Ej">J</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Ek">K</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5El">L</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Em">M</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5En">N</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Eo">O</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Ep">P</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Eq">Q</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Er">R</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Es">S</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Et">T</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Eu">U</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Ev">V</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Ew">W</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Ex">X</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Ey">Y</a><span> | </span><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&search=%5Ez">Z</a></li>
- <li><a href="http://www.dementia.org/twiki/search/%INCLUDINGWEB%/?scope=topic®ex=on&bookview=on&search=\.*">All topics in BookView</a> <span>([[SYSTEMWEB/BookView]])</span></li>
<li>[[INCLUDINGWEB/WebChanges]]</li>
</ul>
</div>
**_Notes:_**
-- Do not edit this topic; it is updated automatically. (You can also [force](http://www.dementia.org/twiki/statistics/%WEB%) an update)
-- %SYSTEMWEB%.TWikiDocumentation tells you how to enable the automatic updates of the statistics.
+- Do not edit this topic, it is updated automatically. (You can also [force](http://www.dementia.org/twiki/statistics/%WEB%) an update)
+- [[TWikiSiteTools|SYSTEMWEB/TWikiSiteTools#WebStatistics_site_statistics]] tells you how to enable the automatic updates of the statistics.
- Suggestion: You could archive this topic once a year and delete the previous year's statistics from the table.
</li></ul>
-->
</textarea>
- <p> All WebTopicCreator topic on this site: </p>
+ <p> All WebTopicCreator topics on this site: </p>
<h1><a name="TWiki Installation Error"></a> TWiki Installation Error </h1>Incorrect format of searchformat template (missing sections? There should be 4 %SPLIT% tags) </div>
### <a name="Creating a page"></a> Creating a page
-See a question mark link "<u>?</u>" behind a WikiWord? That means that there's no topic yet for that [[TWikiWord]]. If you want to create a topic for that WikiWord, just click on the question mark. The topic will be created and you will be in the editor window.
+See a question mark link "<u>?</u>" behind a WikiWord? That means that there's no topic yet for that [[NewWikiWord69593]]. If you want to create a topic for that WikiWord, just click on the question mark. The topic will be created and you will be in the editor window.
### <a name="Viewing the history of a topic"></a> Viewing the history of a topic
</tr>
<tr>
<td align="right"> Plugin Version: </td>
- <td> 16174 (22 Jan 2008) </td>
+ <td> 03 Aug 2008 17302 (04 Aug 2008) </td>
</tr>
<tr>
<td align="right"> Change History: </td>
<td> </td>
</tr>
<tr>
+ <td align="right"> 03 Aug 2008 </td>
+ <td> TWiki 4.2.1 release version </td>
+ </tr>
+ <tr>
+ <td align="right"> 25 May 2008 </td>
+ <td> TWikibug:Item5457: TWikibug:Item5528: TWikibug:Item5626: using a debug simulation, I believe I have finally fixed all the complexities of using international character sets with the translator. </td>
+ </tr>
+ <tr>
+ <td align="right"> 13 Apr 2008 </td>
+ <td> TWikibug:Item4946: TWikibug:Item5530: I think I have finally fixed non-iso-8859-1 character sets. Painful. TWikibug:Item5393: removed spurious DIV generated by IE inside LI tags </td>
+ </tr>
+ <tr>
+ <td align="right"> 31 Mar 2008 </td>
+ <td> TWikibug:Item5314: TWikibug:Item5457: Fixed pickaxe mode for editing UTF-8. Characters above 255 are converted to entitites, which is a bit of a PITA, but at least it no longer corrupts topics. </td>
+ </tr>
+ <tr>
+ <td align="right"> 28 Mar 2008 </td>
+ <td> TWikibug:Item5294: fixed angle brackets in plain text and promoted sticky to be higher priority than any other tag, solving several problems in one go </td>
+ </tr>
+ <tr>
+ <td align="right"> 24 Jan 2008 </td>
+ <td> TWikibug:Item5257: remove extra spaces at end of Set lines </td>
+ </tr>
+ <tr>
<td align="right"> 20 Dec 2007 </td>
<td> TWikibug:Item5022: made TT font size same as verbatim. Had to add a new style to do it, as TMCE didn't want to play with TT or CODE tags. TWikibug:Item5138: post-conversion of 8-bit entities to characters to aid searching etc. </td>
</tr>