# -*- coding: utf-8 -*- # # Copyright © 2017 markdown-textwrap contributors. # # This file is part of markdown-textwrap. # # markdown-textwrap is free software: you can redistribute it # and/or modify it under the terms of the GNU General Public License # as published by the Free Software Foundation, either version 3 of # the License, or (at your option) any later version. # # markdown-textwrap is distributed in the hope that it will be # useful, but WITHOUT ANY WARRANTY; without even the implied # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with markdown-textwrap (see COPYING). If not, see # . import re import textwrap import mistune class TWBlockLexer(mistune.BlockLexer): """Text Wrap Block lexer for block grammar.""" def __init__(self, rules=None, **kwargs): super(TWBlockLexer, self).__init__(rules, **kwargs) # from mistune self._key_pattern = re.compile(r'\s+') # from mistune def _keyify(self, key): key = mistune.escape(key.lower(), quote=True) return self._key_pattern.sub(' ', key) class TWInlineLexer(mistune.InlineLexer): """Text Wrap Inline level lexer for inline gramars.""" def __init__(self, renderer, rules=None, **kwargs): super(TWInlineLexer, self).__init__(renderer, rules, **kwargs) # No inline rules. self.default_rules = [] def output(self, text, rules=None): # Don't parse inline text. return text class TWRenderer(mistune.Renderer): """Text Wrap Renderer.""" def __init__(self, **kwargs): super(TWRenderer, self).__init__(**kwargs) # Initalize textwrap.TextWrapper class self.tw = textwrap.TextWrapper( width=kwargs.get('tw_width', 72) ) def _tw_set_options(self, **kwargs): """ Set options for the local textwrap.TextWrapper instance. """ # Recognized options. opts = [ 'width', 'initial_indent', 'subsequent_indent', 'drop_whitespace' ] for opt, val in kwargs.items(): if not opt in opts: continue # Set option setattr(self.tw, opt, val) def _tw_fill(self, text, **kwargs): """Wrap text. """ self._tw_set_options(**kwargs) return self.tw.fill(text) def paragraph(self, text): return '\n{}\n'.format(self._tw_fill(text)) class TWMarkdown(mistune.Markdown): """Text Wrap Markdown parser. """ def __init__(self, **kwargs): renderer = TWRenderer(**kwargs) super(TWMarkdown, self).__init__( renderer, TWInlineLexer, TWBlockLexer ) def parse(self, text): out = super(TWMarkdown, self).parse(text) # Strip newline at the beginning. return out.lstrip('\n') def main(): print('USAGE: md_tw 72 file.md file2.md [...]')