Ab 3309: erzeugt tags/<JJJJ>.json aus den automatischen Vorschlägen plus Claudes Korrekturen (tags_src/y<JJJJ>.py).
Ablage beim Arbeiten: tag_year.py. Herunterladen: auf den Dateinamen über dem Code klicken.
"""tag_year.py RAW JAHR MODUL -> tags/<JAHR>.json (automatische Vorschlaege + Korrekturen aus tags_src/<MODUL>.py)""" import json,re,sys,csv,importlib from pathlib import Path sys.path.insert(0,'tags_src'); import common as C; import names as N R=Path(sys.argv[1]); year=int(sys.argv[2]); O=importlib.import_module(sys.argv[3]).O def load(L): d={} for f in (R/L).glob('*.json'): if int(f.stem[:4])-1286==year: for a in json.load(open(f,encoding='utf-8'))['articles']: d[a['id']]=a return d EN,DE=load('EN'),load('DE') idx=[r for r in csv.DictReader(open(R/'index.csv',encoding='utf-8'),delimiter=';') if int(r['date'][:4])==year] def find(t,d): return sorted({v for k,v in d.items() if re.search(r'(?<![\w-])'+re.escape(k),t)}) inv=lambda d: {v:k for k,v in d.items()} out={} for i,r in enumerate(idx): a=EN.get(r['frontier_id']) or DE[r['frontier_id']]; de=DE.get(r['frontier_id'],{}) t=re.sub(r"\*?Pilots[’']? Federation (ALERT|Alert)\*?",'',a['title']+'\n'+a['body']) tg=dict(factions=find(t,N.FACTIONS),corporations=find(t,N.CORPORATIONS),persons=find(t,N.PERSONS),codex=find(t,N.CODEX), related=find(t,N.SHIPS),storyline=[]) sysc=set(re.findall(r"System(?:s)? ((?:[A-Z0-9][\w'+-]*)(?: (?:[A-Z0-9][\w'+-]*|Sector|[a-z]\d[\w-]*))*)",de.get('body',''))) sysc|=set(re.findall(r"the ((?:[A-Z0-9][\w'+.-]*)(?: [A-Z0-9][\w'+.-]*)*) system",a['body'])) tg['systems']=sorted({C.sys_id(s.rstrip('.')) for s in sysc}) o=O.get(i,{}) if 'f' in o: tg['factions']=[C.F[k] for k in o['f'].split()] if 'y' in o: tg['systems']=[C.sys_id(s) for s in o['y'].split(';') if s] if '+y' in o: tg['systems']+= [C.sys_id(s) for s in o['+y'].split(';')] if 'r' in o: tg['related']=[C.R[k] for k in o['r'].split()] for key,field,M in (('p','persons',C.P),('c','corporations',C.C),('x','codex',C.X)): for k in o.get('-'+key,'').split(): tg[field]=[v for v in tg[field] if v!=M[k]] for k in o.get('+'+key,'').split(): if M[k] not in tg[field]: tg[field].append(M[k]) tg['storyline']=[C.S[k] for k in o.get('s','').split()] # Caspian Leopold u. ae. sind keine Schiffe tg['related']=[x for x in tg['related'] if not (x.endswith('caspian_explorer') and 'Caspian Leopold' in t)] out[r['frontier_id']]={k:sorted(set(v)) for k,v in tg.items()} json.dump(out,open(f'tags/{year}.json','w'),ensure_ascii=False,indent=1) print(len(out),'Meldungen;', sum(len(v) for t in out.values() for k,v in t.items() if k!='related'),'Verknuepfungen')