diff --git a/CHANGES b/CHANGES index 77e00ce..6ba9094 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +v0.4.2 + - basic support for markdown tables + v0.4.1 - Update specfile from downstream project. - Fix code-block ODF space misparsing bug. diff --git a/demo/demo-advanced.md b/demo/demo-advanced.md index 4aafbf6..71d4a69 100644 --- a/demo/demo-advanced.md +++ b/demo/demo-advanced.md @@ -1,5 +1,12 @@ # Advanced Markup +## Basic Support for Tables + +| Heading 1 | Heading 2 +| ----------------------------- | --------- +| Cell 1 | Cell 2 +| [Cell 3](http://www.foo.test) | Cell 4 + ## Embedded Image Markup ~~~ diff --git a/odpdown.py b/odpdown.py index eec4ed9..ba2e4a9 100755 --- a/odpdown.py +++ b/odpdown.py @@ -52,8 +52,10 @@ from lpod import ODF_MANIFEST, ODF_STYLES from lpod.document import odf_get_document from lpod.frame import odf_create_text_frame, odf_create_image_frame, odf_frame +from lpod.frame import odf_create_frame from lpod.draw_page import odf_create_draw_page, odf_draw_page from lpod.list import odf_create_list_item, odf_create_list +from lpod.table import odf_create_table, odf_create_cell, odf_create_row from lpod.style import odf_create_style from lpod.paragraph import odf_create_paragraph, odf_span from lpod.paragraph import odf_create_line_break, odf_create_spaces @@ -627,13 +629,38 @@ def paragraph(self, text): return ODFPartialTree.from_metrics_provider([span], self) def table(self, header, body): - pass + tbl = odf_create_table(name=u'Table') + tbl.extend_rows(header.get()) + tbl.extend_rows(body.get()) + + # TODO frame positioning, table size, style etc + frame = odf_create_frame( + style=u'md2odp-ImageStyle', + size=self.outline_size, + position=self.outline_position + ) + frame.append(tbl) + return ODFPartialTree.from_metrics_provider([frame], self) def table_row(self, content): - pass + row = odf_create_row() + row.set_cells(content.get()) + return ODFPartialTree.from_metrics_provider([row], self) def table_cell(self, content, **flags): - pass + cell_content = content.get() + # For presentations it seems we're dealing with text content anyway. So + # we just grab what is inside the cell, wrap it in a paragraph and show + # it. + para = odf_create_element('text:p') + para.extend(cell_content) + + cell = odf_create_cell() + cell.append(para) + # TODO header style + # if flags.get('header'): + # cell.set_style('md2odp-TextDoubleEmphasisStyle') + return ODFPartialTree.from_metrics_provider([cell], self) def autolink(self, link, is_email=False): text = link diff --git a/test.py b/test.py index b1f70a6..ace3907 100644 --- a/test.py +++ b/test.py @@ -274,3 +274,23 @@ def test_multiline_bold(): 'text:style-name') == 'md2odp-TextDoubleEmphasisStyle') assert (odf.get()[0].get_elements('descendant::text:span')[3].get_text() == 'bold text\nnext line bold') + +@with_setup(setup) +def test_basic_table(): + markdown = ''' +|A |B +|-------|------- +|Cell 1 | 2 +|[Link](http://www.odpdown.test) Foo | Cell 4 +'''.strip() + odf = mkdown.render(markdown) + assert len(odf.get()) == 1 + frame = odf.get()[0] + tbl = frame.get_table() + assert len(tbl.get_rows()) == 3 + + assert tbl.get_row(0).get_text_content() == u'A\nB' + assert tbl.get_row(1).get_text_content() == u'Cell 1\n2' + assert tbl.get_row(2).get_text_content() == u'Link Foo\nCell 4' + + assert len(tbl.xpath('//text:p/text:a')) == 1