[Home]UseModWiki/PatchesOld

UseModWiki | UseModWiki | RecentChanges | Preferences

This is the /Patches subpage as it was before I moved everything elsewhere. I suggest this page is kept for longer than ordinary revisions just in case I accidentally zapped something vital. Please don't edit here, edit where I moved the item to, and revive anything that I damaged for me!

I leave it to SomebodyElse? to decide how long to preserve this old info --RiVer


This page lists modifications to the current wiki release, mostly bug fixes.

Since there have been so many patches, I'm going to start moving them to subpages of WikiPatches (like WikiPatches/LineEnds).


Page caching bug(s):

I think http://www.mnot.net/cache_docs/ is a good document on the issue.

I installed UseModWiki at our site, and run into this problem immediately. Since our users use maybe all the possible browsers ranging from lynx to Opera to IE to anything else, I had to find a solution.

--- usemod092/wiki.pl   Sun Apr 22 00:44:10 2001
+++ wiki.cgi    Sun Apr 29 00:01:57 2001
@@ -973,6 +973,8 @@
 sub GetHttpHeader {
   my $cookie;
+  my $now;
+  $now = gmtime;
   if (defined($SetCookie{'id'})) {
     $cookie = "$CookieName="
             . "rev&" . $SetCookie{'rev'}
@@ -981,12 +983,20 @@
     $cookie .= ";expires=Fri, 08-Sep-2010 19:48:23 GMT";
     if ($HttpCharset ne '') {
       return $q->header(-cookie=>$cookie,
+                        -pragma=>"no-cache",
+                        -cache_control=>"no-cache",
+                        -last_modified=>"$now",
+                        -expires=>"+10s",
                         -type=>"text/html; charset=$HttpCharset");
     }
     return $q->header(-cookie=>$cookie);
   }
   if ($HttpCharset ne '') {
-    return $q->header(-type=>"text/html; charset=$HttpCharset");
+    return $q->header(-type=>"text/html; charset=$HttpCharset",
+                      -pragma=>"no-cache",
+                      -cache_control=>"no-cache",
+                      -last_modified=>"$now",
+                      -expires=>"+10s");
   }
   return $q->header();
 }


Conflict between Options $ThinLine and $UseHeadings

When both are active, "==== Subtitle ====" gets formatted as "<HR>", not as a header "<H4>Subtitle</H4>". Patch:

sub CommonMarkup {
...
    if ($ThinLine) {
      s/----+/<hr noshade size=1>/g;
##!!  s/====+/<hr noshade size=2>/g;    # collides with H4 !!
    } else {
      s/----+/<hr>\n/g;
    }
...
}
--HaJoGurt

perhaps

  s/^\s*====+\s*$/<hr noshade size=2>/gmx;
can be used instead. As long as you do not expect
====
heading
====
to create a level 4 heading, everything should be fine. --Ken


Simple Tables

Not a bugfix. This enables usemod to render simple tables. Tables are handled somewhat like text within "<pre> </pre>". Note that this patch doesn't work with 0.92 as it sets 'use strict', and the patch uses a global variable $tag. To make it work, you need to add $tag to the 'my' declaration right after the 'sub WikiLinesToHtml'. ==Viktor Haag Sorry, I must have lost the line "my ($tag);" somehow. Patch now repaired --HaJoGurt

| Col1 | Col2 | Col3
gets formatted as
 <TABLE BORDER=0>
 <TR><TD> Col1</TD>
 <td> Col2 </td>
 <td> Col3
 </td>
 </TR>
 </table>
The Patch:
sub CommonMarkup {
...
## Tables:
    s/^\|([^|]+)[^|]/<TR><TD>$1<\/TD>\n/g;      # start of line: new table-row
    s/\|([^|]+)[^|]/<td>$1<\/td>\n/g;           # new field
  }
  return $_;
}
sub WikiLinesToHtml {
...
  my ($tag);
...
    } elsif (/^[ \t].*\S/) {
      $code = "PRE";
      $depth = 1;
#%% Table => PRE:
    } elsif (/^[\|\+].*\S/) {
      $code = "TABLE";
      $depth = 1;
#
    } else {
      $depth = 0;
    }
    while (@htmlStack > $depth) {   # Close tags as needed
    # $pageHtml .=  "</" . pop(@htmlStack) . ">\n";
#%%
      $tag = pop(@htmlStack);
      if ($tag eq "TABLE") {
        $pageHtml .=  "</TR>\n";
        $tag = "table"
      };
      $pageHtml .=  "</" . $tag . ">\n";
    }
    if ($depth > 0) {
      $depth = $IndentLimit  if ($depth > $IndentLimit);
...#!
      while (@htmlStack < $depth) {
        push(@htmlStack, $code);
#%%
        if ($code eq "TABLE") {
          $pageHtml .= "<TABLE BORDER=0>\n";
        } else {
          $pageHtml .= "<$code>\n";
        };
      }
    }
Next project: Specify different styles, like FONT and BGCOLOR, for each row, column and/or cell :-) By the way, the original code at "...#!" above can be left out. I think that will fix a bug with mixed / nested lists :
# Foo
** Ding
** Dong
# Bar
** Ping
** Pong
----
* Foo
## Ding
## Dong
* Bar
## Ping
## Pong
will then look like:
    1. Foo
          + Ding
          + Dong
    2. Bar
          + Ping
          + Pong
----
     * Foo
         1. Ding
         2. Dong
     * Bar
         1. Ping
         2. Pong
--HaJoGurt
Enhancements / Colors New enhancements, they work like italic and bold: @@@ Red+bold @@@ ^^^ Green ^^^ ~~~ Blue ~~~ --- Small --- +++ Big +++ Patch:
sub CommonMarkup {
...
  if ($doLines) {
...
    s/(@*)@@@(.*?)@@@/$1<FONT COLOR="red"><B>$2<\/B><\/FONT>/g;
    s/(\^*)\^\^\^(.*?)\^\^\^/$1<FONT COLOR="green">$2<\/FONT>/g;
    s/(~*)~~~(.*?)~~~/$1<FONT COLOR="blue">$2<\/FONT>/g;
    s/(-*)---(.*?)---/$1<FONT SIZE="-1">$2<\/FONT>/g;
    s/(\+*)\+\+\+(.*?)\+\+\+/$1<FONT SIZE="+1">$2<\/FONT>/g;
## Tables:
...
  }
  return $_;
}
--HaJoGurt For red text, I decided it was more meaningful to just write <red>Red text</red>. I placed the following after the expression matching <tt/>.
    s/\<red\>(.*?)\<\/red\>/&StoreRaw('<span style="color:red">') . $1 . '<\/span>'/geis;
I don't think @@@ really means red to me. It's too cooked. But either way, you should use the <span/> tag, not <font/>. And if you do, don't forget to StoreRaw() it! That colon gets matched later for the dictionary lists, as I discovered. :( -- SunirShah The above "@@@" for "red" was ment as an quick and easy way to mark something as "super-bold", e.g. for warnings etc. --HaJoGurt

International Date and Time

This will output "Last edited 2001-05-31 17:44 CEST" instead of "Last edited May 31, 2001 5:44 pm" at the bottom of pages, and on RecentChanges. Patch:
package UseModWiki;
use strict;
local $| = 1;   # Do not buffer output (localized for mod_perl)
#%%
use POSIX;      # strftime
...
sub CalcDay {
  my ($ts) = @_;
  $ts += $TimeZoneOffset;
# my ($sec, $min, $hour, $mday, $mon, $year) = localtime($ts);
# return ("January", "February", "March", "April", "May", "June",
#         "July", "August", "September", "October", "November",
#         "December")[$mon]. " " . $mday . ", " . ($year+1900);
#%%
  return ( strftime "%Y-%m-%d", localtime($ts) );
}
--HaJoGurt Hans, I've put this into my CVS usemod at 203.79.72.169 as detailed in the template section -- timeless

Templates

Choose how you want your wiki to look in gory detail. Edit templates with FrontPage? or DreamWeaver? or whatever, then your site looks like that. No diffs, I've given you a .tar.gz and CVS access! -- timeless

Option to eliminate surrounding brackets from $BracketText

In config and wiki.pl, change $BracketText's line to be
$BracketText = 1;       # 1 = allow [URL text],   0 = no link descriptions, 2 = allow, but don't emit surrounding brackets
Add to StoreBracketUrl?
 sub StoreBracketUrl? {
   my ($url, $text) = @_;
   if ($text eq "") {
     $text = &GetBracketUrlIndex?($url);
   }
   return &StoreRaw("<a href=\"$url\">$text</a>") if 2 == $BracketText;
   return &StoreRaw("<a href=\"$url\">[$text]</a>");
 }
and similarly to StoreBracketLink?:
  sub StoreBracketLink? {
    my ($name, $text) = @_;
    return &StoreRaw(&GetPageLinkText($name, "$text")) if 2 == $BracketText;
    return &StoreRaw(&GetPageLinkText($name, "[$text]"));
  }
and StoreBracketInterPage?:
  sub StoreBracketInterPage? {
    my ($id, $text) = @_;
    my ($site, $remotePage, $url, $index);
    ($site, $remotePage) = split(/:/, $id, 2);
    $remotePage =~ s/&/&/g;  # Unquote common URL HTML
    $url = &GetSiteUrl($site);
    if ($text ne "") {
      #return "[$id]"  if ($url eq "");
      if ($url eq "") {
        return "$id $text" if 2 == $BracketText;
        return "[$id $text]";
      }
    } else {
      #return "[$id]"  if ($url eq "");
      if ($url eq "") {
        return "$id" if 2 == $BracketText;
        return "[$id]";
      }
      $text = &GetBracketUrlIndex?($id);
    }
    $url .= $remotePage;
    return &StoreRaw("<a href=\"$url\">$text</a>") if 2 == $BracketText;
    return &StoreRaw("<a href=\"$url\">[$text]</a>");
  }

Option to eliminate prefix slash before subpages

add a new variable to the config list: use vars qw(@RcDays? @HtmlPairs @HtmlSingle? ... $SubSlashText? ... ); add a new variable to the config: $SubSlashText?= 0; # 1 = allow \Sub 0 = only display Sub and add an extra line to GetPageLinkText:
  sub GetPageLinkText {
    my ($id, $name) = @_;

    $id =~ s|^/|$MainPage/|;
    if ($FreeLinks) {
      $id = &FreeToNormal($id);
      $name =~ s/_/ /g;
    }
    $name =~ s/^\///g if (!$SubSlachText?);
    return &ScriptLink($id, $name);
  }

Arbitrary Named Counters

Often I've wanted to keep separate running counters going for a page that aren't necessarily adjacent in text, nor an ordered list. Turns out it's easy to implement. Add a %Counters global and then add
    s/([^#])#(\w+)#/$1 . ++$Counters{$2}/ge;
to CommonMarkup. I did this just after the <tt> expression. This will match things like #foo# #foo# #bar# #foo# #bar# in the text, emitting 1 2 1 3 2. -- SunirShah

Numbered Headings and Table of Contents

cf. MeatBall:NamedAnchorsInWiki

MoinMoin-style Tables

cf. MeatBall:TableSyntax Of course, see the table patch above too.

GotoBar Labels

This is a small enhancement that adds labels in front of the links on the GotoBar, so WikiNewbies? get a little more information about what to do. It looks like this:
home: KaminskiWiki | up: CoolStuff | scan: RecentChanges | login: Preferences | Random Page
I'm using them currently on [KaminskiWiki] if you'd like to see it in action.
--- usemod092/wiki.pl   Sat Apr 21 17:44:10 2001
+++ wiki.pl     Thu Aug  9 07:54:51 2001
@@ -1087,14 +1087,14 @@
   my ($id) = @_;
   my ($main, $bartext);
-  $bartext  = &GetPageLink($HomePage);
+  $bartext  = T('home') . ': ' . &GetPageLink($HomePage);
   if ($id =~ m|/|) {
     $main = $id;
     $main =~ s|/.*||;  # Only the main page name (remove subpage)
-    $bartext .= " | " . &GetPageLink($main);
+    $bartext .= " | " . T('up') . ': ' . &GetPageLink($main);
   }
-  $bartext .= " | " . &GetPageLink($RCName);
-  $bartext .= " | " . &GetPrefsLink();
+  $bartext .= " | " . T('scan') . ': ' . &GetPageLink($RCName);
+  $bartext .= " | " . T('login') . ': ' . &GetPrefsLink();
   if (&GetParam("linkrandom", 0)) {
     $bartext .= " | " . &GetRandomLink();
   }
-- PeterKaminski Note: When the HTML template functionality is complete, this will be obsolete... I imagine something like this in the HTML template: '<wiki object="GetPageLink"/> | <wiki object="GetPrefsLink?"/>' -- timeless

ISBNLink Clean-up, Makes Changing Bookstores Easier

This patch moves the words "alternate" and "search" out of the URL variables for the bookstore and down a few lines where the ISBNLink string gets assembled. With the URLs isolated in the string variables, it's easier to swap other bookstores in or change the order (on my wiki I swap BN and Amazon, for instance).
--- usemod092/wiki.pl   Sat Apr 21 17:44:10 2001
+++ wiki.pl     Sun Aug 12 11:08:33 2001
@@ -1482,11 +1482,11 @@
   $first  = "<a href=\"http://shop.barnesandnoble.com/bookSearch/"
             . "isbnInquiry.asp?isbn=$num\">";
   $second = "<a href=\"http://www.amazon.com/exec/obidos/"
-            . "ISBN=$num\">" . T('alternate') . "</a>";
+            . "ISBN=$num\">";
   $third  = "<a href=\"http://www.pricescan.com/books/"
-            . "BookDetail.asp?isbn=$num\">" . T('search') . "</a>";
+            . "BookDetail.asp?isbn=$num\">";
   $html  = $first . "ISBN " . $rawprint . "</a> ";
-  $html .= "($second, $third)";
+  $html .= "($second" . T('alternate') . "</a>, " .  $third . T('search') . "</a>)";
   $html .= " "  if ($rawnum =~ / $/);  # Add space if old ISBN had space.
   return $html;
 }
-- PeterKaminski

offsite links target new browser window

I've added an option to cause offsite site links to spawn a new window
  my $target = "";
  if ($PopWindows) {
    $target = "target=\"_self\"";
  } else {
    $target = "";
  }
  if ($PopWindows) {
    $html .= qq(<BASE target="_blank">\n);
  }
what would be nice is for a user to select their preference --EricScheid Unfortunately if you make that a user preference, it will break the page caching feature. ---

Changes since last visit feature

This patch allows a user to show changes since his last visit. The information is stored in a cookie and kann be addressed at wiki.pl?action=rc&sincelastvisit=1 If you don't have a cookie already it showes changes for the last 30 days.

Try it at http://koeln.ccc.de/~drt/wiki.cgi?action=rc&sincelastvisit=1

 Hacked by the teenagemutantninjaheroecoders - http://c0re.jp/
 --- wiki.cgi.orig      Wed Aug 29 14:37:51 2001
 +++ wiki.cgi   Wed Aug 29 15:53:23 2001
 @@ -463,6 +463,14 @@
    $fullHtml .= &WikiToHTML($Text{'text'});
    $fullHtml .= "<hr>\n"  if (!&GetParam('embed', $EmbedWiki));
    if (($id eq $RCName) || (T($RCName) eq $id) || (T($id) eq $RCName)) {
 +
 +    if (&GetParam("sincelastvisit", 0)) {
 +        my $cookie1 = $q->cookie(-name       => $CookieName? . "-RC",
 +                                 -value   => time(),
 +                                 -expires => '+60d');
 +        print "Set-Cookie: $cookie1\r\n";
 +    }
 +
      print $fullHtml;
      &DoRc();
      print "<hr>\n"  if (!&GetParam('embed', $EmbedWiki));
 @@ -492,7 +500,10 @@
    my $starttime = 0;
    my $showbar = 0;

 -  if (&GetParam("from", 0)) {
 +  if (&GetParam("sincelastvisit", 0)) {
 +    $starttime = $q->cookie($CookieName?."-RC");
 +
 +  } elsif (&GetParam("from", 0)) {
      $starttime = &GetParam("from", 0);
      print "<h2>" . Ts('Updates since %s', &TimeToText?($starttime))
            . "</h2>\n"; 

Get it at http://c0re.jp/c0de/misc/usemod-0.92-changessincelastvisit.patch

Global CSS Style Sheet

This creates a new global configuration option called $GlobalCSS?. set $GlobalCSS? to whatever the url to your global stylesheet is. all pages in your wiki will now use this stylesheet. see http://wiki.eekeek.org Sample data/config entry:
     $GlobalCSS = '/default.css';
The Patch:
--- /home/matt/wiki/index.cgi   Fri Sep 21 22:48:18 2001
+++ index.cgi   Fri Sep 21 22:14:45 2001
@@ -48,7 +48,7 @@
              $RCName $ShowEdits $ThinLine $LinkPattern
              $InterLinkPattern $InterSitePattern $UrlProtocols
              $UrlPattern $ImageExtensions $RFCPattern $ISBNPattern
-             $FS $FS1 $FS2 $FS3 $CookieName $SiteBase
+             $FS $FS1 $FS2 $FS3 $CookieName $SiteBase $GlobalCSS
            );
 
 # Other global variables.  Must be C<use vars> because they're
@@ -67,6 +67,7 @@
 $UseConfig   = 1;       # 1 = use config file,    0 = do not look for config
 
 # Default configuration (used if UseConfig is 0)
+$GlobalCSS   = "";              # path to global css style sheet
 $CookieName  = "Wiki";          # Name for this wiki (for multi-wiki sites)
 $SiteName    = "Wiki";          # Name of site (used for titles)
 $HomePage    = "HomePage";      # Home page (change space to _)
@@ -915,14 +916,19 @@
   } else {
     $result = $q->header();
   }
-
+    
+  my %args;
+  if($GlobalCSS) {
+    $args{'-style'} = { 'src' => $GlobalCSS };
+  }        
+    
   if ($SiteBase ne "") {
     $result .= $q->start_html('-title' => "$SiteName: $title",
                               '-xbase' => $SiteBase,
-                              '-BGCOLOR' => 'white');
+                              '-BGCOLOR' => 'white', %args);
   } else {
     $result .= $q->start_html('-title' => "$SiteName: $title",
-                              '-BGCOLOR' => 'white');
+                              '-BGCOLOR' => 'white', %args);
   }
   if ($oldId ne "") {
     $result .= $q->h3("(redirected from "
@@ -1025,8 +1031,8 @@
 sub GetSearchForm {
   my ($result);
 
-  $result = "Search: " . $q->textfield(-name=>'search', -size=>20)
-            . &GetHiddenValue("dosearch", 1);
+  #$result = "Search: " . $q->textfield(-name=>'search', -size=>20)
+  #          . &GetHiddenValue("dosearch", 1);
   return $result;
 }

config file in a different directory

I wanted to have the config file in a directory that is not in the wiki base directory for security reasons. I is easily done with this patch:
--- wiki.pl     Sun Apr 22 02:44:10 2001
+++ ../usemod092-patched/wiki.pl        Sat Oct 20 18:26:24 2001
@@ -38,7 +38,7 @@
   $UseSubpage $UseCache $RawHtml $SimpleLinks $NonEnglish $LogoLeft
   $KeepDays $HtmlTags $HtmlLinks $UseDiffLog $KeepMajor $KeepAuthor
   $FreeUpper $EmailNotify $SendMail $EmailFrom $FastGlob $EmbedWiki
-  $ScriptTZ $BracketText $UseAmPm $UseConfig $UseIndex $UseLookup
+  $ScriptTZ $BracketText $UseAmPm $ConfigFile $UseIndex $UseLookup
   $RedirType $AdminPass $EditPass $UseHeadings $NetworkFile $BracketWiki
   $FreeLinks $WikiLinks $AdminDelete $FreeLinkPattern $RCName $RunCGI
   $ShowEdits $ThinLine $LinkPattern $InterLinkPattern $InterSitePattern
@@ -55,10 +55,16 @@
   $q $Now $UserID $TimeZoneOffset $ScriptName $BrowseCode $OtherCode);
 # == Configuration =====================================================
-$DataDir     = "/tmp/mywikidb"; # Main wiki directory
-$UseConfig   = 1;       # 1 = use config file,    0 = do not look for config
+# twm: changed this to contain the name of the config file rather than
+# having only a boolean variable UseConfig.
+# Of course this required a few changes later on, but only a few.
 
-# Default configuration (used if UseConfig is 0)
+$ConfigFile   = "/etc/wiki.conf";       # Name of config file; if "" defaults are used
+
+# Default configuration (used if ConfigFile is "")
+
+#twm: This should also go into the config file
+$DataDir     = "/usr/local/data/webserver/wiki.s2h.cx"; # Main wiki directory
 $CookieName  = "Wiki";          # Name for this wiki (for multi-wiki sites)
 $SiteName    = "Wiki";          # Name of site (used for titles)
 $HomePage    = "HomePage";      # Home page (change space to _)
@@ -145,8 +151,8 @@
 
 # The "main" program, called at the end of this script file.
 sub DoWikiRequest {
-  if ($UseConfig && (-f "$DataDir/config")) {
-    do "$DataDir/config";  # Later consider error checking?
+  if ( ("$ConfigFile") && (-f "$ConfigFile")) {
+    do "$ConfigFile";  # Later consider error checking?
   }
   &InitLinkPatterns();
   if (!&DoCacheBrowse()) {
So you just set $ConfigFile to "/etc/wiki.conf" and put the config file there. -- twm

UseModWiki | UseModWiki | RecentChanges | Preferences
Edit text of this page | View other revisions | Search MetaWiki
Last edited July 6, 2005 10:39 pm by MarkusLude (diff)
Search: