diff options
Diffstat (limited to 'libxslt/python/tests/pyxsltproc.py')
-rwxr-xr-x | libxslt/python/tests/pyxsltproc.py | 298 |
1 files changed, 298 insertions, 0 deletions
diff --git a/libxslt/python/tests/pyxsltproc.py b/libxslt/python/tests/pyxsltproc.py new file mode 100755 index 0000000..238fa5b --- /dev/null +++ b/libxslt/python/tests/pyxsltproc.py @@ -0,0 +1,298 @@ +#!/usr/bin/python -u +# +# The exercise of rewriting xsltproc on top of the python +# bindings, not complete yet and shows up the things missing +# from the existing python interfaces +# +import sys +import time +import os +import string +import libxml2 +# Memory debug specific +libxml2.debugMemory(1) +import libxslt + +debug = 0 +repeat = 0 +timing = 0 +novalid = 0 +noout = 0 +docbook = 0 +html = 0 +xinclude = 0 +profile = 0 +params = {} +output = None +errorno = 0 + +# +# timing +# +begin = 0 +endtime = 0 +def startTimer(): + global begin + + begin = time.time() + +def endTimer(msg): + global begin + global endtime + + endtime = time.time() + print "%s took %d ms" % (msg, (endtime - begin) * 1000) + +def xsltProcess(doc, cur, filename): + global timing + global xinclude + global params + global html + + if xinclude: + if timing: + startTimer() + doc.XIncludeProcess() + if timing: + endTimer("XInclude processing %s" % (filename)) + + if timing: + startTimer() + if output == None: + if repeat != 0: + for j in range(1, repeat): + res = cur.applyStylesheet(doc, params) + res.freeDoc() + doc.freeDoc() + if html == 1: + doc = libxml2.htmlParseFile(filename, None) + else: + doc = libxml2.parseFile(filename, None) +# ctxt = libxslt.newTransformContext(doc) +# if ctxt == None: +# return + if profile: + print "TODO: Profiling not yet supported" + else: + res = cur.applyStylesheet(doc, params) + if timing: + if repeat != 0: + endTimer("Applying stylesheet %d times" % (repeat)) + else: + endTimer("Applying stylesheet") + doc.freeDoc() + if res == None: + print "no result for %s" % (filename) + return + if noout != 0: + res.freeDoc() + return + if debug == 1: + res.debugDumpDocument(None) + else: + if timing: + startTimer() + cur.saveResultToFilename("-", res, 0) + if timing: + endTimer("Saving result") + res.freeDoc() + else: + print "TODO: xsltRunStylesheet not yet mapped" + +def usage(name = 'pyxsltproc'): + print "Usage: %s [options] stylesheet file [file ...]" % (name) + print "a reimplementation of xsltproc(1) on top of libxslt-python" + print " Options:" + print "\t--version or -V: show the version of libxml and libxslt used" + print "\t--verbose or -v: show logs of what's happening" + print "\t--output file or -o file: save to a given file" + print "\t--timing: display the time used" + print "\t--repeat: run the transformation 20 times" + print "\t--debug: dump the tree of the result instead" + print "\t--novalid skip the Dtd loading phase" + print "\t--noout: do not dump the result" + print "\t--maxdepth val : increase the maximum depth" + print "\t--html: the input document is(are) an HTML file(s)" + print "\t--param name value : pass a (parameter,value) pair" + print "\t value is an XPath expression." + print "\t string values must be quoted like \"'string'\"" + print "\t or use stringparam to avoid it" + print "\t--stringparam name value : pass a (parameter,string value) pair" + print "\t--nonet refuse to fetch DTDs or entities over network" + print "\t--catalogs : use SGML catalogs from $SGML_CATALOG_FILES" + print "\t otherwise XML Catalogs starting from " + print "\t file:///etc/xml/catalog are activated by default" + print "\t--xinclude : do XInclude processing on document input" + print "\t--profile or --norman : dump profiling informations " + print "\nProject libxslt home page: http://xmlsoft.org/XSLT/" + print "To report bugs and get help: http://xmlsoft.org/XSLT/bugs.html" + +def main(args = None): + global debug + global repeat + global timing + global novalid + global noout + global docbook + global html + global xinclude + global profile + global params + global output + global errorno + + done = 0 + cur = None + + if not args: + args = sys.argv[1:] + if len(args) <= 0: + usage(sys.argv[0]) + + + i = 0 + while i < len(args): + if args[i] == "-": + break + if args[i][0] != '-': + i = i + 1 + continue + if args[i] == "-timing" or args[i] == "--timing": + timing = 1 + elif args[i] == "-debug" or args[i] == "--debug": + debug = 1 + elif args[i] == "-verbose" or args[i] == "--verbose" or \ + args[i] == "-v": + print "TODO: xsltSetGenericDebugFunc() mapping missing" + elif args[i] == "-version" or args[i] == "--version" or \ + args[i] == "-V": + print "TODO: version informations mapping missing" + elif args[i] == "-verbose" or args[i] == "--verbose" or \ + args[i] == "-v": + if repeat == 0: + repeat = 20 + else: + repeat = 100 + elif args[i] == "-novalid" or args[i] == "--novalid": + print "TODO: xmlLoadExtDtdDefaultValue mapping missing" + novalid = 1 + elif args[i] == "-noout" or args[i] == "--noout": + noout = 1 + elif args[i] == "-html" or args[i] == "--html": + html = 1 + elif args[i] == "-nonet" or args[i] == "--nonet": + print "TODO: xmlSetExternalEntityLoader mapping missing" + nonet = 1 + elif args[i] == "-catalogs" or args[i] == "--catalogs": + try: + catalogs = os.environ['SGML_CATALOG_FILES'] + except: + catalogs = None + if catalogs != none: + libxml2.xmlLoadCatalogs(catalogs) + else: + print "Variable $SGML_CATALOG_FILES not set" + elif args[i] == "-xinclude" or args[i] == "--xinclude": + xinclude = 1 + libxslt.setXIncludeDefault(1) + elif args[i] == "-param" or args[i] == "--param": + i = i + 1 + params[args[i]] = args[i + 1] + i = i + 1 + elif args[i] == "-stringparam" or args[i] == "--stringparam": + i = i + 1 + params[args[i]] = "'%s'" % (args[i + 1]) + i = i + 1 + elif args[i] == "-maxdepth" or args[i] == "--maxdepth": + print "TODO: xsltMaxDepth mapping missing" + else: + print "Unknown option %s" % (args[i]) + usage() + return(3) + + + + + i = i + 1 + + libxml2.lineNumbersDefault(1) + libxml2.substituteEntitiesDefault(1) + # TODO: xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS + # if novalid: + # TODO: xmlLoadExtDtdDefaultValue = 0 + + # TODO libxslt.exsltRegisterAll(); + libxslt.registerTestModule() + + i = 0 + while i < len(args) and done == 0: + if args[i] == "-maxdepth" or args[i] == "--maxdepth": + i = i + 2 + continue + if args[i] == "-o" or args[i] == "-output" or args[i] == "--output": + i = i + 2 + continue + if args[i] == "-param" or args[i] == "--param": + i = i + 3 + continue + if args[i] == "-stringparam" or args[i] == "--stringparam": + i = i + 3 + continue + if args[i] != "-" and args[i][0] == '-': + i = i + 1 + continue + if timing: + startTimer() + style = libxml2.parseFile(args[i]) + if timing: + endTimer("Parsing stylesheet %s" % (args[i])) + if style == None: + print "cannot parse %s" % (args[i]) + cur = None + errorno = 4 + done = 1 + else: + cur = libxslt.loadStylesheetPI(style) + if cur != None: + xsltProcess(style, cur, args[i]) + cur = None + else: + cur = libxslt.parseStylesheetDoc(style) + if cur == None: + style.freeDoc() + errorno = 5 + done = 1 + i = i + 1 + break + + while i < len(args) and done == 0 and cur != None: + if timing: + startTimer() + if html: + doc = libxml2.htmlParseFile(args[i], None) + else: + doc = libxml2.parseFile(args[i]) + if doc == None: + print "unable to parse %s" % (args[i]) + errorno = 6 + i = i + 1 + continue + if timing: + endTimer("Parsing document %s" % (args[i])) + xsltProcess(doc, cur, args[i]) + i = i + 1 + + if cur != None: + cur.freeStylesheet() + params = None + +if __name__ == "__main__": + main() + +# Memory debug specific +libxslt.cleanup() +if libxml2.debugMemory(1) != 0: + print "Memory leak %d bytes" % (libxml2.debugMemory(1)) + libxml2.dumpMemory() + +sys.exit(errorno) |