from pathlib import Path
import re,json,hashlib
from bs4 import BeautifulSoup
R=Path('/mnt/data/work4100/site');E=R/'доказательства/редакция-4.10.0';records=[]
replacements={
'Машинная производная восстановленных материалов 4.7.0-wip. Входной ZIP повреждён; происхождение четырёх восстановленных страниц указано в журнале качества.':'Машинная производная проверенных наборов 4.9.0 и полного корня 4.8.0. Полный ZIP 4.9.0 не получен; семь точных HTML этой редакции отсутствуют. Исторический пробел четырёх страниц 4.7.0 учтён отдельно.',
'Это новая производная 4.10.0 из исторической оболочки 4.6.0 и проверенных сценариев 4.7.0, а не тождественная копия прежней страницы.':'Производная 4.8.0 была создана из исторической оболочки 4.6.0 и проверенных сценариев 4.7.0. Нынешняя редакция продолжает доступные материалы 4.9.0; это не тождественное восстановление отсутствовавших страниц.',
'Корневой вход повреждён; четыре страницы восстановлены как новые производные. Состояние внешних рубежей не изменено.':'Исторический пробел относится к 4.7.0. Текущий полный ZIP 4.9.0 не получен; его наборы и целый 4.8.0 проверены. Новые правила и точное происхождение указаны ниже.',
'Повреждённый вход и происхождение':'Исторический пробел и нынешнее происхождение',
'Извлечённая копия обслуживается отдельным процессом.':'Извлечённая копия проверяется локальным HTTP-сервером. Он не является независимо управляемой средой.',
'Пересобрать финальный выпуск без метки незавершённости.':'Пересобрать пакет. Метку незавершённости снимать только после подтверждения всех внутренних и внешних рубежей.',
}
for p in R.rglob('*.html'):
 old=p.read_text();new=old
 historic=re.search(r'<main\b[^>]*>.*?</main>',old,re.S) if 'docs/исследования/' in p.as_posix() else None
 for a,b in replacements.items():new=new.replace(a,b)
 if historic:
  curr=re.search(r'<main\b[^>]*>.*?</main>',new,re.S);new=new[:curr.start()]+historic.group()+new[curr.end():]
 if old!=new:
  save=E/'редакторские-исходники'/(p.relative_to(R).as_posix()+'.txt');save.parent.mkdir(parents=True,exist_ok=True);save.write_text(old)
  p.write_text(new);records.append({'страница':p.relative_to(R).as_posix(),'исходник':save.relative_to(R).as_posix(),'до_SHA256':hashlib.sha256(old.encode()).hexdigest(),'после_SHA256':hashlib.sha256(new.encode()).hexdigest(),'вид':'Редакторская машинная производная текущей оболочки; исторический основной блок не изменён'})
p=R/'память-уаикс.html';t=p.read_text();s=BeautifulSoup(t,'html.parser')
# Clarify old-topic section that is not the six newly added modules.
for head in s.find_all(['h2','h3']):
 if head.get_text(' ',strip=True)=='Текущие модули 4.10.0':head.string='Историческая основа модулей 4.8.0'
# Do not serialize entire document: apply equivalent minimal replacements.
t=t.replace('>Текущие модули 4.10.0<','>Историческая основа модулей 4.8.0<')
count=len(list((R/'данные').glob('*.json')))
t=re.sub(r'\d+ файл(?:а|ов)? JSON верхнего уровня',str(count)+' файлов JSON верхнего уровня',t);p.write_text(t)
(E/'редакторский-проход.json').write_text(json.dumps({'редакция':'4.10.0-wip','исправления':records,'граница':'Адресная корректура актуальных оболочек; не полная ручная корректура всех исследований. Неверные прежние формулировки сохранены как исходники.'},ensure_ascii=False,indent=2)+'\n')
# Extend inventory updater to all Russian plural variants, avoiding stale 74 next to correct metric.
p=R/'инструменты/обновить-память-4-10.py';t=p.read_text().replace("r'\\d+ файлов JSON верхнего уровня ","r'\\d+ файл(?:а|ов)? JSON верхнего уровня ");p.write_text(t)
