diff --git a/src/rstpreview/markup.py b/src/rstpreview/markup.py index 348b91a..b8ca37f 100644 --- a/src/rstpreview/markup.py +++ b/src/rstpreview/markup.py @@ -3,6 +3,12 @@ try: import docutils.core except ImportError: docutils = None +try: + import markdown +except ImportError: + markdown = None +else: + import markdown.extensions.codehilite def get_previewer(source): @@ -60,6 +66,39 @@ class ReStructuredTextPreviewer(BasePreviewer): )['html_body'] +class MarkdownPreviewer(BasePreviewer): + + def __init__(self, source): + super(MarkdownPreviewer, self).__init__(source) + self.extensions = [ + markdown.extensions.codehilite.CodeHiliteExtension( + css_class='code', + ), + ] + + @classmethod + def detect(cls, lines): + if markdown is None: + return False + for idx, line in enumerate(lines): + if line.lstrip().startswith('#'): # heading + return True + if '![' in line: # image + return True + if '](' in line: # inline link + return True + if line.startswith('[') and ']:' in line: # reference-style link + return True + if line.startswith(' '): # code block + # reStructuredText has a similar syntax, so make sure + # it isn't that + if idx and not line[idx - 1].endswith('::'): + return True + + def preview(self): + return markdown.markdown(self.source, extensions=self.extensions) + + class PlainTextPreviewer(BasePreviewer): def preview(self):