diff options
Diffstat (limited to 'src/modules/filters/thmlheadings.cpp')
-rw-r--r-- | src/modules/filters/thmlheadings.cpp | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/src/modules/filters/thmlheadings.cpp b/src/modules/filters/thmlheadings.cpp new file mode 100644 index 0000000..4d6134f --- /dev/null +++ b/src/modules/filters/thmlheadings.cpp @@ -0,0 +1,153 @@ +/****************************************************************************** + * + * thmlheadings - SWFilter descendant to hide or show headings + * in a ThML module. + */ + + +#include <stdlib.h> +#include <stdio.h> +#include <thmlheadings.h> +#include <utilxml.h> +#include <utilstr.h> +#include <swmodule.h> +#include <stdio.h> + +SWORD_NAMESPACE_START + +const char oName[] = "Headings"; +const char oTip[] = "Toggles Headings On and Off if they exist"; + +const SWBuf choices[3] = {"Off", "On", ""}; +const StringList oValues(&choices[0], &choices[2]); + +ThMLHeadings::ThMLHeadings() : SWOptionFilter(oName, oTip, &oValues) { + setOptionValue("Off"); +} + + +ThMLHeadings::~ThMLHeadings() { +} + + +char ThMLHeadings::processText(SWBuf &text, const SWKey *key, const SWModule *module) { + SWBuf token; + bool intoken = false; + bool isheader = false; + bool hide = false; + bool preverse = false; + bool withinDiv = false; + SWBuf header; + int headerNum = 0; + int pvHeaderNum = 0; + char buf[254]; + XMLTag startTag; + + SWBuf orig = text; + const char *from = orig.c_str(); + + XMLTag tag; + + for (text = ""; *from; ++from) { + if (*from == '<') { + intoken = true; + token = ""; + + continue; + } + if (*from == '>') { // process tokens + intoken = false; + + if (!strnicmp(token.c_str(), "div", 3) || !strnicmp(token.c_str(), "/div", 4)) { + withinDiv = (!strnicmp(token.c_str(), "div", 3)); + tag = token; + if (hide && tag.isEndTag()) { + if (module->isProcessEntryAttributes() && (option || (!preverse))) { + if (preverse) { + sprintf(buf, "%i", pvHeaderNum++); + module->getEntryAttributes()["Heading"]["Preverse"][buf] = header; + } + else { + sprintf(buf, "%i", headerNum++); + module->getEntryAttributes()["Heading"]["Interverse"][buf] = header; + if (option) { // we want the tag in the text + text.append(header); + } + } + + StringList attributes = startTag.getAttributeNames(); + for (StringList::const_iterator it = attributes.begin(); it != attributes.end(); it++) { + module->getEntryAttributes()["Heading"][buf][it->c_str()] = startTag.getAttribute(it->c_str()); + } + } + + hide = false; + if (!option || preverse) { // we don't want the tag in the text anymore + preverse = false; + continue; + } + preverse = false; + } + if (tag.getAttribute("class") && ((!stricmp(tag.getAttribute("class"), "sechead")) + || (!stricmp(tag.getAttribute("class"), "title")))) { + + isheader = true; + + if (!tag.isEndTag()) { //start tag + if (!tag.isEmpty()) { + startTag = tag; + +/* how do we tell a ThML preverse title from one that should be in the text? probably if any text is before the title... just assuming all are preverse for now + } + if (tag.getAttribute("subtype") && !stricmp(tag.getAttribute("subtype"), "x-preverse")) { +*/ + hide = true; + preverse = true; + header = ""; + continue; + } // move back up under startTag = tag + } +/* this is where non-preverse will go eventually + if (!tag.isEndTag()) { //start tag + hide = true; + header = ""; + if (option) { // we want the tag in the text + text.append('<'); + text.append(token); + text.append('>'); + } + continue; + } +*/ + } + else + isheader = false; + } + + if (withinDiv && isheader) { + header.append('<'); + header.append(token); + header.append('>'); + } else { + // if not a heading token, keep token in text + if (!hide) { + text.append('<'); + text.append(token); + text.append('>'); + } + } + continue; + } + if (intoken) { //copy token + token.append(*from); + } + else if (!hide) { //copy text which is not inside a token + text.append(*from); + } + else header.append(*from); + } + return 0; +} + + +SWORD_NAMESPACE_END |