[dokuwiki] Proposal: FS#113, notify changes

Hello

I've worked up a patch for a first pass at allowing users to elect to have email sent to them when pages of the wiki are updated. Andreas suggested I post it and something of an overview of the approach to generate some discussion. I haven't tried to 'darcs send' it, but I could if that would be easier.

The idea is pretty simple. The patch adds a 'Track Changes' button at the bottom of the page along side the Logout button. It only shows up after a user has logged in as a login id will be needed later to look up their email address. If the user presses the 'Track Changes' button, their user id is added to a .mlist file that has the same base name and lives in the same area at the .txt file for that page. If the user's id is already in the .mlist file, the button reads 'Ignore Changes' and pressing it removes the user from the .mlist file. I've tried to leverage the locking routines to lock the file during writes, with a wait/retry if the file is locked during an update. I've only added the button text definitions to the English lang.php file at this time.

To send the mail, the notify() routine was updated to step through the users in the .mlist file, looking up their user data to get their email address and groups, and then checking the ACL permissions for the user. If the user is allowed to read the page, they are included in the same email that gets sent to the $conf['notify'] user. I put in the ACL lookup just in case a user had permission to read the page, added themselves to the .mlist, and then had the permission removed.

That pretty much covers it. We just started using DokuWiki at work, and it has been a big hit. So far, this is the only feature that has been requested, so I thought I would give it a try.

Let me know what you think, and thanks for your time.

Steven
New patches:

[track_changes.patch
Steven Danz <steven-danz@xxxxxxxxx>**20050622021728
 First pass at chanegs to implement FS 113, a way to allow users to 
 'track' pages and receive email each time a page changes.
] {
hunk ./inc/actions.php 35
+
+  //check if user is asking to track a page
+  if($ACT == 'track' || $ACT == 'ignore')
+    $ACT = act_track($ACT);
hunk ./inc/actions.php 104
-                             'diff','recent','backlink','admin',)) === false
+                             
'diff','recent','backlink','admin','track','ignore',)) === false
hunk ./inc/actions.php 271
+
+  return 'show';
+}
+
+/**
+ * Handle 'track', 'ignore'
+ *
+ * @author Steven Danz <steven-danz@xxxxxxxxx>
+ */
+function act_track($act){
+  global $ID;
+  global $INFO;
+
+  $try = 0;
+  while ($try < 5 && ($lockedby=checklock($ID,'mlist'))) {
+    $try++;
+    if ($try < 5) {
+      sleep(3);
+    }
+  }
+  if (!$lockedby) {
+      lock($ID,'mlist');
+  }
+  if (checklock($ID,'mlist')) {
+    msg('Failed to get lock on tracking file in 15 seconds, please try again 
later', -1);
+  } else {
+    $tracking = tracking($ID, $_SERVER['REMOTE_USER']);
+    if ($act=='track' && !$tracking){
+      if ($INFO['userinfo']['mail']){
+        $file=wikiMN($ID);
+        $fh = fopen($file,'a');
+        if($fh){
+          fputs($fh,$_SERVER['REMOTE_USER']."\n");
+          fclose($fh);
+        }
+        msg('Added '.$INFO['userinfo']['name'].' to tracking list for '.$ID,0);
+      } else {
+        msg('There is no address associated with your login, you cannot be 
added to the tracking list',-1);
+      }
+    } elseif ($act=='ignore' && $tracking){
+      $file=wikiMN($ID);
+      $mlist = file($file);
+      $fh = fopen($file,'w');
+      foreach ($mlist as $who) {
+        $who = rtrim($who);
+        if ($who!=$_SERVER['REMOTE_USER']) {
+          fputs($fh,$who."\n");
+        } else {
+          msg('Removed '.$INFO['userinfo']['name'].' from the tracking list 
for '.$ID,0);
+        }
+      }
+      fclose($fh);
+    }
+
+    unlock($ID,'mlist');
+  }
hunk ./inc/common.php 303
-function checklock($id){
+function checklock($id,$type='wiki'){
hunk ./inc/common.php 305
-  $lock = wikiFN($id).'.lock';
+  if (empty($type) || $type=='wiki') {
+    $lock = wikiFN($id).'.lock';
+  } elseif ($type=='mlist'){
+    $lock = wikiMN($id).'.lock';
+  } else {
+    msg('Cannot check lock on unknown file type '.$type, -1);
+    return true;
+  }
hunk ./inc/common.php 337
-function lock($id){
-  $lock = wikiFN($id).'.lock';
+function lock($id,$type='wiki'){
+  if (empty($type) || $type=='wiki') {
+    $lock = wikiFN($id).'.lock';
+  } elseif ($type=='mlist'){
+    $lock = wikiMN($id).'.lock';
+  } else {
+    msg('Cannot lock unknown file type '.$type, -1);
+    return true;
+  }
+
hunk ./inc/common.php 360
-function unlock($id){
-  $lock = wikiFN($id).'.lock';
+function unlock($id,$type='wiki'){
+  if (empty($type) || $type=='wiki') {
+    $lock = wikiFN($id).'.lock';
+  } elseif ($type=='mlist'){
+    $lock = wikiMN($id).'.lock';
+  } else {
+    msg('Cannot unlock unknown file type '.$type, -1);
+    return true;
+  }
+
hunk ./inc/common.php 603
+    $mfile=wikiMN($id);
+    if (file_exists($mfile)) {
+      @unlink($mfile);
+    }
hunk ./inc/common.php 659
-  if(empty($conf['notify'])) return; //notify enabled?
+
+  $mlist = array();
+
+  $file=wikiMN($id);
+  if (file_exists($file)) {
+    $mlist = file($file);
+  }
+
+  if(empty($conf['notify']) && count($mlist) == 0) return; //notify enabled?
hunk ./inc/common.php 695
-  mail_send($conf['notify'],$subject,$text,$conf['mailfrom']);
+  $bcc = '';
+  if(count($mlist) > 0) {
+    foreach ($mlist as $who) {
+      $who = rtrim($who);
+      $info = auth_getUserData($who);
+      $level = auth_aclcheck($id,$who,$info['grps']);
+      if ($level >= AUTH_READ) {
+        if (strcasecmp($info['mail'],$conf['notify']) != 0) {
+          if (empty($bcc)) {
+            $bcc = $info['mail'];
+          } else {
+            $bcc = "$bcc,".$info['mail'];
+          }
+        }
+      }
+    }
+  }
+
+  mail_send($conf['notify'],$subject,$text,$conf['mailfrom'],'',$bcc);
hunk ./inc/common.php 896
+/**
+ * Let us know if a user is tracking a page
+ *
+ * @author Steven Danz <steven-danz@xxxxxxxxx>
+ */
+function tracking($id,$uid){
+  $file=wikiMN($id);
+  if (file_exists($file)) {
+    $mlist = file($file);
+    foreach ($mlist as $who) {
+      $who = rtrim($who);
+      if ($who==$uid) {
+        return true;
+      }
+    }
+  }
+  return false;
+}
hunk ./inc/lang/en/lang.php 35
+$lang['btn_track']  = 'Track Changes';
+$lang['btn_ignore'] = 'Ignore Changes';
hunk ./inc/pageutils.php 134
+ * returns the full path to the mailist specified by ID
+ *
+ * The filename is URL encoded to protect Unicode chars
+ *
+ * @author Steven Danz <steven-danz@xxxxxxxxx>
+ */
+function wikiMN($id){
+  global $conf;
+  $id = cleanID($id);
+  $id = str_replace(':','/',$id);
+  $fn = $conf['datadir'].'/'.utf8_encodeFN($id).'.mlist';
+  return $fn;
+}
+
+/**
hunk ./inc/template.php 106
+    case 'track':
+      html_track();
+      break;
+    case 'ignore':
+      html_ignore();
+      break;
hunk ./inc/template.php 268
+  global $ACT;
hunk ./inc/template.php 311
+    case 'track':
+      if($conf['useacl'] && $ACT == 'show'){
+        if($_SERVER['REMOTE_USER']){
+          if(tracking($ID,$_SERVER['REMOTE_USER'])){
+            print html_btn('ignore',$ID,'',array('do' => 'ignore',));
+          } else {
+            print html_btn('track',$ID,'',array('do' => 'track',));
+          }
+        }
+      }
+      break;
hunk ./inc/template.php 407
+      break;
+   case 'track':
+      if($conf['useacl']){
+        if($_SERVER['REMOTE_USER']){
+          if(tracking($ID,$_SERVER['REMOTE_USER'])){
+            
tpl_link(wl($ID,'do=ignore'),$pre.$lang['btn_ignore'].$suf,'class="action"');
+          } else {
+            
tpl_link(wl($ID,'do=track'),$pre.$lang['btn_track'].$suf,'class="action"');
+          }
+        }
+      }
hunk ./lib/tpl/default/main.php 119
+        <?php tpl_button('track')?>
}

Context:

[do not use params parameter in call to mail() if unneeded #397
andi@xxxxxxxxxxxxxx**20050620203612] 
[handle missing users.auth and acl.auth gracefully
andi@xxxxxxxxxxxxxx**20050620203400] 
[ability to derefence ldap aliases #406
Holger Müller <zarath@xxxxxx>**20050620194652] 
[basque update
xezpeleta@xxxxxxxxxxxxx**20050620193046] 
[option merge of refcheck and refcount
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050617201556
 The options refcheck and refcount were merged to refcheck. This reduces
 configuration options and make the function more robust.
] 
[japanese language files
Davilin <webmaster@xxxxxxxxxxx>**20050618071754] 
[fixed bug for MySQL passcrypt
dave.winter@xxxxxxxxxxxxxxxxx**20050617124215
 Write the long patch description into this file.
 The first line of this file will be the patch name.
 Everything in this file from the above ***DARCS*** line on will be ignored.
 
 This patch contains the following changes:
 
 M ./inc/auth/mysql.php -1 +2
] 
[minor fixes
andi@xxxxxxxxxxxxxx**20050617175013] 
[XML conformity for media reference dialog
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050617131041
 XML has problems with the usual PHP shortcuts '<?' or '<?='.
 This patch replaces such shortcuts with the XML compliant
 versions in the mediafile references dialog. It is handled
 separately because the reference check patch is not yet
 merged to the upstream source
] 
[make DokuWiki xml conform
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050617130335
 XML has problems with usual PHP shortcuts like '<?' or '<?='.
 This patch replaces such shortcuts with the XML compliant
 versions:
  '<?'  -> '<?php'
  '<?=' -> '<?php echo'
  
] 
[locks must not survive logoff
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050617121838
 If a user logout during editing an article, this article will be blocked
 until end of timeout. This patch removes an open lock, if the user log off.
] 
[search fix FS#395
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050617113855
 This patch fixes FS#395 and another bug in the fulltext search
 which accepts single '+' and '-' signs as search input.
] 
[media file reference missing file fix
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050616171239
 This file is missing in the media file reference checker patch
] 
[media reference check part 2
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050616163425
 Part 1 only checks for the existance of references.
 Part 2 will show where this references are so that the user
 could easily find them.
 
 Both parts are configurable:
 refcheck=1 enables the reference checker
 refcount   defines how much references were collected during a check run
 refshow =1 enables that the collected references were shown.
] 
[media reference check
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050605185038
 This patch implements the first step of a media file reference
 checker. Every time the user wanted to delete a media file 
 it would be ckecked for still existing references to this media
 file. File deletion is denied if this media file is still in use.
] 
[spellchecker fix for ignoring links
andi@xxxxxxxxxxxxxx**20050617094826] 
[use $conf[title] in notify mails #374
andi@xxxxxxxxxxxxxx**20050617084820] 
[spanish language update
Adrián Ariza <adrian_ariza.ciudad.com.ar>**20050616161741] 
[correction of typos
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050615175208
 A wrong variable name was used in the english language file and
 an gramatically mistake in function comments was corrected.
] 
[Norwegian Language Update
Jorge Barrera Grandon <jorge@xxxxxxxxxxxxxxxxx>**20050615083147] 
[fix for interwiki gif icons
andi@xxxxxxxxxxxxxx**20050614175335] 
[Spellchecker: use UTF-8 workaround only if needed
andi@xxxxxxxxxxxxxx**20050614174004
 The spellchecker now tests the browsers UTF-8 compliance and only uses
 the entitiy encoding if needed. This hopefully fixes problems with
 Safari.
] 
[spellchecker should not check links
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050613215834
 The spellchecker should not check links because this are
 mostly no real words. This patch installs some filters
 so that links won't be transfered to the spellchecker.
] 
[spellchecker button control
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050613182725
 This patch replaces the big textual spellchecker controls with
 a nice one using toolbar like buttons
] 
[spellchecker fix for broken aspell
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050612154241
 The current Aspell version has a bug that causes a corrupt output file.
 Output lines beginning with '?' weren't terminated with a newline.
 This patch fixes the broken output format.
 
 It is not possible to detect automatically if a Aspell version handles
 '?'-lines correctly. Therefore DokuWiki checks for Aspells version
 number and corrects the output format accordingly if version <= 0.60.3.
 This is todays latest release so that we must have an eye on this
 problem and prove wether future Aspell versions would still have this
 bug. If so, the number in the version number test in /inc/aspell.php
 must be adapted.
] 
[lexer support for subpatterns, fixed windowsshare links #368
andi@xxxxxxxxxxxxxx**20050612183557] 
[mysql auth: added support for old passchecking method #359
andi@xxxxxxxxxxxxxx**20050612111044
 This patch changes the mysql auth mechanism to support the old
 method of password checking (leaving it to the DB) as well as
 the new one. Which one is used is decided on which option is
 defined:
 
 $conf['auth']['mysql']['passcheck'] now behaves as in older
 releases, You can use %u, %g and %p where %p contains the
 cleartext password entered by the user. Access is granted
 if the SQL statement returns one result row.
 
 if $conf['auth']['mysql']['getpass'] is defined it is used
 to fetch the crypted password from the database which is then
 checked with auth_verifyPassword() - This is the preferred
 method.
 
 Users of the devel need to change their config by renaming
 passcheck to getpass
] 
[aspell error workaround
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050611144306
 Aspell breaks its own output format due to undocumented features.
 This patch worked around this error. Problems regarding freezing
 of the spellchecker or jammed wiki pages through the spellchecker
 are solved.
] 
[Update and fix in Portuguese (Brazil) translation
loug85@xxxxxxxxx**20050611174723] 
[small spellchecker fix for suggestions with spaces or singlequotes
andi@xxxxxxxxxxxxxx**20050611123804] 
[spellchecker: compensate for aspell error and blocking problems
andi@xxxxxxxxxxxxxx**20050611121059
 Sometimes Aspell seems to output not enough blank lines to signal
 a line change. This patch tries to compensate for this by trying
 the next two lines as well.
 This patch also fixes a problem were reading from aspell could
 produce a deadlock on the socket and would cause the spellchecker
 to never return
] 
[spellchecker fixes for Konqeror
andi@xxxxxxxxxxxxxx**20050611092916
 Konqeror seems to ignore the charset=utf-8 header in XMLhttpRequests
 responses as workaround all multibyte chars in answers from
 spellcheck.php are now encoded as numeric entities and decoded back
 on the clientside.
 
 Spellchecking now works for me with Firefox 1.04, MSIE 6, Opera 8 and
 Konqeror 3.3.2. It should also work with Safari and all current
 Mozilla-based Browsers.
 
] 
[Added option to manually change a misspelled word
andi@xxxxxxxxxxxxxx**20050609233643] 
[Spellchecker fix for large files
andi@xxxxxxxxxxxxxx**20050609230143] 
[spellchecker fix for eating whitespaces
andi@xxxxxxxxxxxxxx**20050609183709] 
[danish language update
koeppe <koeppe@xxxxxxxx>**20050609170153] 
[proper quoting of single quotes in spellcheck
andi@xxxxxxxxxxxxxx**20050609161958] 
[spellchecker style fix for Safari
andi@xxxxxxxxxxxxxx**20050609111344] 
[session_write_close added #364
andi@xxxxxxxxxxxxxx**20050608213514
 I just learned that PHP does lock it's session objects. This is realy
 bad if you have multiple images in a page as each one will call fetch.php
 which locks the session, so everything can only be loaded sequentially.
 The fix for this is to close the session after using it which is after doing
 the auth and the breadcrumbs. I added the needed calls everywhere.
] 
[Allow source view with read only permissions #383
andi@xxxxxxxxxxxxxx**20050608210912] 
[fixed grammar in de lang file
andi@xxxxxxxxxxxxxx**20050608210819] 
[da language update
andi@xxxxxxxxxxxxxx**20050608201217] 
[nl language update
Jack van Klaren <dokuwiki@xxxxxxxxxxxxxxxxx>**20050608201144] 
[heading buttons height adjustment
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050608172429
 The editor buttons for the headlines were 1px to high. This patch
 fixes that.
] 
[fixed JS error when spellchecker is disabled
andi@xxxxxxxxxxxxxx**20050608194746] 
[Spellchecker fixes
andi@xxxxxxxxxxxxxx**20050608182758
 The spellchecker now works in IE6, Firefox and Opera 8 :-)
 SACK was updated to the latest release (plus a minor fix)
 Proper UTF-8 headers were added to the AJAX PHP backends
] 
[et language update
Kaiko Kaur <kaiko@xxxxxxxxxxxxxx>**20050607200902] 
[da update
koeppe <koeppe@xxxxxxxx>**20050607200309] 
[IE secedit button fix
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050607164818
 IE displays the sector edit buttons bigger than designed.
 This is a known problem of the special Microsoft box model
 the IE uses. This patch adjusts the buttons height to the
 desired value but they are still too wide. As I understand
 certain internet sources right: There is no solution for
 this. Whatever, let's enjoy what we have.
] 
[AJAX spellchecker #29
andi@xxxxxxxxxxxxxx**20050607194456
 This is nearly a complete rewrite of the gmail like AJAX spellchecker
 from http://www.broken-notebook.com/spell_checker/index.php
 
 Here are the differences and features
 
   * seemless integrated into DokuWiki
   * no need for the pspell extension
   * needs GNU aspell installed (not sure about the version I guess
     0.60+ for UTF8)
   * needs PHP 4.3.0+
   * uses SACK for AJAX
   * gets errors and suggestions in one transfer
 
 So far only tested in Firefox. It should work in IE, Safari and
 Opera 8, too. Please test and report back.
 
 
] 
[TOC arrow with simple transparency
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050606163659
 This patch exchanges the images for the TOC arrow from
 PNG with alpha channel to GIF with transparent background.
 This is done because the IE doesn't cope with transparent
 PNG images very well. Shame on you Microsoft.
] 
[IE text entry height adjustment
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050606165106
 The height of text entry field look different in height between
 IE and Firefox. This patch adjusts the CSS files that both look
 the same.
] 
[cache control header
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050606154420
 This patch adds a cache control header to fetch.php. Without
 this header media files can't be opened and viewed with third
 party programs directly from the IE browser window. For eg.
 Acrobat Reader will display an error message after clicking
 on a link to a PDF file. Firefox will work without it.
] 
[Extending useheading
chris@xxxxxxxxxxxxxxxxx**20050605132931
 This patch will extend the useheading configuration setting to apply to
 - search page
 - backlinks page
 - recent changes page
 
] 
[fetch directory structure fix
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050605130154
 fetch.php was not fully adapted to the new directory structure - fixed
] 
[media popup directory structure fix
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050605125410
 The media popup was not fully adapted to the new directory
 structure - fixed
] 
[moved lang directory into inc dir
andi@xxxxxxxxxxxxxx**20050605110714] 
[Strike-through Quick Button
chris@xxxxxxxxxxxxx**20050605110302] 
[extended search fix no. 2
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050605085854
 The last patches confused darcs so we get a mixed up code.
 This patch corrected the mess hopefully.
] 
[directory layout cleanup !IMPORTANT
andi@xxxxxxxxxxxxxx**20050605103842
 This patch changes the directory structure of dokuwiki as suggested
 in http://www.freelists.org/archives/dokuwiki/06-2005/msg00045.html
 
 As the changes.log is not managed through darcs you need to move it your
 self to the new location in data/changes.log
 
 I think I modified the code at all nessessary places, but I may have
 forgotten a few things.
] 
[extended search fix
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050604212026
 This patch fixes a bug in the search code and did some
 optimizations. Furtheron queries with only excluded
 words will be rejected because they won't produce
 usable output and waste only time.
] 
[extended search fix
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx*-20050604194621
 This patch fixes a bug in the search code and did some
 small optimizations.
 
 The possibility to start a search with _only_ excluded
 words (only words start with a minus sign) was disabled
 because this seem to crash PHP 4.3.10 (at least the ppc
 version :-()
] 
[much better Opera 8 AJAX fix (no fallback to GET needed)
andi@xxxxxxxxxxxxxx**20050604215355] 
[AJAX fix for Opera 8
andi@xxxxxxxxxxxxxx**20050604211320] 
[extended search fix
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050604194621
 This patch fixes a bug in the search code and did some
 small optimizations.
 
 The possibility to start a search with _only_ excluded
 words (only words start with a minus sign) was disabled
 because this seem to crash PHP 4.3.10 (at least the ppc
 version :-()
] 
[removed SACK warning for older browsers #369
andi@xxxxxxxxxxxxxx**20050604185143
 Older Browsers (Opera) got a warning from the new AJAX stuff. It's a bug
 in SACK described at
 http://twilightuniverse.com/2005/05/sack-of-ajax/#comment-594
 I just removed it from tw-sack.js
 
 I also added the line suggested at
 http://twilightuniverse.com/2005/05/sack-of-ajax/#comment-597 - not
 used yet but may come in handy
 
] 
[nl update
Jack van Klaren <dokuwiki@xxxxxxxxxxxxxxxxx>**20050604184408] 
[Mediafile Deletion and Overwrite Handling #200
andi@xxxxxxxxxxxxxx**20050603205501
 This patch enhances the ACL feature by adding another Permission called DELETE 
- this permission
 allows a user to delete or overwrite existing mediafiles. Users with UPLOAD 
permission are no longer
 allowed to overwrite media files.
   
 Users whith DELETE permissions now need to check an additional checkbox to 
overwrite existing files,
 this is to prevent accidently deletions.
 
 Please note: If no ACL is used UPLOAD rights are assumed for everybody - not 
DELETE rights. This
 changes the behaviour from previous versions as UPLOAD does not allow 
overwriting anymore.
] 
[extended search function
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050603182746
 The DokuWiki search function uses 'OR' to combine
 multiple search words. This behaviour is unusual and
 not very helpful to narrow the search results.
 This patch changed the behaviour to 'AND'. Multiple
 search words will reduce the count of search results.
 
 It uses assertions now. This has the big advantage
 that only one regular expression have to be processed
 for each file and the behaviour can be changed easily.
 
 The functionallity has been extended: Words with a
 preceding minus sign (-) will be excluded from and
 words with a preceding plus sign (+) will be included
 in the search results. Is a preceding sign is missing
 (+) is assumed.
] 
[keep search input on search page
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050601163504
 This patch modifies the search input form so that the search input
 is kept as long as the user stays on the search page. This is pure
 comfort because he is able to optimise his query step by step without
 the need of typing in the query multiple times.
] 
[String quoting in TOC toggle code
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050531193827
 This patch changed the string quoting in the TOC toggle button code.
 The HTML code looks better.
] 
[toc toggle button
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050531184155
 The TOC toggle button was very small and inconspicuous. This patch
 replaces the old one with small arrows placed at the right border
 of the TOC header.
 Code cleanup in html.php: html_toc() and html_list_toc() are obsolete
 and have been removed.
] 
[add a back button to parent page
matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx**20050519174025
 This patch extends the template functions with back
 button linking to the current pages' parent if
 available. Both tpl_button() and tpl_actionlink()
 are supported.
 
 For this to work the first page in the namespace must
 have the same name as the namespace itself. The 'back'
 button of every page in this namespace links to 
 namespace:namespace. The 'back' button of the page
 namespace:namespace links to the first page of the 
 containing namespace and so forth until the start page
 has been reached.
 
 Because of the precondition decribed above, the default
 template hasn't got the new 'back' button. It is reserved
 for custom made templates and installations which take
 care of the precondition.
] 
[TAG develsnap 2005-05-31
andi@xxxxxxxxxxxxxx**20050531214447] 
Patch bundle hash:
a2a33ad0adfddc1105092ae8f4ae7638bab2fb25

Other related posts: