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 }
1.2.15