Skip to content

Commit 9e63413

Browse files
committed
fixes #680
1 parent e1184e2 commit 9e63413

File tree

3 files changed

+48
-9
lines changed

3 files changed

+48
-9
lines changed

fastcore/_modidx.py

+1
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,7 @@
505505
'fastcore.xml.FT.__call__': ('xml.html#ft.__call__', 'fastcore/xml.py'),
506506
'fastcore.xml.FT.__getattr__': ('xml.html#ft.__getattr__', 'fastcore/xml.py'),
507507
'fastcore.xml.FT.__getitem__': ('xml.html#ft.__getitem__', 'fastcore/xml.py'),
508+
'fastcore.xml.FT.__html__': ('xml.html#ft.__html__', 'fastcore/xml.py'),
508509
'fastcore.xml.FT.__init__': ('xml.html#ft.__init__', 'fastcore/xml.py'),
509510
'fastcore.xml.FT.__iter__': ('xml.html#ft.__iter__', 'fastcore/xml.py'),
510511
'fastcore.xml.FT.__repr__': ('xml.html#ft.__repr__', 'fastcore/xml.py'),

fastcore/xml.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ def _to_attr(k,v):
146146
if v==False: return ''
147147
if isinstance(v,str): v = escape(v, quote=False)
148148
elif isinstance(v, Mapping): v = json.dumps(v)
149+
elif hasattr(v, '__html__'): v = v.__html__()
149150
else: v = str(v)
150151
qt = '"'
151152
if qt in v:
@@ -209,7 +210,9 @@ def to_xml(elm, lvl=0, indent=True, do_escape=True):
209210
"Convert `ft` element tree into an XML string"
210211
return Safe(_to_xml(elm, lvl, indent, do_escape=do_escape))
211212

212-
FT.__html__ = to_xml
213+
# %% ../nbs/09_xml.ipynb
214+
@patch
215+
def __html__(self:FT): return to_xml(self, indent=False)
213216

214217
# %% ../nbs/09_xml.ipynb
215218
def highlight(s, lang='html'):

nbs/09_xml.ipynb

+43-8
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,7 @@
382382
" if v==False: return ''\n",
383383
" if isinstance(v,str): v = escape(v, quote=False)\n",
384384
" elif isinstance(v, Mapping): v = json.dumps(v)\n",
385+
" elif hasattr(v, '__html__'): v = v.__html__()\n",
385386
" else: v = str(v)\n",
386387
" qt = '\"'\n",
387388
" if qt in v:\n",
@@ -460,16 +461,26 @@
460461
{
461462
"cell_type": "code",
462463
"execution_count": null,
463-
"id": "dd054392",
464+
"id": "7a3655e9",
464465
"metadata": {},
465466
"outputs": [],
466467
"source": [
467468
"#| export\n",
468469
"def to_xml(elm, lvl=0, indent=True, do_escape=True):\n",
469470
" \"Convert `ft` element tree into an XML string\"\n",
470-
" return Safe(_to_xml(elm, lvl, indent, do_escape=do_escape))\n",
471-
"\n",
472-
"FT.__html__ = to_xml"
471+
" return Safe(_to_xml(elm, lvl, indent, do_escape=do_escape))"
472+
]
473+
},
474+
{
475+
"cell_type": "code",
476+
"execution_count": null,
477+
"id": "dd054392",
478+
"metadata": {},
479+
"outputs": [],
480+
"source": [
481+
"#| export\n",
482+
"@patch\n",
483+
"def __html__(self:FT): return to_xml(self, indent=False)"
473484
]
474485
},
475486
{
@@ -640,10 +651,7 @@
640651
"text": [
641652
"<div><b>Hello from Django</b></div>\n",
642653
"\n",
643-
"<div>\n",
644-
" <p>Hello from fastcore &lt;3</p>\n",
645-
"</div>\n",
646-
"\n"
654+
"<div><p>Hello from fastcore &lt;3</p></div>\n"
647655
]
648656
}
649657
],
@@ -655,6 +663,33 @@
655663
"print(_esc(Div(P('Hello from fastcore <3'))))"
656664
]
657665
},
666+
{
667+
"cell_type": "markdown",
668+
"id": "d7ff740e",
669+
"metadata": {},
670+
"source": [
671+
"FT attributes are rendered with `to_xml`:"
672+
]
673+
},
674+
{
675+
"cell_type": "code",
676+
"execution_count": null,
677+
"id": "180074af",
678+
"metadata": {},
679+
"outputs": [
680+
{
681+
"name": "stdout",
682+
"output_type": "stream",
683+
"text": [
684+
"<p value=\"<div>ho</div>\">hi</p>\n",
685+
"\n"
686+
]
687+
}
688+
],
689+
"source": [
690+
"print(to_xml(P('hi', value=Div('ho'))))"
691+
]
692+
},
658693
{
659694
"cell_type": "markdown",
660695
"id": "5ad30d7c",

0 commit comments

Comments
 (0)