Как получить restructuredText, чтобы добавить класс в каждый тег HTML <p>? - PullRequest
6 голосов
/ 03 декабря 2009

Я использую пакет разметки 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.

Спасибо за помощь,

Джо

Ответы [ 2 ]

5 голосов
/ 10 сентября 2010

Подкласс встроенного html4css1 писателя, используя this в качестве ссылки.

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 голосов
/ 03 декабря 2009

Вы не говорите, почему хотите добавить класс в каждый абзац, но может быть проще выбрать другой подход. Например, если вы пытаетесь стилизовать абзацы, вы можете использовать другую технику 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();
...