def custom_tag ( tag_name, class_name = None, flattener = flatten_tag, attrs = None ): ''' class factory for defining tags with custom type (i.e. not of class Tag) ''' if not class_name: class_name = tag_name if not attrs: attrs = { } def __init__ ( self, *args, **kw ): Tag.__init__ ( self, tag_name, **attrs ) TagClass = type ( "c_%sTag" % class_name, ( Tag, ), { '__init__': __init__ } ) ProtoClass = type ( "c_%sProto" % class_name, ( Proto, ), { 'Class': TagClass } ) register_flattener ( ProtoClass, lambda o: flattener ( o ( ) ) ) register_flattener ( TagClass, flattener ) return ProtoClass ( tag_name )
from breve.tags import Namespace, Proto, Tag, flatten_tag xmlns = 'http://www.w3.org/2005/Atom' class AtomXMLNode(Tag): "" class AtomXMLProto(Proto): Class = AtomXMLNode def flatten_blmlproto ( p ): return '<%s></%s>' % ( p, p ) register_flattener ( AtomXMLNode, flatten_tag) register_flattener ( AtomXMLProto, flatten_blmlproto) directlyProvides( AtomXMLNode, IAtomXML ) directlyProvides( AtomXMLProto, IAtomXML ) tag_names = [ 'user', 'name', 'uri', 'email', 'feed', 'entry', 'content',
def flatten_tag ( o ): return ''.join ( flattened_tags ( o ) ) def flatten_proto ( p ): return u'<%s />' % p def flatten_sequence ( o ): return u''.join ( [ flatten ( i ) for i in o ] ) def flatten_callable ( o ): return flatten ( o ( ) ) def flatten_macro ( o ): return u'' register_flattener ( list, flatten_sequence ) register_flattener ( tuple, flatten_sequence ) register_flattener ( Proto, flatten_proto ) register_flattener ( Tag, flatten_tag ) register_flattener ( str, lambda s: escape ( unicode ( s, 'utf-8' ) ) ) register_flattener ( unicode, escape ) register_flattener ( Invisible, flatten_invisible ) register_flattener ( cdata, unicode ) register_flattener ( comment, flatten_comment ) register_flattener ( xml, flatten_xml ) register_flattener ( type ( lambda: None ), flatten_callable ) register_flattener ( Macro, flatten_macro ) def custom_tag ( tag_name, class_name = None, flattener = flatten_tag, attrs = None ): ''' class factory for defining tags with custom type (i.e. not of class Tag) '''
# class HtmlProto(str): __slots__ = [] def __call__(self, **kw): return Tag(self)(**kw) def __getitem__(self, children): return Tag(self)[children] def flatten_htmlproto(p): return '<%s></%s>' % (p, p) register_flattener(HtmlProto, flatten_htmlproto) # # register common HTML elements # tag_names = [ 'a', 'abbr', 'address', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'blockquote', 'body', 'button', 'canvas', 'caption', 'cite', 'code', 'colgroup', 'datalist', 'dd', 'del', 'details', 'dfn', 'div', 'dl', 'dt', 'em', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'html', 'i', 'iframe', 'ins', 'kbd',
# class HtmlProto(unicode): __slots__ = [] def __call__(self, **kw): return Tag(self)(**kw) def __getitem__(self, children): return Tag(self)[children] def flatten_htmlproto(p): return '<%s></%s>' % (p, p) register_flattener(HtmlProto, flatten_htmlproto) # # register common HTML elements # tag_names = [ 'a', 'abbr', 'acronym', 'address', 'applet', 'b', 'bdo', 'big', 'blockquote', 'body', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'colgroup', 'dd', 'dfn', 'div', 'dl', 'dt', 'em', 'fieldset', 'font', 'form', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'html', 'i', 'iframe', 'ins', 'kbd', 'label', 'legend', 'li', 'menu', 'nobr', 'noframes', 'noscript', 'ol', 'optgroup', 'pre', 'q', 's', 'samp', 'script', 'select', 'small', 'span', 'strike', 'strong', 'style', 'sub', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'tt', 'u', 'ul', 'var' ]
from breve.util import Namespace class Entity(str): def __init__(self, args): self.name, self.value = args def __repr__(self): return self.name def flatten_entity(e): return e.value register_flattener(Entity, flatten_entity) entities = Namespace(dict( [(name, Entity((name, "&#%s;" % value))) for name, value in [ ('nbsp', '160'), # non-breaking space ('cent', '162'), # cent sign ('pound', '163'), # pound sign ('curren', '164'), # currency sign ('yen', '165'), # yen sign ('brvbar', '166'), # broken vertical bar ('sect', '167'), # section sign ('uml', '168'), # diaeresis ('copy', '169'), # copyright sign ('ordf', '170'), # feminine ordinal indicator ('laquo', '171'), # left-pointing double angle quotation mark
xml_encoding = None doctype = '''<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">''' strict_doctype = '''<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">''' # a class to handle empty tags in html4 format class Html4EmptyTag ( EmptyTag ): pass def flatten_empty_html4_tag ( o ): if o.render: o = o.render ( o, o.data ) attrs = u''.join ( quoteattrs ( o.attrs ) ) return u'<%s%s>' % ( o.name, attrs ) register_flattener ( Html4EmptyTag, flatten_empty_html4_tag ) class Html4EmptyProto ( HtmlEmptyProto ): Class = Html4EmptyTag pass def flatten_html4_empty_proto ( p ): return '<%s>' % ( p ) register_flattener ( Html4EmptyProto, flatten_html4_empty_proto ) tags = Namespace ( ) # copy the default html tag namespace for k, v in htmltags.iteritems(): tags [ k ] = v
from breve.util import Namespace class Entity(str): def __init__(self, args): self.name, self.value = args def __repr__(self): return self.name def flatten_entity(e): return e.value register_flattener(Entity, flatten_entity) entities = Namespace( dict([ (name, Entity((name, "&#%s;" % value))) for name, value in [ ('nbsp', '160'), # non-breaking space ('cent', '162'), # cent sign ('pound', '163'), # pound sign ('curren', '164'), # currency sign ('yen', '165'), # yen sign ('brvbar', '166'), # broken vertical bar ('sect', '167'), # section sign ('uml', '168'), # diaeresis ('copy', '169'), # copyright sign ('ordf', '170'), # feminine ordinal indicator ('laquo', '171'), # left-pointing double angle quotation mark
# Bl global from interface import IBlueLinesXML from tag import atom, flatten_tag, Tag xmlns = '' class BlueLinesXMLNode(Tag): "" class BlueLinesXMLProto(Proto): Class = BlueLinesXMLNode register_flattener ( BlueLinesXMLNode, flatten_tag ) register_flattener ( BlueLinesXMLProto, flatten_proto ) directlyProvides( BlueLinesXMLNode, IBlueLinesXML ) directlyProvides( BlueLinesXMLProto, IBlueLinesXML ) tag_names = [ 'blueLines', 'error', 'alias', 'aliasDir', 'aliasList', 'user', 'userDir', 'userList', 'source', 'sourceList', 'sourceInfo', 'infoList', 'configuration', 'configList',
def flatten_proto(p): return u'<%s />' % p def flatten_sequence(o): return u''.join([flatten(i) for i in o]) def flatten_callable(o): return flatten(o()) def flatten_macro(o): return u'' register_flattener(list, flatten_sequence) register_flattener(tuple, flatten_sequence) register_flattener(Proto, flatten_proto) register_flattener(Tag, flatten_tag) register_flattener(bytes, lambda x: x.decode('utf8')) register_flattener(str, escape) register_flattener(Invisible, flatten_invisible) register_flattener(cdata, str) register_flattener(comment, flatten_comment) register_flattener(xml, flatten_xml) register_flattener(type(lambda: None), flatten_callable) register_flattener(Macro, flatten_macro) def custom_tag(tag_name, class_name=None, flattener=flatten_tag, attrs=None): """ class factory for defining tags with custom type (i.e. not of class Tag) """