59 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
"""
 | 
						|
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 "".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 
 | 
						|
       
 |