Skip to main content

HTML generator using pure Python

Project description

domify

HTML generator using pure Python.

PyPI PyPI - Status PyPI - Python Version Code style: black Tests status Coverage PyPI - License

Simple example:

from domify import html_elements as e

html = e.Html(lang="en")
with html:
    with e.Head():
        e.Meta(charset="utf-8")
        e.Title("Example page")

    with e.Body():
        e.H1("Hello world")
        e.P("Lorem ipsum ", e.I("dolor sit amet"))

print(str(html))

HTML output (formatted for legibility):

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Example page</title>
  </head>
  <body>
    <h1>Hello world</h1>
    <p>Lorem ipsum <i>dolor sit amet</i></p>
  </body>
</html>

Note: every example on this page assumes domify has already been imported:

from domify import html_elements as e

domify.html_elements contains a class for each HTML element, with the first letter converted to uppercase:

p = e.P("Lorem ipsum dolor sit amet")
print(str(p))
<p>Lorem ipsum dolor sit amet</p>

You can pass strings or additional elements as positional arguments, and they will be treated as children:

p = e.P("Lorem ipsum dolor sit amet", e.Br(), "consectetur adipiscing elit.")
print(str(p))
<p>
  Lorem ipsum dolor sit amet
  <br>
  consectetur adipiscing elit.
</p>

Attributes can be passed as keyword arguments, optionally appending an underscore to attributes which are reserved keywords in python (for example class). Integers and floats are automatically converted to strings, while additional underscores are replaced with dashes (especially useful for data and aria attributes):

btn = e.Button("Click!", type="submit", class_="someclass", data_order=155)
print(str(btn))
<button type="submit" class="someclass" data-order="155">Click!</button>

HTML5 boolean attributes accept a boolean value instead:

text_input = e.Input(type="text", required=True, disabled=False)
print(str(text_input))
<input type="text" required>

Attributes can be added or modified by subscripting an element object:

html = e.Html()
html["lang"] = "en"
print(str(html))
<!DOCTYPE html>
<html lang="en"></html>

Children can be modified (but not added) by subscripting as well:

p = e.P("Text node 1", e.Br(), "Text node 2")
p[0] = "Text node 3"
p[1:] = [e.Hr()]
print(str(p))
<p>
  Text node 3
  <hr>
</p>

The del keyword can be used to delete both attributes and children:

div = e.Div("foo", e.Br(), "bar", e.Br(), "bar", id="someid", class_="someclass")
del div["class"]
del div[3:]
print(str(div))
<div id="someid">
  foo
  <br>
  bar
</div>

add_class and remove_class can be used to manage classes:

div = e.Div(class_="some-class some-other-class")
div.remove_class("some-class")
div.add_class("third-class")
print(str(div))
<div class="some-other-class third-class"></div>

Children can be added using the add or insert methods, which return the newly added element:

div = e.Div()
span = div.add(e.Span())
span.add("First line")
span.add(e.Br())
span.add("Second line")
div.insert(0, e.H1("Title"))
print(str(div))
<div>
  <h1>Title</h1>
  <span>
    First line
    <br>
    Second line
  </span>
</div>

Context managers can be used to add child elements too:

with e.Select() as select:
    e.Option("Option 1", value=1)
    e.Option("Option 2", value=2)
    e.Option("Option 3", value=3)
print(str(select))
<select>
  <option value="1">Option 1</option>
  <option value="2">Option 2</option>
  <option value="3">Option 3</option>
</select>

The + operator can be used to concatenate multiple elements and/or strings:

username = "Username: " + e.Input(type="text", name="username")
password = "Password: " + e.Input(type="password", name="password")
login_form = e.Label(username) + e.Label(password)
login_form += e.Button("Login", type="submit")
print(str(login_form))
<label>Username: <input type="text" name="username"></label>
<label>Password: <input type="password" name="password"></label>
<button type="submit">Login</button>

Text nodes can be created using TextNode (this is usually not required, since strings are automatically coverted):

with e.P() as p:
    e.TextNode("Lorem ipsum")
print(str(p))
<p>Lorem ipsum</p>

RawTextNode can be used to add strings without escaping:

with e.P() as p:
    e.TextNode("<i>TextNode</i>")
    e.Br()
    e.RawTextNode("<i>RawTextNode</i>")
print(str(p))
<p>
  &lt;i&gt;TextNode&lt;/i&gt;
  <br>
  <i>RawTextNode</i>
</p>

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

domify-0.4.9.tar.gz (14.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

domify-0.4.9-py3-none-any.whl (13.8 kB view details)

Uploaded Python 3

File details

Details for the file domify-0.4.9.tar.gz.

File metadata

  • Download URL: domify-0.4.9.tar.gz
  • Upload date:
  • Size: 14.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for domify-0.4.9.tar.gz
Algorithm Hash digest
SHA256 5accae6c85b7993ded0aa22789ab52786a9adfd1fc056be52aff65f4eadc3cfa
MD5 02afd6217fbb5885de002cec7071c18a
BLAKE2b-256 6584b64eb59a0465d3f01f89d50d313016d2b594f3e888c0eab9222520b0e33e

See more details on using hashes here.

Provenance

The following attestation bundles were made for domify-0.4.9.tar.gz:

Publisher: ci-cd.yml on Parnassius/domify

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file domify-0.4.9-py3-none-any.whl.

File metadata

  • Download URL: domify-0.4.9-py3-none-any.whl
  • Upload date:
  • Size: 13.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for domify-0.4.9-py3-none-any.whl
Algorithm Hash digest
SHA256 a67849dd27cacb358fabcd2a09de8b14fb3f315a1b408df7c26d2e6cfaa9e8de
MD5 87def49d70988f035b2692c76b99278a
BLAKE2b-256 46e149d93d5709cad838649fbc0ff345bd4a29bed3b60a049853cff6663016a7

See more details on using hashes here.

Provenance

The following attestation bundles were made for domify-0.4.9-py3-none-any.whl:

Publisher: ci-cd.yml on Parnassius/domify

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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