Last active
January 9, 2023 23:57
-
-
Save TheArcherST/544a223fd53630781a0e1f610409bbd9 to your computer and use it in GitHub Desktop.
This script python in 1C-like format. Usage: `py onecpy.py source_code.py from to`. Currently supports languages en and ru. Example command: `py onecpy.py source.py en ru`. Converts code in `source.py` from en dialect to ru.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import dataclasses | |
import re | |
import sys | |
from enum import Enum | |
from dataclass_factory import Factory | |
from functools import partial | |
import typing | |
import yaml | |
SPECIAL_SYMBOLS = r'''[\n @!-+/*=><\[\]()'".:,|%&]+''' | |
def multiple_replace(string, rep_dict: dict[str, str]): | |
for from_, to in rep_dict.items(): | |
pattern = re.compile(from_) | |
string = pattern.sub(to, string) | |
return string | |
class Flag(Enum): | |
keyword = 'keyword' | |
def apply_flag(actual: str, flag: Flag) -> str: | |
if flag is Flag.keyword: | |
actual_regex = fr'''{SPECIAL_SYMBOLS}{actual}{SPECIAL_SYMBOLS}''' | |
else: | |
raise KeyError | |
return actual_regex | |
def embed(old: typing.Union[str, re.Match], new: str): | |
if isinstance(old, re.Match): | |
old = old.string[old.start():old.end()] | |
nold = re.sub(SPECIAL_SYMBOLS, '', old) | |
result = old.replace(nold, new) | |
return result | |
@dataclasses.dataclass | |
class SyntaxEntry: | |
name: str | |
flags: list[Flag] | |
dialects: dict[str, str] | |
def get_regex(self, dialect: str): | |
result = self.dialects[dialect] | |
for i in self.flags: | |
result = apply_flag(result, i) | |
return result | |
def get_literal(self, dialect: str, old_literal: str): | |
new = self.dialects[dialect] | |
result = embed(old_literal, new) | |
return result | |
def load_syntax(filename: str) -> list[SyntaxEntry]: | |
factory = Factory() | |
with open(filename, 'r') as fs: | |
return factory.load(yaml.safe_load(fs), list[SyntaxEntry]) | |
def swap_dialect(syntax: list[SyntaxEntry], from_: str, to: str, code: str): | |
association_map = {i.get_regex(from_): partial(i.get_literal, to) for i in syntax} | |
return multiple_replace('\n' + code, association_map)[1:] | |
def main(): | |
syntax = load_syntax('syntax.yaml') | |
with open(sys.argv[1]) as fs: | |
code = fs.read() | |
code = swap_dialect(syntax, sys.argv[2], sys.argv[3], code) | |
with open(sys.argv[1], 'w') as fs: | |
fs.write(code) | |
if __name__ == '__main__': | |
main() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
- dialects: | |
en: 'False' | |
ru: Ложь | |
flags: | |
- keyword | |
name: 'False' | |
- dialects: | |
en: 'True' | |
ru: Истина | |
flags: | |
- keyword | |
name: 'True' | |
- dialects: | |
en: and | |
ru: и | |
flags: | |
- keyword | |
name: and | |
- dialects: | |
en: as | |
ru: как | |
flags: | |
- keyword | |
name: as | |
- dialects: | |
en: assert | |
ru: утвердить | |
flags: | |
- keyword | |
name: assert | |
- dialects: | |
en: async | |
ru: асинк | |
flags: | |
- keyword | |
name: async | |
- dialects: | |
en: await | |
ru: ждать | |
flags: | |
- keyword | |
name: await | |
- dialects: | |
en: break | |
ru: прервать | |
flags: | |
- keyword | |
name: break | |
- dialects: | |
en: class | |
ru: класс | |
flags: | |
- keyword | |
name: class | |
- dialects: | |
en: continue | |
ru: продолжить | |
flags: | |
- keyword | |
name: continue | |
- dialects: | |
en: def | |
ru: опр | |
flags: | |
- keyword | |
name: def | |
- dialects: | |
en: del | |
ru: удал | |
flags: | |
- keyword | |
name: del | |
- dialects: | |
en: elif | |
ru: аесли | |
flags: | |
- keyword | |
name: elif | |
- dialects: | |
en: else | |
ru: иначе | |
flags: | |
- keyword | |
name: else | |
- dialects: | |
en: except | |
ru: исключение | |
flags: | |
- keyword | |
name: except | |
- dialects: | |
en: finally | |
ru: напоследок | |
flags: | |
- keyword | |
name: finally | |
- dialects: | |
en: for | |
ru: для | |
flags: | |
- keyword | |
name: for | |
- dialects: | |
en: from | |
ru: из | |
flags: | |
- keyword | |
name: from | |
- dialects: | |
en: global | |
ru: глобал | |
flags: | |
- keyword | |
name: global | |
- dialects: | |
en: if | |
ru: если | |
flags: | |
- keyword | |
name: if | |
- dialects: | |
en: import | |
ru: импорт | |
flags: | |
- keyword | |
name: import | |
- dialects: | |
en: in | |
ru: в | |
flags: | |
- keyword | |
name: in | |
- dialects: | |
en: is | |
ru: есть | |
flags: | |
- keyword | |
name: is | |
- dialects: | |
en: lambda | |
ru: лямбда | |
flags: | |
- keyword | |
name: lambda | |
- dialects: | |
en: nonlocal | |
ru: нелокал | |
flags: | |
- keyword | |
name: nonlocal | |
- dialects: | |
en: not | |
ru: не | |
flags: | |
- keyword | |
name: not | |
- dialects: | |
en: or | |
ru: или | |
flags: | |
- keyword | |
name: or | |
- dialects: | |
en: pass | |
ru: проехали | |
flags: | |
- keyword | |
name: pass | |
- dialects: | |
en: raise | |
ru: поднять | |
flags: | |
- keyword | |
name: raise | |
- dialects: | |
en: return | |
ru: возврат | |
flags: | |
- keyword | |
name: return | |
- dialects: | |
en: try | |
ru: попытка | |
flags: | |
- keyword | |
name: try | |
- dialects: | |
en: while | |
ru: пока | |
flags: | |
- keyword | |
name: while | |
- dialects: | |
en: with | |
ru: с | |
flags: | |
- keyword | |
name: with | |
- dialects: | |
en: yield | |
ru: уступить | |
flags: | |
- keyword | |
name: yield | |
- dialects: | |
en: int | |
ru: цел | |
flags: | |
- keyword | |
name: int | |
- dialects: | |
en: str | |
ru: строка | |
flags: | |
- keyword | |
name: str | |
- dialects: | |
en: float | |
ru: рил | |
flags: | |
- keyword | |
name: float | |
- dialects: | |
en: __init__ | |
ru: __построить__ | |
flags: | |
- keyword | |
name: __init__ | |
- dialects: | |
en: __call__ | |
ru: __позвать__ | |
flags: | |
- keyword | |
name: __call__ | |
- dialects: | |
en: staticmethod | |
ru: опрстатичн | |
flags: | |
- keyword | |
name: staticmethod | |
- dialects: | |
en: classmethod | |
ru: опркласса | |
flags: | |
- keyword | |
name: classmethod | |
- dialects: | |
en: self | |
ru: текущ | |
flags: | |
- keyword | |
name: self | |
- dialects: | |
en: map | |
ru: обернуть | |
flags: | |
- keyword | |
name: map | |
- dialects: | |
en: tuple | |
ru: кортеж | |
flags: | |
- keyword | |
name: tuple | |
- dialects: | |
en: list | |
ru: список | |
flags: | |
- keyword | |
name: list | |
- dialects: | |
en: dict | |
ru: словарь | |
flags: | |
- keyword | |
name: dict | |
- dialects: | |
en: issubclass | |
ru: естьподкласс | |
flags: | |
- keyword | |
name: issubclass | |
- dialects: | |
en: isinstance | |
ru: естьэкземпляр | |
flags: | |
- keyword | |
name: isinstance | |
- dialects: | |
en: isinstance | |
ru: естьэкземпляр | |
flags: | |
- keyword | |
name: isinstance | |
- dialects: | |
en: raise | |
ru: опрокинуть | |
flags: | |
- keyword | |
name: raise | |
- dialects: | |
en: zip | |
ru: зипун | |
flags: | |
- keyword | |
name: zip | |
- dialects: | |
en: Union | |
ru: Един | |
flags: | |
- keyword | |
name: Union | |
- dialects: | |
en: None | |
ru: Ничто | |
flags: | |
- keyword | |
name: None |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment