use of org.crosswire.jsword.book.Book in project BibleMultiConverter by schierlm.
the class SWORD method doImport.
protected Bible doImport(Book book) throws Exception {
OSISHelper helper = new OSISHelper();
Bible result = new Bible(book.getName());
TransformerHandler th = ((SAXTransformerFactory) SAXTransformerFactory.newInstance()).newTransformerHandler();
Map<BookID, biblemulticonverter.data.Book> parsedBooks = new EnumMap<>(BookID.class);
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
List<Verse> allVerses = new ArrayList<>();
Verse nextCandidate = null;
for (Iterator<?> iter = book.getGlobalKeyList().iterator(); iter.hasNext(); ) {
Verse v = (Verse) iter.next();
while (nextCandidate != null && !nextCandidate.equals(v)) {
if (book.contains(nextCandidate)) {
System.out.println("WARNING: Verse (after) skipped by iterator: " + nextCandidate);
allVerses.add(nextCandidate);
}
nextCandidate = nextCandidate.getVersification().add(nextCandidate, 1);
}
Verse prevCandidate = v.getVersification().subtract(v, 1);
List<Verse> versesSkippedBefore = new ArrayList<>();
while (prevCandidate != null && !allVerses.contains(prevCandidate) && !versesSkippedBefore.contains(prevCandidate)) {
versesSkippedBefore.add(0, prevCandidate);
prevCandidate = prevCandidate.getVersification().subtract(prevCandidate, 1);
}
for (Verse vv : versesSkippedBefore) {
if (book.contains(vv)) {
System.out.println("WARNING: Verse (before) skipped by iterator: " + vv);
allVerses.add(vv);
}
}
allVerses.add(v);
nextCandidate = v.getVersification().add(v, 1);
}
while (nextCandidate != null) {
if (book.contains(nextCandidate)) {
System.out.println("WARNING: Verse (at end) skipped by iterator: " + nextCandidate);
allVerses.add(nextCandidate);
}
Verse nextNextCandidate = nextCandidate.getVersification().add(nextCandidate, 1);
if (nextCandidate.equals(nextNextCandidate))
break;
nextCandidate = nextNextCandidate;
}
for (Verse v : allVerses) {
BookID bkid = biblemulticonverter.sword.BookMapping.MAPPING.get(v.getBook());
biblemulticonverter.data.Book bk = parsedBooks.get(bkid);
if (!parsedBooks.containsKey(bkid)) {
bk = new biblemulticonverter.data.Book(bkid.getOsisID().replace("x-Intr", "Intr"), bkid, bkid.getEnglishName(), bkid.getEnglishName());
parsedBooks.put(bkid, bk);
bk.getChapters().add(new Chapter());
result.getBooks().add(bk);
}
int chapterNum = v.getChapter(), verseNum = v.getVerse();
while (bk.getChapters().size() < chapterNum) bk.getChapters().add(new Chapter());
Chapter chapter = bk.getChapters().get(chapterNum == 0 ? 0 : chapterNum - 1);
FormattedText verse;
if (verseNum == 0) {
verse = new FormattedText();
if (chapter.getProlog() != null) {
chapter.getProlog().accept(verse.getAppendVisitor());
}
chapter.setProlog(verse);
} else {
if (chapterNum == 0)
throw new IllegalStateException("Verse " + verseNum + " in chapter 0 is invalid");
verse = new biblemulticonverter.data.Verse("" + verseNum);
chapter.getVerses().add((biblemulticonverter.data.Verse) verse);
}
Element root = doc.createElement("verse");
th.setResult(new DOMResult(root));
new BookData(book, v).getSAXEventProvider().provideSAXEvents(th);
if (root.getChildNodes().getLength() == 1 && root.getFirstChild() instanceof Element && root.getFirstChild().getNodeName().equals("div") && root.getFirstChild().getChildNodes().getLength() >= 1 && root.getFirstChild().getFirstChild().getNodeName().equals("title")) {
Element div = (Element) root.getFirstChild();
root.removeChild(div);
div.removeChild(div.getFirstChild());
while (div.getFirstChild() != null) {
Node child = div.getFirstChild();
div.removeChild(child);
root.appendChild(child);
}
} else {
throw new RuntimeException("Unexpected OSIS structure!");
}
helper.handleVerse(root, verse);
if (verse.getElementTypes(1).length() == 0) {
System.out.println("WARNING: Empty verse " + bk.getAbbr() + " " + chapterNum + ":" + verseNum);
if (verse instanceof biblemulticonverter.data.Verse)
chapter.getVerses().remove(verse);
else
chapter.setProlog(null);
}
}
for (biblemulticonverter.data.Book bk : parsedBooks.values()) {
while (!bk.getChapters().isEmpty()) {
Chapter ch = bk.getChapters().get(bk.getChapters().size() - 1);
if (ch.getProlog() == null && ch.getVerses().isEmpty()) {
bk.getChapters().remove(ch);
} else {
break;
}
}
if (bk.getChapters().isEmpty()) {
result.getBooks().remove(bk);
}
}
return result;
}
use of org.crosswire.jsword.book.Book in project BibleMultiConverter by schierlm.
the class SWORD method doImport.
@Override
public Bible doImport(File inputFile) throws Exception {
System.out.println("Loading locally installed books...");
SwordBookPath.setDownloadDir(inputFile.getParentFile());
Book book = Books.installed().getBook(inputFile.getName());
System.out.println("======");
return doImport(book);
}
use of org.crosswire.jsword.book.Book in project BibleMultiConverter by schierlm.
the class SWORDDownloader method run.
@Override
public void run(String... args) throws Exception {
InstallManager imanager = new InstallManager();
if (args.length == 0) {
for (Map.Entry<String, Installer> mapEntry : imanager.getInstallers().entrySet()) {
System.out.println(mapEntry.getKey().replace(' ', '_') + ": " + mapEntry.getValue().getInstallerDefinition());
}
return;
}
// initialize list of installed books (this may create some log
// output...)
System.out.println("Loading locally installed books...");
SwordBookPath.setDownloadDir(new File(args[0]));
Books installedBooks = Books.installed();
System.out.println("======");
if (args.length == 1) {
for (Book bk : installedBooks.getBooks(BookFilters.getOnlyBibles())) {
System.out.println(bk.getInitials() + " (" + bk.getName() + "): " + bk.getProperty("Version"));
}
return;
}
Installer installer;
if (args[1].contains("|")) {
String[] parts = args[1].split("\\|");
if (parts.length != 3)
throw new IOException("Invalid repository: " + args[1]);
HttpSwordInstaller httpInstaller = new HttpSwordInstaller();
httpInstaller.setHost(parts[0]);
httpInstaller.setPackageDirectory(parts[1]);
httpInstaller.setCatalogDirectory(parts[2]);
installer = httpInstaller;
} else {
installer = imanager.getInstaller(args[1].replace('_', ' '));
if (installer == null)
throw new IOException("Unknown repository: " + args[1]);
}
System.out.println("Loading remote book list...");
installer.reloadBookList();
List<Book> availableBooks = installer.getBooks(BookFilters.getOnlyBibles());
System.out.println("======");
if (args.length == 2) {
args = new String[] { args[0], args[1], "*?" };
}
for (int i = 2; i < args.length; i++) {
boolean force = false, updateOnly = false, printOnly = false;
String name = args[i].replace('@', '*');
if (name.endsWith("?")) {
printOnly = true;
name = name.substring(0, name.length() - 1);
}
if (name.endsWith("!")) {
force = true;
name = name.substring(0, name.length() - 1);
} else if (name.endsWith("+")) {
updateOnly = true;
name = name.substring(0, name.length() - 1);
}
for (Book bk : availableBooks) {
if (bk.getInitials().equalsIgnoreCase(name) || (name.endsWith("*") && bk.getInitials().toLowerCase().startsWith(name.substring(0, name.length() - 1).toLowerCase()))) {
Book installedBook = installedBooks.getBook(bk.getInitials());
if (installedBook == null) {
if (updateOnly)
continue;
} else if (installedBook != null && installedBook.getProperty("Version").equals(bk.getProperty("Version"))) {
if (!force)
continue;
}
if (printOnly) {
System.out.print(bk.getInitials() + " (" + bk.getName() + "): ");
if (installedBook == null) {
System.out.println("NEW -> " + bk.getProperty("Version"));
} else if (installedBook.getProperty("Version").equals(bk.getProperty("Version"))) {
System.out.println(installedBook.getProperty("Version"));
} else {
System.out.println(installedBook.getProperty("Version") + " -> " + bk.getProperty("Version"));
}
} else {
System.out.println("Installing " + bk.getInitials() + " (" + bk.getName() + ")...");
try {
installer.install(bk);
} catch (ArithmeticException ex) {
// happens for some IBT modules...
System.err.println(ex.toString());
}
}
}
}
}
}
Aggregations