Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
7 changes: 7 additions & 0 deletions demo/demo-advanced.md
Original file line number Diff line number Diff line change
@@ -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

~~~
Expand Down
33 changes: 30 additions & 3 deletions odpdown.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
20 changes: 20 additions & 0 deletions test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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