From c925814443334be91dbf938dc083145f2b8f1f7f Mon Sep 17 00:00:00 2001 From: Mike Cooper Date: Sat, 4 Jun 2011 02:09:48 -0700 Subject: [PATCH] Make markdown, pygments, and docutils dependencies optional. --- setup.py | 2 +- wok/engine.py | 12 +++++--- wok/renderers.py | 77 +++++++++++++++++++++++++++++++++--------------- 3 files changed, 63 insertions(+), 28 deletions(-) diff --git a/setup.py b/setup.py index e777c3b..11eef1c 100755 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ setup(name='wok', version=version.encode("utf8"), description='Static site generator', - install_requires=['pyyaml', 'markdown', 'docutils', 'jinja2'], + install_requires=['pyyaml', 'jinja2'], author='Mike Cooper', author_email='mythmon@gmail.com', url='https://www.github.com/mythmon/wok', diff --git a/wok/engine.py b/wok/engine.py index b6e768f..aa3eea8 100755 --- a/wok/engine.py +++ b/wok/engine.py @@ -101,10 +101,14 @@ def load_pages(self): for r in renderers.all: if ext in r.extensions: renderer = r - - self.all_pages.append( - page.Page(os.path.join(root,f), self.options, - renderer)) + break + else: + util.out.warn('Loading render', 'No parser found ' + 'for {0}. Using default renderer.'.format(f)) + renderer = renderers.Renderer + + self.all_pages.append(page.Page(os.path.join(root,f), + self.options, renderer)) def make_tree(self): self.categories = {} diff --git a/wok/renderers.py b/wok/renderers.py index 35b44c3..9bb0a0e 100644 --- a/wok/renderers.py +++ b/wok/renderers.py @@ -1,10 +1,13 @@ -# Markdown -from markdown import markdown -# reStructuredText -import docutils.core -from docutils.writers.html4css1 import Writer as rst_html_writer -from docutils.parsers.rst import directives -from wok.rst_pygments import Pygments as RST_Pygments +# Check for pygments +try: + import pygments + have_pygments = True +except ImportError: + out.util.info('Loading renderers', 'Pygments not enabled.') + have_pygments = False + +# List of available renderers +all = [] class Renderer(object): extensions = [] @@ -12,29 +15,57 @@ class Renderer(object): @classmethod def render(cls, plain): return plain +all.append(Renderer) -class Markdown(Renderer): - extensions = ['markdown', 'mkd'] +class Plain(Renderer): + """Plain text renderer. Replaces new lines with html
s""" + extensions = ['txt'] @classmethod def render(cls, plain): - return markdown(plain, ['def_list', 'footnotes', 'codehilite(css_class=highlight )']) + return plain.replace('\n', '
') +all.append(Plain) -class ReStructuredText(Renderer): - directives.register_directive('Pygments', RST_Pygments) +# Include markdown, if it is available. +try: + from markdown import markdown + class Markdown(Renderer): + """Markdown renderer.""" + extensions = ['markdown', 'mkd'] - extensions = ['rst'] + plugins = ['def_list', 'footnotes'] + if have_pygments: + plugins.append('codehilite(css_class=highlight)') - @classmethod - def render(cls, plain): - w = rst_html_writer() - return docutils.core.publish_parts(plain, writer=w)['body'] + @classmethod + def render(cls, plain): + return markdown(plain, Markdown.plugins) -class Plain(Renderer): - extensions = 'txt' + all.append(Markdown) - @classmethod - def render(cls, plain): - return plain.replace('\n', '
') +except ImportError: + util.out.info('Loading renderers', 'Markdown not enabled.') + +# Include ReStructuredText Parser, if we have docutils +try: + + import docutils.core + from docutils.writers.html4css1 import Writer as rst_html_writer + from docutils.parsers.rst import directives + + if have_pygments: + from wok.rst_pygments import Pygments as RST_Pygments + directives.register_directive('Pygments', RST_Pygments) + + class ReStructuredText(Renderer): + """reStructuredText renderer.""" + extensions = ['rst'] + + @classmethod + def render(cls, plain): + w = rst_html_writer() + return docutils.core.publish_parts(plain, writer=w)['body'] -all = [Renderer, Plain, Markdown, ReStructuredText] + all.append(ReStructuredText) +except: + util.out.info('Loading renderers', 'reStructuredText not enabled.')