From 32102a705c582f831fc9e022df5f320bd619ca59 Mon Sep 17 00:00:00 2001 From: kennytm Date: Tue, 20 Oct 2015 14:51:15 +0800 Subject: [PATCH] Initial project --- ods2md.py | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 2 ++ 2 files changed, 55 insertions(+) create mode 100755 ods2md.py create mode 100644 requirements.txt diff --git a/ods2md.py b/ods2md.py new file mode 100755 index 0000000..505d3d2 --- /dev/null +++ b/ods2md.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 + +import ezodf +import sys +import html +import unicodedata + +# Ref: http://stackoverflow.com/a/31666966/224671 +DISPLAY_WIDTH = { + 'A': 1, + 'F': 2, + 'H': 1, + 'N': 1, + 'Na': 1, + 'W': 2, +} + +def display_text(cell): + v = cell.value + if isinstance(v, float): + return '{:g}'.format(v) + elif v is None: + return '' + else: + return str(v) + +def display_len(s): + return sum(DISPLAY_WIDTH[unicodedata.east_asian_width(c)] for c in s) + +def main(odf_path): + ods = ezodf.opendoc(odf_path) + + for sheet in ods.sheets: + print('##', sheet.name) + + column_widths = [max(display_len(display_text(cell)) for cell in column) for column in sheet.columns()] + + for n, row in enumerate(sheet.rows()): + print('|', end=' ') + for m, cell in enumerate(row): + content = display_text(cell) + disp_len = column_widths[m] + len(content) - display_len(content) + print('{0:<{1}}'.format(content, disp_len), end=' | ') + print() + + if n == 0: + print('|', end='') + for w in column_widths: + print('-' * (w+2), end='|') + print() + +if __name__ == '__main__': + main(sys.argv[1]) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..7463e9e --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +ezodf==0.3.0 +lxml==3.4.4