[svn r37264] create the new development trunk
--HG-- branch : trunk
This commit is contained in:
58
py/xmlobj/xml.py
Normal file
58
py/xmlobj/xml.py
Normal file
@@ -0,0 +1,58 @@
|
||||
"""
|
||||
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
|
||||
|
||||
# the generic xml namespace
|
||||
# provides Tag classes on the fly optionally checking for
|
||||
# a tagspecification
|
||||
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user