generate html with python 3
Project description
domonic
Generate html with python 3!
from domonic import *
output = render(
html(
head(
style(),
script(),
),
body(
div("hello world"),
a("this is a link", _href="http://www.somesite.com", _style="font-size:10px;"),
ol(''.join([f'{li()}' for thing in range(5)])),
h1("test", _class="test"),
)
)
)
<html><head><style></style><script></script></head><body><div>hello world</div><a href="http://www.somesite.com" style="font-size:10px;">this is a link</a><ol><li></li><li></li><li></li><li></li><li></li></ol><h1 class="test">test</h1></body></html>
install
python3 -m pip install domonic
usage
print(html(body(h1('Hello, World!'))))
<html><body><h1>Hello, World!</h1></body></html>
attributes
prepend attributes with an underscore ( avoids clashing with python keywords )
test = label(_class='classname', _for="someinput")
print(test)
<label class="classname" for="someinput"></label>
lists
just do list comprehension and join it to strip the square brackets
ul(''.join([f'{li()}' for thing in range(5)])),
<ul><li></li><li></li><li></li><li></li></ul>
rendering
render takes 2 parameters, some domonic and an optional output file.
page = div(span('Hello World'))
render(page, 'index.html')
data-tags
python doesn't allow hyphens in parameter names. so use variable keyword argument syntax for custom data-tags
div("test", **{"_data-test":"test"} )
fugly
use your own methods to prettify. the example uses a library that leverages beautifulsoup. i.e.
output = render(html(body(h1('Hello, World!'))))
from html5print import HTMLBeautifier
print(HTMLBeautifier.beautify(output, 4))
Common Errors
If you incorrectly type code it will obviously not work. So there are a bunch of common ones I've noticed when creating large domonic templates. :
IndexError: list index out of range - You most likely didn't put a underscore on an attribute.
SyntaxError: invalid syntax - You are Missing a comma between attributes
SyntaxError: positional argument follows keyword argument - You have to pass attributes LAST. and strings and objects first. see docs
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'dict' - You are Missing a comma between attributes. before the **{}
TODO - catch these and raise a friendly custom ParseError that tells you what to fix
run tests
python3 test_domonic.py
more
several undocumented features. take a look at the code.
docs
while you can create a div with content like :
div("some content")
python doesn't allow named params before unamed ones. So you can't do this:
div(_class="container", p("Some content") )
or it will complain the params are in the wrong order. You have to instead put content before attributes:
div( p("Some content"), _class="container")
which is annoying when a div gets long. You can get around this several ways.
With 'innerHTML' which is available on every Node:
div( _class="container" ).innerHTML("Some content")
With 'html' which is available on every Node:
div( _class="container" ).html("Some content")
disclaimer
exerimental/learning project
There's a complete more supported library I found already doing similar called 'dominate' . So if you want to do something like this, use that.
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
File details
Details for the file domonic-0.0.4.tar.gz
.
File metadata
- Download URL: domonic-0.0.4.tar.gz
- Upload date:
- Size: 28.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/47.1.1 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.7.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1648b40517152548c7aaa0e75a0a649a5a931067bb1558d064cccfcb8743dfb3 |
|
MD5 | b2a98565bc29fef9083e47932c1ebf9e |
|
BLAKE2b-256 | d4227093bdc724a0c3774b77fb2c1f54d784338da46747c3b2bab50ea81d7791 |