The SWORD Project  1.9.0.svnversion
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
gbfstrongs.cpp
Go to the documentation of this file.
1 /******************************************************************************
2  *
3  * gbfstrongs.cpp - SWFilter descendant to hide or show Strong's number
4  * in a GBF module
5  *
6  * $Id: gbfstrongs.cpp 3511 2017-11-01 11:18:50Z scribe $
7  *
8  * Copyright 1999-2013 CrossWire Bible Society (http://www.crosswire.org)
9  * CrossWire Bible Society
10  * P. O. Box 2528
11  * Tempe, AZ 85280-2528
12  *
13  * This program is free software; you can redistribute it and/or modify it
14  * under the terms of the GNU General Public License as published by the
15  * Free Software Foundation version 2.
16  *
17  * This program is distributed in the hope that it will be useful, but
18  * WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20  * General Public License for more details.
21  *
22  */
23 
24 #include <stdlib.h>
25 #include <stdio.h>
26 #include <gbfstrongs.h>
27 #include <swmodule.h>
28 #include <ctype.h>
29 
30 
32 
33 namespace {
34 
35  static const char oName[] = "Strong's Numbers";
36  static const char oTip[] = "Toggles Strong's Numbers On and Off if they exist";
37 
38  static const StringList *oValues() {
39  static const SWBuf choices[3] = {"Off", "On", ""};
40  static const StringList oVals(&choices[0], &choices[2]);
41  return &oVals;
42  }
43 }
44 
45 
47 }
48 
49 
51 }
52 
53 
54 char GBFStrongs::processText(SWBuf &text, const SWKey *key, const SWModule *module) {
55  char token[2048]; // cheese. Fix.
56  int tokpos = 0;
57  bool intoken = false;
58  bool lastspace = false;
59  int word = 1;
60  char val[128];
61  char wordstr[11];
62  char *valto;
63  unsigned int textStart = 0, textEnd = 0;
64  bool newText = false;
65  SWBuf tmp;
66  const char *from;
67 
68  SWBuf orig = text;
69  from = orig.c_str();
70 
71  for (text = ""; *from; from++) {
72  if (*from == '<') {
73  intoken = true;
74  tokpos = 0;
75  token[0] = 0;
76  token[1] = 0;
77  token[2] = 0;
78  textEnd = (unsigned int)text.size();
79  continue;
80  }
81  if (*from == '>') { // process tokens
82  intoken = false;
83  if (*token == 'W' && (token[1] == 'G' || token[1] == 'H')) { // Strongs
84  if (module->isProcessEntryAttributes()) {
85  valto = val;
86  for (unsigned int i = 1; ((token[i]) && (i < 150)); i++)
87  *valto++ = token[i];
88  *valto = 0;
89  if (atoi((!isdigit(*val))?val+1:val) < 5627) {
90  // normal strongs number
91  sprintf(wordstr, "%03d", word++);
92  module->getEntryAttributes()["Word"][wordstr]["PartsCount"] = "1";
93  module->getEntryAttributes()["Word"][wordstr]["Lemma"] = val;
94  module->getEntryAttributes()["Word"][wordstr]["LemmaClass"] = "strong";
95  tmp = "";
96  tmp.append(text.c_str()+textStart, (int)(textEnd - textStart));
97  module->getEntryAttributes()["Word"][wordstr]["Text"] = tmp;
98  newText = true;
99  }
100  else {
101  // verb morph
102  sprintf(wordstr, "%03d", word-1);
103  module->getEntryAttributes()["Word"][wordstr]["Morph"] = val;
104  module->getEntryAttributes()["Word"][wordstr]["MorphClass"] = "OLBMorph";
105  }
106  }
107 
108  if (!option) {
109  if ((from[1] == ' ') || (from[1] == ',') || (from[1] == ';') || (from[1] == '.') || (from[1] == '?') || (from[1] == '!') || (from[1] == ')') || (from[1] == '\'') || (from[1] == '\"')) {
110  if (lastspace)
111  text--;
112  }
113  if (newText) {textStart = (unsigned int)text.size(); newText = false; }
114  continue;
115  }
116  }
117  if (module->isProcessEntryAttributes()) {
118  if ((*token == 'W') && (token[1] == 'T')) { // Morph
119  valto = val;
120  for (unsigned int i = 2; ((token[i]) && (i < 150)); i++)
121  *valto++ = token[i];
122  *valto = 0;
123  sprintf(wordstr, "%03d", word-1);
124  module->getEntryAttributes()["Word"][wordstr]["MorphClass"] = "GBFMorph";
125  module->getEntryAttributes()["Word"][wordstr]["Morph"] = val;
126  newText = true;
127  }
128  }
129  // if not a strongs token, keep token in text
130  text += '<';
131  text += token;
132  text += '>';
133  if (newText) {textStart = (unsigned int)text.size(); newText = false; }
134  continue;
135  }
136  if (intoken) {
137  if (tokpos < 2045) {
138  token[tokpos++] = *from;
139  // TODO: why is this + 2 ?
140  token[tokpos+2] = 0;
141  }
142  }
143  else {
144  text += *from;
145  lastspace = (*from == ' ');
146  }
147  }
148  return 0;
149 }
150 
#define SWORD_NAMESPACE_START
Definition: defs.h:39
Definition: swbuf.h:47
virtual ~GBFStrongs()
Definition: gbfstrongs.cpp:50
SWText * module
Definition: osis2mod.cpp:105
virtual char processText(SWBuf &text, const SWKey *key=0, const SWModule *module=0)
Definition: gbfstrongs.cpp:54
static const StringList * oValues()
const char * c_str() const
Definition: swbuf.h:158
std::list< SWBuf > StringList
Definition: swmodule.cpp:91
SWBuf & append(const char *str, long max=-1)
Definition: swbuf.h:274
static const char oName[]
unsigned long size() const
Definition: swbuf.h:185
virtual bool isProcessEntryAttributes() const
Definition: swmodule.h:832
virtual AttributeTypeList & getEntryAttributes() const
Definition: swmodule.h:817
static const char * choices[4]
static const char oTip[]
#define SWORD_NAMESPACE_END
Definition: defs.h:40
Definition: swkey.h:77