解析reStructuredText README.rst获取描述部分

时间:2013-07-26 14:02:38

标签: python packaging setuptools restructuredtext

我试图在setup.py

的包描述中重用README.rst中的信息

在我的setup.py中,我有一个自述文件功能:

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格式,即只提供一个小子节的纯文本?

2 个答案:

答案 0 :(得分:1)

我认为你可以使用DocUtils的这一部分:

  

“解析文件

     

Parser分析输入文档并创建节点树   表示。在这种情况下,我们使用reStructuredText解析器   (docutils的/解析器/ RST /的初始化的.py)。查看节点树的外观   比如,我们调用quicktest.py(可以在tools /目录中找到)   我们的示例文件(test.txt)为:Docutils发行版)   第一个参数(Windows用户可能需要输入python quicktest.py   的test.txt):

     

$ quicktest.py test.txt                  我的                          喜爱            语言是                          蟒蛇           。        现在让我们检查节点树:

     

顶级节点是文档。它有一个source属性的值   是text.txt。有两个子节点:段落节点和目标   节点。该段又有子节点:文本节点(“我的”),一个   强调节点,文本节点(“语言是”),参考节点和   再一个Text节点(“。”)。

     

这些节点类型(文档,段落,重点等)都已定义   在docutils / nodes.py中。节点类型在内部排列为   类层次结构(例如,强调和引用都具有   常见的超类内联)。获取节点类的概述   层次结构,使用epydoc(类型epydoc nodes.py)并查看该类   层次结构树。“      - http://docutils.sourceforge.net/docs/dev/hacking.html

只查找总文档所需的节点:)然后只写相关节点

答案 1 :(得分:1)

我最终得到了这个,这不是完美的但是做了这个工作:

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文档树可以做一个更好更复杂的解析。