mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-08-07 20:20:20 +03:00
Код нормализации пустого тега повторён в 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>
101 lines
3.7 KiB
PowerShell
101 lines
3.7 KiB
PowerShell
# template-remove v1.5 — Remove template from 1C object
|
||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||
param(
|
||
[Parameter(Mandatory)]
|
||
[Alias("ProcessorName")]
|
||
[string]$ObjectName,
|
||
|
||
[Parameter(Mandatory)]
|
||
[string]$TemplateName,
|
||
|
||
[string]$SrcDir = "src"
|
||
)
|
||
|
||
$ErrorActionPreference = "Stop"
|
||
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
||
[Console]::InputEncoding = [System.Text.Encoding]::UTF8
|
||
|
||
# --- Проверки ---
|
||
|
||
$rootXmlPath = Join-Path $SrcDir "$ObjectName.xml"
|
||
if (-not (Test-Path $rootXmlPath)) {
|
||
Write-Error "Корневой файл обработки не найден: $rootXmlPath"
|
||
exit 1
|
||
}
|
||
|
||
$processorDir = Join-Path $SrcDir $ObjectName
|
||
$templatesDir = Join-Path $processorDir "Templates"
|
||
$templateMetaPath = Join-Path $templatesDir "$TemplateName.xml"
|
||
$templateDir = Join-Path $templatesDir $TemplateName
|
||
|
||
if (-not (Test-Path $templateMetaPath)) {
|
||
Write-Error "Метаданные макета не найдены: $templateMetaPath"
|
||
exit 1
|
||
}
|
||
|
||
# --- Удаление файлов ---
|
||
|
||
if (Test-Path $templateDir) {
|
||
Remove-Item -Path $templateDir -Recurse -Force
|
||
Write-Host "[OK] Удалён каталог: $templateDir"
|
||
}
|
||
|
||
Remove-Item -Path $templateMetaPath -Force
|
||
Write-Host "[OK] Удалён файл: $templateMetaPath"
|
||
|
||
# --- Модификация корневого XML ---
|
||
|
||
$rootXmlFull = Resolve-Path $rootXmlPath
|
||
$xmlDoc = New-Object System.Xml.XmlDocument
|
||
$xmlDoc.PreserveWhitespace = $true
|
||
$xmlDoc.Load($rootXmlFull.Path)
|
||
|
||
$nsMgr = New-Object System.Xml.XmlNamespaceManager($xmlDoc.NameTable)
|
||
$nsMgr.AddNamespace("md", "http://v8.1c.ru/8.3/MDClasses")
|
||
|
||
# Удалить <Template>TemplateName</Template> из ChildObjects
|
||
$templateNodes = $xmlDoc.SelectNodes("//md:ChildObjects/md:Template", $nsMgr)
|
||
foreach ($node in $templateNodes) {
|
||
if ($node.InnerText -eq $TemplateName) {
|
||
$parent = $node.ParentNode
|
||
# Удалить предшествующий whitespace
|
||
$prev = $node.PreviousSibling
|
||
if ($prev -and $prev.NodeType -eq [System.Xml.XmlNodeType]::Whitespace) {
|
||
$parent.RemoveChild($prev) | Out-Null
|
||
}
|
||
$parent.RemoveChild($node) | Out-Null
|
||
break
|
||
}
|
||
}
|
||
|
||
# Очистить MainDataCompositionSchema если указывала на этот макет
|
||
$mainDCS = $xmlDoc.SelectSingleNode("//md:MainDataCompositionSchema", $nsMgr)
|
||
if ($mainDCS -and $mainDCS.InnerText -match "Template\.$([regex]::Escape($TemplateName))$") {
|
||
$mainDCS.InnerText = ""
|
||
Write-Host "[OK] Очищён MainDataCompositionSchema"
|
||
}
|
||
|
||
# Сохранить с BOM
|
||
$encBom = New-Object System.Text.UTF8Encoding($true)
|
||
$settings = New-Object System.Xml.XmlWriterSettings
|
||
$settings.Encoding = $encBom
|
||
$settings.Indent = $false
|
||
|
||
# Через MemoryStream, а не прямо в файл: нужен шаг пост-обработки строки.
|
||
$memStream = New-Object System.IO.MemoryStream
|
||
$writer = [System.Xml.XmlWriter]::Create($memStream, $settings)
|
||
$xmlDoc.Save($writer)
|
||
$writer.Flush(); $writer.Close()
|
||
|
||
$xmlText = [System.Text.Encoding]::UTF8.GetString($memStream.ToArray())
|
||
$memStream.Close()
|
||
if ($xmlText.Length -gt 0 -and $xmlText[0] -eq [char]0xFEFF) { $xmlText = $xmlText.Substring(1) }
|
||
$xmlText = $xmlText.Replace('encoding="utf-8"', 'encoding="UTF-8"')
|
||
# Пустой элемент: XmlWriter отдаёт `<a />`, Конфигуратор пишет `<a/>`. Гард на
|
||
# CDATA/комментарии: только там `>` не экранируется, и ` />` может быть
|
||
# содержимым, а не концом тега.
|
||
if ($xmlText -notmatch '<!\[CDATA\[|<!--') { $xmlText = [regex]::Replace($xmlText, '(?<=\S) />', '/>') }
|
||
[System.IO.File]::WriteAllText($rootXmlFull.Path, $xmlText, $encBom)
|
||
|
||
Write-Host "[OK] Макет $TemplateName удалён из $rootXmlPath"
|