From 52af33440ce1abba3f807593ee876274f8546832 Mon Sep 17 00:00:00 2001 From: Toshio くらとみ Date: Feb 28 2008 19:53:00 +0000 Subject: - Update to 0.6.4. - Fix python-2.5 elementtree problem. --- diff --git a/.cvsignore b/.cvsignore index cd8c35f..97a8fa9 100644 --- a/.cvsignore +++ b/.cvsignore @@ -1 +1 @@ -meld3-0.6.3.tar.gz +meld3-0.6.4.tar.gz diff --git a/cmeld3.c b/cmeld3.c new file mode 100644 index 0000000..a9c461b --- /dev/null +++ b/cmeld3.c @@ -0,0 +1,395 @@ +#include + +/* fprintf(stderr, "%s:%s:%d\n", __FILE__,__FUNCTION__,__LINE__); + fflush(stderr); */ + +static PyObject *PySTR__class__, *PySTR__dict__, *PySTR_children; +static PyObject *PySTRattrib, *PySTRparent, *PySTR_MELD_ID; +static PyObject *PySTRtag, *PySTRtext, *PySTRtail, *PySTRstructure; +static PyObject *PySTRReplace; + +static PyObject *emptyattrs, *emptychildren = NULL; + +static PyObject* +bfclone(PyObject *nodes, PyObject *parent) +{ + int len, i; + + if (!(PyList_Check(nodes))) { + return NULL; + } + + len = PyList_Size(nodes); + + if (len < 0) { + return NULL; + } + + PyObject *L; + if (!(L = PyList_New(0))) return NULL; + + for (i = 0; i < len; i++) { + + PyObject *node; + + if (!(node = PyList_GetItem(nodes, i))) { + return NULL; + } + + PyObject *klass; + PyObject *children; + PyObject *text; + PyObject *tail; + PyObject *tag; + PyObject *attrib; + PyObject *structure; + PyObject *dict; + PyObject *newdict; + PyObject *newchildren; + PyObject *attrib_copy; + PyObject *element; + int childsize; + + if (!(klass = PyObject_GetAttr(node, PySTR__class__))) return NULL; + if (!(dict = PyObject_GetAttr(node, PySTR__dict__))) return NULL; + + if (!(children = PyDict_GetItem(dict, PySTR_children))) return NULL; + if (!(tag = PyDict_GetItem(dict, PySTRtag))) return NULL; + if (!(attrib = PyDict_GetItem(dict, PySTRattrib))) return NULL; + + if (!(text = PyDict_GetItem(dict, PySTRtext))) { + text = Py_None; + } + if (!(tail = PyDict_GetItem(dict, PySTRtail))) { + tail = Py_None; + } + if (!(structure = PyDict_GetItem(dict, PySTRstructure))) { + structure = Py_None; + } + Py_DECREF(dict); + + if (!(newdict = PyDict_New())) return NULL; + if (!(newchildren = PyList_New(0))) return NULL; + + attrib_copy = PyDict_Copy(attrib); + + PyDict_SetItem(newdict, PySTR_children, newchildren); + Py_DECREF(newchildren); + PyDict_SetItem(newdict, PySTRattrib, attrib_copy); + Py_DECREF(attrib_copy); + PyDict_SetItem(newdict, PySTRtext, text); + PyDict_SetItem(newdict, PySTRtail, tail); + PyDict_SetItem(newdict, PySTRtag, tag); + PyDict_SetItem(newdict, PySTRstructure, structure); + PyDict_SetItem(newdict, PySTRparent, parent); + + if (!(element = PyInstance_NewRaw(klass, newdict))) { + return NULL; + } + + Py_DECREF(newdict); + Py_DECREF(klass); + + if (PyList_Append(L, element)) { + return NULL; + } + Py_DECREF(element); + + if (!PyList_Check(children)) return NULL; + + if ((childsize = PyList_Size(children)) < 0) { + return NULL; + } + else { + if (childsize > 0) { + bfclone(children, element); + } + } + } + + if (PyObject_SetAttr(parent, PySTR_children, L)) return NULL; + Py_DECREF(L); + return parent; + +} + +static PyObject* +bfclonehandler(PyObject *self, PyObject *args) +{ + PyObject *node, *parent; + + if (!PyArg_ParseTuple(args, "OO:clone", &node, &parent)) { + return NULL; + } + + PyObject *klass; + PyObject *children; + PyObject *text; + PyObject *tail; + PyObject *tag; + PyObject *attrib; + PyObject *structure; + PyObject *dict; + PyObject *newdict; + PyObject *newchildren; + PyObject *attrib_copy; + PyObject *element; + + if (!(klass = PyObject_GetAttr(node, PySTR__class__))) return NULL; + if (!(dict = PyObject_GetAttr(node, PySTR__dict__))) return NULL; + + if (!(children = PyDict_GetItem(dict, PySTR_children))) return NULL; + if (!(tag = PyDict_GetItem(dict, PySTRtag))) return NULL; + if (!(attrib = PyDict_GetItem(dict, PySTRattrib))) return NULL; + + if (!(text = PyDict_GetItem(dict, PySTRtext))) { + text = Py_None; + } + if (!(tail = PyDict_GetItem(dict, PySTRtail))) { + tail = Py_None; + } + if (!(structure = PyDict_GetItem(dict, PySTRstructure))) { + structure = Py_None; + } + + Py_DECREF(dict); + + if (!(newdict = PyDict_New())) return NULL; + if (!(newchildren = PyList_New(0))) return NULL; + + attrib_copy = PyDict_Copy(attrib); + + PyDict_SetItem(newdict, PySTR_children, newchildren); + Py_DECREF(newchildren); + PyDict_SetItem(newdict, PySTRattrib, attrib_copy); + Py_DECREF(attrib_copy); + PyDict_SetItem(newdict, PySTRtext, text); + PyDict_SetItem(newdict, PySTRtail, tail); + PyDict_SetItem(newdict, PySTRtag, tag); + PyDict_SetItem(newdict, PySTRstructure, structure); + PyDict_SetItem(newdict, PySTRparent, parent); + + if (!(element = PyInstance_NewRaw(klass, newdict))) return NULL; + Py_DECREF(newdict); + Py_DECREF(klass); + + PyObject *pchildren; + + if (parent != Py_None) { + if (!(pchildren=PyObject_GetAttr(parent, PySTR_children))) return NULL; + if (PyList_Append(pchildren, element)) return NULL; + Py_DECREF(pchildren); + } + + if (!(PyList_Check(children))) return NULL; + + if (PyList_Size(children) > 0) { + if (bfclone(children, element) == NULL) { + return NULL; + } + } + return element; + +} + +PyDoc_STRVAR(bfclonehandler_doc, +"bfclone(node, parent=None)\n \ +\n\ +Return a clone of the meld3 node named by node (breadth-first). If parent\n\ +is not None, append the clone to the parent.\n"); + +static PyObject* +getiterator(PyObject *node, PyObject *list) { + if (PyList_Append(list, node) == -1) { + return NULL; + } + PyObject *children; + PyObject *child; + + if (!(children = PyObject_GetAttr(node, PySTR_children))) { + return NULL; + } + + int len, i; + len = PyList_Size(children); + if (len < 0) { + return NULL; + } + + for (i = 0; i < len; i++) { + if (!(child = PyList_GetItem(children, i))) { + return NULL; + } + getiterator(child, list); + } + + Py_DECREF(children); + return list; +} + +static PyObject* +getiteratorhandler(PyObject *self, PyObject *args) +{ + PyObject *node; + + if (!PyArg_ParseTuple(args, "O:getiterator", &node)) { + return NULL; + } + PyObject *list; + PyObject *result; + if (!(list = PyList_New(0))) { + return NULL; + } + result = getiterator(node, list); + if (result == NULL) { + PyList_SetSlice(list, 0, PyList_GET_SIZE(list), (PyObject *)NULL); + Py_DECREF(list); + } + return result; +} + +PyDoc_STRVAR(getiteratorhandler_doc, +"getiterator(node)\n\ +\n\ +Returns an iterator for the node."); + +static char* _MELD_ID = "{http://www.plope.com/software/meld3}id"; +/*static PyObject *PySTR_MELD_ID = PyString_FromString(_MELD_ID);*/ + +static PyObject* +findmeld(PyObject *node, PyObject *name) { + PyObject *attrib, *meldid, *result; + if (!(attrib = PyObject_GetAttr(node, PySTRattrib))) return NULL; + meldid = PyDict_GetItem(attrib, PySTR_MELD_ID); + Py_DECREF(attrib); + + if (meldid != NULL) { + int compareresult = PyUnicode_Compare(meldid, name); + if (compareresult == 0) { + Py_INCREF(node); + return node; + } + } + + int len, i; + result = Py_None; + PyObject *children = PyObject_GetAttr(node, PySTR_children); + len = PyList_Size(children); + for (i = 0; i < len; i++) { + PyObject *child = PyList_GetItem(children, i); + result = findmeld(child, name); + if (result != Py_None) { + break; + } + } + Py_DECREF(children); + + return result; + +} + +static PyObject* +findmeldhandler(PyObject *self, PyObject *args) +{ + PyObject *node, *name, *result; + + if (!PyArg_ParseTuple(args, "OO:findmeld", &node, &name)) { + return NULL; + } + if (!(result = findmeld(node, name))) return NULL; + + if (result == Py_None) { + Py_INCREF(Py_None); + } + + return result; +} + +PyDoc_STRVAR(findmeldhandler_doc, +"findmeld(node, meldid)\n\ +\n\ +Return a meld node or None.\n"); + +static PyObject* +contenthandler(PyObject *self, PyObject *args) { + PyObject *node, *text, *structure; + + if (!PyArg_ParseTuple(args, "OOO:content", &node, &text, &structure)) { + return NULL; + } + PyObject *replacel = NULL; + PyObject *replace = NULL; + PyObject *replacenode = NULL; + PyObject *newchildren = NULL; + PyObject *newdict = NULL; + PyObject *klass = NULL; + + if (!(klass = PyObject_GetAttr(node, PySTR__class__))) return NULL; + if (!(replacel = PyObject_GetAttr(node, PySTRReplace))) return NULL; + if (!(replace = PyList_GetItem(replacel, 0))) return NULL; + Py_DECREF(replacel); + + PyObject_SetAttr(node, PySTRtext, Py_None); + + if (!(newdict = PyDict_New())) return NULL; + + if (PyDict_SetItem(newdict, PySTRparent, node) == -1) return NULL; + if (PyDict_SetItem(newdict, PySTRattrib, emptyattrs) == -1) return NULL; + if (PyDict_SetItem(newdict, PySTRtext, text) == -1) return NULL; + if (PyDict_SetItem(newdict, PySTRstructure, structure) == -1) return NULL; + if (PyDict_SetItem(newdict, PySTRtag, replace) == -1) return NULL; + if (PyDict_SetItem(newdict, PySTR_children, emptychildren) == -1) { + return NULL; + } + if (!(replacenode = PyInstance_NewRaw(klass, newdict))) return NULL; + Py_DECREF(klass); + Py_DECREF(newdict); + + if (!(newchildren = PyList_New(1))) return NULL; + PyList_SET_ITEM(newchildren, 0, replacenode); // steals a reference to rn + PyObject_SetAttr(node, PySTR_children, newchildren); + Py_DECREF(newchildren); + Py_INCREF(Py_None); + return Py_None; + +} + +PyDoc_STRVAR(contenthandler_doc, +"content(node, text, structure)\n\ +\n\ +Add a content node to node."); + +static PyMethodDef methods[] = { + {"bfclone", bfclonehandler, METH_VARARGS, bfclonehandler_doc}, + {"getiterator", getiteratorhandler, METH_VARARGS, getiteratorhandler_doc}, + {"findmeld", findmeldhandler, METH_VARARGS, findmeldhandler_doc}, + {"content", contenthandler, METH_VARARGS, contenthandler_doc}, + {NULL, NULL} +}; + +PyMODINIT_FUNC +initcmeld3(void) +{ +#define DEFINE_STRING(s) \ + if (!(PySTR##s = PyString_FromString(#s))) return + DEFINE_STRING(__class__); + DEFINE_STRING(__dict__); + DEFINE_STRING(_children); + DEFINE_STRING(parent); + DEFINE_STRING(tag); + DEFINE_STRING(attrib); + DEFINE_STRING(text); + DEFINE_STRING(tail); + DEFINE_STRING(structure); + DEFINE_STRING(Replace); +#undef DEFINE_STRING + PySTR_MELD_ID = PyString_FromString(_MELD_ID); + if (!PySTR_MELD_ID) { + return; + } + emptyattrs = PyDict_New(); +/* emptyattrs = PyDictProxy_New(emptyattrs); can't copy a proxy, so... */ + emptychildren = PyList_New(0); + Py_InitModule3("cmeld3", methods, + "C helpers for meld3"); +} diff --git a/meld3-etree.patch b/meld3-etree.patch new file mode 100644 index 0000000..36e5710 --- /dev/null +++ b/meld3-etree.patch @@ -0,0 +1,61 @@ +Index: meld3-0.6.4/meld3/meld3.py +=================================================================== +--- meld3-0.6.4.orig/meld3/meld3.py ++++ meld3-0.6.4/meld3/meld3.py +@@ -5,21 +5,41 @@ import types + import mimetools + from StringIO import StringIO + +-from elementtree.ElementTree import TreeBuilder +-from elementtree.ElementTree import XMLTreeBuilder +-from elementtree.ElementTree import Comment +-from elementtree.ElementTree import ProcessingInstruction +-from elementtree.ElementTree import QName +-from elementtree.ElementTree import _raise_serialization_error +-from elementtree.ElementTree import _namespace_map +-from elementtree.ElementTree import fixtag +-from elementtree.ElementTree import parse as et_parse +-from elementtree.ElementTree import ElementPath +-from elementtree.HTMLTreeBuilder import HTMLParser +-from elementtree.HTMLTreeBuilder import IGNOREEND +-from elementtree.HTMLTreeBuilder import AUTOCLOSE +-from elementtree.HTMLTreeBuilder import is_not_ascii +- ++try: ++ # Try to import the definitions from the python-2.5 locations ++ from xml.etree.ElementTree import TreeBuilder ++except ImportError: ++ # Fallback on elementtree ++ from elementtree.ElementTree import TreeBuilder ++ from elementtree.ElementTree import XMLTreeBuilder ++ from elementtree.ElementTree import Comment ++ from elementtree.ElementTree import ProcessingInstruction ++ from elementtree.ElementTree import QName ++ from elementtree.ElementTree import _raise_serialization_error ++ from elementtree.ElementTree import _namespace_map ++ from elementtree.ElementTree import fixtag ++ from elementtree.ElementTree import parse as et_parse ++ from elementtree.ElementTree import ElementPath ++ from elementtree.HTMLTreeBuilder import HTMLParser ++ from elementtree.HTMLTreeBuilder import IGNOREEND ++ from elementtree.HTMLTreeBuilder import AUTOCLOSE ++ from elementtree.HTMLTreeBuilder import is_not_ascii ++else: ++ from xml.etree.ElementTree import XMLTreeBuilder ++ from xml.etree.ElementTree import Comment ++ from xml.etree.ElementTree import ProcessingInstruction ++ from xml.etree.ElementTree import QName ++ from xml.etree.ElementTree import _raise_serialization_error ++ from xml.etree.ElementTree import _namespace_map ++ from xml.etree.ElementTree import fixtag ++ from xml.etree.ElementTree import parse as et_parse ++ from xml.etree.ElementTree import ElementPath ++ # Elementtree 1.2.6 snpshot 20050316 defines things this way so we might ++ # as well too. ++ from HTMLParser import HTMLParser ++ IGNOREEND = "img", "hr", "meta", "link", "br" ++ AUTOCLOSE = "p", "li", "tr", "th", "td", "head", "body" ++ is_not_ascii = re.compile(eval(r'u"[\u0080-\uffff]"')).search + + # replace element factory + def Replace(text, structure=False): diff --git a/python-meld3.spec b/python-meld3.spec index fc4e7cf..3cb7c1f 100644 --- a/python-meld3.spec +++ b/python-meld3.spec @@ -1,13 +1,17 @@ %{!?python_sitearch: %define python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(1)")} Summary: An HTML/XML templating system for Python Name: python-meld3 -Version: 0.6.3 +Version: 0.6.4 Release: 1%{?dist} License: ZPLv2.0 Group: Development/Languages URL: http://www.plope.com/software/meld3/ -Source: http://www.plope.com/software/meld3/meld3-%{version}.tar.gz +Source0: http://www.plope.com/software/meld3/meld3-%{version}.tar.gz +# 0.6.4 is a bit broken. This file is missing from the tarball. +Source1: http://svn.supervisord.org/meld3/trunk/meld3/cmeld3.c +# Fix problems importing python-2.5's elementtree. +Patch0: meld3-etree.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root %if 0%{?fedora} <= 6 @@ -25,14 +29,19 @@ http://www.entrian.com/PyMeld for a treatise on the benefits of this pattern. %prep %setup -q -n meld3-%{version} +cp %{SOURCE1} meld3/cmeld3.c +%patch0 -p1 -b .etree %build +export USE_MELD3_EXTENSION_MODULES=True CFLAGS="%{optflags}" %{__python} setup.py build %install %{__rm} -rf %{buildroot} +export USE_MELD3_EXTENSION_MODULES=True %{__python} setup.py install --skip-build --root %{buildroot} %{__sed} -i s'/^#!.*//' $( find %{buildroot}/%{python_sitearch}/meld3/ -type f) +chmod 0755 %{buildroot}/%{python_sitearch}/meld3/cmeld3.so %clean %{__rm} -rf %{buildroot} @@ -40,9 +49,19 @@ CFLAGS="%{optflags}" %{__python} setup.py build %files %defattr(-,root,root,-) %doc README.txt COPYRIGHT.txt LICENSE.txt CHANGES.txt -%{python_sitearch}/meld3/ +%{python_sitearch}/* %changelog +* Tue Feb 28 2008 Toshio Kuratomi 0.6.4-1 +- Update to 0.6.4. +- Fix python-2.5 elementtree problem. + +* Tue Feb 12 2008 Mike McGrath 0.6.3-3 +- Rebuild for gcc43 + +* Mon Jan 7 2008 Toshio Kuratomi 0.6.3-2 +- Fix include egginfo when created. + * Wed Oct 17 2007 Toshio Kuratomi 0.6.3-1 - Update to 0.6.3 (Fix memory leaks). - Update license tag. diff --git a/sources b/sources index 9d16c69..56953c2 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -45992df3b24f23e051ff3c647dd24bdf meld3-0.6.3.tar.gz +0fcb7496e20068155f6dd7d227edb76e meld3-0.6.4.tar.gz