1
0
mirror of https://gitlab.gnome.org/GNOME/libxslt synced 2025-07-29 15:41:13 +03:00

fixup the script and rebuid the API cleanup provided accessors for a lot

* doc/libxslt-api.xml doc/libxslt-decl.txt doc/libxslt-refs.xml
  doc/parsedecl.py: fixup the script and rebuid the API
* libxslt/extensions.h: cleanup
* python/generator.py python/libxslt-python-api.xml python/libxslt.c
  python/libxsltclass.txt: provided accessors for a lot of the
  tructures involved in the transformation. Stylesheet and
  transformation python object don't free automatically the
  encapsulated object when deallocated.
* python/tests/Makefile.am python/tests/basic.py
  python/tests/extfunc.py python/tests/pyxsltproc.py:
  updated the examples
Daniel
This commit is contained in:
Daniel Veillard
2002-02-07 22:34:59 +00:00
parent 9de2bd46fc
commit 3146d5356f
14 changed files with 277 additions and 40 deletions

View File

@ -526,8 +526,7 @@ classes_ancestor = {
"xpathParserContext" : "libxml2.xpathParserContext",
}
classes_destructors = {
"stylesheet": "xsltFreeStylesheet",
"transformCtxt": "xsltFreeTransformContext",
"xpathContext" : "pass"
}
function_classes = {}
@ -578,6 +577,24 @@ def nameFixup(function, classe, type, file):
elif name[0:10] == "xmlNodeGet" and file == "python_accessor":
func = name[10:]
func = string.lower(func[0:1]) + func[1:]
elif name[0:18] == "xsltXPathParserGet" and file == "python_accessor":
func = name[18:]
func = string.lower(func[0:1]) + func[1:]
elif name[0:12] == "xsltXPathGet" and file == "python_accessor":
func = name[12:]
func = string.lower(func[0:1]) + func[1:]
elif name[0:16] == "xsltTransformGet" and file == "python_accessor":
func = name[16:]
func = string.lower(func[0:1]) + func[1:]
elif name[0:16] == "xsltTransformSet" and file == "python_accessor":
func = name[13:]
func = string.lower(func[0:1]) + func[1:]
elif name[0:17] == "xsltStylesheetGet" and file == "python_accessor":
func = name[17:]
func = string.lower(func[0:1]) + func[1:]
elif name[0:17] == "xsltStylesheetSet" and file == "python_accessor":
func = name[14:]
func = string.lower(func[0:1]) + func[1:]
elif name[0:l] == classe:
func = name[l:]
func = string.lower(func[0:1]) + func[1:]
@ -784,10 +801,13 @@ for classname in classes_list:
classes.write(" self._o = None\n\n");
if classes_destructors.has_key(classname):
classes.write(" def __del__(self):\n")
classes.write(" if self._o != None:\n")
classes.write(" _libxslt.%s(self._o)\n" %
classes_destructors[classname]);
classes.write(" self._o = None\n\n");
if classes_destructors[classname] == "pass":
classes.write(" pass\n")
else:
classes.write(" if self._o != None:\n")
classes.write(" _libxslt.%s(self._o)\n" %
classes_destructors[classname]);
classes.write(" self._o = None\n\n");
flist = function_classes[classname]
flist.sort(functionCompare)
oldfile = ""

View File

@ -23,6 +23,163 @@
<info>Cleanup all libxslt and libxml2 memory allocated</info>
<return type='void'/>
</function>
<function name='xsltXPathParserGetContext' file='python_accessor'>
<info>Get the xpathContext from an xpathParserContext</info>
<return type='xmlXPathContextPtr' info="The XPath context" field="context"/>
<arg name='ctxt' type='xmlXPathParserContextPtr' info='the XPath parser context'/>
</function>
<function name='xsltXPathGetContextDoc' file='python_accessor'>
<info>Get the doc from an xpathContext</info>
<return type='xmlDocPtr' info="The doc context" field="doc"/>
<arg name='ctxt' type='xmlXPathContextPtr' info='the XPath context'/>
</function>
<function name='xsltXPathGetContextNode' file='python_accessor'>
<info>Get the current node from an xpathContext</info>
<return type='xmlNodePtr' info="The node context" field="node"/>
<arg name='ctxt' type='xmlXPathContextPtr' info='the XPath context'/>
</function>
<function name='xsltXPathGetContextPosition' file='python_accessor'>
<info>Get the current node from an xpathContext</info>
<return type='int' info="The node context" field="proximityPosition"/>
<arg name='ctxt' type='xmlXPathContextPtr' info='the XPath context'/>
</function>
<function name='xsltXPathGetContextSize' file='python_accessor'>
<info>Get the current node from an xpathContext</info>
<return type='int' info="The node context" field="contextSize"/>
<arg name='ctxt' type='xmlXPathContextPtr' info='the XPath context'/>
</function>
<function name='xsltXPathGetFunction' file='python_accessor'>
<info>Get the current function name xpathContext</info>
<return type='const xmlChar *' info="The function name" field="function"/>
<arg name='ctxt' type='xmlXPathContextPtr' info='the XPath context'/>
</function>
<function name='xsltXPathGetFunctionURI' file='python_accessor'>
<info>Get the current function name URI xpathContext</info>
<return type='const xmlChar *' info="The function name URI" field="functionURI"/>
<arg name='ctxt' type='xmlXPathContextPtr' info='the XPath context'/>
</function>
<function name='xsltXPathGetTransformContext' file='python_accessor'>
<info>Get the transformation context from an xpathContext</info>
<return type='xsltTransformContextPtr' info="The node context" field="extra"/>
<arg name='ctxt' type='xmlXPathContextPtr' info='the XPath context'/>
</function>
<function name='xsltTransformGetStyle' file='python_accessor'>
<info>Get the stylesheet from a transformation</info>
<return type='xsltStylesheetPtr' info="The stylesheet" field="style"/>
<arg name='ctxt' type='xsltTransformContextPtr' info='the transformation context'/>
</function>
<function name='xsltTransformGetCurrent' file='python_accessor'>
<info>Get the current() node of a transformation</info>
<return type='xmlNodePtr' info="The node" field="node"/>
<arg name='ctxt' type='xsltTransformContextPtr' info='the transformation context'/>
</function>
<function name='xsltTransformGetOutputDoc' file='python_accessor'>
<info>Get the output document of a transformation</info>
<return type='xmlDocPtr' info="The output doc" field="output"/>
<arg name='ctxt' type='xsltTransformContextPtr' info='the transformation context'/>
</function>
<function name='xsltTransformGetOutputURI' file='python_accessor'>
<info>Get the output URI of a transformation if known</info>
<return type='const char *' info="The output URI" field="outputFile"/>
<arg name='ctxt' type='xsltTransformContextPtr' info='the transformation context'/>
</function>
<function name='xsltTransformGetInsertNode' file='python_accessor'>
<info>Get the insertion node in the output document</info>
<return type='xmlNodePtr' info="The insertion node" field="insert"/>
<arg name='ctxt' type='xsltTransformContextPtr' info='the transformation context'/>
</function>
<function name='xsltTransformGetInstruction' file='python_accessor'>
<info>Get the instruction node in the stylesheet</info>
<return type='xmlNodePtr' info="The instruction node" field="inst"/>
<arg name='ctxt' type='xsltTransformContextPtr' info='the transformation context'/>
</function>
<function name='xsltTransformGetMode' file='python_accessor'>
<info>Get the mode of a transformation</info>
<return type='const xmlChar *' info="The mode" field="mode"/>
<arg name='ctxt' type='xsltTransformContextPtr' info='the transformation context'/>
</function>
<function name='xsltTransformGetModeURI' file='python_accessor'>
<info>Get the mode URI of a transformation</info>
<return type='const xmlChar *' info="The mode URI" field="modeURI"/>
<arg name='ctxt' type='xsltTransformContextPtr' info='the transformation context'/>
</function>
<function name='xsltTransformGetContext' file='python_accessor'>
<info>Get the XPath context of a transformation</info>
<return type='xmlXPathContextPtr' info="The XPath context" field="xpathCtxt"/>
<arg name='ctxt' type='xsltTransformContextPtr' info='the transformation context'/>
</function>
<function name='xsltTransformGetPrivate' file='python_accessor'>
<info>Get the private field of a transformation</info>
<return type='pythonObject *' info="The private field" field="_private"/>
<arg name='ctxt' type='xsltTransformContextPtr' info='the transformation context'/>
</function>
<function name='xsltTransformSetPrivate' file='python_accessor'>
<info>Set the private field of a transformation</info>
<return type='void'/>
<arg name='ctxt' type='xsltTransformContextPtr' info='the transformation context'/>
<arg name='_private' type='pythonObject *' info='The private field'/>
</function>
<function name='xsltStylesheetGetParent' file='python_accessor'>
<info>Get the parent of a stylesheet</info>
<return type='xsltStylesheetPtr' info="The parent" field="parent"/>
<arg name='style' type='xsltStylesheetPtr' info='the stylesheet'/>
</function>
<function name='xsltStylesheetGetNext' file='python_accessor'>
<info>Get the next sibling of a stylesheet</info>
<return type='xsltStylesheetPtr' info="The next sibling" field="next"/>
<arg name='style' type='xsltStylesheetPtr' info='the stylesheet'/>
</function>
<function name='xsltStylesheetGetImports' file='python_accessor'>
<info>Get the imports of a stylesheet</info>
<return type='xsltStylesheetPtr' info="The next sibling" field="imports"/>
<arg name='style' type='xsltStylesheetPtr' info='the stylesheet'/>
</function>
<function name='xsltStylesheetGetDoc' file='python_accessor'>
<info>Get the document of a stylesheet</info>
<return type='xmlDocPtr' info="The XML document" field="doc"/>
<arg name='style' type='xsltStylesheetPtr' info='the stylesheet'/>
</function>
<function name='xsltStylesheetGetMethod' file='python_accessor'>
<info>Get the output method of a stylesheet</info>
<return type='xmlChar *' info="The output method" field="method"/>
<arg name='style' type='xsltStylesheetPtr' info='the stylesheet'/>
</function>
<function name='xsltStylesheetGetMethodURI' file='python_accessor'>
<info>Get the output method URI of a stylesheet</info>
<return type='xmlChar *' info="The output method URI" field="methodURI"/>
<arg name='style' type='xsltStylesheetPtr' info='the stylesheet'/>
</function>
<function name='xsltStylesheetGetVersion' file='python_accessor'>
<info>Get the output version of a stylesheet</info>
<return type='xmlChar *' info="The output version" field="version"/>
<arg name='style' type='xsltStylesheetPtr' info='the stylesheet'/>
</function>
<function name='xsltStylesheetGetEncoding' file='python_accessor'>
<info>Get the output encoding of a stylesheet</info>
<return type='xmlChar *' info="The output encoding" field="encoding"/>
<arg name='style' type='xsltStylesheetPtr' info='the stylesheet'/>
</function>
<function name='xsltStylesheetGetDoctypePublic' file='python_accessor'>
<info>Get the output PUBLIC of a stylesheet</info>
<return type='xmlChar *' info="The output PUBLIC" field="doctypePublic"/>
<arg name='style' type='xsltStylesheetPtr' info='the stylesheet'/>
</function>
<function name='xsltStylesheetGetDoctypeSystem' file='python_accessor'>
<info>Get the output SYSTEM of a stylesheet</info>
<return type='xmlChar *' info="The output SYSTEM" field="doctypeSystem"/>
<arg name='style' type='xsltStylesheetPtr' info='the stylesheet'/>
</function>
<function name='xsltStylesheetGetPrivate' file='python_accessor'>
<info>Get the private field of a stylesheet</info>
<return type='pythonObject *' info="The private field" field="_private"/>
<arg name='style' type='xsltStylesheetPtr' info='the stylesheet'/>
</function>
<function name='xsltStylesheetSetPrivate' file='python_accessor'>
<info>Set the private field of a stylesheet</info>
<return type='void'/>
<arg name='style' type='xsltStylesheetPtr' info='the stylesheet'/>
<arg name='_private' type='pythonObject *' info='The private field'/>
</function>
<!--
<function name='xsltRegisterXPathFunction' file='python'>
<info>Register a Python written function to the XPath interpreter</info>

View File

@ -181,11 +181,12 @@ libxslt_xmlXPathFuncCallback(xmlXPathParserContextPtr ctxt, int nargs) {
return;
}
list = PyTuple_New(nargs);
list = PyTuple_New(nargs + 1);
PyTuple_SetItem(list, 0, libxml_xmlXPathParserContextPtrWrap(ctxt));
for (i = 0;i < nargs;i++) {
obj = valuePop(ctxt);
cur = libxml_xmlXPathObjectPtrWrap(obj);
PyTuple_SetItem(list, i, cur);
PyTuple_SetItem(list, i + 1, cur);
}
result = PyEval_CallObject(current_function, list);
Py_DECREF(list);

View File

@ -46,6 +46,8 @@ xslDropCall()
Class xpathParserContext(libxml2.xpathParserContext)
# accessors
context()
# functions from module extra
functionNodeSet()
@ -62,10 +64,28 @@ Class xpathParserContext(libxml2.xpathParserContext)
Class xpathContext(libxml2.xpathContext)
# accessors
contextDoc()
contextNode()
contextPosition()
contextSize()
function()
functionURI()
transformContext()
# functions from module functions
registerAllFunctions()
Class transformCtxt()
# accessors
context()
current()
insertNode()
instruction()
mode()
modeURI()
outputDoc()
outputURI()
style()
# functions from module attributes
applyAttributeSet()
@ -119,6 +139,17 @@ Class transformCtxt()
printErrorContext()
saveProfiling()
Class stylesheet()
# accessors
doc()
doctypePublic()
doctypeSystem()
encoding()
imports()
method()
methodURI()
next()
parent()
version()
# functions from module attributes
freeAttributeSetsHashes()

View File

@ -26,6 +26,6 @@ clean:
install-data-local:
$(mkinstalldirs) $(DESTDIR)$(EXAMPLE_DIR)
-(for test in $(TESTSPY) $(XMLS); \
-(for test in $(TESTSPY) $(XMLS) $(EXTRAS); \
do @INSTALL@ -m 0644 $$test $(DESTDIR)$(EXAMPLE_DIR) ; done)

View File

@ -11,7 +11,7 @@ style = libxslt.parseStylesheetDoc(styledoc)
doc = libxml2.parseFile("test.xml")
result = style.applyStylesheet(doc, None)
style.saveResultToFilename("foo", result, 0)
style = None
style.freeStylesheet()
doc.freeDoc()
result.freeDoc()

View File

@ -6,7 +6,22 @@ import libxslt
# Memory debug specific
libxml2.debugMemory(1)
def f(str):
nodeName = None
def f(ctx, str):
global nodeName
#
# Small check to verify the context is correcly accessed
#
try:
pctxt = libxslt.xpathParserContext(_obj=ctx)
ctxt = pctxt.context()
tctxt = ctxt.transformContext()
nodeName = tctxt.insertNode().name
except:
pass
import string
return string.upper(str)
@ -27,7 +42,7 @@ styledoc = libxml2.parseDoc("""
style = libxslt.parseStylesheetDoc(styledoc)
doc = libxml2.parseDoc("<doc/>")
result = style.applyStylesheet(doc, { "bar": "'success'" })
style = None
style.freeStylesheet()
doc.freeDoc()
root = result.children
@ -37,6 +52,8 @@ if root.name != "article":
if root.content != "SUCCESS":
print "Unexpected root node content, extension function failed"
sys.exit(1)
if nodeName != 'article':
print "The function callback failed to access its context"
result.freeDoc()

View File

@ -283,7 +283,8 @@ def main(args = None):
xsltProcess(doc, cur, args[i])
i = i + 1
cur = None
if cur != None:
cur.freeStylesheet()
params = None
if __name__ == "__main__":