#!/usr/bin/env python """ CVStrac plugin to embed directed graphs using graphviz dot diagrams inside wiki entries. Inspired by the TWiki Directed Graph plugin: http://twiki.org/cgi-bin/view/Plugins/DirectedGraphPlugin $Log: dot.py,v $ Revision 1.1 2006/12/05 17:52:44 majid CVStrac dot article Revision 1.1 2006/11/22 01:23:58 majid Initial revision """ import sys, os, getopt, md5, popen2, time try: from sqlite3 import dbapi2 as sqlite except ImportError: from pysqlite2 import dbapi2 as sqlite def attach(dbname, cid, png): db = sqlite.connect(dbname, isolation_level=None) # purge old generated dots after 60 days # to keep the database small (and avoid the problem # of left-over PNGs in the TWiki plugin db.execute("""delete from attachment where fname like '%.png' and user='__dot__' and date < cast(strftime('%s', 'now') as int) - 60*86400""") atn = None for row in db.execute("""select atn from attachment where user='__dot__' and fname=?""", (cid + '.png',)): atn = row[0] if atn is None: db.execute("""insert into attachment (tn, size, date, user, mime, fname, description, content) values (0, ?, cast(strftime('%s', 'now') as int), '__dot__', 'image/png', ?, 'generated by {dot}', ?)""", (len(png), cid + '.png', buffer(png))) for row in db.execute("""select atn from attachment where user='__dot__' and fname=?""", (cid + '.png',)): atn = row[0] return atn def main(): opts, args = getopt.getopt(sys.argv[1:], '', ['name=', 'db=']) opts = dict(opts) assert '--db' in opts content = sys.stdin.read() cid = md5.new(content).hexdigest() print >> sys.stderr, content fn = '/tmp/cvsdot%d' % os.getpid() f = open(fn, 'w') print >> f, content f.close() pout, pin, perr = popen2.popen3('dot -Tpng %s' % fn) output = pout.read() err = perr.read() os.remove(fn) if output and not err: atn = attach(opts['--db'], cid, output) print '' % (atn, cid) else: print '
'
    print err
    print '
' if __name__ == '__main__': main()