A fast, minimalist HTML generator
Project description
fast_html is a fast, minimalist HTML generator.
It is an alternative to templating engines, like Jinja, for use with, e.g., htmx.
Pros:
-
use familiar python syntax
-
use efficient concatenation techniques
-
optional automatic indentation
Unlike other HTML generators (e.g. Dominate) that use python objects to represent HTML snippets,
fast_html represents HTML snippets using string generators
that can be rendered extremely fast using join.
(see here)
Like other HTML generators, one needs to remember:
-
the name of some tags and attributes is changed (e.g.,
class_instead ofclass, due to Python parser) -
there may be conflicts of function names with your code base
Installation
pip install fast_html or copy the (single) source file in your project.
Don't forget to add a star on GitHub <https://github.com/pcarbonn/fast_html>_ ! Thanks.
Tutorial:
>>> from fast_html import *
A tag is created by calling a function of the corresponding name,
and rendered using render:
>>> print(render(p("text")))
<p>text</p>
Tag attributes are specified using named arguments:
>>> print(render(br(id=1)))
<br id="1">
>>> print(render(br(id=None)))
<br>
>>> print(render(ul(li("text", selected=True))))
<ul><li selected>text</li></ul>
>>> print(render(ul(li("text", selected=False))))
<ul><li>text</li></ul>
The python parser introduces some constraints:
-
The following tags require a trailing underscore:
del_,input_,map_,object_. -
The following tag attributes require a trailing underscore:
class_,for_.
In fact, the trailing underscore in attribute names is always removed by fast_html,
and other underscores are replaced by -.
For example, the htmx attribute hx-get is set using hx_get="url".
>>> print(render(object_("text", class_="s12", hx_get="url")))
<object class="s12" hx-get="url">text</object>
>>> print(render(button("Click me", hx_post="/clicked", hx_swap="outerHTML")))
<button hx-post="/clicked" hx-swap="outerHTML">Click me</button>
The innerHTML can be a list:
>>> print(render(div(["text",
... span("item 1"),
... span("item 2")
... ])))
<div>text<span>item 1</span><span>item 2</span></div>
The innerHTML can also be a list of lists:
>>> print(render(div(["text",
... [span(f"item {i}") for i in [1,2]]
... ])))
<div>text<span>item 1</span><span>item 2</span></div>
>>> print(render([br(), br()]))
<br><br>
You can call generators too:
>>> def row(number, name):
... yield "<tr>"
... yield td(number)
... yield td(name)
... yield "</tr>"
>>> def table():
... yield "<table>"
... yield from row("1", "A")
... yield from row("2", "B")
... yield "</table>"
>>> print(render(table()))
<table><tr><td>1</td><td>A</td></tr><tr><td>2</td><td>B</td></tr></table>
The innerHTML can also be specified using the i parameter,
after the other attributes, to match the order of rendering:
>>> print(render(ul(class_="s12", i=[
... li("item 1"),
... li("item 2")]
... )))
<ul class="s12"><li>item 1</li><li>item 2</li></ul>
You can create your own tag using the tag function:
>>> def my_tag(inner=None, **kwargs):
... yield from tag("my_tag", inner, **kwargs)
>>> print(render(my_tag("text")))
<my_tag>text</my_tag>
Options:
By default, the inner string of a tag is not escaped:
characters &, < and > in it are not converted to HTML-safe sequences.
>>> print(render(p("<bold>text</bold>")))
<p><bold>text</bold></p>
Of course, you can escape strings before calling fast_html:
>>> from html import escape
>>> print(render(p(escape("<bold>text</bold>"))))
<p><bold>text</bold></p>
If your policy is to escape every inner string,
you can activate escaping by setting the variable escape to True
(or by calling escape_it(True)).
>>> escape_it(True)
>>> print(render(p("<bold>text</bold>")))
<p><bold>text</bold></p>
When debugging your code, you can set global variable indent to True
(or call indent_it(True)) to obtain HTML with tag indentation, e.g.,
>>> indent_it(True)
>>> print(render(div(class_="s12", i=["text\n", span("item 1"), span("item 2")])))
<div class="s12">
text
<span>
item 1
</span>
<span>
item 2
</span>
</div>
<BLANKLINE>
You can also convert an HTML string to a function-based code representation:
>>> print(html_to_code('<div class="example"><p>Some text</p></div>'))
[div([p(['Some text'], )], class_="example")]
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fast_html-1.0.12.tar.gz.
File metadata
- Download URL: fast_html-1.0.12.tar.gz
- Upload date:
- Size: 8.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.5 CPython/3.12.3 Linux/6.8.0-57-generic
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2a8dc0fa97e18481f5260c9d74bb8a0a09ce4339ede0708dfe605b281cb5211f
|
|
| MD5 |
0a7eb8b8cf95555f98193ee242513e79
|
|
| BLAKE2b-256 |
07ed728ce00793837c858a7ce787b13c238ff6ce660878dcb72c2fb8994cd411
|
File details
Details for the file fast_html-1.0.12-py3-none-any.whl.
File metadata
- Download URL: fast_html-1.0.12-py3-none-any.whl
- Upload date:
- Size: 9.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.5 CPython/3.12.3 Linux/6.8.0-57-generic
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b93a6f5326484a7930ebb872ac8c4aa0afb7b8c6e85611064f39d360651fefe5
|
|
| MD5 |
50e2c5e6bd8e88ee6e95d140ac2945da
|
|
| BLAKE2b-256 |
a93117f12a12a4f453882cf95623c29ba763353bf43ef9518da8209f69f7054d
|