summaryrefslogtreecommitdiff
path: root/noncore/apps/opie-reader/striphtml.cpp
Unidiff
Diffstat (limited to 'noncore/apps/opie-reader/striphtml.cpp') (more/less context) (show whitespace changes)
-rw-r--r--noncore/apps/opie-reader/striphtml.cpp232
1 files changed, 199 insertions, 33 deletions
diff --git a/noncore/apps/opie-reader/striphtml.cpp b/noncore/apps/opie-reader/striphtml.cpp
index e86402b..c434dbb 100644
--- a/noncore/apps/opie-reader/striphtml.cpp
+++ b/noncore/apps/opie-reader/striphtml.cpp
@@ -10,3 +10,2 @@
10#include "hrule.h" 10#include "hrule.h"
11#include "util.h"
12 11
@@ -92,3 +91,3 @@ void striphtml::skipblock(const QString& _ent)
92 91
93void striphtml::locate(unsigned int n) 92void striphtml::reset()
94{ 93{
@@ -96,7 +95,15 @@ void striphtml::locate(unsigned int n)
96 text_q = ""; 95 text_q = "";
96 q = "";
97 tablenesteddepth = 0;
97 forcecentre = false; 98 forcecentre = false;
98 ignorespace = false; 99 ignorespace = false;
100 indent = 0;
99 while (!stylestack.isEmpty()) stylestack.pop(); 101 while (!stylestack.isEmpty()) stylestack.pop();
100 currentstyle.unset(); 102 currentstyle.unset();
103}
104
105void striphtml::locate(unsigned int n)
106{
101 qDebug("striphtml:locating:%u", n); 107 qDebug("striphtml:locating:%u", n);
108 reset();
102 parent->locate(n); 109 parent->locate(n);
@@ -235,2 +242,9 @@ bool striphtml::findanchor(const QString& _info)
235 // QProgressBar dlg(0); 242 // QProgressBar dlg(0);
243 if (parent->findanchor(_info))
244 {
245 reset();
246 return true;
247 }
248 qDebug("Using html find");
249 parent->locate(parent->startSection());
236#if defined(USEQPE) || defined(_WINDOWS) 250#if defined(USEQPE) || defined(_WINDOWS)
@@ -297,3 +311,3 @@ bool striphtml::findanchor(const QString& _info)
297 311
298striphtml::striphtml(const QString& _s) : entmap(NULL), isPre(false), currentid(0), lastch(0), currentfile(_s), indent(0), forcecentre(false), m_inblock(false), m_bchm(false), ignorespace(false) 312striphtml::striphtml(const QString& _s) : entmap(NULL), isPre(false), currentid(0), lastch(0), currentfile(_s), indent(0), forcecentre(false), m_inblock(false), m_bchm(false), ignorespace(false), tablenesteddepth(0)
299{ 313{
@@ -313,3 +327,13 @@ void striphtml::initentmap()
313 entmap = new QMap<QString, tchar>; 327 entmap = new QMap<QString, tchar>;
314 QString fname(QTReaderUtil::getPluginPath("data")); 328#ifdef USEQPE
329#ifdef OPIE
330 QString fname(getenv("OPIEDIR"));
331#else
332 QString fname(getenv("QTDIR"));
333#endif
334 fname += "/plugins/reader/data";
335#else
336 QString fname(getenv("READERDIR"));
337 fname += "/data";
338#endif
315 QFileInfo fi; 339 QFileInfo fi;
@@ -414,2 +438,8 @@ QString striphtml::getattr(tchar& ch)
414 } 438 }
439 else if (ch == '\'')
440 {
441 mygetch(ch, sty, pos);
442 ref = getname(ch, "\'");
443 ch = skip_ws();
444 }
415 else 445 else
@@ -480,2 +510,7 @@ linkType striphtml::hyperlink(unsigned int n, unsigned int, QString& w, QString&
480 { 510 {
511 if (parent->findanchor(name))
512 {
513 reset();
514 return eLink;
515 }
481 fpit = href2filepos->find(name); 516 fpit = href2filepos->find(name);
@@ -490,3 +525,2 @@ linkType striphtml::hyperlink(unsigned int n, unsigned int, QString& w, QString&
490 qDebug("Do a search for:%s", (const char*)name); 525 qDebug("Do a search for:%s", (const char*)name);
491 parent->locate(0);
492 findanchor(name); 526 findanchor(name);
@@ -500,3 +534,3 @@ linkType striphtml::hyperlink(unsigned int n, unsigned int, QString& w, QString&
500 { 534 {
501 w = "/"+file; 535 w = file;
502 nm = name; 536 nm = name;
@@ -566,3 +600,27 @@ void striphtml::mygetch(tchar& ch, CStyle& sty, unsigned long& pos)
566 { 600 {
601#ifdef REMOVE_LF_BEFORE_ENDTAG
602 parent->getch(ch, sty, pos);
603 if (ch == '<')
604 {
605 parent->getch(ch, sty, pos);
606 if (ch == '/')
607 {
608 ch = '<';
609 text_q += '/';
610 }
611 else
612 {
613 text_q += '<';
614 text_q += ch;
615 ch = ' ';
616 }
617 }
618 else
619 {
620 text_q += ch;
621 ch = ' ';
622 }
623#else
567 ch = ' '; 624 ch = ' ';
625#endif
568 } 626 }
@@ -586,3 +644,2 @@ void striphtml::parse_paragraph(CStyle& currentstyle, tchar& ch, unsigned long p
586 { 644 {
587 qDebug("Using stack style");
588 currentstyle = stylestack.first(); 645 currentstyle = stylestack.first();
@@ -609,2 +666,6 @@ void striphtml::parse_paragraph(CStyle& currentstyle, tchar& ch, unsigned long p
609 } 666 }
667 if (attr == "justify")
668 {
669 currentstyle.setFullJustify();
670 }
610 } 671 }
@@ -656,2 +717,3 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
656 sty = currentstyle; 717 sty = currentstyle;
718 lastch = ch;
657 return; 719 return;
@@ -663,3 +725,2 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
663 mygetch(ch, dummy, pos); 725 mygetch(ch, dummy, pos);
664 // if (ch == 10 && !isPre) ch = ' ';
665 while (ch == '<' && ch != UEOF) 726 while (ch == '<' && ch != UEOF)
@@ -667,3 +728,2 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
667 ch = skip_ws(); 728 ch = skip_ws();
668
669 QString ent = getname(ch, " >").lower(); 729 QString ent = getname(ch, " >").lower();
@@ -683,3 +743,3 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
683 QString attr = getattr(ch); 743 QString attr = getattr(ch);
684 qDebug("<A>Entity:%s Attr:%s", (const char*)ent, (const char*)attr); 744 //qDebug("<A>Entity:%s Attr:%s", (const char*)ent, (const char*)attr);
685 if (ent == "name") 745 if (ent == "name")
@@ -714,3 +774,3 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
714 } 774 }
715 qDebug("<a %s=%s>", (const char*)ent, (const char*)ref); 775 //qDebug("<a %s=%s>", (const char*)ent, (const char*)ref);
716 } 776 }
@@ -750,2 +810,3 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
750 stylestack.push_front(currentstyle); 810 stylestack.push_front(currentstyle);
811 currentstyle.setExtraSpace(16);
751 //indent = 0; 812 //indent = 0;
@@ -802,2 +863,3 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
802 isPre = true; 863 isPre = true;
864 currentstyle.setNoJustify();
803 currentstyle.setMono(); 865 currentstyle.setMono();
@@ -824,2 +886,3 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
824 ch = 10; 886 ch = 10;
887 currentstyle.setExtraSpace(0);
825 currentstyle.setLeftMargin(30); 888 currentstyle.setLeftMargin(30);
@@ -832,2 +895,4 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
832 ch = 10; 895 ch = 10;
896 currentstyle.setExtraSpace(0);
897 lastch = 0;
833 continue; 898 continue;
@@ -863,2 +928,3 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
863 if (ch != '>') ch = skip_ws_end(); 928 if (ch != '>') ch = skip_ws_end();
929 lastch = 0;
864 ch = 10; 930 ch = 10;
@@ -920,2 +986,8 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
920 } 986 }
987 else if (ent[0] == '/' && ent[1] == 'h' && ent.length() == 3 && QString("123456789").find(ent[2]) != -1)
988 {
989 parse_paragraph(currentstyle, ch, pos);
990 currentstyle.setExtraSpace(3);
991 continue;
992 }
921 else if (ent[0] == 'h' && ent.length() == 2 && QString("123456789").find(ent[1]) != -1) 993 else if (ent[0] == 'h' && ent.length() == 2 && QString("123456789").find(ent[1]) != -1)
@@ -930,3 +1002,2 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
930 // currentstyle.setExtraSpace(10); 1002 // currentstyle.setExtraSpace(10);
931 continue;
932 } 1003 }
@@ -939,3 +1010,2 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
939 // currentstyle.setExtraSpace(10); 1010 // currentstyle.setExtraSpace(10);
940 continue;
941 } 1011 }
@@ -948,3 +1018,2 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
948 // currentstyle.setExtraSpace(10); 1018 // currentstyle.setExtraSpace(10);
949 continue;
950 } 1019 }
@@ -956,4 +1025,5 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
956 // currentstyle.setExtraSpace(10); 1025 // currentstyle.setExtraSpace(10);
957 continue;
958 } 1026 }
1027 ch = 10;
1028 continue;
959 } 1029 }
@@ -1049,8 +1119,5 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
1049 if (ch != '>') ch = skip_ws_end(); 1119 if (ch != '>') ch = skip_ws_end();
1050 ch = 10; 1120 //ch = 10;
1051 continue; 1121 //continue;
1052 } 1122 }
1053
1054
1055
1056 else if (ent == "table" || ent == "/table") 1123 else if (ent == "table" || ent == "/table")
@@ -1059,2 +1126,14 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
1059 ignorespace = (ent == "table"); 1126 ignorespace = (ent == "table");
1127 if (ent == "table")
1128 {
1129 if (tablenesteddepth++ == 0) currentstyle.setTable(pos);
1130 }
1131 else
1132 {
1133 if (--tablenesteddepth <= 0)
1134 {
1135 tablenesteddepth = 0;
1136 currentstyle.setTable(0xffffffff);
1137 }
1138 }
1060 if (ch == ' ') ch = skip_ws(); 1139 if (ch == ' ') ch = skip_ws();
@@ -1068,2 +1147,6 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
1068 1147
1148 currentstyle.setLeftMargin(6*tablenesteddepth);
1149
1150
1151 lastch = 0; // Anything but 10
1069 ch = 10; 1152 ch = 10;
@@ -1071,3 +1154,3 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
1071 q += QChar(parent->getwidth()); 1154 q += QChar(parent->getwidth());
1072 q += 2; 1155 q += 3;
1073 q += '\0'; 1156 q += '\0';
@@ -1079,14 +1162,4 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
1079 { 1162 {
1163 //bool isPageBreak = false;
1080 if (ch == ' ') ch = skip_ws(); 1164 if (ch == ' ') ch = skip_ws();
1081 // if (stylestack.isEmpty())
1082 // {
1083 currentstyle.unset();
1084 // }
1085 /*
1086 else
1087 {
1088 qDebug("Using stack style");
1089 currentstyle = stylestack.first();
1090 }
1091 */
1092 unsigned char red = 0, green = 0, blue = 0; 1165 unsigned char red = 0, green = 0, blue = 0;
@@ -1100,2 +1173,11 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
1100 } 1173 }
1174 /*
1175 if (ent == "size")
1176 {
1177 if (attr == "0")
1178 {
1179 isPageBreak = true;
1180 }
1181 }
1182 */
1101 qDebug("<hr>Entity:%s Attr:%s", (const char*)ent, (const char*)attr); 1183 qDebug("<hr>Entity:%s Attr:%s", (const char*)ent, (const char*)attr);
@@ -1103,2 +1185,22 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
1103 if (ch != '>') ch = skip_ws_end(); 1185 if (ch != '>') ch = skip_ws_end();
1186 /*
1187 if (isPageBreak)
1188 {
1189 ch = UEOF;
1190 }
1191 else
1192 {
1193 */
1194 // if (stylestack.isEmpty())
1195 // {
1196 currentstyle.unset();
1197 // }
1198 /*
1199 else
1200 {
1201 qDebug("Using stack style");
1202 currentstyle = stylestack.first();
1203 }
1204 */
1205 lastch = 0; //Anything but 10 or ' '
1104 ch = 10; 1206 ch = 10;
@@ -1110,2 +1212,3 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
1110 q += blue; 1212 q += blue;
1213
1111 continue; 1214 continue;
@@ -1125,2 +1228,3 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
1125 { 1228 {
1229 /*
1126 if (m_bchm) 1230 if (m_bchm)
@@ -1133,2 +1237,10 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
1133 } 1237 }
1238 */
1239
1240
1241 QImage* img = parent->getPicture(attr);
1242 if (img != NULL)
1243 {
1244 currentstyle.setPicture(true, img);
1245 }
1134 else 1246 else
@@ -1174,2 +1286,10 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
1174 } 1286 }
1287 else if (ent == "title")
1288 {
1289 skipblock("/title");
1290 }
1291 else if (ent == "head")
1292 {
1293 skipblock("/head");
1294 }
1175 /* 1295 /*
@@ -1193,2 +1313,5 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
1193 if (ch != '>') ch = skip_ws_end(); 1313 if (ch != '>') ch = skip_ws_end();
1314 if (ent[0] == '/')
1315 mygetch(ch, dummy, pos);
1316 else
1194 mygetch(ch, dummy, npos); 1317 mygetch(ch, dummy, npos);
@@ -1236,5 +1359,9 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
1236 // sty = (dummy == ucFontBase) ? currentstyle : dummy; 1359 // sty = (dummy == ucFontBase) ? currentstyle : dummy;
1360 if (lastch == 10 && ch == 10 && sty.getExtraSpace() > currentstyle.getExtraSpace())
1361 {
1362 currentstyle.setExtraSpace(sty.getExtraSpace());
1363 }
1237 sty = currentstyle; 1364 sty = currentstyle;
1238 } 1365 }
1239 while (!isPre && (lastch == ' ' || lastch == 10 || ignorespace) && ch == ' '); 1366 while (!isPre && (((lastch == ' ' || lastch == 10 || ignorespace) && ch == ' ') || ((ch == 10) && (lastch == 10))));
1240 // lastch = ch; 1367 // lastch = ch;
@@ -1244,2 +1371,41 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
1244 1371
1372QString striphtml::getTableAsHtml(unsigned long loc)
1373{
1374 qDebug("striphtml::getTableAsHtml");
1375 QString ret;
1376 tchar ch(0);
1377 CStyle sty;
1378 unsigned long pos;
1379 locate(loc);
1380 int endpos(0);
1381 QString endmarker("</table>");
1382 QString startmarker("<table");
1383 int startpos(0);
1384 int depth(0);
1385 while (ch != UEOF)
1386 {
1387 parent->getch(ch, sty, pos);
1388 QChar qc(ch);
1389 ret += qc;
1390 if (qc.lower() == endmarker[endpos])
1391 {
1392 if ((++endpos >= endmarker.length()) && (--depth <= 0)) break;
1393 }
1394 else
1395 {
1396 endpos = 0;
1397 }
1398 if (qc.lower() == startmarker[startpos])
1399 {
1400 if (++startpos >= startmarker.length()) ++depth;
1401 }
1402 else
1403 {
1404 startpos = 0;
1405 }
1406 }
1407 return ret;
1408}
1409
1410
1245extern "C" 1411extern "C"