use of biblemulticonverter.data.MetadataBook in project BibleMultiConverter by schierlm.
the class HaggaiXML method createXMLBible.
protected XMLBIBLE createXMLBible(Bible bible) throws Exception {
ObjectFactory of = new ObjectFactory();
XMLBIBLE doc = of.createXMLBIBLE();
doc.setBiblename(bible.getName());
doc.setINFORMATION(new JAXBElement<INFORMATION>(new QName("INFORMATION"), INFORMATION.class, of.createINFORMATION()));
MetadataBook metadata = bible.getMetadataBook();
if (metadata != null) {
for (String key : metadata.getKeys()) {
String value = metadata.getValue(key);
if (value.equals("-empty-"))
value = "";
if (key.equals(MetadataBookKey.status.toString())) {
doc.setStatus(ModuleStatus.fromValue(value));
} else if (key.equals(MetadataBookKey.version.toString())) {
doc.setVersion(value);
} else if (key.equals(MetadataBookKey.revision.toString())) {
doc.setRevision(new BigInteger(value));
} else if (!key.contains("@")) {
Pattern regex = INFORMATION_FIELDS.get(MetadataBookKey.valueOf(key));
if (regex != null && regex.matcher(value).matches())
doc.getINFORMATION().getValue().getTitleOrCreatorOrDescription().add(new JAXBElement<String>(new QName(key), String.class, value));
}
}
}
for (Book bk : bible.getBooks()) {
if (bk.getId().equals(BookID.METADATA))
continue;
if (bk.getId().getZefID() <= 0) {
System.out.println("WARNING: Unable to export book " + bk.getAbbr());
continue;
}
BIBLEBOOK bb = of.createBIBLEBOOK();
bb.setBnumber(BigInteger.valueOf(bk.getId().getZefID()));
bb.setBsname(bk.getShortName());
bb.setBname(bk.getLongName());
int cnumber = 0;
for (Chapter ccc : bk.getChapters()) {
cnumber++;
if (ccc.getVerses().size() == 0)
continue;
CHAPTER cc = of.createCHAPTER();
cc.setCnumber(BigInteger.valueOf(cnumber));
bb.getCAPTIONOrPROLOGOrREMARK().add(new JAXBElement<CHAPTER>(new QName("CHAPTER"), CHAPTER.class, cc));
if (ccc.getProlog() != null) {
PROLOG prolog = of.createPROLOG();
ccc.getProlog().accept(new CreateContentVisitor(of, prolog.getContent(), null));
cc.getCAPTIONOrPARAGRAPHOrVERSE().add(new JAXBElement<PROLOG>(new QName("PROLOG"), PROLOG.class, prolog));
}
for (VirtualVerse vv : ccc.createVirtualVerses()) {
for (Headline h : vv.getHeadlines()) {
CAPTION caption = of.createCAPTION();
h.accept(new CreateContentVisitor(of, caption.getContent(), null));
cc.getCAPTIONOrPARAGRAPHOrVERSE().add(new JAXBElement<CAPTION>(new QName("CAPTION"), CAPTION.class, caption));
}
VERSE vers = of.createVERSE();
vers.setVnumber(BigInteger.valueOf(vv.getNumber()));
for (Verse v : vv.getVerses()) {
if (!v.getNumber().equals("" + vv.getNumber())) {
STYLE verseNum = of.createSTYLE();
verseNum.setFs(TStyleFix.BOLD);
verseNum.getContent().add("(" + v.getNumber() + ")");
vers.getContent().add(new JAXBElement<STYLE>(new QName("STYLE"), STYLE.class, verseNum));
vers.getContent().add(" ");
}
v.accept(new CreateContentVisitor(of, vers.getContent(), vers));
}
cc.getCAPTIONOrPARAGRAPHOrVERSE().add(new JAXBElement<VERSE>(new QName("VERSE"), VERSE.class, vers));
}
}
doc.getBIBLEBOOK().add(new JAXBElement<BIBLEBOOK>(new QName("BIBLEBOOK"), BIBLEBOOK.class, bb));
}
return doc;
}
use of biblemulticonverter.data.MetadataBook in project BibleMultiConverter by schierlm.
the class HaggaiXML method parseBible.
protected Bible parseBible(XMLBIBLE doc) throws Exception {
Bible result = new Bible(doc.getBiblename());
MetadataBook metadata = new MetadataBook();
if (doc.getStatus() != null) {
metadata.setValue(MetadataBookKey.status, doc.getStatus().value());
}
if (doc.getVersion() != null) {
metadata.setValue(MetadataBookKey.version, doc.getVersion());
}
if (doc.getRevision() != null) {
metadata.setValue(MetadataBookKey.revision, doc.getRevision().toString());
}
for (JAXBElement<?> elem : doc.getINFORMATION().getValue().getTitleOrCreatorOrDescription()) {
if (elem.getValue() == null)
continue;
String value = normalize(elem.getValue().toString(), true).trim();
if (value.length() != 0)
metadata.setValue(elem.getName().getLocalPart(), value);
}
if (metadata.getKeys().size() > 0) {
metadata.finished();
result.getBooks().add(metadata.getBook());
}
Set<String> abbrs = new HashSet<String>();
Set<String> shortnames = new HashSet<String>();
Map<BookID, String> abbrMap = new EnumMap<BookID, String>(BookID.class);
List<JAXBElement<BIBLEBOOK>> nl = doc.getBIBLEBOOK();
for (JAXBElement<BIBLEBOOK> ee : nl) {
BIBLEBOOK e = ee.getValue();
String shortname = e.getBsname();
int number = e.getBnumber().intValue();
BookID bookID;
try {
bookID = BookID.fromZefId(number);
} catch (IllegalArgumentException ex) {
continue;
}
if (shortname == null || shortname.length() == 0)
shortname = "_" + bookID.getOsisID();
String abbr = shortname.replaceAll("[^A-Z0-9a-zäöü]++", "");
if (abbr.length() == 0 || Character.isLowerCase(abbr.charAt(0)))
abbr = "X" + abbr;
if (abbr.length() == 1)
abbr += "x";
if (abbrs.contains(abbr)) {
for (int i = 2; i < 100; i++) {
if (!abbrs.contains(abbr + i)) {
abbr = abbr + i;
break;
}
}
}
abbrs.add(abbr);
abbrMap.put(bookID, abbr);
}
abbrs.clear();
EnumMap<BookID, Book> existingBooks = new EnumMap<BookID, Book>(BookID.class);
for (JAXBElement<BIBLEBOOK> ee : nl) {
BIBLEBOOK e = ee.getValue();
String shortname = e.getBsname();
String longname = e.getBname();
int number = e.getBnumber().intValue();
BookID bookID;
try {
bookID = BookID.fromZefId(number);
} catch (IllegalArgumentException ex) {
System.out.println("WARNING: Skipping book with unknown id " + number);
continue;
}
if (shortname == null || shortname.length() == 0)
shortname = "_" + bookID.getOsisID();
if (longname == null || longname.length() == 0)
longname = "_" + bookID.getEnglishName();
else
longname = longname.replaceAll(" ++", " ").trim();
String abbr = shortname.replaceAll("[^A-Z0-9a-zäöü]++", "");
if (abbr.length() == 0 || Character.isLowerCase(abbr.charAt(0)))
abbr = "X" + abbr;
if (abbr.length() == 1)
abbr += "x";
if (abbrs.contains(abbr)) {
for (int i = 2; i < 100; i++) {
if (!abbrs.contains(abbr + i)) {
abbr = abbr + i;
break;
}
}
}
abbrs.add(abbr);
if (shortname.equals("Gen") && longname.equals("Genesis") && bookID == BookID.BOOK_Exod) {
System.out.println("WARNING: Book number " + bookID.getZefID() + " has name " + longname);
shortname = "Exo";
longname = "Exodus";
}
if (shortname.equals("1Chr") && longname.equals("2 Chronicles")) {
System.out.println("WARNING: Book name 2 Chronicles has short name 1Chr");
shortname = "2Chr";
}
if (shortnames.contains(shortname)) {
System.out.println("WARNING: Duplicate short name " + shortname);
for (int i = 2; i < 100; i++) {
if (!shortnames.contains(shortname + i)) {
shortname = shortname + i;
break;
}
}
}
shortnames.add(shortname);
Book book = existingBooks.get(bookID);
if (book == null) {
book = new Book(abbr, bookID, shortname, longname);
existingBooks.put(bookID, book);
result.getBooks().add(book);
}
List<Headline> headlineBuffer = new ArrayList<Headline>();
for (JAXBElement<?> cpr : e.getCAPTIONOrPROLOGOrREMARK()) {
if (cpr.getValue() instanceof CAPTION) {
CAPTION caption = (CAPTION) cpr.getValue();
Headline h = new Headline(9);
if (parseContent(h.getAppendVisitor(), caption.getContent(), abbrMap)) {
h.trimWhitespace();
h.finished();
headlineBuffer.add(h);
}
} else if (cpr.getValue() instanceof CHAPTER) {
CHAPTER e2 = (CHAPTER) cpr.getValue();
int chapterNumber = e2.getCnumber().intValue();
while (book.getChapters().size() < chapterNumber) book.getChapters().add(new Chapter());
Chapter chapter = book.getChapters().get(chapterNumber - 1);
int existingVerses = chapter.getVerses().size();
for (Object e3 : e2.getCAPTIONOrPARAGRAPHOrVERSE()) {
parseChapterObject(e3, chapter, abbrMap, headlineBuffer);
}
for (Verse v : chapter.getVerses()) {
if (existingVerses > 0) {
existingVerses--;
continue;
}
v.finished();
}
} else {
throw new IOException(cpr.getValue().getClass().toString());
}
}
}
return result;
}
use of biblemulticonverter.data.MetadataBook in project BibleMultiConverter by schierlm.
the class MyBibleZone method doImport.
@Override
public Bible doImport(File inputFile) throws Exception {
SqlJetDb db = SqlJetDb.open(inputFile, false);
SqlJetDb footnoteDB = null;
File footnoteFile = new File(inputFile.getParentFile(), inputFile.getName().replace(".SQLite3", ".commentaries.SQLite3"));
if (inputFile.getName().endsWith(".SQLite3") && footnoteFile.exists()) {
footnoteDB = SqlJetDb.open(footnoteFile, false);
if (!footnoteDB.getTable("commentaries").getIndexesNames().contains("commentaries_index")) {
footnoteDB.close();
footnoteDB = SqlJetDb.open(footnoteFile, true);
checkIndex(footnoteDB, "commentaries", "commentaries_index", "CREATE INDEX commentaries_index on commentaries(book_number, chapter_number_from, verse_number_from)");
}
footnoteDB.beginTransaction(SqlJetTransactionMode.READ_ONLY);
}
if (!db.getTable("verses").getIndexesNames().contains("versesIndex") || (db.getSchema().getTable("stories") != null && !db.getTable("stories").getIndexesNames().contains("stories_index"))) {
db.close();
db = SqlJetDb.open(inputFile, true);
checkIndex(db, "verses", "verses_index", "CREATE UNIQUE INDEX verses_index on verses (book_number, chapter, verse)");
if (db.getSchema().getTable("stories") != null)
if (db.getSchema().getTable("stories").getColumn("order_if_several") == null)
checkIndex(db, "stories", "stories_index", "CREATE UNIQUE INDEX stories_index on stories(book_number, chapter, verse)");
else
checkIndex(db, "stories", "stories_index", "CREATE UNIQUE INDEX stories_index on stories(book_number, chapter, verse, order_if_several)");
}
db.beginTransaction(SqlJetTransactionMode.READ_ONLY);
String bibleName = null;
MetadataBook mb = new MetadataBook();
ISqlJetCursor cursor = db.getTable("info").open();
while (!cursor.eof()) {
String fn = cursor.getString("name");
String fv = cursor.getString("value");
if (fn.equals("description")) {
bibleName = fv;
} else if (!fv.isEmpty()) {
fv = fv.replaceAll("[\r\n]+", "\n").replaceAll(" *\n *", "\n").replaceAll("\n$", "");
try {
mb.setValue("MyBible.zone@" + fn.replace('_', '.'), fv);
} catch (IllegalArgumentException ex) {
System.out.println("WARNING: Skipping malformed metadata property " + fn);
}
}
cursor.next();
}
cursor.close();
if (bibleName == null) {
System.out.println("WARNING: No bible name in info table");
bibleName = inputFile.getName();
}
Bible result = new Bible(bibleName.trim());
if (!mb.getKeys().isEmpty()) {
mb.finished();
result.getBooks().add(mb.getBook());
}
Map<Integer, Book> bookIDMap = new HashMap<>();
cursor = db.getTable("books").open();
while (!cursor.eof()) {
int num = (int) cursor.getInteger("book_number");
String col = cursor.getString("book_color");
String shortName = cursor.getString("short_name").trim().replace(" ", "").replaceAll("[^A-Z0-9a-zäöü]++", "");
if (!shortName.isEmpty())
shortName = shortName.substring(0, 1).toUpperCase() + shortName.substring(1);
String longName = cursor.getString("long_name").trim();
BookID bid = null;
for (MyBibleZoneBook bi : BOOK_INFO) {
if (bi.bookNumber == num) {
bid = bi.bookID;
if (!col.equals(bi.bookColor))
System.out.println("WARNING: Book " + bid.getOsisID() + " uses color " + col + " and not " + bi.bookColor);
}
}
if (bid == null) {
System.out.println("WARNING: Book number " + num + " unknown; skipping: " + shortName + "/" + longName);
// generate dummy entry not stored in result object
bookIDMap.put(num, new Book("Xxx", BookID.BOOK_Gen, "X", "X"));
} else {
if (shortName.length() < 2)
shortName = bid.getOsisID().replaceAll("[^A-Z0-9a-zäöü]++", "");
Book bk = new Book(shortName, bid, longName, longName);
result.getBooks().add(bk);
bookIDMap.put(num, bk);
}
cursor.next();
}
cursor.close();
if (db.getSchema().getTable("introductions") != null) {
cursor = db.getTable("introductions").open();
while (!cursor.eof()) {
int num = (int) cursor.getInteger("book_number");
String intro = cursor.getString("introduction");
Book bk;
if (num == 0) {
bk = new Book("Intro", BookID.INTRODUCTION, "_Introduction_", "_Introduction_");
if (!result.getBooks().isEmpty() && result.getBooks().get(0).getId().equals(BookID.METADATA)) {
result.getBooks().add(1, bk);
} else {
result.getBooks().add(0, bk);
}
} else {
bk = bookIDMap.get(num);
}
if (bk == null) {
System.out.println("WARNING: Skipping introduction for nonexisting book " + num);
} else {
FormattedText ft = new FormattedText();
convertFromHTML(intro, ft.getAppendVisitor());
ft.finished();
if (bk.getChapters().isEmpty())
bk.getChapters().add(new Chapter());
bk.getChapters().get(0).setProlog(ft);
}
cursor.next();
}
cursor.close();
}
cursor = db.getTable("verses").order("verses_index");
while (!cursor.eof()) {
int b = (int) cursor.getInteger("book_number");
int c = (int) cursor.getInteger("chapter");
int v = (int) cursor.getInteger("verse");
String text = cursor.getString("text");
if (text == null)
text = "";
text = text.trim();
if (!text.isEmpty()) {
Book bk = bookIDMap.get(b);
if (bk == null) {
System.out.println("WARNING: Verse for unknown book " + b + " skipped");
} else {
while (bk.getChapters().size() < c) bk.getChapters().add(new Chapter());
Chapter ch = bk.getChapters().get(c - 1);
Verse vv = new Verse("" + v);
try {
String rest = convertFromVerse(text, vv.getAppendVisitor(), footnoteDB, new int[] { b, c, v });
if (!rest.isEmpty()) {
System.out.println("WARNING: Treating tags as plaintext: " + rest);
vv.getAppendVisitor().visitText(rest.replace('\t', ' ').replaceAll(" +", " "));
}
} catch (RuntimeException ex) {
throw new RuntimeException(text, ex);
}
ch.getVerses().add(vv);
vv.finished();
}
}
cursor.next();
}
cursor.close();
if (db.getSchema().getTable("stories") != null) {
cursor = db.getTable("stories").order("stories_index");
Map<Verse, List<FormattedText.Headline>> subheadings = new HashMap<>();
Map<Verse, Chapter> subheadingChapters = new HashMap<>();
while (!cursor.eof()) {
int b = (int) cursor.getInteger("book_number");
int c = (int) cursor.getInteger("chapter");
int v = (int) cursor.getInteger("verse");
String title = cursor.getString("title").trim();
Book bk = bookIDMap.get(b);
if (bk == null) {
System.out.println("WARNING: Subheading for unknown book " + b + " skipped");
} else if (bk.getChapters().size() < c) {
System.out.println("WARNING: Subheading for unknown chapter " + b + " " + c + " skipped");
} else {
Chapter ch = bk.getChapters().get(c - 1);
Verse vv = null;
for (Verse vvv : ch.getVerses()) {
if (vvv.getNumber().equals("" + v))
vv = vvv;
}
if (vv == null) {
System.out.println("WARNING: Subheading for unknown verse " + b + " " + c + ":" + v + " skipped");
} else {
List<FormattedText.Headline> hls = subheadings.get(vv);
if (hls == null) {
hls = new ArrayList<>();
subheadings.put(vv, hls);
subheadingChapters.put(vv, ch);
}
Headline hl = new Headline(1);
while (title.contains("<x>")) {
int pos = title.indexOf("<x>");
hl.getAppendVisitor().visitText(title.substring(0, pos));
title = title.substring(pos + 3);
pos = title.indexOf("</x>");
if (pos == -1)
System.out.println("WARNING: Unclosed cross reference: " + title);
else {
String ref = title.substring(0, pos);
title = title.substring(pos + 4);
hl.getAppendVisitor().visitFormattingInstruction(FormattingInstructionKind.BOLD).visitText(ref);
}
}
hl.getAppendVisitor().visitText(title);
hl.finished();
hls.add(hl);
}
}
cursor.next();
}
cursor.close();
for (Verse vv : subheadings.keySet()) {
Chapter cc = subheadingChapters.get(vv);
Verse vnew = new Verse(vv.getNumber());
for (Headline hl : subheadings.get(vv)) {
hl.accept(vnew.getAppendVisitor().visitHeadline(hl.getDepth()));
}
vv.accept(vnew.getAppendVisitor());
vnew.finished();
int pos = cc.getVerses().indexOf(vv);
cc.getVerses().set(pos, vnew);
}
}
if (footnoteDB != null) {
footnoteDB.commit();
footnoteDB.close();
}
db.commit();
db.close();
return result;
}
use of biblemulticonverter.data.MetadataBook in project BibleMultiConverter by schierlm.
the class MyBibleZone method doExport.
@Override
public void doExport(Bible bible, String... exportArgs) throws Exception {
String outfile = exportArgs[0];
if (!outfile.endsWith(".SQLite3"))
outfile += ".SQLite3";
boolean hasFootnotes = false, hasStrongs = false;
for (Book bk : bible.getBooks()) {
for (Chapter ch : bk.getChapters()) {
for (Verse vv : ch.getVerses()) {
String elementTypes = vv.getElementTypes(Integer.MAX_VALUE);
if (elementTypes.contains("f")) {
hasFootnotes = true;
}
if (elementTypes.contains("g")) {
hasStrongs = true;
}
}
}
}
new File(outfile).delete();
SqlJetDb db = SqlJetDb.open(new File(outfile), true);
db.getOptions().setAutovacuum(true);
db.beginTransaction(SqlJetTransactionMode.WRITE);
db.getOptions().setUserVersion(0);
db.createTable("CREATE TABLE info (name TEXT, value TEXT)");
db.createTable("CREATE TABLE books (book_number NUMERIC, book_color TEXT, short_name TEXT, long_name TEXT)");
db.createTable("CREATE TABLE introductions (book_number NUMERIC, introduction TEXT)");
db.createIndex("CREATE UNIQUE INDEX introductions_index on introductions(book_number)");
db.createTable("CREATE TABLE verses (book_number INTEGER, chapter INTEGER, verse INTEGER, text TEXT)");
db.createIndex("CREATE UNIQUE INDEX verses_index on verses (book_number, chapter, verse)");
db.createTable("CREATE TABLE stories (book_number NUMERIC, chapter NUMERIC, verse NUMERIC, order_if_several NUMERIC, title TEXT)");
db.createIndex("CREATE UNIQUE INDEX stories_index on stories(book_number, chapter, verse, order_if_several)");
Map<String, String> infoValues = new LinkedHashMap<>();
MetadataBook mb = bible.getMetadataBook();
if (mb == null)
mb = new MetadataBook();
infoValues.put("language", "xx");
infoValues.put("description", bible.getName());
infoValues.put("detailed_info", "");
infoValues.put("russian_numbering", "false");
infoValues.put("chapter_string", "Chapter");
infoValues.put("introduction_string", "Introduction");
infoValues.put("strong_numbers", hasStrongs ? "true" : "false");
infoValues.put("right_to_left", "false");
infoValues.put("digits0-9", "0123456789");
infoValues.put("swaps_non_localized_words_in_mixed_language_line", "false");
infoValues.put("localized_book_abbreviations", "false");
infoValues.put("font_scale", "1.0");
infoValues.put("contains_accents", "true");
for (String mbkey : mb.getKeys()) {
if (mbkey.startsWith("MyBible.zone@")) {
infoValues.put(mbkey.substring(13).replace('.', '_'), mb.getValue(mbkey));
} else {
infoValues.put("detailed_info", infoValues.get("detailed_info") + "\r\n<br><b>" + mbkey + ":</b>" + mb.getValue(mbkey));
}
}
String bibleIntro = null, singleFootnoteMarker = null, singleXrefMarker = null;
if (exportArgs.length > 1) {
Properties props = new Properties();
FileInputStream in = new FileInputStream(exportArgs[1]);
props.load(in);
in.close();
bibleIntro = (String) props.remove("__INTRODUCTION__");
singleFootnoteMarker = (String) props.remove("__FOOTNOTE_MARKER__");
singleXrefMarker = (String) props.remove("__XREF_MARKER__");
for (Object key : props.keySet()) {
String template = props.getProperty(key.toString());
template = template.replace("${name}", bible.getName());
for (String mbkey : mb.getKeys()) template = template.replace("${" + mbkey + "}", mb.getValue(mbkey));
infoValues.put(key.toString(), template);
}
}
ISqlJetTable infoTable = db.getTable("info");
ISqlJetTable booksTable = db.getTable("books");
ISqlJetTable introductionsTable = db.getTable("introductions");
ISqlJetTable versesTable = db.getTable("verses");
ISqlJetTable storiesTable = db.getTable("stories");
for (Map.Entry<String, String> entry : infoValues.entrySet()) {
infoTable.insert(entry.getKey(), entry.getValue());
}
SqlJetDb cdb = null;
ISqlJetTable footnotesTable = null;
if (hasFootnotes) {
String commentaryfile = outfile.replace(".SQLite3", ".commentaries.SQLite3");
new File(commentaryfile).delete();
cdb = SqlJetDb.open(new File(commentaryfile), true);
cdb.getOptions().setAutovacuum(true);
cdb.beginTransaction(SqlJetTransactionMode.WRITE);
cdb.getOptions().setUserVersion(0);
cdb.createTable("CREATE TABLE info (name TEXT, value TEXT)");
cdb.createTable("CREATE TABLE commentaries (book_number NUMERIC, chapter_number_from NUMERIC, verse_number_from NUMERIC, chapter_number_to NUMERIC, verse_number_to NUMERIC, marker TEXT, text TEXT )");
cdb.createIndex("CREATE INDEX commentaries_index on commentaries(book_number, chapter_number_from, verse_number_from)");
ISqlJetTable cInfoTable = cdb.getTable("info");
for (String key : Arrays.asList("language", "description", "russian_numbering")) {
cInfoTable.insert(key, infoValues.get(key));
}
cInfoTable.insert("is_footnotes", "true");
footnotesTable = cdb.getTable("commentaries");
}
final Set<String> unsupportedFeatures = new HashSet<>();
FormattedText introProlog = null;
for (Book bk : bible.getBooks()) {
if (bk.getId() == BookID.INTRODUCTION || bk.getId() == BookID.INTRODUCTION_OT || bk.getId() == BookID.INTRODUCTION_NT || bk.getId() == BookID.APPENDIX) {
if (introProlog == null)
introProlog = new FormattedText();
introProlog.getAppendVisitor().visitHeadline(1).visitText(bk.getLongName());
bk.getChapters().get(0).getProlog().accept(introProlog.getAppendVisitor());
continue;
}
MyBibleZoneBook info = null;
for (MyBibleZoneBook bi : BOOK_INFO) {
if (bi.bookID == bk.getId())
info = bi;
}
if (info == null) {
System.out.println("WARNING: Skipping unsupported book " + bk.getId());
continue;
}
booksTable.insert(info.bookNumber, info.bookColor, bk.getAbbr(), bk.getShortName());
FormattedText prologs = null;
for (int cn = 1; cn <= bk.getChapters().size(); cn++) {
Chapter ch = bk.getChapters().get(cn - 1);
if (ch.getProlog() != null) {
if (prologs == null)
prologs = new FormattedText();
prologs.getAppendVisitor().visitHeadline(1).visitText(cn == 1 ? bk.getLongName() : "" + cn);
ch.getProlog().accept(prologs.getAppendVisitor());
}
int vn = 0;
for (VirtualVerse vv : ch.createVirtualVerses()) {
vn++;
while (vn < vv.getNumber()) versesTable.insert(info.bookNumber, cn, vn++, "");
if (vn != vv.getNumber())
throw new RuntimeException(vn + " != " + vv.getNumber());
for (int hl = 0; hl < vv.getHeadlines().size(); hl++) {
final StringBuilder sb = new StringBuilder();
final Map<StringBuilder, String> xrefTags = new HashMap<>();
vv.getHeadlines().get(hl).accept(new VisitorAdapter<RuntimeException>(null) {
@Override
protected Visitor<RuntimeException> wrapChildVisitor(Visitor<RuntimeException> childVisitor) throws RuntimeException {
return this;
}
@Override
protected void beforeVisit() throws RuntimeException {
unsupportedFeatures.add("markup in headline");
}
@Override
public void visitText(String text) throws RuntimeException {
sb.append(text.replace('<', '〈').replace('>', '〉'));
}
@Override
public Visitor<RuntimeException> visitFootnote() throws RuntimeException {
// handle this separately; we do not like
// footnote text inside the headline!
unsupportedFeatures.add("footnote in headline");
return new VisitorAdapter<RuntimeException>(null) {
@Override
protected Visitor<RuntimeException> wrapChildVisitor(Visitor<RuntimeException> childVisitor) throws RuntimeException {
return this;
}
@Override
public Visitor<RuntimeException> visitCrossReference(String bookAbbr, BookID book, int firstChapter, String firstVerse, int lastChapter, String lastVerse) throws RuntimeException {
if (!BOOK_NUMBERS.containsKey(book))
return null;
final StringBuilder innerBuilder = new StringBuilder();
String endVerse = firstChapter != lastChapter ? "-" + lastChapter + ":" + lastVerse : !firstVerse.equals(lastVerse) ? "-" + lastVerse : "";
xrefTags.put(innerBuilder, "<x>" + BOOK_NUMBERS.get(book) + " " + firstChapter + ":" + firstVerse + endVerse + "</x>");
return new VisitorAdapter<RuntimeException>(null) {
@Override
protected void beforeVisit() throws RuntimeException {
throw new RuntimeException("Unsupported content inside headline xref");
}
@Override
public void visitText(String text) throws RuntimeException {
innerBuilder.append(text.replace('<', '〈').replace('>', '〉'));
}
};
}
};
}
@Override
public Visitor<RuntimeException> visitExtraAttribute(ExtraAttributePriority prio, String category, String key, String value) throws RuntimeException {
unsupportedFeatures.add("extra atrribute in headline");
return prio.handleVisitor(category, this);
}
});
String headline = sb.toString();
for (Map.Entry<StringBuilder, String> xrefTag : xrefTags.entrySet()) {
headline = headline.replace(xrefTag.getKey().toString(), xrefTag.getValue());
}
storiesTable.insert(info.bookNumber, cn, vn, hl, headline);
}
StringBuilder vb = new StringBuilder();
Map<String, MyBibleHTMLVisitor> footnotes = new HashMap<>();
MyBibleVerseVisitor mbvv = new MyBibleVerseVisitor(vb, footnotes, unsupportedFeatures);
for (Verse v : vv.getVerses()) {
if (!v.getNumber().equals("" + vv.getNumber())) {
vb.append(" <e>(" + v.getNumber() + ")</e> ");
}
mbvv.reset();
v.accept(mbvv);
}
if (singleXrefMarker != null || singleFootnoteMarker != null) {
String singleXref = null, singleFootnote = null;
for (Map.Entry<String, MyBibleHTMLVisitor> fn : footnotes.entrySet()) {
if (!fn.getKey().matches("\\[[0-9]+\\]"))
continue;
if (fn.getValue().getResult().startsWith(FormattedText.XREF_MARKER) && singleXrefMarker != null) {
if (singleXref == null) {
singleXref = fn.getKey();
} else {
System.out.println("WARNING: More than one XREF footnote in verse " + info.bookID + " " + cn + ":" + vn);
singleXref = "-";
}
} else if (singleFootnoteMarker != null) {
if (singleFootnote == null) {
singleFootnote = fn.getKey();
} else {
System.out.println("WARNING: More than one normal footnote in verse " + info.bookID + " " + cn + ":" + vn);
singleFootnote = "-";
}
}
}
if (singleXref != null && !singleXref.equals("-")) {
MyBibleHTMLVisitor xfn = footnotes.remove(singleXref);
if (xfn == null)
throw new RuntimeException();
footnotes.put(singleXrefMarker, xfn);
String verse = vb.toString();
vb.setLength(0);
vb.append(verse.replace("<f>" + singleXref + "</f>", "<f>" + singleXrefMarker + "</f>"));
}
if (singleFootnote != null && !singleFootnote.equals("-")) {
MyBibleHTMLVisitor sfn = footnotes.remove(singleFootnote);
if (sfn == null)
throw new RuntimeException();
footnotes.put(singleFootnoteMarker, sfn);
String verse = vb.toString();
vb.setLength(0);
vb.append(verse.replace("<f>" + singleFootnote + "</f>", "<f>" + singleFootnoteMarker + "</f>"));
}
}
for (Map.Entry<String, MyBibleHTMLVisitor> fn : footnotes.entrySet()) {
footnotesTable.insert(info.bookNumber, cn, vn, cn, vn, fn.getKey(), fn.getValue().getResult());
}
versesTable.insert(info.bookNumber, cn, vn, vb.toString().trim());
}
}
if (prologs != null) {
MyBibleHTMLVisitor v = new MyBibleHTMLVisitor(unsupportedFeatures, "in introduction");
prologs.accept(v);
introductionsTable.insert(info.bookNumber, v.getResult());
}
}
if (bibleIntro != null) {
introductionsTable.insert(0, bibleIntro);
} else if (introProlog != null) {
MyBibleHTMLVisitor v = new MyBibleHTMLVisitor(unsupportedFeatures, "in introduction");
introProlog.accept(v);
introductionsTable.insert(0, v.getResult());
}
if (!unsupportedFeatures.isEmpty()) {
System.out.println("WARNING: Skipped unsupported features: " + unsupportedFeatures);
}
db.commit();
db.close();
if (cdb != null) {
cdb.commit();
cdb.close();
}
}
use of biblemulticonverter.data.MetadataBook in project BibleMultiConverter by schierlm.
the class MyBibleZoneCrossreferences method doExport.
@Override
public void doExport(Bible bible, String... exportArgs) throws Exception {
String outfile = exportArgs[0];
if (!outfile.endsWith(".crossreferences.SQLite3"))
outfile += ".crossreferences.SQLite3";
new File(outfile).delete();
SqlJetDb db = SqlJetDb.open(new File(outfile), true);
db.getOptions().setAutovacuum(true);
db.beginTransaction(SqlJetTransactionMode.WRITE);
db.getOptions().setUserVersion(0);
db.createTable("CREATE TABLE info (name TEXT, value TEXT)");
db.createTable("CREATE TABLE cross_references (book NUMERIC, chapter NUMERIC, verse NUMERIC, verse_end NUMERIC, book_to NUMERIC, chapter_to NUMERIC, verse_to_start NUMERIC, verse_to_end NUMERIC, votes NUMERIC)");
db.createIndex("CREATE INDEX book_and_chapter ON cross_references(book, chapter)");
Map<String, String> infoValues = new LinkedHashMap<>();
MetadataBook mb = bible.getMetadataBook();
if (mb == null)
mb = new MetadataBook();
infoValues.put("language", "xx");
infoValues.put("description", bible.getName());
infoValues.put("detailed_info", "");
infoValues.put("russian_numbering", "false");
infoValues.put("requires_reverse_processing", "false");
for (String mbkey : mb.getKeys()) {
if (mbkey.startsWith("MyBible.zone@")) {
infoValues.put(mbkey.substring(13).replace('.', '_'), mb.getValue(mbkey));
} else {
infoValues.put("detailed_info", infoValues.get("detailed_info") + "\r\n<br><b>" + mbkey + ":</b>" + mb.getValue(mbkey));
}
}
if (exportArgs.length > 1) {
Properties props = new Properties();
FileInputStream in = new FileInputStream(exportArgs[1]);
props.load(in);
in.close();
for (Object key : props.keySet()) {
String template = props.getProperty(key.toString());
template = template.replace("${name}", bible.getName());
for (String mbkey : mb.getKeys()) template = template.replace("${" + mbkey + "}", mb.getValue(mbkey));
infoValues.put(key.toString(), template);
}
}
ISqlJetTable infoTable = db.getTable("info");
ISqlJetTable crossReferencesTable = db.getTable("cross_references");
for (Map.Entry<String, String> entry : infoValues.entrySet()) {
infoTable.insert(entry.getKey(), entry.getValue());
}
for (Book bk : bible.getBooks()) {
if (!MyBibleZone.BOOK_NUMBERS.containsKey(bk.getId()))
continue;
int bn = MyBibleZone.BOOK_NUMBERS.get(bk.getId());
for (int cn = 1; cn <= bk.getChapters().size(); cn++) {
Chapter ch = bk.getChapters().get(cn - 1);
for (Verse v : ch.getVerses()) {
int vn = numericVerse(v.getNumber());
v.accept(new XrefVerseVisitor(new int[] { bn, cn, vn, 0 }, bible, crossReferencesTable));
}
}
}
db.commit();
db.close();
}
Aggregations