Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members  

gbfrtf.cpp

00001 /******************************************************************************
00002  *
00003  * gbfrtf -     SWFilter decendant to convert all GBF tags to RTF tags
00004  */
00005 
00006 
00007 #include <stdlib.h>
00008 #include <string.h>
00009 #include <gbfrtf.h>
00010 #include <ctype.h>
00011 
00012 GBFRTF::GBFRTF() {
00013 }
00014 
00015 
00016 char GBFRTF::ProcessText(char *text, int maxlen, const SWKey *key, const SWModule *module)
00017 {
00018         unsigned char *to, *from;
00019         char token[2048];
00020         int tokpos = 0;
00021         bool intoken = false;
00022         int len;
00023         const char *tok;
00024 
00025         len = strlen(text) + 1;                                         // shift string to right of buffer
00026         if (len < maxlen) {
00027                 memmove(&text[maxlen - len], text, len);
00028                 from = (unsigned char *)&text[maxlen - len];
00029         }
00030         else    from = (unsigned char *)text;                                                   // -------------------------------
00031         for (to = (unsigned char *)text; *from; from++) {
00032                 if (*from == '<') {
00033                         intoken = true;
00034                         tokpos = 0;
00035                         token[0] = 0;
00036                         token[1] = 0;
00037                         token[2] = 0;
00038                         continue;
00039                 }
00040                 if (*from == '>') {
00041                         intoken = false;
00042                                                 // process desired tokens
00043                         switch (*token) {
00044                         case 'W':       // Strongs
00045                                 switch(token[1]) {
00046                                 case 'G':               // Greek
00047                                 case 'H':               // Hebrew
00048                                         *to++ = '{';
00049                                         *to++ = '\\';
00050                                         *to++ = 'f';
00051                                         *to++ = 's';
00052                                         *to++ = '1';
00053                                         *to++ = '7';
00054                                         *to++ = ' ';
00055                                         *to++ = '<';
00056                                         for (tok = token + 2; *tok; tok++)
00057                                                 *to++ = *tok;
00058                                         *to++ = '>';
00059                                         *to++ = '}';
00060                                         continue;
00061 
00062                                 case 'T':               // Tense
00063                                         *to++ = '{';
00064                                         *to++ = '\\';
00065                                         *to++ = 'f';
00066                                         *to++ = 's';
00067                                         *to++ = '1';
00068                                         *to++ = '7';
00069                                         *to++ = ' ';
00070                                         *to++ = '(';
00071                                         bool separate = false;
00072                                         for (tok = token + 2; *tok; tok++) {
00073                                                 if (separate) {
00074                                                         *to++ = ';';
00075                                                         *to++ = ' ';
00076                                                         separate = false;
00077                                                 }
00078                                                 switch (*tok) {
00079                                                 case 'G':
00080                                                 case 'H':
00081                                                         for (tok++; *tok; tok++) {
00082                                                                 if (isdigit(*tok)) {
00083                                                                         *to++ = *tok;
00084                                                                         separate = true;
00085                                                                 }
00086                                                                 else {
00087                                                                         tok--;
00088                                                                         break;
00089                                                                 }
00090                                                         }
00091                                                         break;
00092                                                 default:
00093                                                         for (; *tok; tok++) {
00094                                                                *to++ = *tok;
00095                                                         }
00096                                                 }
00097                                         }
00098                                         *to++ = ')';
00099                                         *to++ = '}';
00100                                         continue;
00101                                 }
00102                                 break;
00103                         case 'R':
00104                                 switch(token[1]) {
00105                                 case 'X':
00106                                   *to++ = '<';
00107                                   *to++ = 'a';
00108                                   *to++ = ' ';
00109                                   *to++ = 'h';
00110                                   *to++ = 'r';
00111                                   *to++ = 'e';
00112                                   *to++ = 'f';
00113                                   *to++ = '=';
00114                                   *to++ = '"';
00115                                   *to++ = '"';
00116                                   *to++ = '>';
00117                                   continue;
00118                                 case 'x':
00119                                   *to++ = '<';
00120                                   *to++ = '/';
00121                                   *to++ = 'a';
00122                                   *to++ = '>';
00123                                   continue;
00124                                 case 'F':               // footnote begin
00125                                         *to++ = '{';
00126                                         *to++ = '\\';
00127                                         *to++ = 'i';
00128                                         *to++ = '1';
00129                                         *to++ = ' ';
00130                                         *to++ = '\\';
00131                                         *to++ = 'f';
00132                                         *to++ = 's';
00133                                         *to++ = '1';
00134                                         *to++ = '7';
00135                                         *to++ = ' ';
00136                                         *to++ = '(';
00137                                         continue;
00138                                 case 'f':               // footnote end
00139                                         *to++ = ')';
00140                                         *to++ = ' ';
00141                                         *to++ = '}';
00142                                         continue;
00143                                 }
00144                                 break;
00145                         case 'F':                       // font tags
00146                                 switch(token[1]) {
00147                                 case 'I':               // italic start
00148                                         *to++ = '\\';
00149                                         *to++ = 'i';
00150                                         *to++ = '1';
00151                                         *to++ = ' ';
00152                                         continue;
00153                                 case 'i':               // italic end
00154                                         *to++ = '\\';
00155                                         *to++ = 'i';
00156                                         *to++ = '0';
00157                                         *to++ = ' ';
00158                                         continue;
00159                                 case 'B':               // bold start
00160                                         *to++ = '\\';
00161                                         *to++ = 'b';
00162                                         *to++ = '1';
00163                                         *to++ = ' ';
00164                                         continue;
00165                                 case 'b':               // bold end
00166                                         *to++ = '\\';
00167                                         *to++ = 'b';
00168                                         *to++ = '0';
00169                                         *to++ = ' ';
00170                                         continue;
00171                                 case 'N':
00172                                         *to++ = '{';
00173                                         if (!strnicmp(token+2, "Symbol", 6)) {
00174                                           *to++ = '\\';
00175                                           *to++ = 'f';
00176                                           *to++ = '7';
00177                                           *to++ = ' ';
00178                                         }
00179                                         continue;
00180                                 case 'n':
00181                                         *to++ = '}';
00182                                         continue;
00183                                 case 'S':
00184                                         *to++ = '{';
00185                                         *to++ = '\\';
00186                                         *to++ = 's';
00187                                         *to++ = 'u';
00188                                         *to++ = 'p';
00189                                         *to++ = 'e';
00190                                         *to++ = 'r';
00191                                         *to++ = ' ';
00192                                         continue;
00193                                 case 's':
00194                                         *to++ = '}';
00195                                         continue;
00196                                 case 'R':
00197                                         *to++ = '{';
00198                                         *to++ = '\\';
00199                                         *to++ = 'c';
00200                                         *to++ = 'f';
00201                                         *to++ = '6';
00202                                         *to++ = ' ';
00203                                         continue;
00204                                 case 'r':
00205                                         *to++ = '}';
00206                                         continue;
00207                                 }
00208                                 break;
00209                         case 'C':                       // special character tags
00210                                 switch(token[1]) {
00211                                 case 'A':               // ASCII value
00212                                         *to++ = (char)atoi(&token[2]);
00213                                         continue;
00214                                 case 'G':
00215                                         *to++ = '>';
00216                                         continue;
00217                                 case 'L':               // line break
00218                                         *to++ = '\\';
00219                                         *to++ = 'l';
00220                                         *to++ = 'i';
00221                                         *to++ = 'n';
00222                                         *to++ = 'e';
00223                                         *to++ = ' ';
00224                                         continue;
00225                                 case 'M':               // new paragraph
00226                                         *to++ = '\\';
00227                                         *to++ = 'p';
00228                                         *to++ = 'a';
00229                                         *to++ = 'r';
00230                                         *to++ = ' ';
00231                                         continue;
00232                                 case 'T':
00233                                         *to++ = '<';
00234                                 }
00235                                 break;
00236                         case 'T':                       // title formatting
00237                           switch(token[1])
00238                             {
00239                             case 'T':               // Book title begin
00240                               *to++ = '{';
00241                               *to++ = '\\';
00242                               *to++ = 'f';
00243                               *to++ = 's';
00244                               *to++ = '2';
00245                               *to++ = '2';
00246                               *to++ = ' ';
00247                               continue;
00248                             case 't':
00249                               *to++ = '}';
00250                               continue;
00251                             case 'S':
00252                               *to++ = '\\';
00253                               *to++ = 'p';
00254                               *to++ = 'a';
00255                               *to++ = 'r';
00256                               *to++ = ' ';
00257                               *to++ = '{';
00258                               *to++ = '\\';
00259                               *to++ = 'i';
00260                               *to++ = '1';
00261                               *to++ = '\\';
00262                               *to++ = 'b';
00263                               *to++ = '1';
00264                               *to++ = ' ';
00265                               continue;
00266                             case 's':
00267                               *to++ = '}';
00268                               *to++ = '\\';
00269                               *to++ = 'p';
00270                               *to++ = 'a';
00271                               *to++ = 'r';
00272                               *to++ = ' ';
00273                               continue;
00274                             }
00275                           break;
00276 
00277                         }
00278                         continue;
00279                 }
00280                 if (intoken) {
00281                         if (tokpos < 2045)
00282                                 token[tokpos++] = *from;
00283                                 token[tokpos+2] = 0;
00284                 }
00285                 else    *to++ = *from;
00286         }
00287         *to++ = 0;
00288         *to = 0;
00289         return 0;
00290 }

Generated on Thu Jun 20 22:12:59 2002 for The Sword Project by doxygen1.2.15