| from fh_bootstrap import * | |
| from itertools import chain | |
| from markdown import markdown | |
| md_exts = "codehilite", "smarty", "extra", "sane_lists" | |
| def Markdown(s, exts=md_exts, **kw): | |
| return Div(NotStr(markdown(s, extensions=exts)), **kw) | |
| ghurl = "https://github.com/nbroad1881" | |
| hf_logo_svg = ( | |
| "https://huggingface.co/datasets/huggingface/brand-assets/resolve/main/hf-logo.svg" | |
| ) | |
| hf_url = "https://hf.co/nbroad" | |
| li_url = "https://www.linkedin.com/in/nicholas-m-broad/" | |
| kaggle_url = "https://www.kaggle.com/nbroad" | |
| yt_url = "https://www.youtube.com/@nicholasbroad1881" | |
| tw_url = "https://twitter.com/nbroad1881" | |
| fh_url = "https://fastht.ml/" | |
| fh_logo = "assets/fasthtml_logo.svg" | |
| def BstPage(selidx, title, *c): | |
| navitems = [("Home", "/"), ("About", "/about"), ("Blog", "/blog")] | |
| ra_items = ( | |
| A( | |
| Image( | |
| src=hf_logo_svg, | |
| width=28, | |
| height=28, | |
| cls="my-0 px-0 mx-0 py-0", | |
| left=False, | |
| pad=0, | |
| ), | |
| cls="ms-2 my-0 px-1 btn-lg btn", | |
| role="button", | |
| href=hf_url, | |
| target="_blank", | |
| rel="noopener noreferrer", | |
| ), | |
| Icon( | |
| "fab fa-github", | |
| dark=False, | |
| sz="lg", | |
| href=ghurl, | |
| cls="ms-2 px-2", | |
| target="_blank", | |
| rel="noopener noreferrer", | |
| ), | |
| Icon( | |
| "fab fa-linkedin", | |
| dark=False, | |
| sz="lg", | |
| href=li_url, | |
| cls="ms-2 px-2", | |
| target="_blank", | |
| rel="noopener noreferrer", | |
| ), | |
| Icon( | |
| "fab fa-kaggle", | |
| dark=False, | |
| sz="lg", | |
| href=kaggle_url, | |
| cls="ms-2 px-2", | |
| target="_blank", | |
| rel="noopener noreferrer", | |
| ), | |
| Icon( | |
| "fab fa-youtube", | |
| dark=False, | |
| sz="lg", | |
| href=yt_url, | |
| cls="ms-2 px-2", | |
| target="_blank", | |
| rel="noopener noreferrer", | |
| ), | |
| Icon( | |
| "fab fa-twitter", | |
| dark=False, | |
| sz="lg", | |
| href=tw_url, | |
| cls="ms-2 px-2", | |
| target="_blank", | |
| rel="noopener noreferrer", | |
| ), | |
| ) | |
| ftlinks = [ | |
| A(k, href=v, cls="nav-link px-2 text-muted") for k, v in dict(Home="/").items() | |
| ] | |
| return ( | |
| Title(title), | |
| Script("initTOC()"), | |
| Container( | |
| Navbar( | |
| "nav", | |
| selidx, | |
| items=navitems, | |
| ra_items=ra_items, | |
| cls="navbar-light bg-secondary rounded-lg", | |
| image=f"", | |
| hdr_href="", | |
| placement=PlacementT.Default, | |
| expand=SizeT.Md, | |
| toggle_left=False, | |
| ), | |
| Toc(Container(H1(title, cls="pb-2 pt-1"), *c, cls="mt-3")), | |
| BstFooter( | |
| "Made using FastHTML", File(fh_logo), img_href=fh_url, cs=ftlinks | |
| ), | |
| typ=ContainerT.Xl, | |
| cls="mt-3", | |
| data_bs_spy="scroll", | |
| data_bs_target="#toc", | |
| ), | |
| ) | |
| def Sections(h2s, texts): | |
| colors = "yellow", "pink", "teal", "blue" | |
| div_cls = "py-2 px-3 mt-4 bg-light-{} rounded-lg" | |
| return chain( | |
| [ | |
| Div( | |
| H2(h2, id=f"sec{i+1}", cls=div_cls.format(colors[i % 4])), | |
| Div(txt, cls="px-2"), | |
| ) | |
| for i, (h2, txt) in enumerate(zip(h2s, texts)) | |
| ] | |
| ) | |