int main(int argc, char **argv) { const char * helptext = "addvs 1.1 Bible & Commentary module creation tool for the SWORD Project\nUse -a to add a new verse from standard input or a file, -d to delete a verse,\n-l to link two verses, -c to create a new module.\n usage:\n %s -a </path/to/module> <verse> [</path/to/file/with/verse>]\n %s -d </path/to/module> <key>\n %s -l </path/to/module> <first verse (already assigned)> <second verse>\n %s -c </path/to/module>\n"; long entrysize; if (argc < 3) { fprintf(stderr, helptext, argv[0], argv[0], argv[0], argv[0]); exit(-1); } if (!strcmp(argv[1], "-a") && (argc == 4 || argc == 5)) { // Do some initialization stuff char buffer[65536]; //this is the max size of any entry RawText * mod = new RawText(argv[2]); // open our datapath with our RawText driver. VerseKey *vkey = new VerseKey; vkey->setIntros(true); vkey->setAutoNormalize(false); vkey->setPersist(true); // the magical setting *vkey = argv[3]; // Set our VerseKey mod->setKey(*vkey); if (!vkey->getChapter()) { // bad hack >> // 0:0 is Book intro // (chapter):0 is Chapter intro // // 0:2 is Module intro // 0:1 is Testament intro int backstep = vkey->getVerse(); vkey->setVerse(0); *mod -= backstep; // << bad hack FILE *infile; // case: add from text file //Open our data file and read its contents into the buffer if (argc == 5) infile = fopen(argv[4], "r"); // case: add from stdin else infile = stdin; entrysize = fread(buffer, sizeof(char), sizeof(buffer), infile); mod->setEntry(buffer, entrysize); // save text to module at current position } else { ListKey listkey = vkey->parseVerseList(argv[3], "Gen1:1", true); int i; bool havefirst = false; VerseKey firstverse; for (i = 0; i < listkey.getCount(); i++) { VerseKey *element = SWDYNAMIC_CAST(VerseKey, listkey.getElement(i)); if (element) { mod->setKey(element->getLowerBound()); VerseKey finalkey = element->getUpperBound(); std::cout << mod->getKeyText() << "-" << (const char*)finalkey << std::endl; if (!havefirst) { havefirst = true; firstverse = *mod->getKey(); FILE *infile; // case: add from text file //Open our data file and read its contents into the buffer if (argc == 5) infile = fopen(argv[4], "r"); // case: add from stdin else infile = stdin; entrysize = fread(buffer, sizeof(char), sizeof(buffer), infile); mod->setEntry(buffer, entrysize); // save text to module at current position std::cout << "f" << (const char*)firstverse << std::endl; (*mod)++; } while (*mod->getKey() <= finalkey) { std::cout << mod->getKeyText() << std::endl; *(SWModule*)mod << &firstverse; (*mod)++; } } else { if (havefirst) { mod->setKey(*listkey.getElement(i)); *(SWModule*)mod << &firstverse; std::cout << mod->getKeyText() << std::endl; } else { mod->setKey(*listkey.getElement(i)); havefirst = true; firstverse = *mod->getKey(); FILE *infile; // case: add from text file //Open our data file and read its contents into the buffer if (argc == 5) infile = fopen(argv[4], "r"); // case: add from stdin else infile = stdin; entrysize = fread(buffer, sizeof(char), sizeof(buffer), infile); mod->setEntry(buffer, entrysize); // save text to module at current position std::cout << "f" << (const char*)firstverse << std::endl; } } } } delete vkey; } // Link 2 verses else if (!strcmp(argv[1], "-l") && argc == 5) { // Do some initialization stuff RawText *mod = new RawText(argv[2]); // open our datapath with our RawText driver. mod->setKey(argv[4]); // set key from argument SWKey tmpkey = (SWKey) argv[3]; *(SWModule*)mod << &(tmpkey); delete mod; } else if (!strcmp(argv[1], "-d") && argc == 4) { RawText mod(argv[2]); // open our datapath with our RawText driver. VerseKey *vkey = new VerseKey; vkey->setIntros(true); vkey->setAutoNormalize(false); vkey->setPersist(true); // the magical setting // Set our VerseKey mod.setKey(*vkey); *vkey = argv[3]; if (!vkey->getChapter()) { // bad hack >> // 0:0 is Book intro // (chapter):0 is Chapter intro // // 0:2 is Module intro // 0:1 is Testament intro int backstep = vkey->getVerse(); vkey->setVerse(0); mod -= backstep; // << bad hack } mod.deleteEntry(); delete vkey; } // Make a new module else if (!strcmp(argv[1], "-c") && argc == 3) { // Try to initialize a default set of datafiles and indicies at our // datapath location passed to us from the user. if (RawText::createModule(argv[2])) { fprintf(stderr, "error: %s: couldn't create module at path: %s \n", argv[0], argv[2]); exit(-2); } } // Bad arguments, print usage else { fprintf(stderr, helptext, argv[0], argv[0], argv[0], argv[0]); exit(-1); } }
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(NULL, NULL, false, outputencoding, outputformat, ((OP_BIDI & optionfilters) == OP_BIDI), ((OP_ARSHAPE & optionfilters) == OP_ARSHAPE)); 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::getSystemLocaleMgr()->setDefaultLocaleName(locale); } //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; SWKey *p = target->createKey(); VerseKey *parser = SWDYNAMIC_CAST(VerseKey, p); if (!parser) { delete p; parser = new VerseKey(); } if ((sit = manager.config->Sections.find((*it).second->getName())) != 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; else if (!::stricmp((char *)(*eit).second.c_str(), "TEI")) inputformat = FMT_TEI; } 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; case FMT_TEI : *output << "TEI"; break; default: *output << "Other"; } *output << ";"; *output << target->getType(); *output << ";"; delete parser; return; } if (searchtype) querytype = QT_SEARCH; else if (!strcmp(target->getType(), "Biblical Texts")) querytype = QT_BIBLE; else if (!strcmp(target->getType(), "Commentaries")) querytype = QT_COMM; else if (!strcmp(target->getType(), "Lexicons / Dictionaries")) querytype = QT_LD; else if (!strcmp(target->getType(), "Generic Books")) 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("Variants", "Primary Readings"); if (optionfilters & OP_TRANSLITERATOR && script) manager.setGlobalOption("Transliteration", script); else manager.setGlobalOption("Transliteration", "Off"); if (optionfilters & OP_ARABICPOINTS) manager.setGlobalOption("Arabic Vowel Points","On"); else manager.setGlobalOption("Arabic Vowel Points","Off"); if (querytype == QT_SEARCH) { //this test is just to determine if we've got SWKeys or VerseKeys if (!strcmp(target->getType(), "Biblical Texts")) querytype = QT_BIBLE; else if (!strcmp(target->getType(), "Commentaries")) querytype = QT_BIBLE; else if (!strcmp(target->getType(), "Lexicons / Dictionaries")) querytype = QT_LD; else if (!strcmp(target->getType(), "Generic Books")) 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) { ListKey scope = parser->parseVerseList(range, "Gen 1:1", true); listkey = target->search(ref, st, REG_ICASE, &scope); } else listkey = target->search(ref, st, REG_ICASE); if (strlen((const char*)listkey)) { if (!listkey.popError()) { if (outputformat == FMT_CGI) *output << "<entry>"; if (querytype == QT_BIBLE) { *parser = listkey; *output << (const char *)*parser; } else *output << (const char *)listkey; if (outputformat == FMT_CGI) *output << "</entry>"; } listkey++; while (!listkey.popError()) { *output << " ; "; if (outputformat == FMT_CGI) *output << "<entry>"; if (querytype == QT_BIBLE) { *parser = listkey; *output << (const char *)*parser; } 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->getName(); *output << ")\n"; } else { *output << "none ("; *output << target->getName(); *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->getKeyText(); 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->getName(); *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->getName())) != 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 = parser->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 && element->isBoundSet()) { target->setKey(element->getLowerBound()); *parser = element->getUpperBound(); while (maxverses && *target->getKey() <= *parser) { *output << (char*)target->getKeyText(); 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->getKey() == *parser) break; maxverses--; (*target)++; } } else { target->setKey(*listkey.GetElement(i)); *output << (char*)target->getKeyText(); 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->getName(); *output << ")\n"; if (outputformat == FMT_RTF) { *output << "}"; } } delete parser; }