Source code for innoconv_mintmod.mintmod_filter.environments

r"""
Handle mintmod LaTeX environments.

.. note::
    Provide a ``handle_ENVNAME`` function for handling ``ENVNAME`` environment.
    You need to `slugify <https://github.com/un33k/python-slugify>`_ the
    environment name.

    Example: ``handle_mxcontent`` method will receive the
    ``\begin{MXContent}…\end{MXContent}`` environment.
"""

from innoconv_mintmod.constants import (
    ELEMENT_CLASSES, REGEX_PATTERNS, TRANSLATIONS)
from innoconv_mintmod.mintmod_filter.elements import (
    create_content_box, create_header)
from innoconv_mintmod.utils import parse_fragment, extract_identifier


[docs]class Environments(): r"""Handlers for environments are defined here. Given the environment: .. code-block:: latex \begin{MXContent}{Foo title long}{Foo title}{STD} Foo content \end{MXContent} The handler method ``handle_mxcontent`` receives the following arguments: .. hlist:: :columns: 1 * ``elem_content``: ``'Foo content'`` * ``cmd_args``: ``['Foo title long', 'Foo title', 'STD']`` * ``elem``: :class:`panflute.elements.RawBlock` """ # pylint: disable=unused-argument,no-self-use
[docs] def handle_msectionstart(self, elem_content, env_args, elem): r"""Handle ``\MSectionStart`` environment."""
return parse_fragment(elem_content)
[docs] def handle_mxcontent(self, elem_content, env_args, elem): r"""Handle ``\MXContent`` environment.""" content = parse_fragment(elem_content) header = create_header(env_args[0], elem.doc, level=3) content, identifier = extract_identifier(content) if identifier: header.identifier = identifier content.insert(0, header)
return content
[docs] def handle_mcontent(self, elem_content, env_args, elem): r"""Handle ``\MContent`` environment."""
return parse_fragment(elem_content)
[docs] def handle_mintro(self, elem_content, env_args, elem): r"""Handle ``\MIntro`` environment.""" content = parse_fragment(elem_content) lang = elem.doc.metadata['lang'].text header = create_header( TRANSLATIONS['introduction'][lang], elem.doc, level=3) # pylint: disable=no-member header.classes.extend(ELEMENT_CLASSES['MINTRO']) content.insert(0, header)
return content ########################################################################### # Exercises
[docs] def handle_mexercises(self, elem_content, env_args, elem): r"""Handle ``\MExercises`` environment."""
return create_content_box(elem_content, ELEMENT_CLASSES['MEXERCISES'])
[docs] def handle_mexercisecollection(self, elem_content, env_args, elem): r"""Handle ``\MExerciseCollection`` environment."""
return create_content_box(elem_content, ELEMENT_CLASSES['MEXERCISES'])
[docs] def handle_mexercise(self, elem_content, env_args, elem): r"""Handle ``\MExercise`` environment."""
return create_content_box(elem_content, ELEMENT_CLASSES['MEXERCISE'])
[docs] def handle_mexerciseitems(self, elem_content, env_args, elem): r"""Handle ``\MExerciseitems`` environments by returning an ordered list containing the ``\item`` s defined in the environment. This is needed on top of handle_itemize as there are also mexerciseitems environments outside itemize environments."""
return self._replace_mexerciseitems(elem)
[docs] def handle_mquestiongroup(self, elem_content, env_args, elem): r"""Handle ``\MQuestionGroup`` environments. That are used to group together exercises, in order to allow synchronous validation. Especially used in checkbox grids. In mintmod, a button is also rendered below the contained exercises in the group. This function just returns a div with a class, in order to leave the validation logic, to client scripts""" return create_content_box( elem_content, ELEMENT_CLASSES['MQUESTIONGROUP']
) ###########################################################################
[docs] def handle_itemize(self, elem_content, env_args, elem): r"""Handle itemize environments, that were not correctly recognized by pandoc. This e.g. happens if there are ``\MExerciseItems`` environments contained in the items."""
return self._replace_mexerciseitems(elem)
[docs] def handle_minfo(self, elem_content, env_args, elem): r"""Handle ``\MInfo`` environment."""
return create_content_box(elem_content, ELEMENT_CLASSES['MINFO'])
[docs] def handle_mxinfo(self, elem_content, env_args, elem): r"""Handle ``\MXInfo`` environment.""" div = create_content_box(elem_content, ELEMENT_CLASSES['MINFO']) header = create_header(env_args[0], elem.doc, level=4, parse_text=True) div.content.insert(0, header)
return div
[docs] def handle_mexperiment(self, elem_content, env_args, elem): r"""Handle ``\MExperiment`` environment."""
return create_content_box(elem_content, ELEMENT_CLASSES['MEXPERIMENT'])
[docs] def handle_mexample(self, elem_content, env_args, elem): r"""Handle ``\MExample`` command."""
return create_content_box(elem_content, ELEMENT_CLASSES['MEXAMPLE'])
[docs] def handle_mhint(self, elem_content, env_args, elem): r"""Handle ``\MHint`` command."""
return create_content_box(elem_content, ELEMENT_CLASSES['MHINT'])
[docs] def handle_mtest(self, elem_content, env_args, elem): r"""Handle ``\MTest`` environment.""" div = create_content_box(elem_content, ELEMENT_CLASSES['MTEST']) # remove reference to section title = REGEX_PATTERNS['FIX_MTEST'].sub('', env_args[0]) header = create_header(title, elem.doc, level=3) content, identifier = extract_identifier(div.content) if identifier: div.content = content header.identifier = identifier div.content.insert(0, header)
return div
[docs] def handle_mcoshzusatz(self, elem_content, env_args, elem): r"""Handle ``\MCOSHZusatz`` environment."""
return create_content_box(elem_content, ELEMENT_CLASSES['MCOSHZUSATZ'])
[docs] def handle_html(self, elem_content, env_args, elem): r"""Handle ``\html`` environment."""
return parse_fragment(elem_content, from_format='html') def _replace_mexerciseitems(self, elem): r"""Helper function to replace `MExerciseItems` with enumerate in elem text and return the pandoc output of the parsed altered element.""" elem.text = elem.text.replace('\\begin{MExerciseItems}', '\\begin{enumerate}') elem.text = elem.text.replace('\\end{MExerciseItems}', '\\end{enumerate}')
return parse_fragment(elem.text)