1
/******************************************************************************
2
* swbasicfilter.h - definition of class SWBasicFilter. An SWFilter
3
* impl that provides some basic methods that
4
* many filters will need and can use as a starting
7
* $Id: swbasicfilter.cpp,v 1.33 2003/10/24 02:43:46 scribe Exp $
9
* Copyright 2001 CrossWire Bible Society (http://www.crosswire.org)
10
* CrossWire Bible Society
12
* Tempe, AZ 85280-2528
14
* This program is free software; you can redistribute it and/or modify it
15
* under the terms of the GNU General Public License as published by the
16
* Free Software Foundation version 2.
18
* This program is distributed in the hope that it will be useful, but
19
* WITHOUT ANY WARRANTY; without even the implied warranty of
20
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21
* General Public License for more details.
26
#include <swbasicfilter.h>
32
const char SWBasicFilter::INITIALIZE = 1;
33
const char SWBasicFilter::PRECHAR = 2;
34
const char SWBasicFilter::POSTCHAR = 4;
35
const char SWBasicFilter::FINALIZE = 8;
37
SWBasicFilter::SWBasicFilter() {
49
escStringCaseSensitive = false;
50
tokenCaseSensitive = false;
51
passThruUnknownToken = false;
52
passThruUnknownEsc = false;
56
void SWBasicFilter::setPassThruUnknownToken(bool val) {
57
passThruUnknownToken = val;
61
void SWBasicFilter::setPassThruUnknownEscapeString(bool val) {
62
passThruUnknownEsc = val;
66
void SWBasicFilter::setTokenCaseSensitive(bool val) {
67
tokenCaseSensitive = val;
71
void SWBasicFilter::setEscapeStringCaseSensitive(bool val) {
72
escStringCaseSensitive = val;
76
SWBasicFilter::~SWBasicFilter() {
91
void SWBasicFilter::addTokenSubstitute(const char *findString, const char *replaceString) {
94
if (!tokenCaseSensitive) {
95
stdstr(&buf, findString);
97
tokenSubMap[buf] = replaceString;
100
else tokenSubMap[findString] = replaceString;
104
void SWBasicFilter::replaceTokenSubstitute(const char *findString, const char *replaceString) {
105
if (tokenSubMap.find(findString) != tokenSubMap.end()) {
106
tokenSubMap.erase( tokenSubMap.find(findString) ); //erase entry
108
addTokenSubstitute(findString, replaceString);
112
void SWBasicFilter::addEscapeStringSubstitute(const char *findString, const char *replaceString) {
115
if (!escStringCaseSensitive) {
116
stdstr(&buf, findString);
118
escSubMap.insert(DualStringMap::value_type(buf, replaceString));
121
else escSubMap.insert(DualStringMap::value_type(findString, replaceString));
124
void SWBasicFilter::replaceEscapeStringSubstitute(const char *findString, const char *replaceString) {
125
if (escSubMap.find(findString) != escSubMap.end()) {
126
escSubMap.erase( escSubMap.find(findString) ); //erase entry
128
addEscapeStringSubstitute(findString, replaceString);
132
bool SWBasicFilter::substituteToken(SWBuf &buf, const char *token) {
133
DualStringMap::iterator it;
135
if (!tokenCaseSensitive) {
139
it = tokenSubMap.find(tmp);
142
it = tokenSubMap.find(token);
144
if (it != tokenSubMap.end()) {
145
buf += it->second.c_str();
152
bool SWBasicFilter::substituteEscapeString(SWBuf &buf, const char *escString) {
153
DualStringMap::iterator it;
155
if (!escStringCaseSensitive) {
157
stdstr(&tmp, escString);
159
it = escSubMap.find(tmp);
162
it = escSubMap.find(escString);
164
if (it != escSubMap.end()) {
165
buf += it->second.c_str();
172
bool SWBasicFilter::handleToken(SWBuf &buf, const char *token, BasicFilterUserData *userData) {
173
return substituteToken(buf, token);
177
bool SWBasicFilter::handleEscapeString(SWBuf &buf, const char *escString, BasicFilterUserData *userData) {
178
return substituteEscapeString(buf, escString);
182
void SWBasicFilter::setEscapeStart(const char *escStart) {
183
stdstr(&(this->escStart), escStart);
184
escStartLen = strlen(escStart);
188
void SWBasicFilter::setEscapeEnd(const char *escEnd) {
189
stdstr(&(this->escEnd), escEnd);
190
escEndLen = strlen(escEnd);
194
void SWBasicFilter::setTokenStart(const char *tokenStart) {
195
stdstr(&(this->tokenStart), tokenStart);
196
tokenStartLen = strlen(tokenStart);
200
void SWBasicFilter::setTokenEnd(const char *tokenEnd) {
201
stdstr(&(this->tokenEnd), tokenEnd);
202
tokenEndLen = strlen(tokenEnd);
206
char SWBasicFilter::processText(SWBuf &text, const SWKey *key, const SWModule *module) {
210
bool intoken = false;
212
char escStartPos = 0, escEndPos = 0;
213
char tokenStartPos = 0, tokenEndPos = 0;
215
BasicFilterUserData *userData = createUserData(module, key);
218
from = orig.getRawData();
221
if (processStages & INITIALIZE) {
222
if (processStage(INITIALIZE, text, from, userData)) { // processStage handled it all
228
for (;*from; from++) {
230
if (processStages & PRECHAR) {
231
if (processStage(PRECHAR, text, from, userData)) // processStage handled this char
235
if (*from == tokenStart[tokenStartPos]) {
236
if (tokenStartPos == (tokenStartLen - 1)) {
244
else tokenStartPos++;
248
if (*from == escStart[escStartPos]) {
249
if (escStartPos == (escStartLen - 1)) {
262
if (*from == escEnd[escEndPos]) {
263
if (escEndPos == (escEndLen - 1)) {
265
userData->lastTextNode = lastTextNode;
266
if ((!handleEscapeString(text, token, userData)) && (passThruUnknownEsc)) {
271
escEndPos = escStartPos = tokenEndPos = tokenStartPos = 0;
279
if (*from == tokenEnd[tokenEndPos]) {
280
if (tokenEndPos == (tokenEndLen - 1)) {
282
userData->lastTextNode = lastTextNode;
283
if ((!handleToken(text, token, userData)) && (passThruUnknownToken)) {
288
escEndPos = escStartPos = tokenEndPos = tokenStartPos = 0;
297
token[tokpos++] = *from;
301
if ((!userData->supressAdjacentWhitespace) || (*from != ' ')) {
302
if (!userData->suspendTextPassThru)
304
lastTextNode += *from;
306
userData->supressAdjacentWhitespace = false;
309
if (processStages & POSTCHAR)
310
processStage(POSTCHAR, text, from, userData);
314
if (processStages & FINALIZE)
315
processStage(FINALIZE, text, from, userData);