Skip to content

Commit 639a094

Browse files
committed
indent param to to_xml
1 parent abb2083 commit 639a094

File tree

2 files changed

+43
-21
lines changed

2 files changed

+43
-21
lines changed

fastcore/xml.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -104,14 +104,15 @@ def _to_attr(k,v):
104104
return f'{k}={qt}{v}{qt}'
105105

106106
# %% ../nbs/11_xml.ipynb
107-
def to_xml(elm, lvl=0):
107+
def to_xml(elm, lvl=0, indent:bool=True):
108108
"Convert `ft` element tree into an XML string"
109+
nl = '\n'
110+
if not indent: lvl,nl = 0,''
109111
if elm is None: return ''
110-
if isinstance(elm, tuple): return '\n'.join(to_xml(o) for o in elm)
112+
if isinstance(elm, tuple): return f'{nl}'.join(to_xml(o, indent=indent) for o in elm)
111113
if hasattr(elm, '__ft__'): elm = elm.__ft__()
112-
if isinstance(elm, bytes): return elm.decode('utf-8')
113114
sp = ' ' * lvl
114-
if not isinstance(elm, list): return f'{_escape(elm)}\n'
115+
if not isinstance(elm, list): return f'{_escape(elm)}{nl}'
115116

116117
tag,cs,attrs = elm
117118
stag = tag
@@ -121,12 +122,12 @@ def to_xml(elm, lvl=0):
121122

122123
isvoid = getattr(elm, 'void_', False)
123124
cltag = '' if isvoid else f'</{tag}>'
124-
if not cs: return f'{sp}<{stag}>{cltag}\n'
125+
if not cs: return f'{sp}<{stag}>{cltag}{nl}'
125126
if len(cs)==1 and not isinstance(cs[0],(list,tuple)) and not hasattr(cs[0],'__ft__'):
126-
return f'{sp}<{stag}>{_escape(cs[0])}{cltag}\n'
127-
res = f'{sp}<{stag}>\n'
128-
res += ''.join(to_xml(c, lvl=lvl+2) for c in cs)
129-
if not isvoid: res += f'{sp}{cltag}\n'
127+
return f'{sp}<{stag}>{_escape(cs[0])}{cltag}{nl}'
128+
res = f'{sp}<{stag}>{nl}'
129+
res += ''.join(to_xml(c, lvl=lvl+2, indent=indent) for c in cs)
130+
if not isvoid: res += f'{sp}{cltag}{nl}'
130131
return res
131132

132133
FT.__html__ = to_xml

nbs/11_xml.ipynb

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@
198198
" (['head', (['title', ('Some page',), {}],), {}],\n",
199199
" ['body',\n",
200200
" (['div',\n",
201-
" ('Some text',\n",
201+
" ('Some text\\nanother line',\n",
202202
" ['input', (), {'name': 'me'}],\n",
203203
" ['img', (), {'data': 1, 'src': 'filename'}]),\n",
204204
" {'class': 'myclass another', 'style': 'padding:1; margin:2'}],),\n",
@@ -210,7 +210,7 @@
210210
"source": [
211211
"samp = Html(\n",
212212
" Head(Title('Some page')),\n",
213-
" Body(Div('Some text', Input(name='me'), Img(src=\"filename\", data=1),\n",
213+
" Body(Div('Some text\\nanother line', Input(name='me'), Img(src=\"filename\", data=1),\n",
214214
" cls=['myclass', 'another'],\n",
215215
" style={'padding':1, 'margin':2}))\n",
216216
")\n",
@@ -325,14 +325,15 @@
325325
"outputs": [],
326326
"source": [
327327
"#| export\n",
328-
"def to_xml(elm, lvl=0):\n",
328+
"def to_xml(elm, lvl=0, indent:bool=True):\n",
329329
" \"Convert `ft` element tree into an XML string\"\n",
330+
" nl = '\\n'\n",
331+
" if not indent: lvl,nl = 0,''\n",
330332
" if elm is None: return ''\n",
331-
" if isinstance(elm, tuple): return '\\n'.join(to_xml(o) for o in elm)\n",
333+
" if isinstance(elm, tuple): return f'{nl}'.join(to_xml(o, indent=indent) for o in elm)\n",
332334
" if hasattr(elm, '__ft__'): elm = elm.__ft__()\n",
333-
" if isinstance(elm, bytes): return elm.decode('utf-8')\n",
334335
" sp = ' ' * lvl\n",
335-
" if not isinstance(elm, list): return f'{_escape(elm)}\\n'\n",
336+
" if not isinstance(elm, list): return f'{_escape(elm)}{nl}'\n",
336337
"\n",
337338
" tag,cs,attrs = elm\n",
338339
" stag = tag\n",
@@ -342,12 +343,12 @@
342343
"\n",
343344
" isvoid = getattr(elm, 'void_', False)\n",
344345
" cltag = '' if isvoid else f'</{tag}>'\n",
345-
" if not cs: return f'{sp}<{stag}>{cltag}\\n'\n",
346+
" if not cs: return f'{sp}<{stag}>{cltag}{nl}'\n",
346347
" if len(cs)==1 and not isinstance(cs[0],(list,tuple)) and not hasattr(cs[0],'__ft__'):\n",
347-
" return f'{sp}<{stag}>{_escape(cs[0])}{cltag}\\n'\n",
348-
" res = f'{sp}<{stag}>\\n'\n",
349-
" res += ''.join(to_xml(c, lvl=lvl+2) for c in cs)\n",
350-
" if not isvoid: res += f'{sp}{cltag}\\n'\n",
348+
" return f'{sp}<{stag}>{_escape(cs[0])}{cltag}{nl}'\n",
349+
" res = f'{sp}<{stag}>{nl}'\n",
350+
" res += ''.join(to_xml(c, lvl=lvl+2, indent=indent) for c in cs)\n",
351+
" if not isvoid: res += f'{sp}{cltag}{nl}'\n",
351352
" return res\n",
352353
"\n",
353354
"FT.__html__ = to_xml"
@@ -372,6 +373,7 @@
372373
" <body>\n",
373374
" <div class=\"myclass another\" style=\"padding:1; margin:2\">\n",
374375
"Some text\n",
376+
"another line\n",
375377
" <input name=\"me\">\n",
376378
" <img src=\"filename\" data=\"1\">\n",
377379
" </div>\n",
@@ -386,6 +388,26 @@
386388
"print(h)"
387389
]
388390
},
391+
{
392+
"cell_type": "code",
393+
"execution_count": null,
394+
"id": "51e58821",
395+
"metadata": {},
396+
"outputs": [
397+
{
398+
"name": "stdout",
399+
"output_type": "stream",
400+
"text": [
401+
"<!doctype html><html><head><title>Some page</title></head><body><div class=\"myclass another\" style=\"padding:1; margin:2\">Some text\n",
402+
"another line<input name=\"me\"><img src=\"filename\" data=\"1\"></div></body></html>\n"
403+
]
404+
}
405+
],
406+
"source": [
407+
"h = to_xml(samp, indent=False)\n",
408+
"print(h)"
409+
]
410+
},
389411
{
390412
"cell_type": "markdown",
391413
"id": "4713bd8d",
@@ -421,7 +443,6 @@
421443
"\n",
422444
"r = _SafeString('<b>Hello from Django</b>')\n",
423445
"print(to_xml(Div(r)))\n",
424-
"\n",
425446
"print(_escape(Div(P('Hello from fastcore <3'))))"
426447
]
427448
},

0 commit comments

Comments
 (0)