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

gbfthml.cpp

00001 /***************************************************************************
00002                      gbfthml.cpp  -  GBF to ThML filter
00003                              -------------------
00004     begin                : 1999-10-27
00005     copyright            : 2001 by CrossWire Bible Society
00006  ***************************************************************************/
00007 
00008 /***************************************************************************
00009  *                                                                         *
00010  *   This program is free software; you can redistribute it and/or modify  *
00011  *   it under the terms of the GNU General Public License as published by  *
00012  *   the Free Software Foundation; either version 2 of the License, or     *
00013  *   (at your option) any later version.                                   *
00014  *                                                                         *
00015  ***************************************************************************/
00016 
00017 #include <stdlib.h>
00018 #include <string.h>
00019 #include <gbfthml.h>
00020 
00021 
00022 GBFThML::GBFThML()
00023 {
00024 }
00025 
00026 
00027 char GBFThML::ProcessText(char *text, int maxlen)
00028 {
00029         char *to, *from, token[2048];
00030         int tokpos = 0;
00031         bool intoken    = false;
00032         int len;
00033         const char *tok;
00034 
00035         len = strlen(text) + 1;                                         // shift string to right of buffer
00036         if (len < maxlen) {
00037                 memmove(&text[maxlen - len], text, len);
00038                 from = &text[maxlen - len];
00039         }
00040         else    from = text;                                                    // -------------------------------
00041 
00042         for (to = text; *from; from++)
00043         {
00044                 if (*from == '<') {
00045                         intoken = true;
00046                         tokpos = 0;
00047                         token[0] = 0;
00048                         token[1] = 0;
00049                         token[2] = 0;
00050                         continue;
00051                 }
00052                 if (*from == '>')
00053                 {
00054                         intoken = false;
00055                         // process desired tokens
00056                         switch (*token) {
00057                         case 'W':       // Strongs
00058                           switch(token[1]) {
00059                           case 'G':
00060                           case 'H':                         
00061                             *to++ = '<';
00062                             *to++ = 's';
00063                             *to++ = 'y';
00064                             *to++ = 'n';
00065                             *to++ = 'c';
00066                             *to++ = ' ';
00067                             *to++ = 't';
00068                             *to++ = 'y';
00069                             *to++ = 'p';
00070                             *to++ = 'e';
00071                             *to++ = '=';
00072                             *to++ = '"';
00073                             *to++ = 'S';
00074                             *to++ = 't';
00075                             *to++ = 'r';
00076                             *to++ = 'o';
00077                             *to++ = 'n';
00078                             *to++ = 'g';
00079                             *to++ = 's';
00080                             *to++ = '"';
00081                             *to++ = ' ';
00082                             *to++ = 'v';
00083                             *to++ = 'a';
00084                             *to++ = 'l';
00085                             *to++ = 'u';
00086                             *to++ = 'e';
00087                             *to++ = '=';
00088                             *to++ = '"';
00089                             for (tok = token + 1; *tok; tok++)
00090                               *to++ = *tok;
00091                             *to++ = '"';
00092                             *to++ = ' ';
00093                             *to++ = '/';
00094                             *to++ = '>';
00095                             continue;
00096                             
00097                           case 'T':               // Tense
00098                             *to++ = '<';
00099                             *to++ = 's';
00100                             *to++ = 'y';
00101                             *to++ = 'n';
00102                             *to++ = 'c';
00103                             *to++ = ' ';
00104                             *to++ = 't';
00105                             *to++ = 'y';
00106                             *to++ = 'p';
00107                             *to++ = 'e';
00108                             *to++ = '=';
00109                             *to++ = '"';
00110                             *to++ = 'M';
00111                             *to++ = 'o';
00112                             *to++ = 'r';
00113                             *to++ = 'p';
00114                             *to++ = 'h';
00115                             *to++ = '"';
00116                             *to++ = ' ';
00117                             *to++ = 'v';
00118                             *to++ = 'a';
00119                             *to++ = 'l';
00120                             *to++ = 'u';
00121                             *to++ = 'e';
00122                             *to++ = '=';
00123                             *to++ = '"';
00124                             for (tok = token + 2; *tok; tok++)
00125                               *to++ = *tok;
00126                             *to++ = '"';
00127                             *to++ = ' ';
00128                             *to++ = '/';
00129                             *to++ = '>';
00130                             continue;
00131                                 }
00132                           break;
00133                         case 'R':
00134                           switch(token[1])
00135                             {
00136                             case 'X':
00137                               *to++ = '<';
00138                               *to++ = 'a';
00139                               *to++ = ' ';
00140                               *to++ = 'h';
00141                               *to++ = 'r';
00142                               *to++ = 'e';
00143                               *to++ = 'f';
00144                               *to++ = '=';
00145                               *to++ = '\"';
00146                               for (tok = token + 3; *tok; tok++) {
00147                                 if(*tok != '<' && *tok+1 != 'R' && *tok+2 != 'x') {
00148                                   *to++ = *tok;
00149                                 }
00150                                 else {
00151                                   break;
00152                                 }
00153                               }
00154                               *to++ = '\"';
00155                               *to++ = '>';
00156                               continue;
00157                             case 'x':
00158                               *to++ = '<';
00159                               *to++ = '/';
00160                               *to++ = 'a';
00161                               *to++ = '>';
00162                               continue;
00163                             case 'F':               // footnote begin
00164                               *to++ = '<';
00165                               *to++ = 'n';
00166                               *to++ = 'o';
00167                               *to++ = 't';
00168                               *to++ = 'e';
00169                               *to++ = ' ';
00170                               *to++ = 'p';
00171                               *to++ = 'l';
00172                               *to++ = 'a';
00173                               *to++ = 'c';
00174                               *to++ = 'e';
00175                               *to++ = '=';
00176                               *to++ = '"';
00177                               *to++ = 'f';
00178                               *to++ = 'o';
00179                               *to++ = 'o';
00180                               *to++ = 't';
00181                               *to++ = '"';
00182                               *to++ = '>';
00183                               continue;
00184                             case 'f':               // footnote end
00185                               *to++ = '<';
00186                               *to++ = '/';
00187                               *to++ = 'n';
00188                               *to++ = 'o';
00189                               *to++ = 't';
00190                               *to++ = 'e';
00191                               *to++ = '>';
00192                               continue;
00193                             }
00194                           break;
00195                         case 'F':                       // font tags
00196                           switch(token[1])
00197                             {
00198                             case 'N':
00199                               *to++ = '<';
00200                               *to++ = 'f';
00201                               *to++ = 'o';
00202                               *to++ = 'n';
00203                               *to++ = 't';
00204                               *to++ = ' ';
00205                               *to++ = 'f';
00206                               *to++ = 'a';
00207                               *to++ = 'c';
00208                               *to++ = 'e';
00209                               *to++ = '=';
00210                               *to++ = '"';              
00211                               for (tok = token + 2; *tok; tok++)
00212                                 *to++ = *tok;
00213                               *to++ = '"';
00214                               *to++ = '>';
00215                               continue;
00216                             case 'n':
00217                               *to++ = '<';
00218                               *to++ = '/';
00219                               *to++ = 'f';
00220                               *to++ = 'o';
00221                               *to++ = 'n';
00222                               *to++ = 't';
00223                               *to++ = '>';
00224                               continue;
00225                             case 'I':           // italic start
00226                               *to++ = '<';
00227                               *to++ = 'i';
00228                               *to++ = '>';
00229                               continue;
00230                             case 'i':           // italic end
00231                               *to++ = '<';
00232                               *to++ = '/';
00233                               *to++ = 'i';
00234                               *to++ = '>';
00235                               continue;
00236                             case 'B':           // bold start
00237                               *to++ = '<';
00238                               *to++ = 'b';
00239                               *to++ = '>';
00240                               continue;
00241                             case 'b':           // bold end
00242                               *to++ = '<';
00243                               *to++ = '/';
00244                               *to++ = 'b';
00245                               *to++ = '>';
00246                               continue;
00247 
00248                             case 'R':           // words of Jesus begin
00249                               *to++ = '<';
00250                               *to++ = 'f';
00251                               *to++ = 'o';
00252                               *to++ = 'n';
00253                               *to++ = 't';
00254                               *to++ = ' ';
00255                               *to++ = 'c';
00256                               *to++ = 'o';
00257                               *to++ = 'l';
00258                               *to++ = 'o';
00259                               *to++ = 'r';
00260                               *to++ = '=';
00261                               *to++ = '\"';
00262                               *to++ = '#';
00263                               *to++ = 'f';
00264                               *to++ = 'f';
00265                               *to++ = '0';
00266                               *to++ = '0';
00267                               *to++ = '0';
00268                               *to++ = '0';
00269                               *to++ = '\"';
00270                               *to++ = '>';
00271                               continue;
00272                             case 'r':           // words of Jesus end
00273                               *to++ = '<';
00274                               *to++ = '/';
00275                               *to++ = 'f';
00276                               *to++ = 'o';
00277                               *to++ = 'n';
00278                               *to++ = 't';
00279                               *to++ = '>';
00280                               continue;
00281                             case 'U':           // Underline start
00282                               *to++ = '<';
00283                               *to++ = 'u';
00284                               *to++ = '>';
00285                               continue;
00286                             case 'u':           // Underline end
00287                               *to++ = '<';
00288                               *to++ = '/';
00289                               *to++ = 'u';
00290                               *to++ = '>';
00291                               continue;
00292                             case 'O':           // Old Testament quote begin
00293                               *to++ = '<';
00294                               *to++ = 'c';
00295                               *to++ = 'i';
00296                               *to++ = 't';
00297                               *to++ = 'e';
00298                               *to++ = '>';
00299                               continue;
00300                             case 'o':           // Old Testament quote end
00301                               *to++ = '<';
00302                               *to++ = '/';
00303                               *to++ = 'c';
00304                               *to++ = 'i';
00305                               *to++ = 't';
00306                               *to++ = 'e';
00307                               *to++ = '>';
00308                               continue;
00309                             case 'S':           // Superscript begin
00310                               *to++ = '<';
00311                               *to++ = 's';
00312                               *to++ = 'u';
00313                               *to++ = 'p';
00314                               *to++ = '>';
00315                               continue;
00316                             case 's':           // Superscript end
00317                               *to++ = '<';
00318                               *to++ = '/';
00319                               *to++ = 's';
00320                               *to++ = 'u';
00321                               *to++ = 'p';
00322                               *to++ = '>';
00323                               continue;
00324                             case 'V':           // Subscript begin
00325                               *to++ = '<';
00326                               *to++ = 's';
00327                               *to++ = 'u';
00328                               *to++ = 'b';
00329                               *to++ = '>';
00330                               continue;
00331                             case 'v':           // Subscript end
00332                               *to++ = '<';
00333                               *to++ = '/';
00334                               *to++ = 's';
00335                               *to++ = 'u';
00336                               *to++ = 'b';
00337                               *to++ = '>';
00338                               continue;
00339                             }
00340                           break;
00341                         case 'C':                       // special character tags
00342                           switch(token[1])
00343                                 {
00344                                 case 'A':               // ASCII value
00345                                   *to++ = (char)atoi(&token[2]);
00346                                   continue;
00347                                 case 'G':
00348                                   //*to++ = ' ';
00349                                   continue;
00350                                 case 'L':               // line break
00351                                   *to++ = '<';
00352                                   *to++ = 'b';
00353                                   *to++ = 'r';
00354                                   *to++ = ' ';
00355                                   *to++ = '/';
00356                                   *to++ = '>';
00357                                   *to++ = ' ';
00358                                   continue;
00359                                 case 'M':               // new paragraph
00360                                   *to++ = '<';
00361                                   *to++ = 'p';
00362                                   *to++ = ' ';
00363                                   *to++ = '/';
00364                                   *to++ = '>';
00365                                   continue;
00366                                 case 'T':
00367                                   //*to++ = ' ';
00368                                   continue;
00369                                 }
00370                           break;
00371                         case 'T':                       // title formatting
00372                           switch(token[1])
00373                             {
00374                             case 'T':               // Book title begin
00375                               *to++ = '<';
00376                               *to++ = 'b';
00377                               *to++ = 'i';
00378                               *to++ = 'g';
00379                               *to++ = '>';
00380                               continue;
00381                             case 't':
00382                               *to++ = '<';
00383                               *to++ = '/';
00384                               *to++ = 'b';
00385                               *to++ = 'i';
00386                               *to++ = 'g';
00387                               *to++ = '>';
00388                               continue;
00389                             case 'S':
00390                               *to++ = '<';
00391                               *to++ = 'd';
00392                               *to++ = 'i';
00393                               *to++ = 'v';
00394                               *to++ = ' ';
00395                               *to++ = 'c';
00396                               *to++ = 'l';
00397                               *to++ = 'a';
00398                               *to++ = 's';
00399                               *to++ = 's';
00400                               *to++ = '=';
00401                               *to++ = '\"';
00402                               *to++ = 's';
00403                               *to++ = 'e';
00404                               *to++ = 'c';
00405                               *to++ = 'h';
00406                               *to++ = 'e';
00407                               *to++ = 'a';
00408                               *to++ = 'd';
00409                               *to++ = '\"';
00410                               *to++ = '>';
00411                               continue;
00412                             case 's':
00413                               *to++ = '<';
00414                               *to++ = '/';
00415                               *to++ = 'd';
00416                               *to++ = 'i';
00417                               *to++ = 'v';
00418                               *to++ = '>';
00419                               continue;
00420                             }
00421                           break;
00422 
00423                         case 'P':                       // special formatting
00424                           switch(token[1])
00425                             {
00426                             case 'P':               // Poetry begin
00427                               *to++ = '<';
00428                               *to++ = 'v';
00429                               *to++ = 'e';
00430                               *to++ = 'r';
00431                               *to++ = 's';
00432                               *to++ = 'e';
00433                               *to++ = '>';
00434                               continue;
00435                             case 'p':
00436                               *to++ = '<';
00437                               *to++ = '/';
00438                               *to++ = 'v';
00439                               *to++ = 'e';
00440                               *to++ = 'r';
00441                               *to++ = 's';
00442                               *to++ = 'e';
00443                               *to++ = '>';
00444                               continue;
00445                             }
00446                           break;
00447                         }
00448                         continue;
00449                 }
00450                 if (intoken) {
00451                         if (tokpos < 2045)
00452                                 token[tokpos++] = *from;
00453                                 token[tokpos+2] = 0;
00454                 }
00455                 else    *to++ = *from;
00456         }
00457         *to++ = 0;
00458         *to = 0;
00459         return 0;
00460 }
00461 
00462 
00463 

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