Skip to content

Commit aeca40a

Browse files
committed
fixes #155
1 parent 5f674a1 commit aeca40a

4 files changed

Lines changed: 51 additions & 17 deletions

File tree

monsterui/_modidx.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,4 +222,5 @@
222222
'monsterui.franken.Var': ('franken.html#var', 'monsterui/franken.py'),
223223
'monsterui.franken._TableCell': ('franken.html#_tablecell', 'monsterui/franken.py'),
224224
'monsterui.franken.apply_classes': ('franken.html#apply_classes', 'monsterui/franken.py'),
225+
'monsterui.franken.normalize_html': ('franken.html#normalize_html', 'monsterui/franken.py'),
225226
'monsterui.franken.render_md': ('franken.html#render_md', 'monsterui/franken.py')}}}

monsterui/franken.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
'ScrollspyT', 'NavBar', 'SliderContainer', 'SliderItems', 'SliderNav', 'Slider', 'DropDownNavContainer',
1818
'TabContainer', 'CardT', 'CardTitle', 'CardHeader', 'CardBody', 'CardFooter', 'CardContainer', 'Card',
1919
'TableT', 'Table', 'Td', 'Th', 'Tbody', 'TableFromLists', 'TableFromDicts', 'apply_classes',
20-
'FrankenRenderer', 'render_md', 'ThemePicker', 'LightboxContainer', 'LightboxItem', 'ApexChart', 'ScrollSpy',
21-
'LoaderButton', 'ToggleBtn']
20+
'FrankenRenderer', 'normalize_html', 'render_md', 'ThemePicker', 'LightboxContainer', 'LightboxItem',
21+
'ApexChart', 'ScrollSpy', 'LoaderButton', 'ToggleBtn']
2222

2323
# %% ../nbs/02_franken.ipynb #a9b7e605
2424
import fasthtml.common as fh
@@ -1563,7 +1563,12 @@ def render_image(self, token):
15631563
src = f'{pathlib.Path(self.img_dir)}/{src}'
15641564
return template.format(src, token.children[0].content if token.children else '', title)
15651565

1566-
# %% ../nbs/02_franken.ipynb #b31876df
1566+
# %% ../nbs/02_franken.ipynb #1213ae59
1567+
from bs4 import BeautifulSoup
1568+
1569+
# %% ../nbs/02_franken.ipynb #cc4d2c00
1570+
def normalize_html(s): return BeautifulSoup(s, 'lxml').body.decode_contents(formatter='html')
1571+
15671572
def render_md(md_content:str, # Markdown content
15681573
class_map=None, # Class map
15691574
class_map_mods=None, # Additional class map
@@ -1575,6 +1580,7 @@ def render_md(md_content:str, # Markdown content
15751580
html_content = mistletoe.markdown(md_content, partial(renderer, img_dir=img_dir))
15761581
if (class_map or class_map is None) or class_map_mods:
15771582
html_content = apply_classes(html_content, class_map, class_map_mods)
1583+
else: html_content = normalize_html(html_content)
15781584
return NotStr(html_content)
15791585

15801586
# %% ../nbs/02_franken.ipynb #6a69f18f

nbs/02_franken.ipynb

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@
435435
" <html>\n",
436436
" <head>\n",
437437
" <title>FastHTML page</title>\n",
438-
" <link rel="canonical" href="https://testserver/_FIrFOM6hRHCEq0FrNABhvQ">\n",
438+
" <link rel="canonical" href="https://testserver/_NKnZ-GS6RtyPadI25_q7IA">\n",
439439
" <meta charset="utf-8">\n",
440440
" <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">\n",
441441
"<script src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.7/dist/htmx.js"></script><script src="https://cdn.jsdelivr.net/gh/answerdotai/fasthtml-js@1.0.12/fasthtml.js"></script><script src="https://cdn.jsdelivr.net/gh/answerdotai/surreal@main/surreal.js"></script><script src="https://cdn.jsdelivr.net/gh/gnat/css-scope-inline@main/script.js"></script> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/franken-ui@2.0.0/dist/css/core.min.css">\n",
@@ -1275,7 +1275,7 @@
12751275
" <html>\n",
12761276
" <head>\n",
12771277
" <title>FastHTML page</title>\n",
1278-
" <link rel="canonical" href="https://testserver/_FJsQQbXfR6qu_-71hvQJZA">\n",
1278+
" <link rel="canonical" href="https://testserver/_EB62jdyYTHSdQ_qkcuUWwQ">\n",
12791279
" <meta charset="utf-8">\n",
12801280
" <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">\n",
12811281
"<script src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.7/dist/htmx.js"></script><script src="https://cdn.jsdelivr.net/gh/answerdotai/fasthtml-js@1.0.12/fasthtml.js"></script><script src="https://cdn.jsdelivr.net/gh/answerdotai/surreal@main/surreal.js"></script><script src="https://cdn.jsdelivr.net/gh/gnat/css-scope-inline@main/script.js"></script> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/franken-ui@2.0.0/dist/css/core.min.css">\n",
@@ -1816,7 +1816,7 @@
18161816
" <html>\n",
18171817
" <head>\n",
18181818
" <title>FastHTML page</title>\n",
1819-
" <link rel="canonical" href="https://testserver/_UJcdoQ15T_6M0ot2y0os3w">\n",
1819+
" <link rel="canonical" href="https://testserver/_l_oTxiTjRc6kVpia161iFA">\n",
18201820
" <meta charset="utf-8">\n",
18211821
" <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">\n",
18221822
"<script src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.7/dist/htmx.js"></script><script src="https://cdn.jsdelivr.net/gh/answerdotai/fasthtml-js@1.0.12/fasthtml.js"></script><script src="https://cdn.jsdelivr.net/gh/answerdotai/surreal@main/surreal.js"></script><script src="https://cdn.jsdelivr.net/gh/gnat/css-scope-inline@main/script.js"></script> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/franken-ui@2.0.0/dist/css/core.min.css">\n",
@@ -2190,7 +2190,7 @@
21902190
" <html>\n",
21912191
" <head>\n",
21922192
" <title>FastHTML page</title>\n",
2193-
" <link rel="canonical" href="https://testserver/_mYITJQxrR3iCL3vRt3CHLQ">\n",
2193+
" <link rel="canonical" href="https://testserver/_GQ2tHsBpTLWB4G3vmOuXtA">\n",
21942194
" <meta charset="utf-8">\n",
21952195
" <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">\n",
21962196
"<script src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.7/dist/htmx.js"></script><script src="https://cdn.jsdelivr.net/gh/answerdotai/fasthtml-js@1.0.12/fasthtml.js"></script><script src="https://cdn.jsdelivr.net/gh/answerdotai/surreal@main/surreal.js"></script><script src="https://cdn.jsdelivr.net/gh/gnat/css-scope-inline@main/script.js"></script> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/franken-ui@2.0.0/dist/css/core.min.css">\n",
@@ -3379,7 +3379,7 @@
33793379
" <html>\n",
33803380
" <head>\n",
33813381
" <title>FastHTML page</title>\n",
3382-
" <link rel="canonical" href="https://testserver/_nHZV7WcbRSmArmvQPuNmMQ">\n",
3382+
" <link rel="canonical" href="https://testserver/_gMK1k5rZQEa-kanCWhz21A">\n",
33833383
" <meta charset="utf-8">\n",
33843384
" <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">\n",
33853385
"<script src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.7/dist/htmx.js"></script><script src="https://cdn.jsdelivr.net/gh/answerdotai/fasthtml-js@1.0.12/fasthtml.js"></script><script src="https://cdn.jsdelivr.net/gh/answerdotai/surreal@main/surreal.js"></script><script src="https://cdn.jsdelivr.net/gh/gnat/css-scope-inline@main/script.js"></script> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/franken-ui@2.0.0/dist/css/core.min.css">\n",
@@ -3646,11 +3646,24 @@
36463646
{
36473647
"cell_type": "code",
36483648
"execution_count": null,
3649-
"id": "b31876df",
3649+
"id": "1213ae59",
36503650
"metadata": {},
36513651
"outputs": [],
36523652
"source": [
36533653
"#| export\n",
3654+
"from bs4 import BeautifulSoup"
3655+
]
3656+
},
3657+
{
3658+
"cell_type": "code",
3659+
"execution_count": null,
3660+
"id": "cc4d2c00",
3661+
"metadata": {},
3662+
"outputs": [],
3663+
"source": [
3664+
"#| export\n",
3665+
"def normalize_html(s): return BeautifulSoup(s, 'lxml').body.decode_contents(formatter='html')\n",
3666+
"\n",
36543667
"def render_md(md_content:str, # Markdown content\n",
36553668
" class_map=None, # Class map\n",
36563669
" class_map_mods=None, # Additional class map\n",
@@ -3662,9 +3675,29 @@
36623675
" html_content = mistletoe.markdown(md_content, partial(renderer, img_dir=img_dir))\n",
36633676
" if (class_map or class_map is None) or class_map_mods:\n",
36643677
" html_content = apply_classes(html_content, class_map, class_map_mods)\n",
3678+
" else: html_content = normalize_html(html_content)\n",
36653679
" return NotStr(html_content)"
36663680
]
36673681
},
3682+
{
3683+
"cell_type": "code",
3684+
"execution_count": null,
3685+
"id": "cf157286",
3686+
"metadata": {},
3687+
"outputs": [
3688+
{
3689+
"name": "stdout",
3690+
"output_type": "stream",
3691+
"text": [
3692+
"<p>This is a </p><div> in <code>my</code> content\n",
3693+
"</div>\n"
3694+
]
3695+
}
3696+
],
3697+
"source": [
3698+
"print(render_md('This is a <div> in `my` content', class_map={}))"
3699+
]
3700+
},
36683701
{
36693702
"cell_type": "code",
36703703
"execution_count": null,
@@ -4374,13 +4407,7 @@
43744407
]
43754408
}
43764409
],
4377-
"metadata": {
4378-
"kernelspec": {
4379-
"display_name": "python3",
4380-
"language": "python",
4381-
"name": "python3"
4382-
}
4383-
},
4410+
"metadata": {},
43844411
"nbformat": 4,
43854412
"nbformat_minor": 5
43864413
}

settings.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ description = The simplicity of FastHTML with the power of Tailwind
2626
keywords = nbdev jupyter notebook python
2727
language = English
2828
status = 3
29-
requirements = python-fasthtml fastcore lxml mistletoe mistlefoot>=0.0.2
29+
requirements = python-fasthtml fastcore lxml mistletoe mistlefoot>=0.0.2 beautifulsoup4
3030
dev_requirements = pandas jinja2 llms-txt pysymbol_llm
3131
doc_path = _docs
3232
readme_nb = index.ipynb

0 commit comments

Comments
 (0)