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!

4 comments:

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?