package yuku.alkitabconverter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Scanner; import yuku.bintex.BintexWriter; public class KonvertPerikop { static String nama; public static void main(String[] args) throws Exception { nama = args[0]; new KonvertPerikop().convert("../Alkitab/publikasi/" + nama + "_perikop_1.txt", "../Alkitab/publikasi/" + nama + "_raw/" + nama + "_perikop_blok_bt.bt", "../Alkitab/publikasi/" + nama + "_raw/" + nama + "_perikop_index_bt.bt"); } int bolong = 0; private void convert(String nfi, String nfo, String nfindex) throws Exception { Scanner sc = new Scanner(new File(nfi)); BintexWriter out = new BintexWriter(new FileOutputStream(nfo)); BintexWriter index = new BintexWriter(new FileOutputStream(nfindex)); String judul = null; String perikop = null; ArrayList<String> xparalel = new ArrayList<>(); ArrayList<Integer> xofset = new ArrayList<>(); ArrayList<Integer> xari = new ArrayList<>(); while (sc.hasNextLine()) { String line = sc.nextLine().trim(); String isi; int jenis; if (line.startsWith("Judul: ")) { jenis = 1; isi = line.substring(7); } else if (line.startsWith("Perikop: ")) { jenis = 2; isi = line.substring(9); } else if (line.startsWith("Paralel: ")) { jenis = 3; isi = line.substring(9); } else { throw new RuntimeException("baris = " + line); } if (jenis == 1) { // cek sebelumnya ada ga if (judul != null) { u(xofset, xari, out, index, perikop); t(out, judul, xparalel); judul = null; perikop = null; xparalel.clear(); } judul = isi; } else if (jenis == 2) { if (perikop != null) throw new RuntimeException("harusnya perikop 1 aja"); perikop = isi; } else if (jenis == 3) { xparalel.add(isi); } } // terakhir! u(xofset, xari, out, index, perikop); t(out, judul, xparalel); if (xofset.size() == xari.size()) { index.writeInt(xofset.size()); // int adaBerapaEntri for (int i = 0; i < xofset.size(); i++) { index.writeInt(xari.get(i)); // ari untuk entri ini index.writeInt(xofset.get(i)); // ofset ke blok untuk entri ini } } else { throw new RuntimeException("xofset.size() != xari.size()"); } out.close(); index.close(); } static int lastAri = 0; private void u(ArrayList<Integer> xofset, ArrayList<Integer> xari, BintexWriter out, BintexWriter index, String perikop) throws IOException { int ofset = out.getPos(); if (perikop == null) { bolong++; xofset.add(ofset); } else { if (perikop.contains(";")) { String[] bag = perikop.split(";"); System.out.println("Perikop " + perikop + " disederhanakan jadi: " + bag[0]); perikop = bag[0]; } String[] s1 = perikop.split(" +"); if (s1.length != 2) { throw new RuntimeException("perikop = " + perikop); } int kitab = n2a(s1[0]); String pa; if (s1[1].contains("-")) { pa = s1[1].substring(0, s1[1].indexOf("-")); } else { pa = s1[1]; } String[] s2 = pa.split(":"); if (s2.length != 2 && s2.length != 1) { throw new RuntimeException("pa = " + pa + "; perikop = " + perikop); } int pasal = Integer.parseInt(s2[0]); int ayat = s2.length == 1? 1: Integer.parseInt(s2[1]); System.out.println("u: " + perikop + " -> " + kitab + " " + pasal + " " + ayat); int ari = kitab << 16 | pasal << 8 | ayat; if (ari < lastAri) { throw new RuntimeException("ari sekarang: " + ari + " lastAri: " + lastAri); } lastAri = ari; xari.add(ari); for (int i = 0; i < bolong; i++) { xari.add(ari); } bolong = 0; xofset.add(ofset); } } private void t(BintexWriter writer, String judul, ArrayList<String> xparalel) throws IOException { // tulis versi writer.writeUint8(1); // tulis judul writer.writeShortString(judul); // tulis nparalel writer.writeUint8(xparalel.size()); // tulis xparalel for (String paralel: xparalel) { writer.writeShortString(paralel); } } private static int n2a(String n) { for (int i = 0; i < nk.length; i++) { if (n.equals(nk[i])) { return i; } } throw new RuntimeException("n = " + n); } static String[] nk = { "Kej", "Kel", "Im", "Bil", "Ul", "Yos", "Hak", "Rut", "1Sam", "2Sam", "1Raj", "2Raj", "1Taw", "2Taw", "Ezr", "Neh", "Est", "Ayub", "Mazm", "Ams", "Pengkh", "Kid", "Yes", "Yer", "Rat", "Yeh", "Dan", "Hos", "Yoel", "Am", "Ob", "Yun", "Mi", "Nah", "Hab", "Zef", "Hag", "Za", "Mal", "Mat", "Mrk", "Luk", "Yoh", "Kis", "Rom", "1Kor", "2Kor", "Gal", "Ef", "Fili", "Kol", "1Tes", "2Tes", "1Tim", "2Tim", "Tit", "Filem", "Ibr", "Yak", "1Pet", "2Pet", "1Yoh", "2Yoh", "3Yoh", "Yud", "Wahy", }; }