From b5bc0fc9cbe3df899a12ec1bfe90bd8fa21ddd74 Mon Sep 17 00:00:00 2001 From: rsiddharth Date: Mon, 24 Jul 2017 00:40:01 +0000 Subject: md_tw.py: Add Text Wrap classes (derived from mistune' classes). * md_tw.py (TWBlockLexer, TWInlineLexer, TWRenderer) (TWMarkdown): New classes. * tests/data/paragraphs-with-inline-wrapped.md: New file. * tests/data/paragraphs-with-inline.md: New file. * tests/data/paragraphs-wrapped.md: New file. * tests/data/paragraphs.md: New file. * tests/test_md_tw.py (TestTWBlockLexer, TestTWInlineLexer, TestTWRenderer, TestTWMarkdown) (TestTextWrapParagraphs): New test classes. --- md_tw.py | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) (limited to 'md_tw.py') diff --git a/md_tw.py b/md_tw.py index 312e249..9ebe609 100644 --- a/md_tw.py +++ b/md_tw.py @@ -18,5 +18,96 @@ # along with markdown-textwrap (see COPYING). If not, see # . +import textwrap + +from mistune import BlockLexer, InlineLexer, Renderer, Markdown + + +class TWBlockLexer(BlockLexer): + """Text Wrap Block level lexer for block grammars.""" + + def __init__(self, rules=None, **kwargs): + super(TWBlockLexer, self).__init__(rules, **kwargs) + + self.default_rules = ['paragraph', 'text'] + + +class TWInlineLexer(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(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(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 [...]') -- cgit v1.2.3