跳转到主要内容

直观、高性能的HTML渲染框架

项目描述

htmldoom

Documentation PyPI version PyPI pyversions Build Status codecov Code style: black

介绍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="&amp;", value2=b"&amp;")

这将返回编码的 bytes 文本。由于 value1str,将被转义为 &amp;amp;。由于 value2bytes,因此它将保持不变,并在浏览器中以 & 的形式渲染。

调用此方法将返回编码的文本

<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() 函数来使用自己的渲染器为文件类型,例如 mdrst,如下所示。

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)

实际上,本说明也是使用相同的方法生成的。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定该选择哪一个,请了解更多关于 安装包 的信息。

源分布

htmldoom-1.0.1.tar.gz (14.0 kB 查看哈希值)

上传时间

构建分布

htmldoom-1.0.1-py3-none-any.whl (14.6 kB 查看哈希值)

上传时间 Python 3