An intuitive, high performance HTML rendering framework
Project description
htmldoom
An intuitive, high performance HTML rendering framework
Usage
A basic tag
>>> from htmldoom import render, elements as e >>> >>> print(render( ... e.textarea("required", class_="input")("text") ... )) <textarea required class="input">text</textarea>
A custom tag
>>> from htmldoom import render, composite_tag >>> >>> clipboard_copy = composite_tag("clipboard-copy") >>> print(render( ... clipboard_copy(value="foo")("Copy Me") ... )) <clipboard-copy value="foo">Copy Me</clipboard-copy>
A fast dynamic elements rendering mechanism
Choose whichever syntax suits you:
Syntax 1
>>> from htmldoom import renders, elements as e >>> >>> @renders( ... e.p()("{x}"), ... e.p()("another {x}"), ... ) ... def render_paras(data: dict) -> dict: ... return {"x": data["x"]} >>> >>> print(render_paras({"x": "awesome paragraph"})) <p>awesome paragraph</p><p>another awesome paragraph</p>
Syntax 2
>>> from htmldoom import renders, elements as e >>> >>> render_paras = renders( ... e.p()("{x}"), ... e.p()("another {x}"), ... )(lambda data: {"x": data["x"]}) >>> >>> print(render_paras({"x": "awesome paragraph"})) <p>awesome paragraph</p><p>another awesome paragraph</p>
NOTE: This mechanism pre-renders the template when the file loads and reuse it.
renders( ...pre-rendered template... )( ...dynamic rendering logic... )
The more elements you pre-render as template, the faster it gets.
If you properly use this mechanism and refactor your dynamic pages into smaller components, it might surpass the performance of traditional template rendering engines.
WARNING: It performs a "{rendered_elements}".format(**returned_data)
. So each `{` or `}` in the pre-rendered template needs to be escaped with `{{` or `}}`.
A functional style foreach loop with a switch case (probably useless)
>>> from htmldoom import elements as e >>> from htmldoom import functions as fn >>> >>> tuple(fn.foreach(["good", "bad", "evil"])( ... lambda x: fn.switch({ ... x == "good": lambda: e.span(style="color: green")(f"this is {x}"), ... x == "bad": lambda: e.span(style="color: yellow")(f"this is {x}"), ... x == "evil": lambda: e.span(style="color: red")(f"this is {x}"), ... fn.Case.DEFAULT: lambda: fn.Error.throw(ValueError(x)), ... }) ... )) (b'<span style="color: green">this is good</span>', b'<span style="color: yellow">this is bad</span>', b'<span style="color: red">this is evil</span>')
Q/A
What is the goal here?
The primary goal is to make writing dynamic HTML pages cleaner, easier, safer and intuitive in Python.
What about performance?
Although performance is not the primary goal here, it's been given a very high priority. htmldoom uses pure functions with hashable input parameters as elements. Hence, it makes effective use of caching internally. It also offers a friendly mechanism to pre-render the static parts of the page using the @renders
decorator and reuse it.
Also since it helps you (probably forces you) to refactor the webpage into multiple render functions, you are free to use whatever optimisation you prefer. Try putting an @lru_cache
in a render function?
Is there any benchmark?
Plugins and ecosystem
- moodlmth: Convert raw HTML pages into python source code
- Flask-Htmldoom: htmldoom integration for Flask
- pyramid_htmldoom: htmldoom rendering library plugin for Pyramid
Contributing
Check out the contributing guidelines.
NOTE: This file was generated using this script.
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
File details
Details for the file htmldoom-0.6.8.tar.gz
.
File metadata
- Download URL: htmldoom-0.6.8.tar.gz
- Upload date:
- Size: 10.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.6.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 77f2a87925f15a2b63f58c2ca977760ab6c3b472ac56df5b740976fa5ae8cc40 |
|
MD5 | 57bacbe697c5c5b2189251387e59cde0 |
|
BLAKE2b-256 | 71cdb54052cb297cac8d83db2ac57dc4064a74d0598200b6a7294a236617b516 |
File details
Details for the file htmldoom-0.6.8-py3-none-any.whl
.
File metadata
- Download URL: htmldoom-0.6.8-py3-none-any.whl
- Upload date:
- Size: 11.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.6.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | ebbb91f818a7aa923de3cf1b1fdc6f3382207831d5b4fe345e06717621f43e29 |
|
MD5 | e82ae0740359e266d95faa0d4c413640 |
|
BLAKE2b-256 | 5f067992ac93b1571afae92cb24e3225c3d611276e442fe7e751bf5e5606b775 |