|
From: <mi...@us...> - 2023-12-14 22:38:51
|
Revision: 9500
http://sourceforge.net/p/docutils/code/9500
Author: milde
Date: 2023-12-14 22:38:49 +0000 (Thu, 14 Dec 2023)
Log Message:
-----------
Add/fix source and line attributes for doctree elements.
Add "source" and "line" attributes to `<image>`, `<figure>`,
`<list_item>`, <math_block>, and `<definition>` nodes.
Fix "line" attribute for `<definition_list>`, `<definition_list_item>`,
and `<term>` nodes, cf. [r9475].
Modified Paths:
--------------
trunk/docutils/docutils/parsers/rst/directives/body.py
trunk/docutils/docutils/parsers/rst/directives/images.py
trunk/docutils/docutils/parsers/rst/states.py
trunk/docutils/test/test_parsers/test_rst/includes/include14.txt
trunk/docutils/test/test_parsers/test_rst/test_definition_lists.py
trunk/docutils/test/test_parsers/test_rst/test_directives/test_include.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 2023-12-06 20:49:08 UTC (rev 9499)
+++ trunk/docutils/docutils/parsers/rst/directives/body.py 2023-12-14 22:38:49 UTC (rev 9500)
@@ -210,7 +210,8 @@
if not block:
continue
node = nodes.math_block(self.block_text, block, **self.options)
- node.line = self.content_offset + 1
+ (node.source,
+ node.line) = self.state_machine.get_source_and_line(self.lineno)
self.add_name(node)
_nodes.append(node)
return _nodes
Modified: trunk/docutils/docutils/parsers/rst/directives/images.py
===================================================================
--- trunk/docutils/docutils/parsers/rst/directives/images.py 2023-12-06 20:49:08 UTC (rev 9499)
+++ trunk/docutils/docutils/parsers/rst/directives/images.py 2023-12-14 22:38:49 UTC (rev 9500)
@@ -97,6 +97,8 @@
del self.options['target']
set_classes(self.options)
image_node = nodes.image(self.block_text, **self.options)
+ (image_node.source,
+ image_node.line) = self.state_machine.get_source_and_line(self.lineno)
self.add_name(image_node)
if reference_node:
reference_node += image_node
@@ -130,6 +132,8 @@
if isinstance(image_node, nodes.system_message):
return [image_node]
figure_node = nodes.figure('', image_node)
+ (figure_node.source, figure_node.line
+ ) = self.state_machine.get_source_and_line(self.lineno)
if figwidth == 'image':
if PIL and self.state.document.settings.file_insertion_enabled:
imagepath = url2pathname(image_node['uri'])
Modified: trunk/docutils/docutils/parsers/rst/states.py
===================================================================
--- trunk/docutils/docutils/parsers/rst/states.py 2023-12-06 20:49:08 UTC (rev 9499)
+++ trunk/docutils/docutils/parsers/rst/states.py 2023-12-14 22:38:49 UTC (rev 9500)
@@ -1265,18 +1265,17 @@
def bullet(self, match, context, next_state):
"""Bullet list item."""
- bulletlist = nodes.bullet_list()
- (bulletlist.source,
- bulletlist.line) = self.state_machine.get_source_and_line()
- self.parent += bulletlist
- bulletlist['bullet'] = match.string[0]
+ ul = nodes.bullet_list()
+ ul.source, ul.line = self.state_machine.get_source_and_line()
+ self.parent += ul
+ ul['bullet'] = match.string[0]
i, blank_finish = self.list_item(match.end())
- bulletlist += i
+ ul += i
offset = self.state_machine.line_offset + 1 # next line
new_line_offset, blank_finish = self.nested_list_parse(
self.state_machine.input_lines[offset:],
input_offset=self.state_machine.abs_line_offset() + 1,
- node=bulletlist, initial_state='BulletList',
+ node=ul, initial_state='BulletList',
blank_finish=blank_finish)
self.goto_line(new_line_offset)
if not blank_finish:
@@ -1284,6 +1283,7 @@
return [], next_state, []
def list_item(self, indent):
+ src, srcline = self.state_machine.get_source_and_line()
if self.state_machine.line[indent:]:
indented, line_offset, blank_finish = (
self.state_machine.get_known_indented(indent))
@@ -1291,6 +1291,7 @@
indented, indent, line_offset, blank_finish = (
self.state_machine.get_first_known_indented(indent))
listitem = nodes.list_item('\n'.join(indented))
+ listitem.source, listitem.line = src, srcline
if indented:
self.nested_parse(indented, input_offset=line_offset,
node=listitem)
@@ -2728,17 +2729,18 @@
def indent(self, match, context, next_state):
"""Definition list item."""
- definitionlist = nodes.definition_list()
- (definitionlist.src,
- definitionlist.line) = self.state_machine.get_source_and_line()
- definitionlistitem, blank_finish = self.definition_list_item(context)
- definitionlist += definitionlistitem
- self.parent += definitionlist
+ dl = nodes.definition_list()
+ # the definition list starts on the line before the indent:
+ lineno = self.state_machine.abs_line_number() - 1
+ dl.source, dl.line = self.state_machine.get_source_and_line(lineno)
+ dl_item, blank_finish = self.definition_list_item(context)
+ dl += dl_item
+ self.parent += dl
offset = self.state_machine.line_offset + 1 # next line
newline_offset, blank_finish = self.nested_list_parse(
self.state_machine.input_lines[offset:],
input_offset=self.state_machine.abs_line_offset() + 1,
- node=definitionlist, initial_state='DefinitionList',
+ node=dl, initial_state='DefinitionList',
blank_finish=blank_finish, blank_finish_state='Definition')
self.goto_line(newline_offset)
if not blank_finish:
@@ -2840,24 +2842,30 @@
return parent_node.children
def definition_list_item(self, termline):
+ # the parser is already on the second (indented) line:
+ dd_lineno = self.state_machine.abs_line_number()
+ dt_lineno = dd_lineno - 1
(indented, indent, line_offset, blank_finish
) = self.state_machine.get_indented()
- itemnode = nodes.definition_list_item(
- '\n'.join(termline + list(indented)))
- lineno = self.state_machine.abs_line_number() - 1
- (itemnode.source,
- itemnode.line) = self.state_machine.get_source_and_line(lineno)
- termlist, messages = self.term(termline, lineno)
- itemnode += termlist
- definition = nodes.definition('', *messages)
- itemnode += definition
+ dl_item = nodes.definition_list_item(
+ '\n'.join(termline + list(indented)))
+ (dl_item.source,
+ dl_item.line) = self.state_machine.get_source_and_line(dt_lineno)
+ dt_nodes, messages = self.term(termline, dt_lineno)
+ dl_item += dt_nodes
+ dd = nodes.definition('', *messages)
+ dd.source, dd.line = self.state_machine.get_source_and_line(dd_lineno)
+ dl_item += dd
if termline[0][-2:] == '::':
- definition += self.reporter.info(
+ dd += self.reporter.info(
'Blank line missing before literal block (after the "::")? '
'Interpreted as a definition list item.',
- line=lineno+1)
- self.nested_parse(indented, input_offset=line_offset, node=definition)
- return itemnode, blank_finish
+ line=dd_lineno)
+ # TODO: drop a definition if it is an empty comment to allow
+ # definition list items with several terms?
+ # https://sourceforge.net/p/docutils/feature-requests/60/
+ self.nested_parse(indented, input_offset=line_offset, node=dd)
+ return dl_item, blank_finish
classifier_delimiter = re.compile(' +: +')
@@ -2865,10 +2873,9 @@
"""Return a definition_list's term and optional classifiers."""
assert len(lines) == 1
text_nodes, messages = self.inline_text(lines[0], lineno)
- term_node = nodes.term(lines[0])
- (term_node.source,
- term_node.line) = self.state_machine.get_source_and_line(lineno)
- node_list = [term_node]
+ dt = nodes.term(lines[0])
+ dt.source, dt.line = self.state_machine.get_source_and_line(lineno)
+ node_list = [dt]
for i in range(len(text_nodes)):
node = text_nodes[i]
if isinstance(node, nodes.Text):
@@ -2921,8 +2928,8 @@
def indent(self, match, context, next_state):
"""Definition list item."""
- itemnode, blank_finish = self.definition_list_item(context)
- self.parent += itemnode
+ dl_item, blank_finish = self.definition_list_item(context)
+ self.parent += dl_item
self.blank_finish = blank_finish
return [], 'DefinitionList', []
Modified: trunk/docutils/test/test_parsers/test_rst/includes/include14.txt
===================================================================
--- trunk/docutils/test/test_parsers/test_rst/includes/include14.txt 2023-12-06 20:49:08 UTC (rev 9499)
+++ trunk/docutils/test/test_parsers/test_rst/includes/include14.txt 2023-12-14 22:38:49 UTC (rev 9500)
@@ -15,5 +15,5 @@
Generic admonition text in line 16
-line 18
- definition list item in line 19
+term on line 18
+ definition in line 19
Modified: trunk/docutils/test/test_parsers/test_rst/test_definition_lists.py
===================================================================
--- trunk/docutils/test/test_parsers/test_rst/test_definition_lists.py 2023-12-06 20:49:08 UTC (rev 9499)
+++ trunk/docutils/test/test_parsers/test_rst/test_definition_lists.py 2023-12-14 22:38:49 UTC (rev 9500)
@@ -23,6 +23,9 @@
class ParserTestCase(unittest.TestCase):
+
+ maxDiff = None
+
def test_parser(self):
parser = Parser()
settings = get_default_settings(Parser)
Modified: trunk/docutils/test/test_parsers/test_rst/test_directives/test_include.py
===================================================================
--- trunk/docutils/test/test_parsers/test_rst/test_directives/test_include.py 2023-12-06 20:49:08 UTC (rev 9499)
+++ trunk/docutils/test/test_parsers/test_rst/test_directives/test_include.py 2023-12-14 22:38:49 UTC (rev 9500)
@@ -772,7 +772,7 @@
<term>
A literal block::
<definition>
- <system_message level="1" line="57" source="{include10}" type="INFO">
+ <system_message level="1" line="56" source="{include10}" type="INFO">
<paragraph>
Blank line missing before literal block (after the "::")? Interpreted as a definition list item.
<paragraph>
Modified: trunk/docutils/test/test_parsers/test_rst/test_source_line.py
===================================================================
--- trunk/docutils/test/test_parsers/test_rst/test_source_line.py 2023-12-06 20:49:08 UTC (rev 9499)
+++ trunk/docutils/test/test_parsers/test_rst/test_source_line.py 2023-12-14 22:38:49 UTC (rev 9500)
@@ -81,9 +81,11 @@
in line 6
* bullet list in line 9
-* second item in line 10
+*
+ second item in line 10
+ paragraph starts in line 11
-1. enumerated list in line 12
+#. enumerated list in line 14
""",
"""\
<document source="test data">
@@ -100,16 +102,17 @@
attribution
in line 6
<bullet_list bullet="*" internal:line="9" internal:source="test data">
- <list_item internal:source="test data">
+ <list_item internal:line="9" internal:source="test data">
<paragraph internal:line="9" internal:source="test data">
bullet list in line 9
- <list_item internal:source="test data">
- <paragraph internal:line="10" internal:source="test data">
+ <list_item internal:line="10" internal:source="test data">
+ <paragraph internal:line="11" internal:source="test data">
second item in line 10
- <enumerated_list enumtype="arabic" internal:line="12" internal:source="test data" prefix="" suffix=".">
- <list_item internal:source="test data">
- <paragraph internal:line="12" internal:source="test data">
- enumerated list in line 12
+ paragraph starts in line 11
+ <enumerated_list enumtype="arabic" internal:line="14" internal:source="test data" prefix="" suffix=".">
+ <list_item internal:line="14" internal:source="test data">
+ <paragraph internal:line="14" internal:source="test data">
+ enumerated list in line 14
"""],
["""\
Paragraph
@@ -191,14 +194,14 @@
attribution
in line 6
<bullet_list bullet="*" internal:line="9" internal:source="{include14}">
- <list_item internal:source="{include14}">
+ <list_item internal:line="9" internal:source="{include14}">
<paragraph internal:line="9" internal:source="{include14}">
bullet list in line 9
- <list_item internal:source="{include14}">
+ <list_item internal:line="10" internal:source="{include14}">
<paragraph internal:line="10" internal:source="{include14}">
second item in line 10
<enumerated_list enumtype="arabic" internal:line="12" internal:source="{include14}" prefix="" suffix=".">
- <list_item internal:source="{include14}">
+ <list_item internal:line="12" internal:source="{include14}">
<paragraph internal:line="12" internal:source="{include14}">
enumerated list in line 12
<admonition classes="admonition-line-14" internal:line="14" internal:source="{include14}">
@@ -206,13 +209,13 @@
line 14
<paragraph internal:line="16" internal:source="{include14}">
Generic admonition text in line 16
- <definition_list internal:line="19" internal:source="{include14}">
- <definition_list_item internal:line="19" internal:source="{include14}">
- <term internal:line="19" internal:source="{include14}">
- line 18
- <definition>
+ <definition_list internal:line="18" internal:source="{include14}">
+ <definition_list_item internal:line="18" internal:source="{include14}">
+ <term internal:line="18" internal:source="{include14}">
+ term on line 18
+ <definition internal:line="19" internal:source="{include14}">
<paragraph internal:line="19" internal:source="{include14}">
- definition list item in line 19
+ definition in line 19
"""],
["""\
Paragraph
@@ -244,6 +247,30 @@
<paragraph internal:line="11" internal:source="test data">
Final paragraph in line 11
"""],
+["""\
+Paragraph
+
+.. image:: line-3.png
+ :width: 3em
+
+.. figure:: line-6.png
+
+ caption on line 8
+
+Final paragraph in line 10
+""",
+"""\
+<document source="test data">
+ <paragraph internal:line="1" internal:source="test data">
+ Paragraph
+ <image internal:line="3" internal:source="test data" uri="line-3.png" width="3em">
+ <figure internal:line="6" internal:source="test data">
+ <image internal:line="6" internal:source="test data" uri="line-6.png">
+ <caption internal:line="8" internal:source="test data">
+ caption on line 8
+ <paragraph internal:line="10" internal:source="test data">
+ Final paragraph in line 10
+"""],
])
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|