from pathlib import Path
from bs4 import BeautifulSoup
import json,re,shutil,hashlib
R=Path('/mnt/data/work4110/site');E=R/'доказательства/редакция-4.11.0';changed=[]
for name in ['index.html','ведомость-выпуска.html','контроль-владельца.html','пакет-обжалования.html','память-уаикс.html','переносимый-аудит.html','реестр-требований.html']:
 p=R/name;raw=p.read_bytes();t=raw.decode();t=t.replace('Точный HTML 4.11.0 этой страницы не получен','Точный исходный HTML 4.10.0 этой страницы не получен')
 if name=='переносимый-аудит.html':t=t.replace('4.2.0, 4.3.0, 4.4.0, 4.5.0 или 4.11.0','редакций от 4.2.0 до 4.11.0, поддерживаемых явно указанным профилем схем')
 if name=='память-уаикс.html':
  def hist(m):
   s=m[0].replace('Память редакции 4.11.0','Историческая память редакции 4.6.0').replace('Рубежи редакции 4.11.0','Исторические рубежи 4.6.0').replace('решение-о-выпуске-4-8.uai','решение-о-выпуске-4-6.uai');return s
  t=re.sub(r'<section class="section" id="память-4-6">.*?</section>',hist,t,flags=re.S)
  t=t.replace('Текущий полный ZIP 4.9.0 не получен; его наборы и целый 4.8.0 проверены.', 'В проходе 4.10.0 полный ZIP 4.9.0 не был получен. В нынешнем проходе отсутствует полный ZIP 4.10.0; его три набора и полный корень 4.8.0 проверены.')
  t=t.replace('<a href="проверка-рубежей-4-8.uai">Рубежи редакции 4.11.0</a>','<a href="проверка-рубежей-4-8.uai">Исторические рубежи 4.8.0</a>').replace('<a href="решение-о-выпуске-4-8.uai">Решение о выпуске 4.11.0</a>','<a href="решение-о-выпуске-4-8.uai">Историческое решение 4.8.0</a>')
  u=json.loads((R/'uaix.uai').read_text());links=[]
  for url in u['новые_модули']:
   label=(R/url.lstrip('/')).read_text().splitlines()[0];links.append('<p><a href="'+url+'">'+label+'</a></p>')
  t=re.sub(r'<section class="методика-карта"><h2>Новые проверяемые модули 4.11.0</h2>.*?</section>', '<section class="методика-карта"><h2>Новые проверяемые модули 4.11.0</h2>'+''.join(links)+'<p>Машинные инженерные производные; внешнее исполнение и полномочия владельца не установлены.</p></section>',t,flags=re.S)
 if t.encode()!=raw:
  q=E/'редакторские-исходники'/ (name+'.txt');q.parent.mkdir(exist_ok=True,parents=True);q.write_bytes(raw);p.write_text(t);changed.append({'страница':name,'до_SHA256':hashlib.sha256(raw).hexdigest(),'после_SHA256':hashlib.sha256(t.encode()).hexdigest(),'причина':'Отделение номера текущей производной от отсутствующего оригинала; точные исторические подписи и перечень текущей памяти.'})
(E/'редактура-окончательная.json').write_text(json.dumps({'изменения':changed,'смешанные_алфавиты_и_ссылки':'Повторяются статическим сценарием','предел':'Адресный редакторский проход текущих оболочек, не полная ручная корректура исследовательского корпуса. Неверные номера возникли в преобразовании оболочки; не объявляются дефектом отсутствующего оригинала.'},ensure_ascii=False,indent=2)+'\n')
# Preserve first complete matrix; the final pass must cover every page again.
p=E/'офлайн-матрица-часть-000-086.json';shutil.copyfile(p,E/'офлайн-матрица-до-окончательной-редактуры.json')
print('Страниц изменено',len(changed))
