При анализе фрагмента 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
в примере фрагмента не делают.