The SWORD Project  1.9.0.svnversion
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
ThMLXHTML Class Reference

#include <thmlxhtml.h>

+ Inheritance diagram for ThMLXHTML:
+ Collaboration diagram for ThMLXHTML:

Classes

class  MyUserData
 

Public Member Functions

virtual const char * getHeader () const
 
virtual const char * getImagePrefix ()
 
virtual char processText (SWBuf &text, const SWKey *key=0, const SWModule *module=0)
 
virtual void setImagePrefix (const char *newImgPrefix)
 
void setRenderNoteNumbers (bool val=true)
 
 ThMLXHTML ()
 

Protected Member Functions

void addAllowedEscapeString (const char *findString)
 
void addEscapeStringSubstitute (const char *findString, const char *replaceString)
 
void addTokenSubstitute (const char *findString, const char *replaceString)
 
void appendEscapeString (SWBuf &buf, const char *escString)
 
virtual BasicFilterUserDatacreateUserData (const SWModule *module, const SWKey *key)
 
virtual bool handleEscapeString (SWBuf &buf, const char *escString, BasicFilterUserData *userData)
 
virtual bool handleNumericEscapeString (SWBuf &buf, const char *escString)
 
virtual bool handleToken (SWBuf &buf, const char *token, BasicFilterUserData *userData)
 
bool passAllowedEscapeString (SWBuf &buf, const char *escString)
 
virtual bool processStage (char, SWBuf &, char *&, BasicFilterUserData *)
 
void removeAllowedEscapeString (const char *findString)
 
void removeEscapeStringSubstitute (const char *findString)
 
void removeTokenSubstitute (const char *findString)
 
void setEscapeEnd (const char *escEnd)
 
void setEscapeStart (const char *escStart)
 
void setEscapeStringCaseSensitive (bool val)
 
void setPassThruNumericEscapeString (bool val)
 
void setPassThruUnknownEscapeString (bool val)
 
void setPassThruUnknownToken (bool val)
 
virtual void setStageProcessing (char stages)
 
void setTokenCaseSensitive (bool val)
 
void setTokenEnd (const char *tokenEnd)
 
void setTokenStart (const char *tokenStart)
 
bool substituteEscapeString (SWBuf &buf, const char *escString)
 
bool substituteToken (SWBuf &buf, const char *token)
 

Static Protected Attributes

static const char FINALIZE = 8
 
static const char INITIALIZE = 1
 
static const char POSTCHAR = 4
 
static const char PRECHAR = 2
 

Private Attributes

SWBuf imgPrefix
 
bool renderNoteNumbers
 

Detailed Description

this filter converts ThML text to classed XHTML

Definition at line 34 of file thmlxhtml.h.

Constructor & Destructor Documentation

ThMLXHTML::ThMLXHTML ( )

Definition at line 50 of file thmlxhtml.cpp.

50  {
51  setTokenStart("<");
52  setTokenEnd(">");
53 
54  setEscapeStart("&");
55  setEscapeEnd(";");
56 
59 
60  addAllowedEscapeString("quot");
64 
65  addAllowedEscapeString("nbsp");
66  addAllowedEscapeString("brvbar"); // "Š"
67  addAllowedEscapeString("sect"); // "§"
68  addAllowedEscapeString("copy"); // "©"
69  addAllowedEscapeString("laquo"); // "«"
70  addAllowedEscapeString("reg"); // "®"
71  addAllowedEscapeString("acute"); // "Ž"
72  addAllowedEscapeString("para"); // "¶"
73  addAllowedEscapeString("raquo"); // "»"
74 
75  addAllowedEscapeString("Aacute"); // "Á"
76  addAllowedEscapeString("Agrave"); // "À"
77  addAllowedEscapeString("Acirc"); // "Â"
78  addAllowedEscapeString("Auml"); // "Ä"
79  addAllowedEscapeString("Atilde"); // "Ã"
80  addAllowedEscapeString("Aring"); // "Å"
81  addAllowedEscapeString("aacute"); // "á"
82  addAllowedEscapeString("agrave"); // "à"
83  addAllowedEscapeString("acirc"); // "â"
84  addAllowedEscapeString("auml"); // "ä"
85  addAllowedEscapeString("atilde"); // "ã"
86  addAllowedEscapeString("aring"); // "å"
87  addAllowedEscapeString("Eacute"); // "É"
88  addAllowedEscapeString("Egrave"); // "È"
89  addAllowedEscapeString("Ecirc"); // "Ê"
90  addAllowedEscapeString("Euml"); // "Ë"
91  addAllowedEscapeString("eacute"); // "é"
92  addAllowedEscapeString("egrave"); // "è"
93  addAllowedEscapeString("ecirc"); // "ê"
94  addAllowedEscapeString("euml"); // "ë"
95  addAllowedEscapeString("Iacute"); // "Í"
96  addAllowedEscapeString("Igrave"); // "Ì"
97  addAllowedEscapeString("Icirc"); // "Î"
98  addAllowedEscapeString("Iuml"); // "Ï"
99  addAllowedEscapeString("iacute"); // "í"
100  addAllowedEscapeString("igrave"); // "ì"
101  addAllowedEscapeString("icirc"); // "î"
102  addAllowedEscapeString("iuml"); // "ï"
103  addAllowedEscapeString("Oacute"); // "Ó"
104  addAllowedEscapeString("Ograve"); // "Ò"
105  addAllowedEscapeString("Ocirc"); // "Ô"
106  addAllowedEscapeString("Ouml"); // "Ö"
107  addAllowedEscapeString("Otilde"); // "Õ"
108  addAllowedEscapeString("oacute"); // "ó"
109  addAllowedEscapeString("ograve"); // "ò"
110  addAllowedEscapeString("ocirc"); // "ô"
111  addAllowedEscapeString("ouml"); // "ö"
112  addAllowedEscapeString("otilde"); // "õ"
113  addAllowedEscapeString("Uacute"); // "Ú"
114  addAllowedEscapeString("Ugrave"); // "Ù"
115  addAllowedEscapeString("Ucirc"); // "Û"
116  addAllowedEscapeString("Uuml"); // "Ü"
117  addAllowedEscapeString("uacute"); // "ú"
118  addAllowedEscapeString("ugrave"); // "ù"
119  addAllowedEscapeString("ucirc"); // "û"
120  addAllowedEscapeString("uuml"); // "ü"
121  addAllowedEscapeString("Yacute"); // "Ý"
122  addAllowedEscapeString("yacute"); // "ý"
123  addAllowedEscapeString("yuml"); // "ÿ"
124 
125  addAllowedEscapeString("deg"); // "°"
126  addAllowedEscapeString("plusmn"); // "±"
127  addAllowedEscapeString("sup2"); // "²"
128  addAllowedEscapeString("sup3"); // "³"
129  addAllowedEscapeString("sup1"); // "¹"
130  addAllowedEscapeString("nbsp"); // "º"
131  addAllowedEscapeString("pound"); // "£"
132  addAllowedEscapeString("cent"); // "¢"
133  addAllowedEscapeString("frac14"); // "Œ"
134  addAllowedEscapeString("frac12"); // "œ"
135  addAllowedEscapeString("frac34"); // "Ÿ"
136  addAllowedEscapeString("iquest"); // "¿"
137  addAllowedEscapeString("iexcl"); // "¡"
138  addAllowedEscapeString("ETH"); // "Ð"
139  addAllowedEscapeString("eth"); // "ð"
140  addAllowedEscapeString("THORN"); // "Þ"
141  addAllowedEscapeString("thorn"); // "þ"
142  addAllowedEscapeString("AElig"); // "Æ"
143  addAllowedEscapeString("aelig"); // "æ"
144  addAllowedEscapeString("Oslash"); // "Ø"
145  addAllowedEscapeString("curren"); // "€"
146  addAllowedEscapeString("Ccedil"); // "Ç"
147  addAllowedEscapeString("ccedil"); // "ç"
148  addAllowedEscapeString("szlig"); // "ß"
149  addAllowedEscapeString("Ntilde"); // "Ñ"
150  addAllowedEscapeString("ntilde"); // "ñ"
151  addAllowedEscapeString("yen"); // "¥"
152  addAllowedEscapeString("not"); // "¬"
153  addAllowedEscapeString("ordf"); // "ª"
154  addAllowedEscapeString("uml"); // "š"
155  addAllowedEscapeString("shy"); // "­"
156  addAllowedEscapeString("macr"); // "¯"
157 
158  addAllowedEscapeString("micro"); // "µ"
159  addAllowedEscapeString("middot"); // "·"
160  addAllowedEscapeString("cedil"); // "ž"
161  addAllowedEscapeString("ordm"); // "º"
162  addAllowedEscapeString("times"); // "×"
163  addAllowedEscapeString("divide"); // "÷"
164  addAllowedEscapeString("oslash"); // "ø"
165 
166  setTokenCaseSensitive(true);
167 // addTokenSubstitute("scripture", "<i> ");
168  addTokenSubstitute("/scripture", "</i> ");
169 
170  renderNoteNumbers = false;
171 }
void setTokenEnd(const char *tokenEnd)
void addAllowedEscapeString(const char *findString)
void setTokenCaseSensitive(bool val)
void setEscapeStart(const char *escStart)
void setTokenStart(const char *tokenStart)
void setPassThruNumericEscapeString(bool val)
bool renderNoteNumbers
Definition: thmlxhtml.h:38
void setEscapeStringCaseSensitive(bool val)
void addTokenSubstitute(const char *findString, const char *replaceString)
void setEscapeEnd(const char *escEnd)

Member Function Documentation

void SWBasicFilter::addAllowedEscapeString ( const char *  findString)
protectedinherited

Registers an esc control sequence that can pass unchanged

Definition at line 156 of file swbasicfilter.cpp.

156  {
157  char *buf = 0;
158 
159  if (!escStringCaseSensitive) {
160  stdstr(&buf, findString);
161  toupperstr(buf);
162  p->escPassSet.insert(StringSet::value_type(buf));
163  delete [] buf;
164  }
165  else p->escPassSet.insert(StringSet::value_type(findString));
166 }
SWORD_NAMESPACE_START char * stdstr(char **ipstr, const char *istr, unsigned int memPadFactor=1)
Definition: utilstr.h:44
bool escStringCaseSensitive
Definition: swbasicfilter.h:74
char * toupperstr(char *t, unsigned int max=0)
Definition: stringmgr.h:107
Private * p
Definition: swbasicfilter.h:82
void SWBasicFilter::addEscapeStringSubstitute ( const char *  findString,
const char *  replaceString 
)
protectedinherited

Registers an esc control sequence

Definition at line 176 of file swbasicfilter.cpp.

176  {
177  char *buf = 0;
178 
179  if (!escStringCaseSensitive) {
180  stdstr(&buf, findString);
181  toupperstr(buf);
182  p->escSubMap.insert(DualStringMap::value_type(buf, replaceString));
183  delete [] buf;
184  }
185  else p->escSubMap.insert(DualStringMap::value_type(findString, replaceString));
186 }
SWORD_NAMESPACE_START char * stdstr(char **ipstr, const char *istr, unsigned int memPadFactor=1)
Definition: utilstr.h:44
bool escStringCaseSensitive
Definition: swbasicfilter.h:74
char * toupperstr(char *t, unsigned int max=0)
Definition: stringmgr.h:107
Private * p
Definition: swbasicfilter.h:82
void SWBasicFilter::addTokenSubstitute ( const char *  findString,
const char *  replaceString 
)
protectedinherited

Registers a simple token substitutions. Usually called from the c-tor of a subclass

Definition at line 136 of file swbasicfilter.cpp.

136  {
137  char *buf = 0;
138 
139  if (!tokenCaseSensitive) {
140  stdstr(&buf, findString);
141  toupperstr(buf);
142  p->tokenSubMap[buf] = replaceString;
143  delete [] buf;
144  }
145  else p->tokenSubMap[findString] = replaceString;
146 }
SWORD_NAMESPACE_START char * stdstr(char **ipstr, const char *istr, unsigned int memPadFactor=1)
Definition: utilstr.h:44
bool tokenCaseSensitive
Definition: swbasicfilter.h:75
DualStringMap tokenSubMap
char * toupperstr(char *t, unsigned int max=0)
Definition: stringmgr.h:107
Private * p
Definition: swbasicfilter.h:82
void SWBasicFilter::appendEscapeString ( SWBuf buf,
const char *  escString 
)
protectedinherited

This appends escString to buf as an entity

Definition at line 216 of file swbasicfilter.cpp.

216  {
217  buf += escStart;
218  buf += escString;
219  buf += escEnd;
220 }
virtual BasicFilterUserData* ThMLXHTML::createUserData ( const SWModule module,
const SWKey key 
)
inlineprotectedvirtual

Reimplemented from SWBasicFilter.

Definition at line 51 of file thmlxhtml.h.

51  {
52  return new MyUserData(module, key);
53  }
SWORD_NAMESPACE_START const char * ThMLXHTML::getHeader ( ) const
virtual

This method can supply a header associated with the processing done with this filter. A typical example is a suggested CSS style block for classed containers.

Reimplemented from SWFilter.

Definition at line 34 of file thmlxhtml.cpp.

34  {
35  return "\
36  ";
37 }
virtual const char* ThMLXHTML::getImagePrefix ( )
inlinevirtual

Definition at line 59 of file thmlxhtml.h.

59 { return imgPrefix.c_str(); }
SWBuf imgPrefix
Definition: thmlxhtml.h:37
const char * c_str() const
Definition: swbuf.h:158
bool SWBasicFilter::handleEscapeString ( SWBuf buf,
const char *  escString,
BasicFilterUserData userData 
)
protectedvirtualinherited

This function is called for every escape sequence encountered in the input text.

Parameters
bufthe output buffer
escStringthe escape sequence (e.g. "amp" for &amp;)
userDatauser storage space for data transient to 1 full buffer parse
Returns
false if was not handled and should be handled in
subclasses should return true if they handled the esc seq, or false if they did not.

Definition at line 286 of file swbasicfilter.cpp.

286  {
287  return substituteEscapeString(buf, escString);
288 }
bool substituteEscapeString(SWBuf &buf, const char *escString)
bool SWBasicFilter::handleNumericEscapeString ( SWBuf buf,
const char *  escString 
)
protectedvirtualinherited

This function is called for all numeric escape sequences. If passThrough

Parameters
bufthe output buffer
escStringthe escape sequence (e.g. "#235" for &235;)
Returns
subclasses should return true if they handled the esc seq, or false if they did not.

Definition at line 244 of file swbasicfilter.cpp.

244  {
245  if (passThruNumericEsc) {
246  appendEscapeString(buf, escString);
247  return true;
248  }
249  return false;
250 }
bool passThruNumericEsc
Definition: swbasicfilter.h:78
void appendEscapeString(SWBuf &buf, const char *escString)
bool ThMLXHTML::handleToken ( SWBuf buf,
const char *  token,
BasicFilterUserData userData 
)
protectedvirtual

This function is called for every token encountered in the input text.

Parameters
bufthe output buffer
tokenthe token (e.g. "p align='left'"
userDatauser storage space for data transient to 1 full buffer parse
Returns
subclasses should return true if they handled the token, or false if they did not.

Reimplemented from SWBasicFilter.

Reimplemented in ThMLWEBIF.

Definition at line 174 of file thmlxhtml.cpp.

174  {
175  if (!substituteToken(buf, token)) { // manually process if it wasn't a simple substitution
176  MyUserData *u = (MyUserData *)userData;
177 
178  XMLTag tag(token);
179  if ((!tag.isEndTag()) && (!tag.isEmpty()))
180  u->startTag = tag;
181 
182  if (tag.getName() && !strcmp(tag.getName(), "sync")) {
183  SWBuf value = tag.getAttribute("value");
184  if (tag.getAttribute("type") && !strcmp(tag.getAttribute("type"), "morph")) { //&gt;
185  if(value.length())
186  buf.appendFormatted("<small><em class=\"morph\">(<a href=\"passagestudy.jsp?action=showMorph&type=Greek&value=%s\" class=\"morph\">%s</a>)</em></small>",
187  URL::encode(value.c_str()).c_str(),
188  value.c_str());
189  }
190  else if (tag.getAttribute("type") && !strcmp(tag.getAttribute("type"), "lemma")) { //&gt;
191  if(value.length())
192  // empty "type=" is deliberate.
193  buf.appendFormatted("<small><em class=\"strongs\">&lt;<a href=\"passagestudy.jsp?action=showStrongs&type=&value=%s\" class=\"strongs\">%s</a>&gt;</em></small>",
194  URL::encode(value.c_str()).c_str(),
195  value.c_str());
196  }
197  else if (tag.getAttribute("type") && !strcmp(tag.getAttribute("type"), "Strongs")) {
198  char ch = *value;
199  value<<1;
200  buf.appendFormatted("<small><em class=\"strongs\">&lt;<a href=\"passagestudy.jsp?action=showStrongs&type=%s&value=%s\" class=\"strongs\">",
201  ((ch == 'H') ? "Hebrew" : "Greek"),
202  URL::encode(value.c_str()).c_str());
203  buf += (value.length()) ? value.c_str() : "";
204  buf += "</a>&gt;</em></small>";
205  }
206  else if (tag.getAttribute("type") && !strcmp(tag.getAttribute("type"), "Dict")) {
207  buf += (tag.isEndTag() ? "</b>" : "<b>");
208  }
209 
210  }
211  // <note> tag
212  else if (!strcmp(tag.getName(), "note")) {
213  if (!tag.isEndTag()) {
214  SWBuf type = tag.getAttribute("type");
215 
216  // for backward compatibility
217  if (type == "x-cross-ref") type = "crossReference";
218 
219  SWBuf subType = tag.getAttribute("subType");
220  SWBuf footnoteNumber = tag.getAttribute("swordFootnote");
221  SWBuf noteName = tag.getAttribute("n");
222  SWBuf classExtras = "";
223 
224  if (type.size()) {
225  classExtras.append(" ").append(type);
226  }
227  if (subType.size()) {
228  classExtras.append(" ").append(subType);
229  }
230  if (!tag.isEmpty()) {
231  if (u->vkey) {
232  // leave this special osis type in for crossReference notes types? Might thml use this some day? Doesn't hurt.
233  char ch = (type == "crossReference" ? 'x':'n');
234  buf.appendFormatted("<a class=\"noteMarker%s\" href=\"passagestudy.jsp?action=showNote&type=%c&value=%s&module=%s&passage=%s\"><small><sup class=\"%c\">*%c%s</sup></small></a>",
235  classExtras.c_str(),
236  ch,
237  URL::encode(footnoteNumber.c_str()).c_str(),
238  URL::encode(u->version.c_str()).c_str(),
239  URL::encode(u->vkey->getText()).c_str(),
240  ch,
241  ch,
242  (renderNoteNumbers ? noteName.c_str() : ""));
243  }
244  else {
245  char ch = ((tag.getAttribute("type") && ((!strcmp(tag.getAttribute("type"), "crossReference")) || (!strcmp(tag.getAttribute("type"), "x-cross-ref")))) ? 'x':'n');
246  buf.appendFormatted("<a class=\"noteMarker%s\" href=\"passagestudy.jsp?action=showNote&type=%c&value=%s&module=%s&passage=%s\"><small><sup class=\"%c\">*%c%s</sup></small></a>",
247  classExtras.c_str(),
248  ch,
249  URL::encode(footnoteNumber.c_str()).c_str(),
250  URL::encode(u->version.c_str()).c_str(),
251  URL::encode(u->key->getText()).c_str(),
252  ch,
253  ch,
254  (renderNoteNumbers ? noteName.c_str() : ""));
255  }
256  u->suspendTextPassThru = true;
257  }
258  }
259  if (tag.isEndTag()) {
260  u->suspendTextPassThru = false;
261  }
262  }
263  else if (!strcmp(tag.getName(), "scripture")) {
264  buf += (tag.isEndTag() ? "</i>" : "<i>");
265  }
266  // <scripRef> tag
267  else if (!strcmp(tag.getName(), "scripRef")) {
268  if (!tag.isEndTag()) {
269  if (!tag.isEmpty()) {
270  u->suspendTextPassThru = true;
271  }
272  }
273  if (tag.isEndTag()) { // </scripRef>
274  if (!u->isBiblicalText) {
275  SWBuf refList = u->startTag.getAttribute("passage");
276  if (!refList.length())
277  refList = u->lastTextNode;
278  SWBuf version = tag.getAttribute("version");
279 
280  buf.appendFormatted("<a href=\"passagestudy.jsp?action=showRef&type=scripRef&value=%s&module=%s\">",
281  (refList.length()) ? URL::encode(refList.c_str()).c_str() : "",
282  (version.length()) ? URL::encode(version.c_str()).c_str() : "");
283  buf += u->lastTextNode.c_str();
284  buf += "</a>";
285  }
286  else {
287  SWBuf footnoteNumber = u->startTag.getAttribute("swordFootnote");
288  SWBuf noteName = tag.getAttribute("n");
289  if (u->vkey) {
290  // leave this special osis type in for crossReference notes types? Might thml use this some day? Doesn't hurt.
291  //buf.appendFormatted("<a href=\"noteID=%s.x.%s\"><small><sup>*x</sup></small></a> ", u->vkey->getText(), footnoteNumber.c_str());
292  buf.appendFormatted("<a href=\"passagestudy.jsp?action=showNote&type=x&value=%s&module=%s&passage=%s\"><small><sup class=\"x\">*x%s</sup></small></a>",
293  URL::encode(footnoteNumber.c_str()).c_str(),
294  URL::encode(u->version.c_str()).c_str(),
295  URL::encode(u->vkey->getText()).c_str(),
296  (renderNoteNumbers ? noteName.c_str() : ""));
297  }
298  }
299 
300  // let's let text resume to output again
301  u->suspendTextPassThru = false;
302  }
303  }
304  else if (tag.getName() && !strcmp(tag.getName(), "div")) {
305  if (tag.isEndTag() && u->secHeadLevel) {
306  buf += "</h";
307  buf += u->secHeadLevel;
308  buf += ">";
309  u->secHeadLevel = 0;
310  }
311  else if (tag.getAttribute("class")) {
312  if (!stricmp(tag.getAttribute("class"), "sechead")) {
313  u->secHeadLevel = '3';
314  buf += "<h3>";
315  }
316  else if (!stricmp(tag.getAttribute("class"), "title")) {
317  u->secHeadLevel = '2';
318  buf += "<h2>";
319  }
320  else {
321  buf += tag;
322  }
323  }
324  else {
325  buf += tag;
326  }
327  }
328  else if (tag.getName() && (!strcmp(tag.getName(), "img") || !strcmp(tag.getName(), "image"))) {
329  const char *src = strstr(token, "src");
330  if (!src) // assert we have a src attribute
331  return false;
332 
333  const char *c, *d;
334  if (((c = strchr(src+3, '"')) == NULL) ||
335  ((d = strchr( ++c , '"')) == NULL)) // identify endpoints.
336  return false; // abandon hope.
337 
338  SWBuf imagename = "file:";
339  if (*c == '/') // as below, inside for loop.
340  imagename += userData->module->getConfigEntry("AbsoluteDataPath");
341  while (c != d) // move bits into the name.
342  imagename += *(c++);
343 
344  // images become clickable, if the UI supports showImage.
345  buf.appendFormatted("<a href=\"passagestudy.jsp?action=showImage&value=%s&module=%s\"><",
346  URL::encode(imagename.c_str()).c_str(),
347  URL::encode(u->version.c_str()).c_str());
348 
349  for (c = token; *c; c++) {
350  if ((*c == '/') && (*(c+1) == '\0'))
351  continue;
352  if (c == src) {
353  for (;((*c) && (*c != '"')); c++)
354  buf += *c;
355 
356  if (!*c) { c--; continue; }
357 
358  buf += '"';
359  if (*(c+1) == '/') {
360  buf += "file:";
361  buf += userData->module->getConfigEntry("AbsoluteDataPath");
362  if (buf[buf.length()-2] == '/')
363  c++; // skip '/'
364  }
365  continue;
366  }
367  buf += *c;
368  }
369  buf += " border=0 /></a>";
370  }
371  else {
372  buf += '<';
373  /*for (const char *tok = token; *tok; tok++)
374  buf += *tok;*/
375  buf += token;
376  buf += '>';
377  //return false; // we still didn't handle token
378  }
379  }
380  return true;
381 }
SWBuf & appendFormatted(const char *format,...)
Definition: swbuf.cpp:81
Definition: swbuf.h:47
unsigned long length() const
Definition: swbuf.h:197
virtual const char * getConfigEntry(const char *key) const
Definition: swmodule.cpp:1159
const SWModule * module
Definition: swbasicfilter.h:42
Definition: utilxml.h:38
bool substituteToken(SWBuf &buf, const char *token)
int stricmp(const char *s1, const char *s2)
Definition: utilstr.cpp:194
return NULL
Definition: regex.c:7953
const char * c_str() const
Definition: swbuf.h:158
SWBuf & append(const char *str, long max=-1)
Definition: swbuf.h:274
unsigned long size() const
Definition: swbuf.h:185
bool renderNoteNumbers
Definition: thmlxhtml.h:38
static const SWBuf encode(const char *urlText)
Definition: url.cpp:231
bool SWBasicFilter::passAllowedEscapeString ( SWBuf buf,
const char *  escString 
)
protectedinherited

This passes allowed escapeStrings

Definition at line 223 of file swbasicfilter.cpp.

223  {
224  StringSet::iterator it;
225 
226  if (!escStringCaseSensitive) {
227  char *tmp = 0;
228  stdstr(&tmp, escString);
229  toupperstr(tmp);
230  it = p->escPassSet.find(tmp);
231  delete [] tmp;
232  } else
233  it = p->escPassSet.find(escString);
234 
235  if (it != p->escPassSet.end()) {
236  appendEscapeString(buf, escString);
237  return true;
238  }
239 
240  return false;
241 }
SWORD_NAMESPACE_START char * stdstr(char **ipstr, const char *istr, unsigned int memPadFactor=1)
Definition: utilstr.h:44
bool escStringCaseSensitive
Definition: swbasicfilter.h:74
char * toupperstr(char *t, unsigned int max=0)
Definition: stringmgr.h:107
Private * p
Definition: swbasicfilter.h:82
void appendEscapeString(SWBuf &buf, const char *escString)
virtual bool SWBasicFilter::processStage ( char  ,
SWBuf ,
char *&  ,
BasicFilterUserData  
)
inlineprotectedvirtualinherited

Reimplemented in OSISPlain.

Definition at line 185 of file swbasicfilter.h.

185 { return false; }
char SWBasicFilter::processText ( SWBuf text,
const SWKey key = 0,
const SWModule module = 0 
)
virtualinherited

This method processes and appropriately modifies the text given it for a particular filter task

Parameters
textThe text to be filtered/converted
keyCurrent key That was used.
moduleCurrent module.
Returns
0

Implements SWFilter.

Reimplemented in ThMLRTF, OSISOSIS, and OSISRTF.

Definition at line 315 of file swbasicfilter.cpp.

315  {
316  char *from;
317  char token[4096];
318  int tokpos = 0;
319  bool intoken = false;
320  bool inEsc = false;
321  int escStartPos = 0, escEndPos = 0;
322  int tokenStartPos = 0, tokenEndPos = 0;
323  SWBuf lastTextNode;
324  BasicFilterUserData *userData = createUserData(module, key);
325 
326  SWBuf orig = text;
327  from = orig.getRawData();
328  text = "";
329 
330  if (processStages & INITIALIZE) {
331  if (processStage(INITIALIZE, text, from, userData)) { // processStage handled it all
332  delete userData;
333  return 0;
334  }
335  }
336 
337  for (;*from; from++) {
338 
339  if (processStages & PRECHAR) {
340  if (processStage(PRECHAR, text, from, userData)) // processStage handled this char
341  continue;
342  }
343 
344  if (*from == tokenStart[tokenStartPos]) {
345  if (tokenStartPos == (tokenStartLen - 1)) {
346  intoken = true;
347  tokpos = 0;
348  token[0] = 0;
349  token[1] = 0;
350  token[2] = 0;
351  inEsc = false;
352  }
353  else tokenStartPos++;
354  continue;
355  }
356 
357  if (*from == escStart[escStartPos]) {
358  if (escStartPos == (escStartLen - 1)) {
359  intoken = true;
360  tokpos = 0;
361  token[0] = 0;
362  token[1] = 0;
363  token[2] = 0;
364  inEsc = true;
365  }
366  else escStartPos++;
367  continue;
368  }
369 
370  if (inEsc) {
371  if (*from == escEnd[escEndPos]) {
372  if (escEndPos == (escEndLen - 1)) {
373  intoken = inEsc = false;
374  userData->lastTextNode = lastTextNode;
375 
376  if (!userData->suspendTextPassThru) { //if text through is disabled no tokens should pass, too
377  if ((!handleEscapeString(text, token, userData)) && (passThruUnknownEsc)) {
378  appendEscapeString(text, token);
379  }
380  }
381  escEndPos = escStartPos = tokenEndPos = tokenStartPos = 0;
382  lastTextNode = "";
383  continue;
384  }
385  }
386  }
387 
388  if (!inEsc) {
389  if (*from == tokenEnd[tokenEndPos]) {
390  if (tokenEndPos == (tokenEndLen - 1)) {
391  intoken = false;
392  userData->lastTextNode = lastTextNode;
393  if ((!handleToken(text, token, userData)) && (passThruUnknownToken)) {
394  text += tokenStart;
395  text += token;
396  text += tokenEnd;
397  }
398  escEndPos = escStartPos = tokenEndPos = tokenStartPos = 0;
399  lastTextNode = "";
400  if (!userData->suspendTextPassThru) {
401  userData->lastSuspendSegment.size(0);
402  }
403  continue;
404  }
405  }
406  }
407 
408  if (intoken) {
409  if (tokpos < 4090) {
410  token[tokpos++] = *from;
411  token[tokpos+2] = 0;
412  }
413  }
414  else {
415  if ((!userData->supressAdjacentWhitespace) || (*from != ' ')) {
416  if (!userData->suspendTextPassThru) {
417  text.append(*from);
418  }
419  else userData->lastSuspendSegment.append(*from);
420  lastTextNode.append(*from);
421  }
422  userData->supressAdjacentWhitespace = false;
423  }
424 
425  if (processStages & POSTCHAR)
426  processStage(POSTCHAR, text, from, userData);
427 
428  }
429 
430  if (processStages & FINALIZE)
431  processStage(FINALIZE, text, from, userData);
432 
433  delete userData;
434  return 0;
435 }
static const char PRECHAR
Definition: swbasicfilter.h:97
Definition: swbuf.h:47
static const char POSTCHAR
Definition: swbasicfilter.h:98
char * tokenStart
Definition: swbasicfilter.h:64
virtual bool handleToken(SWBuf &buf, const char *token, BasicFilterUserData *userData)
bool passThruUnknownEsc
Definition: swbasicfilter.h:77
virtual bool handleEscapeString(SWBuf &buf, const char *escString, BasicFilterUserData *userData)
bool passThruUnknownToken
Definition: swbasicfilter.h:76
static const char FINALIZE
Definition: swbasicfilter.h:99
char * getRawData()
Definition: swbuf.h:379
SWBuf & append(const char *str, long max=-1)
Definition: swbuf.h:274
virtual bool processStage(char, SWBuf &, char *&, BasicFilterUserData *)
virtual BasicFilterUserData * createUserData(const SWModule *module, const SWKey *key)
Definition: swbasicfilter.h:91
unsigned long size() const
Definition: swbuf.h:185
static const char INITIALIZE
Definition: swbasicfilter.h:96
void appendEscapeString(SWBuf &buf, const char *escString)
void SWBasicFilter::removeAllowedEscapeString ( const char *  findString)
protectedinherited

Unregisters an esc control sequence that can pass unchanged

Definition at line 169 of file swbasicfilter.cpp.

169  {
170  if (p->escPassSet.find(findString) != p->escPassSet.end()) {
171  p->escPassSet.erase( p->escPassSet.find(findString) );
172  }
173 }
Private * p
Definition: swbasicfilter.h:82
void SWBasicFilter::removeEscapeStringSubstitute ( const char *  findString)
protectedinherited

Unregisters an esc control sequence

Definition at line 189 of file swbasicfilter.cpp.

189  {
190  if (p->escSubMap.find(findString) != p->escSubMap.end()) {
191  p->escSubMap.erase( p->escSubMap.find(findString) );
192  }
193 }
Private * p
Definition: swbasicfilter.h:82
void SWBasicFilter::removeTokenSubstitute ( const char *  findString)
protectedinherited

Unregisters a simple token substitute

Definition at line 149 of file swbasicfilter.cpp.

149  {
150  if (p->tokenSubMap.find(findString) != p->tokenSubMap.end()) {
151  p->tokenSubMap.erase( p->tokenSubMap.find(findString) );
152  }
153 }
DualStringMap tokenSubMap
Private * p
Definition: swbasicfilter.h:82
void SWBasicFilter::setEscapeEnd ( const char *  escEnd)
protectedinherited

Sets the end of escape sequence (by default ";").

Definition at line 297 of file swbasicfilter.cpp.

297  {
298  stdstr(&(this->escEnd), escEnd);
299  escEndLen = strlen(escEnd);
300 }
SWORD_NAMESPACE_START char * stdstr(char **ipstr, const char *istr, unsigned int memPadFactor=1)
Definition: utilstr.h:44
void SWBasicFilter::setEscapeStart ( const char *  escStart)
protectedinherited

Sets the beginning of escape sequence (by default "&").

Definition at line 291 of file swbasicfilter.cpp.

291  {
292  stdstr(&(this->escStart), escStart);
293  escStartLen = strlen(escStart);
294 }
SWORD_NAMESPACE_START char * stdstr(char **ipstr, const char *istr, unsigned int memPadFactor=1)
Definition: utilstr.h:44
void SWBasicFilter::setEscapeStringCaseSensitive ( bool  val)
protectedinherited

Are escapeStrings case sensitive or not? Call this function before addEscapeStingSubstitute()

Definition at line 131 of file swbasicfilter.cpp.

131  {
133 }
bool escStringCaseSensitive
Definition: swbasicfilter.h:74
virtual void ThMLXHTML::setImagePrefix ( const char *  newImgPrefix)
inlinevirtual

Definition at line 60 of file thmlxhtml.h.

60 { imgPrefix = newImgPrefix; }
SWBuf imgPrefix
Definition: thmlxhtml.h:37
void SWBasicFilter::setPassThruNumericEscapeString ( bool  val)
protectedinherited

Sets whether to pass thru a numeric escape sequence unchanged or allow it to be handled otherwise. Default is false.

Definition at line 121 of file swbasicfilter.cpp.

121  {
122  passThruUnknownEsc = val;
123 }
bool passThruUnknownEsc
Definition: swbasicfilter.h:77
void SWBasicFilter::setPassThruUnknownEscapeString ( bool  val)
protectedinherited

Sets whether to pass thru an unknown escape sequence unchanged or just remove it. Default is false.

Definition at line 116 of file swbasicfilter.cpp.

116  {
117  passThruUnknownEsc = val;
118 }
bool passThruUnknownEsc
Definition: swbasicfilter.h:77
void SWBasicFilter::setPassThruUnknownToken ( bool  val)
protectedinherited

Sets whether to pass thru an unknown token unchanged or just remove it. Default is false.

Definition at line 111 of file swbasicfilter.cpp.

111  {
112  passThruUnknownToken = val;
113 }
bool passThruUnknownToken
Definition: swbasicfilter.h:76
void ThMLXHTML::setRenderNoteNumbers ( bool  val = true)
inline

Definition at line 62 of file thmlxhtml.h.

62 { renderNoteNumbers = val; }
bool renderNoteNumbers
Definition: thmlxhtml.h:38
virtual void SWBasicFilter::setStageProcessing ( char  stages)
inlineprotectedvirtualinherited

Definition at line 186 of file swbasicfilter.h.

186 { processStages = stages; } // see STATICs up above
void SWBasicFilter::setTokenCaseSensitive ( bool  val)
protectedinherited

Are tokens case sensitive (like in GBF) or not? Call this function before addTokenSubstitute()

Definition at line 126 of file swbasicfilter.cpp.

126  {
127  tokenCaseSensitive = val;
128 }
bool tokenCaseSensitive
Definition: swbasicfilter.h:75
void SWBasicFilter::setTokenEnd ( const char *  tokenEnd)
protectedinherited

Sets the end of token start sequence (by default ">").

Definition at line 309 of file swbasicfilter.cpp.

309  {
310  stdstr(&(this->tokenEnd), tokenEnd);
311  tokenEndLen = strlen(tokenEnd);
312 }
SWORD_NAMESPACE_START char * stdstr(char **ipstr, const char *istr, unsigned int memPadFactor=1)
Definition: utilstr.h:44
void SWBasicFilter::setTokenStart ( const char *  tokenStart)
protectedinherited

Sets the beginning of token start sequence (by default "<").

Definition at line 303 of file swbasicfilter.cpp.

303  {
304  stdstr(&(this->tokenStart), tokenStart);
305  tokenStartLen = strlen(tokenStart);
306 }
char * tokenStart
Definition: swbasicfilter.h:64
SWORD_NAMESPACE_START char * stdstr(char **ipstr, const char *istr, unsigned int memPadFactor=1)
Definition: utilstr.h:44
bool SWBasicFilter::substituteEscapeString ( SWBuf buf,
const char *  escString 
)
protectedinherited

This function performs the substitution of escapeStrings

Definition at line 253 of file swbasicfilter.cpp.

253  {
254  DualStringMap::iterator it;
255 
256  if (*escString == '#') {
257  return handleNumericEscapeString(buf, escString);
258  }
259 
260  if (passAllowedEscapeString(buf, escString)) {
261  return true;
262  }
263 
264  if (!escStringCaseSensitive) {
265  char *tmp = 0;
266  stdstr(&tmp, escString);
267  toupperstr(tmp);
268  it = p->escSubMap.find(tmp);
269  delete [] tmp;
270  } else
271  it = p->escSubMap.find(escString);
272 
273  if (it != p->escSubMap.end()) {
274  buf += it->second.c_str();
275  return true;
276  }
277  return false;
278 }
virtual bool handleNumericEscapeString(SWBuf &buf, const char *escString)
SWORD_NAMESPACE_START char * stdstr(char **ipstr, const char *istr, unsigned int memPadFactor=1)
Definition: utilstr.h:44
const char * c_str() const
Definition: swbuf.h:158
bool escStringCaseSensitive
Definition: swbasicfilter.h:74
bool passAllowedEscapeString(SWBuf &buf, const char *escString)
char * toupperstr(char *t, unsigned int max=0)
Definition: stringmgr.h:107
Private * p
Definition: swbasicfilter.h:82
bool SWBasicFilter::substituteToken ( SWBuf buf,
const char *  token 
)
protectedinherited

This function performs the substitution of tokens

Definition at line 196 of file swbasicfilter.cpp.

196  {
197  DualStringMap::iterator it;
198 
199  if (!tokenCaseSensitive) {
200  char *tmp = 0;
201  stdstr(&tmp, token);
202  toupperstr(tmp);
203  it = p->tokenSubMap.find(tmp);
204  delete [] tmp;
205  } else
206  it = p->tokenSubMap.find(token);
207 
208  if (it != p->tokenSubMap.end()) {
209  buf += it->second.c_str();
210  return true;
211  }
212  return false;
213 }
SWORD_NAMESPACE_START char * stdstr(char **ipstr, const char *istr, unsigned int memPadFactor=1)
Definition: utilstr.h:44
const char * c_str() const
Definition: swbuf.h:158
bool tokenCaseSensitive
Definition: swbasicfilter.h:75
DualStringMap tokenSubMap
char * toupperstr(char *t, unsigned int max=0)
Definition: stringmgr.h:107
Private * p
Definition: swbasicfilter.h:82

Member Data Documentation

const char SWBasicFilter::FINALIZE = 8
staticprotectedinherited

Definition at line 99 of file swbasicfilter.h.

SWBuf ThMLXHTML::imgPrefix
private

Definition at line 37 of file thmlxhtml.h.

const char SWBasicFilter::INITIALIZE = 1
staticprotectedinherited

Definition at line 96 of file swbasicfilter.h.

const char SWBasicFilter::POSTCHAR = 4
staticprotectedinherited

Definition at line 98 of file swbasicfilter.h.

const char SWBasicFilter::PRECHAR = 2
staticprotectedinherited

Definition at line 97 of file swbasicfilter.h.

bool ThMLXHTML::renderNoteNumbers
private

Definition at line 38 of file thmlxhtml.h.


The documentation for this class was generated from the following files: