使用文档utils从RestructuredText中提取代码指令



我想从重组文本字符串中的代码指令中逐字提取源代码。

以下是我第一次尝试这样做,但我想知道是否有更好(即更强大、更通用或更直接)的方法。

假设我在 python 中有以下 rst 文本作为字符串:

s = '''
My title
========
Use this to square a number.
.. code:: python
   def square(x):
       return x**2
and here is some javascript too.
.. code:: javascript
    foo = function() {
        console.log('foo');
    }
'''

要获得两个代码块,我可以做

from docutils.core import publish_doctree
doctree = publish_doctree(s)
source_code = [child.astext() for child in doctree.children 
if 'code' in child.attributes['classes']]

现在source_code是一个列表,只包含来自两个代码块的逐字源代码。如有必要,我也可以使用 child 的属性属性来找出代码类型。

它可以完成这项工作,但是有更好的方法吗?

您的解决方案将仅在文档的顶层查找代码块,如果类"code"用于其他元素(不太可能,但可能),则可能会返回误报。我还会检查元素/节点的类型,在其 .tagname 属性中指定。

节点

上有一个"遍历"方法(文档/文档树只是一个特殊的节点),它对文档树进行完全遍历。它将查看文档中的所有元素,并仅返回与用户指定条件匹配的元素(返回布尔值的函数)。方法如下:

def is_code_block(node):
    return (node.tagname == 'literal_block'
            and 'code' in node.attributes['classes'])
code_blocks = doctree.traverse(condition=is_code_block)
source_code = [block.astext() for block in code_blocks]

这可以进一步简化,如下所示:

source_code = [block.astext() for block in doctree.traverse(nodes.literal_block)
               if 'code' in block.attributes['classes']]

最新更新