00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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;
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
00063 switch (*token) {
00064 case 'W':
00065 switch(token[1])
00066 {
00067 case 'G':
00068 case 'H':
00069 case 'T':
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':
00132 *to++ = '<';
00133 *to++ = 'i';
00134 *to++ = '>';
00135 hasFootnotePreTag = true;
00136 continue;
00137 case 'F':
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':
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':
00203 switch(token[1])
00204 {
00205 case 'I':
00206 *to++ = '<';
00207 *to++ = 'i';
00208 *to++ = '>';
00209 continue;
00210 case 'i':
00211 *to++ = '<';
00212 *to++ = '/';
00213 *to++ = 'i';
00214 *to++ = '>';
00215 continue;
00216 case 'B':
00217 *to++ = '<';
00218 *to++ = 'b';
00219 *to++ = '>';
00220 continue;
00221 case 'b':
00222 *to++ = '<';
00223 *to++ = '/';
00224 *to++ = 'b';
00225 *to++ = '>';
00226 continue;
00227 case 'R':
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':
00250 *to++ = '<';
00251 *to++ = '/';
00252 *to++ = 'f';
00253 *to++ = 'o';
00254 *to++ = 'n';
00255 *to++ = 't';
00256 *to++ = '>';
00257 continue;
00258 case 'U':
00259 *to++ = '<';
00260 *to++ = 'u';
00261 *to++ = '>';
00262 continue;
00263 case 'u':
00264 *to++ = '<';
00265 *to++ = '/';
00266 *to++ = 'u';
00267 *to++ = '>';
00268 continue;
00269 case 'O':
00270 *to++ = '<';
00271 *to++ = 'c';
00272 *to++ = 'i';
00273 *to++ = 't';
00274 *to++ = 'e';
00275 *to++ = '>';
00276 continue;
00277 case 'o':
00278 *to++ = '<';
00279 *to++ = '/';
00280 *to++ = 'c';
00281 *to++ = 'i';
00282 *to++ = 't';
00283 *to++ = 'e';
00284 *to++ = '>';
00285 continue;
00286 case 'S':
00287 *to++ = '<';
00288 *to++ = 's';
00289 *to++ = 'u';
00290 *to++ = 'p';
00291 *to++ = '>';
00292 continue;
00293 case 's':
00294 *to++ = '<';
00295 *to++ = '/';
00296 *to++ = 's';
00297 *to++ = 'u';
00298 *to++ = 'p';
00299 *to++ = '>';
00300 continue;
00301 case 'V':
00302 *to++ = '<';
00303 *to++ = 's';
00304 *to++ = 'u';
00305 *to++ = 'b';
00306 *to++ = '>';
00307 continue;
00308 case 'v':
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':
00346 switch(token[1])
00347 {
00348 case 'A':
00349 *to++ = (char)atoi(&token[2]);
00350 continue;
00351 case 'G':
00352
00353 continue;
00354 case 'L':
00355 *to++ = '<';
00356 *to++ = 'b';
00357 *to++ = 'r';
00358 *to++ = ' ';
00359 *to++ = '/';
00360 *to++ = '>';
00361 *to++ = ' ';
00362 continue;
00363 case 'M':
00364 *to++ = '<';
00365 *to++ = 'b';
00366 *to++ = 'r';
00367 *to++ = ' ';
00368 *to++ = '/';
00369 *to++ = '>';
00370 continue;
00371 case 'T':
00372
00373 continue;
00374 }
00375 break;
00376 case 'J':
00377 switch(token[1])
00378 {
00379 case 'R':
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':
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':
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':
00452 switch(token[1])
00453 {
00454 case 'T':
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
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496 }
00497 break;
00498
00499 case 'P':
00500 switch(token[1])
00501 {
00502 case 'P':
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 }