WebView: refactoring

git-svn-id: svn://kolibrios.org@8439 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Kirill Lipatov (Leency) 2020-12-17 23:01:09 +00:00
parent 9220a9a313
commit 64a81df7e7
12 changed files with 658 additions and 670 deletions

View File

@ -11,10 +11,10 @@ dword link_color_active;
#define BODY_MARGIN 6 #define BODY_MARGIN 6
#define BASIC_LINE_H 18 #define BASIC_LINE_H 18
DrawBufer DrawBuf; CANVAS canvas;
char line[500]; char line[500];
struct _style { struct STYLE {
bool bool
b, u, s, h, b, u, s, h,
font, font,
@ -24,12 +24,20 @@ struct _style {
image; image;
dword bg_color; dword bg_color;
LIST tag_list; LIST tag_list;
dword tag_title; dword title;
void reset();
}; };
void STYLE::reset()
{
b = u = s = h = blq = pre = title = false;
font = false;
tag_list.reset();
}
struct TWebBrowser { struct TWebBrowser {
llist list; llist list;
_style style; STYLE style;
dword draw_y, stolbec; dword draw_y, stolbec;
int zoom; int zoom;
dword o_bufpointer; dword o_bufpointer;
@ -39,6 +47,8 @@ struct TWebBrowser {
dword bufsize; dword bufsize;
dword is_html; dword is_html;
collection img_url; collection img_url;
char header[150];
char redirect[URL_SIZE];
void Paint(); void Paint();
void SetPageDefaults(); void SetPageDefaults();
@ -47,14 +57,27 @@ struct TWebBrowser {
void SetStyle(); void SetStyle();
bool CheckForLineBreak(); bool CheckForLineBreak();
void NewLine(); void NewLine();
void DrawScroller();
void ChangeEncoding(); void ChangeEncoding();
void DrawPage(); void DrawPage();
char header[150];
char redirect[URL_SIZE]; void tag_a();
void tag_p();
void tag_img();
void tag_div();
void tag_h1234_caption();
void tag_ol_ul_dt();
void tag_li();
void tag_q();
void tag_hr();
void tag_code();
void tag_meta_xml();
void tag_body();
void tag_iframe();
void tag_title();
void tag_font();
}; };
scroll_bar scroll_wv = { 15,NULL,NULL,NULL,0,2,NULL,0,0,0xeeeeee,0xBBBbbb,0xeeeeee}; #include "TWB\set_style.h"
//============================================================================================ //============================================================================================
void TWebBrowser::Paint() void TWebBrowser::Paint()
@ -62,7 +85,7 @@ void TWebBrowser::Paint()
dword start_x, line_length, stolbec_len; dword start_x, line_length, stolbec_len;
dword text_color__; dword text_color__;
if (style.tag_title) if (style.title)
{ {
strncpy(#header, #line, sizeof(TWebBrowser.header)-1); strncpy(#header, #line, sizeof(TWebBrowser.header)-1);
strncat(#header, " - ", sizeof(TWebBrowser.header)-1); strncat(#header, " - ", sizeof(TWebBrowser.header)-1);
@ -81,51 +104,46 @@ void TWebBrowser::Paint()
stolbec_len = strlen(#line) * zoom; stolbec_len = strlen(#line) * zoom;
line_length = stolbec_len * list.font_w; line_length = stolbec_len * list.font_w;
if (debug_mode) {
DrawBuf.DrawBar(start_x, draw_y, line_length, list.item_h, 0xDDDddd);
}
if (style.bg_color!=page_bg) { if (style.bg_color!=page_bg) {
DrawBuf.DrawBar(start_x, draw_y, line_length, list.item_h, style.bg_color); canvas.DrawBar(start_x, draw_y, line_length, list.item_h, style.bg_color);
} }
if (style.image) { if (style.image) {
DrawBuf.DrawBar(start_x, draw_y, line_length, list.item_h-1, 0xF9DBCB); canvas.DrawBar(start_x, draw_y, line_length, list.item_h-1, 0xF9DBCB);
} }
if (style.button) { if (style.button) {
DrawBuf.DrawBar(start_x, draw_y, line_length, list.item_h - calc(zoom*2), 0xCCCccc); canvas.DrawBar(start_x, draw_y, line_length, list.item_h - calc(zoom*2), 0xCCCccc);
DrawBuf.DrawBar(start_x, draw_y + list.item_h - calc(zoom*2), line_length, zoom, 0x999999); canvas.DrawBar(start_x, draw_y + list.item_h - calc(zoom*2), line_length, zoom, 0x999999);
} }
text_color__ = text_colors.get_last(); text_color__ = text_colors.get_last();
if (link) && (text_color__ == text_colors.get(0)) text_color__ = link_color_default; if (link) && (text_color__ == text_colors.get(0)) text_color__ = link_color_default;
DrawBuf.WriteText(start_x, draw_y, list.font_type, text_color__, #line, NULL); canvas.WriteText(start_x, draw_y, list.font_type, text_color__, #line, NULL);
if (style.b) DrawBuf.WriteText(start_x+1, draw_y, list.font_type, text_color__, #line, NULL); if (style.b) canvas.WriteText(start_x+1, draw_y, list.font_type, text_color__, #line, NULL);
if (style.s) DrawBuf.DrawBar(start_x, list.item_h / 2 - zoom + draw_y, line_length, zoom, text_color__); if (style.s) canvas.DrawBar(start_x, list.item_h / 2 - zoom + draw_y, line_length, zoom, text_color__);
if (style.u) DrawBuf.DrawBar(start_x, list.item_h - zoom - zoom + draw_y, line_length, zoom, text_color__); if (style.u) canvas.DrawBar(start_x, list.item_h - zoom - zoom + draw_y, line_length, zoom, text_color__);
if (link) { if (link) {
if (line[0]==' ') && (line[1]==NULL) {} else { if (line[0]==' ') && (line[1]==NULL) {} else {
DrawBuf.DrawBar(start_x, draw_y + list.item_h - calc(zoom*2)-1, line_length, zoom, link_color_default); canvas.DrawBar(start_x, draw_y + list.item_h - calc(zoom*2)-1, line_length, zoom, link_color_default);
links.add_text(start_x, draw_y + list.y, line_length, list.item_h - calc(zoom*2)-1, zoom); links.add_text(start_x, draw_y + list.y, line_length, list.item_h - calc(zoom*2)-1, zoom);
} }
} }
stolbec += stolbec_len; stolbec += stolbec_len;
if (debug_mode) debug(#line); if (debug_mode) debugln(#line);
line = NULL; line = NULL;
} }
} }
//============================================================================================ //============================================================================================
void TWebBrowser::SetPageDefaults() void TWebBrowser::SetPageDefaults()
{ {
style.b = style.u = style.s = style.h = style.blq = t_html = t_body = style.pre = t_html = t_body = link = false;
link = style.tag_title = style.font = false; style.reset();
style.tag_list.reset();
link_color_default = 0x0000FF; link_color_default = 0x0000FF;
link_color_active = 0xFF0000; link_color_active = 0xFF0000;
page_bg = 0xffEBE8E9; //E0E3E3 EBE8E9 page_bg = 0xffEBE8E9; //E0E3E3 EBE8E9
style.bg_color = page_bg; style.bg_color = page_bg;
DrawBuf.Fill(0, page_bg); canvas.Fill(0, page_bg);
links.clear(); links.clear();
anchors.clear(); anchors.clear();
img_url.drop(); img_url.drop();
@ -164,14 +182,12 @@ void TWebBrowser::AddCharToTheLine(unsigned char _char)
} }
//============================================================================================ //============================================================================================
void TWebBrowser::ParseHtml(dword _bufpointer, _bufsize){ void TWebBrowser::ParseHtml(dword _bufpointer, _bufsize){
word bukva[2];
char unicode_symbol[10]; char unicode_symbol[10];
dword unicode_symbol_result;
dword j; dword j;
bool ignor_param=false;
int tab_len; int tab_len;
dword bufpos; dword bufpos;
bufsize = _bufsize; bufsize = _bufsize;
if (bufpointer != _bufpointer) { if (bufpointer != _bufpointer) {
bufpointer = malloc(bufsize); bufpointer = malloc(bufsize);
memmov(bufpointer, _bufpointer, bufsize); memmov(bufpointer, _bufpointer, bufsize);
@ -224,75 +240,25 @@ void TWebBrowser::ParseHtml(dword _bufpointer, _bufsize){
if (!is_html) goto _DEFAULT; if (!is_html) goto _DEFAULT;
bufpos++; bufpos++;
switch (ESBYTE[bufpos]) { switch (ESBYTE[bufpos]) {
case '!': case '!': case '/': case '?':
case '/': case 'a'...'z': case 'A'...'Z':
case '?':
case 'a'...'z':
case 'A'...'Z':
goto _TAG; goto _TAG;
default: default:
goto _DEFAULT; goto _DEFAULT;
} }
_TAG: _TAG:
if (!strncmp(bufpos,"!--",3)) if (tag.parse_tag(#bufpos, bufpointer + bufsize)) {
{
bufpos+=3;
//STRSTR
while (strncmp(bufpos,"-->",3)!=0) && (bufpos < bufpointer + bufsize)
{
bufpos++;
}
bufpos+=2;
break;
}
tag.reset();
if (ESBYTE[bufpos] == '/') {
tag.opened = false;
bufpos++;
}
ignor_param=false;
while (ESBYTE[bufpos] !='>') && (bufpos < bufpointer + bufsize) //ïîëó÷àåì òåã è åãî ïàðàìåòðû
//&& (!chrnum(#tag.params,'\"') % 2) //<a title="<small>ATI</small><br>9800xt" href="vgamuseum.ru/9800xt">
{
bukva = ESBYTE[bufpos];
if (__isWhite(bukva)) bukva = ' ';
if (!ignor_param) && (bukva!=' ') {
if (strlen(#tag.name)+1<sizeof(tag.name)) chrcat(#tag.name, bukva);
} else {
ignor_param = true;
if (strlen(#tag.params)+1<sizeof(tag.params)) strcat(#tag.params, #bukva);
//chrncat(#tag.params, bukva, sizeof(tag.params)-1);
}
bufpos++;
}
strlwr(#tag.name);
// ignore text inside the next tags
if (tag.is("script")) || (tag.is("style")) || (tag.is("binary")) || (tag.is("select")) {
sprintf(#tag.params, "</%s>", #tag.name);
if (j = strstri(bufpos, #tag.params)) bufpos = j-1;
break;
}
if (tag.name[strlen(#tag.name)-1]=='/') tag.name[strlen(#tag.name)-1]=NULL; //for br/ !!!!!!!!
if (tag.params) tag.parse_params();
if (tag.name) {
CheckForLineBreak(); CheckForLineBreak();
Paint(); Paint();
if (tag.name) { $push cur_encoding
EAX = cur_encoding; SetStyle();
$push eax $pop eax
SetStyle(); // The thing is that UTF if longer than other encodings.
$pop eax // So if encoding was changed from UTF to DOS than $bufpos position got wrong,
// The thing is that UTF if longer than other encodings. // and we have to start parse from the very beginning
// So if encoding was changed to UTF than $bufpos position is wrong now, if (EAX != cur_encoding) && (cur_encoding == CH_UTF8) {
// and we have to start parse from the very beginning ParseHtml(bufpointer, bufsize);
if (EAX != cur_encoding) && (cur_encoding == CH_UTF8) { return;
ParseHtml(bufpointer, bufsize);
return;
}
} }
} }
break; break;
@ -305,9 +271,8 @@ void TWebBrowser::ParseHtml(dword _bufpointer, _bufsize){
NewLine(); NewLine();
list.count = draw_y; list.count = draw_y;
DrawBuf.bufh = math.max(list.visible, draw_y); canvas.bufh = math.max(list.visible, draw_y);
debugval("DrawBuf.bufh", DrawBuf.bufh); buf_data = realloc(buf_data, canvas.bufh * canvas.bufw * 4 + 8);
buf_data = realloc(buf_data, DrawBuf.bufh * DrawBuf.bufw * 4 + 8);
list.CheckDoesValuesOkey(); list.CheckDoesValuesOkey();
anchors.current = NULL; anchors.current = NULL;
@ -346,330 +311,6 @@ bool TWebBrowser::CheckForLineBreak()
return true; return true;
} }
//============================================================================================ //============================================================================================
void TWebBrowser::SetStyle() {
char img_path[4096]=0;
dword imgbuf[44];
dword cur_img;
int img_x, img_y, img_w, img_h;
dword value;
if (value = tag.get_value_of("name=")) || (value = tag.get_value_of("id=")) {
anchors.add(value, draw_y);
if (anchors.current) && (streq(value, #anchors.current+1)) {
list.first = draw_y;
anchors.current = NULL;
}
}
if (tag.is("html")) {
t_html = tag.opened;
return;
}
if (tag.is("title")) {
style.tag_title = tag.opened;
if (!tag.opened) DrawTitle(#header);
return;
}
if (tag.is("body")) {
t_body = tag.opened;
if (value = tag.get_value_of("link=")) link_color_default = GetColor(value);
if (value = tag.get_value_of("alink=")) link_color_active = GetColor(value);
if (value = tag.get_value_of("text=")) text_colors.set(0, GetColor(value));
if (value = tag.get_value_of("bgcolor=")) {
style.bg_color = page_bg = GetColor(value);
DrawBuf.Fill(0, page_bg);
}
// Autodetecting encoding if no encoding was set
if (tag.opened) && (custom_encoding==-1) && (cur_encoding == CH_CP866) {
if (strstr(bufpointer, "\208\190")) ChangeEncoding(CH_UTF8);
else if (chrnum(bufpointer, '\246')>5) ChangeEncoding(CH_CP1251);
}
return;
}
if (tag.is("br")) { NewLine(); return; }
if (tag.is("b")) || (tag.is("strong")) || (tag.is("big")) || (tag.is("w:b")) {
style.b = tag.opened;
return;
}
if (tag.is("w:r")) && (!tag.opened) { style.b = false; return; }
if (tag.is("a")) {
if (tag.opened)
{
if (value = tag.get_value_of("href=")) && (!strstr(value,"javascript:"))
{
link = true;
links.add_link(value);
}
} else {
link = false;
style.bg_color = page_bg;
}
return;
}
if (tag.is("iframe")) && (value = tag.get_value_of("src=")) {
NewLine();
strcpy(#line, "IFRAME: ");
Paint();
link=true;
links.add_link(value);
strncpy(#line, value, sizeof(line)-1);
while (CheckForLineBreak()) {};
Paint();
link=false;
NewLine();
}
if (tag.is("font")) {
style.font = tag.opened;
style.bg_color = page_bg;
if (tag.opened)
{
if (value = tag.get_value_of("bg=")) style.bg_color = GetColor(value);
if (value = tag.get_value_of("color=")) {
text_colors.add(GetColor(value));
} else {
text_colors.add(text_colors.get_last());
}
}
else text_colors.pop();
return;
}
if (tag.is("div")) {
if (streq(#tag.prior,"div")) && (tag.opened) return;
if (!tag.opened) && (style.font) text_colors.pop();
NewLine();
return;
}
if (tag.is("header")) || (tag.is("article")) || (tag.is("footer")) || (tag.is("figure")) {
NewLine();
return;
}
if (tag.is("p")) || (tag.is("w:p")) {
IF (tag.prior[0] == 'h') || (streq(#tag.prior,"td")) || (streq(#tag.prior,"p")) return;
NewLine();
return;
}
if (tag.is("pre")) { style.pre = tag.opened; return; }
if (tag.is("td")) { if (tag.opened) AddCharToTheLine(' '); return; }
if (tag.is("tr")) { if (tag.opened) NewLine(); return; }
if (tag.is("button")) { style.button = tag.opened; stolbec++; return; }
if (tag.is("u")) || (tag.is("ins")) { style.u=tag.opened; return;}
if (tag.is("s")) || (tag.is("strike")) || (tag.is("del")) { style.s=tag.opened; return; }
if (tag.is("dl")) {
if (tag.opened) NewLine();
return;
}
if (tag.is("dd")) {
//NewLine();
//if (tag.opened) stolbec += 5; //stolbec overflow!
return;
}
if (tag.is("blockquote")) { style.blq = tag.opened; return; }
if (tag.is("code")) {
if (tag.opened) style.bg_color = 0xe4ffcb; else style.bg_color = page_bg;
style.pre = tag.opened; return;
}
if (tag.is("img")) {
value = tag.get_value_of("src=");
if (!value) goto NOIMG;
if (!strcmp(value + strrchr(value, '.'), "svg")) goto NOIMG;
if (streqrp(value, "data:")) {
if (!strstr(value, "base64,")) goto NOIMG;
value = EAX+7;
if (ESBYTE[value]==' ') value++;
cur_img = malloc(strlen(value));
base64_decode stdcall (value, cur_img, strlen(value));
img_decode stdcall (cur_img, EAX, 0);
$push eax
free(cur_img);
$pop eax
if (EAX) goto IMGOK; else goto NOIMG;
}
strlcpy(#img_path, value, sizeof(img_path)-1);
get_absolute_url(#img_path, history.current());
if (check_is_the_adress_local(#img_path)) {
img_from_file stdcall(#img_path);
if (EAX) goto IMGOK; else goto NOIMG;
}
if (cache.has(#img_path)) && (cache.current_size)
{
img_decode stdcall (cache.current_buf, cache.current_size, 0);
if (!EAX) goto NOIMG;
IMGOK:
cur_img = EAX;
img_h = ESDWORD[cur_img+8];
img_w = ESDWORD[cur_img+4];
if (img_w / 6 + stolbec > list.column_max) {
NewLine();
}
img_x = stolbec*list.font_w+3;
img_y = draw_y;
img_w = math.min(img_w, DrawBuf.bufw - img_x);
stolbec += img_w / 6;
if (stolbec > list.column_max) NewLine();
if (img_h > list.item_h + 5) {
draw_y += img_h - list.item_h;
NewLine();
}
if (link) links.add_text(img_x + list.x, img_y + list.y, img_w, img_h, 0);
if (img_y + img_h >= DrawBuf.bufh) DrawBuf.IncreaseBufSize();
if (ESDWORD[cur_img+20] != IMAGE_BPP32) {
img_convert stdcall(cur_img, 0, IMAGE_BPP32, 0, 0);
$push eax
img_destroy stdcall(cur_img);
$pop eax
cur_img = EAX;
if (!EAX) goto NOIMG;
}
imgbuf[04] = DrawBuf.bufw;
imgbuf[08] = DrawBuf.bufh;
imgbuf[20] = IMAGE_BPP32;
imgbuf[24] = buf_data+8;
img_blend stdcall(#imgbuf, cur_img, img_x, img_y, 0, 0, img_w, img_h);
img_destroy stdcall(cur_img);
return;
} else {
img_url.add(#img_path);
}
NOIMG:
if (value = tag.get_value_of("title=")) && (strlen(value)<sizeof(line)-3) && (value) sprintf(#line, "[%s]", value);
if (value = tag.get_value_of("alt=")) && (strlen(value)<sizeof(line)-3) && (value) sprintf(#line, "[%s]", value);
if (!line) {
if (!strncmp(#img_path, "data:", 5)) img_path=0;
replace_char(#img_path, '?', NULL, strlen(#img_path));
img_path[sizeof(line)-3] = '\0'; //prevent overflow in sprintf
sprintf(#line, "[%s]", #img_path+strrchr(#img_path, '/'));
line[50]= NULL;
}
while (CheckForLineBreak()) {};
text_colors.add(0x9A6F29);
style.image = true;
Paint();
style.image = false;
text_colors.pop();
return;
}
if (tag.is("h4")) {
NewLine();
NewLine();
style.h = tag.opened;
style.b = tag.opened;
}
if (tag.is("h1")) || (tag.is("h2")) || (tag.is("h3")) || (tag.is("caption")) {
style.h = tag.opened;
if (tag.opened) {
if (!style.pre) NewLine();
draw_y += 10;
zoom=2;
list.font_type |= 10011001b;
list.item_h = BASIC_LINE_H * 2 - 2;
if (tag.is("h1")) style.b = true;
} else {
if (tag.is("h1")) style.b = false;
NewLine();
zoom=1;
list.font_type = 10011000b;
list.item_h = BASIC_LINE_H;
}
return;
}
if (tag.is("dt")) {
style.tag_list.upd_level(tag.opened, DT);
if (tag.opened) NewLine();
return;
}
if (tag.is("ul")) {
style.tag_list.upd_level(tag.opened, UL);
if (!tag.opened) && (!style.pre) NewLine();
return;
}
if (tag.is("ol")) {
style.tag_list.upd_level(tag.opened, OL);
if (!tag.opened) && (!style.pre) NewLine();
return;
}
if (tag.is("li")) && (tag.opened)
{
if (!style.tag_list.level) style.tag_list.upd_level(1, UL);
if (!style.pre) NewLine();
if (style.tag_list.get_order_type() == UL) {
strcpy(#line, "\31 ");
stolbec = style.tag_list.level * 5 - 2;
}
if (style.tag_list.get_order_type() == OL) {
sprintf(#line, "%i. ", style.tag_list.inc_counter());
stolbec = style.tag_list.level * 5 - strlen(#line);
}
return;
}
if (tag.is("q"))
{
if (tag.opened) {
EAX = strlen(#line);
if (line[EAX-1] != ' ') chrcat(#line, ' ');
chrcat(#line, '\"');
}
if (!tag.opened) strcat(#line, "\" ");
return;
}
if (tag.is("hr")) {
if (value = tag.get_value_of("color=")) EDI = GetColor(value); else EDI = 0x999999;
$push edi;
NewLine();
$pop edi;
draw_y += 10;
DrawBuf.DrawBar(5, draw_y - 1, list.w-10, 1, EDI);
NewLine();
draw_y += 10;
return;
}
if (tag.is("meta")) {
if (streq(tag.get_value_of("http-equiv="), "refresh")) && (value = tag.get_value_of("content=")) {
if (value = strstri(value, "url=")) strcpy(#redirect, value);
}
}
if (custom_encoding == -1) && (tag.is("meta")) || (tag.is("?xml")) {
if (value = tag.get_value_of("charset=")) || (value = tag.get_value_of("content=")) || (value = tag.get_value_of("encoding="))
{
value += strrchr(value, '='); //search in content=
if (ESBYTE[value] == '"') value++;
strlwr(value);
if (streqrp(value,"utf-8")) || (streqrp(value,"utf8")) ChangeEncoding(CH_UTF8);
else if (streqrp(value,"windows-1251")) || (streqrp(value,"windows1251")) ChangeEncoding(CH_CP1251);
else if (streqrp(value,"dos")) || (streqrp(value,"cp-866")) ChangeEncoding(CH_CP866);
else if (streqrp(value,"iso-8859-5")) || (streqrp(value,"iso8859-5")) ChangeEncoding(CH_ISO8859_5);
else if (streqrp(value,"koi8-r")) || (streqrp(value,"koi8-u")) ChangeEncoding(CH_KOI8);
}
return;
}
}
//============================================================================================
void TWebBrowser::DrawScroller()
{
scroll_wv.max_area = list.count;
scroll_wv.cur_area = list.visible;
scroll_wv.position = list.first;
scroll_wv.all_redraw = 0;
scroll_wv.start_x = list.x + list.w;
scroll_wv.start_y = list.y;
scroll_wv.size_y = list.h;
scrollbar_v_draw(#scroll_wv);
}
//============================================================================================
void TWebBrowser::ChangeEncoding(int _new_encoding) void TWebBrowser::ChangeEncoding(int _new_encoding)
{ {
if (cur_encoding == _new_encoding) return; if (cur_encoding == _new_encoding) return;
@ -683,7 +324,6 @@ void TWebBrowser::ChangeEncoding(int _new_encoding)
//============================================================================================ //============================================================================================
void TWebBrowser::NewLine() void TWebBrowser::NewLine()
{ {
dword onleft, ontop;
static int empty_line=0; static int empty_line=0;
if (!stolbec) && (draw_y==BODY_MARGIN) return; if (!stolbec) && (draw_y==BODY_MARGIN) return;
@ -698,17 +338,26 @@ void TWebBrowser::NewLine()
empty_line=0; empty_line=0;
} }
onleft = list.x + BODY_MARGIN;
ontop = draw_y + list.y;
if (t_html) && (!t_body) return; if (t_html) && (!t_body) return;
draw_y += list.item_h; draw_y += list.item_h;
if (style.blq) stolbec = 6; else stolbec = 0; if (style.blq) stolbec = 6; else stolbec = 0;
stolbec += style.tag_list.level * 5; stolbec += style.tag_list.level * 5;
if (debug_mode) debugln(NULL);
} }
//============================================================================================ //============================================================================================
scroll_bar scroll_wv =
{ 15,NULL,NULL,NULL,0,2,NULL,
0,0,0xeeeeee,0xBBBbbb,0xeeeeee};
void TWebBrowser::DrawPage() void TWebBrowser::DrawPage()
{ {
DrawBuf.Show(list.first, list.h); scroll_wv.max_area = list.count;
DrawScroller(); scroll_wv.cur_area = list.visible;
scroll_wv.position = list.first;
scroll_wv.all_redraw = 0;
scroll_wv.start_x = list.x + list.w;
scroll_wv.start_y = list.y;
scroll_wv.size_y = list.h;
scrollbar_v_draw(#scroll_wv);
canvas.Show(list.first, list.h);
} }

View File

@ -1,195 +1,78 @@
//Íàäî áóäåò ïåðåäåëàòü íà "äåðåâî ïîèñêà" èëè, ÷òî-òî ïîäîáíîå collection_int text_colors;
//áóäåò íå÷èòàáåëüíî, çàòî ìåíüøå è áûñòåå
struct color_spec { struct color_spec {
char *name; char *name;
int rgb; int rgb;
}; };
collection_int text_colors;
struct color_spec color_specs[] = { struct color_spec color_specs[] = {
"aliceblue", 0xF0F8FF, "aliceblue", 0xF0F8FF, "antiquewhite", 0xFAEBD7, "aqua", 0x00FFFF, "aquamarine", 0x7FFFD4,
"antiquewhite", 0xFAEBD7, "azure", 0xF0FFFF, "beige", 0xF5F5DC, "bisque", 0xFFE4C4, "black", 0x000000,
"aqua", 0x00FFFF, "blanchedalmond", 0xFFEBCD, "blue", 0x0000FF, "blueviolet", 0x8A2BE2, "brown", 0xA52A2A,
"aquamarine", 0x7FFFD4, "burlywood", 0xDEB887, "cadetblue", 0x5F9EA0, "chartreuse", 0x7FFF00, "chocolate", 0xD2691E,
"azure", 0xF0FFFF, "coral", 0xFF7F50, "cornflowerblue", 0x6495ED, "cornsilk", 0xFFF8DC, "crimson", 0xDC143C,
"beige", 0xF5F5DC, "cyan", 0x00FFFF, "darkblue", 0x00008B, "darkcyan", 0x008B8B, "darkgoldenrod", 0xB8860B,
"bisque", 0xFFE4C4, "darkgray", 0xA9A9A9, "darkgreen", 0x006400, "darkkhaki", 0xBDB76B, "darkmagenta", 0x8B008B,
"black", 0x000000, "darkolivegreen", 0x556B2F, "darkorange", 0xFF8C00, "darkorchid", 0x9932CC, "darkred", 0x8B0000,
"blanchedalmond", 0xFFEBCD, "darksalmon", 0xE9967A, "darkseagreen", 0x8FBC8F, "darkslateblue", 0x483D8B, "darkslategray", 0x2F4F4F,
"blue", 0x0000FF, "darkturquoise", 0x00CED1, "darkviolet", 0x9400D3, "deeppink", 0xFF1493, "deepskyblue", 0x00BFFF,
"blueviolet", 0x8A2BE2, "dimgray", 0x696969, "dodgerblue", 0x1E90FF, "firebrick", 0xB22222, "floralwhite", 0xFFFAF0,
"brown", 0xA52A2A, "forestgreen", 0x228B22, "fuchsia", 0xFF00FF, "gainsboro", 0xDCDCDC, "ghostwhite", 0xF8F8FF,
"burlywood", 0xDEB887, "gold", 0xFFD700, "goldenrod", 0xDAA520, "gray", 0x808080, "green", 0x008000,
"cadetblue", 0x5F9EA0, "greenyellow", 0xADFF2F, "honeydew", 0xF0FFF0, "hotpink", 0xFF69B4, "indianred", 0xCD5C5C,
"chartreuse", 0x7FFF00, "indigo", 0x4B0082, "ivory", 0xFFFFF0, "khaki", 0xF0E68C, "lavender", 0xE6E6FA,
"chocolate", 0xD2691E, "lavenderblush", 0xFFF0F5, "lawngreen", 0x7CFC00, "lemonchiffon", 0xFFFACD, "lightblue", 0xADD8E6,
"coral", 0xFF7F50, "lightcoral", 0xF08080, "lightcyan", 0xE0FFFF, "lightgreen", 0x90EE90, "lightgrey", 0xD3D3D3,
"cornflowerblue", 0x6495ED, "lightpink", 0xFFB6C1, "lightsalmon", 0xFFA07A, "lightseagreen", 0x20B2AA, "lightskyblue", 0x87CEFA,
"cornsilk", 0xFFF8DC, "lightslategray", 0x778899, "lightsteelblue", 0xB0C4DE, "lightyellow", 0xFFFFE0, "lime", 0x00FF00,
"crimson", 0xDC143C, "limegreen", 0x32CD32, "linen", 0xFAF0E6, "magenta", 0xFF00FF, "maroon", 0x800000,
"cyan", 0x00FFFF, "mediumaquamarine", 0x66CDAA, "mediumblue", 0x0000CD, "mediumorchid", 0xBA55D3, "mediumpurple", 0x9370DB,
"darkblue", 0x00008B, "mediumseagreen", 0x3CB371, "mediumslateblue", 0x7B68EE, "mediumspringgreen",0x00FA9A, "mediumturquoise", 0x48D1CC,
"darkcyan", 0x008B8B, "mediumvioletred", 0xC71585, "midnightblue", 0x191970, "mintcream", 0xF5FFFA, "mistyrose", 0xFFE4E1,
"darkgoldenrod", 0xB8860B, "moccasin", 0xFFE4B5, "navajowhite", 0xFFDEAD, "navy", 0x000080, "oldlace", 0xFDF5E6,
"darkgray", 0xA9A9A9, "olive", 0x808000, "olivedrab", 0x6B8E23, "orange", 0xFFA500, "orangered", 0xFF4500,
"darkgreen", 0x006400, "orchid", 0xDA70D6, "palegoldenrod", 0xEEE8AA, "palegreen", 0x98FB98, "paleturquoise", 0xAFEEEE,
"darkkhaki", 0xBDB76B, "palevioletred", 0xDB7093, "papayawhip", 0xFFEFD5, "peachpuff", 0xFFDAB9, "peru", 0xCD853F,
"darkmagenta", 0x8B008B, "pink", 0xFFC0CB, "plum", 0xDDA0DD, "powderblue", 0xB0E0E6, "purple", 0x800080,
"darkolivegreen", 0x556B2F, "red", 0xFF0000, "rosybrown", 0xBC8F8F, "royalblue", 0x4169E1, "saddlebrown", 0x8B4513,
"darkorange", 0xFF8C00, "salmon", 0xFA8072, "sandybrown", 0xF4A460, "seagreen", 0x2E8B57, "seashell", 0xFFF5EE,
"darkorchid", 0x9932CC, "sienna", 0xA0522D, "silver", 0xC0C0C0, "skyblue", 0x87CEEB, "slateblue", 0x6A5ACD,
"darkred", 0x8B0000, "slategray", 0x708090, "snow", 0xFFFAFA, "springgreen", 0x00FF7F, "steelblue", 0x4682B4,
"darksalmon", 0xE9967A, "tan", 0xD2B48C, "teal", 0x008080, "thistle", 0xD8BFD8, "tomato", 0xFF6347,
"darkseagreen", 0x8FBC8F, "turquoise", 0x40E0D0, "violet", 0xEE82EE, "wheat", 0xF5DEB3, "white", 0xFFFFFF,
"darkslateblue", 0x483D8B, "whitesmoke", 0xF5F5F5, "yellow", 0xFFFF00, "yellowgreen", 0x9ACD32, 0};
"darkslategray", 0x2F4F4F,
"darkturquoise", 0x00CED1,
"darkviolet", 0x9400D3,
"deeppink", 0xFF1493,
"deepskyblue", 0x00BFFF,
"dimgray", 0x696969,
"dodgerblue", 0x1E90FF,
"firebrick", 0xB22222,
"floralwhite", 0xFFFAF0,
"forestgreen", 0x228B22,
"fuchsia", 0xFF00FF,
"gainsboro", 0xDCDCDC,
"ghostwhite", 0xF8F8FF,
"gold", 0xFFD700,
"goldenrod", 0xDAA520,
"gray", 0x808080,
"green", 0x008000,
"greenyellow", 0xADFF2F,
"honeydew", 0xF0FFF0,
"hotpink", 0xFF69B4,
"indianred", 0xCD5C5C,
"indigo", 0x4B0082,
"ivory", 0xFFFFF0,
"khaki", 0xF0E68C,
"lavender", 0xE6E6FA,
"lavenderblush", 0xFFF0F5,
"lawngreen", 0x7CFC00,
"lemonchiffon", 0xFFFACD,
"lightblue", 0xADD8E6,
"lightcoral", 0xF08080,
"lightcyan", 0xE0FFFF,
"lightgoldenrodyellow", 0xFAFAD2,
"lightgreen", 0x90EE90,
"lightgrey", 0xD3D3D3,
"lightpink", 0xFFB6C1,
"lightsalmon", 0xFFA07A,
"lightseagreen", 0x20B2AA,
"lightskyblue", 0x87CEFA,
"lightslategray", 0x778899,
"lightsteelblue", 0xB0C4DE,
"lightyellow", 0xFFFFE0,
"lime", 0x00FF00,
"limegreen", 0x32CD32,
"linen", 0xFAF0E6,
"magenta", 0xFF00FF,
"maroon", 0x800000,
"mediumaquamarine", 0x66CDAA,
"mediumblue", 0x0000CD,
"mediumorchid", 0xBA55D3,
"mediumpurple", 0x9370DB,
"mediumseagreen", 0x3CB371,
"mediumslateblue", 0x7B68EE,
"mediumspringgreen",0x00FA9A,
"mediumturquoise",0x48D1CC,
"mediumvioletred",0xC71585,
"midnightblue", 0x191970,
"mintcream", 0xF5FFFA,
"mistyrose", 0xFFE4E1,
"moccasin", 0xFFE4B5,
"navajowhite", 0xFFDEAD,
"navy", 0x000080,
"oldlace", 0xFDF5E6,
"olive", 0x808000,
"olivedrab", 0x6B8E23,
"orange", 0xFFA500,
"orangered", 0xFF4500,
"orchid", 0xDA70D6,
"palegoldenrod", 0xEEE8AA,
"palegreen", 0x98FB98,
"paleturquoise", 0xAFEEEE,
"palevioletred", 0xDB7093,
"papayawhip", 0xFFEFD5,
"peachpuff", 0xFFDAB9,
"peru", 0xCD853F,
"pink", 0xFFC0CB,
"plum", 0xDDA0DD,
"powderblue", 0xB0E0E6,
"purple", 0x800080,
"red", 0xFF0000,
"rosybrown", 0xBC8F8F,
"royalblue", 0x4169E1,
"saddlebrown", 0x8B4513,
"salmon", 0xFA8072,
"sandybrown", 0xF4A460,
"seagreen", 0x2E8B57,
"seashell", 0xFFF5EE,
"sienna", 0xA0522D,
"silver", 0xC0C0C0,
"skyblue", 0x87CEEB,
"slateblue", 0x6A5ACD,
"slategray", 0x708090,
"snow", 0xFFFAFA,
"springgreen", 0x00FF7F,
"steelblue", 0x4682B4,
"tan", 0xD2B48C,
"teal", 0x008080,
"thistle", 0xD8BFD8,
"tomato", 0xFF6347,
"turquoise", 0x40E0D0,
"violet", 0xEE82EE,
"wheat", 0xF5DEB3,
"white", 0xFFFFFF,
"whitesmoke", 0xF5F5F5,
"yellow", 0xFFFF00,
"yellowgreen", 0x9ACD32,
0};
dword StrToCol(char* htmlcolor)
{
dword j=1,
color=0,
textlen=0;
char ch=0x00;
if (ESBYTE[htmlcolor]<>'#') return text_colors.get(0);
textlen = strlen(htmlcolor);
if (textlen==7) || (textlen==4)
{
FOR (; j<textlen; j++)
{
ch=ESBYTE[htmlcolor+j];
IF ((ch>='0') && (ch<='9')) ch -= '0';
IF ((ch>='A') && (ch<='F')) ch -= 'A'-10;
IF ((ch>='a') && (ch<='f')) ch -= 'a'-10;
color = color*0x10 + ch;
if (textlen==4) color = color*0x10 + ch; //#abc ->> #aabbcc (ñëàâà âèêèïåäèè!!1)
}
return color;
}
return text_colors.get(0);
}
dword GetColor(char* color_str) dword GetColor(char* color_str)
{ {
int ii; int ii;
dword textlen=0;
dword color=0;
strlwr(color_str);
if (ESBYTE[color_str] == '#') if (ESBYTE[color_str] == '#')
return StrToCol(color_str); {
textlen = strlen(color_str);
if (textlen==7) || (textlen==4)
{
FOR (ii=1; ii<textlen; ii++)
{
BL = ESBYTE[color_str+ii];
IF ((BL>='0') && (BL<='9')) BL -= '0';
//IF ((BL>='A') && (BL<='F')) BL -= 'A'-10;
IF ((BL>='a') && (BL<='f')) BL -= 'a'-10;
color = color*0x10 + BL;
if (textlen==4) color = color*0x10 + BL; //#abc ->> #aabbcc
}
return color;
}
}
else else
{
for (ii=0; color_specs[ii].name!=0; ii++) for (ii=0; color_specs[ii].name!=0; ii++)
{ {
if (!strcmpi(color_str, color_specs[ii].name)) return color_specs[ii].rgb; if (streq(color_str, color_specs[ii].name))
return color_specs[ii].rgb;
} }
}
return text_colors.get(0); return text_colors.get(0);
} }

View File

@ -7,51 +7,108 @@ struct _tag
bool opened; bool opened;
collection attributes; collection attributes;
collection values; collection values;
dword value;
bool is(); bool is();
bool reset(); bool parse_tag();
bool parse_params(); void debug_tag();
bool get_next_param(); bool get_next_param();
dword get_value_of(); dword get_value_of();
} tag=0; } tag=0;
bool _tag::is(dword _text) bool _tag::is(dword _text)
{ {
if ( !strcmp(#tag.name, _text) ) { if ( !strcmp(#name, _text) ) {
return true; return true;
} else { } else {
return false; return false;
} }
} }
bool _tag::reset() bool _tag::parse_tag(dword _bufpos, bufend)
{ {
if (!name) return false; bool retok = true;
strcpy(#prior, #name); dword bufpos = ESDWORD[_bufpos];
name = NULL;
opened = true; dword closepos;
dword whitepos;
if (name) strcpy(#prior, #name); else prior = '\0';
name = '\0';
params = '\0';
attributes.drop(); attributes.drop();
values.drop(); values.drop();
return true;
if (!strncmp(bufpos,"!--",3))
{
bufpos+=3;
//STRSTR
while (strncmp(bufpos,"-->",3)!=0) && (bufpos < bufend)
{
bufpos++;
}
bufpos+=2;
goto _RET;
}
if (ESBYTE[bufpos] == '/') {
opened = false;
bufpos++;
} else {
opened = true;
}
closepos = strchr(bufpos, '>');
whitepos = strchrw(bufpos, bufend-bufpos);
if (whitepos > closepos) {
//no param
strncpy(#name, bufpos, math.min(closepos - bufpos, sizeof(tag.name)));
debug_tag();
params = '\0';
bufpos = closepos;
} else {
//we have param
strncpy(#name, bufpos, math.min(whitepos - bufpos, sizeof(tag.name)));
strncpy(#params, whitepos, math.min(closepos - whitepos, sizeof(tag.params)));
debug_tag();
bufpos = closepos;
while (get_next_param());
}
if (!name) {
retok = false;
goto _RET;
}
strlwr(#name);
// ignore text inside the next tags
if (is("script")) || (is("style")) || (is("binary")) || (is("select")) {
strcpy(#prior, #name);
sprintf(#name, "</%s>", #prior);
if (strstri(bufpos, #name)) bufpos = EAX-1;
retok = false;
goto _RET;
}
if (name[strlen(#name)-1]=='/') name[strlen(#name)-1]=NULL; //for <br/>
_RET:
ESDWORD[_bufpos] = bufpos;
return retok;
} }
bool _tag::parse_params() void _tag::debug_tag()
{ {
bool result = false;
if (!name) return false;
if (debug_mode) { if (debug_mode) {
debug("\n\ntag: "); debugln(#name); debugch('<');
debug("params: "); debugln(#params); if (!opened) debugch('/');
debugln(" "); debug(#name);
} debugln(">");
while (get_next_param()) { if (params) {
result = true; debug("params: ");
if (debug_mode) { debugln(#params+1);
debug("attribute: "); debugln(attributes.get(attributes.count-1));
debug("value: "); debugln(values.get(values.count-1));
debugln(" ");
} }
}; }
return result;
} }
bool _tag::get_next_param() bool _tag::get_next_param()
@ -111,6 +168,12 @@ bool _tag::get_next_param()
attributes.add(#attr); attributes.add(#attr);
values.add(#val); values.add(#val);
if (debug_mode) {
debug("atr: "); debugln(#attr);
debug("val: "); debugln(#val);
debugch('\n');
}
return true; return true;
} }
@ -118,8 +181,9 @@ dword _tag::get_value_of(dword _attr_name)
{ {
int pos = attributes.get_pos_by_name(_attr_name); int pos = attributes.get_pos_by_name(_attr_name);
if (pos == -1) { if (pos == -1) {
return 0; value = 0;
} else { } else {
return values.get(pos); value = values.get(pos);
} }
return value;
} }

View File

@ -0,0 +1,353 @@
void TWebBrowser::SetStyle()
{
if (tag.get_value_of("name=")) || (tag.get_value_of("id=")) {
anchors.add(tag.value, draw_y);
if (anchors.current) && (streq(tag.value, #anchors.current+1)) {
list.first = draw_y;
anchors.current = NULL;
}
}
if (tag.is("a")) { tag_a(); return; }
if (tag.is("p")) { tag_p(); return; }
if (tag.is("img")) { tag_img(); return; }
if (tag.is("div")) { tag_div(); return; }
if (tag.is("br")) { NewLine(); return; }
if (tag.is("header")) { NewLine(); return; }
if (tag.is("article")) { NewLine(); return; }
if (tag.is("footer")) { NewLine(); return; }
if (tag.is("figure")) { NewLine(); return; }
if (tag.is("w:p")) { NewLine(); return; }
if (tag.is("b")) { style.b = tag.opened; return; }
if (tag.is("strong")) { style.b = tag.opened; return; }
if (tag.is("big")) { style.b = tag.opened; return; }
if (tag.is("w:b")) { style.b = tag.opened; return; }
if (tag.is("u")) { style.u = tag.opened; return; }
if (tag.is("ins")) { style.u = tag.opened; return; }
if (tag.is("s")) { style.s = tag.opened; return; }
if (tag.is("strike")) { style.s = tag.opened; return; }
if (tag.is("del")) { style.s = tag.opened; return; }
if (tag.is("pre")) { style.pre = tag.opened; return; }
if (tag.is("blockquote")) { style.blq = tag.opened; return; }
if (tag.is("dl")) { if (tag.opened) NewLine(); return; }
if (tag.is("tr")) { if (tag.opened) NewLine(); return; }
if (tag.is("td")) { if (tag.opened) AddCharToTheLine(' '); return; }
if (tag.is("button")) { style.button = tag.opened; stolbec++; return; }
if (tag.is("w:r")) { if (!tag.opened) style.b = false; return; }
if (tag.is("h1")) { tag_h1234_caption(); return; }
if (tag.is("h2")) { tag_h1234_caption(); return; }
if (tag.is("h3")) { tag_h1234_caption(); return; }
if (tag.is("h4")) { tag_h1234_caption(); return; }
if (tag.is("font")) { tag_font(); return; }
if (tag.is("dt")) { tag_ol_ul_dt(); return; }
if (tag.is("ul")) { tag_ol_ul_dt(); return; }
if (tag.is("ol")) { tag_ol_ul_dt(); return; }
if (tag.is("li")) { tag_li(); return; }
if (tag.is("q")) { tag_q(); return; }
if (tag.is("hr")) { tag_hr(); return; }
if (tag.is("meta")) { tag_meta_xml(); return; }
if (tag.is("?xml")) { tag_meta_xml(); return; }
if (tag.is("code")) { tag_code(); return; }
if (tag.is("iframe")) { tag_iframe(); return; }
if (tag.is("caption")) { tag_h1234_caption(); return; }
if (tag.is("title")) { tag_title(); return; }
if (tag.is("body")) { tag_body(); return; }
if (tag.is("html")) { t_html = tag.opened; return; }
if (tag.is("dd")) {
//NewLine();
//if (tag.opened) stolbec += 5; //stolbec overflow!
return;
}
}
void TWebBrowser::tag_p()
{
IF (tag.prior[0] == 'h') || (streq(#tag.prior,"td")) || (streq(#tag.prior,"p")) return;
NewLine();
}
void TWebBrowser::tag_title()
{
style.title = tag.opened;
if (!tag.opened) DrawTitle(#header);
}
void TWebBrowser::tag_font()
{
style.font = tag.opened;
style.bg_color = page_bg;
if (tag.opened)
{
if (tag.get_value_of("bg=")) style.bg_color = GetColor(tag.value);
if (tag.get_value_of("color=")) {
text_colors.add(GetColor(tag.value));
} else {
text_colors.add(text_colors.get_last());
}
}
else text_colors.pop();
}
void TWebBrowser::tag_div()
{
if (streq(#tag.prior,"div")) && (tag.opened) return;
if (!tag.opened) && (style.font) text_colors.pop();
NewLine();
}
void TWebBrowser::tag_iframe()
{
if (tag.get_value_of("src=")) {
NewLine();
strcpy(#line, "IFRAME: ");
Paint();
link=true;
links.add_link(tag.value);
strncpy(#line, tag.value, sizeof(line)-1);
while (CheckForLineBreak()) {};
Paint();
link=false;
NewLine();
}
}
void TWebBrowser::tag_a()
{
if (tag.opened)
{
if (tag.get_value_of("href=")) && (!strstr(tag.value,"javascript:"))
{
link = true;
links.add_link(tag.value);
}
} else {
link = false;
style.bg_color = page_bg;
}
}
void TWebBrowser::tag_meta_xml()
{
if (custom_encoding == -1) if (tag.get_value_of("charset="))
|| (tag.get_value_of("content=")) || (tag.get_value_of("encoding="))
{
EDX = strrchr(tag.value, '=') + tag.value; //search in content=
if (ESBYTE[EDX] == '"') EDX++;
strlwr(EDX);
if (streqrp(EDX,"utf-8")) || (streqrp(EDX,"utf8")) ChangeEncoding(CH_UTF8);
else if (streqrp(EDX,"windows-1251")) || (streqrp(EDX,"windows1251")) ChangeEncoding(CH_CP1251);
else if (streqrp(EDX,"dos")) || (streqrp(EDX,"cp-866")) ChangeEncoding(CH_CP866);
else if (streqrp(EDX,"iso-8859-5")) || (streqrp(EDX,"iso8859-5")) ChangeEncoding(CH_ISO8859_5);
else if (streqrp(EDX,"koi8-r")) || (streqrp(EDX,"koi8-u")) ChangeEncoding(CH_KOI8);
}
if (streq(tag.get_value_of("http-equiv="), "refresh")) && (tag.get_value_of("content=")) {
if (tag.value = strstri(tag.value, "url=")) strcpy(#redirect, tag.value);
}
}
void TWebBrowser::tag_code()
{
if (style.pre = tag.opened) {
style.bg_color = 0xe4ffcb;
} else {
style.bg_color = page_bg;
}
}
void TWebBrowser::tag_ol_ul_dt()
{
char type = ESBYTE[#tag.name];
style.tag_list.upd_level(tag.opened, type);
switch(type)
{
case 'd':
if (tag.opened) NewLine();
break;
case 'u':
case 'o':
if (!tag.opened) && (!style.pre) NewLine();
}
}
void TWebBrowser::tag_li()
{
if (tag.opened) {
if (!style.tag_list.level) style.tag_list.upd_level(1, 'u');
if (!style.pre) NewLine();
if (style.tag_list.order_type() == 'u') {
strcpy(#line, "\31 ");
stolbec = style.tag_list.level * 5 - 2;
}
if (style.tag_list.order_type() == 'o') {
sprintf(#line, "%i. ", style.tag_list.inc_counter());
stolbec = style.tag_list.level * 5 - strlen(#line);
}
}
}
void TWebBrowser::tag_hr()
{
EAX = 0x999999;
if (tag.get_value_of("color=")) GetColor(tag.value);
$push eax;
NewLine();
$pop edi;
draw_y += 10;
canvas.DrawBar(5, draw_y - 1, list.w-10, 1, EDI);
NewLine();
draw_y += 10;
return;
}
void TWebBrowser::tag_body()
{
t_body = tag.opened;
if (tag.get_value_of("link=")) link_color_default = GetColor(tag.value);
if (tag.get_value_of("alink=")) link_color_active = GetColor(tag.value);
if (tag.get_value_of("text=")) text_colors.set(0, GetColor(tag.value));
if (tag.get_value_of("bgcolor=")) {
style.bg_color = page_bg = GetColor(tag.value);
canvas.Fill(0, page_bg);
}
// Autodetecting encoding if no encoding was set
if (tag.opened) && (custom_encoding==-1) && (cur_encoding == CH_CP866) {
if (strstr(bufpointer, "\208\190")) ChangeEncoding(CH_UTF8);
else if (chrnum(bufpointer, '\246')>5) ChangeEncoding(CH_CP1251);
}
}
void TWebBrowser::tag_q()
{
if (tag.opened) {
AddCharToTheLine(' ');
AddCharToTheLine('\"');
} else {
AddCharToTheLine('\"');
AddCharToTheLine(' ');
}
}
void TWebBrowser::tag_h1234_caption()
{
if (ESBYTE[#tag.name+1]=='4') {
NewLine();
NewLine();
style.h = tag.opened;
style.b = tag.opened;
} else {
style.h = tag.opened;
if (tag.opened) {
if (!style.pre) NewLine();
draw_y += 10;
zoom=2;
list.font_type |= 10011001b;
list.item_h = BASIC_LINE_H * 2 - 2;
if (tag.is("h1")) style.b = true;
} else {
if (tag.is("h1")) style.b = false;
NewLine();
zoom=1;
list.font_type = 10011000b;
list.item_h = BASIC_LINE_H;
}
}
}
void TWebBrowser::tag_img()
{
char img_path[4096]=0;
dword imgbuf[44];
dword cur_img;
int img_x, img_y, img_w, img_h;
if (!tag.get_value_of("src=")) goto NOIMG;
if (streqrp(tag.value, "data:")) {
if (!strstr(tag.value, "base64,")) goto NOIMG;
EDX = EAX+7;
if (ESBYTE[EDX]==' ') EDX++;
cur_img = malloc(strlen(EDX));
base64_decode stdcall (EDX, cur_img, strlen(EDX));
img_decode stdcall (cur_img, EAX, 0);
$push eax
free(cur_img);
$pop eax
if (EAX) goto IMGOK; else goto NOIMG;
}
if (!strcmp(tag.value + strrchr(tag.value, '.'), "svg")) goto NOIMG;
strlcpy(#img_path, tag.value, sizeof(img_path)-1);
get_absolute_url(#img_path, history.current());
if (check_is_the_adress_local(#img_path)) {
img_from_file stdcall(#img_path);
if (EAX) goto IMGOK; else goto NOIMG;
}
if (cache.has(#img_path)) {
img_decode stdcall (cache.current_buf, cache.current_size, 0);
if (EAX) goto IMGOK; else goto NOIMG;
} else {
img_url.add(#img_path);
goto NOIMG;
}
IMGOK:
cur_img = EAX;
img_h = ESDWORD[cur_img+8];
img_w = ESDWORD[cur_img+4];
if (img_w / 6 + stolbec > list.column_max) {
NewLine();
}
img_x = stolbec*list.font_w+3;
img_y = draw_y;
img_w = math.min(img_w, canvas.bufw - img_x);
stolbec += img_w / 6;
if (stolbec > list.column_max) NewLine();
if (img_h > list.item_h + 5) {
draw_y += img_h - list.item_h;
NewLine();
}
if (link) links.add_text(img_x + list.x, img_y + list.y, img_w, img_h, 0);
if (img_y + img_h >= canvas.bufh) canvas.IncreaseBufSize();
if (ESDWORD[cur_img+20] != IMAGE_BPP32) {
img_convert stdcall(cur_img, 0, IMAGE_BPP32, 0, 0);
$push eax
img_destroy stdcall(cur_img);
$pop eax
cur_img = EAX;
if (!EAX) goto NOIMG;
}
imgbuf[04] = canvas.bufw;
imgbuf[08] = canvas.bufh;
imgbuf[20] = IMAGE_BPP32;
imgbuf[24] = buf_data+8;
img_blend stdcall(#imgbuf, cur_img, img_x, img_y, 0, 0, img_w, img_h);
img_destroy stdcall(cur_img);
return;
NOIMG:
if (tag.get_value_of("title=")) || (tag.get_value_of("alt=")) {
strncpy(#img_path, tag.value, sizeof(line)-3);
sprintf(#line, "[%s]", #img_path);
} else {
if (streqrp(#img_path, "data:")) img_path=0;
replace_char(#img_path, '?', NULL, strlen(#img_path));
img_path[sizeof(line)-3] = '\0'; //prevent overflow in sprintf
sprintf(#line, "[%s]", #img_path+strrchr(#img_path, '/'));
line[50]= NULL;
}
while (CheckForLineBreak()) {};
text_colors.add(0x9A6F29);
style.image = true;
Paint();
style.image = false;
text_colors.pop();
}

View File

@ -6,7 +6,7 @@ char *unicode_symbols[]={
"#183","\31", "middot", "\31", "#183","\31", "middot", "\31",
"#149","-", "#149","-",
"#151","-", "#151","-",
"#160"," ", "nbsp", " ", "#160"," ", "nbsp", " ", "emsp", " ",
"#169","(c)", "copy", "(c)", "#169","(c)", "copy", "(c)",
"#171","<<", "laquo","<<", "#171","<<", "laquo","<<",
"#174","(r)", "reg", "(r)", "#174","(r)", "reg", "(r)",
@ -44,6 +44,8 @@ char *unicode_symbols[]={
"#9642", "-", //square in the middle of the line "#9642", "-", //square in the middle of the line
"#9658", ">", "#9658", ">",
"#9660", "v", "#9660", "v",
"#10094", "<",
"#10095", ">",
"#65122", "+", "#65122", "+",
"#8594", "->", "#8594", "->",

View File

@ -1,13 +1,12 @@
enum {DT=1, OL, UL};
struct LIST struct LIST
{ {
int level; int level;
int ordered[5]; char ordered[5];
int counter[5]; int counter[5];
void reset(); void reset();
void upd_level(); void upd_level();
int inc_counter(); int inc_counter();
int get_order_type(); char order_type();
}; };
void LIST::reset() void LIST::reset()
@ -15,12 +14,12 @@ void LIST::reset()
level = 0; level = 0;
} }
void LIST::upd_level(int direction, type) void LIST::upd_level(int direction, char type)
{ {
if (direction == 1) && (level<5) { if (direction == 1) && (level<5) {
level++; level++;
counter[level]=0; counter[level] = 0;
ordered[level]=type; ordered[level] = type;
} }
if (direction == 0) && (level>0) { if (direction == 0) && (level>0) {
level--; level--;
@ -33,7 +32,7 @@ int LIST::inc_counter()
return counter[level]; return counter[level];
} }
int LIST::get_order_type() char LIST::order_type()
{ {
return ordered[level]; return ordered[level];
} }

View File

@ -41,7 +41,7 @@
// DATA // // DATA //
// // // //
//===================================================// //===================================================//
char version[]="WebView 3.06"; char version[]="WebView 3.1";
#define DEFAULT_URL URL_SERVICE_HOMEPAGE #define DEFAULT_URL URL_SERVICE_HOMEPAGE
@ -372,8 +372,8 @@ void draw_window()
bool BrowserWidthChanged() bool BrowserWidthChanged()
{ {
dword source_mode_holder; dword source_mode_holder;
if (WB1.list.w!=DrawBuf.bufw) { if (WB1.list.w!=canvas.bufw) {
DrawBuf.Init(WB1.list.x, WB1.list.y, WB1.list.w, 400*20); canvas.Init(WB1.list.x, WB1.list.y, WB1.list.w, 400*20);
if (!strncmp(history.current(),"http",4)) { if (!strncmp(history.current(),"http",4)) {
//nihuya ne izyashnoe reshenie, no pust' poka butet tak //nihuya ne izyashnoe reshenie, no pust' poka butet tak
source_mode_holder = source_mode; source_mode_holder = source_mode;

View File

@ -9,7 +9,7 @@
dword buf_data=0; dword buf_data=0;
struct DrawBufer { struct CANVAS {
dword bufx, bufy, bufw, bufh; dword bufx, bufy, bufw, bufh;
dword fill_color; dword fill_color;
@ -25,10 +25,10 @@ struct DrawBufer {
}; };
char draw_buf_not_enaught_ram[] = char draw_buf_not_enaught_ram[] =
"'DrawBufer requested %i MB more memory than the system has. "'CANVAS requested %i MB more memory than the system has.
Application could be unstable.' -E"; Application could be unstable.' -E";
bool DrawBufer::Init(dword i_bufx, i_bufy, i_bufw, i_bufh) bool CANVAS::Init(dword i_bufx, i_bufy, i_bufw, i_bufh)
{ {
bufx = i_bufx; bufx = i_bufx;
bufy = i_bufy; bufy = i_bufy;
@ -42,14 +42,14 @@ bool DrawBufer::Init(dword i_bufx, i_bufy, i_bufw, i_bufh)
return true; return true;
} }
void DrawBufer::Fill(dword start_pointer, i_fill_color) void CANVAS::Fill(dword start_pointer, i_fill_color)
{ {
dword max_i = bufw * bufh * 4 - start_pointer/4; dword max_i = bufw * bufh * 4 - start_pointer/4;
fill_color = i_fill_color; fill_color = i_fill_color;
@MEMSETD(buf_data+start_pointer+8, max_i, fill_color); @MEMSETD(buf_data+start_pointer+8, max_i, fill_color);
} }
void DrawBufer::DrawBar(dword x, y, w, h, color) void CANVAS::DrawBar(dword x, y, w, h, color)
{ {
dword i, j; dword i, j;
if (y + h >= bufh) IncreaseBufSize(); if (y + h >= bufh) IncreaseBufSize();
@ -60,7 +60,7 @@ void DrawBufer::DrawBar(dword x, y, w, h, color)
} }
} }
void DrawBufer::WriteText(dword x, y, byte fontType, dword color, str_offset, strlen) void CANVAS::WriteText(dword x, y, byte fontType, dword color, str_offset, strlen)
{ {
#define BUGFIX_32000 32000 #define BUGFIX_32000 32000
dword ydiv=0; dword ydiv=0;
@ -89,13 +89,13 @@ void DrawBufer::WriteText(dword x, y, byte fontType, dword color, str_offset, st
} }
} }
void DrawBufer::PutPixel(dword x, y, color) void CANVAS::PutPixel(dword x, y, color)
{ {
dword pos = y*bufw+x*4+8+buf_data; dword pos = y*bufw+x*4+8+buf_data;
ESDWORD[pos] = color; ESDWORD[pos] = color;
} }
void DrawBufer::AlignRight(dword x,y,w,h, content_width) void CANVAS::AlignRight(dword x,y,w,h, content_width)
{ {
dword i, j, l; dword i, j, l;
dword content_left = w - content_width / 2; dword content_left = w - content_width / 2;
@ -108,7 +108,7 @@ void DrawBufer::AlignRight(dword x,y,w,h, content_width)
} }
} }
void DrawBufer::AlignCenter(dword x,y,w,h, content_width) void CANVAS::AlignCenter(dword x,y,w,h, content_width)
{ {
dword i, j, l; dword i, j, l;
dword content_left = w - content_width / 2; dword content_left = w - content_width / 2;
@ -121,12 +121,12 @@ void DrawBufer::AlignCenter(dword x,y,w,h, content_width)
} }
} }
void DrawBufer::Show(dword _y_offset, _h) void CANVAS::Show(dword _y_offset, _h)
{ {
PutPaletteImage(_y_offset * bufw * 4 + buf_data+8, bufw, _h, bufx, bufy, 32, 0); PutPaletteImage(_y_offset * bufw * 4 + buf_data+8, bufw, _h, bufx, bufy, 32, 0);
} }
void DrawBufer::IncreaseBufSize() void CANVAS::IncreaseBufSize()
{ {
static dword bufh_initial; static dword bufh_initial;
dword alloc_size; dword alloc_size;

View File

@ -407,6 +407,39 @@ inline fastcall void strcat( EDI, ESI)
ESBYTE[dst] = 0; ESBYTE[dst] = 0;
} }
inline fastcall void chrcat(ESI, DI)
{
while (ESBYTE[ESI]) ESI++;
ESBYTE[ESI] = DI;
ESI++;
ESBYTE[ESI] = 0;
}
inline fastcall void chrncat(EDI, AL, EDX)
{
while (ESBYTE[EDI]) && (EDX) {
EDI++;
EDX--;
}
ESBYTE[EDI] = AL;
EDI++;
ESBYTE[EDI] = 0;
}
/*
inline dword strchr(ESI, BL)
{
loop()
{
AL = DSBYTE[ESI];
if(!AL)return 0;
if(AL==BL)return ESI;
ESI++;
}
}
*/
/*
:void chrncat(dword dst, unsigned char s, dword len) :void chrncat(dword dst, unsigned char s, dword len)
{ {
while (ESBYTE[dst]) && (len) { while (ESBYTE[dst]) && (len) {
@ -418,14 +451,7 @@ inline fastcall void strcat( EDI, ESI)
ESBYTE[dst+1] = 0; ESBYTE[dst+1] = 0;
} }
} }
*/
inline fastcall void chrcat(ESI, DI)
{
while (ESBYTE[ESI]) ESI++;
ESBYTE[ESI] = DI;
ESI++;
ESBYTE[ESI] = 0;
}
inline dword strchr(dword shb;char s) inline dword strchr(dword shb;char s)
{ {
@ -439,6 +465,18 @@ inline dword strchr(dword shb;char s)
} }
} }
inline dword strchrw(dword str, len)
{
len += str;
loop()
{
if(!DSBYTE[str])return 0;
if (__isWhite(DSBYTE[str])) return str;
str++;
if (str >= len) return 0;
}
}
inline fastcall signed int strrchr( ESI,BL) inline fastcall signed int strrchr( ESI,BL)
{ {
int jj=0, last=0; int jj=0, last=0;

View File

@ -106,7 +106,7 @@ struct THEME
char default_dir[] = "/rd/1"; char default_dir[] = "/rd/1";
od_filter filter2 = { 33, "TXT\0ASM\0HTM\0HTML\0C\0H\0C--\0H--\0CPP\0\0" }; od_filter filter2 = { 33, "TXT\0ASM\0HTM\0HTML\0C\0H\0C--\0H--\0CPP\0\0" };
DrawBufer DrawBuf; CANVAS canvas;
dword cursor_pos=0; dword cursor_pos=0;

View File

@ -7,7 +7,7 @@ void ParseAndPaint()
Parse(); Parse();
list.visible = list.h / list.item_h; list.visible = list.h / list.item_h;
DrawBuf.Init(list.x, list.y, list.w, list.visible+1*list.item_h); canvas.Init(list.x, list.y, list.w, list.visible+1*list.item_h);
DrawPage(); DrawPage();
} }
@ -64,7 +64,7 @@ void PaintVisible()
line_bg = theme.bg; line_bg = theme.bg;
if (selection.start_y < absolute_y) && (selection.end_y > absolute_y) line_bg = selection.color; if (selection.start_y < absolute_y) && (selection.end_y > absolute_y) line_bg = selection.color;
DrawBuf.DrawBar(0, ydraw, list.w, list.item_h, line_bg); canvas.DrawBar(0, ydraw, list.w, list.item_h, line_bg);
selection.draw(absolute_y); selection.draw(absolute_y);
@ -75,17 +75,17 @@ void PaintVisible()
if (s2 > 0) break; if (s2 > 0) break;
if (s1 > 0) && (s2 < 0) { if (s1 > 0) && (s2 < 0) {
DrawBuf.DrawBar(search.found.get(ff) - lines.get(absolute_y) * list.font_w + 3, canvas.DrawBar(search.found.get(ff) - lines.get(absolute_y) * list.font_w + 3,
ydraw, strlen(#found_text) * list.font_w, list.item_h, theme.found); ydraw, strlen(#found_text) * list.font_w, list.item_h, theme.found);
search_next = false; search_next = false;
} }
} }
if (absolute_y<list.count) DrawBuf.WriteText(3, ydraw+3, list.font_type, theme.text, if (absolute_y<list.count) canvas.WriteText(3, ydraw+3, list.font_type, theme.text,
lines.get(absolute_y), lines.len(absolute_y)); lines.get(absolute_y), lines.len(absolute_y));
} }
PutPaletteImage(buf_data+8, DrawBuf.bufw, list.h, list.x, list.y, 32, 0); PutPaletteImage(buf_data+8, canvas.bufw, list.h, list.x, list.y, 32, 0);
if (swapped_selection) selection.swap_start_end(); if (swapped_selection) selection.swap_start_end();
} }

View File

@ -25,7 +25,7 @@ bool SELECTION::is_active()
void SELECTION::draw_line(dword x,y,w) void SELECTION::draw_line(dword x,y,w)
{ {
DrawBuf.DrawBar(x, y - list.first * list.item_h, w, list.item_h, color); canvas.DrawBar(x, y - list.first * list.item_h, w, list.item_h, color);
} }
void SELECTION::draw(int i) void SELECTION::draw(int i)
@ -35,12 +35,12 @@ void SELECTION::draw(int i)
else if (start_y == i) draw_line(start_x * list.font_w+2, start_y, list.w -2- calc(start_x * list.font_w)); else if (start_y == i) draw_line(start_x * list.font_w+2, start_y, list.w -2- calc(start_x * list.font_w));
else if (end_y == i) draw_line(0, end_y, end_x * list.font_w+2); else if (end_y == i) draw_line(0, end_y, end_x * list.font_w+2);
//only for debug: //only for debug:
//DrawBuf.DrawBar(start_x * list.font_w + 2, start_y * list.item_h, 2, list.item_h, 0x00FF00); //canvas.DrawBar(start_x * list.font_w + 2, start_y * list.item_h, 2, list.item_h, 0x00FF00);
//DrawBuf.DrawBar(end_x * list.font_w + 0, end_y * list.item_h, 2, list.item_h, 0xFF00FF); //canvas.DrawBar(end_x * list.font_w + 0, end_y * list.item_h, 2, list.item_h, 0xFF00FF);
} }
//DrawCursor //DrawCursor
if (list.cur_y >= list.first) && (list.cur_y <= list.first+list.visible) { if (list.cur_y >= list.first) && (list.cur_y <= list.first+list.visible) {
DrawBuf.DrawBar(list.cur_x * list.font_w + 2, list.cur_y - list.first * list.item_h, 2, list.item_h, theme.cursor); canvas.DrawBar(list.cur_x * list.font_w + 2, list.cur_y - list.first * list.item_h, 2, list.item_h, theme.cursor);
} }
} }