summaryrefslogtreecommitdiff
path: root/noncore/apps/opie-reader/CFilter.cpp
Side-by-side diff
Diffstat (limited to 'noncore/apps/opie-reader/CFilter.cpp') (more/less context) (show whitespace changes)
-rw-r--r--noncore/apps/opie-reader/CFilter.cpp561
1 files changed, 561 insertions, 0 deletions
diff --git a/noncore/apps/opie-reader/CFilter.cpp b/noncore/apps/opie-reader/CFilter.cpp
new file mode 100644
index 0000000..c17cf61
--- a/dev/null
+++ b/noncore/apps/opie-reader/CFilter.cpp
@@ -0,0 +1,561 @@
+#include "CDrawBuffer.h"
+#include "CFilter.h"
+
+unsigned short striphtml::skip_ws()
+{
+ tchar ch;
+ CStyle sty;
+ do
+ {
+ parent->getch(ch, sty);
+ }
+ while (ch < 33);
+ return ch;
+}
+
+unsigned short striphtml::skip_ws_end()
+{
+ tchar ch;
+ CStyle sty;
+ parent->getch(ch, sty);
+ if (ch == ' ')
+ {
+ do
+ {
+ parent->getch(ch, sty);
+ }
+ while (ch != '>');
+ }
+ return ch;
+}
+
+unsigned short striphtml::parse_m()
+{
+ tchar ch;
+ CStyle sty;
+ parent->getch(ch, sty);
+ if (ch == 'm' || ch == 'M')
+ {
+ ch = skip_ws_end();
+ if (ch == '>')
+ {
+ return 0;
+ }
+ }
+ return ch;
+}
+
+void striphtml::mygetch(tchar& ch, CStyle& sty)
+{
+ parent->getch(ch, sty);
+ if (ch == 10) ch = ' ';
+}
+
+void striphtml::getch(tchar& ch, CStyle& sty)
+{
+ CStyle dummy;
+ mygetch(ch, dummy);
+ if (ch == 10) ch = ' ';
+ while (ch == '<')
+ {
+ ch = skip_ws();
+
+ switch (ch)
+ {
+ case 'p':
+ case 'P':
+ ch = skip_ws_end();
+ if (ch == '>')
+ {
+ ch = 10;
+ continue;
+ }
+ break;
+ case 'b':
+ case 'B':
+ ch = skip_ws_end();
+ if (ch == '>')
+ {
+ currentstyle.setBold();
+ mygetch(ch, dummy);
+ continue;
+ }
+ else if (ch == 'r' || ch == 'R')
+ {
+ ch = skip_ws_end();
+ if (ch == '>')
+ {
+ ch = 10;
+ continue;
+ }
+ }
+ break;
+ case 'i':
+ case 'I':
+ ch = skip_ws_end();
+ if (ch == '>')
+ {
+ currentstyle.setItalic();
+ mygetch(ch, dummy);
+ continue;
+ }
+ break;
+ case 'e':
+ case 'E':
+ if ((ch = parse_m()) == 0)
+ {
+ currentstyle.setItalic();
+ mygetch(ch, dummy);
+ continue;
+ }
+ break;
+ case 'h':
+ case 'H':
+ mygetch(ch, dummy);
+ if ('0' < ch && ch <= '9')
+ {
+ tchar hs = ch;
+ ch = skip_ws_end();
+ if (ch == '>')
+ {
+ switch (hs)
+ {
+ case '1':
+// currentstyle = ucBold | ucFontBase+2 | (ucAlignCentre << ucAlignShift);
+ currentstyle.unset();
+ currentstyle.setFontSize(2);
+ currentstyle.setBold();
+ currentstyle.setCentreJustify();
+ break;
+ case '2':
+// currentstyle = ucBold | ucFontBase+1;
+ currentstyle.unset();
+ currentstyle.setFontSize(1);
+ currentstyle.setBold();
+ break;
+ default:
+// currentstyle = ucBold | ucFontBase;
+ currentstyle.unset();
+ currentstyle.setBold();
+ }
+ ch = 10;
+// mygetch(ch, dummy);
+ continue;
+ }
+ }
+ break;
+ case '/':
+ mygetch(ch, dummy);
+ switch (ch)
+ {
+ case 'b':
+ case 'B':
+ ch = skip_ws_end();
+ if (ch == '>')
+ {
+ currentstyle.unsetBold();
+ mygetch(ch, dummy);
+ continue;
+ }
+ break;
+ case 'i':
+ case 'I':
+ ch = skip_ws_end();
+ if (ch == '>')
+ {
+ currentstyle.unsetItalic();
+ mygetch(ch, dummy);
+ continue;
+ }
+ break;
+ case 'e':
+ case 'E':
+ if ((ch = parse_m()) == 0)
+ {
+ currentstyle.unsetItalic();
+ mygetch(ch, dummy);
+ continue;
+ }
+ break;
+ case 'h':
+ case 'H':
+ mygetch(ch, dummy);
+ if ('0' < ch && ch <= '9')
+ {
+ ch = skip_ws_end();
+ if (ch == '>')
+ {
+ currentstyle.unset();
+ //mygetch(ch, dummy);
+ ch = 10;
+ continue;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ while (ch != '>' && ch != UEOF)
+ {
+ mygetch(ch, dummy);
+ }
+ mygetch(ch, dummy);
+ }
+ if (ch == '&')
+ {
+ mygetch(ch, dummy);
+ if (ch == '#')
+ {
+ int id = 0;
+ mygetch(ch, dummy);
+ while (ch != ';' && ch != UEOF)
+ {
+ id = 10*id+ch-'0';
+ mygetch(ch, dummy);
+ }
+ ch = id;
+ }
+ }
+// sty = (dummy == ucFontBase) ? currentstyle : dummy;
+ sty = currentstyle;
+ return;
+}
+
+
+void textfmt::mygetch(tchar& ch, CStyle& sty)
+{
+ if (uselast)
+ {
+ ch = lastchar;
+ uselast = false;
+ }
+ else
+ {
+ parent->getch(ch, sty);
+ }
+}
+
+void textfmt::getch(tchar& ch, CStyle& sty)
+{
+ mygetch(ch, sty);
+ do
+ {
+ sty = currentstyle;
+ switch (ch)
+ {
+ case 10:
+ currentstyle.unset();
+ sty = currentstyle;
+ break;
+// Use this if you want to replace -- by em-dash
+ case '-':
+// parent->getch(ch, sty);
+ mygetch(ch, sty);
+ if (ch == '-')
+ {
+ ch = 0x2014;
+ }
+ else
+ {
+ lastchar = ch;
+ uselast = true;
+ ch = '-';
+ }
+ break;
+ case '*':
+ if (currentstyle.isBold())
+ {
+// Already bold - time to turn it off?
+// The next two lines ensure that * follows a character but it works better without
+// QChar c(lastchar);
+// if ((lastchar != '*') && (c.isPunct() || c.isLetterOrNumber()))
+ if (lastchar != '*')
+ {
+ currentstyle.unsetBold();
+ CStyle dummy;
+// parent->getch(ch, dummy);
+ mygetch(ch, dummy);
+ }
+ }
+ else
+ {
+// not bold - time to turn it on?
+ CStyle dummy;
+// parent->getch(ch, dummy);
+ mygetch(ch, dummy);
+ QChar c(ch);
+ if ((ch != '*') && (c.isPunct() || c.isLetterOrNumber()))
+ {
+ currentstyle.setBold();
+ }
+ else
+ {
+ lastchar = ch;
+ uselast = true;
+ ch = '*';
+ }
+
+ }
+ break;
+ case '_':
+ if (currentstyle.isItalic())
+ {
+// Already bold - time to turn it off?
+// The next two lines ensure that * follows a character but it works better without
+// QChar c(lastchar);
+// if ((lastchar != '_') && (c.isPunct() || c.isLetterOrNumber()))
+ if (lastchar != '_')
+ {
+ currentstyle.unsetItalic();
+ CStyle dummy;
+// parent->getch(ch, dummy);
+ mygetch(ch, dummy);
+ }
+ }
+ else
+ {
+// not bold - time to turn it on?
+ CStyle dummy;
+// parent->getch(ch, dummy);
+ mygetch(ch, dummy);
+ QChar c(ch);
+ if ((ch != '_') && (c.isPunct() || c.isLetterOrNumber()))
+ {
+ currentstyle.setItalic();
+ }
+ else
+ {
+ lastchar = ch;
+ uselast = true;
+ ch = '_';
+ }
+
+ }
+ break;
+ }
+ }
+ while (sty != currentstyle);
+ if (!uselast) lastchar = ch;
+ return;
+}
+
+void remap::getch(tchar& ch, CStyle& sty)
+{
+ if (q[offset] != 0)
+ {
+ q[offset++];
+ sty = currentstyle;
+ return;
+ }
+ parent->getch(ch, sty);
+ switch (ch)
+ {
+ case 0x201a:
+ ch = '\'';
+ break;
+ case 0x0192:
+ ch = 'f';
+ break;
+ case 0x201e:
+ ch = '"';
+ break;
+ case 0x2026:
+ offset = 0;
+ q[0] = '.';
+ q[1] = '.';
+ q[2] = 0;
+ ch = '.'; // should be ...
+ break;
+ case 0x0160:
+ ch = 'S';
+ break;
+ case 0x2039:
+ ch = '<';
+ break;
+ case 0x0152:
+ offset = 0;
+ q[0] = 'E';
+ q[1] = 0;
+ ch = 'O';
+ break;
+ case 0x017d:
+ ch = 'Z';
+ break;
+ case 0x2018:
+ ch = '\'';
+ break;
+ case 0x2019:
+ ch = '\'';
+ break;
+ case 0x201c:
+ ch = '"';
+ break;
+ case 0x201d:
+ ch = '"';
+ break;
+ case 0x2022:
+ ch = '>';
+ break;
+ case 0x2013:
+ ch = '-';
+ break;
+ case 0x2014:
+ offset = 0;
+ q[0] = '-';
+ q[1] = 0;
+ ch = '-'; // should be --
+ break;
+ case 0x02dc:
+ ch = '~';
+ break;
+ case 0x0161:
+ ch = 's';
+ break;
+ case 0x203a:
+ ch = '>';
+ break;
+ case 0x0153:
+ offset = 0;
+ q[0] = 'e';
+ q[1] = 0;
+ ch = 'o';// should be oe
+ break;
+ case 0x017e:
+ ch = 'z';
+ break;
+ case 0x0178:
+ ch = 'Y';
+ break;
+ }
+ currentstyle = sty;
+}
+
+void PeanutFormatter::getch(tchar& ch, CStyle& sty)
+{
+ CStyle dummy;
+ currentstyle.setColour(0,0,0);
+ parent->getch(ch, dummy);
+ while (ch == '\\')
+ {
+ parent->getch(ch, dummy);
+ if (ch == '\\') break;
+ switch(ch)
+ {
+ case 'a':
+ {
+ int code = 0;
+ for (int i = 0; i < 3; i++)
+ {
+ parent->getch(ch, dummy);
+ code = 10*code + ch - '0';
+ }
+ ch = code;
+ }
+ break;
+ case 'v':
+ {
+ while (1)
+ {
+ parent->getch(ch, dummy);
+ if (ch == '\\')
+ {
+ parent->getch(ch, dummy);
+ if (ch == 'v')
+ {
+ parent->getch(ch, dummy);
+ break;
+ }
+ }
+ }
+ }
+ break;
+ case 's':
+ case 'n':
+ currentstyle.setFontSize(0);
+ parent->getch(ch,dummy);
+ break;
+ case 'p':
+ currentstyle.unset();
+// parent->getch(ch,dummy);
+ ch = 10;
+ break;
+ case 'l':
+ if (currentstyle.getFontSize() == 1)
+ {
+ currentstyle.setFontSize(0);
+ }
+ else
+ {
+ currentstyle.setFontSize(1);
+ }
+ parent->getch(ch, dummy);
+ break;
+ case 'x':
+ if (currentstyle.getFontSize() == 0)
+ {
+// currentstyle.unset();
+// currentstyle.setBold();
+ currentstyle.setFontSize(1);
+ }
+ else
+ {
+ currentstyle.unset();
+ }
+// parent->getch(ch, dummy);
+ ch = 10;
+ break;
+ case 'i':
+ if (currentstyle.isItalic())
+ {
+ currentstyle.unsetItalic();
+ }
+ else
+ {
+ currentstyle.setItalic();
+ }
+ parent->getch(ch, dummy);
+ break;
+ case 'b':
+ case 'B':
+ if (currentstyle.isBold())
+ {
+ currentstyle.unsetBold();
+ }
+ else
+ {
+ currentstyle.setBold();
+ }
+ parent->getch(ch, dummy);
+ break;
+ case 'c':
+ if (currentstyle.getJustify() == CStyle::m_AlignCentre)
+ {
+ currentstyle.setLeftJustify();
+ }
+ else
+ {
+ currentstyle.setCentreJustify();
+ }
+ parent->getch(ch, dummy);
+ break;
+ case 'r':
+ if (currentstyle.getJustify() == CStyle::m_AlignRight)
+ {
+ currentstyle.setLeftJustify();
+ }
+ else
+ {
+ currentstyle.setRightJustify();
+ }
+ parent->getch(ch, dummy);
+ break;
+ default:
+ currentstyle.setColour(255,0,0);
+ }
+ }
+ sty = currentstyle;
+}