From cd41d0ab2624f40325ee5db48c687bb513a53509 Mon Sep 17 00:00:00 2001 From: "Kirill Lipatov (Leency)" Date: Mon, 16 Jul 2012 11:52:03 +0000 Subject: [PATCH] HTMLv 0.96b git-svn-id: svn://kolibrios.org@2874 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/network/htmlv/browser/HTMLv.c | 8 +- programs/network/htmlv/browser/History.txt | 12 ++ programs/network/htmlv/browser/TWB.h | 72 ++++++---- .../htmlv/browser/include/acid_0.1.htm | 7 +- .../network/htmlv/browser/include/menu_rmb.h | 19 +-- .../network/htmlv/browser/include/some_code.h | 10 +- programs/network/htmlv/lib/encoding.h | 31 ++--- programs/network/htmlv/lib/file_system.h | 128 +++++++++--------- programs/network/htmlv/lib/kolibri.h | 66 ++++++--- programs/network/htmlv/lib/mem.h | 110 +++++++++++++++ programs/network/htmlv/lib/strings.h | 102 ++++++++++++-- 11 files changed, 401 insertions(+), 164 deletions(-) diff --git a/programs/network/htmlv/browser/HTMLv.c b/programs/network/htmlv/browser/HTMLv.c index 65d159aa86..38b99f5a50 100644 --- a/programs/network/htmlv/browser/HTMLv.c +++ b/programs/network/htmlv/browser/HTMLv.c @@ -22,7 +22,7 @@ #define URL param -char editURL[4096], +char editURL[sizeof(URL)], page_links[12000], header[300]; @@ -31,7 +31,7 @@ struct lines{ }; int mouse_dd; -edit_box edit1= {250,207,16,0xffffff,0x94AECE,0xffffff,0xffffff,0,248,#editURL,#mouse_dd,2,19,19}; +edit_box edit1= {250,207,16,0xffffff,0x94AECE,0xffffff,0xffffff,0,sizeof(editURL),#editURL,#mouse_dd,2,19,19}; scroll_bar scroll1 = { 18,200,398, 44,18,0,115,15,0,0xeeeeee,0xD2CED0,0x555555,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1}; //details in scroll_lib.h-- @@ -183,7 +183,7 @@ void SetElementSizes() void Draw_Window() { int j; - DefineAndDrawWindow(215,100,WIN_W,WIN_H,0x73,0x00E4DFE1,0,0,0); + DefineAndDrawWindow(215,100,WIN_W,WIN_H,0x73,0x00E4DFE1,0); GetProcessInfo(#Form, SelfInfo); if (Form.status_window>2) //если свернуто в заголовок, ничего не рисуем @@ -215,7 +215,7 @@ void Draw_Window() } int onLeft(dword right,left) {return Form.width-right-left;} -int onTop(dword down,up) {return Form.height-GetSkinWidth()-down-up;} +int onTop(dword down,up) {return Form.height-GetSkinHeight()-down-up;} stop: diff --git a/programs/network/htmlv/browser/History.txt b/programs/network/htmlv/browser/History.txt index 23ea764517..95b53c4e92 100644 --- a/programs/network/htmlv/browser/History.txt +++ b/programs/network/htmlv/browser/History.txt @@ -1,3 +1,15 @@ +16.07.12 - 0.96b +- небольшие улучшения в обработке ссылок и изображений; +- включение обработки разрывов строк через меню. + +14.07.12 - 0.96 +- исправлен баг со строкой адреса +- исправлен баг с незакрытыми тегами +- частично исправлен баг с длинными адресами урлов +- меню - новое окно + +22.06.12 - 0.95 + 22.06.12 - 0.94c - испрвлена регрессия со ссылками; - исправлена регрессия с ползунком; diff --git a/programs/network/htmlv/browser/TWB.h b/programs/network/htmlv/browser/TWB.h index 0a24a9c493..d4ac1b989d 100644 --- a/programs/network/htmlv/browser/TWB.h +++ b/programs/network/htmlv/browser/TWB.h @@ -8,7 +8,7 @@ dword char download_path[]="/rd/1/.download"; char search_path[]="http://nigma.ru/index.php?s="; -char version[]=" Text-based Browser 0.95"; +char version[]=" Text-based Browser 0.96b"; struct TWebBrowser { @@ -46,7 +46,7 @@ char line[500], tag[100], tagparam[10000], parametr[1200], - options[1000]; + options[4096]; #include "include\history.h" #include "include\colors.h" @@ -78,16 +78,24 @@ void TWebBrowser::Scan(int id) strcpy(#anchor, #URL+strrchr(#URL, '#')); URL[strrchr(#URL, '#')-1] = 0x00; //заглушка } - + GetNewUrl(); if (!strcmp(#URL + strlen(#URL) - 4, ".gif")) || (!strcmp(#URL + strlen(#URL) - 4, ".png")) || (!strcmp(#URL + strlen(#URL) - 4, ".jpg")) { + //if (strstr(#URL,"http:")) RunProgram("/sys/media/kiv", #URL); strcpy(#editURL, BrowserHistory.CurrentUrl()); strcpy(#URL, BrowserHistory.CurrentUrl()); return; } + if (!strcmpn(#URL,"mailto:", 7)) + { + RunProgram("@notify", #URL); + strcpy(#editURL, BrowserHistory.CurrentUrl()); + strcpy(#URL, BrowserHistory.CurrentUrl()); + return; + } OpenPage(); return; @@ -104,6 +112,13 @@ void TWebBrowser::Scan(int id) case 021: //Ctrl+U ReadHtml(_UTF); break; + case 004: //Ctrl+D + ReadHtml(_DOS); + break; + case 001: + if (!pre_text) pre_text=2; + else pre_text=0; + break; case BACK: if (!BrowserHistory.GoBack()) return; OpenPage(); @@ -186,18 +201,23 @@ void TWebBrowser::Scan(int id) } +char *ABSOLUTE_LINKS[]={ "http:", "mailto:", "ftp:", "/sys/", "/rd/", "/fd/", "/bd/", "/hd/", "/cd/", "/tmp/", 0}; +//dword TWebBrowser::GetNewUrl(dword CUR_URL, NEW_URL){ void TWebBrowser::GetNewUrl(){ - IF (!strcmp(get_URL_part(2),"./")) strcpy(#URL, #URL+2); //игнорим :) + int i; - if (URL[0] <> '/') - && (strcmp(get_URL_part(5),"http:")<>0) && (strcmp(get_URL_part(5),"mailt")<>0) && (strcmp(get_URL_part(5),"ftp:/")<>0) - { - strcpy(#editURL, BrowserHistory.CurrentUrl()); //достаём адрес текущей страницы + for (i=0; ABSOLUTE_LINKS[i]; i++) + if (!strcmpn(#URL, ABSOLUTE_LINKS[i], strlen(ABSOLUTE_LINKS[i]))) return; - _CUT_ST_LEVEL_MARK: + IF (!strcmpn(#URL,"./", 2)) strcpy(#URL, #URL+2); //игнорим :) + if (URL[0] == '/') strcpy(#URL, #URL+1); + + strcpy(#editURL, BrowserHistory.CurrentUrl()); //достаём адрес текущей страницы - if (editURL[strrchr(#editURL, '/')-2]<>'/') // если не http://pagename.ua <-- нахрена эта строка??? + _CUT_ST_LEVEL_MARK: + + if (editURL[strrchr(#editURL, '/')-2]<>'/') // если не http:// { editURL[strrchr(#editURL, '/')] = 0x00; //обрезаем её урл до последнего / } @@ -210,9 +230,9 @@ void TWebBrowser::GetNewUrl(){ } if (editURL[strlen(#editURL)-1]<>'/') strcat(#editURL, "/"); + strcat(#editURL, #URL); //клеим новый адрес strcpy(#URL, #editURL); - } } @@ -247,6 +267,7 @@ void TWebBrowser::OpenPage() strcpy(#editURL, #URL); BrowserHistory.AddUrl(); strcpy(#header, #version); + pre_text =0; if (!strcmp(get_URL_part(5),"http:"))) { KillProcess(downloader_id); //убиваем старый процесс @@ -266,7 +287,7 @@ void TWebBrowser::OpenPage() Draw_Window(); return; } - lines.first = lines.all = 0; + lines.first = lines.all =0; ReadHtml(_WIN); WB1.ShowPage(); } @@ -275,6 +296,7 @@ void TWebBrowser::OpenPage() void TWebBrowser::ShowPage() { edit1.size = edit1.pos = strlen(#editURL); + edit1.offset=0; edit_box_draw stdcall(#edit1); //рисуем строку адреса if (!filesize) @@ -309,7 +331,7 @@ void TWebBrowser::ParseHTML(dword bword){ for (j = 400; j < blink + 1; j++;) DeleteButton(j); blink = 400; - b_text = i_text = u_text = s_text = pre_text = blq_text = first_line_drawed = + b_text = i_text = u_text = s_text = blq_text = first_line_drawed = li_text = link = ignor_text = text_color_index = text_colors[0] = li_tab = 0; //обнуляем теги link_color = 0x0000FF; bg_color = 0xFFFFFF; @@ -317,10 +339,12 @@ void TWebBrowser::ParseHTML(dword bword){ strcpy(#page_links,"|"); strcpy(#header, #version); - if (!strcmp(#URL + strlen(#URL) - 4, ".txt")) pre_text = 1; - if (!strcmp(#URL + strlen(#URL) - 4, ".mht")) ignor_text = 1; - - debug("Start parsing"); + if (pre_text<>2) + { + pre_text=0; + if (!strcmp(#URL + strlen(#URL) - 4, ".txt")) pre_text = 1; + if (!strcmp(#URL + strlen(#URL) - 4, ".mht")) ignor_text = 1; + } for ( ; buf+filesize > bword; bword++;) { @@ -462,7 +486,6 @@ void TWebBrowser::ParseHTML(dword bword){ if (stroka * 10 + 15 <= height) DrawBar(left, stroka * 10 + top + 15, width - 15, -stroka * 10 + height - 15, bg_color); //закрашиваем всё до конца if (lines.first == 0) lines.all = stroka; - debug ("Pre end - anchor"); if (anchor) { //если посреди текста появится новый якорь - будет бесконечный цикл @@ -470,7 +493,6 @@ void TWebBrowser::ParseHTML(dword bword){ lines.first=anchor_line_num; ParseHTML(buf); } - debug("End parsing"); DrawScroller(); } @@ -487,7 +509,6 @@ void TWebBrowser::DrawPage() // //line = 123456789 //header = 1234 //line = 56789 - debug("too long header"); strcpy(#temp, #line); temp[sizeof(header)-strlen(#version)-2]=0; strcpy(#header, #temp); @@ -495,7 +516,6 @@ void TWebBrowser::DrawPage() // } else { - debug("normal header"); strcpy(#header, #line); line=0; } @@ -612,14 +632,17 @@ void TWebBrowser::WhatTextStyle(int left1, top1, width1) { { if (rez) { - text_color_index++; - text_colors[text_color_index] = text_colors[text_color_index-1]; + + if (link) IF(text_color_index > 0) text_color_index--; //если предыдущий тег а не был закрыт _A_MARK: if (!strcmp(#parametr, "href=")) { if (stroka - 1 > lines.visible) || (stroka < -2) return; - if (link) && (text_color_index > 0) text_color_index--; //если не закрыт тэг + + text_color_index++; + text_colors[text_color_index] = text_colors[text_color_index-1]; + link = 1; blink++; text_colors[text_color_index] = link_color; @@ -745,6 +768,7 @@ void TWebBrowser::WhatTextStyle(int left1, top1, width1) { IMG_TAG: if (!strcmp(#parametr,"src=")) //надо объединить с GetNewUrl() { + if (!strcmpn(#URL, "http:", 5)) || (!strcmpn(#options, "http:", 5)) return; strcpy(#temp, BrowserHistory.CurrentUrl()); //достаём адрес текущей страницы temp[strrchr(#temp, '/')] = 0x00; //обрезаем её урл до последнего / strcat(#temp, #options); diff --git a/programs/network/htmlv/browser/include/acid_0.1.htm b/programs/network/htmlv/browser/include/acid_0.1.htm index e5abdac908..027a8e19c7 100644 --- a/programs/network/htmlv/browser/include/acid_0.1.htm +++ b/programs/network/htmlv/browser/include/acid_0.1.htm @@ -53,12 +53,15 @@ - -Index.htm
+ +Index.htm
+Index.htm
+Незакрытый тег а - Index.htm
Kernel.mnt
index.htm#2.1.4
#2.1.4
Фоновая картинка
+
DSBYTE[EDI]) RETURN 1; + IF (DSBYTE[ESI]=='\0') RETURN 0; + ESI++; + EDI++; + } +} + + +inline fastcall signed int strncmp( ESI, EDI, ECX) +{ + asm { + MOV EBX, EDI + XOR EAX, EAX + MOV EDX, ECX + OR ECX, ECX + JE L1 + REPNE SCASB + SUB EDX, ECX + MOV ECX, EDX + MOV EDI, EBX + XOR EBX, EBX + REPE CMPSB + MOV AL, DSBYTE[ ESI-1] + MOV BL, DSBYTE[ EDI-1] + SUB EAX, EBX +L1: + } +} + +/* + +inline fastcall signed int strcmpi( ESI,EDI) +uses EBX +{ + do{ + $lodsb + IF(AL>='a')&&(AL<='z')AL-=0x20; + BL=DSBYTE[(E)DI]; + IF(BL>='a')&&(BL<='z')BL-=0x20; + AL-=BL; + IF(!ZEROFLAG)BREAK; + (E)DI++; + }while(BL!=0); +} + +inline char STRNCMPI((E)SI,(E)DI,(E)CX) +{ + (E)AX=0; + LOOPNZ((E)CX){ + $lodsb + IF(AL>='a')&&(AL<='z')AL-=0x20; + AH=DSBYTE[EDI]; + IF(AH>='a')&&(AH<='z')AH-=0x20; + EDI++; + IF(AL==0)||(AH==0)||(AL!=AH)BREAK; + } + AL=AL-AH; +}*/ + + inline fastcall unsigned int strlen( EDI) { @@ -107,18 +172,6 @@ inline fastcall dword atoi( EDI) } -inline fastcall signed int strcmp( ESI, EDI) -{ - loop() - { - IF (DSBYTE[ESI]DSBYTE[EDI]) RETURN 1; - IF (DSBYTE[ESI]=='\0') RETURN 0; - ESI++; - EDI++; - } -} - inline fastcall unsigned int strchr( ESI,BL) { int jj=0; @@ -203,6 +256,21 @@ ls3: } } + + + + + + + + + + + + + + + /* strtok( LPSTR dest, src, divs); src - указатель на исходную строку или результат предыдущего вызова dest - указатель на буфер, куда будет скопировано слово @@ -242,3 +310,13 @@ L3: MOV EAX, ESI L4: POP ECX } DSBYTE[ EDX] = 0; } + +#define strncpy strcpyn +#define strnmov strmovn +#define stricmp strcmpi +#define strcmpn strncmp +#define strncmpi strcmpni +#define stricmpn strcmpni +#define strnicmp strcmpni +#define strincmp strcmpni +#define strcmpin strcmpni \ No newline at end of file