5

再構成されたテキスト文字列のコード ディレクティブからソース コードを逐語的に抽出したいと思います。

以下はこれを行うための私の最初の試みですが、より良い (つまり、より堅牢な、より一般的な、またはより直接的な) 方法があるかどうかを知りたいです。

Pythonで次の最初のテキストを文字列として持っているとしましょう:

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');
    }

'''

2 つのコード ブロックを取得するには、次のようにします。

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は、2 つのコード ブロックからの逐語的なソース コードのみを含むリストです必要に応じて、 childのattributes属性を使用してコードの種類を調べることもできます。

それは仕事をしますが、より良い方法はありますか?

4

2 に答える 2

5

ソリューションは、ドキュメントのトップ レベルのコード ブロックのみを検出し、クラス「コード」が他の要素で使用されている場合は、誤検出を返す可能性があります (可能性は低いですが、可能性はあります)。.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]
于 2015-05-01T22:15:24.573 に答える