mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-18 07:35:52 +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,4 +1,4 @@
|
||||
# xdto-compile v1.5 — Build a 1C XDTO package from an XML Schema (XSD) (Python port)
|
||||
# xdto-compile v1.6 — Build a 1C XDTO package from an XML Schema (XSD) (Python port)
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
import argparse
|
||||
import json
|
||||
@@ -960,10 +960,13 @@ if os.path.exists(config_xml):
|
||||
else:
|
||||
new_elem.tail = child_objects.text
|
||||
data = etree.tostring(cfg_doc, xml_declaration=True, encoding="UTF-8")
|
||||
# lxml пишет декларацию в ОДИНАРНЫХ кавычках, платформа и PS-порт — в двойных.
|
||||
data = data.replace(b"<?xml version='1.0' encoding='UTF-8'?>",
|
||||
b'<?xml version="1.0" encoding="UTF-8"?>')
|
||||
# Парсер XML по спецификации схлопывает CRLF в LF, поэтому tostring отдаёт
|
||||
# LF-документ. Возвращаем EOL исходного файла: правка существующего файла
|
||||
# сохраняет его стиль (#44/#46/#47), а .NET-порт делает это через
|
||||
# NewLineHandling — иначе порты расходятся побайтово.
|
||||
# сохраняет его стиль (#44/#46/#47). Правило то же, что у _detect_xml_style
|
||||
# и у $targetEol в PS-порту: есть CRLF → CRLF.
|
||||
src_eol = b"\r\n" if b"\r\n" in raw else b"\n"
|
||||
data = data.replace(b"\r\n", b"\n").replace(b"\n", src_eol)
|
||||
if had_bom:
|
||||
|
||||
Reference in New Issue
Block a user