直观、高性能的HTML渲染框架
项目描述
htmldoom
介绍htmldoom
htmldoom是一个Python的HTML渲染框架,它帮助您以有组织的方式定义HTML文档、模板、布局和内容,让您能够使用许多不同的语法,有声明和单独调试不同组件和页面的选项,等等,而无需担心运行时性能。
它是如何工作的?
如果我们逐个了解每个功能的工作原理,理解其工作原理将会变得非常直观。让我们从HTML转义开始。
HTML转义
htmldoom的功能中心是HTML转义逻辑。要转义的文本使用str
表示,而应该不转义的文本使用bytes
表示。`htmldoom.renders()`函数接收文本作为输入,然后根据输入是str
还是bytes
来决定是否转义它,并返回以str
格式渲染的文本。
我们可以使用 htmldoom.txt()
将一些字符串转换为 HTML 转义文本,使用 htmldoom.raw()
将一些字符串转换为 HTML 未转义文本。需要注意的是,这两个函数都将返回以 bytes
格式的文本,可以传递给 htmldoom.render()
来将其渲染回 str
。
HTML 元素
可以使用 htmldoom.composite_tag()
和 htmldoom.leaf_tag()
函数定义 HTML 元素或标签。任何可以具有子元素的标签(例如 <p></p>
)都使用 htmldoom.composite_tag()
定义。
例如
p = composite_tag("p")
不能有子元素的标签使用 htmldoom.leaf_tag()
定义。
例如
input_ = leaf_tag("input")
因此,当我们调用 p(class_="red")("foo", "bar")
或 input_(type_="button")
时,我们分别得到编码的 bytes
<p class="red">foobar</p>
或 <input type="button" />
。htmldoom.render()
函数将它们渲染回 str
。
HTML 组件/布局
HTML 组件,即几个元素(标签和文本)的组合,可以使用以下示例中的 @htmldoom.renders()
装饰器定义。
from htmldoom import renders, elements as e
@renders(
e.p(class_="red")("{key1}", "{key2}"),
e._input(type_="button")
)
def my_component(value1, value2):
return {"key1": value1, "key2": value2}
现在我们可以通过传递所需的参数来渲染组件,例如。
my_document(value1="&", value2=b"&")
这将返回编码的 bytes
文本。由于 value1
是 str
,将被转义为 &amp;
。由于 value2
是 bytes
,因此它将保持不变,并在浏览器中以 &
的形式渲染。
调用此方法将返回编码的文本
<p class="red">foobar</p><input type="button" />
可以使用 htmldoom.render()
将其渲染为字符串。
此机制在模块加载时渲染模板文本。因此,在运行时不应出现性能下降。
注意:需要注意的是,当
{
和}
不是用作变量占位符时,应该使用{{
和}}
进行转义。
还可以使用以下 YAML 语法定义组件。
some:
demo:
p:
- class: red
- - "{key1}"
- "{key2}"
input:
- type: button
然后定义组件渲染器如下。
from htmldoom import renders
from htmldoom.yaml_loader import loadyaml
@renders(loadyaml("path/to/component.yaml", ("some", "demo")))
def my_component(value1, value2):
return {"key1": value1, "key2": value2}
我们还可以使用 htmldoom.loadtxt()
和 htmldoom.loadraw()
函数分别使用转义和原始加载器。我们只需传递如 YAML 示例中所示的文件路径。
我们还可以使用相同的语法定义可重用的布局。
从模板中分离值
htmldoom 以一种友好的方式为我们提供了从布局或组件模板中分离值的方法。函数 htmldoom.value_loader.loadvalues()
扫描给定的目录,并返回一个嵌套的 namedtuple,其中文件或目录名称作为元素名称,加载的内容作为值。我们可以将其传递给组件,如下所示。
from htmldoom import renders, elements as e
from htmldoom.value_loader import loadvalues
values = loadvalues("path/to/values")
@renders(
e.p()("{v.title}"),
e.p()("{v.content.line1}")
e.p()("{v.content.line2}")
e.p()("{v.content.line3}")
)
def my_component():
return {"v": values}
因此,我们需要以下目录结构。
values
├── title.txt
└── content
├── line1.txt
├── line2.html
└── line3.yml
正如你可能猜到的,这可以根据文件类型加载值。您可以通过扩展 htmldoom.value_loader.EXTENSION_RENDERERS
映射并将它传递给 htmldoom.value_loader.loadvalues()
函数来使用自己的渲染器为文件类型,例如 md
或 rst
,如下所示。
from htmldoom import raw
from htmldoom.value_loader import loadvalues, EXTENSION_RENDERERS
def markdown_to_html(path):
"""Some function that reads the file, converts the content to HTML,
and returns the converted data as string.
"""
# The logic goes here...
MY_EXTENSION_RENDERERS = dict(
md=lambda path: raw(markdown_to_html(path)),
**EXTENSION_RENDERERS
)
values = loadvalues("path/to/values", extension_renderers=MY_EXTENSION_RENDERERS)
实际上,本说明也是使用相同的方法生成的。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定该选择哪一个,请了解更多关于 安装包 的信息。