From: Guenter M. <mi...@us...> - 2012-01-10 14:58:12
|
Dear Docutils developers, the attached patch fixes the reported line number to point to the actual line in the source when a table parsing error is detected *inside* a table. In connection with a dedicated editor mode, I find it very helpful for larger tables. As the patch changes behaviour, I would like to present it here for review first. Günter Exec: svn 'diff' 'test/test_parsers/test_rst/test_SimpleTableParser.py' 'docutils/parsers/rst/states.py' 'test/test_parsers/test_rst/test_east_asian_text.py' 'test/test_parsers/test_rst/test_tables.py' 'test/test_parsers/test_rst/test_TableParser.py' 'docutils/parsers/rst/tableparser.py' 2>&1 Dir: /home/milde/Code/Python/docutils-svn/docutils Index: test/test_parsers/test_rst/test_SimpleTableParser.py =================================================================== --- test/test_parsers/test_rst/test_SimpleTableParser.py (Revision 7307) +++ test/test_parsers/test_rst/test_SimpleTableParser.py (Arbeitskopie) @@ -82,14 +82,14 @@ cell 3 cell 4 ============ ====== """, -'TableMarkupError: Text in column margin at line offset 1.'], +"TableMarkupError: ('Text in column margin in table line 2.', 1)"], ["""\ ====== ===== ====== row one Another bad table ====== ===== ====== """, -'TableMarkupError: Text in column margin at line offset 2.'], +"TableMarkupError: ('Text in column margin in table line 3.', 2)"], ["""\ =========== ================ A table with two header rows, @@ -116,8 +116,8 @@ That's bad. ============ ============= """, -'TableMarkupError: Multiple head/body row separators in table ' -'(at line offset 2 and 4); only one allowed.'], +"TableMarkupError: ('Multiple head/body row separators " +"(table lines 3 and 5); only one allowed.', 4)"], ["""\ ============ ============ ============ ============ Index: docutils/parsers/rst/states.py =================================================================== --- docutils/parsers/rst/states.py (Revision 7310) +++ docutils/parsers/rst/states.py (Arbeitskopie) @@ -1628,8 +1628,12 @@ table = self.build_table(tabledata, tableline) nodelist = [table] + messages except tableparser.TableMarkupError, detail: - nodelist = self.malformed_table( - block, ' '.join(detail.args)) + messages + try: # last argument is offset into table (new in 1.9) + offset = int(detail.args[-1]) + except ValueError: + offset = 0 + nodelist = self.malformed_table(block, + ' '.join(detail.args[:-1]), offset=offset) + messages else: nodelist = messages return nodelist, blank_finish @@ -1715,15 +1719,15 @@ block.pad_double_width(self.double_width_pad_char) return block, [], end == limit or not lines[end+1].strip() - def malformed_table(self, block, detail=''): + def malformed_table(self, block, detail='', offset=0): block.replace(self.double_width_pad_char, '') data = '\n'.join(block) message = 'Malformed table.' - startline = self.state_machine.abs_line_number() - len(block) + 1 + lineno = self.state_machine.abs_line_number() - len(block) + 1 if detail: message += '\n' + detail error = self.reporter.error(message, nodes.literal_block(data, data), - line=startline) + line=lineno+offset) return [error] def build_table(self, tabledata, tableline, stub_columns=0): Index: test/test_parsers/test_rst/test_east_asian_text.py =================================================================== --- test/test_parsers/test_rst/test_east_asian_text.py (Revision 7307) +++ test/test_parsers/test_rst/test_east_asian_text.py (Arbeitskopie) @@ -149,10 +149,10 @@ <entry> <paragraph> ダイ2ラン - <system_message level="3" line="5" source="test data" type="ERROR"> + <system_message level="3" line="6" source="test data" type="ERROR"> <paragraph> Malformed table. - Text in column margin at line offset 1. + Text in column margin in table line 2. <literal_block xml:space="preserve"> ======== ========= ダイ1ラン ダイ2ラン Index: test/test_parsers/test_rst/test_tables.py =================================================================== --- test/test_parsers/test_rst/test_tables.py (Revision 7307) +++ test/test_parsers/test_rst/test_tables.py (Arbeitskopie) @@ -896,10 +896,10 @@ """, """\ <document source="test data"> - <system_message level="3" line="1" source="test data" type="ERROR"> + <system_message level="3" line="4" source="test data" type="ERROR"> <paragraph> Malformed table. - Column span alignment problem at line offset 3. + Column span alignment problem in table line 4. <literal_block xml:space="preserve"> ============== ====== A bad table cell 2 @@ -914,10 +914,10 @@ """, """\ <document source="test data"> - <system_message level="3" line="1" source="test data" type="ERROR"> + <system_message level="3" line="2" source="test data" type="ERROR"> <paragraph> Malformed table. - Text in column margin at line offset 1. + Text in column margin in table line 2. <literal_block xml:space="preserve"> ======== ========= A bad table cell 2 @@ -1158,10 +1158,10 @@ """, """\ <document source="test data"> - <system_message level="3" line="1" source="test data" type="ERROR"> + <system_message level="3" line="4" source="test data" type="ERROR"> <paragraph> Malformed table. - Text in column margin at line offset 3. + Text in column margin in table line 4. <literal_block xml:space="preserve"> == =========== =========== 1 Span columns 2 & 3 @@ -1170,10 +1170,10 @@ ------------------------ 3 == =========== =========== - <system_message level="3" line="9" source="test data" type="ERROR"> + <system_message level="3" line="13" source="test data" type="ERROR"> <paragraph> Malformed table. - Column span incomplete at line offset 4. + Column span incomplete in table line 5. <literal_block xml:space="preserve"> == =========== =========== 1 Span cols 1&2 but not 3 Index: test/test_parsers/test_rst/test_TableParser.py =================================================================== --- test/test_parsers/test_rst/test_TableParser.py (Revision 7307) +++ test/test_parsers/test_rst/test_TableParser.py (Arbeitskopie) @@ -160,8 +160,8 @@ | Cells must be rectangles. | +----------------------------+ """, -'TableMarkupError: Malformed table; parse incomplete.', -'TableMarkupError: Malformed table; parse incomplete.'], +"TableMarkupError: ('Malformed table; parse incomplete.', 0)", +"TableMarkupError: ('Malformed table; parse incomplete.', 0)"], ["""\ +-------------------------------+ | A table with two header rows, | @@ -197,10 +197,10 @@ | That's bad. | | +-------------+-----------------+ """, -'TableMarkupError: Multiple head/body row separators in table ' -'(at line offset 2 and 4); only one allowed.', -'TableMarkupError: Multiple head/body row separators in table ' -'(at line offset 2 and 4); only one allowed.'], +"TableMarkupError: ('Multiple head/body row separators " +"(table lines 3 and 5); only one allowed.', 4)", +"TableMarkupError: ('Multiple head/body row separators " +"(table lines 3 and 5); only one allowed.', 4)"], ["""\ +-------------------------------------+ | | Index: docutils/parsers/rst/tableparser.py =================================================================== --- docutils/parsers/rst/tableparser.py (Revision 7307) +++ docutils/parsers/rst/tableparser.py (Arbeitskopie) @@ -64,16 +64,16 @@ if self.head_body_separator_pat.match(line): if self.head_body_sep: raise TableMarkupError( - 'Multiple head/body row separators in table (at line ' - 'offset %s and %s); only one allowed.' - % (self.head_body_sep, i)) + 'Multiple head/body row separators ' + '(table lines %s and %s); only one allowed.' + % (self.head_body_sep+1, i+1), i) else: self.head_body_sep = i self.block[i] = line.replace('=', '-') if self.head_body_sep == 0 or self.head_body_sep == (len(self.block) - 1): raise TableMarkupError('The head/body row separator may not be ' - 'the first or last line of the table.') + 'the first or last line of the table.', i) class GridTableParser(TableParser): @@ -176,7 +176,7 @@ corners.extend([(top, right), (bottom, left)]) corners.sort() if not self.check_parse_complete(): - raise TableMarkupError('Malformed table; parse incomplete.') + raise TableMarkupError('Malformed table; parse incomplete.', 0) def mark_done(self, top, left, bottom, right): """For keeping track of how much of each text column has been seen.""" @@ -425,8 +425,8 @@ cols.append((begin, end)) if self.columns: if cols[-1][1] != self.border_end: - raise TableMarkupError('Column span incomplete at line ' - 'offset %s.' % offset) + raise TableMarkupError('Column span incomplete in table ' + 'line %s.' % (offset+1), offset) # Allow for an unbounded rightmost column: cols[-1] = (cols[-1][0], self.columns[-1][1]) return cols @@ -442,8 +442,9 @@ i += 1 morecols += 1 except (AssertionError, IndexError): - raise TableMarkupError('Column span alignment problem at ' - 'line offset %s.' % (offset + 1)) + raise TableMarkupError('Column span alignment problem ' + 'in table line %s.' % (offset+2), + offset+1) cells.append([0, morecols, offset, []]) i += 1 return cells @@ -502,8 +503,10 @@ if new_end > main_end: self.columns[-1] = (main_start, new_end) elif line[end:nextstart].strip(): - raise TableMarkupError('Text in column margin at line ' - 'offset %s.' % (first_line + offset)) + raise TableMarkupError('Text in column margin ' + 'in table line %s.' + % (first_line+offset+1), + first_line+offset) offset += 1 columns.pop() |
From: Guenter M. <mi...@us...> - 2012-01-12 08:45:22
|
On 2012-01-10, Guenter Milde wrote: > Dear Docutils developers, > the attached patch fixes the reported line number to point to the actual > line in the source when a table parsing error is detected *inside* a > table. In connection with a dedicated editor mode, I find it very helpful > for larger tables. An updated version (with "offset" class argument to the TableMarkupError for improved backwards compatibility) is now in the SVN. Günter |