Source code for sphinxcontrib.eval.utils
"""Utilities
============
"""
import re
from typing import Callable
from docutils.nodes import document
from sphinx.parsers import Parser
[docs]
def get_lang_map(
template: str,
eval_funcs: dict[str, Callable[[str], str]],
) -> dict[str, tuple[re.Pattern, Callable[[str], str]]]:
"""Get lang map.
:param template:
:type template: str
:param eval_funcs:
:type eval_funcs: dict[str, Callable[[str], str]]
:rtype: dict[str, tuple[re.Pattern, Callable[[str], str]]]
"""
lang_map = {}
for lang, eval_func in eval_funcs.items():
string = template.replace("LANG", lang)
pat = re.compile(string, re.M | re.DOTALL)
lang_map[lang] = (pat, eval_func)
return lang_map
[docs]
def replace(
inputstring: str, pat: re.Pattern, eval_func: Callable[[str], str]
) -> str:
"""Replace.
:param inputstring:
:type inputstring: str
:param pat:
:type pat: re.Pattern
:param eval_func:
:type eval_func: Callable[[str], str]
:rtype: str
"""
outputstring = inputstring
for m in pat.finditer(inputstring):
input = m.group(1)
output = eval_func(input)
b, e = m.span()
outputstring = outputstring.replace(inputstring[b:e], output)
return outputstring
[docs]
def patch_parser(template: str, parser: type[Parser]) -> type[Parser]:
"""Patch parser.
:param template:
:type template: str
:param parser:
:type parser: Type[Parser]
:rtype: Type[Parser]
"""
class subparser(parser):
"""subparser."""
lang_map = None
def parse(self, inputstring: str, document: document) -> None:
"""parse.
:param inputstring:
:type inputstring: str
:param document:
:type document: document
:rtype: None
"""
if not self.lang_map:
self.lang_map = get_lang_map(
template, self.env.app.config.eval_funcs
)
for pat, eval_func in self.lang_map.values():
inputstring = replace(inputstring, pat, eval_func)
super().parse(inputstring, document)
return subparser