Skip to content

Instantly share code, notes, and snippets.

@TheArcherST
Last active January 9, 2023 23:57
Show Gist options
  • Save TheArcherST/544a223fd53630781a0e1f610409bbd9 to your computer and use it in GitHub Desktop.
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.
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()
- 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