diff --git a/.claude/skills/help-add/scripts/add-help.ps1 b/.claude/skills/help-add/scripts/add-help.ps1 index 54689ff56..98936e7ac 100644 --- a/.claude/skills/help-add/scripts/add-help.ps1 +++ b/.claude/skills/help-add/scripts/add-help.ps1 @@ -1,4 +1,4 @@ -# help-add v1.21 — Add built-in help to 1C object (+write_xml_file/write_utf8_bom: общий эталон записи) +# help-add v1.22 — Add built-in help to 1C object (+write_xml_file/write_utf8_bom: общий эталон записи) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -185,13 +185,22 @@ if (-not (Test-Path $extDir)) { } # Код языка идёт и в текст XML, и в имя файла страницы, поэтому проверяем его до записи: -# пустое значение дало бы файл «.html» и пустой , а разделитель пути — -# запись мимо каталога Ext/Help. Оба отказа платформы были бы тихими. +# пустое значение дало бы файл «.html» и пустой , разделитель пути — запись мимо +# каталога страниц, а зарезервированное имя устройства (nul, con, prn, aux, com1…, lpt1…) на +# Windows уводит запись в само устройство. Все отказы платформы были бы тихими. # -# Копия этой проверки есть в template-add (навыки автономны, формат «дескриптор + -# страница» у них общий). Держать копии одинаковыми — сознательно. -if ($Lang -notmatch '^[A-Za-z0-9_-]+$') { - Write-Error "Недопустимый код языка: '$Lang'`nОжидается код вида ru, en (буквы, цифры, дефис, подчёркивание)" +# Якоря `\A…\z`, а не `^…$`: последние в обоих языках допускают перевод строки в конце. +# +# Копия этой функции есть в template-add (навыки автономны, формат «дескриптор + страница» +# у них общий). Держать копии одинаковыми — сознательно; за дрейфом следит check-inline-drift. +function Test-LangCode([string]$code) { + if ($code -notmatch '\A[A-Za-z0-9_-]+\z') { return $false } + if ($code -match '\A(?i)(con|prn|aux|nul|com[1-9]|lpt[1-9])\z') { return $false } + return $true +} + +if (-not (Test-LangCode $Lang)) { + Write-Error "Недопустимый код языка: '$Lang'`nОжидается код вида ru, en (буквы, цифры, дефис, подчёркивание; имена устройств Windows недопустимы)" exit 1 } @@ -250,7 +259,14 @@ $helpHtml = @" "@ -[System.IO.File]::WriteAllText($helpHtmlPath, $helpHtml, $encBom) +# Файл страницы НЕ перезаписываем: отказ выше смотрит только на Help.xml, а страница может +# пережить его (удалённый дескриптор, частичная выгрузка, справка, сделанная руками) — и тогда +# безусловная запись молча стирала бы текст справки с кодом 0. +if (Test-Path $helpHtmlPath) { + Write-Host "[WARN] Страница $Lang.html уже лежала на диске — содержимое сохранено, создан только дескриптор." +} else { + [System.IO.File]::WriteAllText($helpHtmlPath, $helpHtml, $encBom) +} # --- 3. Проверка IncludeHelpInContents в метаданных форм --- diff --git a/.claude/skills/help-add/scripts/add-help.py b/.claude/skills/help-add/scripts/add-help.py index a4639f7ee..2dc17decf 100644 --- a/.claude/skills/help-add/scripts/add-help.py +++ b/.claude/skills/help-add/scripts/add-help.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# help-add v1.21 — Add built-in help to 1C object (+write_xml_file/write_utf8_bom: общий эталон записи) +# help-add v1.22 — Add built-in help to 1C object (+write_xml_file/write_utf8_bom: общий эталон записи) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -293,6 +293,26 @@ def write_utf8_bom(path, content): +def is_valid_lang(code): + """Код языка идёт и в текст XML, и в имя файла страницы. + + Пустое значение дало бы файл «.html» и пустой , разделитель пути — запись + мимо каталога страниц, а зарезервированное имя устройства (nul, con, prn, aux, com1…, lpt1…) + на Windows уводит запись в само устройство: при -Lang nul этот порт молча писал + nul и пустой каталог с кодом 0. Все отказы платформы были бы тихими. + + fullmatch, а не match: последний с `$` допускает перевод строки в конце. + + Копия этой функции есть в template-add (навыки автономны, формат «дескриптор + страница» + у них общий). Держать копии одинаковыми — сознательно; за дрейфом следит check-inline-drift. + """ + if not re.fullmatch(r"[A-Za-z0-9_-]+", code): + return False + if re.fullmatch(r"(?i)(con|prn|aux|nul|com[1-9]|lpt[1-9])", code): + return False + return True + + def write_xml_file(path, content): """XML в каноне выгрузки Конфигуратора: CRLF в разделителях, без перевода в конце. @@ -329,15 +349,9 @@ def main(): print(f"Каталог объекта не найден: {ext_dir}. Проверьте путь ObjectName (например Catalogs/МойСправочник).", file=sys.stderr) sys.exit(1) - # Код языка идёт и в текст XML, и в имя файла страницы, поэтому проверяем его до записи: - # пустое значение дало бы файл «.html» и пустой , а разделитель пути — - # запись мимо каталога Ext/Help. Оба отказа платформы были бы тихими. - # - # Копия этой проверки есть в template-add (навыки автономны, формат «дескриптор + - # страница» у них общий). Держать копии одинаковыми — сознательно. - if not re.match(r"^[A-Za-z0-9_-]+$", lang): + if not is_valid_lang(lang): print(f"Недопустимый код языка: '{lang}'", file=sys.stderr) - print("Ожидается код вида ru, en (буквы, цифры, дефис, подчёркивание)", file=sys.stderr) + print("Ожидается код вида ru, en (буквы, цифры, дефис, подчёркивание; имена устройств Windows недопустимы)", file=sys.stderr) sys.exit(1) help_xml_path = os.path.join(ext_dir, "Help.xml") @@ -382,7 +396,13 @@ def main(): '' ) - write_utf8_bom(help_html_path, help_html) + # Файл страницы НЕ перезаписываем: отказ выше смотрит только на Help.xml, а страница может + # пережить его (удалённый дескриптор, частичная выгрузка, справка, сделанная руками) — и тогда + # безусловная запись молча стирала бы текст справки с кодом 0. + if os.path.exists(help_html_path): + print(f"[WARN] Страница {lang}.html уже лежала на диске — содержимое сохранено, создан только дескриптор.") + else: + write_utf8_bom(help_html_path, help_html) # --- 3. Check IncludeHelpInContents in form metadata --- diff --git a/.claude/skills/template-add/scripts/add-template.ps1 b/.claude/skills/template-add/scripts/add-template.ps1 index cb87ca09c..e3b71218c 100644 --- a/.claude/skills/template-add/scripts/add-template.ps1 +++ b/.claude/skills/template-add/scripts/add-template.ps1 @@ -202,10 +202,23 @@ $templatesDir = Join-Path $processorDir "Templates" $templateMetaPath = Join-Path $templatesDir "$TemplateName.xml" # Код языка идёт и в текст XML, и в имя файла страницы, поэтому проверяем его до записи: -# пустое значение дало бы файл «.html» и пустой , а разделитель пути — -# запись мимо каталога Ext/Template. Оба отказа платформы были бы тихими. -if ($Lang -notmatch '^[A-Za-z0-9_-]+$') { - Write-Error "Недопустимый код языка: '$Lang'`nОжидается код вида ru, en (буквы, цифры, дефис, подчёркивание)" +# пустое значение дало бы файл «.html» и пустой , разделитель пути — запись мимо +# каталога страниц, а зарезервированное имя устройства (nul, con, prn, aux, com1…, lpt1…) на +# Windows уводит запись в само устройство: py-порт при -Lang nul молча писал nul +# и пустой каталог с кодом 0. Все отказы платформы были бы тихими. +# +# Якоря `\A…\z`, а не `^…$`: последние в обоих языках допускают перевод строки в конце. +# +# Копия этой функции есть в help-add (навыки автономны, формат «дескриптор + страница» у них +# общий). Держать копии одинаковыми — сознательно; за дрейфом следит check-inline-drift. +function Test-LangCode([string]$code) { + if ($code -notmatch '\A[A-Za-z0-9_-]+\z') { return $false } + if ($code -match '\A(?i)(con|prn|aux|nul|com[1-9]|lpt[1-9])\z') { return $false } + return $true +} + +if (-not (Test-LangCode $Lang)) { + Write-Error "Недопустимый код языка: '$Lang'`nОжидается код вида ru, en (буквы, цифры, дефис, подчёркивание; имена устройств Windows недопустимы)" exit 1 } @@ -358,6 +371,12 @@ if ($addLangMode) { # Версию берём из самого дескриптора: правка чужой выгрузки не должна менять формат. if ($descText -match ']+version="(\d+\.\d+)"') { $descVersion = $Matches[1] } $langs = @([regex]::Matches($descText, '([^<]+)') | ForEach-Object { $_.Groups[1].Value }) + # Полумигрированное дерево: дескриптор уже есть, а старый Ext/Template.html остался рядом. + # Платформа его игнорирует, поэтому текст в нём пропадёт незаметно — говорим вслух. + if (Test-Path $legacyPagePath) { + Write-Host "[WARN] Рядом лежит старый Ext/Template.html — платформа его игнорирует." + Write-Host " Перенесите нужное в Template/<язык>.html и удалите его." + } } elseif (Test-Path $legacyPagePath) { # Раскладка до v1.24 — одиночный Ext/Template.html, который платформа молча игнорирует. # Языка у него нет, но создать его могла только версия навыка без параметра -Lang, @@ -372,8 +391,8 @@ if ($addLangMode) { # Файл страницы НИКОГДА не перезаписываем: в нём может лежать текст макета. # Ошибка — только когда добавлять нечего: язык уже в дескрипторе И страница на диске. - $pageExists = (Test-Path $pagePath) -or ($legacyPending -and $Lang -eq "ru") - if (($langs -contains $Lang) -and $pageExists -and -not $legacyPending) { + # При миграции проверять нечего: langs там задан нами же, а страница появится переносом. + if (($langs -contains $Lang) -and (Test-Path $pagePath) -and -not $legacyPending) { Write-Error "Страница макета на языке '$Lang' уже существует: $pagePath" exit 1 } diff --git a/.claude/skills/template-add/scripts/add-template.py b/.claude/skills/template-add/scripts/add-template.py index 277c84bdb..06f1cdfbf 100644 --- a/.claude/skills/template-add/scripts/add-template.py +++ b/.claude/skills/template-add/scripts/add-template.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# template-add v1.26 — Add template to 1C object (+write_xml_file/write_utf8_bom: общий эталон записи) +# template-add v1.27 — Add template to 1C object (+write_xml_file/write_utf8_bom: общий эталон записи) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -276,6 +276,26 @@ def write_utf8_bom(path, content): +def is_valid_lang(code): + """Код языка идёт и в текст XML, и в имя файла страницы. + + Пустое значение дало бы файл «.html» и пустой , разделитель пути — запись + мимо каталога страниц, а зарезервированное имя устройства (nul, con, prn, aux, com1…, lpt1…) + на Windows уводит запись в само устройство: при -Lang nul этот порт молча писал + nul и пустой каталог с кодом 0. Все отказы платформы были бы тихими. + + fullmatch, а не match: последний с `$` допускает перевод строки в конце. + + Копия этой функции есть в help-add (навыки автономны, формат «дескриптор + страница» + у них общий). Держать копии одинаковыми — сознательно; за дрейфом следит check-inline-drift. + """ + if not re.fullmatch(r"[A-Za-z0-9_-]+", code): + return False + if re.fullmatch(r"(?i)(con|prn|aux|nul|com[1-9]|lpt[1-9])", code): + return False + return True + + def write_xml_file(path, content): """XML в каноне выгрузки Конфигуратора: CRLF в разделителях, без перевода в конце. @@ -379,12 +399,9 @@ def main(): templates_dir = os.path.join(processor_dir, "Templates") template_meta_path = os.path.join(templates_dir, f"{template_name}.xml") - # Код языка идёт и в текст XML, и в имя файла страницы, поэтому проверяем его до записи: - # пустое значение дало бы файл «.html» и пустой , а разделитель пути — - # запись мимо каталога Ext/Template. Оба отказа платформы были бы тихими. - if not re.match(r"^[A-Za-z0-9_-]+$", lang): + if not is_valid_lang(lang): print(f"Недопустимый код языка: '{lang}'", file=sys.stderr) - print("Ожидается код вида ru, en (буквы, цифры, дефис, подчёркивание)", file=sys.stderr) + print("Ожидается код вида ru, en (буквы, цифры, дефис, подчёркивание; имена устройств Windows недопустимы)", file=sys.stderr) sys.exit(1) # Существующий HTML-макет — не всегда повод отказать: в один макет платформа кладёт @@ -491,6 +508,11 @@ def main(): if m_dv: desc_version = m_dv.group(1) langs = re.findall(r"([^<]+)", desc_text) + # Полумигрированное дерево: дескриптор уже есть, а старый Ext/Template.html остался рядом. + # Платформа его игнорирует, поэтому текст в нём пропадёт незаметно — говорим вслух. + if os.path.exists(legacy_page_path): + print("[WARN] Рядом лежит старый Ext/Template.html — платформа его игнорирует.") + print(" Перенесите нужное в Template/<язык>.html и удалите его.") elif os.path.exists(legacy_page_path): # Раскладка до v1.24 — одиночный Ext/Template.html, который платформа молча игнорирует. # Языка у него нет, но создать его могла только версия навыка без параметра -Lang, @@ -506,7 +528,13 @@ def main(): # Ошибка — только когда добавлять нечего: язык уже в дескрипторе И страница на диске. # Сравнение без учёта регистра — зеркало -contains в PS, который регистр не различает. lang_known = lang.lower() in [x.lower() for x in langs] - page_exists = os.path.exists(page_path) or (legacy_pending and lang.lower() == "ru") + # Существование страницы — тоже без учёта регистра: os.path.exists на Linux различает + # регистр, а PS -contains и Test-Path на Windows — нет, и порты разошлись бы на -Lang RU. + page_exists = False + if os.path.isdir(page_dir): + want = f"{lang}.html".lower() + page_exists = any(f.lower() == want for f in os.listdir(page_dir)) + # При миграции проверять нечего: langs там задан нами же, а страница появится переносом. if lang_known and page_exists and not legacy_pending: print(f"Страница макета на языке '{lang}' уже существует: {page_path}", file=sys.stderr) sys.exit(1) diff --git a/tests/skills/cases/help-add/lang-reserved.json b/tests/skills/cases/help-add/lang-reserved.json new file mode 100644 index 000000000..0aae0f5f7 --- /dev/null +++ b/tests/skills/cases/help-add/lang-reserved.json @@ -0,0 +1,20 @@ +{ + "name": "Зарезервированное имя устройства как код языка отвергается", + "preRun": [ + { + "script": "epf-init/scripts/init", + "args": { + "-Name": "МояОбработка", + "-SrcDir": "{workDir}" + } + } + ], + "params": { + "objectName": "МояОбработка" + }, + "args_extra": [ + "-Lang", + "con" + ], + "expectError": "Недопустимый код языка" +} diff --git a/tests/skills/cases/help-add/page-without-descriptor.json b/tests/skills/cases/help-add/page-without-descriptor.json new file mode 100644 index 000000000..118a59b4b --- /dev/null +++ b/tests/skills/cases/help-add/page-without-descriptor.json @@ -0,0 +1,41 @@ +{ + "name": "Страница справки без дескриптора: содержимое не затирается", + "preRun": [ + { + "script": "epf-init/scripts/init", + "args": { + "-Name": "МояОбработка", + "-SrcDir": "{workDir}" + } + }, + { + "script": "help-add/scripts/add-help", + "args": { + "-ObjectName": "МояОбработка", + "-SrcDir": "{workDir}" + } + }, + { + "deletePath": "МояОбработка/Ext/Help.xml" + }, + { + "writeFile": { + "path": "МояОбработка/Ext/Help/ru.html", + "content": "ЖИВОЙ_ТЕКСТ_СПРАВКИ" + } + } + ], + "params": { + "objectName": "МояОбработка" + }, + "expect": { + "stdoutContains": [ + "[WARN]", + "содержимое сохранено" + ], + "fileContains": { + "file": "МояОбработка/Ext/Help/ru.html", + "text": "ЖИВОЙ_ТЕКСТ_СПРАВКИ" + } + } +} diff --git a/tests/skills/cases/help-add/snapshots/page-without-descriptor/МояОбработка.xml b/tests/skills/cases/help-add/snapshots/page-without-descriptor/МояОбработка.xml new file mode 100644 index 000000000..7074d7608 --- /dev/null +++ b/tests/skills/cases/help-add/snapshots/page-without-descriptor/МояОбработка.xml @@ -0,0 +1,28 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + + МояОбработка + + + ru + МояОбработка + + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/help-add/snapshots/page-without-descriptor/МояОбработка/Ext/Help.xml b/tests/skills/cases/help-add/snapshots/page-without-descriptor/МояОбработка/Ext/Help.xml new file mode 100644 index 000000000..b9fbd0bc7 --- /dev/null +++ b/tests/skills/cases/help-add/snapshots/page-without-descriptor/МояОбработка/Ext/Help.xml @@ -0,0 +1,4 @@ + + + ru + \ No newline at end of file diff --git a/tests/skills/cases/help-add/snapshots/page-without-descriptor/МояОбработка/Ext/Help/ru.html b/tests/skills/cases/help-add/snapshots/page-without-descriptor/МояОбработка/Ext/Help/ru.html new file mode 100644 index 000000000..07e0197b0 --- /dev/null +++ b/tests/skills/cases/help-add/snapshots/page-without-descriptor/МояОбработка/Ext/Help/ru.html @@ -0,0 +1 @@ +ЖИВОЙ_ТЕКСТ_СПРАВКИ \ No newline at end of file diff --git a/tests/skills/cases/help-add/snapshots/page-without-descriptor/МояОбработка/Ext/ObjectModule.bsl b/tests/skills/cases/help-add/snapshots/page-without-descriptor/МояОбработка/Ext/ObjectModule.bsl new file mode 100644 index 000000000..15543d277 --- /dev/null +++ b/tests/skills/cases/help-add/snapshots/page-without-descriptor/МояОбработка/Ext/ObjectModule.bsl @@ -0,0 +1,11 @@ +#Область ОписаниеПеременных + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#КонецОбласти \ No newline at end of file diff --git a/tests/skills/cases/template-add/html-lang-reserved.json b/tests/skills/cases/template-add/html-lang-reserved.json new file mode 100644 index 000000000..88046a4dd --- /dev/null +++ b/tests/skills/cases/template-add/html-lang-reserved.json @@ -0,0 +1,22 @@ +{ + "name": "Зарезервированное имя устройства как код языка отвергается", + "preRun": [ + { + "script": "epf-init/scripts/init", + "args": { + "-Name": "МояОбработка", + "-SrcDir": "{workDir}" + } + } + ], + "params": { + "objectName": "МояОбработка", + "templateName": "МакетHTML", + "templateType": "HTML" + }, + "args_extra": [ + "-Lang", + "nul" + ], + "expectError": "Недопустимый код языка" +} diff --git a/tests/skills/cases/template-add/html-legacy-leftover.json b/tests/skills/cases/template-add/html-legacy-leftover.json new file mode 100644 index 000000000..eba41485a --- /dev/null +++ b/tests/skills/cases/template-add/html-legacy-leftover.json @@ -0,0 +1,42 @@ +{ + "name": "Дескриптор есть, старый Template.html остался рядом: предупреждение", + "preRun": [ + { + "script": "epf-init/scripts/init", + "args": { + "-Name": "МояОбработка", + "-SrcDir": "{workDir}" + } + }, + { + "script": "template-add/scripts/add-template", + "args": { + "-ObjectName": "МояОбработка", + "-TemplateName": "МакетHTML", + "-TemplateType": "HTML", + "-SrcDir": "{workDir}" + } + }, + { + "writeFile": { + "path": "МояОбработка/Templates/МакетHTML/Ext/Template.html", + "content": "ЗАБЫТЫЙ_ФАЙЛ" + } + } + ], + "params": { + "objectName": "МояОбработка", + "templateName": "МакетHTML", + "templateType": "HTML" + }, + "args_extra": [ + "-Lang", + "en" + ], + "expect": { + "stdoutContains": [ + "[WARN]", + "Рядом лежит старый" + ] + } +} diff --git a/tests/skills/cases/template-add/snapshots/html-legacy-leftover/МояОбработка.xml b/tests/skills/cases/template-add/snapshots/html-legacy-leftover/МояОбработка.xml new file mode 100644 index 000000000..281f29338 --- /dev/null +++ b/tests/skills/cases/template-add/snapshots/html-legacy-leftover/МояОбработка.xml @@ -0,0 +1,30 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + + МояОбработка + + + ru + МояОбработка + + + + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/template-add/snapshots/html-legacy-leftover/МояОбработка/Ext/ObjectModule.bsl b/tests/skills/cases/template-add/snapshots/html-legacy-leftover/МояОбработка/Ext/ObjectModule.bsl new file mode 100644 index 000000000..15543d277 --- /dev/null +++ b/tests/skills/cases/template-add/snapshots/html-legacy-leftover/МояОбработка/Ext/ObjectModule.bsl @@ -0,0 +1,11 @@ +#Область ОписаниеПеременных + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#КонецОбласти \ No newline at end of file diff --git a/tests/skills/cases/template-add/snapshots/html-legacy-leftover/МояОбработка/Templates/МакетHTML.xml b/tests/skills/cases/template-add/snapshots/html-legacy-leftover/МояОбработка/Templates/МакетHTML.xml new file mode 100644 index 000000000..b05945a1a --- /dev/null +++ b/tests/skills/cases/template-add/snapshots/html-legacy-leftover/МояОбработка/Templates/МакетHTML.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/tests/skills/cases/template-add/snapshots/html-legacy-leftover/МояОбработка/Templates/МакетHTML/Ext/Template.html b/tests/skills/cases/template-add/snapshots/html-legacy-leftover/МояОбработка/Templates/МакетHTML/Ext/Template.html new file mode 100644 index 000000000..c4eeeafbd --- /dev/null +++ b/tests/skills/cases/template-add/snapshots/html-legacy-leftover/МояОбработка/Templates/МакетHTML/Ext/Template.html @@ -0,0 +1 @@ +ЗАБЫТЫЙ_ФАЙЛ \ No newline at end of file diff --git a/tests/skills/cases/template-add/snapshots/html-legacy-leftover/МояОбработка/Templates/МакетHTML/Ext/Template.xml b/tests/skills/cases/template-add/snapshots/html-legacy-leftover/МояОбработка/Templates/МакетHTML/Ext/Template.xml new file mode 100644 index 000000000..67df2f067 --- /dev/null +++ b/tests/skills/cases/template-add/snapshots/html-legacy-leftover/МояОбработка/Templates/МакетHTML/Ext/Template.xml @@ -0,0 +1,5 @@ + + + en + ru + \ No newline at end of file diff --git a/tests/skills/cases/template-add/snapshots/html-legacy-leftover/МояОбработка/Templates/МакетHTML/Ext/Template/en.html b/tests/skills/cases/template-add/snapshots/html-legacy-leftover/МояОбработка/Templates/МакетHTML/Ext/Template/en.html new file mode 100644 index 000000000..9433caa59 --- /dev/null +++ b/tests/skills/cases/template-add/snapshots/html-legacy-leftover/МояОбработка/Templates/МакетHTML/Ext/Template/en.html @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/tests/skills/cases/template-add/snapshots/html-legacy-leftover/МояОбработка/Templates/МакетHTML/Ext/Template/ru.html b/tests/skills/cases/template-add/snapshots/html-legacy-leftover/МояОбработка/Templates/МакетHTML/Ext/Template/ru.html new file mode 100644 index 000000000..9433caa59 --- /dev/null +++ b/tests/skills/cases/template-add/snapshots/html-legacy-leftover/МояОбработка/Templates/МакетHTML/Ext/Template/ru.html @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/tests/skills/check-inline-drift.mjs b/tests/skills/check-inline-drift.mjs index 56510bd5a..24d440a6e 100644 --- a/tests/skills/check-inline-drift.mjs +++ b/tests/skills/check-inline-drift.mjs @@ -184,6 +184,15 @@ const FAMILIES = [ consumersPy: ['cfe-borrow'] }, ], }, + // ─── Код языка страницы ────────────────────────────────────────────────── + // Формат «дескриптор + страница» общий у справки объекта и HTML-макета, поэтому проверка + // кода языка обязана быть одна и та же: он идёт и в текст XML, и в имя файла. + { + name: 'is_valid_lang', py: 'is_valid_lang', ps1: 'Test-LangCode', + variants: [ + { id: 'base', authority: 'template-add', consumers: ['help-add'] }, + ], + }, { name: 'write_utf8_bom', py: 'write_utf8_bom', ps1: null, variants: [