Skip to main content

tagz is a html tags builder

Project description

Github Actions Coveralls Latest Version python wheel Python Versions license

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:

/Users/mosquito/dev/python/tagz/.venv/bin/python /Users/mosquito/Library/Application Support/JetBrains/PyCharm2023.2/scratches/scratch_16.py 
<!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

  • Any custom tags is supported:
    from tagz import html
    assert str(html.my_custom_tag("hello")) == "<my-custom-tag>hello</my-custom-tag>" 
    
  • Pretty printing html
    from tagz import html
    
    print(
        html.div(
           "Hello", html.strong("world"),
        ).to_string(pretty=True)
    )
    #<div>
    #	Hello
    #	<strong>
    #		world
    #	</strong>
    #</div>
    
  • Style helper object:
    from tagz import Style
    assert str(Style(color="#ffffff")) == "color: #ffffff;"
    
  • StyleSheet helper object
    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


Download files

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

Source Distribution

tagz-0.2.4.tar.gz (5.2 kB view details)

Uploaded Source

Built Distribution

tagz-0.2.4-py3-none-any.whl (5.4 kB view details)

Uploaded Python 3

File details

Details for the file tagz-0.2.4.tar.gz.

File metadata

  • Download URL: tagz-0.2.4.tar.gz
  • Upload date:
  • Size: 5.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.5.1 CPython/3.10.2 Darwin/22.5.0

File hashes

Hashes for tagz-0.2.4.tar.gz
Algorithm Hash digest
SHA256 388de143218a8f183fa3369b59d61e679dff1075f540d51be2ba9355ec738d1c
MD5 e38f95d60e6fb29ee6329ac1efe90906
BLAKE2b-256 ed21d29ce1450aebe86e942d3933533e168a3857f3b81248fb8bcb8cd7809670

See more details on using hashes here.

File details

Details for the file tagz-0.2.4-py3-none-any.whl.

File metadata

  • Download URL: tagz-0.2.4-py3-none-any.whl
  • Upload date:
  • Size: 5.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.5.1 CPython/3.10.2 Darwin/22.5.0

File hashes

Hashes for tagz-0.2.4-py3-none-any.whl
Algorithm Hash digest
SHA256 273bfd5db2684b9ee19dea04deec264e01b883bae1915b941437ed7254e52661
MD5 09b8022e5d724eda643b37a4e7ed4ea3
BLAKE2b-256 312b18257e39d437aa9d678d030b6bdda99a4ae15a02348fdb48720e157bbc33

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