SF.net SVN: docutils:[9949 ] trunk/docutils
milde--- via Docutils-checkins <[email protected]>
| Newsgroups | gmane.text.docutils.cvs |
|---|---|
| Message-ID | <[email protected]> |
Revision: 9949
http://sourceforge.net/p/docutils/code/9949
Author: milde
Date: 2024-10-13 13:44:24 +0000 (Sun, 13 Oct 2024)
Log Message:
-----------
Add internal source and line attributes to more nodes.
The rST parser now also adds internal source and line attributes to
`<compound>`, `<container>`, `<sidebar>`, `<topic>`, `<line_block>`,
and `<line>` nodes.
Based on a pull request by Rob Taylor (on the github mirror) but adding
source and line info instead of the "raw" line number to account for
source parts included with the "include" directive,
also fixing line blocks (both directive and via line-block syntax),
and adding a test case.
See also [feature-requests:#41].
Modified Paths:
--------------
trunk/docutils/docutils/parsers/rst/directives/body.py
trunk/docutils/docutils/parsers/rst/states.py
trunk/docutils/test/test_parsers/test_rst/test_source_line.py
Modified: trunk/docutils/docutils/parsers/rst/directives/body.py
===================================================================
--- trunk/docutils/docutils/parsers/rst/directives/body.py 2024-10-13 12:40:46 UTC (rev 9948)
+++ trunk/docutils/docutils/parsers/rst/directives/body.py 2024-10-13 13:44:24 UTC (rev 9949)
@@ -54,6 +54,8 @@
text = '\n'.join(self.content)
node = self.node_class(text, *(titles + messages))
node['classes'] += self.options.get('class', [])
+ (node.source,
+ node.line) = self.state_machine.get_source_and_line(self.lineno)
self.add_name(node)
if text:
self.state.nested_parse(self.content, self.content_offset, node)
@@ -86,7 +88,12 @@
class LineBlock(Directive):
+ """Legacy directive for line blocks.
+ Use is deprecated in favour of the line block syntax,
+ cf. `parsers.rst.states.Body.line_block()`.
+ """
+
option_spec = {'class': directives.class_option,
'name': directives.unchanged}
has_content = True
@@ -94,12 +101,16 @@
def run(self):
self.assert_has_content()
block = nodes.line_block(classes=self.options.get('class', []))
+ (block.source,
+ block.line) = self.state_machine.get_source_and_line(self.lineno)
self.add_name(block)
node_list = [block]
- for line_text in self.content:
+ for i, line_text in enumerate(self.content):
text_nodes, messages = self.state.inline_text(
line_text.strip(), self.lineno + self.content_offset)
line = nodes.line(line_text, '', *text_nodes)
+ line.source = block.source
+ line.line = block.line + i
if line_text.strip():
line.indent = len(line_text) - len(line_text.lstrip())
block += line
@@ -274,6 +285,8 @@
text = '\n'.join(self.content)
node = nodes.compound(text)
node['classes'] += self.options.get('class', [])
+ (node.source,
+ node.line) = self.state_machine.get_source_and_line(self.lineno)
self.add_name(node)
self.state.nested_parse(self.content, self.content_offset, node)
return [node]
@@ -300,6 +313,8 @@
% (self.name, self.arguments[0]))
node = nodes.container(text)
node['classes'].extend(classes)
+ (node.source,
+ node.line) = self.state_machine.get_source_and_line(self.lineno)
self.add_name(node)
self.state.nested_parse(self.content, self.content_offset, node)
return [node]
Modified: trunk/docutils/docutils/parsers/rst/states.py
===================================================================
--- trunk/docutils/docutils/parsers/rst/states.py 2024-10-13 12:40:46 UTC (rev 9948)
+++ trunk/docutils/docutils/parsers/rst/states.py 2024-10-13 13:44:24 UTC (rev 9949)
@@ -632,7 +632,7 @@
URIs) is found last.
:text: source string
- :lineno: absolute line number (cf. statemachine.get_source_and_line())
+ :lineno: absolute line number, cf. `statemachine.get_source_and_line()`
"""
self.reporter = memo.reporter
self.document = memo.document
@@ -1599,6 +1599,8 @@
block = nodes.line_block()
self.parent += block
lineno = self.state_machine.abs_line_number()
+ (block.source,
+ block.line) = self.state_machine.get_source_and_line(lineno)
line, messages, blank_finish = self.line_block_line(match, lineno)
block += line
self.parent += messages
@@ -1628,6 +1630,8 @@
text = '\n'.join(indented)
text_nodes, messages = self.inline_text(text, lineno)
line = nodes.line(text, '', *text_nodes)
+ (line.source,
+ line.line) = self.state_machine.get_source_and_line(lineno)
if match.string.rstrip() != '|': # not empty
line.indent = len(match.group(1)) - 1
return line, messages, blank_finish
Modified: trunk/docutils/test/test_parsers/test_rst/test_source_line.py
===================================================================
--- trunk/docutils/test/test_parsers/test_rst/test_source_line.py 2024-10-13 12:40:46 UTC (rev 9948)
+++ trunk/docutils/test/test_parsers/test_rst/test_source_line.py 2024-10-13 13:44:24 UTC (rev 9949)
@@ -271,6 +271,67 @@
<paragraph internal:line="10" internal:source="test data">
Final paragraph in line 10
"""],
+["""\
+Paragraph
+
+.. sidebar::
+
+ .. compound::
+ paragraph at line 6
+
+ | line block,
+ first line
+ | line block, second line at line 10
+ | indented
+ line
+
+ .. line-block:: line block at line 14
+ with legacy directive
+
+ continuation at line 17
+
+.. topic:: topic title at line 19
+
+ .. container::
+
+ container content at line 23
+
+Final paragraph at line 25
+""",
+"""\
+<document source="test data">
+ <paragraph internal:line="1" internal:source="test data">
+ Paragraph
+ <sidebar internal:line="3" internal:source="test data">
+ <compound internal:line="5" internal:source="test data">
+ <paragraph internal:line="6" internal:source="test data">
+ paragraph at line 6
+ <line_block internal:line="8" internal:source="test data">
+ <line internal:line="8" internal:source="test data">
+ line block,
+ first line
+ <line internal:line="10" internal:source="test data">
+ line block, second line at line 10
+ <line_block>
+ <line internal:line="11" internal:source="test data">
+ indented
+ line
+ <line_block internal:line="14" internal:source="test data">
+ <line internal:line="14" internal:source="test data">
+ line block at line 14
+ <line internal:line="15" internal:source="test data">
+ with legacy directive
+ <paragraph internal:line="17" internal:source="test data">
+ continuation at line 17
+ <topic internal:line="19" internal:source="test data">
+ <title>
+ topic title at line 19
+ <container internal:line="21" internal:source="test data">
+ <paragraph internal:line="23" internal:source="test data">
+ container content at line 23
+ <paragraph internal:line="25" internal:source="test data">
+ Final paragraph at line 25
+"""],
])
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.