From 5620dc6fad13e1d940539d65883448f9759cb889 Mon Sep 17 00:00:00 2001 From: Dan Frank Date: Wed, 18 Apr 2018 15:53:04 -0700 Subject: [PATCH] adding renderers --- omniduct/renderers/__init__.py | 0 omniduct/renderers/base.py | 37 ++++++++++++++++++++++++++++++++++ omniduct/renderers/jinja.py | 10 +++++++++ omniduct/renderers/md.py | 20 ++++++++++++++++++ 4 files changed, 67 insertions(+) create mode 100644 omniduct/renderers/__init__.py create mode 100644 omniduct/renderers/base.py create mode 100644 omniduct/renderers/jinja.py create mode 100644 omniduct/renderers/md.py diff --git a/omniduct/renderers/__init__.py b/omniduct/renderers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/omniduct/renderers/base.py b/omniduct/renderers/base.py new file mode 100644 index 0000000..c67eae7 --- /dev/null +++ b/omniduct/renderers/base.py @@ -0,0 +1,37 @@ +from abc import abstractmethod +from omniduct.utils.magics import MagicsProvider, process_line_arguments, process_line_cell_arguments + + +class BaseRenderer(MagicsProvider): + + @abstractmethod + def render_template(self, statement): + pass + + def _register_magics(self, base_name): + """ + The following magic functions will be registered (assuming that + the base name is chosen to be 'hive'): + - Cell Magics: + - `%%html`: For querying the database. + - Line Magics: + - `%hive`: For querying the database using a named template. + + Documentation for these magics is provided online. + """ + from IPython.core.magic import register_cell_magic + + def template_render_magic(template, context=None, **kwargs): + + ip = get_ipython() + + if context is None: + context = ip.user_ns + + return self.render_template(template, context) + + + @register_cell_magic(base_name) + @process_line_cell_arguments + def render_magic(*args, **kwargs): + return template_render_magic(*args, **kwargs) diff --git a/omniduct/renderers/jinja.py b/omniduct/renderers/jinja.py new file mode 100644 index 0000000..896e09b --- /dev/null +++ b/omniduct/renderers/jinja.py @@ -0,0 +1,10 @@ +from .base import BaseRenderer +from jinja2 import Template + + +class JinjaRenderer(BaseRenderer): + + name = 'jinja' + + def render_template(self, template, context=None, **kwargs): + return Template(template).render(**context) diff --git a/omniduct/renderers/md.py b/omniduct/renderers/md.py new file mode 100644 index 0000000..3093878 --- /dev/null +++ b/omniduct/renderers/md.py @@ -0,0 +1,20 @@ +from .base import BaseRenderer +from jinja2 import Template +import markdown + + +class MdRepr(object): + + def __init__(self, rendered): + self.html = markdown.markdown(rendered) + + def _repr_html_(self): + return self.html + + +class MdRenderer(BaseRenderer): + + name = 'md' + + def render_template(self, template, context=None, **kwargs): + return MdRepr(Template(template).render(**context))