Source code for mau.parsers.preprocess_variables_parser
from mau.lexers.base_lexer import Token, TokenTypes
from mau.lexers.preprocess_variables_lexer import PreprocessVariablesLexer
from mau.parsers.base_parser import BaseParser, parser
from mau.parsers.nodes import TextNode
[docs]class PreprocessError(ValueError):
pass
[docs]class PreprocessVariablesParser(BaseParser):
def __init__(self, variables=None):
super().__init__()
self.lexer = PreprocessVariablesLexer()
self._text = []
self.variables = variables or {}
@parser
def _parse_verbatim(self):
self.get_token(TokenTypes.LITERAL, "`")
text = self.collect_join(
[Token(TokenTypes.LITERAL, "`"), Token(TokenTypes.EOF)],
preserve_escaped_stop_tokens=True,
)
self.get_token(TokenTypes.LITERAL, "`")
text = f"`{text}`"
self._save(TextNode(text))
@parser
def _parse_escaped_char(self):
self.get_token(TokenTypes.LITERAL, "\\")
char = self.get_token().value
if char not in "{}":
char = f"\\{char}"
self._save(TextNode(char))
@parser
def _parse_curly(self):
variable_name = []
self.get_token(TokenTypes.LITERAL, "{")
variable_name = self.collect_join(
[Token(TokenTypes.LITERAL, "}"), Token(TokenTypes.EOF)]
)
self.get_token(TokenTypes.LITERAL, "}")
try:
if "." not in variable_name:
variable_value = self.variables[variable_name]
else:
namespace, variable_name = variable_name.split(".")
variable_value = self.variables[namespace][variable_name]
self._save(TextNode(variable_value))
except KeyError:
raise PreprocessError(f'Attribute "{variable_name}" has not been defined')
@parser
def _parse_pass(self):
self._save(TextNode(self.get_token().value))
def _parse_functions(self):
return [
self._parse_escaped_char,
self._parse_verbatim,
self._parse_curly,
self._parse_pass,
]
[docs] def parse(self):
super().parse()
text = "".join([str(i.value) for i in self.nodes])
self.nodes = [TextNode(text)]