- utils.tcl: from Wikit
- format.tcl: also from Wikit
- worddiff.tcl: from http://pascal.scheffers.net/wikidiff/worddiff.tcl.txt
(see WordDiff for an explanation) - wikihist.css: actually just a renamed copy of PS's wikit.css at http://pascal.scheffers.net/wikidiff/wikit.css

- replace the initial "exec /home/wiki..." line with the path to your Tcl interpreter
- replace all instances of "/usr/local/bin/cvs" with the path to your version of CVS. I didn't just use "cvs" because /usr/local/bin wasn't in the PATH of our webserver.
- replace any references to "http://saskatoon/
..." with appropriate references for your site - make sure any references to wikihist.css point to your own CSS file
- replace the line "cd /home/wiki/wikit/wikipages-co/wiki/daily" to change to a directory where you can check out the Wiki pages from CVS
- and I think that's it.
to get usage instructions. Basically, you can:- get a revision history of a specified page. For example, "wikihist.cgi/12" gets you the history of page 12.
- retrieve an old revision of a specified page. For example, "wikihist.cgi/12.5" gets you revision 1.5 of page 12.
- compare the latest revision with a specified revision. For example, "wikihist.cgi/12-5" compares the latest revision of page 12 with revision 1.5, and displays it in WikiDiff format.
- compare two specified revisions. For example, "wikihist.cgi/12-5-2" compares revision 1.5 of page 12 with revision 1.2, and displays it in WikiDiff format.
set updated "Updated [cgi_font size=-1 $date]"add the following line:
append updated " [nbspace]-[nbspace] <A HREF=\"http://saskatoon/wikit/wikihist.cgi/$N\">RevisionHistory</A>"
#!/bin/sh
#\
exec /home/wiki/wikit/public_html/wiki/tclkit-solaris-sparc $0
source utils.tcl
source format.tcl
source worddiff.tcl
# This proc returns the contents of the specified revision number
# of the specified Wiki page. If no revision number is specified,
# the latest revision is obtained.
# As coded, this obtains it from the CVS repository. If desired,
# this could be recoded to get it from a tclhist archive.
proc getPageContents {PageNumber {RevNumber Latest}} {
if {[string equal $RevNumber "Latest"]} {
catch {exec /usr/local/bin/cvs update -p $PageNumber 2> /dev/null}\
PageContents
} else {
catch {exec /usr/local/bin/cvs update -r1.$RevNumber -p $PageNumber\
2> /dev/null} PageContents
}
return $PageContents
}
# This proc determines the title of the specified Wiki page.
proc getPageTitle {PageNumber} {
# Grab a copy of the latest version of the page from CVS.
# The title is found on the first line of this page.
set PageContents [getPageContents $PageNumber]
set TitleLine [lindex [split $PageContents \n] 0]
# Now, extract the title from the title line
regexp {^Title:\s*(.*)$} $TitleLine junk Title
return $Title
}
# This procedure splits long lines into lines no longer than 80 characters
proc splitlongline { line } {
set maxlen 80
set thisline ""
set lines [list]
set opentag 0
foreach word [split $line " "] {
if { $opentag || [string first "<" $word] > -1 } {
set opentag 1
append thisline " $word"
if { [string last ">" $word] > [string last "<" $word] } {
set opentag 0
}
} else {
if { [string equal $thisline ""] } {
append thisline $word
} else {
if { [string length "$thisline $word"] > $maxlen } {
if { [llength $lines] > 0 } {
set thisline "<span class=\"continue\">... </span>$thisline"
}
lappend lines $thisline
set thisline $word
} else {
append thisline " $word"
}
}
}
}
if { [llength $lines] > 0 } {
set thisline "<span class=\"continue\">... </span>$thisline"
}
lappend lines $thisline
return [join $lines \n]
}
# This proc substitutes any special characters with their HTML equivalents.
proc quoteHtml {s} {
string map { & & < < > > } $s
}
# For the given Wiki page number, this proc examines the CVS log to determine
# the revision number and check-in time of all revisions. The list
# returned is ordered from latest revision to earliest revision.
# Every revision results in two items in the last, the first being
# the minor revision number, and the second being the time that
# this revision was checked into CVS, given as the number of
# seconds since the Tcl epoch.
#
# Only major revision # 1 is examined.
proc getRevisionList {PageNumber} {
set RevisionList {}
# Note: for cvs to generate a log, it needs write permission to the
# CVS directory. If the Web Server doesn't have this permission,
# this script will fail.
catch {exec /usr/local/bin/cvs log -r1 -N $PageNumber 2> /dev/null} CvsOutput
foreach CvsLine [split $CvsOutput \n] {
# Look for a line indicating the revision number.
# It will start with "revision 1.", followed by the minor
# revision number.
if {[regexp {^revision 1.(\d+)} $CvsLine - RevNumber]} {
set a $RevNumber
}
# Also, look for a line indicating the date.
# This should follow the revision number in the CVS output,
# so we will associate this date with the last revision number we saw.
# The date line starts with "date", and the date is in the format
# Year/Month/Day Hour:Minute:Second. Tcl is unable to interpret
# this date format, so we need to convert it into a format Tcl
# can understand before converting it to seconds.
if {[regexp {^date} $CvsLine]} {
set DateString [string range $CvsLine 6 24]
regexp {(\d+)/(\d+)/(\d+) (\d\d:\d\d:\d\d)}\
$DateString junk Year Mon Day Time
set RevTime [clock scan "$Mon/$Day/$Year $Time" -gmt 1]
lappend RevisionList $RevNumber $RevTime
}
}
return $RevisionList
}
# This procedure generates the revision history HTML page
# for the specified Wiki page number
proc genRevisionHistory {PageNumber} {
# Generate the content type for the page (HTML)
puts "Content-type: text/html"
puts "Pragma: no-cache"
puts ""
# Determine the title of this page
set PageTitle [quoteHtml [getPageTitle $PageNumber]]
# Now, generate the page header.
puts "<html>"
puts ""
puts "<head>"
puts " <title>Revision History of $PageTitle</title>"
puts " <meta content=\"no-cache\" http-equiv=\"Pragma\">"
puts " <meta content=\"Mon, 04 Dec 1999 21:29:02 GMT\" http-equiv=\"Expire\">"
puts { <link type="text/css" href="/wikit/wikihist.css" rel="stylesheet">}
puts "</head>"
puts ""
puts "<body bgcolor=\"\#ffffff\">"
puts " <h2>"
puts " <a href=\"http://saskatoon/wikit/wiki.cgi/$PageNumber\">$PageTitle</a
>"
puts " </h2>"
puts " <b>Revision History</b>"
puts ""
puts " <p>"
puts " Legend: (current) = difference with current version,"
puts " (last) = difference with preceding version,"
puts " <em>date</em> = that day's version"
puts " </p>"
puts ""
# Now, obtain a list of the revisions and the time that they were
# checked in.
set RevisionList [getRevisionList $PageNumber]
# Now that we've got the list of revisions, we need to generate the
# revision information to display on the page.
puts " <ul>"
set FirstEntry true
foreach {RevNumber RevDate} $RevisionList {
set DateString [clock format $RevDate -format "%b %d, %Y"]
puts " <li>"
puts " Version $RevNumber:"
if { !$FirstEntry } {
puts " (<a href=\"http://saskatoon/wikit/wikihist.cgi/$PageNumber-$RevNumber\">current</a
>)"
} else {
set FirstEntry false
}
if { $RevNumber != 1 } {
puts " (<a href=\"http://saskatoon/wikit/wikihist.cgi/$PageNumber-$RevNumber-[expr
$RevNumber - 1]\">last</a>)"
}
puts " ..."
puts " <a href=\"http://saskatoon/wikit/wikihist.cgi/$PageNumber.$RevNumber\">$DateString</a
>"
}
puts " </ul>"
puts ""
puts "</body>"
puts ""
puts "</html>"
}# (missing procs go here) # LV Okay, someone needs to tell me if this is the missing code
<blockquote>
<pre><span class="context">gray text: context matter</span>
<span class="old">red text: old text, or that which has been removed.</span>
<span class="new">green text: new text, interesting new knowledge.</span>
<span class="newpage">yellow text: new text, brand new page, interestly fresh
knowledge.</span></pre>
</blockquote>
}
puts " <p>"
puts " Differences:"
puts " </p>"
puts ""
# Display the differences
if { [string length $HtmlChanges] == 0 } {
puts " <p>"
puts " There were no differences between the two versions of the page."
puts " </p>"
puts ""
} else {
puts "<blockquote><pre class=\"diff\">$HtmlChanges</pre></blockquote>"
puts ""
}
puts "</body>"
puts ""
puts "</html>"
}
catch {
cd /home/wiki/wikit/wikipages-co/wiki/daily
if { [info exists env(PATH_INFO)] } {
set PathInfo [file tail $env(PATH_INFO)]
} else {
set PathInfo {}
}
set ShowInstructions false
set NoSuchFile false
if { [regexp {^(\d+)(\D)(\d*)$} $PathInfo - page sep rev] } {
if { [file exists $page] } {
switch -- $sep {
. {
renderPageRevision $page $rev
}
- {
renderPageDiff $page $rev
}
default {
set ShowInstructions true
}
}
} else {
set NoSuchFile true
}
} elseif { [regexp {^(\d+)(\D)(\d*)(\D)(\d*)$} $PathInfo\
- page sep1 rev1 sep2 rev2] } {
if { [file exists $page] } {
if { ( $sep1 == "-" ) && ( $sep2 == "-" ) } {
renderPageDiff $page $rev1 $rev2
} else {
set ShowInstructions true
}
} else {
set NoSuchFile true
}
} elseif { [regexp {^(\d+)$} $PathInfo - page] } {
if { [file exists $page] } {
genRevisionHistory $page
} else {
set NoSuchFile true
}
} else {
set ShowInstructions true
}
if { $ShowInstructions } {
puts "Content-type: text/plain"
puts "Pragma: no-cache"
puts {
This is the historical archive of the PMC Saskatoon Wiki
Examples:
See the revision history of page 12:
http://saskatoon/wikit/wiki/wikihist.cgi/12
Retrieve version 5 of page 12:
http://saskatoon/wikit/wiki/wikihist.cgi/12.5
Compare version 5 of page 12 with latest version:
http://saskatoon/wikit/wiki/wikihist.cgi/12-5
Compare version 5 of page 12 with version 2:
http://saskatoon/wikit/wiki/wikihist.cgi/12-5-2
}
} elseif { $NoSuchFile } {
puts "Content-type: text/plain"
puts "Pragma: no-cache"
puts ""
puts "There is no revision history for Wiki page $page."
}
} err
if 0 {
puts ####################
puts $err
puts $errorInfo
}KPV I haven't gone and extracted the utils.tcl, et al files yet but how does this differ from Wiki History Diff?sm If I understand Wiki History Diff correctly, it's a separate application that a user needs to run. Our users wanted something integrated right into the Wiki, so that they could see the history right within their web browser. Other than that, I don't think this script offers any additional functionality over Wiki History Diff.
LV: "Changes to a Tcler's wiki page become available after an offline process occurs once a day. So a page which is first updated today won't have any revisions available until tomorrow - regardless of how many changes were made today."HJG I still see this message "There is no revision history for Wiki page 15176" today (2005-12-25), but the page has been created two days ago (2005-12-23). So I wonder at which points in time these revisions are created ?Today (2005-12-26) a whole bunch of revision-entries has appeared, with dates from 2005-12-23 and 2005-12-24 - strange...
Category Wikit

