int main(int argc, char **argv) { long pos, offset; int num1, num2, rangemax; char startflag = 0; short size; checkparams(argc, argv); openfiles(argv[1]); testmnt = key1.getTestament(); num1 = key1.getChapter(); num2 = key1.getVerse(); pos = 0; write(bfp, &pos, 4); /* Book offset for testament intros */ pos = 4; write(cfp, &pos, 4); /* Chapter offset for testament intro */ /* Right now just zero out intros until parsing correctly */ pos = 0; size = 0; write(vfp, &pos, 4); /* Module intro */ write(vfp, &size, 2); write(vfp, &pos, 4); /* Testament intro */ write(vfp, &size, 2); while(!findbreak(fp, &offset, &num1, &num2, &rangemax, &size)) { if (!startflag) { startflag = 1; } else { if (num2 < key2.getVerse()) { // new chapter if (num1 <= key2.getChapter()) { // new book key2.setVerse(1); key2.setChapter(1); key2.setBook(key2.getBook()+1); } printf("Found Chapter Break: %d ('%s')\n", num1, (const char *)key2); chapoffset = offset; chapsize = size; // continue; } } key2.setVerse(1); key2.setChapter(num1); key2.setVerse(num2); key3 = key2; // key3 += (rangemax - key3.getVerse()); writeidx(key1, key2, key3, offset, size); } close(vfp); close(cfp); close(bfp); close(fp); return 0; }
int main() { SWMgr library; auto const book(library.getModule("KJV")); VerseKey *vk = (VerseKey *) book->getKey(); for (;!vk->popError();vk->setChapter(vk->getChapter()+1)) { vk->setVerse(vk->getVerseMax()); std::string text = book->stripText(); trimString(text); if (!text.empty() && (*text.rbegin()) == ',') { cout << vk->getText() << ":\n\n"; cout << text << endl; } } return 0; }
int main(int argc, char **argv) { SWMgr library; SWModule *book = library.getModule("KJV"); VerseKey *vk = (VerseKey *) book->getKey(); for (;!vk->popError();vk->setChapter(vk->getChapter()+1)) { vk->setVerse(vk->getVerseMax()); SWBuf text = book->stripText(); text = text.trim(); if (text.endsWith(",")) { cout << vk->getText() << ":\n\n"; cout << text << endl; } } return 0; }
std::string SwordPluginAPI::getVerses(const std::string& moduleName, const std::string& key, const std::string& single) { /*Get verses from a specific module (e.g. "ESV"). Set your biblepassage in key e.g. "James 1:19" */ std::stringstream passage; std::stringstream tmpPassage; std::stringstream out; SWModule *module = displayLibrary->getModule(moduleName.c_str()); /* if (!module || !(strcmp(module->Type(), "Biblical Texts") == 0 || strcmp(module->Type(), "Commentaries") == 0)) { PDL_JSException(parms, "getVerses: Module isn't verse driven (no bible or commentary). Currently BibleZ HD doesn't support Generic Books and Lexicons / Dictionaries!"); return PDL_TRUE; } */ //module->setKey(key); //VerseKey *vk = (VerseKey*)module->getKey(); VerseKey *vk = dynamic_cast<VerseKey *>(module->getKey()); //vk->AutoNormalize(false); vk->Headings(true); vk->setText(key.c_str()); ListKey verses = VerseKey().ParseVerseList(key.c_str(), "", true); passage << "{\"bookName\": \"" << vk->getBookName() << "\", \"cnumber\": \"" << vk->Chapter() << "\", \"vnumber\": \"" << vk->Verse() << "\", \"passageSingle\" : \"" << vk->getBookName() << " " << vk->Chapter() << ":" << vk->Verse() << "\", \"passage\" : \"" << vk->getBookName() << " " << vk->Chapter() << "\", \"abbrev\": \"" << vk->getBookAbbrev() << "\"}"; if (single == "true") { verses = VerseKey().ParseVerseList(key.c_str(), "", true); } else { tmpPassage << vk->getBookName() << " " << vk->Chapter(); verses = VerseKey().ParseVerseList(tmpPassage.str().c_str(), "", true); } AttributeTypeList::iterator i1; AttributeList::iterator i2; AttributeValue::iterator i3; out << "["; for (verses = TOP; !verses.Error(); verses++) { vk->setText(verses); if (strcmp(module->RenderText(), "") != 0) { //headingOn = 0; out << "{\"content\": \"" << convertString(module->RenderText()) << "\", "; out << "\"vnumber\": \"" << vk->Verse() << "\", "; out << "\"cnumber\": \"" << vk->Chapter() << "\""; out << ", \"heading\": \"" << convertString(module->getEntryAttributes()["Heading"]["Preverse"]["0"].c_str()) << "\""; for (i1 = module->getEntryAttributes().begin(); i1 != module->getEntryAttributes().end(); i1++) { if (strcmp(i1->first, "Footnote") == 0) { out << ", \"footnotes\": ["; for (i2 = i1->second.begin(); i2 != i1->second.end(); i2++) { out << "{"; for (i3 = i2->second.begin(); i3 != i2->second.end(); i3++) { out << "\"" << i3->first << "\": \"" << convertString(i3->second.c_str()) << "\""; //footnotesOn = 1; if (i3 != --i2->second.end()) { out << ", "; } } out << "}"; if (i2 != --i1->second.end()) { out << ", "; } } out << "]"; } /*else if (strcmp(i1->first, "Word") == 0) { out << ", \"words\": ["; for (i2 = i1->second.begin(); i2 != i1->second.end(); i2++) { out << "{"; for (i3 = i2->second.begin(); i3 != i2->second.end(); i3++) { out << "\"" << i3->first << "\": \"" << convertString(i3->second.c_str()) << "\""; if (i3 != --i2->second.end()) { out << ", "; } } out << "}"; if (i2 != --i1->second.end()) { out << ", "; } } out << "]"; } */ } if (vk->Chapter() == 1 && vk->Verse() == 1) { vk->setChapter(0); vk->setVerse(0); out << ", \"intro\": \"" << convertString(module->RenderText()) << "\""; } out << "}"; ListKey helper = verses; helper++; if (!helper.Error()) { out << ", "; } } } out << "]"; /*if (out.str() == "[]") { PDL_JSException(parms, "getVerses: Chapter is not available in this module!"); return PDL_FALSE; }*/ out << "<#split#>" << passage.str(); return out.str(); }
char GBFOSIS::processText(SWBuf &text, const SWKey *key, const SWModule *module) { char token[2048]; //cheesy, we seem to like cheese :) int tokpos = 0; bool intoken = false; bool keepToken = false; // static QuoteStack quoteStack; SWBuf orig = text; SWBuf tmp; SWBuf value; bool suspendTextPassThru = false; bool handled = false; bool newWord = false; bool newText = false; bool lastspace = false; const char *wordStart = text.c_str(); const char *wordEnd = NULL; const char *textStart = NULL; const char *textEnd = NULL; SWBuf textNode = ""; SWBuf buf; text = ""; for (const char* from = orig.c_str(); *from; ++from) { if (*from == '<') { //start of new token detected intoken = true; tokpos = 0; token[0] = 0; token[1] = 0; token[2] = 0; textEnd = from-1; //end of last text node found wordEnd = text.c_str() + text.length();//not good, instead of wordEnd = to! continue; } if (*from == '>') { // process tokens intoken = false; keepToken = false; suspendTextPassThru = false; newWord = true; handled = false; while (wordStart < (text.c_str() + text.length())) { //hack if (strchr(";,. :?!()'\"", *wordStart) && wordStart[0] && wordStart[1]) wordStart++; else break; } while (wordEnd > wordStart) { if (strchr(" ,;:.?!()'\"", *wordEnd)) wordEnd--; else break; } // Scripture Reference if (!strncmp(token, "scripRef", 8)) { suspendTextPassThru = true; newText = true; handled = true; } else if (!strncmp(token, "/scripRef", 9)) { tmp = ""; tmp.append(textStart, (int)(textEnd - textStart)+1); text += VerseKey::convertToOSIS(tmp.c_str(), key); lastspace = false; suspendTextPassThru = false; handled = true; } // Footnote if (!strcmp(token, "RF") || !strncmp(token, "RF ", 3)) { //the GBFFootnotes filter adds the attribute "swordFootnote", we want to catch that, too // pushString(buf, "<reference work=\"Bible.KJV\" reference=\""); text += "<note type=\"x-StudyNote\">"; newText = true; lastspace = false; handled = true; } else if (!strcmp(token, "Rf")) { text += "</note>"; lastspace = false; handled = true; } // hebrew titles if (!strcmp(token, "TH")) { text += "<title type=\"psalm\">"; newText = true; lastspace = false; handled = true; } else if (!strcmp(token, "Th")) { text += "</title>"; lastspace = false; handled = true; } // Italics assume transchange if (!strcmp(token, "FI")) { text += "<transChange type=\"added\">"; newText = true; lastspace = false; handled = true; } else if (!strcmp(token, "Fi")) { text += "</transChange>"; lastspace = false; handled = true; } // less than if (!strcmp(token, "CT")) { text += "<"; newText = true; lastspace = false; handled = true; } // greater than if (!strcmp(token, "CG")) { text += ">"; newText = true; lastspace = false; handled = true; } // Paragraph break. For now use empty paragraph element if (!strcmp(token, "CM")) { text += "<milestone type=\"x-p\" />"; newText = true; lastspace = false; handled = true; } // Figure else if (!strncmp(token, "img ", 4)) { const char *src = strstr(token, "src"); if (!src) // assert we have a src attribute continue; // return false; text += "<figure src=\""; const char *c; for (c = src;((*c) && (*c != '"')); c++); // uncomment for SWORD absolute path logic // if (*(c+1) == '/') { // pushString(buf, "file:"); // pushString(buf, module->getConfigEntry("AbsoluteDataPath")); // if (*((*buf)-1) == '/') // c++; // skip '/' // } // end of uncomment for asolute path logic for (c++;((*c) && (*c != '"')); c++) { text += *c; } text += "\" />"; lastspace = false; handled = true; } // Strongs numbers else if (*token == 'W' && (token[1] == 'G' || token[1] == 'H')) { // Strongs bool divineName = false; value = token+1; // normal strongs number //strstrip(val); if (!strncmp(wordStart, "<w ", 3)) { const char *attStart = strstr(wordStart, "lemma"); if (attStart) { attStart += 7; buf = ""; buf.appendFormatted("strong:%s ", value.c_str()); } else { // no lemma attribute attStart = wordStart + 3; buf = ""; buf.appendFormatted(buf, "lemma=\"strong:%s\" ", value.c_str()); } text.insert(attStart - text.c_str(), buf); } else { //wordStart doesn't point to an existing <w> attribute! if (!strcmp(value.c_str(), "H03068")) { //divineName buf = ""; buf.appendFormatted("<divineName><w lemma=\"strong:%s\">", value.c_str()); divineName = true; } else { buf = ""; buf.appendFormatted("<w lemma=\"strong:%s\">", value.c_str()); } text.insert(wordStart - text.c_str(), buf); if (divineName) { wordStart += 12; text += "</w></divineName>"; } else text += "</w>"; lastspace = false; } handled = true; } // Morphology else if (*token == 'W' && token[1] == 'T') { if (token[2] == 'G' || token[2] == 'H') { // Strongs value = token+2; } else value = token+1; if (!strncmp(wordStart, "<w ", 3)) { const char *attStart = strstr(wordStart, "morph"); if (attStart) { //existing morph attribute, append this one to it attStart += 7; buf = ""; buf.appendFormatted("%s:%s ", "robinson", value.c_str()); } else { // no lemma attribute attStart = wordStart + 3; buf = ""; buf.appendFormatted("morph=\"%s:%s\" ", "robinson", value.c_str()); } text.insert(attStart - text.c_str(), buf); //hack, we have to } else { //no existing <w> attribute fond buf = ""; buf.appendFormatted("<w morph=\"%s:%s\">", "robinson", value.c_str()); text.insert(wordStart - text.c_str(), buf); text += "</w>"; lastspace = false; } handled = true; } if (!keepToken) { if (!handled) { SWLog::getSystemLog()->logError("Unprocessed Token: <%s> in key %s", token, key ? (const char*)*key : "<unknown>"); // exit(-1); } if (from[1] && strchr(" ,;.:?!()'\"", from[1])) { if (lastspace) { text--; } } if (newText) { textStart = from+1; newText = false; } continue; } // if not a strongs token, keep token in text text.appendFormatted("<%s>", token); if (newText) { textStart = text.c_str() + text.length(); newWord = false; } continue; } if (intoken) { if ((tokpos < 2045) && ((*from != 10)&&(*from != 13))) { token[tokpos++] = *from; token[tokpos+2] = 0; } } else { switch (*from) { case '\'': case '\"': case '`': // quoteStack.handleQuote(fromStart, from, &to); text += *from; //from++; //this line removes chars after an apostrophe! Needs fixing. break; default: if (newWord && (*from != ' ')) { wordStart = text.c_str() + text.length(); newWord = false; //fix this if required? //memset(to, 0, 10); } if (!suspendTextPassThru) { text += (*from); lastspace = (*from == ' '); } } } } VerseKey *vkey = SWDYNAMIC_CAST(VerseKey, key); if (vkey) { SWBuf ref = ""; if (vkey->getVerse()) { ref.appendFormatted("\t\t<verse osisID=\"%s\">", vkey->getOSISRef()); } if (ref.length() > 0) { text = ref + text; if (vkey->getVerse()) { VerseKey *tmp = (VerseKey *)vkey->clone(); *tmp = *vkey; tmp->setAutoNormalize(false); tmp->setIntros(true); text += "</verse>"; *tmp = MAXVERSE; if (*vkey == *tmp) { tmp->setVerse(0); // sprintf(ref, "\t</div>"); // pushString(&to, ref); *tmp = MAXCHAPTER; *tmp = MAXVERSE; if (*vkey == *tmp) { tmp->setChapter(0); tmp->setVerse(0); // sprintf(ref, "\t</div>"); // pushString(&to, ref); /* if (!quoteStack.empty()) { SWLog::getSystemLog()->logError("popping unclosed quote at end of book"); quoteStack.clear(); } */ } } delete tmp; } // else if (vkey->Chapter()) { // sprintf(ref, "\t<div type=\"chapter\" osisID=\"%s\">", vkey->getOSISRef()); // } // else sprintf(ref, "\t<div type=\"book\" osisID=\"%s\">", vkey->getOSISRef()); } } return 0; }
int main(int argc, char **argv) { SWMgr mymgr; RawText::createModule("."); RawText mod("."); VerseKey vk; vk.setIntros(true); vk.setAutoNormalize(false); vk.setPersist(true); mod.setKey(vk); vk.setVerse(0); vk.setChapter(0); vk.setBook(0); vk.setTestament(0); mod << "Module heading text"; vk.setVerse(0); vk.setChapter(0); vk.setBook(0); vk.setTestament(1); mod << "OT heading text"; vk.setTestament(1); vk.setBook(1); vk.setChapter(0); vk.setVerse(0); mod << "Gen heading text"; vk.setTestament(1); vk.setBook(1); vk.setChapter(1); vk.setVerse(0); mod << "Gen 1 heading text"; vk.setTestament(1); vk.setBook(1); vk.setChapter(1); vk.setVerse(1); mod << "Gen 1:1 text"; vk.setTestament(0); vk.setBook(0); vk.setChapter(0); vk.setVerse(0); std::cout << "Module heading text ?= " << (const char*)mod << std::endl; vk.setTestament(1); vk.setBook(0); vk.setChapter(0); vk.setVerse(0); std::cout << "OT heading text ?= " << (const char*)mod << std::endl; vk.setTestament(1); vk.setBook(1); vk.setChapter(0); vk.setVerse(0); std::cout << "Gen heading text ?= " << (const char*)mod << std::endl; vk.setTestament(1); vk.setBook(1); vk.setChapter(1); vk.setVerse(0); std::cout << "Gen 1 heading text ?= " << (const char*)mod << std::endl; vk.setTestament(1); vk.setBook(1); vk.setChapter(1); vk.setVerse(1); std::cout << "Gen 1:1 text ?= " << (const char*)mod << std::endl; /* old introtest SWModule *mhc = mymgr.Modules["MHC"]; if (mhc) { VerseKey vk; vk.setIntros(true); vk.setAutoNormalize(false); vk.setPersist(true); vk = "jas 0:0"; std::cout << vk << ":\n"; mhc->setKey(vk); std::cout << (const char *) mhc->Key() << ":\n"; std::cout << (const char *) *mhc << "\n"; } */ return 0; }