разобрать reStructuredText README.rst, чтобы получить раздел описания

Я пытаюсь повторно использовать информацию из моего README.rst в описании пакета setup.py.

В моем setup.py у меня есть функция readme:

def readme():
    try:
        with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as f:
            return f.read()
    except (IOError, OSError):
        return ''

который я вызываю

setup(
    ...
    long_description=readme(),
    ...
)

Поскольку мой reStructuredText представляет собой довольно большой README.rst может быть лучше просто прочитать только определенный раздел реструктурированного текста.

Есть ли умный способ переписать readme() так, чтобы он разбирал README.rst и игнорировал остальное форматирование reStructuredText, т.е. выдавал только обычный текст небольшого подраздела?


person Yauhen Yakimovich    schedule 26.07.2013    source источник
comment
Изучаю синтаксический анализ reStructuredText прямо сейчас.. если я разберусь с этим - опубликую ответы.   -  person Yauhen Yakimovich    schedule 26.07.2013
comment
Попробуйте DocUtils. Это парсер rST, используемый в Sphinx.   -  person kirbyfan64sos    schedule 26.07.2013


Ответы (2)


Я думаю, вы могли бы использовать эту часть DocUtils:

"Разбор документа

Анализатор анализирует входной документ и создает представление дерева узлов. В данном случае мы используем анализатор reStructuredText (docutils/parsers/rst/init.py). Чтобы увидеть, как выглядит это дерево узлов, мы вызываем quicktest.py (который можно найти в каталоге tools/ дистрибутива Docutils) с нашим файлом примера (test.txt) в качестве первого параметра (пользователям Windows может потребоваться ввести python quicktest .py тест.txt):

$quicktest.py test.txt Мой любимый язык — Python. Давайте теперь рассмотрим дерево узлов:

Узел верхнего уровня — это документ. У него есть исходный атрибут, значением которого является text.txt. Есть два потомка: узел абзаца и целевой узел. У абзаца, в свою очередь, есть дочерние элементы: текстовый узел («Мой»), узел выделения, текстовый узел («язык»), узел ссылки и снова узел текста («.»).

Все эти типы узлов (документ, абзац, выделение и т. д.) определены в docutils/nodes.py. Типы узлов внутренне организованы как иерархия классов (например, и выделение, и ссылка имеют общий суперкласс Inline). Чтобы получить обзор иерархии классов узлов, используйте epydoc (введите epydoc nodes.py) и просмотрите дерево иерархии классов." --http://docutils.sourceforge.net/docs/dev/hacking.html

чтобы найти только нужные узлы всего документа :), а затем написать только соответствующие узлы

person Eiyrioü von Kauyf    schedule 26.07.2013

Я закончил с этим, который не идеален, но выполняет свою работу:

def readme():
    try:
        import docutils
    except ImportError:
        try:
            with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as f:
                return f.read()
        except (IOError, OSError):
            return ''
    with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as f:
        document = docutils.core.publish_doctree(f.read())
        nodes = list(document)
        description = ''
        for node in nodes:
            if str(node).startswith('<topic classes="contents"'):
                break
            if type(node) is docutils.nodes.comment\
            or type(node) is docutils.nodes.title:
                continue
            description += node.astext() + '\n'
        return  return description.encode('ascii', 'ignore').strip()

Я полагаю, что можно сделать гораздо лучший и сложный синтаксический анализ, пройдясь по дереву документов rST.

person Yauhen Yakimovich    schedule 26.07.2013