void BTInstallMgr::Tool::RemoteConfig::addSource( sword::InstallSource* is ) { if (!is) { return; } SWConfig config(Tool::RemoteConfig::configFilename().latin1()); if (!strcmp(is->type, "FTP")) { //make sure the path doesn't have a trailing slash, sword doesn't like it if (is->directory[ is->directory.length()-1 ] == '/') { is->directory--; //make one char shorter } config["Sources"].insert( std::make_pair(SWBuf("FTPSource"), is->getConfEnt()) ); } else if (!strcmp(is->type, "DIR")) { config["Sources"].insert( std::make_pair(SWBuf("DIRSource"), is->getConfEnt()) ); } config.Save(); }
void BTInstallMgr::Tool::LocalConfig::setTargetList( const QStringList& targets ) { //saves a new Sworc config using the provided target list QString filename = KGlobal::dirs()->saveLocation("data", "bibletime/") + "sword.conf"; //default is to assume the real location isn't writable bool directAccess = false; QFileInfo i(LocalConfig::swordConfigFilename()); QFileInfo dirInfo(i.dirPath(true)); if ( i.exists() && i.isWritable() ) { //we can write to the file ourself filename = LocalConfig::swordConfigFilename(); directAccess = true; } else if ( !i.exists() && dirInfo.isWritable() ) { // if the file doesn't exist but th eparent is writable for us, create it filename = LocalConfig::swordConfigFilename(); directAccess = true; } bool setDataPath = false; SWConfig conf(filename.local8Bit()); conf.Sections.clear(); for (QStringList::const_iterator it = targets.begin(); it != targets.end(); ++it) { QString t = *it; if (t.contains( QString("%1/.sword").arg(getenv("HOME")) )) { //we don't want HOME/.sword in the config continue; } else { conf["Install"].insert( std::make_pair(!setDataPath ? SWBuf("DataPath") : SWBuf("AugmentPath"), t.local8Bit()) ); setDataPath = true; } } conf.Save(); if (!directAccess) { //use kdesu to move the file to the right place KProcess *proc = new KProcess; *proc << "kdesu"; *proc << QString::fromLatin1("-c") << QString("mv %1 %2").arg(filename).arg(LocalConfig::swordConfigFilename()); proc->start(KProcess::Block); } }
const SWBuf URL::encode(const char *urlText) { /*static*/ SWBuf url; url = urlText; SWBuf buf; const int length = url.length(); for (int i = 0; i < length; i++) { //fill "buf" const char& c = url[i]; buf.append( ((m[c].length()) ? m[c] : SWBuf(c)) ); } url = buf; return url; }
void RawStr::readText(__u32 istart, __u16 *isize, char **idxbuf, SWBuf &buf) const { unsigned int ch; char *idxbuflocal = 0; getIDXBufDat(istart, &idxbuflocal); __u32 start = istart; do { if (*idxbuf) delete [] *idxbuf; buf = ""; buf.setFillByte(0); buf.setSize(++(*isize)); *idxbuf = new char [ (*isize) ]; datfd->seek(start, SEEK_SET); datfd->read(buf.getRawData(), (int)((*isize) - 1)); for (ch = 0; buf[ch]; ch++) { // skip over index string if (buf[ch] == 10) { ch++; break; } } buf = SWBuf(buf.c_str()+ch); // resolve link if (!strncmp(buf.c_str(), "@LINK", 5)) { for (ch = 0; buf[ch]; ch++) { // null before nl if (buf[ch] == 10) { buf[ch] = 0; break; } } findOffset(buf.c_str() + 6, &start, isize); } else break; } while (true); // while we're resolving links if (idxbuflocal) { int localsize = strlen(idxbuflocal); localsize = (localsize < (*isize - 1)) ? localsize : (*isize - 1); strncpy(*idxbuf, idxbuflocal, localsize); (*idxbuf)[localsize] = 0; free(idxbuflocal); } }
// This is used to output HTML tags and to update the HTML tag list so // that rendered text will not be returned with open tags. For this // function to work as intended, only a single opening or closing tag // can be included anywhere in t. Partial (unfinished) start tags are // allowed. void OSISXHTMLXS::outHtmlTag(const char * t, SWBuf &o, MyUserDataXS *u) { if (u->suspendTextPassThru) { u->lastSuspendSegment += t; return; } SWBuf tag; char *tcopy = new char [ strlen(t) + 1 ]; strcpy(tcopy, t); char *tagStart = strchr(tcopy, '<'); if (tagStart) {tag = strtok(tagStart, "</ >");} bool singleton = ( !strcmp(tag.c_str(), "br") || !strcmp(tag.c_str(), "hr") || !strcmp(tag.c_str(), "img") ); bool keepTag = true; if (!singleton) { if (tagStart && *(tagStart+1) == '/') { keepTag = (!u->htmlTagStack->empty() && !strcmp(u->htmlTagStack->top().c_str(), tag.c_str())); if (keepTag) u->htmlTagStack->pop(); } else if (tagStart) { // add this tag to stack u->htmlTagStack->push(SWBuf(tag.c_str())); } } if (keepTag) {o += t;} delete(tcopy); }
char OSISWordJS::processText(SWBuf &text, const SWKey *key, const SWModule *module) { if (option) { char token[2112]; // cheese. Fix. int tokpos = 0; bool intoken = false; int wordNum = 1; char wordstr[5]; SWBuf modName = (module)?module->getName():""; // add TR to w src in KJV then remove this next line SWBuf wordSrcPrefix = (modName == "KJV")?SWBuf("TR"):modName; VerseKey *vkey = 0; if (key) { vkey = SWDYNAMIC_CAST(VerseKey, key); } const SWBuf orig = text; const char * from = orig.c_str(); for (text = ""; *from; ++from) { if (*from == '<') { intoken = true; tokpos = 0; token[0] = 0; token[1] = 0; token[2] = 0; continue; } if (*from == '>') { // process tokens intoken = false; if ((*token == 'w') && (token[1] == ' ')) { // Word XMLTag wtag(token); sprintf(wordstr, "%03d", wordNum); SWBuf lemmaClass; SWBuf lemma; SWBuf morph; SWBuf page; SWBuf src; char gh = 0; page = module->getEntryAttributes()["Word"][wordstr]["Page"].c_str(); if (page.length()) page = (SWBuf)"p:" + page; int count = atoi(module->getEntryAttributes()["Word"][wordstr]["PartCount"].c_str()); for (int i = 0; i < count; i++) { // for now, lemma class can just be equal to last lemma class in multi part word SWBuf tmp = "LemmaClass"; if (count > 1) tmp.appendFormatted(".%d", i+1); lemmaClass = module->getEntryAttributes()["Word"][wordstr][tmp]; tmp = "Lemma"; if (count > 1) tmp.appendFormatted(".%d", i+1); tmp = (module->getEntryAttributes()["Word"][wordstr][tmp].c_str()); // if we're strongs, if (lemmaClass == "strong") { gh = tmp[0]; tmp << 1; } if (lemma.size()) lemma += "|"; lemma += tmp; tmp = "Morph"; if (count > 1) tmp.appendFormatted(".%d", i+1); tmp = (module->getEntryAttributes()["Word"][wordstr][tmp].c_str()); if (morph.size()) morph += "|"; morph += tmp; tmp = "Src"; if (count > 1) tmp.appendFormatted(".%d", i+1); tmp = (module->getEntryAttributes()["Word"][wordstr][tmp].c_str()); if (!tmp.length()) tmp.appendFormatted("%d", wordNum); tmp.insert(0, wordSrcPrefix); if (src.size()) src += "|"; src += tmp; } SWBuf lexName = ""; // we can pass the real lex name in, but we have some // aliases in the javascript to optimize bandwidth if ((gh == 'G') && (defaultGreekLex)) { lexName = (!strcmp(defaultGreekLex->getName(), "StrongsGreek"))?"G":defaultGreekLex->getName(); } else if ((gh == 'H') && (defaultHebLex)) { lexName = (!strcmp(defaultHebLex->getName(), "StrongsHebrew"))?"H":defaultHebLex->getName(); } SWBuf xlit = wtag.getAttribute("xlit"); if ((lemmaClass != "strong") && (xlit.startsWith("betacode:"))) { lexName = "betacode"; // const char *m = strchr(xlit.c_str(), ':'); // strong = ++m; } SWBuf wordID; if (vkey) { // optimize for bandwidth and use only the verse as the unique entry id wordID.appendFormatted("%d", vkey->getVerse()); } else { wordID = key->getText(); } wordID.appendFormatted("_%s", src.c_str()); // clean up our word ID for XHTML for (unsigned int i = 0; i < wordID.size(); i++) { if ((!isdigit(wordID[i])) && (!isalpha(wordID[i]))) { wordID[i] = '_'; } } // 'p' = 'fillpop' to save bandwidth text.appendFormatted("<span class=\"clk\" onclick=\"p('%s','%s','%s','%s','%s','%s');\" >", lexName.c_str(), lemma.c_str(), wordID.c_str(), morph.c_str(), page.c_str(), modName.c_str()); wordNum++; if (wtag.isEmpty()) { text += "</w></span>"; } } if ((*token == '/') && (token[1] == 'w') && option) { // Word text += "</w></span>"; continue; } // if not a strongs token, keep token in text text.append('<'); text.append(token); text.append('>'); continue; } if (intoken) { if (tokpos < 2045) { token[tokpos++] = *from; token[tokpos+2] = 0; } } else { text.append(*from); } } } return 0; }
bool OSISHeadings::handleToken(SWBuf &buf, const char *token, BasicFilterUserData *userData) { MyUserData *u = (MyUserData *)userData; XMLTag tag(token); SWBuf name = tag.getName(); // we only care about titles and divs or if we're already in a heading // // are we currently in a heading? if (u->currentHeadingName.size()) { u->heading.append(u->lastTextNode); if (name == u->currentHeadingName) { if (tag.isEndTag(u->sID)) { if (!u->depth-- || u->sID) { // see comment below about preverse div changed and needing to preserve the <title> container tag for old school pre-verse titles // we've just finished a heading. It's all stored up in u->heading bool canonical = (SWBuf("true") == u->currentHeadingTag.getAttribute("canonical")); bool preverse = (SWBuf("x-preverse") == u->currentHeadingTag.getAttribute("subType") || SWBuf("x-preverse") == u->currentHeadingTag.getAttribute("subtype")); // do we want to put anything in EntryAttributes? if (u->module->isProcessEntryAttributes() && (option || canonical || !preverse)) { SWBuf buf; buf.appendFormatted("%i", u->headerNum++); // leave the actual <title...> wrapper in if we're part of an old school preverse title // because now frontend have to deal with preverse as a div which may or may not include <title> elements // and they can't simply wrap all preverse material in <h1>, like they probably did previously SWBuf heading; if (u->currentHeadingName == "title") { XMLTag wrapper = u->currentHeadingTag; if (SWBuf("x-preverse") == wrapper.getAttribute("subType")) wrapper.setAttribute("subType", 0); else if (SWBuf("x-preverse") == wrapper.getAttribute("subtype")) wrapper.setAttribute("subtype", 0); heading = wrapper; heading += u->heading; heading += tag; } else heading = u->heading; u->module->getEntryAttributes()["Heading"][(preverse)?"Preverse":"Interverse"][buf] = heading; StringList attributes = u->currentHeadingTag.getAttributeNames(); for (StringList::const_iterator it = attributes.begin(); it != attributes.end(); it++) { u->module->getEntryAttributes()["Heading"][buf][it->c_str()] = u->currentHeadingTag.getAttribute(it->c_str()); } } // do we want the heading in the body? if (!preverse && (option || canonical)) { buf.append(u->currentHeadingTag); buf.append(u->heading); buf.append(tag); } u->suspendTextPassThru = false; u->clear(); } } else u->depth++; } u->heading.append(tag); return true; } // are we a title or a preverse div? else if ( name == "title" || (name == "div" && ( SWBuf("x-preverse") == tag.getAttribute("subType") || SWBuf("x-preverse") == tag.getAttribute("subtype")))) { u->currentHeadingName = name; u->currentHeadingTag = tag; u->heading = ""; u->sID = u->currentHeadingTag.getAttribute("sID"); u->depth = 0; u->suspendTextPassThru = true; return true; } return false; }