-
-
Save rossant/99a2316465c84192b630 to your computer and use it in GitHub Desktop.
| """Convert from Markdown to OpenOffice for Linux Magazine. | |
| Requirements: | |
| * Python 3+ (doesn't seem to work on Python 2 because of odfpy) | |
| * Latest IPython and Jupyter | |
| Installation: | |
| pip install ipymd | |
| pip install odfpy | |
| git clone https://gist.github.com/99a2316465c84192b630.git md2glmf | |
| cd md2glmf | |
| Usage: | |
| python markdow_to_glmf.py somedocument.md | |
| This generates `somedocument.odt`. | |
| Note: the conversion code lives in the ipymd repo at https://github.com/rossant/ipymd | |
| """ | |
| import os | |
| import os.path as op | |
| import re | |
| import sys | |
| from ipymd import convert | |
| from ipymd.core.prompt import SimplePromptManager, PythonPromptManager | |
| from ipymd.lib.opendocument import ODFDocument, ODFRenderer, load_styles | |
| from ipymd.formats.opendocument import ODFWriter, load_odf | |
| SCRIPTDIR = op.dirname(op.realpath(__file__)) | |
| _PUNCTUATION_REGEX = r'[^\w\- ]' | |
| def glmf_styles(path): | |
| styles = load_styles(path) | |
| return {name: style for name, style in styles.items() | |
| } | |
| mapping = {'normal-paragraph': 'Normal', | |
| 'heading-1': 'Heading', | |
| 'heading-2': 'Heading 1', | |
| 'heading-3': 'Heading 2', | |
| 'heading-4': 'Heading 3', | |
| 'heading-5': 'Heading 4', | |
| 'code': 'code', | |
| 'italic': 'italic', | |
| 'bold': 'gras', | |
| 'url': 'url', | |
| 'inline-code': 'code_par', | |
| } | |
| def _read_md(path): | |
| with open(path, 'r') as f: | |
| return f.read() | |
| class GLMFODFRenderer(ODFRenderer): | |
| def paragraph(self, text): | |
| lines = text.splitlines() | |
| head, tail = lines[:1], lines[1:] | |
| if head[0] == 'chapeau': | |
| style = 'chapeau' | |
| elif head[0] == 'signature': | |
| style = 'Signature' | |
| elif head[0] == 'pragma': | |
| style = 'pragma' | |
| elif head[0] == 'legende': | |
| style = 'legende' | |
| else: | |
| style = None | |
| tail = lines | |
| text = '\n'.join(tail) | |
| with self._doc.paragraph(style): | |
| self.text(text) | |
| def list_start(self, ordered=False): | |
| if self._doc.is_in_paragraph(): | |
| self._doc.end_paragraph() | |
| # if ordered: | |
| # self._doc.start_numbered_list() | |
| # else: | |
| # self._doc.start_list() | |
| def list_end(self): | |
| # self._doc.end_list() | |
| pass | |
| def list_item_start(self): | |
| # self._doc.start_list_item() | |
| self._doc.start_paragraph() | |
| self._doc.text('- ') | |
| def list_item_end(self): | |
| if self._doc.is_in_paragraph(): | |
| self._doc.end_paragraph() | |
| # self._doc.end_list_item() | |
| def gen_odt(filename): | |
| print("Converting {0}...".format(filename), end=' ') | |
| template_path = '_template.ott' | |
| # Create the ODF document. | |
| styles = glmf_styles(template_path) | |
| # from pprint import pprint | |
| # pprint(styles) | |
| odf_doc = ODFDocument(styles=styles, | |
| style_mapping=mapping) | |
| # Create the ODF writer. | |
| prompt = PythonPromptManager() | |
| writer = ODFWriter(odf_doc=odf_doc, prompt=prompt, | |
| odf_renderer=GLMFODFRenderer | |
| ) | |
| # Read Markdown file. | |
| md = _read_md(filename) | |
| # Convert the Markdown file to the ODF file. | |
| convert(md, from_='markdown', to='opendocument', writer=writer) | |
| # Save the ODF chapter. | |
| writer.contents.save(op.join(op.splitext(filename)[0] + '.odt')) | |
| print("done.") | |
| if __name__ == '__main__': | |
| import sys | |
| gen_odt(sys.argv[1]) |
I'm also interested by a example :)
When using this gist, I had to do run pip install traitlets jupyter_client nbformat notebook because they seemed to be necessary
Also, it seems that this script is incompatible with unicode, therefore I had to make two changes:
- First, remove all
\rcharacters in my markdown file - Second, modify the script to apply unicode reading:
diff --git a/markdown_to_glmf.py b/markdown_to_glmf.py index 0b26def..92119bd 100644 --- a/markdown_to_glmf.py +++ b/markdown_to_glmf.py @@ -26,6 +26,7 @@ import os import os.path as op import re import sys +import codecs from ipymd import convert from ipymd.core.prompt import SimplePromptManager, PythonPromptManager @@ -60,7 +61,7 @@ mapping = {'normal-paragraph': 'Normal', def _read_md(path): - with open(path, 'r') as f: + with codecs.open(path, 'r', encoding='utf-8') as f: return f.read()
I made several updates and added an example on my fork of this gist: https://gist.github.com/Pierstoval/7fe41732e22810e422388010ac2c0c91/revisions
Maybe this should become a single repository, to accept PRs 😉
Could be added in repository «outils auteurs».
@Pierstoval Done! https://github.com/rossant/odt-linux-mag
Please feel free to propose PRs.
I should point out that I no longer support this code but I'll happily merge pull requests on the GitHub repository.
Thanks for your contributions!
Hi,
Thanks.
PS: Aussi, est-ce que ça ne vaudrait pas le coup de faire de ce gist un dépôt ?