Index: third_party/libxslt/python/tests/pyxsltproc.py |
diff --git a/third_party/libxslt/python/tests/pyxsltproc.py b/third_party/libxslt/python/tests/pyxsltproc.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..238fa5b4ab6e2f120ea3527af282493ee542b347 |
--- /dev/null |
+++ b/third_party/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) |