/proj/unrddl/index.cgi

#!/usr/bin/env python
"""
UnRDDL - Convert RDDL Documents to HTML
Author: Sean B. Palmer, inamidst.com
License: GPL 2; share and enjoy!
Requires: /usr/bin/xsltproc
"""

import cgitb; cgitb.enable()
import sys, os, cgi, urllib, tempfile
sys.path.append('../../misc')
from cgiutil import serve

form = cgi.FieldStorage()
form.__call__ = lambda s: form[s].value

def mktemp(text=None, pfx=None, sfx=None): 
   if pfx is None: pfx = 'unrddled'
   if sfx is None: sfx = '.tmp'

   fd, fn = tempfile.mkstemp(prefix=pfx, suffix=sfx)
   if text: 
      f = os.fdopen(fd, 'w')
      f.write(text)
      f.close()
   return fn

def shell(script, scriptname): 
   def command(args): 
      status = os.spawnv(os.P_WAIT, script, [scriptname] + args)
      if status != 0: 
         msg = "%s %s returned %s status"
         raise Exception, msg % (scriptname, args, abs(status))
      return
   return command

xsltproc = shell('/usr/bin/xsltproc', 'xsltproc')

def xslt(xsltfn, xmlfn, outfn): 
   args = ['--novalid', '-o', outfn, xsltfn, xmlfn]
   xsltproc(args)

def getXSLT(xsltfn, xmlfn): 
   outfn = mktemp(pfx='unrddled', sfx='.html')
   xslt(xsltfn, xmlfn, outfn)
   f = open(outfn, 'r')
   s = f.read()
   f.close()
   os.unlink(outfn)
   return s

XHTMLStrict = """
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" >
""".strip()

def main(): 
   xsltfn = 'v2.xsl'
   if form.has_key('uri'): 
      uri = form('uri')
      xmlfn, info = urllib.urlretrieve(uri)
      result = getXSLT(xsltfn, xmlfn)
      os.unlink(xmlfn)
      result = result.replace(' xmlns:rddl="http://www.rddl.org/"', '', 1)
      result = XHTMLStrict + '\n\n' + result
      serve(200, result, mime='text/html')
   else: serve(200, __doc__.lstrip(), mime='text/plain')

if __name__=="__main__": 
   main()