documenttils: получить номер строки для вложенных узлов - PullRequest
1 голос
/ 13 октября 2019

При анализе фрагмента ReStructuredText с docutils и обходе дерева узлов документа большинство узлов не предоставляют свой номер строки в исходном тексте. Пример:

import io
from pathlib import Path
import docutils.frontend
import docutils.nodes
import docutils.parsers.rst


text = '''
Fizz
====

Lorem ipsum

Buzz
****

Lorem ``ipsum``

.. code-block:: python

   x = 0

.. note::

   Dolor sit amet

   .. code-block:: python

      y = 1
'''


class MyVisitor(docutils.nodes.GenericNodeVisitor):
    def default_visit(self, node):
        print('node: {:>15}, line: {}'.format(type(node).__name__, node.line))


if __name__ == '__main__':
    default_settings = docutils.frontend.OptionParser(components=(docutils.parsers.rst.Parser,)).get_default_values()
    document = docutils.utils.new_document('mydocs', default_settings)
    parser = docutils.parsers.rst.Parser()
    parser.parse(io.StringIO(text).read(), document)
    visitor = MyVisitor(document)
    document.walk(visitor)

Запуск этого кода приводит к:

node:        document, line: None
node:         section, line: 3
node:           title, line: 3
node:            Text, line: None
node:       paragraph, line: 5
node:            Text, line: None
node:         section, line: 8
node:           title, line: 8
node:            Text, line: None
node:       paragraph, line: 10
node:            Text, line: None
node:         literal, line: None
node:            Text, line: None
node:   literal_block, line: 15
node:          inline, line: None
node:            Text, line: None
node:            Text, line: None
node:          inline, line: None
node:            Text, line: None
node:            Text, line: None
node:          inline, line: None
node:            Text, line: None
node:            note, line: None
node:       paragraph, line: 18
node:            Text, line: None
node:   literal_block, line: None
node:          inline, line: None
node:            Text, line: None
node:            Text, line: None
node:          inline, line: None
node:            Text, line: None
node:            Text, line: None
node:          inline, line: None
node:            Text, line: None

Похоже, что ни один из вложенных узлов не получает записанный номер строки. Можно ли получить доступ к этой информации в пользовательском узле посетителя impl? Я не ожидал, что все узлы (например, отдельные узлы слова) будут предоставлять номера строк, но ни note, ни вложенный code-block в примере фрагмента не делают.

...