我正在编写一个基于重组文本的简单网页生成器,我想将标签放入文档中,就像这样。
=====
Title
=====
:author: Me
:tags: foo, bar
Here we go ...
我现在想要的:
tags
条目,读取它,处理它(就像在命令行上打印标签),删除它并渲染剩余的树。所以我想编写兼容的重组文本,以防它使用与我的程序不同的东西进行编译。
有人可以给我提示吗?我在这里找到了这个 http://svn.python.org/projects/external/docutils-0.6/docutils/examples.py 在
internals
方法中显示了如何获取文档(以及 dom 树),但这是最好的方法还是基于正则表达式的方法(查找行,删除它们)会容易得多?使用树还涉及转换树→文档等等。
有一些工具可以为您做到这一点。请参阅 http://docutils.sourceforge.net/docs/user/links.html
我想我对这两个问题都有一个很好的解决方案。首先,
core.py
发行版中的docutils
文件显示了如何获取文档树以及如何编写它(例如使用html编写器),请参阅publish_from_doctree
和publish_doctree
。然后,还有 docutils.nodes.SparseNodeVisitor
,可以子类化并覆盖像 visit_field
这样的方法,以各种方式操作文档树。
在不太古老的 Docutils 中,自定义 docinfo 字段将键作为类值获取:
<docinfo>
<author>
Me
<field classes="tags">
<field_name>
tags
<field_body>
<paragraph>
foo, bar
如果类值是唯一的,您可以使用 strip-elements-with-classes 配置设置将其删除。 (警告:所有包含相同类值的元素也将被删除,剩余的文档树可能无效......)
或者,您可以使用 CSS 规则(或 LaTeX 前导码)来防止显示“标签”字段。
提取(以及更可靠的抑制)可以通过 Docutils 转换 来实现。 https://docutils.sourceforge.io/docs/peps/pep-0258.html#transformer https://docutils.sourceforge.io/docs/api/transforms.html
不幸的是,Docutils 文档没有创建和使用自定义转换的指南。但是,
docutils/transforms/*.py
源提供了从文档树中提取信息以及移动/删除/修改节点的示例。