aboutsummaryrefslogtreecommitdiff
path: root/scripts/generate_c_data.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/generate_c_data.py')
-rw-r--r--scripts/generate_c_data.py151
1 files changed, 151 insertions, 0 deletions
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()