diff options
-rw-r--r-- | ftplugin/rst_tables.vim | 16 | ||||
-rw-r--r-- | src/rst_tables.py | 16 | ||||
-rw-r--r-- | tests/test_rst_tables.py | 32 |
3 files changed, 56 insertions, 8 deletions
diff --git a/ftplugin/rst_tables.vim b/ftplugin/rst_tables.vim index 0722816..4892945 100644 --- a/ftplugin/rst_tables.vim +++ b/ftplugin/rst_tables.vim @@ -51,11 +51,19 @@ def unify_table(table): return output +def split_table_row(row_string): + if row_string.find("|") >= 0: + # first, strip off the outer table drawings + row_string = re.sub(r'^\s*\||\|\s*$', '', row_string) + return re.split(r'\s*\|\s*', row_string.strip()) + return re.split(r'\s\s+', row_string.rstrip()) + + def parse_table(raw_lines): - mkfields = lambda line: re.split('\s\s+', line.rstrip()) - output = map(mkfields, raw_lines) - output = unify_table(output) - return output + select_data_lines = lambda line: not re.match('^[\t +=-]+$', line) + lines = filter(select_data_lines, raw_lines) + lines = map(split_table_row, lines) + return unify_table(lines) def table_line(widths, header=False): diff --git a/src/rst_tables.py b/src/rst_tables.py index e1e3842..1cceb91 100644 --- a/src/rst_tables.py +++ b/src/rst_tables.py @@ -36,11 +36,19 @@ def unify_table(table): return output +def split_table_row(row_string): + if row_string.find("|") >= 0: + # first, strip off the outer table drawings + row_string = re.sub(r'^\s*\||\|\s*$', '', row_string) + return re.split(r'\s*\|\s*', row_string.strip()) + return re.split(r'\s\s+', row_string.rstrip()) + + def parse_table(raw_lines): - mkfields = lambda line: re.split('\s\s+', line.rstrip()) - output = map(mkfields, raw_lines) - output = unify_table(output) - return output + select_data_lines = lambda line: not re.match('^[\t +=-]+$', line) + lines = filter(select_data_lines, raw_lines) + lines = map(split_table_row, lines) + return unify_table(lines) def table_line(widths, header=False): diff --git a/tests/test_rst_tables.py b/tests/test_rst_tables.py index b3df5ad..f7f5280 100644 --- a/tests/test_rst_tables.py +++ b/tests/test_rst_tables.py @@ -82,6 +82,38 @@ a line ending. expected = [['x', 'y'], ['a', 'b'], ['only one', '']] self.assertEquals(expected, parse_table(input)) + def testParseValidTable(self): + input = ['+=====+====+', + '| Foo | Mu |', + '+=====+====+', + '| x | y |', + '+-----+----+'] + expect = [['Foo', 'Mu'], ['x', 'y']] + self.assertEquals(expect, parse_table(input)) + + def testParseCorruptedTable(self): + input = ['+===+-----====+', + '| Foo | Mu |', + '+=====+====+', + '| x | This became somewhat larger |', + 'blah | A new line| ', + '+-----+----+'] + expect = [['Foo', 'Mu'], + ['x', 'This became somewhat larger'], + ['blah', 'A new line']] + self.assertEquals(expect, parse_table(input)) + + input = ['+===+-----====+', + '| Foo | Mu |', + '+=====+====+', + '| x | This became somewhat larger |', + 'blah | A new line|| ', + '+-----+----+'] + expect = [['Foo', 'Mu', ''], + ['x', 'This became somewhat larger', ''], + ['blah', 'A new line', '']] + self.assertEquals(expect, parse_table(input)) + def testTableLine(self): self.assertEquals('', table_line([], True)) self.assertEquals('++', table_line([0], True)) |