diff options
Diffstat (limited to 'src/modules/filters/osisosis.cpp')
-rw-r--r-- | src/modules/filters/osisosis.cpp | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/src/modules/filters/osisosis.cpp b/src/modules/filters/osisosis.cpp new file mode 100644 index 0000000..7da6089 --- /dev/null +++ b/src/modules/filters/osisosis.cpp @@ -0,0 +1,173 @@ +/*************************************************************************** + osisosis.cpp - internal OSIS to public OSIS filter + ------------------- + begin : 2004-03-13 + copyright : 2003 by CrossWire Bible Society + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 of the License. + * * + ***************************************************************************/ + +#include <stdlib.h> +#include <osisosis.h> +#include <utilxml.h> +#include <versekey.h> +#include <swmodule.h> + +SWORD_NAMESPACE_START + + +OSISOSIS::MyUserData::MyUserData(const SWModule *module, const SWKey *key) : BasicFilterUserData(module, key) { + osisQToTick = ((!module->getConfigEntry("OSISqToTick")) || (strcmp(module->getConfigEntry("OSISqToTick"), "false"))); +} + + +OSISOSIS::OSISOSIS() { + setTokenStart("<"); + setTokenEnd(">"); + + setEscapeStart("&"); + setEscapeEnd(";"); + + setEscapeStringCaseSensitive(true); + setPassThruNumericEscapeString(true); + + addAllowedEscapeString("quot"); + addAllowedEscapeString("apos"); + addAllowedEscapeString("amp"); + addAllowedEscapeString("lt"); + addAllowedEscapeString("gt"); + + setTokenCaseSensitive(true); +} + + +char OSISOSIS::processText(SWBuf &text, const SWKey *key, const SWModule *module) { + char status = SWBasicFilter::processText(text, key, module); + VerseKey *vkey = SWDYNAMIC_CAST(VerseKey, key); + if (vkey) { + SWBuf ref = ""; + if (vkey->Verse()) { + ref.appendFormatted("\t\t<verse osisID=\"%s\">", vkey->getOSISRef()); + } + + if (ref.length() > 0) { + + text = ref + text; + + if (vkey->Verse()) { + VerseKey tmp; + tmp = *vkey; + tmp.AutoNormalize(0); + tmp.Headings(1); + + text += "</verse>"; + + tmp = MAXVERSE; + if (*vkey == tmp) { + tmp.Verse(0); +// sprintf(ref, "\t</div>"); +// pushString(&to, ref); + tmp = MAXCHAPTER; + tmp = MAXVERSE; + if (*vkey == tmp) { + tmp.Chapter(0); + tmp.Verse(0); +// sprintf(ref, "\t</div>"); +// pushString(&to, ref); + } + } + } + +// +// 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 status; +} + +bool OSISOSIS::handleToken(SWBuf &buf, const char *token, BasicFilterUserData *userData) { + // manually process if it wasn't a simple substitution + if (!substituteToken(buf, token)) { + MyUserData *u = (MyUserData *)userData; + XMLTag tag(token); + + if (!tag.isEmpty() && (!tag.isEndTag())) + u->startTag = tag; + + // <w> tag + if (!strcmp(tag.getName(), "w")) { + + // start <w> tag + if ((!tag.isEmpty()) && (!tag.isEndTag())) { + SWBuf attr = tag.getAttribute("lemma"); + if (attr.length()) { + if (!strncmp(attr.c_str(), "x-Strongs:", 10)) { + memcpy(attr.getRawData()+3, "strong", 6); + attr << 3; + tag.setAttribute("lemma", attr); + } + } + attr = tag.getAttribute("morph"); + if (attr.length()) { + if (!strncmp(attr.c_str(), "x-StrongsMorph:", 15)) { + memcpy(attr.getRawData()+3, "strong", 6); + attr << 3; + tag.setAttribute("lemma", attr); + } + if (!strncmp(attr.c_str(), "x-Robinson:", 11)) { + attr[2] = 'r'; + attr << 2; + tag.setAttribute("lemma", attr); + } + } + tag.setAttribute("wn", 0); + tag.setAttribute("savlm", 0); + tag.setAttribute("splitID", 0); + } + buf += tag; + } + + // <note> tag + else if (!strcmp(tag.getName(), "note")) { + if (!tag.isEndTag()) { + SWBuf type = tag.getAttribute("type"); + bool strongsMarkup = (type == "x-strongsMarkup" || type == "strongsMarkup"); // the latter is deprecated + if (strongsMarkup) { + tag.setEmpty(false); // handle bug in KJV2003 module where some note open tags were <note ... /> + } + + if (!tag.isEmpty()) { + tag.setAttribute("swordFootnote", 0); + + if (!strongsMarkup) { + buf += tag; + } + else u->suspendTextPassThru = true; + } + } + if (tag.isEndTag()) { + if (u->suspendTextPassThru == false) + buf+=tag; + else u->suspendTextPassThru = false; + } + } + + else { + return false; // we still didn't handle token + } + } + return true; +} + + +SWORD_NAMESPACE_END |