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