The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
from docutils.parsers.rst import Directive, directives
from docutils import nodes
from sphinx.locale import _
from sphinx.util.compat import Directive, make_admonition
from sphinx import addnodes

class MongoDBNode(Directive):
    """
    An custom admonition for the MongoDB Manual.
    """
    has_content = True
    required_arguments = 0
    optional_arguments = 1
    final_argument_whitespace = True
    option_spec = {}
    is_seealso = False
    is_related = False

    def run(self):
        if self.is_seealso:
            ret = make_admonition(addnodes.seealso, self.name, [_('See')], self.options,
                                  self.content, self.lineno, self.content_offset, self.block_text,
                                  self.state, self.state_machine)
        elif self.is_related:
            ret = make_admonition(addnodes.seealso, self.name, [_('Related')], self.options,
                                  self.content, self.lineno, self.content_offset, self.block_text,
                                  self.state, self.state_machine)
        else:
            ret = make_admonition(optional_node, self.name, self.directive_name, self.options,
                                  self.content, self.lineno, self.content_offset,
                                  self.block_text, self.state, self.state_machine)

        if self.arguments:
            argnodes, msgs = self.state.inline_text(self.arguments[0],
                                                    self.lineno)
            para = nodes.paragraph()
            para += argnodes
            para += msgs
            ret[0].insert(1, para)
        return ret

def visit_mongodb_node(self, node):
    self.visit_admonition(node)

def depart_mongodb_node(self, node):
    self.depart_admonition(node)

def mongodb_add_node(app, type):
    app.add_node(type,
                 html=(visit_mongodb_node, depart_mongodb_node),
                 latex=(visit_mongodb_node, depart_mongodb_node),
                 text=(visit_mongodb_node, depart_mongodb_node),
                 man=(visit_mongodb_node, depart_mongodb_node),
                 texinfo=(visit_mongodb_node, depart_mongodb_node))

################################################################################

class optional_node(nodes.Admonition, nodes.Element): pass

class example_node(nodes.Admonition, nodes.Element): pass

class Optional(MongoDBNode):
    directive_name = ["Optional"]

class Example(MongoDBNode):
    directive_name = ["Example"]

class See(MongoDBNode):
    is_seealso = True
    directive_name = ["See"]

class Related(MongoDBNode):
    is_related = True
    directive_name = ["Related"]

def setup(app):
    app.add_directive('optional', Optional)
    app.add_directive('see', See)
    app.add_directive('related', Related)
    app.add_directive('example', Example)

    mongodb_add_node(app, optional_node)
    mongodb_add_node(app, example_node)