-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtechdict.py
More file actions
149 lines (127 loc) · 10.1 KB
/
Copy pathtechdict.py
File metadata and controls
149 lines (127 loc) · 10.1 KB
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
"""Технические термины: как их слышно и как их пишут.
Зачем это и есть ответ на «чем давить конкурентов в вайб-кодинге».
Соседи понимают под этим вставку текста в редактор кода - но вставлять мы и так
умеем, это обычная диктовка. Настоящая беда другая, и она вылезает с первой же
фразы: модель обучена на обычной русской речи, и «сделай пул реквест в гитхабе»
она честно пишет словами. В задаче для ИИ-помощника это выглядит так, будто её
писал человек, впервые услышавший про программирование.
было: «поправь джейсон в конфиге и запушь в гитхаб»
стало: «поправь JSON в конфиге и запушь в GitHub»
Механика уже есть - это словарь замен из cleaner.py. Не хватало только
наполнения: заводить полторы сотни терминов руками никто не станет. Здесь они
готовым списком, включается одной галочкой.
Что сюда НЕ попадает:
- слова, которые бывают обычными: «дуб» (dub), «лук» (look), «пост», «сеть»;
- короткие: «ci», «go», «vue» - на них словарь и так не срабатывает, а риск
подменить обычное слово высок;
- всё, в чём мы не уверены. Не поправить термин - полбеды, испортить обычное
слово - потеря текста, и это правило здесь то же, что и везде.
"""
# Слышится -> пишется. Ключи строчными: сверка идёт по нижнему регистру.
TERMS: dict[str, str] = {
# Языки и среды
"джаваскрипт": "JavaScript", "джава скрипт": "JavaScript",
"тайпскрипт": "TypeScript", "тайп скрипт": "TypeScript",
"питон": "Python", "пайтон": "Python",
"джава": "Java", "котлин": "Kotlin", "свифт": "Swift",
"раст": "Rust", "голанг": "Golang", "шарп": "C#",
"реакт": "React", "ангуляр": "Angular", "вью джиэс": "Vue.js",
"нест": "NestJS", "некст": "Next.js", "нода": "Node.js", "ноде": "Node.js",
"джанго": "Django", "фласк": "Flask", "фастапи": "FastAPI",
"тайлвинд": "Tailwind", "вебпак": "Webpack", "вайт": "Vite",
# Данные и форматы
"джейсон": "JSON", "жсон": "JSON", "яамл": "YAML", "ямл": "YAML",
"эйчтимиэль": "HTML", "цээсэс": "CSS", "эсквиэль": "SQL",
"постгрес": "PostgreSQL", "постгрескл": "PostgreSQL",
"монго": "MongoDB", "редис": "Redis", "склайт": "SQLite",
"эндпоинт": "endpoint", "вебхук": "webhook",
# Гит и совместная работа
"гитхаб": "GitHub", "гит хаб": "GitHub", "гитлаб": "GitLab",
"пул реквест": "pull request", "пулреквест": "pull request",
"мёрж реквест": "merge request",
"мёрдж": "merge", "мёрж": "merge", "ребейз": "rebase",
"чекаут": "checkout", "стеш": "stash",
"бранч": "branch", "форк": "fork",
# Инфраструктура
"докер": "Docker", "кубернетес": "Kubernetes", "кубернетис": "Kubernetes",
"нгинкс": "nginx", "энджиникс": "nginx",
"линукс": "Linux", "убунту": "Ubuntu", "дебиан": "Debian",
"терраформ": "Terraform", "ансибл": "Ansible",
"джиэйчэй": "GitHub Actions",
# Разработка
"рефакторинг": "рефакторинг", # уже по-русски, но фиксируем форму
"деплой": "деплой", "коммит": "коммит",
"линтер": "линтер", "мидлвар": "middleware",
"рест апи": "REST API", "апи": "API", "эй пи ай": "API",
"юай": "UI", "юикс": "UX", "сдк": "SDK", "айди": "ID",
"юрл": "URL", "юртиэль": "URL", "хттп": "HTTP", "хттпс": "HTTPS",
"джвт": "JWT", "оаус": "OAuth", "оаз": "OAuth",
"кэш": "кэш", "бэкенд": "бэкенд", "фронтенд": "фронтенд",
"фулстек": "фулстек", "девопс": "DevOps",
# ИИ
"промпт": "промпт", "промт": "промпт",
"лэлэм": "LLM", "эмбеддинг": "эмбеддинг", "токен": "токен",
"файнтюнинг": "дообучение", "инференс": "инференс",
"опенэйай": "OpenAI", "антропик": "Anthropic",
"гптшка": "GPT", "чатгпт": "ChatGPT", "клод": "Claude",
"хагинфейс": "Hugging Face", "хаггинг фейс": "Hugging Face",
}
def merge_into(snippets) -> dict:
"""Добавить термины к подстановкам человека, не трогая его собственные.
Подстановки хранятся словарём «сказать -> вставить» (см. _apply_snippets),
поэтому и здесь словарь. Его записи главнее: если он уже завёл «апи» на
что-то своё, мы молчим.
"""
out = dict(snippets or {})
for say, put in TERMS.items():
if say not in {k.lower() for k in out}:
out[say] = put
return out
def strip_from(snippets) -> dict:
"""Убрать наши термины, оставив собственные записи человека.
Сверяем и ключ, и значение: если человек переопределил «апи» на своё,
запись наша только по названию, и удалять её нельзя.
"""
return {k: v for k, v in (snippets or {}).items()
if not (k.lower() in TERMS and v == TERMS[k.lower()])}
# ---------------------------------------------------------------------------
# Готовые подстановки-заготовки: «моя почта», «подпись» и прочее частое.
#
# Родня техтерминам выше, а не отдельная затея, и потому живут в одном файле:
# и то и другое - готовый набор, который по одному нажатию падает в те же
# config.snippets, что и подстановки человека (см. settings_qt.setSnippetPreset).
# Механику копируем у setTechTerms, второго хранилища не заводим.
#
# Разница с терминами - в наполнении. Термин знает, что на что менять
# («джейсон» -> JSON). Заготовка задаёт только ЛЕВУЮ часть - фразу, - а правую
# («put») человек вписывает сам: свою почту, телефон, реквизиты у всех разные,
# угадать их нельзя. Поэтому у пятёрки «впиши сам» put пустой.
#
# Часть заготовок идёт с ГОТОВЫМ значением через переменные cleaner._fill_vars
# ({дата}, {дата-словами}, {время}, {день-недели}) - их вписывать не надо, они
# сами подставят дату или время в момент вставки. Фразы для них выбраны так,
# чтобы не совпасть с голосовыми командами cleaner (_CMD_DATE «сегодняшняя
# дата», _CMD_TIME «текущее время»), иначе одно и то же делалось бы дважды.
#
# id - как у готовых преобразований (transforms.PRESETS): включённые заготовки
# помечаются им в config.snippets_presets_on, и по этому списку блок «Готовые»
# знает, что показать включённым, а таблица «Подстановки» - какие фразы не
# дублировать. Список - данными, как TERMS: держать его разметкой в QML значило
# бы прятать набор в файле вёрстки, где его не видят ни тесты, ни код.
PRESETS: list[dict] = [
# Пустая правая часть - человек включает и вписывает своё.
{"id": "email", "say": "моя почта", "put": ""},
{"id": "phone", "say": "мой телефон", "put": ""},
{"id": "address", "say": "мой адрес", "put": ""},
{"id": "signature", "say": "подпись", "put": ""},
{"id": "details", "say": "реквизиты", "put": ""},
# С готовым значением через переменные - вписывать не надо.
{"id": "sign_date", "say": "подпись с датой", "put": "С уважением,\n{дата}"},
{"id": "today", "say": "сегодня число", "put": "{дата-словами}"},
{"id": "weekday", "say": "день недели", "put": "{день-недели}"},
{"id": "time_now", "say": "время сейчас", "put": "{время}"},
]
def preset(pid: str):
"""Заготовка по id или None. Имя короткое: зовётся из settings_qt рядом с
PRESETS, длиннее было бы шумом."""
return next((p for p in PRESETS if p["id"] == pid), None)