|
30 | 30 | "#| export\n", |
31 | 31 | "from fastcore.utils import *\n", |
32 | 32 | "\n", |
| 33 | + "import types,json\n", |
| 34 | + "\n", |
33 | 35 | "from dataclasses import dataclass, asdict\n", |
34 | | - "import types\n", |
| 36 | + "from typing import Mapping\n", |
35 | 37 | "from functools import partial\n", |
36 | 38 | "from html import escape" |
37 | 39 | ] |
|
90 | 92 | "def xt(tag:str, *c, **kw):\n", |
91 | 93 | " \"Create an XML tag structure `[tag,children,attrs]` for `toxml()`\"\n", |
92 | 94 | " if len(c)==1 and isinstance(c[0], types.GeneratorType): c = tuple(c[0])\n", |
93 | | - " kw = {_attrmap(k):(v if isinstance(v,bool) else str(v)) for k,v in kw.items() if v is not None}\n", |
| 95 | + " kw = {_attrmap(k):v for k,v in kw.items() if v is not None}\n", |
94 | 96 | " return XT(tag.lower(),c,kw)" |
95 | 97 | ] |
96 | 98 | }, |
|
142 | 144 | " (['div',\n", |
143 | 145 | " ('Some text',\n", |
144 | 146 | " ['input', (), {'name': 'me'}],\n", |
145 | | - " ['img', (), {'src': 'filename'}]),\n", |
| 147 | + " ['img', (), {'data': {'a': 1}, 'src': 'filename'}]),\n", |
146 | 148 | " {'class': 'myclass'}],),\n", |
147 | 149 | " {}]),\n", |
148 | 150 | " {}]\n" |
|
152 | 154 | "source": [ |
153 | 155 | "samp = Html(\n", |
154 | 156 | " Head(Title('Some page')),\n", |
155 | | - " Body(Div('Some text', Input(name='me'), Img(src=\"filename\"), klass='myclass'))\n", |
| 157 | + " Body(Div('Some text', Input(name='me'), Img(src=\"filename\", data={'a':1}), klass='myclass'))\n", |
156 | 158 | ")\n", |
157 | 159 | "pprint(samp)" |
158 | 160 | ] |
|
222 | 224 | " if isinstance(v,bool):\n", |
223 | 225 | " if v==True : return str(k)\n", |
224 | 226 | " if v==False: return ''\n", |
225 | | - " return f'{k}=\"{escape(str(v), quote=True)}\"'" |
| 227 | + " if isinstance(v,str): v = escape(v, quote=True)\n", |
| 228 | + " elif isinstance(v, Mapping): v = json.dumps(v)\n", |
| 229 | + " else: v = str(v)\n", |
| 230 | + " qt = '\"'\n", |
| 231 | + " if qt in v: qt = \"'\"\n", |
| 232 | + " return f'{k}={qt}{v}{qt}'" |
226 | 233 | ] |
227 | 234 | }, |
228 | 235 | { |
|
275 | 282 | " <div class=\"myclass\">\n", |
276 | 283 | "Some text\n", |
277 | 284 | " <input name=\"me\">\n", |
278 | | - " <img src=\"filename\">\n", |
| 285 | + " <img src=\"filename\" data='{\"a\": 1}'>\n", |
279 | 286 | " </div>\n", |
280 | 287 | " </body>\n", |
281 | 288 | "</html>\n", |
|
0 commit comments