""" |
generic (and pythonic :-) xml tag and namespace objects |
""" |
|
class Tag(list): |
class Attr(object): |
def __init__(self, **kwargs): |
self.__dict__.update(kwargs) |
|
def __init__(self, *args, **kwargs): |
super(Tag, self).__init__(args) |
self.attr = self.Attr(**kwargs) |
|
def __unicode__(self): |
return self.unicode(indent=0) |
|
def unicode(self, indent=2): |
from py.__.xmlobj.visit import SimpleUnicodeVisitor |
l = [] |
SimpleUnicodeVisitor(l.append, indent).visit(self) |
return u"".join(l) |
|
def __repr__(self): |
name = self.__class__.__name__ |
return "<%r tag object %d>" % (name, id(self)) |
|
class raw(object): |
"""just a box that can contain a unicode string that will be |
included directly in the output""" |
def __init__(self, uniobj): |
self.uniobj = uniobj |
|
|
|
|
|
class NamespaceMetaclass(type): |
def __getattr__(self, name): |
if name[:1] == '_': |
raise AttributeError(name) |
if self == Namespace: |
raise ValueError("Namespace class is abstract") |
tagspec = self.__tagspec__ |
if tagspec is not None and name not in tagspec: |
raise AttributeError(name) |
classattr = {} |
if self.__stickyname__: |
classattr['xmlname'] = name |
cls = type(name, (self.__tagclass__,), classattr) |
setattr(self, name, cls) |
return cls |
|
class Namespace(object): |
__tagspec__ = None |
__tagclass__ = Tag |
__metaclass__ = NamespaceMetaclass |
__stickyname__ = False |
|
|