tagz is a html tags builder
Project description
tagz
tagz – is an extremely simple library for building html documents without using templates,
just with python code.
from tagz import Page, StyleSheet, Style, html
page = Page(
lang="en",
body_element=html.body(
html.h1("Hello"),
html.div(
html.strong("world"),
),
html.a(
"example link",
html.i("with italic text"),
href="https://example.com/"
),
),
head_elements=(
html.meta(charset="utf-8"),
html.meta(name="viewport", content="width=device-width, initial-scale=1"),
html.title("tagz example page"),
html.link(href="/static/css/bootstrap.min.css", rel="stylesheet"),
html.script(src="/static/js/bootstrap.bundle.min.js"),
html.style(
StyleSheet({
"body": Style(padding="0", margin="0"),
(".container", ".container-fluid"): Style(transition="opacity 600ms ease-in"),
})
)
),
)
# `pretty=False` should be faster but performs not a human-readable result
print(page.to_html5(pretty=True))
writes something like this:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>
tagz example page
</title>
<link href="/static/css/bootstrap.min.css" rel="stylesheet"/>
<script src="/static/js/bootstrap.bundle.min.js">
</script>
<style>
body {padding: 0; margin: 0;}
.container, .container-fluid {transition: opacity 600ms ease-in;}
</style>
</head>
<body>
<h1>
Hello
</h1>
<div>
<strong>
world
</strong>
</div>
<a href="https://example.com/">
example link
<i>
with italic text
</i>
</a>
</body>
</html>
Features
tagz provides the following features:
Callable children and recursive evaluation
You can pass a function (callable) as a child to any tag. The function will be called once during rendering, and its return value (either a string or another tag) will be rendered in place. This allows for lazy or dynamic content generation, and supports recursive callables for deeply nested dynamic structures.
from tagz import html
def child():
return "hello"
tag = html.div(child)
assert str(tag) == "<div>hello</div>"
Or return another tag:
# Callable child returning a tag
def child_tag():
return html.span("world")
tag = html.div(child_tag)
assert str(tag) == "<div><span>world</span></div>"
Or use recursive callables:
from tagz import html
# Recursive callable children
def leaf():
return "leaf"
def mid():
return html.b(leaf)
def top():
return html.i(mid)
tag = html.div(top)
assert str(tag) == "<div><i><b>leaf</b></i></div>"
You can also use append with callables:
from tagz import html
tag = html.div()
tag.append(lambda: "foo")
assert str(tag) == "<div>foo</div>"
Custom tags is supported
Add custom tags by using underscore _ in the name:
from tagz import html
assert str(html.my_custom_tag("hello")) == "<my-custom-tag>hello</my-custom-tag>"
Pretty printing html
You can pretty print the html output with to_string(pretty=True) or to_html5(pretty=True) methods:
from tagz import html
print(
html.div(
"Hello", html.strong("world"),
).to_string(pretty=True)
)
#<div>
# Hello
# <strong>
# world
# </strong>
#</div>
Style and StyleSheet helper objects
Style helper object encapsulating css styles:
from tagz import Style
assert str(Style(color="#ffffff")) == "color: #ffffff;"
StyleSheet helper object encapsulating css stylesheet:
from tagz import Style, StyleSheet
# body {padding: 0;margin: 0}
# a, div {transition: opacity 600ms ease-in}
print(
str(
StyleSheet({
"body": Style(padding="0", margin="0"),
("div", "a"): Style(transition="opacity 600ms ease-in"),
})
)
)
More examples
Building page from parts
You can reuse the code, and assemble the page piece by piece, to do this you can modify elements already added to the tags:
from tagz import html, Page
# Make an content element
content = html.div(id='content')
page = Page(
lang="en",
body_element=html.body(
html.h1("Example page"),
html.hr(),
# Adding it to the page
content,
),
head_elements=(
html.meta(charset="utf-8"),
html.title("tagz partial page"),
),
)
content.append("Example page content")
print(page.to_html5(pretty=True))
This prints something like this:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>
tagz example page
</title>
</head>
<body>
<h1>
Example page
</h1>
<hr/>
<div id="content">
Example page content
</div>
</body>
</html>
Convert CSV to html table
from io import StringIO
from urllib.request import urlopen
from csv import reader
from tagz import html, Page, Style
url = (
'https://media.githubusercontent.com/media/datablist/'
'sample-csv-files/main/files/organizations/'
'organizations-10000.csv'
)
csv = reader(StringIO(urlopen(url).read().decode()))
table = html.table(border='1', style=Style(border_collapse="collapse"))
content = list(csv)
# Make table header
table.append(html.tr(*map(html.th, content[0])))
# Add table rows
for csv_row in content[1:]:
table.append(html.tr(*map(html.td, csv_row)))
page = Page(
lang="en",
body_element=html.body(
html.h1("Converted CSV"),
table,
"Content of this page has been automatically converted from",
html.a(url, href=url),
),
head_elements=(
html.meta(charset="utf-8"),
html.title("tagz csv example page"),
),
)
with open("/tmp/csv.html", "w") as fp:
fp.write(page.to_html5())
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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tagz-0.3.2.tar.gz.
File metadata
- Download URL: tagz-0.3.2.tar.gz
- Upload date:
- Size: 6.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.20 {"installer":{"name":"uv","version":"0.9.20","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4c7109520950f570da3ac924959792c9dd7079e25bfaaa559271ea3b9828411c
|
|
| MD5 |
a6b1555688c6985b9a14ab1f039aea3c
|
|
| BLAKE2b-256 |
3e7f002e4c6929fb976c77ca0db10cd163f9bba682ea29515e3cbf646ec910f0
|
File details
Details for the file tagz-0.3.2-py3-none-any.whl.
File metadata
- Download URL: tagz-0.3.2-py3-none-any.whl
- Upload date:
- Size: 6.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.20 {"installer":{"name":"uv","version":"0.9.20","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
77b20b998a0f2b3e970048930448e3c93c01244d46b20652007e4d28864c3bdf
|
|
| MD5 |
1f7175bc0580826d6336702cd706045d
|
|
| BLAKE2b-256 |
c12bf85ea7f63e19172e4e07477f1fdab8e3dfeb21c9f0322f1f77e0432f8d6d
|