simplify your HTML building.
Project description
simplify your HTML building.
haitch
alternative pronunciation for the letter "H"
The haitch
library provides a builder for composing HTML elements together. The element nodes are functional and will only be rendered when invoked.
Why write your HTML in templates when you can do it in Python?
Features
- Compose HTML elements.
- Lazily evaluate DOM tree.
- 100% test coverage.
- 100% type annotated codebase.
- Zero dependencies.
- Document common elements.
Roadmap
- Document all HTML elements from MDN Web Docs.
- Support common third-party plugins like htmx and alpine.
Requirements
Python 3.8+
Quickstart
Install haitch
using pip:
$ pip install haitch
Import the library like so:
import haitch as H
By importing the root module, you now have access to any element you want:
# Render known `h1` tag.
h1 = H.h1("Hello, world")
print(h1) # <h1>Hello, world</h1>
# Render custom `foo` tag (useful for web components).
foo = H.foo("Hello, world")
print(foo) # <foo>Hello, world!</foo>
Here is a simple, real-world example that showcases the advantage of writing HTML in Python. Let's say we want a list of customer emails based on some business logic:
# Fetch customers from a data store.
customers = [
("jane@aol.com", False, True),
("bob@example.com", True, False),
("mark@mail.org", True, False),
("karen@hr.org", False, False),
]
# Build the DOM tree with attributes and children.
dom = H.div(class_="container")(
H.h1("Customers to contact:"),
H.ul(id_="email-customer-list")(
H.li(H.a(href=f"mailto:{email}")(email))
for email, is_premium, is_new in customers
if is_premium or is_new
),
)
print(dom)
# <div class="container">
# <h1>Customers to contact:</h1>
# <ul id="email-customer-list">
# <li><a href="mailto:jane@aol.com">jane@aol.com</a></li>
# <li><a href="mailto:bob@example.com">bob@example.com</a></li>
# <li><a href="mailto:mark@mail.org">mark@mail.org</a></li>
# </ul>
# </div>
The printed output above is prettified for better readability. The actual output is a minified string with no formatting.
Documentation
Activate your virtual environment where haitch
is installed and run:
$ python -c "help('haitch')"
Motivation
Inspired by the fantastic htbuilder library as an alternative to template engines. The library met most of my needs, but I really wanted to expand its functionality by leveraging modern Python features like typing. This coincided with my excitement for Hypermedia-Driven Applications (HDAs) with tools like htmx
and alpine
.
While writing HDAs has simplified my application logic, the lack of autocompletion and diagnostics in templates are quite annoying. Therefore, my goal with this package is to make writing HTML as simple and fun as writing normal Python code by writing normal Python code.
Non-goals
The following features will not be supported:
- Deprecated elements and attributes: if you want to use them, that is fine by me as
haitch
supports generic elements and attributes. However, I am not going to write the annotations and documentation for them. - 100% input validation: this library is meant to assist the developer to write valid HTML with the help of type annotations and documentation. In the end, it is up to the developer and browser to verify that the input is of the correct type. So for example, I will not add any validation to make sure that a
<col>
element is directly nested inside of a<colgroup>
element or that thespan
attribute for the<col>
element is a positive integer.
License
haitch
is distributed under the terms of the BSD-3-Clause license.
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
File details
Details for the file haitch-0.8.1.tar.gz
.
File metadata
- Download URL: haitch-0.8.1.tar.gz
- Upload date:
- Size: 28.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: python-httpx/0.26.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | cf3a36ffb3eb491cda062e80a35b9e0d7b643be6994f0103fd0d50096981ba40 |
|
MD5 | 4376fa0ddbe6f1d395915bdd76e1c14a |
|
BLAKE2b-256 | 94da4725275235316ab53a068ac97cd07806cf88cf66e92e0f69387f50d911cd |
File details
Details for the file haitch-0.8.1-py3-none-any.whl
.
File metadata
- Download URL: haitch-0.8.1-py3-none-any.whl
- Upload date:
- Size: 47.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: python-httpx/0.26.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2e9c2049acc66298d457a409c499f6b51b26f5f921f09edd37f92668f0cecaf5 |
|
MD5 | 62dfa58e242026047ddccd8d31f0ecb5 |
|
BLAKE2b-256 | 53f1ee7fb60526a03469b10eae8c37843f62723e63fbd81d1e4d7760060ae058 |