1
0
mirror of https://gitlab.gnome.org/GNOME/libxslt synced 2025-04-23 14:45:32 +03:00
libxslt/python/tests/pyxsltproc.py
Daniel Veillard c99f3afb5f removed tab used spaces preparing 1.0.12 rebuild/updated Daniel
* python/*.py: removed tab used spaces
* configure.in libxslt/xsltwin32config.h: preparing 1.0.12
* doc/news.html doc/xslt.html: rebuild/updated
Daniel
2002-02-11 18:54:47 +00:00

300 lines
8.9 KiB
Python
Executable File

#!/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 posix
import string
import libxml2
import libxslt
# Memory debug specific
libxml2.debugMemory(1)
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 intput"
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 = posix.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)