package yuku.alkitabconverter.yet;
import yuku.alkitab.model.FootnoteEntry;
import yuku.alkitab.model.XrefEntry;
import yuku.alkitab.util.Ari;
import yuku.alkitab.yes2.model.PericopeData;
import yuku.alkitabconverter.util.FootnoteDb;
import yuku.alkitabconverter.util.Rec;
import yuku.alkitabconverter.util.TextDb;
import yuku.alkitabconverter.util.XrefDb;
import yuku.alkitabconverter.yes_common.Yes2Common;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
public class YetFileOutput {
private final OutputStream output;
private TextDb textDb;
private PericopeData pericopeData;
private XrefDb xrefDb;
private FootnoteDb footnoteDb;
private Yes2Common.VersionInfo versionInfo;
public YetFileOutput(File output) throws IOException {
this.output = new FileOutputStream(output);
}
public YetFileOutput(OutputStream output) {
this.output = output;
}
public void setTextDb(final TextDb textDb) {
this.textDb = textDb;
}
public void setPericopeData(final PericopeData pericopeData) {
this.pericopeData = pericopeData;
}
public void setXrefDb(final XrefDb xrefDb) {
this.xrefDb = xrefDb;
}
public void setFootnoteDb(final FootnoteDb footnoteDb) {
this.footnoteDb = footnoteDb;
}
public void setVersionInfo(Yes2Common.VersionInfo versionInfo) {
this.versionInfo = versionInfo;
}
public void write() throws IOException {
final PrintWriter pw = new PrintWriter(new OutputStreamWriter(output, "utf-8"));
// info
final Map<String, String> info = new LinkedHashMap<>();
if (versionInfo.locale != null) info.put("locale", versionInfo.locale);
if (versionInfo.shortName != null) info.put("shortName", versionInfo.shortName);
if (versionInfo.longName != null) info.put("longName", versionInfo.longName);
if (versionInfo.description != null) info.put("description", versionInfo.description);
for (Map.Entry<String, String> e : info.entrySet()) {
pw.printf(Locale.US, "%s\t%s\t%s\n", "info", e.getKey(), e.getValue().replaceAll("[\\r\\n]", " ") /* no newlines allowed */);
}
final int[] bookIds = textDb.getBookIds();
// book names
for (final int bookId : bookIds) {
final String bookShortName = versionInfo.getBookShortName(bookId);
final String bookAbbreviation = versionInfo.getBookAbbreviation(bookId);
if (bookAbbreviation == null) {
pw.printf(Locale.US, "%s\t%s\t%s\n", "book_name", bookId + 1, bookShortName);
} else {
pw.printf(Locale.US, "%s\t%s\t%s\t%s\n", "book_name", bookId + 1, bookShortName, bookAbbreviation);
}
}
// verses
for (Rec rec : textDb.toRecList()) {
pw.printf(Locale.US, "%s\t%s\t%s\t%s\t%s\n", "verse", rec.book_1, rec.chapter_1, rec.verse_1, rec.text);
}
// pericope data
if (pericopeData != null && pericopeData.entries != null) for (final PericopeData.Entry entry : pericopeData.entries) {
pw.printf(Locale.US, "%s\t%s\t%s\t%s\t%s\n", "pericope", Ari.toBook(entry.ari) + 1, Ari.toChapter(entry.ari), Ari.toVerse(entry.ari), entry.block.title);
if (entry.block.parallels != null) {
for (final String parallel : entry.block.parallels) {
pw.printf(Locale.US, "%s\t%s\n", "parallel", parallel);
}
}
}
// xref
if (xrefDb != null) {
xrefDb.processEach(new XrefDb.XrefProcessor() {
@Override
public void process(final XrefEntry xe, final int ari, final int entryIndex) {
pw.printf(Locale.US, "%s\t%s\t%s\t%s\t%s\t%s\n", "xref", Ari.toBook(ari) + 1, Ari.toChapter(ari), Ari.toVerse(ari), entryIndex + 1, xe.content);
}
});
}
// footnotes
if (footnoteDb != null) {
footnoteDb.processEach(new FootnoteDb.FootnoteProcessor() {
@Override
public void process(final FootnoteEntry fe, final int ari, final int entryIndex) {
pw.printf(Locale.US, "%s\t%s\t%s\t%s\t%s\t%s\n", "footnote", Ari.toBook(ari) + 1, Ari.toChapter(ari), Ari.toVerse(ari), entryIndex + 1, fe.content);
}
});
}
pw.close();
}
}