From 915478aef931cb57fe56fe568ab4982454a29812 Mon Sep 17 00:00:00 2001 From: Miguel Dalberto Pedro Date: Thu, 29 Oct 2026 17:55:36 -0300 Subject: Initial commit: Padre Matos Soares (1932) Bible corpus and pms CLI --- scripts/generate_c_data.py | 151 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 scripts/generate_c_data.py (limited to 'scripts/generate_c_data.py') diff --git a/scripts/generate_c_data.py b/scripts/generate_c_data.py new file mode 100644 index 0000000..3afad0e --- /dev/null +++ b/scripts/generate_c_data.py @@ -0,0 +1,151 @@ +#!/usr/bin/env python3 +""" +Generate src/pms_data.c from data/pms.tsv and data/pms_notes.tsv. +""" + +import os + +REPO_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +TSV_PATH = os.path.join(REPO_DIR, "data", "pms.tsv") +NOTES_TSV_PATH = os.path.join(REPO_DIR, "data", "pms_notes.tsv") +OUT_C_PATH = os.path.join(REPO_DIR, "src", "pms_data.c") + +BOOK_ALIASES = { + 1: "gn,gen,genesis", + 2: "ex,exo,exodo", + 3: "lv,lev,levitico", + 4: "nm,num,numeros", + 5: "dt,deut,deuteronomio", + 6: "js,jos,josue", + 7: "jz,juiz,juizes", + 8: "rt,rut,rute", + 9: "1rs,1reis,ireis,1sm,1sam,1samuel,isamuel", + 10: "2rs,2reis,iireis,2sm,2sam,2samuel,iisamuel", + 11: "3rs,3reis,iiireis", + 12: "4rs,4reis,ivreis", + 13: "1par,1paralipomenos,iparalipomenos,1cr,1cron,1cronicas,icronicas", + 14: "2par,2paralipomenos,iiparalipomenos,2cr,2cron,2cronicas,iicronicas", + 15: "1esd,1esdras,iesdras,esd,esdras", + 16: "2esd,2esdras,iiesdras,ne,nee,neemias", + 17: "tb,tob,tobias", + 18: "jt,jdt,judit,judite", + 19: "est,ester", + 20: "job,jo", + 21: "sl,sal,salmo,salmos,ps,psalmos", + 22: "pr,prov,proverbios", + 23: "ecl,eclesiastes,qo,coelet", + 24: "ct,cant,cantico,canticos,canticodoscanticos", + 25: "sb,sab,sabedoria", + 26: "eclo,eclesiastico,sir,siracide,bensira", + 27: "is,isa,isaias", + 28: "jr,jer,jeremias", + 29: "lm,lam,lamentacoes", + 30: "br,bar,baruc", + 31: "ez,eze,ezeq,ezequiel", + 32: "dn,dan,daniel", + 33: "os,ose,oseas,oseias", + 34: "jl,joel", + 35: "am,amos", + 36: "abd,ab,abdias,ob,obadias", + 37: "jn,jon,jonas", + 38: "mq,miq,miqueas,miqueias", + 39: "na,nau,naum", + 40: "hab,hc,habacuc,habacuque", + 41: "sf,sof,sofonias", + 42: "ag,ageu", + 43: "zc,zac,zacarias", + 44: "ml,mal,malaquias", + 45: "1mc,1mac,1macabeus,imacabeus", + 46: "2mc,2mac,2macabeus,iimacabeus", + 47: "mt,mat,mateus,smateus,saomateus", + 48: "mc,mar,marcos,smarcos,saomarcos", + 49: "lc,luc,lucas,slucas,saolucas", + 50: "jo,joao,sjoao,saojoao", + 51: "at,act,atos,actos,actosdosapostolos,atosdosapostolos", + 52: "rm,rom,romanos", + 53: "1cor,1co,1corintios,icorintios", + 54: "2cor,2co,2corintios,iicorintios", + 55: "gl,gal,galatas", + 56: "ef,efe,efesios", + 57: "fp,flp,fil,filipenses", + 58: "cl,col,colossenses", + 59: "1ts,1tes,1tessalonicenses,itessalonicenses", + 60: "2ts,2tes,2tessalonicenses,iitessalonicenses", + 61: "1tm,1tim,1timoteo,itimoteo", + 62: "2tm,2tim,2timoteo,iitimoteo", + 63: "tt,tit,tito", + 64: "fm,flm,filemon", + 65: "hb,heb,hebreus", + 66: "tg,tiago,stiago,saotiago", + 67: "1pd,1pe,1ped,1pedro,1spedro,ipedro", + 68: "2pd,2pe,2ped,2pedro,2spedro,iipedro", + 69: "1jo,1joao,1sjoao,ijoao", + 70: "2jo,2joao,2sjoao,iijoao", + 71: "3jo,3joao,3sjoao,iiijoao", + 72: "jd,jud,judas,sjudas,saojudas", + 73: "ap,apoc,apocalipse", +} + +def c_escape(s): + return s.replace("\\", "\\\\").replace('"', '\\"').replace("\n", "\\n").replace("\r", "") + +def main(): + books = {} + verses = [] + with open(TSV_PATH, "r", encoding="utf-8") as f: + for line in f: + line = line.rstrip("\n") + if not line: + continue + parts = line.split("\t") + if len(parts) < 6: + continue + bname, babbr, bnum_s, cnum_s, vnum_s, vtext = parts[:6] + bnum = int(bnum_s) + cnum = int(cnum_s) + vnum = int(vnum_s) + if bnum not in books: + books[bnum] = (bname, babbr) + verses.append((bnum, cnum, vnum, vtext)) + + notes = [] + if os.path.exists(NOTES_TSV_PATH): + with open(NOTES_TSV_PATH, "r", encoding="utf-8") as f: + for line in f: + line = line.rstrip("\n") + if not line: + continue + parts = line.split("\t") + if len(parts) < 6: + continue + bnum_s, cnum_s, vs_s, ve_s, label, ntext = parts[:6] + notes.append((int(bnum_s), int(cnum_s), int(vs_s), int(ve_s), label, ntext)) + + with open(OUT_C_PATH, "w", encoding="utf-8") as out: + out.write('/* Auto-generated from data/pms.tsv and data/pms_notes.tsv. Do not edit manually. */\n') + out.write('#include "pms_data.h"\n\n') + + out.write("pms_book pms_books[] = {\n") + for bnum in sorted(books.keys()): + bname, babbr = books[bnum] + aliases = BOOK_ALIASES.get(bnum, babbr.lower()) + out.write(f' {{{bnum}, "{c_escape(bname)}", "{c_escape(babbr)}", "{c_escape(aliases)}"}},\n') + out.write("};\n") + out.write(f"int pms_books_length = {len(books)};\n\n") + + out.write("pms_verse pms_verses[] = {\n") + for bnum, cnum, vnum, vtext in verses: + out.write(f' {{{bnum}, {cnum}, {vnum}, "{c_escape(vtext)}"}},\n') + out.write("};\n") + out.write(f"int pms_verses_length = {len(verses)};\n\n") + + out.write("pms_note pms_notes[] = {\n") + for bnum, cnum, vs, ve, label, ntext in notes: + out.write(f' {{{bnum}, {cnum}, {vs}, {ve}, "{c_escape(label)}", "{c_escape(ntext)}"}},\n') + out.write("};\n") + out.write(f"int pms_notes_length = {len(notes)};\n") + + print(f"Generated {OUT_C_PATH} ({len(books)} books, {len(verses)} verses, {len(notes)} notes).") + +if __name__ == "__main__": + main() -- cgit v1.2.3