diff --git a/sphinxcontrib/proof/__init__.py b/sphinxcontrib/proof/__init__.py index 499a326..131b8d2 100644 --- a/sphinxcontrib/proof/__init__.py +++ b/sphinxcontrib/proof/__init__.py @@ -17,8 +17,7 @@ import logging import os - -import jinja2 +import types from docutils import nodes from docutils.nodes import make_id @@ -52,15 +51,6 @@ PROOF_HTML_NONUMBERS = ["proof"] -PROOF_HTML_TITLE_TEMPLATE = u""" -
- {{ thmtype }} {% if number %}{{number}}{% endif %} - {% if title %} - ({{ title }}) - {% endif %} -
-""" - ################################################################################ # Docutils @@ -85,6 +75,12 @@ class NumberedStatementNode(_StatementNode): numbered = True +class MetaNumberedStatementNode(type): + def __new__(metacls, name, bases, attrs, **more): + attrs.update({"thmtype": more["thmtype"]}) + return super().__new__(metacls, name, bases, attrs) + + class UnnumberedStatementNode(_StatementNode): """Statement without number. @@ -120,7 +116,7 @@ def run(self): if thmtype in env.config.proof_html_nonumbers: node = UnnumberedStatementNode("\n".join(self.content)) else: - node = NumberedStatementNode("\n".join(self.content)) + node = env.app.proof_statement_nodes[thmtype]("\n".join(self.content)) node["thmtype"] = thmtype if self.arguments: node["title"] = self.arguments[0] @@ -144,21 +140,7 @@ class ProofDomain(StandardDomain): ################################################################################ # HTML def html_visit_statement_node(self, node): - """Enter :class:`_StatementNode` in HTML builder.""" - - def get_fignumber(): - # Copied from the sphinx project: sphinx.writers.html.HTMLTranslator.add_fignumber() - if not isinstance(node, NumberedStatementNode): - return "" - figure_id = node["ids"][0] - if self.builder.name == "singlehtml": - key = u"%s/%s" % (self.docnames[-1], "proof") - else: - key = "proof" - if figure_id in self.builder.fignumbers.get(key, {}): - return ".".join(map(str, self.builder.fignumbers[key][figure_id])) - return "" - + """Enter :class:`StatementNode` in HTML builder.""" config = self.builder.env.config thmtypes = config.proof_theorem_types thmtype = node["thmtype"] @@ -166,13 +148,20 @@ def get_fignumber(): self.body.append( self.starttag(node, "div", CLASS="proof proof-type-{}".format(thmtype)) ) - self.body.append( - jinja2.Template(self.builder.config.proof_html_title_template).render( - number=get_fignumber(), - thmtype=thmtypes[node["thmtype"]], - title=node.get("title", None), + self.body.append("""
""") + if config.numfig and node.numbered: + self.add_fignumber(node) + else: + self.body.append( + """{}""".format( + config.proof_theorem_types[thmtype] + ) ) - ) + if "title" in node: + self.body.append( + """({})""".format(node["title"]) + ) + self.body.append("""
""") def html_depart_statement_node(self, node): @@ -286,21 +275,28 @@ def setup(app): app.add_stylesheet("proof.css") app.add_javascript("proof.js") - app.add_config_value("proof_html_title_template", PROOF_HTML_TITLE_TEMPLATE, "env") app.add_config_value("proof_html_nonumbers", PROOF_HTML_NONUMBERS, "env") app.add_config_value("proof_latex_main", "theorem", "env") app.add_config_value("proof_latex_notheorem", [], "env") app.add_config_value("proof_latex_parent", None, "env") app.add_config_value("proof_theorem_types", PROOF_THEOREM_TYPES, "env") - app.add_enumerable_node( - NumberedStatementNode, - "proof", - title_getter, - html=(html_visit_statement_node, html_depart_statement_node), - singlehtml=(html_visit_statement_node, html_depart_statement_node), - latex=(latex_visit_statement_node, latex_depart_statement_node), - ) + app.proof_statement_nodes = {} + for thmtype in app.config.proof_theorem_types: + CustomNumberedStatementNode = types.new_class( + "{}StatementNode".format(thmtype.capitalize()), + (NumberedStatementNode,), + {"metaclass": MetaNumberedStatementNode, "thmtype": thmtype}, + ) + app.proof_statement_nodes[thmtype] = CustomNumberedStatementNode + app.add_enumerable_node( + CustomNumberedStatementNode, + "proof:{}".format(thmtype), + title_getter, + html=(html_visit_statement_node, html_depart_statement_node), + singlehtml=(html_visit_statement_node, html_depart_statement_node), + latex=(latex_visit_statement_node, latex_depart_statement_node), + ) app.add_node( UnnumberedStatementNode, html=(html_visit_statement_node, html_depart_statement_node),