1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
import logging
from more_itertools import split_when
logger = logging.getLogger(__name__)
RESERVED_CONTROLLER_NAMES = {
"on_server_start",
"on_server_bind",
"on_server_ready",
"on_client_connected",
"on_client_exited",
"on_server_exited",
"on_server_reload",
}
JS_DELIMITOR = {
"'",
'"',
":",
";",
"(",
")",
"{",
"}",
" ",
".",
",",
"!",
"[",
"]",
"`",
"\n",
"+",
"*",
"/",
"-",
"|",
"&",
}
def js_tokenizer(a, b):
return a in JS_DELIMITOR or b in JS_DELIMITOR
def vue_template_tokenizer(a, b):
return a == b and a in {"{", "}"}
def is_name_reserved(name):
if name.startswith("trame__"):
return True
if name in RESERVED_CONTROLLER_NAMES:
return True
return False
class Translator:
"""Helper for mapping or namespacing names for state or controller"""
def __init__(self, prefix=None):
logger.info("Translator(prefix=%s)", prefix)
self._prefix = prefix
self._transl = {}
def set_prefix(self, prefix):
self._prefix = prefix
def add_translation(self, key, translated_key):
self._transl[key] = translated_key
def translate_key(self, key):
# Reserved keys
if is_name_reserved(key):
return key
if key in self._transl:
return self._transl[key]
if self._prefix:
return f"{self._prefix}{key}"
return key
def translate_list(self, key_list):
return [self.translate_key(v) for v in key_list]
def translate_dict(self, key_dict):
return {self.translate_key(k): v for k, v in key_dict.items()}
def translate_js_expression(self, state, expression):
tokens = []
for token in split_when(expression, js_tokenizer):
token_str = "".join(token)
logger.info("(prefix=%s) token %s", self._prefix, token_str)
if state.has(token_str):
_token = self.translate_key(token_str)
logger.info("(prefix=%s) translated %s", self._prefix, _token)
tokens.append(_token)
else:
tokens.append(token_str)
logger.info(" => %s", "".join(tokens))
return "".join(tokens)
def translate_vue_templating(self, state, expression):
tokens = []
for token in split_when(expression, vue_template_tokenizer):
token_str = "".join(token)
logger.info(" token %s", token_str)
if token_str.startswith("{"):
tokens.append(self.translate_js_expression(state, token_str))
else:
tokens.append(token_str)
return "".join(tokens)
def __call__(self, key):
return self.translate_key(key)
|