summaryrefslogtreecommitdiffstats
path: root/md_tw.py
diff options
context:
space:
mode:
Diffstat (limited to 'md_tw.py')
-rw-r--r--md_tw.py91
1 files changed, 91 insertions, 0 deletions
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
# <http://www.gnu.org/licenses/>.
+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 [...]')