Thursday, June 30, 2005

The tale of a wiki diff implementation

I run a web game that I started in late 2000, back in the Dark Ages before there was a decent python web toolkit. It runs on a then-current version of the OpenACS TCL-based toolkit. (at around 20kloc, porting it to a more modern system wouldn't be worth the effort now.)

Recently, a player suggested that I add a wiki, since my own documentation is chronically out of date and player-run sites tend to suffer bitrot as well. (How many games are you still playing that you started 5 years ago?) So, I backported a modern OpenACS wiki module -- no trivial task; a LOT has changed in OpenACS, and not all for the better -- and was set. Except the module I backported didn't have diff functionality, probably because the various TCL options mostly suck.

Enter TclPython, a tcl module by Jean-Luc Fontaine (who is obviously a far better C hacker than I) that embeds a python interpreter. Sweet! My life just got a lot easier:

package require tclpython
set py [python::interp new]

# $a and $b are the text of the two revisions -- inject them into the python interpreter
$py exec "
from difflib import HtmlDiff
a = \"\"\"$a\"\"\".split('\\n')
b = \"\"\"$b\"\"\".split('\\n')
hd = HtmlDiff(wrapcolumn=80)
ns_return 200 text/html [$py eval "hd.make_file(b, a, context=True)"]

The finished result used make_table and included some css to make things pretty, but that's all there is to it fundamentally. Thanks, Mr. Fontaine!


Tim Lesher said...

Slowly but surely, Python will own CB.

Ahmad said...

I wish there was a unified way of interconnecting code written in different languages. Maybe Parrot or mono will do this.

Ahmad said...

I tried to find a way to privatly inform you about this, but people adding to this wiki will only be trusted, right? Because I think I spotted a vulnerability.

Stefan Olin said...

Hi, it works fine for me, thanks.
But Ahmad, can you please share your experience?