summaryrefslogtreecommitdiff
path: root/utilities/diatheke/corediatheke.cpp
diff options
context:
space:
mode:
authorRoberto C. Sanchez <roberto@connexer.com>2014-03-29 10:53:49 -0400
committerRoberto C. Sanchez <roberto@connexer.com>2014-03-29 10:53:49 -0400
commit8c8aa6b07e595cfac56838b5964ab3e96051f1b2 (patch)
treeda38e2c1979148dbd3b0c7b87f930746f5ba7f44 /utilities/diatheke/corediatheke.cpp
parent8d3fc864d094eeadc721f8e93436b37a5fab173e (diff)
Imported Upstream version 1.5.7
Diffstat (limited to 'utilities/diatheke/corediatheke.cpp')
-rw-r--r--utilities/diatheke/corediatheke.cpp449
1 files changed, 449 insertions, 0 deletions
diff --git a/utilities/diatheke/corediatheke.cpp b/utilities/diatheke/corediatheke.cpp
new file mode 100644
index 0000000..b27b670
--- /dev/null
+++ b/utilities/diatheke/corediatheke.cpp
@@ -0,0 +1,449 @@
+// Diatheke 4.2 by Chris Little <chrislit@crosswire.org>
+// Copyright 1999-2002 by CrossWire Bible Society
+// http://www.crosswire.org/sword/diatheke
+// Licensed under GNU General Public License (GPL)
+// see accompanying LICENSE file for license details
+
+#include "corediatheke.h"
+#include <regex.h>
+#include <iostream>
+#include <list>
+
+using std::list;
+using std::cout;
+using std::endl;
+using std::ostream;
+
+void systemquery(const char * key, ostream* output){
+ DiathekeMgr manager;
+ ModMap::iterator it;
+
+ SWModule *target;
+
+ bool types = false, descriptions = false, names = false;
+
+ if (!stricmp(key, "localelist")) {
+ LocaleMgr *lm = &LocaleMgr::systemLocaleMgr;
+ list<SWBuf> loclist = lm->getAvailableLocales();
+ list<SWBuf>::iterator li = loclist.begin();
+ for (;li != loclist.end(); li++) {
+ *output << li->c_str() << endl;
+ }
+ }
+ else if (!stricmp(key, "modulelist")) {
+ types = true;
+ descriptions = true;
+ names = true;
+ }
+ else if (!stricmp(key, "modulelistnames")) {
+ names = true;
+ }
+ else if (!stricmp(key, "modulelistdescriptions")) {
+ descriptions = true;
+ }
+
+
+ if (types || descriptions || names) {
+ if (types) *output << "Biblical Texts:\n";
+ for (it = manager.Modules.begin(); it != manager.Modules.end(); it++) {
+ target = it->second;
+ if (!strcmp(target->Type(), "Biblical Texts")) {
+ if (names) *output << target->Name();
+ if (names && descriptions) *output << " : ";
+ if (descriptions) *output << target->Description();
+ *output << endl;
+ }
+ }
+ if (types) *output << "Commentaries:\n";
+ for (it = manager.Modules.begin(); it != manager.Modules.end(); it++) {
+ target = it->second;
+ if (!strcmp(target->Type(), "Commentaries")) {
+ if (names) *output << target->Name();
+ if (names && descriptions) *output << " : ";
+ if (descriptions) *output << target->Description();
+ *output << endl;
+ }
+ }
+ if (types) *output << "Dictionaries:\n";
+ for (it = manager.Modules.begin(); it != manager.Modules.end(); it++) {
+ target = it->second;
+ if (!strcmp(target->Type(), "Lexicons / Dictionaries")) {
+ if (names) *output << target->Name();
+ if (names && descriptions) *output << " : ";
+ if (descriptions) *output << target->Description();
+ *output << endl;
+ }
+ }
+ }
+}
+
+void doquery(unsigned long maxverses = -1, unsigned char outputformat = FMT_PLAIN, unsigned char outputencoding = ENC_UTF8, unsigned long optionfilters = 0, unsigned char searchtype = ST_NONE, const char *range = 0, const char *text = 0, const char *locale = 0, const char *ref = 0, ostream* output = &cout, const char *script = 0, signed short variants = 0) {
+ static DiathekeMgr manager;
+
+ ModMap::iterator it;
+ ListKey listkey;
+ SectionMap::iterator sit;
+ ConfigEntMap::iterator eit;
+
+ SWModule * target;
+ char *font = 0;
+ char inputformat = 0;
+ SWBuf encoding;
+ char querytype = 0;
+
+ if (locale) {
+ LocaleMgr::systemLocaleMgr.setDefaultLocaleName(locale);
+ }
+ VerseKey vk;
+
+ //deal with queries to "system"
+ if (!stricmp(text, "system")) {
+ querytype = QT_SYSTEM;
+ systemquery(ref, output);
+ }
+ if (!strnicmp(text, "info", 4)) {
+ querytype = QT_INFO;
+ text = ref;
+ }
+ //otherwise, we have a real book
+ it = manager.Modules.find(text);
+ if (it == manager.Modules.end()) { //book not found
+ return;
+ }
+ target = (*it).second;
+
+ manager.Markup(outputformat);
+ manager.Encoding(outputencoding);
+ manager.bidi = ((OP_BIDI & optionfilters) == OP_BIDI);
+ manager.shape = ((OP_ARSHAPE & optionfilters) == OP_ARSHAPE);
+
+ if ((sit = manager.config->Sections.find((*it).second->Name())) != manager.config->Sections.end()) {
+ if ((eit = (*sit).second.find("SourceType")) != (*sit).second.end()) {
+ if (!stricmp((char *)(*eit).second.c_str(), "GBF"))
+ inputformat = FMT_GBF;
+ else if (!stricmp((char *)(*eit).second.c_str(), "ThML"))
+ inputformat = FMT_THML;
+ else if (!stricmp((char *)(*eit).second.c_str(), "OSIS"))
+ inputformat = FMT_OSIS;
+ }
+ encoding = ((eit = (*sit).second.find("Encoding")) != (*sit).second.end()) ? (*eit).second : (SWBuf)"";
+ }
+
+
+ if (querytype == QT_INFO) {
+ switch (inputformat) {
+ case FMT_THML :
+ *output << "ThML";
+ break;
+ case FMT_GBF :
+ *output << "GBF";
+ break;
+ case FMT_OSIS :
+ *output << "OSIS";
+ break;
+ default:
+ *output << "Other";
+ }
+ *output << ";";
+ *output << target->Type();
+ *output << ";";
+ return;
+ }
+
+ if (searchtype)
+ querytype = QT_SEARCH;
+ else if (!strcmp(target->Type(), "Biblical Texts"))
+ querytype = QT_BIBLE;
+ else if (!strcmp(target->Type(), "Commentaries"))
+ querytype = QT_COMM;
+ else if (!strcmp(target->Type(), "Lexicons / Dictionaries"))
+ querytype = QT_LD;
+
+ if (optionfilters & OP_FOOTNOTES)
+ manager.setGlobalOption("Footnotes","On");
+ else
+ manager.setGlobalOption("Footnotes","Off");
+ if (optionfilters & OP_HEADINGS)
+ manager.setGlobalOption("Headings","On");
+ else
+ manager.setGlobalOption("Headings","Off");
+ if (optionfilters & OP_STRONGS)
+ manager.setGlobalOption("Strong's Numbers","On");
+ else
+ manager.setGlobalOption("Strong's Numbers","Off");
+ if (optionfilters & OP_MORPH)
+ manager.setGlobalOption("Morphological Tags","On");
+ else
+ manager.setGlobalOption("Morphological Tags","Off");
+ if (optionfilters & OP_CANTILLATION)
+ manager.setGlobalOption("Hebrew Cantillation","On");
+ else
+ manager.setGlobalOption("Hebrew Cantillation","Off");
+ if (optionfilters & OP_HEBREWPOINTS)
+ manager.setGlobalOption("Hebrew Vowel Points","On");
+ else
+ manager.setGlobalOption("Hebrew Vowel Points","Off");
+ if (optionfilters & OP_GREEKACCENTS)
+ manager.setGlobalOption("Greek Accents","On");
+ else
+ manager.setGlobalOption("Greek Accents","Off");
+ if (optionfilters & OP_LEMMAS)
+ manager.setGlobalOption("Lemmas","On");
+ else
+ manager.setGlobalOption("Lemmas","Off");
+ if (optionfilters & OP_SCRIPREF)
+ manager.setGlobalOption("Cross-references","On");
+ else
+ manager.setGlobalOption("Cross-references","Off");
+ if (optionfilters & OP_RED)
+ manager.setGlobalOption("Words of Christ in Red","On");
+ else
+ manager.setGlobalOption("Words of Christ in Red","Off");
+ if (optionfilters & OP_VARIANTS && variants) {
+ if (variants == -1)
+ manager.setGlobalOption("Variants", "All Readings");
+ else if (variants == 1)
+ manager.setGlobalOption("Variants", "Secondary Readings");
+ }
+ else
+ manager.setGlobalOption("Transliteration", "Primary Readings");
+
+#ifdef _ICU_
+ if (optionfilters & OP_TRANSLITERATOR && script)
+ manager.setGlobalOption("Transliteration", script);
+ else
+ manager.setGlobalOption("Transliteration", "Off");
+#endif
+
+ if (querytype == QT_SEARCH) {
+
+ //this test is just to determine if we've got SWKeys or VerseKeys
+ if (!strcmp(target->Type(), "Biblical Texts"))
+ querytype = QT_BIBLE;
+ else if (!strcmp(target->Type(), "Commentaries"))
+ querytype = QT_BIBLE;
+ else if (!strcmp(target->Type(), "Lexicons / Dictionaries"))
+ querytype = QT_LD;
+
+ //do search stuff
+ char st = 1 - searchtype;
+ if (querytype == QT_BIBLE) {
+ *output << "Verses containing \"";
+ }
+ else *output << "Entries containing \"";
+ *output << ref;
+ *output << "\"-- ";
+
+ if (range) {
+ VerseKey parser;
+ ListKey scope = parser.ParseVerseList(range, parser, true);
+ listkey = target->Search(ref, st, REG_ICASE, &scope);
+ }
+ else listkey = target->Search(ref, st, REG_ICASE);
+
+ if (strlen((const char*)listkey)) {
+ if (!listkey.Error()) {
+ if (outputformat == FMT_CGI) *output << "<entry>";
+ if (querytype == QT_BIBLE) {
+ vk = listkey;
+ *output << (const char *)vk;
+ }
+ else *output << (const char *)listkey;
+ if (outputformat == FMT_CGI) *output << "</entry>";
+ }
+ listkey++;
+ while (!listkey.Error()) {
+ *output << " ; ";
+ if (outputformat == FMT_CGI) *output << "<entry>";
+ if (querytype == QT_BIBLE) {
+ vk = listkey;
+ *output << (const char *)vk;
+ }
+ else *output << (const char *)listkey;
+ if (outputformat == FMT_CGI) *output << "</entry>";
+ listkey++;
+ }
+ *output << " -- ";
+
+ char *temp = new char[10];
+ sprintf(temp, "%u", listkey.Count());
+ *output << temp;
+ delete [] temp;
+
+ *output << " matches total (";
+ *output << target->Name();
+ *output << ")\n";
+ }
+ else {
+ *output << "none (";
+ *output << target->Name();
+ *output << ")\n";
+ }
+ }
+
+ else if (querytype == QT_LD) {
+ //do dictionary stuff
+
+ target->setKey(ref);
+
+ const char * text = (const char *) *target;
+
+ if (outputformat == FMT_RTF) {
+ *output << "{\\rtf1\\ansi{\\fonttbl{\\f0\\froman\\fcharset0\\fprq2 Times New Roman;}{\\f1\\fdecor\\fprq2 ";
+ if (font)
+ *output << font;
+ else
+ *output << "Times New Roman";
+ *output << ";}}";
+ }
+ else if (outputformat == FMT_HTML) {
+ *output << "<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">";
+ }
+
+ if (strlen(text)) {
+ *output << (char*)target->KeyText();
+ if (font && (outputformat == FMT_HTML || outputformat == FMT_THML || outputformat == FMT_CGI)) {
+ *output << ": <font face=\"";
+ *output << font;
+ *output << "\">";
+ }
+ else if (outputformat == FMT_RTF) {
+ *output << ": {\\f1 ";
+ }
+ else {
+ *output << ": ";
+ }
+ *output << text;
+ if (font && (outputformat == FMT_HTML || outputformat == FMT_THML || outputformat == FMT_CGI)) {
+ *output << "</font>";
+ }
+ else if (outputformat == FMT_RTF) {
+ *output << "}";
+ }
+
+ *output << "(";
+ *output << target->Name();
+ *output << ")\n";
+ }
+
+ if (outputformat == FMT_RTF) {
+ *output << "}";
+ }
+
+ }
+
+ else if (querytype == QT_BIBLE || querytype == QT_COMM) {
+ //do commentary/Bible stuff
+
+ if ((sit = manager.config->Sections.find((*it).second->Name())) != manager.config->Sections.end()) {
+ if ((eit = (*sit).second.find("Font")) != (*sit).second.end()) {
+ font = (char *)(*eit).second.c_str();
+ if (strlen(font) == 0) font = 0;
+ }
+ }
+
+ listkey = vk.ParseVerseList(ref, "Gen1:1", true);
+ int i;
+
+ if (outputformat == FMT_RTF) {
+ *output << "{\\rtf1\\ansi{\\fonttbl{\\f0\\froman\\fcharset0\\fprq2 Times New Roman;}{\\f1\\fdecor\\fprq2 ";
+ if (font)
+ *output << font;
+ else
+ *output << "Times New Roman";
+ *output << ";}{\\f7\\froman\\fcharset2\\fprq2 Symbol;}}";
+ }
+ else if (outputformat == FMT_HTML) {
+ *output << "<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">";
+ }
+
+ for (i = 0; i < listkey.Count() && maxverses; i++) {
+ VerseKey *element = SWDYNAMIC_CAST(VerseKey, listkey.GetElement(i));
+ if (element) {
+ target->Key(element->LowerBound());
+ vk = element->UpperBound();
+ while (maxverses && target->Key() <= vk) {
+ *output << (char*)target->KeyText();
+ if (font && (outputformat == FMT_HTML || outputformat == FMT_THML || outputformat == FMT_CGI)) {
+ *output << ": <font face=\"";
+ *output << font;
+ *output << "\">";
+ }
+ else if (outputformat == FMT_RTF) {
+ *output << ": {\\f1 ";
+ }
+ else {
+ *output << ": ";
+ }
+ *output << (const char*)*target;
+ if (font && (outputformat == FMT_HTML || outputformat == FMT_THML || outputformat == FMT_CGI)) {
+ *output << "</font>";
+ }
+ else if (outputformat == FMT_RTF) {
+ *output << "}";
+ }
+
+ if (inputformat != FMT_THML && (outputformat == FMT_HTML || outputformat == FMT_THML || outputformat == FMT_CGI))
+ *output << "<br />";
+ else if (outputformat == FMT_OSIS)
+ *output << "<milestone type=\"line\"/>";
+ else if (outputformat == FMT_RTF)
+ *output << "\\par ";
+ else if (outputformat == FMT_GBF)
+ *output << "<CM>";
+
+ *output << "\n";
+
+ if (target->Key() == vk)
+ break;
+ maxverses--;
+ (*target)++;
+ }
+ }
+ else {
+ target->Key(*listkey.GetElement(i));
+ *output << (char*)target->KeyText();
+ if (font && (outputformat == FMT_HTML || outputformat == FMT_THML || outputformat == FMT_CGI)) {
+ *output << ": <font face=\"";
+ *output << font;
+ *output << "\">";
+ }
+ else if (outputformat == FMT_RTF) {
+ *output << ": {\\f1 ";
+ }
+ else {
+ *output << ": ";
+ }
+ *output << (const char*)*target;
+ if (font && (outputformat == FMT_HTML || outputformat == FMT_THML || outputformat == FMT_CGI)) {
+ *output << "</font>";
+ }
+ else if (outputformat == FMT_RTF) {
+ *output << "}";
+ }
+
+ if (inputformat != FMT_THML && (outputformat == FMT_HTML || outputformat == FMT_THML || outputformat == FMT_CGI))
+ *output << "<br />";
+ else if (outputformat == FMT_OSIS)
+ *output << "<milestone type=\"line\"/>";
+ else if (outputformat == FMT_RTF)
+ *output << "\\par ";
+ else if (outputformat == FMT_GBF)
+ *output << "<CM>";
+
+ *output << "\n";
+ maxverses--;
+ }
+ }
+
+ *output << "(";
+ *output << target->Name();
+ *output << ")\n";
+
+ if (outputformat == FMT_RTF) {
+ *output << "}";
+ }
+
+ }
+}
+