fix(template-add,help-add): закрыть находки ревью по коду языка и странице

help-add терял текст справки. Отказ смотрит только на Help.xml, а страница может
пережить его (удалённый дескриптор, частичная выгрузка, справка, сделанная руками):
тогда запись шла безусловно и стирала содержимое с кодом 0 и рапортом [OK].
Теперь существующая страница сохраняется, создаётся только дескриптор — та же
защита, что уже стоит в template-add. Прежняя оценка «в help-add потери данных нет»
была неверной: она опиралась на чтение кода, а не на замер.

Код языка: регулярка пропускала имена устройств Windows. При -Lang nul py-порт
молча писал <Page>nul</Page> и пустой каталог с кодом 0 (страница уходила в NUL),
а PS падал исключением — то есть порты ещё и расходились. Якоря \A…\z вместо ^…$:
последние в обоих языках допускают перевод строки в конце.

Проверка вынесена в Test-LangCode / is_valid_lang и внесена в реестр
check-inline-drift: inline-блок гард не видел, а копий у него две.

Плюс мелочи оттуда же: мёртвый дизъюнкт в $pageExists убран; полумигрированное
дерево (дескриптор есть, старый Ext/Template.html остался рядом) теперь получает
предупреждение, а не молчание; существование страницы в py сверяется без учёта
регистра — иначе на Linux -Lang RU писал бы вторую страницу мимо дескриптора.

Четыре кейса на каждый сценарий. Существующие эталоны не сдвинулись.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-09-22 18:50:58 +03:00
co-authored by Claude Opus 5
parent c619da4a0a
commit dc470a3803
20 changed files with 359 additions and 31 deletions
+9
View File
@@ -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: [