Skip to main content

Generate HTML with Python

Project description

Pythoml

Tests

Generate HTML with Python.

Pythoml provides a set of classes which render into HTML tags, allowing you to define HTML in code.

⚠️ CAUTION
It is important to sanitise any strings from an external source (e.g. a user input or database) which are used to render anything in a browser (e.g. HTML).
Pythoml does not provide any sanitisation. It is up to the developer to include that where necessary.

Useage

The Pythoml.html module contains Tag classes for each HTML5 tag.
The class names match their respective HTML tags, for example: html.A for <a>...</a> and html.Div for <div>...</div>.
For the complete list please see html.py.

Creating a Tag:

from Pythoml import html

ex = html.P("This is a paragraph")

Calling render() on a Tag will return the HTML string:

print(ex.render())

Will print the following:

<p>
  This is a paragraph
</p>

Tag Construction

A Tag constructor accepts any number of arguments and keyword arguments (i.e. *args, **kwargs).

Arguments

Arguments (*args) are used for "content" which is nested inside the HTML tag.

For example, in the code above we passed the string "This is a paragraph" to html.P, so it was rendered inside the HTML tag <p>...</p>.

Keyword Arguments

Keyword Arguments (**kwargs) are used for the HTML tag attributes and flags.

When a keyword argument value is a string, it will be used as an attribute of the HTML tag. For example setting an attribute name on a Div:

ex = html.Div(name="myDiv")

print(ex.render())
"""
<div name="myDiv">
</div>
"""

ℹ️ INFO
There are some special keys to avoid collisions with Python keywords (most notably class_ for setting a tag class attribute).
Below is a list of the special keys, listed as Python -> HTML:

  • class_ -> class
  • for_ -> for
  • id_ -> id
  • type_ -> type

When a keyword argument value is a boolean, it will be used as a flag on the HTML tag. For example setting a dialog as open:

ex = html.Dialog(open=True)

print(ex.render())
"""
<dialog open>
</dialog>
"""

Nesting

Tags can be added to the "content" of other Tags to achieve the typical nesting of HTML:

ex = html.Html(
    html.Body(
        html.H1("This is my Site"),
        html.Hr(),
        html.Div(
            html.P("Welcome to my website!")
        )
    )
)

print(ex.render())
"""
<html>
  <body>
    <h1>
      This is my Site
    </h1>
    <hr>
    <div>
      <p>
        Welcome to my website!
      </p>
    </div>
  </body>
</html>
"""

ℹ️ INFO
Tags which represent "void elements" do not support adding content.
If you add content to such a Tag, you will recieve a warning.

Lazy Content & Attributes

You can lazily add content or set attributes on a Tag:

ex = html.Div()
ex.add("Some content")
ex.set(name="myDiv")
print(ex.render())
"""
<div name="myDiv">
  Some content
</div>
"""

The add and set methods both return Self, which allows you to chain them:

ex = html.Div()
ex.add("Some content").set(name="myDiv")
print(ex.render())
"""
<div name="myDiv">
  Some content
</div>
"""

Alternatively, you can also call the instanciated Tag to update the content and attributes simultaneously:

ex = html.Div()
ex("Some content", name="myDiv")
print(ex.render())
"""
<div name="myDiv">
  Some content
</div>
"""

Alternative Syntax

The syntax shown up until now only uses the constructor to populate the Tag content and attributes. Since the examples have been relatively simple, it does not highlight a minor grievance (at least to me...) with this approach.
Consider the following:

ex = html.Div(
    html.H1("Title", class_="display-4")
    html.Div(
        html.H3("Subtitle"),
        html.Div(
            html.P("Some content"),
            class_="card"
        ),
    ),
    class_="container p-3" # <-- who does this belong to?
)

With big ugly nests like this, it gets difficult to determine which Tag the attributes are associated with.
Since we can lazily add content, an alternative to the above is:

ex = html.Div(class_="container p-3")(
    html.H1("Title", class_="display-4"),
    html.Div(
        html.H3("Subtitle"),
        html.Div(class_="card")(
            html.P("Some content"),
        ),
    ),
)

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

pythoml-0.1.0.tar.gz (8.0 kB view details)

Uploaded Source

Built Distribution

pythoml-0.1.0-py3-none-any.whl (5.4 kB view details)

Uploaded Python 3

File details

Details for the file pythoml-0.1.0.tar.gz.

File metadata

  • Download URL: pythoml-0.1.0.tar.gz
  • Upload date:
  • Size: 8.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for pythoml-0.1.0.tar.gz
Algorithm Hash digest
SHA256 73fbc1cbae5fa12fa240cf263c75dfb3f668dcab0ef5eac27cdc8ea8ee64274a
MD5 e4f6c32f510c4c29993254d1b21e479a
BLAKE2b-256 1aeef8fa0534656fbd7db7db9600689b86c429e5447e5a334c43181254f9e168

See more details on using hashes here.

File details

Details for the file pythoml-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: pythoml-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 5.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for pythoml-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 623e4fab80767a56aa7d61b8da7ec0646d1bc8d68f4ebe140f8e21ca2018f0ec
MD5 d4e20cee9bdbfb42582a88ab95bf8325
BLAKE2b-256 4d1406bbac4784adef0968479cd66856bf83bcad4f7407883191cf512ff1aaf6

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