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 Codecov 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.3.0.tar.gz (15.3 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.3.0-py3-none-any.whl (13.0 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: domify-0.3.0.tar.gz
  • Upload date:
  • Size: 15.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.13 CPython/3.8.10 Linux/5.13.0-1022-azure

File hashes

Hashes for domify-0.3.0.tar.gz
Algorithm Hash digest
SHA256 6677f67f2fbb462640ffe3e31e2a01a073790ae19eee810ac753e9408862bac9
MD5 6e90a7b7245025ad5a80b21d8bde220a
BLAKE2b-256 8d2703e7d8ce156fe8e14473b6b239948549d1036bb32ebe8ecefd2e65e845c6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: domify-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 13.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.13 CPython/3.8.10 Linux/5.13.0-1022-azure

File hashes

Hashes for domify-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3881e4a23e839dd4f1c75a6765fa0f729e8d24ff14ffcc21b4d5462abaf8a9ce
MD5 f49bb32597148306497702b9a719b7cc
BLAKE2b-256 eaa086c092c4f013abf459e595a4f0444c274ddf5d0a3ad858eee0c9cf2b240b

See more details on using hashes here.

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