如何让restructuredText为每个HTML <p>标签添加类?

7 投票
2 回答
1417 浏览
提问于 2025-04-15 16:38

我正在使用Django的markup包,把restructuredText转换成html。请问有没有办法自定义HTML写入方式,让每个<p>标签都加上一个类属性呢?

我可以对每个段落使用类指令,但是我想让这个过程自动化。

比如说,我希望这个restructured文本:

hello
=====

A paragraph of text.

能转换成这个html。

<h1>hello</h1>
<p class="specialClass">A paragraph of text.</p>

我想插入类的原因是因为我在使用hyphenator库,这个库是通过给所有带有“hyphenate”类的标签添加连字符来工作的。我可以把hyphenate类加到容器标签上,但那样所有子标签都会继承这个类。我也可以用javascript动态添加这个类,但我觉得用restructuredText可能有更简单的方法。

谢谢你的帮助,

Joe

2 个回答

6

创建一个新的类,继承自内置的 html4css1 写入器,可以参考这个链接

from docutils.writers import html4css1

class MyHTMLWriter(html4css1.Writer):
  """
  This docutils writer will use the MyHTMLTranslator class below.
  """
  def __init__(self):
      html4css1.Writer.__init__(self)
      self.translator_class = MyHTMLTranslator

class MyHTMLTranslator(html4css1.HTMLTranslator):
  def visit_paragraph(self, node):
      self.section_level += 1
      self.body.append(self.starttag(node, 'p', CLASS='specialClass'))
  def depart_paragraph(self, node):
      self.section_level -= 1
      self.body.append('</p>\n')

然后像这样使用它:

from docutils.core import publish_string
print publish_string("*This* is the input text", writer=MyHTMLWriter())
4

你没有说明为什么想给每个段落添加一个类,但其实可以换个方法来做。比如,如果你是想给段落设置样式,可以用另一种CSS技巧来选择输出中的所有段落:

CSS:

div.resttext p {
    /* all the styling you want... */
}

HTML:

<div class='resttext'>
<p>Blah</p>
<p>Bloo</p>
</div>

更新:因为你想使用hyphenator.js,我建议你使用它的 selectorfunction 设置来以不同的方式选择元素:

Hyphenator.config({
    selectorfunction: function () {
        /* Use jQuery to find all the REST p tags. */
        return $('div.resttext p');
        }
    });
Hyphenator.run();

撰写回答