How to add a rst directive

When using reStructuredText, its often useful to add new directives.

Official docutils directives documentation

Simple directive

This example adds a simple directive that renders its content into a HTML pre tag.

from docutils.parsers.rst import Directive
from docutils.nodes import raw

from flamingo.plugins.rst import register_directive


class Pre(Directive):
    has_content = True

    def run(self):
        return [
            raw('', '<pre>{}</pre>'.format('\n'.join(self.content)),
                format='html'),
        ]


class rstPre:
    def parser_setup(self, context):
        register_directive('pre', Pre)
.. pre::

    Lorem ipsum
<pre>Lorem ipsum</pre>

Directive with access to the context

For some applications its needed to have access to the flamingo context and its settings.

from docutils.parsers.rst import Directive
from docutils.nodes import raw

from flamingo.plugins.rst import register_directive


def pre(context):
    class Pre(Directive):
        has_content = True

        def run(self):
            return [
                raw('', '<pre>{}</pre>'.format('\n'.join(self.content)),
                    format='html'),
            ]

    return Pre


class rstPre:
    def parser_setup(self, context):
        register_directive('pre', pre(context))

Directive that allows rst syntax

Flamingos reStructuredText sub system supports inline rst syntax. This is useful if you have more complex directives.

from docutils.nodes import raw

from flamingo.plugins.rst import NestedDirective, register_directive


def div(context):
    class Div(NestedDirective):
        def run(self):
            html = self.parse_content(context)

            return [
                raw('', '<div>{}</div>'.format(html), format='html'),
            ]

    return Div


class rstDiv:
    def parser_setup(self, context):
        register_directive('div', div(context))
.. div::

    .. div::

        Hello World
        ===========
<div>
    <div>
        <h1>Hello World</h1>
    </div>
</div>