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

gbfhtml.cpp

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

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