fix(mxl-decompile): абсолютный OutputPath + общий сериализатор декомпиляторов

Безусловная склейка OutputPath с текущим каталогом давала "C:\cwd\C:\out.json" и
роняла запись сообщением про формат пути — навык не умел писать по абсолютному
пути вообще. Py-порт этот случай обрабатывал, ps1 нет. Приведено к общей идиоме
репозитория; кейс на абсолютный путь падает без правки и проходит с ней.

Кейс заодно вскрыл, что порты пишут РАЗНЫЙ JSON: ps1 отдавал стиль ConvertTo-Json
из PS 5.1 (выравнивание ключей, \uXXXX вместо кириллицы), py — json.dumps(indent=2).
Один и тот же макет давал 4708 байт против 1744. Не всплывало потому, что ни один
кейс не снимал сам JSON — все проверяли только stdout.

mxl-decompile был единственным декомпилятором мимо общего сериализатора: у
form/meta/skd-decompile для этого свой ConvertTo-CompactJson. Перенесён вариант
skd-decompile как самый полный, py дополнительно переведён на newline='' —
как у соседей. Теперь порты совпадают байт в байт, а decompile→compile даёт
исходный XML байт в байт.

Семья заведена в check-inline-drift.mjs (4 функции, 3 варианта): раньше шесть
копий жили вообще без гарда. В form-decompile переименована локальная переменная
в string-literal — копии различались только ею.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-10 13:35:50 +03:00
co-authored by Claude Opus 5
parent f33436adff
commit ccbbecbcf2
8 changed files with 387 additions and 27 deletions
@@ -1,4 +1,4 @@
# form-decompile v0.148 — Decompile 1C managed Form.xml to JSON DSL (draft)
# form-decompile v0.149 — Decompile 1C managed Form.xml to JSON DSL (draft)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
param(
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# form-decompile v0.148 — Decompile 1C managed Form.xml to JSON DSL (draft)
# form-decompile v0.149 — Decompile 1C managed Form.xml to JSON DSL (draft)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
#
@@ -103,29 +103,29 @@ def _attr(node, name, ns_uri=None):
def convert_string_to_json_literal(s):
if s is None:
return 'null'
sb = ['"']
out = ['"']
for ch in s:
code = ord(ch)
if code == 0x22:
sb.append('\\"')
out.append('\\"')
elif code == 0x5C:
sb.append('\\\\')
out.append('\\\\')
elif code == 0x08:
sb.append('\\b')
out.append('\\b')
elif code == 0x09:
sb.append('\\t')
out.append('\\t')
elif code == 0x0A:
sb.append('\\n')
out.append('\\n')
elif code == 0x0C:
sb.append('\\f')
out.append('\\f')
elif code == 0x0D:
sb.append('\\r')
out.append('\\r')
elif code < 0x20:
sb.append('\\u%04x' % code)
out.append('\\u%04x' % code)
else:
sb.append(ch)
sb.append('"')
return ''.join(sb)
out.append(ch)
out.append('"')
return ''.join(out)
def _num_to_str(obj):