mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-01 07:50:50 +03:00
feat(cf-edit): виды с осмысленным порядком не сортируются автоматически
Правило «Subsystem не упорядочиваем» распространено на четыре вида и вынесено в семью is_order_sensitive_type / Test-OrderSensitiveType: раньше литерал "Subsystem" был размазан по четырём точкам — регистрация в Register-InChildObjects, add-childObject, заимствование в расширение и сортировка. CommonAttribute — исключение самого стандарта #std467: у общих реквизитов-разделителей порядок в дереве задаёт порядок установки параметров сеанса (https://github.com/1C-Company/v8-code-style/issues/78). Единственный из четырёх, где сортировка ломает поведение, а не только диф. CommandGroup и Language добавлены по замерам. В ACC 15 живых групп команд из 39 не перечислены ни в одном GroupsOrder — как и подсистемы, они падают на порядок дерева. Порядок языков задаёт порядок <v8:item> в мультиязычных строках по всей выгрузке. Прежний вывод «сортировать их безопасно» опирался на стендовый прогон, где не было ни подсистем (а значит и CommandInterface.xml), ни второго языка у объектов: ломаться там было нечему, и отсутствие изменений ничего не доказывало. PaletteColor сортируется — это переменные цветов. Второе послабление стандарта (объекты «Удалить*» можно держать в конце ветки) не реализуем: типовые им не пользуются — в ACC 360 таких объектов из 373 стоят по алфавиту, а сортировка стандарту не противоречит. Оговорено в гайде. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QoAJmoNbgWKobA7JGgN5S3
This commit is contained in:
co-authored by
Claude Opus 5
parent
ecde0d1c41
commit
1046e6018c
@@ -34,7 +34,7 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/cf-edit.ps1" -Confi
|
||||
| `modify-property` | `Ключ=Значение` (batch `;;`) | Изменить свойство |
|
||||
| `add-childObject` | `Type.Name` (batch `;;`) | Зарегистрировать уже существующий файл объекта в ChildObjects. Для создания нового объекта используй `/meta-compile`, `/role-compile`, `/subsystem-compile` — они регистрируют автоматически |
|
||||
| `remove-childObject` | `Type.Name` (batch `;;`) | Удалить объект из ChildObjects |
|
||||
| `sort-childObjects` | вид, напр. `Catalog` (batch `;;`), либо пусто | Упорядочить ChildObjects по имени внутри вида. Без значения — все виды, кроме `Subsystem` |
|
||||
| `sort-childObjects` | вид, напр. `Catalog` (batch `;;`), либо пусто | Упорядочить ChildObjects по имени внутри вида. Без значения — все виды, кроме тех, где порядок несёт смысл (см. reference) |
|
||||
| `add-defaultRole` | `Role.Name` или `Name` | Добавить роль по умолчанию |
|
||||
| `remove-defaultRole` | `Role.Name` или `Name` | Удалить роль по умолчанию |
|
||||
| `set-defaultRoles` | Имена через `;;` | Заменить список ролей по умолчанию |
|
||||
|
||||
@@ -44,12 +44,12 @@ Batch: `"Catalog.Товары ;; Document.Заказ ;; Enum.ВидыОплат"
|
||||
Упорядочивает объекты в `<ChildObjects>` по имени **внутри вида**. Значение — имя вида (`Catalog`, `Role`, …), batch через `;;`. Без значения обрабатываются все виды, какие есть в файле.
|
||||
|
||||
```
|
||||
-Operation sort-childObjects — все виды, кроме Subsystem
|
||||
-Operation sort-childObjects — все виды, кроме перечисленных ниже
|
||||
-Operation sort-childObjects -Value "Catalog" — только справочники
|
||||
-Operation sort-childObjects -Value "Catalog ;; Role"
|
||||
```
|
||||
|
||||
`Subsystem` пропускается, пока вид не назван явно (`-Value "Subsystem"`): сортировка подсистем меняет порядок разделов в панели.
|
||||
Виды, где порядок несёт смысл, пропускаются, пока не названы явно: `CommonAttribute` (порядок разделителей задаёт порядок параметров сеанса), `Subsystem` и `CommandGroup` (порядок в панели), `Language` (порядок мультиязычных строк).
|
||||
|
||||
## add-defaultRole / remove-defaultRole / set-defaultRoles
|
||||
|
||||
|
||||
@@ -490,6 +490,19 @@ function Get-NewObjectPosition([string]$cfgDir) {
|
||||
} catch { return "end" }
|
||||
}
|
||||
|
||||
# Виды, у которых порядок в дереве несёт смысл: автоматически их не упорядочиваем.
|
||||
# CommonAttribute — исключение самого стандарта (#std467): у общих реквизитов-разделителей
|
||||
# порядок в дереве задаёт порядок установки параметров сеанса. Subsystem и CommandGroup:
|
||||
# пока они не перечислены в <SubsystemsOrder> / <GroupsOrder> файла Ext/CommandInterface.xml,
|
||||
# порядок дерева задаёт порядок в интерфейсе, а платформа эти списки сама не заводит
|
||||
# (в выгрузке ACC вне GroupsOrder 15 живых групп из 39). Language: порядок языков задаёт
|
||||
# порядок <v8:item> в мультиязычных строках по всей выгрузке.
|
||||
# Явно названный вид сортируется в любом случае.
|
||||
# Реестр семьи: tests/skills/check-inline-drift.mjs.
|
||||
function Test-OrderSensitiveType([string]$typeName) {
|
||||
return @("CommonAttribute", "Subsystem", "CommandGroup", "Language") -ccontains $typeName
|
||||
}
|
||||
|
||||
# Порядок имён объектов метаданных, как в дереве Конфигуратора.
|
||||
# Ключ — пары «ранг+символ»: регистр не учитывается, подчёркивание раньше цифр, цифры раньше
|
||||
# букв, буквы по кодам (латиница раньше кириллицы), ё на месте е. Культурные таблицы не
|
||||
@@ -568,7 +581,7 @@ function Do-SortChildObjects([string]$batchVal) {
|
||||
[void]$groups[$ln].Add($child)
|
||||
}
|
||||
|
||||
$targets = if ($requested.Count -gt 0) { $requested } else { @($groups.Keys | Where-Object { $_ -cne 'Subsystem' }) }
|
||||
$targets = if ($requested.Count -gt 0) { $requested } else { @($groups.Keys | Where-Object { -not (Test-OrderSensitiveType $_) }) }
|
||||
foreach ($typeName in $targets) {
|
||||
if (-not $groups.Contains($typeName)) { continue }
|
||||
$els = $groups[$typeName]
|
||||
@@ -685,7 +698,7 @@ To create a new $typeName, use $hintSkill (auto-registers in Configuration.xml):
|
||||
}
|
||||
|
||||
# Место вставки. Вид — по $script:typeOrder; внутри вида — по newObjectPosition.
|
||||
$byName = ($typeName -cne "Subsystem" -and (Get-NewObjectPosition $script:configDir) -eq "byName")
|
||||
$byName = (-not (Test-OrderSensitiveType $typeName) -and (Get-NewObjectPosition $script:configDir) -eq "byName")
|
||||
$insertBefore = $null
|
||||
$lastSameType = $null
|
||||
$firstLaterType = $null
|
||||
|
||||
@@ -386,6 +386,21 @@ def get_new_object_position(cfg_dir):
|
||||
return "end"
|
||||
|
||||
|
||||
def is_order_sensitive_type(type_name):
|
||||
"""Виды, у которых порядок в дереве несёт смысл: автоматически их не упорядочиваем.
|
||||
|
||||
CommonAttribute — исключение самого стандарта (#std467): у общих реквизитов-разделителей
|
||||
порядок в дереве задаёт порядок установки параметров сеанса. Subsystem и CommandGroup:
|
||||
пока они не перечислены в <SubsystemsOrder> / <GroupsOrder> файла Ext/CommandInterface.xml,
|
||||
порядок дерева задаёт порядок в интерфейсе, а платформа эти списки сама не заводит
|
||||
(в выгрузке ACC вне GroupsOrder 15 живых групп из 39). Language: порядок языков задаёт
|
||||
порядок <v8:item> в мультиязычных строках по всей выгрузке.
|
||||
Явно названный вид сортируется в любом случае.
|
||||
Реестр семьи: tests/skills/check-inline-drift.mjs.
|
||||
"""
|
||||
return type_name in ("CommonAttribute", "Subsystem", "CommandGroup", "Language")
|
||||
|
||||
|
||||
def compare_metadata_names(a, b):
|
||||
"""Порядок имён объектов метаданных, как в дереве Конфигуратора.
|
||||
|
||||
@@ -795,7 +810,7 @@ def main():
|
||||
# end (по умолчанию) кладёт после последнего объекта того же вида, byName — по имени.
|
||||
# Subsystem по имени не упорядочиваем никогда: порядок подсистем в дереве задаёт
|
||||
# порядок разделов в панели, пока их не перечислили в <SubsystemsOrder>.
|
||||
by_name = (type_name != "Subsystem"
|
||||
by_name = (not is_order_sensitive_type(type_name)
|
||||
and get_new_object_position(config_dir) == "byName")
|
||||
insert_before = None
|
||||
last_same = None
|
||||
@@ -867,7 +882,7 @@ def main():
|
||||
continue
|
||||
groups.setdefault(localname(child), []).append(child)
|
||||
|
||||
targets = requested or [t for t in groups if t != "Subsystem"]
|
||||
targets = requested or [t for t in groups if not is_order_sensitive_type(t)]
|
||||
for type_name in targets:
|
||||
els = groups.get(type_name, [])
|
||||
if len(els) < 2:
|
||||
|
||||
@@ -2291,6 +2291,19 @@ function Get-NewObjectPosition([string]$cfgDir) {
|
||||
} catch { return "end" }
|
||||
}
|
||||
|
||||
# Виды, у которых порядок в дереве несёт смысл: автоматически их не упорядочиваем.
|
||||
# CommonAttribute — исключение самого стандарта (#std467): у общих реквизитов-разделителей
|
||||
# порядок в дереве задаёт порядок установки параметров сеанса. Subsystem и CommandGroup:
|
||||
# пока они не перечислены в <SubsystemsOrder> / <GroupsOrder> файла Ext/CommandInterface.xml,
|
||||
# порядок дерева задаёт порядок в интерфейсе, а платформа эти списки сама не заводит
|
||||
# (в выгрузке ACC вне GroupsOrder 15 живых групп из 39). Language: порядок языков задаёт
|
||||
# порядок <v8:item> в мультиязычных строках по всей выгрузке.
|
||||
# Явно названный вид сортируется в любом случае.
|
||||
# Реестр семьи: tests/skills/check-inline-drift.mjs.
|
||||
function Test-OrderSensitiveType([string]$typeName) {
|
||||
return @("CommonAttribute", "Subsystem", "CommandGroup", "Language") -ccontains $typeName
|
||||
}
|
||||
|
||||
# Порядок имён объектов метаданных, как в дереве Конфигуратора.
|
||||
# Ключ — пары «ранг+символ»: регистр не учитывается, подчёркивание раньше цифр, цифры раньше
|
||||
# букв, буквы по кодам (латиница раньше кириллицы), ё на месте е. Культурные таблицы не
|
||||
@@ -2348,7 +2361,7 @@ function Add-ToChildObjects {
|
||||
# заимствует Конфигуратор: в боевых выгрузках расширений ChildObjects не отсортирован.
|
||||
# Subsystem по имени не упорядочиваем никогда: порядок подсистем в дереве задаёт порядок
|
||||
# разделов в панели.
|
||||
$byName = ($typeName -cne "Subsystem" -and (Get-NewObjectPosition $extDir) -eq "byName")
|
||||
$byName = (-not (Test-OrderSensitiveType $typeName) -and (Get-NewObjectPosition $extDir) -eq "byName")
|
||||
$insertBefore = $null
|
||||
$lastSameType = $null
|
||||
|
||||
|
||||
@@ -250,6 +250,21 @@ def get_new_object_position(cfg_dir):
|
||||
return "end"
|
||||
|
||||
|
||||
def is_order_sensitive_type(type_name):
|
||||
"""Виды, у которых порядок в дереве несёт смысл: автоматически их не упорядочиваем.
|
||||
|
||||
CommonAttribute — исключение самого стандарта (#std467): у общих реквизитов-разделителей
|
||||
порядок в дереве задаёт порядок установки параметров сеанса. Subsystem и CommandGroup:
|
||||
пока они не перечислены в <SubsystemsOrder> / <GroupsOrder> файла Ext/CommandInterface.xml,
|
||||
порядок дерева задаёт порядок в интерфейсе, а платформа эти списки сама не заводит
|
||||
(в выгрузке ACC вне GroupsOrder 15 живых групп из 39). Language: порядок языков задаёт
|
||||
порядок <v8:item> в мультиязычных строках по всей выгрузке.
|
||||
Явно названный вид сортируется в любом случае.
|
||||
Реестр семьи: tests/skills/check-inline-drift.mjs.
|
||||
"""
|
||||
return type_name in ("CommonAttribute", "Subsystem", "CommandGroup", "Language")
|
||||
|
||||
|
||||
def compare_metadata_names(a, b):
|
||||
"""Порядок имён объектов метаданных, как в дереве Конфигуратора.
|
||||
|
||||
@@ -1117,7 +1132,7 @@ def main():
|
||||
# Так же, как заимствует Конфигуратор: в боевых выгрузках расширений ChildObjects
|
||||
# не отсортирован. Subsystem по имени не упорядочиваем никогда: порядок подсистем
|
||||
# в дереве задаёт порядок разделов в панели.
|
||||
by_name = (type_name != "Subsystem"
|
||||
by_name = (not is_order_sensitive_type(type_name)
|
||||
and get_new_object_position(ext_dir) == "byName")
|
||||
insert_before = None
|
||||
for child in child_objs_el:
|
||||
|
||||
@@ -5268,6 +5268,19 @@ function Get-NewObjectPosition([string]$cfgDir) {
|
||||
} catch { return "end" }
|
||||
}
|
||||
|
||||
# Виды, у которых порядок в дереве несёт смысл: автоматически их не упорядочиваем.
|
||||
# CommonAttribute — исключение самого стандарта (#std467): у общих реквизитов-разделителей
|
||||
# порядок в дереве задаёт порядок установки параметров сеанса. Subsystem и CommandGroup:
|
||||
# пока они не перечислены в <SubsystemsOrder> / <GroupsOrder> файла Ext/CommandInterface.xml,
|
||||
# порядок дерева задаёт порядок в интерфейсе, а платформа эти списки сама не заводит
|
||||
# (в выгрузке ACC вне GroupsOrder 15 живых групп из 39). Language: порядок языков задаёт
|
||||
# порядок <v8:item> в мультиязычных строках по всей выгрузке.
|
||||
# Явно названный вид сортируется в любом случае.
|
||||
# Реестр семьи: tests/skills/check-inline-drift.mjs.
|
||||
function Test-OrderSensitiveType([string]$typeName) {
|
||||
return @("CommonAttribute", "Subsystem", "CommandGroup", "Language") -ccontains $typeName
|
||||
}
|
||||
|
||||
# Порядок имён объектов метаданных, как в дереве Конфигуратора.
|
||||
# Ключ — пары «ранг+символ»: регистр не учитывается, подчёркивание раньше цифр, цифры раньше
|
||||
# букв, буквы по кодам (латиница раньше кириллицы), ё на месте е. Культурные таблицы не
|
||||
@@ -5336,10 +5349,9 @@ function Register-InChildObjects([string]$ParentXmlPath, [string]$ParentTag, [st
|
||||
return "added"
|
||||
}
|
||||
|
||||
# byName: перед первым объектом того же вида, чьё имя больше нового. Subsystem — никогда:
|
||||
# порядок подсистем в дереве задаёт порядок разделов в панели, пока их не перечислили в
|
||||
# <SubsystemsOrder> файла Ext/CommandInterface.xml (платформа этот список сама не заводит).
|
||||
if ($ChildTag -cne "Subsystem" -and (Get-NewObjectPosition ([System.IO.Path]::GetDirectoryName([System.IO.Path]::GetFullPath($ParentXmlPath)))) -eq "byName") {
|
||||
# byName: перед первым объектом того же вида, чьё имя больше нового.
|
||||
# Виды с осмысленным порядком в дереве пропускаем — см. Test-OrderSensitiveType.
|
||||
if (-not (Test-OrderSensitiveType $ChildTag) -and (Get-NewObjectPosition ([System.IO.Path]::GetDirectoryName([System.IO.Path]::GetFullPath($ParentXmlPath)))) -eq "byName") {
|
||||
$lineRx = [regex]"(?m)^([ \t]*)<$ChildTag>([^<]*)</$ChildTag>"
|
||||
$m = $lineRx.Match($configContent, $block.Index, $block.Length)
|
||||
while ($m.Success) {
|
||||
|
||||
@@ -5241,6 +5241,21 @@ def get_new_object_position(cfg_dir):
|
||||
return "end"
|
||||
|
||||
|
||||
def is_order_sensitive_type(type_name):
|
||||
"""Виды, у которых порядок в дереве несёт смысл: автоматически их не упорядочиваем.
|
||||
|
||||
CommonAttribute — исключение самого стандарта (#std467): у общих реквизитов-разделителей
|
||||
порядок в дереве задаёт порядок установки параметров сеанса. Subsystem и CommandGroup:
|
||||
пока они не перечислены в <SubsystemsOrder> / <GroupsOrder> файла Ext/CommandInterface.xml,
|
||||
порядок дерева задаёт порядок в интерфейсе, а платформа эти списки сама не заводит
|
||||
(в выгрузке ACC вне GroupsOrder 15 живых групп из 39). Language: порядок языков задаёт
|
||||
порядок <v8:item> в мультиязычных строках по всей выгрузке.
|
||||
Явно названный вид сортируется в любом случае.
|
||||
Реестр семьи: tests/skills/check-inline-drift.mjs.
|
||||
"""
|
||||
return type_name in ("CommonAttribute", "Subsystem", "CommandGroup", "Language")
|
||||
|
||||
|
||||
def compare_metadata_names(a, b):
|
||||
"""Порядок имён объектов метаданных, как в дереве Конфигуратора.
|
||||
|
||||
@@ -5324,10 +5339,9 @@ def register_in_childobjects(parent_xml_path, parent_tag, child_tag, child_name)
|
||||
write_utf8_bom(parent_xml_path, new_content)
|
||||
return 'added'
|
||||
|
||||
# byName: перед первым объектом того же вида, чьё имя больше нового. Subsystem — никогда:
|
||||
# порядок подсистем в дереве задаёт порядок разделов в панели, пока их не перечислили в
|
||||
# <SubsystemsOrder> файла Ext/CommandInterface.xml (платформа этот список сама не заводит).
|
||||
if (child_tag != 'Subsystem'
|
||||
# byName: перед первым объектом того же вида, чьё имя больше нового.
|
||||
# Виды с осмысленным порядком в дереве пропускаем — см. is_order_sensitive_type.
|
||||
if (not is_order_sensitive_type(child_tag)
|
||||
and get_new_object_position(os.path.dirname(os.path.abspath(parent_xml_path))) == 'byName'):
|
||||
line_rx = re.compile(rf'(?m)^([ \t]*)<{child_tag}>([^<]*)</{child_tag}>')
|
||||
for m in line_rx.finditer(config_content, block.start(), block.end()):
|
||||
|
||||
@@ -1219,6 +1219,19 @@ function Get-NewObjectPosition([string]$cfgDir) {
|
||||
} catch { return "end" }
|
||||
}
|
||||
|
||||
# Виды, у которых порядок в дереве несёт смысл: автоматически их не упорядочиваем.
|
||||
# CommonAttribute — исключение самого стандарта (#std467): у общих реквизитов-разделителей
|
||||
# порядок в дереве задаёт порядок установки параметров сеанса. Subsystem и CommandGroup:
|
||||
# пока они не перечислены в <SubsystemsOrder> / <GroupsOrder> файла Ext/CommandInterface.xml,
|
||||
# порядок дерева задаёт порядок в интерфейсе, а платформа эти списки сама не заводит
|
||||
# (в выгрузке ACC вне GroupsOrder 15 живых групп из 39). Language: порядок языков задаёт
|
||||
# порядок <v8:item> в мультиязычных строках по всей выгрузке.
|
||||
# Явно названный вид сортируется в любом случае.
|
||||
# Реестр семьи: tests/skills/check-inline-drift.mjs.
|
||||
function Test-OrderSensitiveType([string]$typeName) {
|
||||
return @("CommonAttribute", "Subsystem", "CommandGroup", "Language") -ccontains $typeName
|
||||
}
|
||||
|
||||
# Порядок имён объектов метаданных, как в дереве Конфигуратора.
|
||||
# Ключ — пары «ранг+символ»: регистр не учитывается, подчёркивание раньше цифр, цифры раньше
|
||||
# букв, буквы по кодам (латиница раньше кириллицы), ё на месте е. Культурные таблицы не
|
||||
@@ -1287,10 +1300,9 @@ function Register-InChildObjects([string]$ParentXmlPath, [string]$ParentTag, [st
|
||||
return "added"
|
||||
}
|
||||
|
||||
# byName: перед первым объектом того же вида, чьё имя больше нового. Subsystem — никогда:
|
||||
# порядок подсистем в дереве задаёт порядок разделов в панели, пока их не перечислили в
|
||||
# <SubsystemsOrder> файла Ext/CommandInterface.xml (платформа этот список сама не заводит).
|
||||
if ($ChildTag -cne "Subsystem" -and (Get-NewObjectPosition ([System.IO.Path]::GetDirectoryName([System.IO.Path]::GetFullPath($ParentXmlPath)))) -eq "byName") {
|
||||
# byName: перед первым объектом того же вида, чьё имя больше нового.
|
||||
# Виды с осмысленным порядком в дереве пропускаем — см. Test-OrderSensitiveType.
|
||||
if (-not (Test-OrderSensitiveType $ChildTag) -and (Get-NewObjectPosition ([System.IO.Path]::GetDirectoryName([System.IO.Path]::GetFullPath($ParentXmlPath)))) -eq "byName") {
|
||||
$lineRx = [regex]"(?m)^([ \t]*)<$ChildTag>([^<]*)</$ChildTag>"
|
||||
$m = $lineRx.Match($configContent, $block.Index, $block.Length)
|
||||
while ($m.Success) {
|
||||
|
||||
@@ -1088,6 +1088,21 @@ def get_new_object_position(cfg_dir):
|
||||
return "end"
|
||||
|
||||
|
||||
def is_order_sensitive_type(type_name):
|
||||
"""Виды, у которых порядок в дереве несёт смысл: автоматически их не упорядочиваем.
|
||||
|
||||
CommonAttribute — исключение самого стандарта (#std467): у общих реквизитов-разделителей
|
||||
порядок в дереве задаёт порядок установки параметров сеанса. Subsystem и CommandGroup:
|
||||
пока они не перечислены в <SubsystemsOrder> / <GroupsOrder> файла Ext/CommandInterface.xml,
|
||||
порядок дерева задаёт порядок в интерфейсе, а платформа эти списки сама не заводит
|
||||
(в выгрузке ACC вне GroupsOrder 15 живых групп из 39). Language: порядок языков задаёт
|
||||
порядок <v8:item> в мультиязычных строках по всей выгрузке.
|
||||
Явно названный вид сортируется в любом случае.
|
||||
Реестр семьи: tests/skills/check-inline-drift.mjs.
|
||||
"""
|
||||
return type_name in ("CommonAttribute", "Subsystem", "CommandGroup", "Language")
|
||||
|
||||
|
||||
def compare_metadata_names(a, b):
|
||||
"""Порядок имён объектов метаданных, как в дереве Конфигуратора.
|
||||
|
||||
@@ -1171,10 +1186,9 @@ def register_in_childobjects(parent_xml_path, parent_tag, child_tag, child_name)
|
||||
write_utf8_bom(parent_xml_path, new_content)
|
||||
return 'added'
|
||||
|
||||
# byName: перед первым объектом того же вида, чьё имя больше нового. Subsystem — никогда:
|
||||
# порядок подсистем в дереве задаёт порядок разделов в панели, пока их не перечислили в
|
||||
# <SubsystemsOrder> файла Ext/CommandInterface.xml (платформа этот список сама не заводит).
|
||||
if (child_tag != 'Subsystem'
|
||||
# byName: перед первым объектом того же вида, чьё имя больше нового.
|
||||
# Виды с осмысленным порядком в дереве пропускаем — см. is_order_sensitive_type.
|
||||
if (not is_order_sensitive_type(child_tag)
|
||||
and get_new_object_position(os.path.dirname(os.path.abspath(parent_xml_path))) == 'byName'):
|
||||
line_rx = re.compile(rf'(?m)^([ \t]*)<{child_tag}>([^<]*)</{child_tag}>')
|
||||
for m in line_rx.finditer(config_content, block.start(), block.end()):
|
||||
|
||||
@@ -1027,6 +1027,19 @@ function Get-NewObjectPosition([string]$cfgDir) {
|
||||
} catch { return "end" }
|
||||
}
|
||||
|
||||
# Виды, у которых порядок в дереве несёт смысл: автоматически их не упорядочиваем.
|
||||
# CommonAttribute — исключение самого стандарта (#std467): у общих реквизитов-разделителей
|
||||
# порядок в дереве задаёт порядок установки параметров сеанса. Subsystem и CommandGroup:
|
||||
# пока они не перечислены в <SubsystemsOrder> / <GroupsOrder> файла Ext/CommandInterface.xml,
|
||||
# порядок дерева задаёт порядок в интерфейсе, а платформа эти списки сама не заводит
|
||||
# (в выгрузке ACC вне GroupsOrder 15 живых групп из 39). Language: порядок языков задаёт
|
||||
# порядок <v8:item> в мультиязычных строках по всей выгрузке.
|
||||
# Явно названный вид сортируется в любом случае.
|
||||
# Реестр семьи: tests/skills/check-inline-drift.mjs.
|
||||
function Test-OrderSensitiveType([string]$typeName) {
|
||||
return @("CommonAttribute", "Subsystem", "CommandGroup", "Language") -ccontains $typeName
|
||||
}
|
||||
|
||||
# Порядок имён объектов метаданных, как в дереве Конфигуратора.
|
||||
# Ключ — пары «ранг+символ»: регистр не учитывается, подчёркивание раньше цифр, цифры раньше
|
||||
# букв, буквы по кодам (латиница раньше кириллицы), ё на месте е. Культурные таблицы не
|
||||
@@ -1095,10 +1108,9 @@ function Register-InChildObjects([string]$ParentXmlPath, [string]$ParentTag, [st
|
||||
return "added"
|
||||
}
|
||||
|
||||
# byName: перед первым объектом того же вида, чьё имя больше нового. Subsystem — никогда:
|
||||
# порядок подсистем в дереве задаёт порядок разделов в панели, пока их не перечислили в
|
||||
# <SubsystemsOrder> файла Ext/CommandInterface.xml (платформа этот список сама не заводит).
|
||||
if ($ChildTag -cne "Subsystem" -and (Get-NewObjectPosition ([System.IO.Path]::GetDirectoryName([System.IO.Path]::GetFullPath($ParentXmlPath)))) -eq "byName") {
|
||||
# byName: перед первым объектом того же вида, чьё имя больше нового.
|
||||
# Виды с осмысленным порядком в дереве пропускаем — см. Test-OrderSensitiveType.
|
||||
if (-not (Test-OrderSensitiveType $ChildTag) -and (Get-NewObjectPosition ([System.IO.Path]::GetDirectoryName([System.IO.Path]::GetFullPath($ParentXmlPath)))) -eq "byName") {
|
||||
$lineRx = [regex]"(?m)^([ \t]*)<$ChildTag>([^<]*)</$ChildTag>"
|
||||
$m = $lineRx.Match($configContent, $block.Index, $block.Length)
|
||||
while ($m.Success) {
|
||||
|
||||
@@ -1138,6 +1138,21 @@ def get_new_object_position(cfg_dir):
|
||||
return "end"
|
||||
|
||||
|
||||
def is_order_sensitive_type(type_name):
|
||||
"""Виды, у которых порядок в дереве несёт смысл: автоматически их не упорядочиваем.
|
||||
|
||||
CommonAttribute — исключение самого стандарта (#std467): у общих реквизитов-разделителей
|
||||
порядок в дереве задаёт порядок установки параметров сеанса. Subsystem и CommandGroup:
|
||||
пока они не перечислены в <SubsystemsOrder> / <GroupsOrder> файла Ext/CommandInterface.xml,
|
||||
порядок дерева задаёт порядок в интерфейсе, а платформа эти списки сама не заводит
|
||||
(в выгрузке ACC вне GroupsOrder 15 живых групп из 39). Language: порядок языков задаёт
|
||||
порядок <v8:item> в мультиязычных строках по всей выгрузке.
|
||||
Явно названный вид сортируется в любом случае.
|
||||
Реестр семьи: tests/skills/check-inline-drift.mjs.
|
||||
"""
|
||||
return type_name in ("CommonAttribute", "Subsystem", "CommandGroup", "Language")
|
||||
|
||||
|
||||
def compare_metadata_names(a, b):
|
||||
"""Порядок имён объектов метаданных, как в дереве Конфигуратора.
|
||||
|
||||
@@ -1221,10 +1236,9 @@ def register_in_childobjects(parent_xml_path, parent_tag, child_tag, child_name)
|
||||
write_utf8_bom(parent_xml_path, new_content)
|
||||
return 'added'
|
||||
|
||||
# byName: перед первым объектом того же вида, чьё имя больше нового. Subsystem — никогда:
|
||||
# порядок подсистем в дереве задаёт порядок разделов в панели, пока их не перечислили в
|
||||
# <SubsystemsOrder> файла Ext/CommandInterface.xml (платформа этот список сама не заводит).
|
||||
if (child_tag != 'Subsystem'
|
||||
# byName: перед первым объектом того же вида, чьё имя больше нового.
|
||||
# Виды с осмысленным порядком в дереве пропускаем — см. is_order_sensitive_type.
|
||||
if (not is_order_sensitive_type(child_tag)
|
||||
and get_new_object_position(os.path.dirname(os.path.abspath(parent_xml_path))) == 'byName'):
|
||||
line_rx = re.compile(rf'(?m)^([ \t]*)<{child_tag}>([^<]*)</{child_tag}>')
|
||||
for m in line_rx.finditer(config_content, block.start(), block.end()):
|
||||
|
||||
Reference in New Issue
Block a user