Index: gavo/formal/nevowc.py =================================================================== --- gavo/formal/nevowc.py (revision 8435) +++ gavo/formal/nevowc.py (working copy) @@ -21,7 +21,7 @@ from twisted.web import server from twisted.web import template -from .twistedpatch import Raw +from .twistedpatch import Raw, _ToStan, _NSContext NEVOW_NS = 'http://nevow.com/ns/nevow/0.1' TWISTED_NS = 'http://twistedmatrix.com/ns/twisted.web.template/0.1' @@ -42,14 +42,14 @@ pass -class _ToStan(template._ToStan): +class MyToStan(_ToStan): """A SAX parser unifying nevow and twisted.web namespaces. We also map invisible (nevow) to transparent (t.w). """ def __init__(self, sourceFilename): - template._ToStan.__init__(self, sourceFilename) - self.prefixMap = template._NSContext() + _ToStan.__init__(self, sourceFilename) + self.prefixMap = _NSContext() self.prefixMap[NEVOW_NS] = "nevow" self.prefixMap[TWISTED_NS] = "nevow" @@ -57,13 +57,13 @@ # overridden to swallow attempts to map prefixes for our # standard namespaces if uri==NEVOW_NS or uri==TWISTED_NS: - self.prefixMap = template._NSContext(self.prefixMap) + self.prefixMap = _NSContext(self.prefixMap) return else: if prefix=="nevow": raise Exception("You may not bind the nevow prefix" " to a non-twisted or non-nevow URI") - template._ToStan.startPrefixMapping(self, prefix, uri) + _ToStan.startPrefixMapping(self, prefix, uri) def startElementNS(self, namespaceAndName, qName, attrs): # regrettably, we also need to map attribute namespaces; @@ -107,7 +107,7 @@ if ns==TWISTED_NS and name=='invisible': name = 'transparent' - return template._ToStan.startElementNS(self, + return _ToStan.startElementNS(self, (ns, name), qName, attrs) @@ -123,7 +123,7 @@ parser.setFeature(handler.feature_external_ges, 0) parser.setFeature(handler.feature_external_pes, 0) - s = _ToStan(getattr(fl, "name", None)) + s = MyToStan(getattr(fl, "name", None)) parser.setContentHandler(s) parser.setEntityResolver(s) parser.setProperty(handler.property_lexical_handler, s) Index: gavo/formal/twistedpatch.py =================================================================== --- gavo/formal/twistedpatch.py (revision 8435) +++ gavo/formal/twistedpatch.py (working copy) @@ -22,7 +22,24 @@ from twisted.web import _stan from twisted.web import template +try: + # this is where we want to monkeypatch twisted.template + # in twisted 21+ + from twisted.web import _template_util as _template_patchtarget +except ImportError: + # this is where to monkeypatch in twisted 20 + from twisted.web import template as _template_patchtarget +_ToStan = _template_patchtarget._ToStan +_NSContext = _template_patchtarget._NSContext + +def patchTwTemplate(name, obj): + """monkeypatches whatever module holds the twisted.web.template + definitions. + """ + setattr(_template_patchtarget, name, obj) + + class _NoData(object): """A sentinel to signifiy no data was passed to clone. """ @@ -36,6 +53,8 @@ class Tag(_StanTag): def __init__(self, tagName, attributes=None, children=None, render=None, filename=None, lineNumber=None, columnNumber=None, data=None): + children = children or [] + attributes = attributes or {} _StanTag.__init__(self, tagName, attributes, children, render, filename, lineNumber, columnNumber) self.slotData = data @@ -139,9 +158,10 @@ return newtag + # we have to monkeypatch a couple of places in twisted.web _stan.Tag = Tag -template.Tag = Tag +patchTwTemplate("Tag", Tag) _flatten.Tag = Tag @@ -319,3 +339,5 @@ res = tag.clone(True, newData) del res.attributes["nevow:data"] return res + +