summaryrefslogtreecommitdiff
path: root/src/modules/filters/osisvariants.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/filters/osisvariants.cpp')
-rw-r--r--src/modules/filters/osisvariants.cpp82
1 files changed, 35 insertions, 47 deletions
diff --git a/src/modules/filters/osisvariants.cpp b/src/modules/filters/osisvariants.cpp
index 16e0cfb..6cd3eda 100644
--- a/src/modules/filters/osisvariants.cpp
+++ b/src/modules/filters/osisvariants.cpp
@@ -1,10 +1,11 @@
/******************************************************************************
*
- * osisvariants - SWFilter descendant to hide or show textual variants
- * in an OSIS module.
+ * osisvariants.cpp - SWFilter descendant to hide or show textual variants
+ * in an OSIS module
*
+ * $Id: osisvariants.cpp 2980 2013-09-14 21:51:47Z scribe $
*
- * Copyright 2009 CrossWire Bible Society (http://www.crosswire.org)
+ * Copyright 2006-2013 CrossWire Bible Society (http://www.crosswire.org)
* CrossWire Bible Society
* P. O. Box 2528
* Tempe, AZ 85280-2528
@@ -23,51 +24,41 @@
#include <stdlib.h>
#include <osisvariants.h>
#include <utilstr.h>
+#include <utilxml.h>
-SWORD_NAMESPACE_START
-const char OSISVariants::primary[] = "Primary Reading";
-const char OSISVariants::secondary[] = "Secondary Reading";
-const char OSISVariants::all[] = "All Readings";
+SWORD_NAMESPACE_START
-const char OSISVariants::optName[] = "Textual Variants";
-const char OSISVariants::optTip[] = "Switch between Textual Variants modes";
+namespace {
+ static const char oName[] = "Textual Variants";
+ static const char oTip[] = "Switch between Textual Variants modes";
+ static const char *choices[4] = { "Primary Reading", "Secondary Reading", "All Readings", "" };
-OSISVariants::OSISVariants() {
- option = false;
- options.push_back(primary);
- options.push_back(secondary);
- options.push_back(all);
+ static const StringList *oValues() {
+ static const StringList oVals(&choices[0], &choices[3]);
+ return &oVals;
+ }
}
-OSISVariants::~OSISVariants() {
+OSISVariants::OSISVariants() : SWOptionFilter(oName, oTip, oValues()) {
}
-void OSISVariants::setOptionValue(const char *ival)
-{
- if (!stricmp(ival, primary)) option = 0;
- else if (!stricmp(ival, secondary)) option = 1;
- else option = 2;
-}
-const char *OSISVariants::getOptionValue()
-{
- if (option == 0) {
- return primary;
- }
- else if (option == 1) {
- return secondary;
- }
- else {
- return all;
- }
+OSISVariants::~OSISVariants() {
}
+
char OSISVariants::processText(SWBuf &text, const SWKey *key, const SWModule *module)
{
- if (option == 0 || option == 1) { //we want primary or variant only
+
+ int option = 0;
+ if (optionValue == choices[0]) option = 0;
+ else if (optionValue == choices[1]) option = 1;
+ else option = 2;
+
+ if (option == 0 || option == 1) { //we want primary or variant only
bool intoken = false;
bool hide = false;
bool invar = false;
@@ -75,9 +66,10 @@ char OSISVariants::processText(SWBuf &text, const SWKey *key, const SWModule *mo
SWBuf token;
SWBuf orig = text;
const char *from = orig.c_str();
+ XMLTag tag;
//we use a fixed comparision string to make sure the loop is as fast as the original two blocks with almost the same code
- //const char* variantCompareString = (option == 0) ? "div type=\"variant\" class=\"1\"" : "div type=\"variant\" class=\"2\"";
+ const char* variantChoice = (option == 0) ? "x-2" : "x-1";
for (text = ""; *from; from++) {
if (*from == '<') {
@@ -88,16 +80,16 @@ char OSISVariants::processText(SWBuf &text, const SWKey *key, const SWModule *mo
else if (*from == '>') { // process tokens
intoken = false;
- if (!strncmp(token.c_str(), "seg ", 4)) { //only one of the variants
- invar = true;
- hide = true;
- continue;
- }
- if (!strncmp(token.c_str(), "div type=\"variant\"", 18)) {
- invar = true;
- continue;
+ if (!strncmp(token.c_str(), "seg", 3)) {
+ tag = token;
+
+ if (tag.getAttribute("type") && !strcmp("x-variant", tag.getAttribute("type")) && tag.getAttribute("subType") && !strcmp(variantChoice, tag.getAttribute("subType"))) {
+ invar = true;
+ hide = true;
+ continue;
+ }
}
- if (!strncmp(token.c_str(), "/div", 4)) {
+ if (!strncmp(token.c_str(), "/seg", 4)) {
hide = false;
if (invar) {
invar = false;
@@ -126,8 +118,4 @@ char OSISVariants::processText(SWBuf &text, const SWKey *key, const SWModule *mo
}
-
-
-
-
SWORD_NAMESPACE_END