mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-08-08 20:43:21 +03:00
fix(19 навыков): единая финализация XML — стиль исходника и корректный CDATA (#57)
Три остатка волны #57, все в одной точке — блоке записи XML. 1. Порты расходились по EOL. PS гонял документ через XmlWriter с дефолтным NewLineHandling.Replace и принудительно переводил весь файл в CRLF, а py сохранял стиль исходника: role-compile на LF-ном Configuration.xml давал 10311 байт против 10062. Ещё в пяти навыках None стоял, но финальной нормализации не было, и на LF-исходнике выходил смешанный EOL (meta-edit: 40 CRLF + 136 одиночных LF) — та же форма, что у исходного дефекта #57. Приведено к форме cf-edit.ps1: None + канонизация к LF + целевой перевод строки (стиль файла-назначения, для создаваемого файла — канон CRLF). Replace не годится как замена: он превращает переводы строк внутри значений атрибутов в . 2. Гард `if (-notmatch CDATA)` не обрабатывал CDATA, а отказывался от канона во всём файле — то есть деградировал до «не сделал ничего». Заменён альтернацией: участки CDATA и комментариев возвращаются как есть, замена идёт только вне них. На реальных данных поведение не меняется — в корпусе из 476 942 XML нет ни одного CDATA и ни одного комментария. 3. py: три реализации одного правила детекта EOL сведены к одной. Мажоритарное правило в role-compile/subsystem-compile давало ДРУГОЙ ответ на смешанном входе. Дефолты _finalize_xml_bytes для нового файла приведены к канону (UTF-8, CRLF, без хвостового перевода); meta-edit срезает хвост в обеих ветках, а не только при создании файла. Попутно, найдено байтовой сверкой портов: - py вставлял <Role>/<Form>/<Subsystem> с пятью табами вместо трёх — подстановка по голому </ChildObjects> удваивала отступ строки; снэпшоты этого не видели, так как схлопывают пробелы между тегами; - py-порты xdto-* писали XML-декларацию одинарными кавычками (так отдаёт lxml), платформа и PS пишут двойные. Регресс: runner 647/647 ps1, 644/647 py (3 skipped), дрейфа снэпшотов нет. Корпусный раундтрип метаданных: 4897 объектов, match 100%, совпадает с эталонами захода #57. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
750ba3bb13
commit
3ef0d74158
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# interface-edit v1.12 — Edit 1C CommandInterface.xml
|
||||
# interface-edit v1.13 — Edit 1C CommandInterface.xml
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
|
||||
import argparse
|
||||
@@ -304,21 +304,22 @@ def _detect_xml_style(path):
|
||||
|
||||
|
||||
def _finalize_xml_bytes(xml_bytes, style):
|
||||
"""Привести сериализованные байты к стилю оригинала (или к дефолту, если style is None)."""
|
||||
enc_decl = style["enc"] if style else "utf-8"
|
||||
"""Привести байты к стилю оригинала; для НОВОГО файла (style is None) — к канону
|
||||
выгрузки Конфигуратора: encoding="UTF-8", CRLF в разделителях, без перевода в конце."""
|
||||
enc_decl = style["enc"] if style else "UTF-8"
|
||||
xml_bytes = xml_bytes.replace(
|
||||
b"<?xml version='1.0' encoding='UTF-8'?>",
|
||||
b'<?xml version="1.0" encoding="' + enc_decl.encode("ascii") + b'"?>')
|
||||
# Канонизировать переносы к LF (убирает от \r в tail'ах)
|
||||
xml_bytes = (xml_bytes.replace(b" \n", b"\n").replace(b" ", b"")
|
||||
.replace(b"\r\n", b"\n").replace(b"\r", b"\n"))
|
||||
# Финальный перенос — как в оригинале (новый файл → есть)
|
||||
want_final_nl = style["final_nl"] if style else True
|
||||
# Финальный перенос — как в оригинале (новый файл → нет, канон #57)
|
||||
want_final_nl = style["final_nl"] if style else False
|
||||
xml_bytes = xml_bytes.rstrip(b"\n")
|
||||
if want_final_nl:
|
||||
xml_bytes += b"\n"
|
||||
# EOL — как в оригинале (новый файл → LF, текущее поведение)
|
||||
if style and style["crlf"]:
|
||||
# EOL — как в оригинале (новый файл → CRLF, канон #57)
|
||||
if (style["crlf"] if style else True):
|
||||
xml_bytes = xml_bytes.replace(b"\n", b"\r\n")
|
||||
return xml_bytes
|
||||
|
||||
|
||||
Reference in New Issue
Block a user