"""Leva a descrição NOBRADE para o mural: grava no `meta` de cada peça do web/atlas/atlas-map.json o código de referência, a data normalizada, a série e o suporte, sem re-renderizar os atlas .webp. python -m nobrade.mural (de dentro de pipeline/, depois de python -m nobrade) Campos novos em meta (curtos: o mapa inteiro desce para o navegador): ref código de referência (1.1) dt data na forma da NOBRADE (1.3) ano ano inicial, para o histograma si índice em `series` do mapa (nível 3) sup espécie e suporte (1.5) rep categoria de reprodução (4.2) ai índice em `autoridades` (2.1, forma autorizada ISAAR(CPF)) dq 1 quando a data foi atribuída pelo arquivista (proc. 1.3.3.2) No topo do mapa: `series`, `autoridades`, `instituicoes` (community → nome autorizado), `colecao` (código e título do nível 1) e `grande` (há derivada de 2.000 px para o zoom). """ import json from .config import COLECAO_TITULO, GRANDE, INSTITUICOES, RAIZ, SAIDA, codigo MAPA = RAIZ / 'web' / 'atlas' / 'atlas-map.json' def ano(p: dict): """O ano que posiciona a peça no histograma — só quando a data é precisa o bastante (até 30 anos). "[18--]" ou "[1880-1930?]" ficam na ficha, fora do filtro.""" i, f = p.get('inicio'), p.get('fim') if i and f and f - i <= 30: return i return None def main(): series, dossies = {}, {} for linha in (SAIDA / 'unidades.jsonl').open(encoding='utf-8'): u = json.loads(linha) if u['nivel'] == 3: series[u['id']] = u['1.2']['titulo'] elif u['nivel'] == 4: dossies[u['handle']] = u d = json.loads(MAPA.read_text(encoding='utf-8')) titulos = sorted(set(series.values()), key=str.casefold) idx = {t: i for i, t in enumerate(titulos)} d['series'] = titulos formas = sorted({p['forma'] for u in dossies.values() for p in u['2.1'] if p.get('id')}, key=str.casefold) ai = {f: i for i, f in enumerate(formas)} d['autoridades'] = formas d['instituicoes'] = {k: v[1] for k, v in INSTITUICOES.items()} d['colecao'] = {'codigo': codigo('BF'), 'titulo': COLECAO_TITULO} d['grande'] = GRANDE # o visor só pede derivados/grande/ quando isto é verdade feitos = 0 for h, e in d['map'].items(): u = dossies.get(h) if not u: continue p = u['1.3']['producao'] dim = u['1.5'] sup = dim['especie'] + (f" {dim['cor']}" if dim.get('cor') else '') + (f", {dim['suporte']}" if dim.get('suporte') else '') e['meta'].update({ 'ref': u['1.1'], 'dt': p.get('forma'), 'ano': ano(p), 'si': idx[series[u['pai']]], 'sup': sup, 'rep': u['4.2']['categoria'], }) aut = next((p['forma'] for p in u['2.1'] if p.get('id')), None) if e['meta'].get('ano') is None: e['meta'].pop('ano', None) e['meta'].pop('ai', None) e['meta'].pop('dq', None) if aut: e['meta']['ai'] = ai[aut] if (p.get('notas') or [''])[0].startswith('data atribuída pelo arquivista'): e['meta']['dq'] = 1 feitos += 1 MAPA.write_text(json.dumps(d, ensure_ascii=False, separators=(',', ':')), encoding='utf-8') print(f'{feitos} de {len(d["map"])} peças com descrição NOBRADE; {len(titulos)} séries') if __name__ == '__main__': main()