www/scripts/xsltproc.py

116 lines
3.0 KiB
Python
Raw Normal View History

#!/usr/bin/python2.4
import os, sys, urllib, libxml2, libxslt, ldap, time
#
# globals
#
cscUri = "http://csclub.uwaterloo.ca/xsltproc"
cscTerms = ["Winter", "Spring", "Fall"]
cscShortTerms = ['w', 's', 'f']
cscLdapUri = "ldap://ldap1.csclub.uwaterloo.ca ldap://ldap2.csclub.uwaterloo.ca"
cscLdap = None
cscPeopleBase = 'ou=People,dc=csclub,dc=uwaterloo,dc=ca'
#
# cscLdapConnect
#
def cscLdapConnect():
global cscLdap
cscLdap = ldap.initialize(cscLdapUri)
cscLdap.simple_bind_s("", "")
#
# csc:encode-for-uri
#
def cscEncodeForUri(ctx, arg):
if type(arg) == type([]):
arg = libxml2.xmlNode(arg[0]).getContent()
return urllib.quote(arg)
#
# csc:term
#
def cscTerm(ctx, arg):
if type(arg) == type([]):
arg = libxml2.xmlNode(arg[0]).getContent()
try:
[year, month, day] = arg.split("-")
2007-11-10 03:58:28 -05:00
term = (int(month) - 1) / 4
return cscTerms[term] + " " + year
except:
print "Invalid term '%s'" % arg
#
# csc:member-list
#
def cscMemberList(ctx, arg):
try:
if cscLdap == None:
cscLdapConnect()
curDate = time.strftime('%d-%m-%Y')
year = time.localtime().tm_year
term = cscShortTerms[int(time.localtime().tm_mon - 1) / 4]
members = cscLdap.search_s(cscPeopleBase, ldap.SCOPE_SUBTREE,
'(&(objectClass=member)(term=%s%d))' % (term, year))
doc = libxml2.newDoc("1.0")
root = doc.newChild(None, "memberlist", None)
for (_, member) in members:
node = root.newChild(None, "member", None)
node.setProp("userid", member['uid'][0])
node.setProp("name", member['cn'][0])
if not 'program' in member:
member['program'] = ['']
node.setProp("program", member['program'][0])
return [root]
except Exception, e:
print e
raise
#
# csc:email
#
def cscEmail(ctx, arg):
if type(arg) == type([]):
str = libxml2.xmlNode(arg[0]).getContent()
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:
2007-11-10 03:58:28 -05:00
try:
[key, val] = p.split("=")
params[key] = "'" + val + "'"
except:
print "Missing value for parameter '%s'" % p
sys.exit(1)
try:
# register extensions
libxslt.registerExtModuleFunction("encode-for-uri", cscUri, cscEncodeForUri)
libxslt.registerExtModuleFunction("term", cscUri, cscTerm)
libxslt.registerExtModuleFunction("member-list", cscUri, cscMemberList)
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)
ret = style.saveResultToFilename(outFile, res, 0)
except Exception, e:
print e
sys.exit(1)