summaryrefslogtreecommitdiff
path: root/utilities/mod2osis.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'utilities/mod2osis.cpp')
-rw-r--r--utilities/mod2osis.cpp248
1 files changed, 248 insertions, 0 deletions
diff --git a/utilities/mod2osis.cpp b/utilities/mod2osis.cpp
new file mode 100644
index 0000000..dc570f4
--- /dev/null
+++ b/utilities/mod2osis.cpp
@@ -0,0 +1,248 @@
+/******************************************************************************
+ *
+ * mod2osis.cpp - Exports a module as an OSIS doc
+ *
+ * $Id: mod2osis.cpp 3515 2017-11-01 11:38:09Z scribe $
+ *
+ * Copyright 2002-2013 CrossWire Bible Society (http://www.crosswire.org)
+ * CrossWire Bible Society
+ * P. O. Box 2528
+ * Tempe, AZ 85280-2528
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation version 2.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ */
+
+#ifdef _MSC_VER
+ #pragma warning( disable: 4251 )
+#endif
+
+#include <fcntl.h>
+#include <iostream>
+#include <fstream>
+#include <string>
+
+#include <swbuf.h>
+#include <ztext.h>
+#include <zld.h>
+#include <zcom.h>
+#include <swmgr.h>
+#include <lzsscomprs.h>
+#include <zipcomprs.h>
+#include <versekey.h>
+#include <thmlosis.h>
+#include <stdio.h>
+#include <markupfiltmgr.h>
+#include <algorithm>
+
+#ifndef NO_SWORD_NAMESPACE
+using namespace sword;
+#endif
+using std::endl;
+using std::cerr;
+using std::cout;
+
+void errorOutHelp(char *appName) {
+ cerr << appName << " - a tool to output a SWORD module in OSIS format\n";
+ cerr << "usage: "<< appName << " <modname> \n";
+ cerr << "\n\n";
+ exit(-1);
+}
+
+
+int main(int argc, char **argv)
+{
+ SWModule *inModule = 0;
+ ThMLOSIS filter;
+
+ cerr << "\n\n*** Don't use this utility *** \n\n";
+ cerr << "Its purpose is to prove the engine can do\n";
+ cerr << "lossless import / export, but we are not there yet. \n\n";
+ cerr << "This utility is done, in fact it is already too complex.\n";
+ cerr << "The ENGINE needs more work to assure export as OSIS works\n";
+ cerr << "This utility only gives us occasion to improve the engine.\n";
+ cerr << "Our goal is not to produce an export tool.\n\n";
+ cerr << "In fact, you should never export SWORD modules.\n";
+ cerr << "Many CrossWire modules are licensed for use from publishers\n";
+ cerr << "and you will need to obtain your own permissions.\n";
+ cerr << "We also do not encourage propagating encoding errors\n";
+ cerr << "which you will avoid by obtaining text data from the source.\n\n";
+ cerr << "Please see the TextSource entry in the module's .conf file\n";
+ cerr << "for information where to obtain module data from our source.\n\n";
+ cerr << "If you still must export SWORD module data, use mod2imp.\n";
+ cerr << "It is more lossless; or less lossful, and easier to read.\n\n";
+
+ if ((argc != 2)) {
+ errorOutHelp(argv[0]);
+ }
+
+ if ((!strcmp(argv[1], "-h")) || (!strcmp(argv[1], "--help")) || (!strcmp(argv[1], "/?")) || (!strcmp(argv[1], "-?")) || (!strcmp(argv[1], "-help"))) {
+ errorOutHelp(argv[0]);
+ }
+
+ SWMgr mgr(new MarkupFilterMgr(FMT_OSIS));
+ StringList options = mgr.getGlobalOptions();
+ for (StringList::iterator it = options.begin(); it != options.end(); it++) {
+ StringList values = mgr.getGlobalOptionValues(it->c_str());
+ if (find(values.begin(), values.end(), "On") != values.end()) {
+ mgr.setGlobalOption(it->c_str(), "On");
+ }
+ if (find(values.begin(), values.end(), "All Readings") != values.end()) {
+ mgr.setGlobalOption(it->c_str(), "All Readings");
+ }
+ }
+
+// mgr.setGlobalOption("Strong's Numbers", "Off");
+// mgr.setGlobalOption("Morphological Tags", "Off");
+
+ ModMap::iterator it = mgr.Modules.find(argv[1]);
+ if (it == mgr.Modules.end()) {
+ fprintf(stderr, "error: %s: couldn't find module: %s \n", argv[0], argv[1]);
+ exit(-2);
+ }
+
+ inModule = it->second;
+// inModule->AddRenderFilter(&filter);
+
+ SWKey *key = (SWKey *)*inModule;
+ VerseKey *vkey = SWDYNAMIC_CAST(VerseKey, key);
+
+ char buf[1024];
+ bool opentest = false;
+ bool openbook = false;
+ bool openchap = false;
+ int lastTest = 5;
+ int lastBook = 9999;
+ int lastChap = 9999;
+ if (!vkey) {
+ cerr << "Currently mod2osis only works with verse keyed modules\n\n";
+ exit(-1);
+ }
+
+ vkey->setIntros(false);
+
+ cout << "<?xml version=\"1.0\" ";
+ if (inModule->getConfigEntry("Encoding")) {
+ if (*(inModule->getConfigEntry("Encoding")))
+ cout << "encoding=\"" << inModule->getConfigEntry("Encoding") << "\" ";
+ else cout << "encoding=\"UTF-8\" ";
+ }
+ else cout << "encoding=\"UTF-8\" ";
+ cout << "?>\n\n";
+
+
+ cout << "<osis";
+ cout << " xmlns=\"http://www.bibletechnologies.net/2003/OSIS/namespace\"";
+ cout << " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"";
+ cout << " xsi:schemaLocation=\"http://www.bibletechnologies.net/2003/OSIS/namespace http://www.bibletechnologies.net/osisCore.2.1.1.xsd\">\n\n";
+ cout << "<osisText";
+ cout << " osisIDWork=\"";
+ cout << inModule->getName() << "\"";
+ cout << " osisRefWork=\"defaultReferenceScheme\"";
+ if (inModule->getLanguage()) {
+ if (strlen(inModule->getLanguage()))
+ cout << " xml:lang=\"" << inModule->getLanguage() << "\"";
+ }
+ cout << ">\n\n";
+
+ cout << "\t<header>\n";
+ cout << "\t\t<work osisWork=\"";
+ cout << inModule->getName() << "\">\n";
+ cout << "\t\t\t<title>" << inModule->getDescription() << "</title>\n";
+ cout << "\t\t\t<identifier type=\"OSIS\">Bible." << inModule->getName() << "</identifier>\n";
+ cout << "\t\t\t<refSystem>Bible.KJV</refSystem>\n";
+ cout << "\t\t</work>\n";
+ cout << "\t\t<work osisWork=\"defaultReferenceScheme\">\n";
+ cout << "\t\t\t<refSystem>Bible.KJV</refSystem>\n";
+ cout << "\t\t</work>\n";
+ cout << "\t</header>\n\n";
+
+
+ (*inModule) = TOP;
+
+ SWKey *p = inModule->createKey();
+ VerseKey *tmpKey = SWDYNAMIC_CAST(VerseKey, p);
+ if (!tmpKey) {
+ delete p;
+ tmpKey = new VerseKey();
+ }
+ *tmpKey = inModule->getKeyText();
+
+ tmpKey->setIntros(true);
+ tmpKey->setAutoNormalize(false);
+
+ for ((*inModule) = TOP; !inModule->popError(); (*inModule)++) {
+ bool newTest = false;
+ bool newBook = false;
+
+ if (!strlen(inModule->renderText())) {
+ continue;
+ }
+
+ if ((vkey->getTestament() != lastTest)) {
+ if (openchap)
+ cout << "\t</chapter>\n";
+ if (openbook)
+ cout << "\t</div>\n";
+ if (opentest)
+ cout << "\t</div>\n";
+ cout << "\t<div type=\"x-testament\">\n";
+ opentest = true;
+ newTest = true;
+ }
+ if ((vkey->getBook() != lastBook) || newTest) {
+ if (!newTest) {
+ if (openchap)
+ cout << "\t</chapter>\n";
+ if (openbook)
+ cout << "\t</div>\n";
+ }
+ *buf = 0;
+ *tmpKey = *vkey;
+ tmpKey->setChapter(0);
+ tmpKey->setVerse(0);
+ sprintf(buf, "\t<div type=\"book\" osisID=\"%s\">\n", tmpKey->getOSISRef());
+// filter.ProcessText(buf, 200 - 3, &lastHeading, inModule);
+ cout << "" << buf << endl;
+ openbook = true;
+ newBook = true;
+ }
+ if ((vkey->getChapter() != lastChap) || newBook) {
+ if (!newBook) {
+ if (openchap)
+ cout << "\t</chapter>\n";
+ }
+ *buf = 0;
+ *tmpKey = *vkey;
+ tmpKey->setVerse(0);
+ sprintf(buf, "\t<chapter osisID=\"%s\">\n", tmpKey->getOSISRef());
+// filter.ProcessText(buf, 200 - 3, &lastHeading, inModule);
+ cout << "" << buf;
+ openchap = true;
+ }
+ SWBuf verseText = inModule->getRawEntry();
+ sprintf(buf, "\t\t<verse osisID=\"%s\">", vkey->getOSISRef());
+ cout << buf << verseText.c_str() << "</verse>\n" << endl;
+ lastChap = vkey->getChapter();
+ lastBook = vkey->getBook();
+ lastTest = vkey->getTestament();
+ }
+ if (openchap)
+ cout << "\t</chapter>\n";
+ if (openbook)
+ cout << "\t</div>\n";
+ if (opentest)
+ cout << "\t</div>\n";
+ cout << "\t</osisText>\n";
+ cout << "</osis>\n";
+ return 0;
+}
+
+