Skip to main content

A lazy HTML element builder.

Project description

haitch


builds.sr.ht status PyPI - Version

haitch, an alternative pronunciation for the letter "H".

The haitch package provides a builder for composing HTML elements in a Document Object Model (DOM) tree. The element nodes will only be rendered when the __str__ method is invoked.

Why write your HTML in templates when you can do it in Python?

Core features:

  • Compose HTML elements.
  • Lazily evaluate DOM tree.
  • 100% test coverage.
  • 100% type annotated codebase.
  • Zero dependencies.

Upcoming features:

  • Explicit attribute annotations for known elements like a, img, etc.
  • Document elements based on MDN Web Docs.
  • Extra Annotations for 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")
str(h1) # <h1>Hello, world</h1>

# Render custom `foo` tag (useful for web components).
foo = H.foo("Hello, world")
str(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()(
        [
            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>
#     <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>

FYI: The example output is prettified for better readability. The actual output is a minified string with no formatting.

Motivation

I was 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 type annotations. 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.

License

haitch is distributed under the terms of the BSD-3-Clause license.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

haitch-0.3.0.tar.gz (6.9 kB view details)

Uploaded Source

Built Distribution

haitch-0.3.0-py3-none-any.whl (6.5 kB view details)

Uploaded Python 3

File details

Details for the file haitch-0.3.0.tar.gz.

File metadata

  • Download URL: haitch-0.3.0.tar.gz
  • Upload date:
  • Size: 6.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-httpx/0.26.0

File hashes

Hashes for haitch-0.3.0.tar.gz
Algorithm Hash digest
SHA256 08bb7957dc415eb551adbb9b7c27cbcf9006fe9eff21b106f5290f66e178ab46
MD5 48b96f0ab04b5e9d7117be66add7e274
BLAKE2b-256 d61f3ce6b2e1a73efe43db25b0fcb8ae988e047c2595592a76990785ec684b77

See more details on using hashes here.

File details

Details for the file haitch-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: haitch-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 6.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-httpx/0.26.0

File hashes

Hashes for haitch-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 65228d77e16745ae1de99e15c986d64a2f3ff73a65cc34b6b2f29d2c23353112
MD5 1a366e35700e2a9ef8fd119a53160ceb
BLAKE2b-256 c58eba157e031237f62a31e60a8130cff9f407596e0b22d118c9e9342e3ab645

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page