mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-07-28 15:41:02 +03:00
feat(meta-compile,meta-decompile): HE-эвристика аббревиатур в авто-синониме + регистрочувствительный авто-вывод (v1.61/v0.52)
Корень: split_camel_case слепо лоуэркейзил хвост, теряя аббревиатуры (НДС/ЕГАИС/ОС/ЭП), которые платформа сохраняет. Вскрыто py-раундтрипом на маке (АбонентыЭДО: синоним "Абоненты ЭДО" регенерился как "эдо"). Дважды замаскировано: декомпилятор опускал синоним регистронезависимо (ne_ci), харнес Compare-Object был без -CaseSensitive. Масштаб survey: 7706. Фикс (правило подтверждено эмпирически по корпусу): сохранять максимальный прогон заглавных >=2, если сразу за ним НЕ буква (пробел/цифра/спецсимвол/конец). ">=2" ловит ОС/ЭП; граница "не буква" отсекает предлоги (РасчетыСКлиентами->склиентами) и бренды (ЮКасса). - Компилятор Split-CamelCase -> HE (ps1+py), радиус = авто-синонимы + авто-описания предопределённых. - Декомпилятор Split-CamelWords -> HE (зеркало) + регистрочувствительная страховка (-ne->-cne / ne_ci->ne_cs) в 9 точках: кастом-синонимы (ВетИС/МИР) эмитятся дословно. Валидация 8.3.24 (1765): синонимы/описания закрыты полностью, ноль case-диффов. Декомпилятор ps1==py 189/189. Регресс 511/511 ps+py. spec §2. Снэпшоты meta-compile — казинг аббревиатур. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
4ca89343ae
commit
706cc919a2
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# meta-compile v1.60 — Compile 1C metadata object from JSON
|
||||
# meta-compile v1.61 — Compile 1C metadata object from JSON
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
|
||||
import argparse
|
||||
@@ -233,8 +233,36 @@ def split_camel_case(name):
|
||||
return name
|
||||
result = re.sub(r'([а-яё])([А-ЯЁ])', r'\1 \2', name)
|
||||
result = re.sub(r'([a-z])([A-Z])', r'\1 \2', result)
|
||||
# Лоуэркейзим хвост, СОХРАНЯЯ аббревиатуры (зеркало эвристики платформы): максимальный прогон
|
||||
# заглавных длиной >=2, если сразу за ним НЕ буква (пробел/цифра/спецсимвол/конец) — остаётся заглавным
|
||||
# (НДС, ЕГАИС, ОС, ЭП). Прилипшие предлоги (СКлиентами)/бренды (ЮКасса) идут перед буквой → лоуэркейз.
|
||||
# Первый символ строки — как есть.
|
||||
if len(result) > 1:
|
||||
result = result[0] + result[1:].lower()
|
||||
chars = list(result)
|
||||
n = len(chars)
|
||||
keep = [False] * n
|
||||
i = 0
|
||||
while i < n:
|
||||
if chars[i].isupper():
|
||||
j = i
|
||||
while j < n and chars[j].isupper():
|
||||
j += 1
|
||||
after_boundary = (j == n) or (not chars[j].isalpha())
|
||||
if j - i >= 2 and after_boundary:
|
||||
for k in range(i, j):
|
||||
keep[k] = True
|
||||
i = j
|
||||
else:
|
||||
i += 1
|
||||
out = []
|
||||
for idx, c in enumerate(chars):
|
||||
if idx == 0 or keep[idx]:
|
||||
out.append(c)
|
||||
elif c.isupper():
|
||||
out.append(c.lower())
|
||||
else:
|
||||
out.append(c)
|
||||
result = ''.join(out)
|
||||
return result
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user