11# AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/11_xml.ipynb.
22
33# %% auto 0
4- __all__ = ['voids' , ' XT' , 'xt' , 'to_xml' , 'highlight' , 'showtags' , 'Html' , 'Head' , 'Title' , 'Meta' , 'Link' , 'Style' , 'Body' ,
5- 'Pre' , 'Code' , ' Div' , 'Span' , 'P' , 'H1' , 'H2' , 'H3' , 'H4' , 'H5' , 'H6' , 'Strong' , 'Em' , 'B' , 'I' , 'U' , 'S' ,
6- 'Strike' , 'Sub' , ' Sup' , 'Hr' , 'Br' , 'Img' , 'A' , 'Nav' , 'Ul' , 'Ol' , 'Li' , 'Dl' , 'Dt' , 'Dd' , 'Table' , 'Thead' ,
7- 'Tbody' , 'Tfoot' , ' Tr' , 'Th' , 'Td' , 'Caption' , 'Col' , 'Colgroup' , 'Form' , 'Input' , 'Textarea' , 'Button' ,
8- 'Select' , 'Option' , ' Label' , 'Fieldset' , 'Legend' , 'Details' , 'Summary' , 'Main' , 'Header' , 'Footer' ,
9- 'Section' , 'Article' , ' Aside' , 'Figure' , 'Figcaption' , 'Mark' , 'Small' , 'Iframe' , 'Object' , 'Embed' , 'Param' ,
10- 'Video' , 'Audio' , ' Source' , 'Canvas' , 'Svg' , 'Math' , 'Script' , 'Noscript' , 'Template' , 'Slot' ]
4+ __all__ = ['XT' , 'xt' , 'to_xml' , 'highlight' , 'showtags' , 'Html' , 'Head' , 'Title' , 'Meta' , 'Link' , 'Style' , 'Body' , 'Pre' , 'Code ' ,
5+ 'Div' , 'Span' , 'P' , 'H1' , 'H2' , 'H3' , 'H4' , 'H5' , 'H6' , 'Strong' , 'Em' , 'B' , 'I' , 'U' , 'S' , 'Strike' , 'Sub ' ,
6+ 'Sup' , 'Hr' , 'Br' , 'Img' , 'A' , 'Nav' , 'Ul' , 'Ol' , 'Li' , 'Dl' , 'Dt' , 'Dd' , 'Table' , 'Thead' , 'Tbody' , 'Tfoot ' ,
7+ 'Tr' , 'Th' , 'Td' , 'Caption' , 'Col' , 'Colgroup' , 'Form' , 'Input' , 'Textarea' , 'Button' , 'Select' , 'Option ' ,
8+ 'Label' , 'Fieldset' , 'Legend' , 'Details' , 'Summary' , 'Main' , 'Header' , 'Footer' , 'Section' , 'Article ' ,
9+ 'Aside' , 'Figure' , 'Figcaption' , 'Mark' , 'Small' , 'Iframe' , 'Object' , 'Embed' , 'Param' , 'Video' , 'Audio ' ,
10+ 'Source' , 'Canvas' , 'Svg' , 'Math' , 'Script' , 'Noscript' , 'Template' , 'Slot' ]
1111
1212# %% ../nbs/11_xml.ipynb 2
1313from .utils import *
@@ -27,7 +27,10 @@ def _attrmap(o):
2727
2828# %% ../nbs/11_xml.ipynb 5
2929class XT (list ):
30- def __init__ (self , tag , cs , attrs = None , ** kwargs ): super ().__init__ ([tag , cs , {** (attrs or {}), ** kwargs }])
30+ def __init__ (self , tag , cs , attrs = None , void_ = False , ** kwargs ):
31+ super ().__init__ ([tag , cs , {** (attrs or {}), ** kwargs }])
32+ self .void_ = void_
33+
3134 @property
3235 def tag (self ): return self [0 ]
3336 @property
@@ -36,19 +39,19 @@ def children(self): return self[1]
3639 def attrs (self ): return self [2 ]
3740
3841 def __setattr__ (self , k , v ):
39- if k .startswith ('__' ) or k in ('tag' ,'cs' ,'attrs' ): return super ().__setattr__ (k ,v )
42+ if k .startswith ('__' ) or k in ('tag' ,'cs' ,'attrs' , 'void_' ): return super ().__setattr__ (k ,v )
4043 self .attrs [k .lstrip ('_' ).replace ('_' , '-' )] = v
4144
4245 def __getattr__ (self , k ):
4346 if k .startswith ('__' ) or k not in self .attrs : raise AttributeError (k )
4447 return self .attrs [k .lstrip ('_' ).replace ('_' , '-' )]
4548
4649# %% ../nbs/11_xml.ipynb 6
47- def xt (tag :str , * c , ** kw ):
50+ def xt (tag :str , * c , void_ = False , ** kw ):
4851 "Create an XML tag structure `[tag,children,attrs]` for `toxml()`"
4952 if len (c )== 1 and isinstance (c [0 ], types .GeneratorType ): c = tuple (c [0 ])
5053 kw = {_attrmap (k ):v for k ,v in kw .items () if v is not None }
51- return XT (tag .lower (),c ,kw )
54+ return XT (tag .lower (),c ,kw , void_ = void_ )
5255
5356# %% ../nbs/11_xml.ipynb 7
5457_g = globals ()
@@ -65,12 +68,9 @@ def xt(tag:str, *c, **kw):
6568for o in _all_ : _g [o ] = partial (xt , o .lower ())
6669
6770# %% ../nbs/11_xml.ipynb 14
68- voids = set ('area base br col command embed hr img input keygen link meta param source track wbr !doctype' .split ())
69-
70- # %% ../nbs/11_xml.ipynb 15
7171def _escape (s ): return '' if s is None else escape (s ) if isinstance (s , str ) else s
7272
73- # %% ../nbs/11_xml.ipynb 16
73+ # %% ../nbs/11_xml.ipynb 15
7474def _to_attr (k ,v ):
7575 if isinstance (v ,bool ):
7676 if v == True : return str (k )
@@ -82,7 +82,7 @@ def _to_attr(k,v):
8282 if qt in v : qt = "'"
8383 return f'{ k } ={ qt } { v } { qt } '
8484
85- # %% ../nbs/11_xml.ipynb 17
85+ # %% ../nbs/11_xml.ipynb 16
8686def to_xml (elm , lvl = 0 ):
8787 "Convert `xt` element tree into an XML string"
8888 if elm is None : return ''
@@ -97,24 +97,31 @@ def to_xml(elm, lvl=0):
9797 sattrs = (_to_attr (k ,v ) for k ,v in attrs .items ())
9898 stag += ' ' + ' ' .join (sattrs )
9999
100- cltag = '' if tag in voids else f'</{ tag } >'
100+ isvoid = getattr (elm , 'void_' , False )
101+ cltag = '' if isvoid else f'</{ tag } >'
101102 if not cs : return f'{ sp } <{ stag } >{ cltag } \n '
102103 if len (cs )== 1 and not isinstance (cs [0 ],(list ,tuple )) and not hasattr (cs [0 ],'__xt__' ):
103104 return f'{ sp } <{ stag } >{ _escape (cs [0 ])} { cltag } \n '
104105 res = f'{ sp } <{ stag } >\n '
105106 res += '' .join (to_xml (c , lvl = lvl + 2 ) for c in cs )
106- if tag not in voids : res += f'{ sp } { cltag } \n '
107+ if not isvoid : res += f'{ sp } { cltag } \n '
107108 return res
108109
109- # %% ../nbs/11_xml.ipynb 19
110+ # %% ../nbs/11_xml.ipynb 18
110111def highlight (s , lang = 'xml' ):
111112 "Markdown to syntax-highlight `s` in language `lang`"
112113 return f'```{ lang } \n { to_xml (s )} \n ```'
113114
114- # %% ../nbs/11_xml.ipynb 20
115+ # %% ../nbs/11_xml.ipynb 19
115116def showtags (s ):
116117 return f"""<code><pre>
117118{ escape (to_xml (s ))}
118119</code></pre>"""
119120
120121XT ._repr_markdown_ = highlight
122+
123+ # %% ../nbs/11_xml.ipynb 20
124+ def __getattr__ (tag ):
125+ if tag .startswith ('_' ) or tag [0 ].islower (): raise AttributeError
126+ def _f (* c , target_id = None , ** kwargs ): return xt (tag , * c , target_id = target_id , ** kwargs )
127+ return _f
0 commit comments