00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <kdebug.h>
00027 #include <qregexp.h>
00028
00029 #include "textzone.h"
00030 #include "para.h"
00031
00032 #define CSTART 0x00C0
00033
00034
00035
00036
00037 TextZone::TextZone(Para *para)
00038 {
00039 setPara(para);
00040 if(para != NULL)
00041 {
00042 setSize(para->getSize());
00043 setWeight(para->getWeight());
00044 setItalic(para->isItalic());
00045 setUnderlined(para->getUnderlineType());
00046 setStrikeout(para->isStrikeout());
00047 }
00048 }
00049
00050
00051
00052
00053 TextZone::TextZone(QString texte, Para *para): _texte(texte)
00054 {
00055 setPara(para);
00056 if(para != NULL)
00057 {
00058 setSize(para->getSize());
00059 setWeight(para->getWeight());
00060 setItalic(para->isItalic());
00061 setUnderlined(para->getUnderlineType());
00062 setStrikeout(para->isStrikeout());
00063 }
00064 }
00065
00066
00067
00068
00069 TextZone::~TextZone()
00070 {
00071 kdDebug(30522) << "Destruction of a area" << endl;
00072 }
00073
00074
00075
00076
00077
00078
00079
00080 bool TextZone::useFormat() const
00081 {
00082 return !getPara()->isChapter();
00083 }
00084
00085
00086
00087
00088
00089
00090
00091 QString TextZone::escapeLatin1(QString text)
00092 {
00093 static const char *escapes[64] =
00094 {
00095 "\\`{A}", "\\'{A}", "\\^{A}", "\\~{A}",
00096 "\\\"{A}", "\\AA", "\\AE", "\\c{C}",
00097 "\\`{E}", "\\'{E}", "\\^{E}", "\\\"{E}",
00098 "\\`{I}", "\\'{I}", "\\^{I}", "\\\"{I}",
00099
00100 "\\DH{}", "\\~{N}", "\\`{O}", "\\'{O}",
00101 "\\^{O}", "\\~{O}", "\\\"{O}", "\\texttimes{}",
00102 "\\O{}", "\\`{U}", "\\'{U}", "\\^{U}",
00103 "\\\"{U}", "\\'{Y}", "\\TH{}", "\\ss{}",
00104
00105 "\\`{a}", "\\'{a}", "\\^{a}", "\\~{a}",
00106 "\\\"{a}", "\\aa", "\\ae{}", "\\c{c}",
00107 "\\`{e}", "\\'{e}", "\\^{e}", "\\\"{e}",
00108 "\\`{\\i}", "\\'{\\i}", "\\^{\\i}", "\\\"{\\i}",
00109
00110 "\\dh{}", "\\~{n}", "\\`{o}", "\\'{o}",
00111 "\\^{o}", "\\~{o}", "\\\"{o}", "\\textdiv{}",
00112 "\\o{}", "\\`{u}", "\\'{u}", "\\^{u}",
00113 "\\\"{u}", "\\'{y}", "\\th{}", "\\\"{y}"
00114 };
00115
00116 QString escapedText;
00117 int unicode;
00118
00119 escapedText = text;
00120
00121
00122
00123
00124
00125
00126
00127 convert(escapedText, 0X005C, "\\textbackslash{}");
00128
00129
00130 convert(escapedText, 0X0023, "\\#{}");
00131 convert(escapedText, 0X0024, "\\${}");
00132 convert(escapedText, 0X0025, "\\%{}");
00133 convert(escapedText, 0X0026, "\\&{}");
00134
00135
00136
00137 convert(escapedText, 0X003C, "\\textless{}");
00138 convert(escapedText, 0X003E, "\\textgreater{} ");
00139
00140 convert(escapedText, 0X005E, "\\^{}");
00141 convert(escapedText, 0X005F, "\\_{}");
00142
00143 convert(escapedText, 0X007B, "\\{");
00144 convert(escapedText, 0X007C, "\\textbar{}");
00145 convert(escapedText, 0X007D, "\\}");
00146 convert(escapedText, 0X007E, "\\textasciitilde{}");
00147
00148 convert(escapedText, 0X00A1, "!`{}");
00149 convert(escapedText, 0X00A2, "\\textcent{}");
00150 convert(escapedText, 0X00A3, "\\pounds{}");
00151 convert(escapedText, 0X00A4, "\\textcurrency{}");
00152 convert(escapedText, 0X00A5, "\\textyen{}");
00153 convert(escapedText, 0X00A6, "\\textbrokenbar{}");
00154 convert(escapedText, 0X00A7, "\\S{}");
00155 convert(escapedText, 0X00A8, "\\textasciidieresis{}");
00156 convert(escapedText, 0X00A9, "\\copyright{}");
00157 convert(escapedText, 0X00AA, "\\textordfeminine{}");
00158 convert(escapedText, 0X00AB, "\\guillemotleft{}");
00159 convert(escapedText, 0X00AC, "\\textlnot{}");
00160
00161 convert(escapedText, 0X00AE, "\\textregistered{}");
00162 convert(escapedText, 0X00AF, "\\textmacron{}");
00163 convert(escapedText, 0X00B0, "\\textdegree{}");
00164 convert(escapedText, 0X00B1, "\\textpm{}");
00165 convert(escapedText, 0X00B2, "\\texttwosuperior{}");
00166 convert(escapedText, 0X00B3, "\\textthreesuperior{}");
00167 convert(escapedText, 0X00B4, "' ");
00168 convert(escapedText, 0X00B5, "\\textmu{}");
00169 convert(escapedText, 0X00B6, "\\P{}");
00170 convert(escapedText, 0X00B7, "\\textperiodcentered{}");
00171
00172 convert(escapedText, 0X00B9, "\\textonesuperior{}");
00173 convert(escapedText, 0X00BA, "\\textordmasculine{}");
00174 convert(escapedText, 0X00BB, "\\guillemotright{}");
00175 convert(escapedText, 0X00BC, "\\textonequarter{}");
00176 convert(escapedText, 0X00BD, "\\textonehalf{}");
00177 convert(escapedText, 0X00BE, "\\textthreequarters{}");
00178 convert(escapedText, 0X00BF, "?`{}");
00179
00180
00181
00182
00183
00184
00185
00186 for(int index = 0; index < 64; index++)
00187 {
00188 unicode = CSTART + index;
00189 convert(escapedText, unicode, escapes[index]);
00190 }
00191
00192 convert(escapedText, 0X2020, "\\textdied{}");
00193 convert(escapedText, 0X2021, "\\textdaggerdbl{}");
00194 convert(escapedText, 0X2022, "'' ");
00195 convert(escapedText, 0X2023, "\\textdaggerdbl{}");
00196 convert(escapedText, 0X2024, "\\textdaggerdbl{}");
00197 convert(escapedText, 0X2025, "\\textdaggerdbl{}");
00198 convert(escapedText, 0X2026, "\\&{}");
00199 convert(escapedText, 0X2027, "\\textperiodcentered{}");
00200 convert(escapedText, 0X2030, "\\textperthousand{}");
00201 convert(escapedText, 0X2031, "\\textpertenthousand{}");
00202 convert(escapedText, 0X2032, "\\textasciiacute{}");
00203 convert(escapedText, 0X2033, "\\textgravedbl{}");
00204 convert(escapedText, 0X2034, "\\textdaggerdbl{}");
00205 convert(escapedText, 0X2035, "\\textasciigrave{}");
00206 convert(escapedText, 0X2036, "\\textacutedbl{}");
00207 convert(escapedText, 0X2037, "\\textdaggerdbl{}");
00208 convert(escapedText, 0X2038, "\\textdaggerdbl{}");
00209 convert(escapedText, 0X2039, "\\textdaggerdbl{}");
00210 convert(escapedText, 0X203A, "\\textdaggerdbl{}");
00211 convert(escapedText, 0X203B, "\\textreferencemark{}");
00212 convert(escapedText, 0X203D, "\\textinterrobang{}");
00213
00214 convert(escapedText, 0X2045, "\\textlquill{}");
00215 convert(escapedText, 0X2046, "\\textrquill{}");
00216
00217
00218 convert(escapedText, 0X2080, "\\textzerooldstyle{}");
00219 convert(escapedText, 0X2081, "\\textoneoldstyle{}");
00220 convert(escapedText, 0X2082, "\\texttwooldstyle{}");
00221 convert(escapedText, 0X2083, "\\textthreeoldstyle{}");
00222 convert(escapedText, 0X2084, "\\textfouroldstyle{}");
00223 convert(escapedText, 0X2085, "\\textfiveoldstyle{}");
00224 convert(escapedText, 0X2086, "\\textsixoldstyle{}");
00225 convert(escapedText, 0X2087, "\\textsevenoldstyle{}");
00226 convert(escapedText, 0X2088, "\\texteightoldstyle{}");
00227 convert(escapedText, 0X2089, "\\textnineoldstyle{}");
00228 convert(escapedText, 0X208C, "\\textdblhyphen{}");
00229
00230 convert(escapedText, 0X20A4, "\\textsterling{}");
00231 convert(escapedText, 0X20A6, "\\textnaria{}");
00232 convert(escapedText, 0X20AA, "\\textwon{}");
00233 convert(escapedText, 0X20AB, "\\textdong{}");
00234 convert(escapedText, 0X20AC, "\\texteuro{}");
00235
00236 convert(escapedText, 0X2103, "\\textcelsius{}");
00237 convert(escapedText, 0X2116, "\\textnumero{}");
00238 convert(escapedText, 0X2117, "\\textcircledP{}");
00239 convert(escapedText, 0X2120, "\\textservicemark{}");
00240 convert(escapedText, 0X2122, "\\texttrademark{}");
00241 convert(escapedText, 0X2126, "\\textohm{}");
00242 convert(escapedText, 0X2127, "\\textmho{}");
00243 convert(escapedText, 0X212E, "\\textestimated{}");
00244
00245 convert(escapedText, 0X2190, "\\textleftarrow{}");
00246 convert(escapedText, 0X2191, "\\textuparrow{}");
00247 convert(escapedText, 0X2192, "\\textrightarrow{}");
00248 convert(escapedText, 0X2193, "\\textdownarrow{}");
00249
00250
00251
00252
00253 return escapedText;
00254 }
00255
00256
00257
00258
00259
00260
00261
00262 void TextZone::convert(QString& text, int unicode, const char* escape)
00263 {
00264 QString expression;
00265 QString value;
00266
00267 expression = QString("\\x") + value.setNum(unicode, 16);
00268
00269 if( !QString(escape).isEmpty() )
00270 {
00271
00272 text = text.replace( QRegExp( expression), QString(escape));
00273 }
00274 }
00275
00276
00277
00278
00279
00280
00281
00282 void TextZone::analyse(const QDomNode balise)
00283 {
00284 kdDebug(30522) << "FORMAT" << endl;
00285
00286
00287
00288
00289 analyseFormat(balise);
00290
00291
00292 setTexte(getTexte().mid(getPos(), getLength()));
00293
00294 kdDebug(30522) << getTexte().length() << endl;
00295 kdDebug(30522) << getTexte().latin1() << endl;
00296 kdDebug(30522) << "END FORMAT" << endl;
00297 }
00298
00299
00300
00301
00302
00303
00304
00305 void TextZone::analyse()
00306 {
00307 kdDebug(30522) << "ZONE" << endl;
00308
00309
00310 setTexte(getTexte().mid(getPos(), getLength()));
00311
00312 kdDebug(30522) << "String of " << getTexte().length() << " caracters :" << endl;
00313 kdDebug(30522) << getTexte().latin1() << endl;
00314 kdDebug(30522) << "END ZONE" << endl;
00315 }
00316
00317
00318
00319
00320
00321
00322 void TextZone::generate(QTextStream &out)
00323 {
00324
00325 if(useFormat())
00326 generate_format_begin(out);
00327
00328
00329 if(Config::instance()->getEncoding() == "latin1")
00330 display(_texte, out);
00331 else if(Config::instance()->mustUseUnicode())
00332 display(_texte, out);
00333 else
00334 display(escapeLatin1(_texte), out);
00335
00336 if(useFormat())
00337 generate_format_end(out);
00338 }
00339
00340
00341
00342
00343
00344
00345
00346 void TextZone::display(QString texte, QTextStream& out)
00347 {
00348 QString line;
00349 int index = 0, end = 0;
00350 end = texte.find(' ', 60, false);
00351 if(end != -1)
00352 line = texte.mid(index, end - index);
00353 else
00354 line = texte;
00355 while(end < (signed int) texte.length() && end != -1)
00356 {
00357
00358 if(Config::instance()->mustUseUnicode())
00359 out << line.utf8() << endl;
00360 else if(Config::instance()->mustUseLatin1())
00361 out << line << endl;
00362 Config::instance()->writeIndent(out);
00363 index = end;
00364 end = texte.find(' ', index + 60, false);
00365 line = texte.mid(index, end - index);
00366 }
00367 kdDebug(30522) << line << endl;
00368 if(Config::instance()->mustUseUnicode())
00369 out << line.utf8();
00370 else if(Config::instance()->getEncoding() == "ascii")
00371 out << line.ascii();
00372 else
00373 out << line;
00374 }
00375
00376
00377
00378
00379
00380
00381 void TextZone::generate_format_begin(QTextStream & out)
00382 {
00383 kdDebug(30522) << "GENERATE FORMAT BEGIN" << endl;
00384
00385
00386 if(getWeight() > 50)
00387 out << "\\textbf{";
00388 if(isItalic())
00389 out << "\\textit{";
00390 if(getUnderlineType() == UNDERLINE_SIMPLE)
00391 out << "\\uline{";
00392 else if(getUnderlineType() == UNDERLINE_DOUBLE)
00393 out << "\\uuline{";
00394 else if(getUnderlineType() == UNDERLINE_WAVE)
00395 out << "\\uwave{";
00396 if (isStrikeout())
00397 out << "\\sout{";
00398
00399
00400 if(getSize() != Config::instance()->getDefaultFontSize() &&
00401 Config::instance()->isKwordStyleUsed())
00402 {
00403 out << "\\fontsize{" << getSize() << "}{1}%" << endl;
00404 Config::instance()->writeIndent(out);
00405 out << "\\selectfont" << endl;
00406 Config::instance()->writeIndent(out);
00407 }
00408
00409
00410 if(isBkColored())
00411 {
00412 float red, green, blue;
00413
00414 red = ((float) getBkColorRed()) / 255;
00415 green = ((float) getBkColorGreen()) / 255;
00416 blue = ((float) getBkColorBlue()) / 255;
00417
00418 out << "\\colorbox[rgb]{";
00419 out << red << ", " << green << ", " << blue << "}{";
00420 }
00421
00422
00423 if(isColor())
00424 {
00425 float red, green, blue;
00426
00427 red = ((float) getColorRed()) / 255;
00428 green = ((float) getColorGreen()) / 255;
00429 blue = ((float) getColorBlue()) / 255;
00430
00431 out << "\\textcolor[rgb]{";
00432 out << red << ", " << green << ", " << blue << "}{";
00433 }
00434
00435
00436 switch(getAlign())
00437 {
00438 case EA_NONE:
00439 break;
00440 case EA_SUB:
00441 out << "$_{";
00442 break;
00443 case EA_SUPER:
00444 out << "\\textsuperscript{";
00445 break;
00446 }
00447 }
00448
00449
00450
00451
00452
00453
00454 void TextZone::generate_format_end(QTextStream & out)
00455 {
00456 kdDebug(30522) << "GENERATE FORMAT END" << endl;
00457
00458
00459 if(getAlign() == EA_SUPER)
00460 out << "}";
00461 if(getAlign() == EA_SUB)
00462 out << "}$";
00463
00464
00465 if(isColor() || isBkColored())
00466 out << "}";
00467
00468
00469 if(getSize() != Config::instance()->getDefaultFontSize() && Config::instance()->isKwordStyleUsed())
00470 {
00471 out << "\\fontsize{" << Config::instance()->getDefaultFontSize() << "}{1}%" << endl;
00472 Config::instance()->writeIndent(out);
00473 out << "\\selectfont" << endl;
00474 Config::instance()->writeIndent(out);
00475 }
00476
00477
00478 if(isUnderlined())
00479 out << "}";
00480 if(isItalic())
00481 out << "}";
00482 if(getWeight() > 50)
00483 out << "}";
00484 if(isStrikeout())
00485 out << "}";
00486 }
00487
00488 QString convertSpecialChar(int c)
00489 {
00490 QString output;
00491
00492 switch(c)
00493 {
00494 case 183: return output = "\\textminus";
00495 break;
00496 default: return output.setNum(c);
00497 }
00498 }