only_directives.py
93 lines
| 2.9 KiB
| text/x-python
|
PythonLexer
Fernando Perez
|
r1694 | # | ||
# A pair of directives for inserting content that will only appear in | ||||
# either html or latex. | ||||
# | ||||
from docutils.nodes import Body, Element | ||||
from docutils.writers.html4css1 import HTMLTranslator | ||||
from docutils.parsers.rst import directives | ||||
Darren Dale
|
r1926 | # The sphinx API has changed, so we try both the old and new import forms | ||
try: | ||||
from sphinx.latexwriter import LaTeXTranslator | ||||
except ImportError: | ||||
from sphinx.writers.latex import LaTeXTranslator | ||||
Fernando Perez
|
r1694 | class html_only(Body, Element): | ||
pass | ||||
class latex_only(Body, Element): | ||||
pass | ||||
def run(content, node_class, state, content_offset): | ||||
text = '\n'.join(content) | ||||
node = node_class(text) | ||||
state.nested_parse(content, content_offset, node) | ||||
return [node] | ||||
try: | ||||
from docutils.parsers.rst import Directive | ||||
except ImportError: | ||||
from docutils.parsers.rst.directives import _directives | ||||
def html_only_directive(name, arguments, options, content, lineno, | ||||
content_offset, block_text, state, state_machine): | ||||
return run(content, html_only, state, content_offset) | ||||
def latex_only_directive(name, arguments, options, content, lineno, | ||||
content_offset, block_text, state, state_machine): | ||||
return run(content, latex_only, state, content_offset) | ||||
for func in (html_only_directive, latex_only_directive): | ||||
func.content = 1 | ||||
func.options = {} | ||||
func.arguments = None | ||||
_directives['htmlonly'] = html_only_directive | ||||
_directives['latexonly'] = latex_only_directive | ||||
else: | ||||
class OnlyDirective(Directive): | ||||
has_content = True | ||||
required_arguments = 0 | ||||
optional_arguments = 0 | ||||
final_argument_whitespace = True | ||||
option_spec = {} | ||||
def run(self): | ||||
self.assert_has_content() | ||||
return run(self.content, self.node_class, | ||||
self.state, self.content_offset) | ||||
class HtmlOnlyDirective(OnlyDirective): | ||||
node_class = html_only | ||||
class LatexOnlyDirective(OnlyDirective): | ||||
node_class = latex_only | ||||
directives.register_directive('htmlonly', HtmlOnlyDirective) | ||||
directives.register_directive('latexonly', LatexOnlyDirective) | ||||
def setup(app): | ||||
app.add_node(html_only) | ||||
app.add_node(latex_only) | ||||
# Add visit/depart methods to HTML-Translator: | ||||
def visit_perform(self, node): | ||||
pass | ||||
def depart_perform(self, node): | ||||
pass | ||||
def visit_ignore(self, node): | ||||
node.children = [] | ||||
def depart_ignore(self, node): | ||||
node.children = [] | ||||
HTMLTranslator.visit_html_only = visit_perform | ||||
HTMLTranslator.depart_html_only = depart_perform | ||||
HTMLTranslator.visit_latex_only = visit_ignore | ||||
HTMLTranslator.depart_latex_only = depart_ignore | ||||
LaTeXTranslator.visit_html_only = visit_ignore | ||||
LaTeXTranslator.depart_html_only = depart_ignore | ||||
LaTeXTranslator.visit_latex_only = visit_perform | ||||
LaTeXTranslator.depart_latex_only = depart_perform | ||||