package yuku.alkitabconverter.en_kjv_thml;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Scanner;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.ext.DefaultHandler2;
public class Proses {
private final SAXParserFactory factory = SAXParserFactory.newInstance();
private Handler handler;
PrintWriter pw;
String redTerakhir = null;
String scTerakhir = null;
public static void main(String[] args) throws Exception {
new Proses().loadUpTheData();
}
public void loadUpTheData() throws Exception {
handler = new Handler();
new File("./bahan/en-kjv-thml/in/kjv-patched.xml").delete();
// patch dulu
Process p = new ProcessBuilder("patch", "-o", "./bahan/en-kjv-thml/in/kjv-patched.xml", new File("./bahan/en-kjv-thml/in/kjv.xml").getCanonicalPath(), "./bahan/en-kjv-thml/in/kjv.patch")
.redirectErrorStream(true)
.start();
Scanner sc = new Scanner(p.getInputStream());
while (sc.hasNextLine()) {
System.out.println(sc.nextLine());
}
sc.close();
p.waitFor();
InputStream in = new FileInputStream("./bahan/en-kjv-thml/in/kjv-patched.xml");
pw = new PrintWriter(new File("./bahan/en-kjv-thml/in/kjv.proses"), "utf-8");
SAXParser parser = factory.newSAXParser();
parser.getXMLReader().setFeature("http://xml.org/sax/features/namespaces", true);
parser.parse(in, handler);
pw.close();
}
public class Handler extends DefaultHandler2 {
String[] tree = new String[80];
int depth = 0;
StringBuilder b = new StringBuilder();
boolean simpan = true;
boolean sudahSelesaiSemua = false;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
tree[depth++] = localName;
if (b.length() != 0) {
System.out.println(b);
output(b);
b.setLength(0);
}
System.out.print("(start:) "); cetak();
String alamat = alamat();
if (alamat.endsWith("/scripture")) {
String parsed = attributes.getValue("parsed");
System.out.println(parsed);
output("\n#ayat:" + parsed + "\n");
} else if (alamat.endsWith("/sup") || alamat.endsWith("/h4") || alamat.endsWith("/h3") || alamat.endsWith("/h2") || alamat.endsWith("/h1")) {
simpan = false;
System.out.println("(simpan=false)");
}
if (alamat.startsWith("/ThML/ThML.body/div1/div2/div3/p")) {
if (alamat.endsWith("/i")) {
output("<i>");
System.out.println("<i>");
}
if (alamat.endsWith("/span") && "red".equals(attributes.getValue("class"))) {
output("<red>");
System.out.println("<red>");
redTerakhir = alamat;
}
if (alamat.endsWith("/span") && "sc".equals(attributes.getValue("class"))) {
output("<sc>");
System.out.println("<sc>");
scTerakhir = alamat;
}
}
if ("Indexes".equals(attributes.getValue("title"))) {
// selesai
sudahSelesaiSemua = true;
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (simpan && !sudahSelesaiSemua) b.append(ch, start, length);
}
private void cetak() {
for (int i = 0; i < depth; i++) {
System.out.print('/');
System.out.print(tree[i]);
}
System.out.println();
}
private StringBuilder a = new StringBuilder();
private String alamat() {
a.setLength(0);
for (int i = 0; i < depth; i++) {
a.append('/').append(tree[i]);
}
return a.toString();
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (b.length() != 0) {
System.out.println(b);
output(b);
b.setLength(0);
}
System.out.print("(end:) "); cetak();
String alamat = alamat();
if (alamat.startsWith("/ThML/ThML.body/div1/div2/div3/p")) {
if (alamat.endsWith("/i")) {
output("</i>");
System.out.println("</i>");
}
if (alamat.endsWith("/span") && alamat.equals(redTerakhir)) {
output("</red>");
System.out.println("</red>");
redTerakhir = null;
}
if (alamat.endsWith("/span") && alamat.equals(scTerakhir)) {
output("</sc>");
System.out.println("</sc>");
scTerakhir = null;
}
}
if (alamat.endsWith("/sup") || alamat.endsWith("/h4") || alamat.endsWith("/h3") || alamat.endsWith("/h2") || alamat.endsWith("/h1")) {
simpan = true;
System.out.println("(simpan=true)");
}
tree[--depth] = null;
}
}
public void output(Object x) {
if (x.equals("<sc>") || x.equals("</sc>")) {
return;
}
if (scTerakhir != null) {
pw.print(x.toString().toUpperCase());
} else {
pw.print(x);
}
}
}