首页 > 解决方案 > 如何使用 Python docutils 创建简单的 html 标签

问题描述

我正在为 Pelican 开发一个库,我目前正在为此使用 reStructuredText 和 docutils。

我想要做的是创建一个应该输出 html 的自定义指令。

我要输出的html是:

<div class="row">
  <div class="col-md-6">
    <div class="card">
      <div class="card-header">
        <h4 class="card-title">Regular header</h4>
        <p class="category">Category subtitle</p>
      </div>
      <div class="card-body">
        The place is close to Barceloneta Beach and bus stop just 2 min by walk and near to "Naviglio" where you can enjoy the main night life in Barcelona...
      </div>
    </div>
  </div>
</div>

到目前为止,我创建了这个 Python 代码

from docutils import nodes
from docutils.parsers.rst import Directive
from pelican.rstdirectives import directives

class Row(Directive):
    required_arguments = 0
    optional_arguments = 0
    final_argument_whitespace = True
    option_spec = {}
    has_content = True

    def run(self):
        # Raise an error if the directive does not have contents.
        self.assert_has_content()

        node = nodes.Element()
        node.document = self.state.document
        self.state.nested_parse(self.content, self.content_offset, node)

        # entries = []
        resultnode = nodes.container()
        for i, child in enumerate(node):
            para = nodes.paragraph()
            para += [child]
            resultnode.append(para)
            # entry = nodes.container()
            # entry.append(para)
            # entries.append(entry)

        resultnode.update_basic_atts({
            "classes": ["row"]
        })
        # resultnode.append(nodes.container('', *entries))

        return [resultnode]

class Card(Directive):
    required_arguments = 0
    optional_arguments = 0
    final_argument_whitespace = True
    option_spec = {
        "header-title": str,
        "header-category": str
    }
    has_content = True

    def run(self):
        # Raise an error if the directive does not have contents.
        self.assert_has_content()
        text = '\n'.join(self.content)

        col = nodes.container()
        col["classes"] = ["col-md-6"]

        card = nodes.container()
        card["classes"] = ["card"]
        col.append(card)

        card_header = nodes.container()
        card_header["classes"] = ["card-header"]
        card.append(card_header)

        header_title = nodes.paragraph(text=self.options.get("header-title"))
        header_title["classes"] = ["card-title"]
        card_header.append(header_title)

        header_category = nodes.paragraph(text="Category subtitle")
        header_category["classes"] = ["category"]
        card_header.append(header_category)

        card_body = nodes.paragraph(text=text)
        card_body["classes"] = ["card-body"]
        card.append(card_body)

        return [col]

def register():
    directives.register_directive("card", Card)
    directives.register_directive("row", Row)

它创建了这个 html:

<div class="row docutils container">
  <div class="col-md-6 docutils container">
    <div class="card docutils container">
      <div class="card-header docutils container">
        <p class="card-title">Regular header</p>
        <p class="category">Category subtitle</p>
      </div>
      <p class="card-body">
        Hello, world
      </p>
    </div>
  </div>
</div>

所以有几件事我想知道:

  1. 如何docutils containerclass属性中删除?container与主题containercss 类冲突。
  2. 如何创建简单的 html 元素,例如h1

标签: pythonpelicandocutils

解决方案


container您应该创建自定义节点类型,而不是重用。然后,创建 HTML 编写器的子类以输出您需要的标签。


推荐阅读