#!/usr/bin/python2.4 import os, sys, re, urllib, libxml2, libxslt # # globals # cscUri = "http://csclub.uwaterloo.ca/xsltproc" # # csc:encode-for-uri # def cscEncodeForUri(ctx, str): if type(str) == type([]): str = libxml2.xmlNode(str[0]).getContent() print urllib.quote(str) return urllib.quote(str) # # csc:term # def cscTerm(ctx, str): if type(str) == type([]): str = libxml2.xmlNode(str[0]).getContent() try: # YYYY-MM-DD (year, month, day) = re.findall("^([0-9]+)-([0-9]+)-([0-9]+)$", str)[0] month = int(month) if month >= 1 and month <= 4: return "Winter " + year elif month >= 5 and month <= 8: return "Spring " + year elif month >= 9 and month <= 12: return "Fall " + year else: print "Invalid month '" + month + "'" except: print "Invalid term '" + str + "'" # # csc:email # def cscEmail(ctx, str): return "_EMAIL_TODO_" # # main # # check argv if len(sys.argv) < 4: print "Usage: xsltproc.py input-file style-sheet output-file [params...]" sys.exit(1) inFile = sys.argv[1] xsltFile = sys.argv[2] outFile = sys.argv[3] rawParams = sys.argv[4:] # check params params = {} for p in rawParams: p = p.split("=") if len(p) == 1: print "Missing value for parameter " + p[0] sys.exit(1) params[p[0]] = "'" + p[1] + "'" try: # register extensions libxslt.registerExtModuleFunction("encode-for-uri", cscUri, cscEncodeForUri) libxslt.registerExtModuleFunction("term", cscUri, cscTerm) libxslt.registerExtModuleFunction("email", cscUri, cscEmail) # parse xml/xslt and apply style-sheet style = libxslt.parseStylesheetFile(xsltFile) doc = libxml2.parseFile(inFile) res = style.applyStylesheet(doc, params) style.saveResultToFilename(outFile, res, 0) except: print "Unexpected error:", sys.exc_info()[0] sys.exit(1)