refactor(эмиттеры): одна формулировка на повторяющийся комментарий

Код нормализации пустого тега повторён в 24 местах, а комментарий к нему за время
работы над #57 расплодился в шесть вариантов формулировки. Это то же расхождение
копий, что и в коде, только в тексте: читающий не понимает, значима разница или нет.

Сведено к одной паре формулировок — про сам тег с гардом и про запись через
MemoryStream. Комментарий теперь начинается с ПРАВИЛА, а не с причины: раньше
верхняя строка рассказывала, что here-string наследует LF от .ps1, и читалось это
как «переводы строк берём из скрипта навыка» — тогда как правило обратное:
создаём файл — пишем канон, правим существующий — наследуем его стиль.

Два пояснения в cfe-borrow унификация чуть не стёрла, они возвращены: источником
там служит OuterXml, а не XmlWriter, и нормализация стоит после вставки реквизитов,
чтобы накрыть и их. Это причина местного отличия, а не дубль.

Ссылки на ишью прорежены: #44/#46/#47 осталась по одной на файл — там, где правило
формулируется, — и убрана оттуда, где была эхом. #57 в скриптах не было вовсе.

Заодно выровнены две мелочи, найденные той же сверкой копий: interface-edit в
py-порте не обрезал хвостовой перевод там, где PS обрезает (поведение совпадало,
код — нет), а cf-edit нормализовал EOL инлайном вместо общей двухшаговой формы.

Версии подняты в ОБОИХ портах всех затронутых навыков, включая те, где текстуально
менялся только .ps1: номер версии в этом проекте читается как «одно и то же
поведение», и разводить его из-за комментария нельзя. Паритет проверен — 69 пар,
ноль расхождений.

Windows 641/641 обоими портами.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-05 20:06:38 +03:00
co-authored by Claude Opus 5
parent 4c64b97cec
commit 750ba3bb13
36 changed files with 128 additions and 106 deletions
@@ -1,4 +1,4 @@
# xdto-edit v1.2 — Point edits of a 1C XDTO package
# xdto-edit v1.3 — Point edits of a 1C XDTO package
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory=$true)]
@@ -221,9 +221,7 @@ function Edit-Metadata([string]$field, [string]$newValue) {
$settings = New-Object System.Xml.XmlWriterSettings
$settings.Encoding = $encBom
$settings.Indent = $false
# Через MemoryStream, а не прямо в файл: нужен шаг пост-обработки строки
# XmlWriter отдаёт `encoding="utf-8"` и `<a />`, Конфигуратор пишет
# `encoding="UTF-8"` и `<a/>`.
# Через MemoryStream, а не прямо в файл: нужен шаг пост-обработки строки.
$memStream = New-Object System.IO.MemoryStream
$writer = [System.Xml.XmlWriter]::Create($memStream, $settings)
$doc.Save($writer)
@@ -233,7 +231,9 @@ function Edit-Metadata([string]$field, [string]$newValue) {
$memStream.Close()
if ($mdText.Length -gt 0 -and $mdText[0] -eq [char]0xFEFF) { $mdText = $mdText.Substring(1) }
$mdText = $mdText.Replace('encoding="utf-8"', 'encoding="UTF-8"')
# Гард на CDATA/комментарии: только там ` />` может быть содержимым.
# Пустой элемент: XmlWriter отдаёт `<a />`, Конфигуратор пишет `<a/>`. Гард на
# CDATA/комментарии: только там `>` не экранируется, и ` />` может быть
# содержимым, а не концом тега.
if ($mdText -notmatch '<!\[CDATA\[|<!--') { $mdText = [regex]::Replace($mdText, '(?<=\S) />', '/>') }
[System.IO.File]::WriteAllText($mdFile, $mdText, $encBom)
}
@@ -263,8 +263,7 @@ function Rename-Package([string]$newName) {
if ($found) {
$s = New-Object System.Xml.XmlWriterSettings
$s.Encoding = $encBom; $s.Indent = $false
# Через MemoryStream: нужен шаг пост-обработки строки — XmlWriter отдаёт
# `encoding="utf-8"` и `<a />`, Конфигуратор пишет `encoding="UTF-8"` и `<a/>`.
# Через MemoryStream, а не прямо в файл: нужен шаг пост-обработки строки.
$mem = New-Object System.IO.MemoryStream
$w = [System.Xml.XmlWriter]::Create($mem, $s)
$cfg.Save($w); $w.Flush(); $w.Close()
@@ -272,7 +271,9 @@ function Rename-Package([string]$newName) {
$mem.Close()
if ($cfgText.Length -gt 0 -and $cfgText[0] -eq [char]0xFEFF) { $cfgText = $cfgText.Substring(1) }
$cfgText = $cfgText.Replace('encoding="utf-8"', 'encoding="UTF-8"')
# Гард на CDATA/комментарии: только там ` />` может быть содержимым.
# Пустой элемент: XmlWriter отдаёт `<a />`, Конфигуратор пишет `<a/>`. Гард на
# CDATA/комментарии: только там `>` не экранируется, и ` />` может быть
# содержимым, а не концом тега.
if ($cfgText -notmatch '<!\[CDATA\[|<!--') { $cfgText = [regex]::Replace($cfgText, '(?<=\S) />', '/>') }
[System.IO.File]::WriteAllText($configXml, $cfgText, $encBom)
Write-Host " Configuration.xml: <XDTOPackage> переименован в $newName"
@@ -1,4 +1,4 @@
# xdto-edit v1.2 — Point edits of a 1C XDTO package (Python port)
# xdto-edit v1.3 — Point edits of a 1C XDTO package (Python port)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import json