6

我正在使用 Django 的标记包将 restructuredText 转换为 html。有没有办法自定义 HTML 编写器为每个<p>标签添加一个类属性?

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

例如,我想要这个重组后的文本:

hello
=====

A paragraph of text.

转换成这个html。

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

我想插入类的原因是因为我使用的是连字符库,它通过向所有带有“连字符”类的标签添加连字符来工作。我可以将连字符类添加到容器标签中,但是所有的孩子都会继承连字符类。我可以使用 javascript 来动态添加类,但我认为可能有一种简单的方法来使用 restructuredText。

谢谢您的帮助,

4

2 回答 2

5

子类化内置编写器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())
于 2010-09-10T03:38:09.867 回答
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();
于 2009-12-03T03:36:35.950 回答