Subversion Repositories Kolibri OS

Rev

Rev 2238 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1971 lev 1
//http://jsbeautifier.org/
2
//Web-component, Leency & Veliant 2007-2009
3
//lev
4
 
5
 
2085 leency 6
//идея - левые файлы открывать соответствующими прогами
7
//wintodos(buf); -> в парсе хтмл как и все кодировки
1971 lev 8
//ol - циферки
9
 
2155 leency 10
int	downloader_id;
1971 lev 11
 
12
dword j,
13
	buf,
14
	filesize,
15
	blink = 400;
16
 int i;
17
 
18
 char download_path[]="/rd/1/.download";
19
//char search_path[]="http://nova.rambler.ru/search?words=";
20
 char search_path[]="http://nigma.ru/index.php?s=";
2228 leency 21
 char version[]=" Text-based Browser 23.70";
1971 lev 22
 
23
 
24
struct TWebBrowser {
2085 leency 25
	int left,
1971 lev 26
	top,
27
	width,
28
	height;
29
	void DrawScroller();
30
	void Load();
31
	void ParseHTML(dword, dword);
32
	void Scan(dword);
33
	void WhatTextStyle(int left1, top1, width1);
34
};
35
 
36
TWebBrowser WB1;
37
 
2240 leency 38
byte rez, b_text, i_text, u_text, s_text, pre_text, blq_text, li_text, link, ignor_text, li_tab;
2238 leency 39
 
40
 
41
dword text_colors[10],
42
	text_color_index = 0,
43
	link_color;
44
 
45
int stroka,
46
	stolbec,
47
	tab_len;
48
 
49
char line[330],
50
	tag[100],
51
	tagparam[10000],
52
	parametr[1200],
53
	options[1000];
54
 
55
 
1971 lev 56
#include "include\history.h--"
57
#include "include\colors.h--"
2228 leency 58
#include "include\unicode_tags.h--"
1971 lev 59
 
60
void TWebBrowser::Scan(dword id) {
1974 yogev_ezra 61
	IF (id > 399) {
1971 lev 62
		j = 0;
63
		FOR(i = 0; i <= id - 401; i++) {
64
			do j++;
65
			while (page_links[j] <>'|');
66
		}
67
		page_links[j] = 0x00;
68
		copystr(#page_links[find_symbol(#page_links, '|')], #URL);
69
		Load(#URL);
70
		Draw_Window();
71
		return;
72
	}
73
	//edit1.flags=64;
2238 leency 74
	IF(count < max_kolvo_strok) SWITCH(id) {
1971 lev 75
		CASE 183: CASE 184: CASE 180: CASE 181: return;
76
	} //если мало строк игнорируем некоторые кнопки
2240 leency 77
	switch (id)
78
	{
79
		case 011: //Ctrk+K
80
			ReadHtml();
81
			koitodos(buf);
82
			break;
83
		case BACK:
84
			BrowserHistory.GoBack();
85
			return;
86
		case FORWARD:
87
			//RunProgram("@notify", "Forward button is not realized yet");
88
			return;
89
		case 054: //F5
90
			IF(edit1.flags == 66) break;
91
		case REFRESH:
92
			copystr(#URL, #editURL);
93
			Draw_Window();
94
			return;
95
		case 014: //Ctrl+N новое окно
96
		case 020: //Ctrl+T новая вкладка
97
		case NEWTAB:
98
			MoveSize(190,80,OLD,OLD);
99
			RunProgram(#program_path, #URL);
100
			return;
101
		case HOME:
102
			copystr("/sys/index.htm", #editURL);
103
		case GOTOURL:
104
		case 0x0D: //enter
105
			copystr(#editURL, #URL);
106
			Load(#URL);
107
			return;
108
		case 052:  //Нажата F3
109
			IF(edit1.flags <> 66)
110
			IF (strcmp(get_URL_part(5),"http:")<>0) RunProgram("tinypad", #URL); ELSE RunProgram("tinypad", #download_path);
111
			break;
112
		case 173:	//ctrl+enter
113
		case SEARCHWEB:
114
			copystr(#search_path, #URL);
115
			copystr(#editURL, #URL + strlen(#URL));
116
			Load(#URL);
117
			return;
118
		case ID1: //мотаем вверх
119
			IF(za_kadrom > 0) za_kadrom--;
120
			ELSE return;
121
			break;
122
		case ID2: //мотаем вниз
123
			IF(max_kolvo_strok + za_kadrom >= count) return;
124
			za_kadrom++;
125
			break;
126
		case 183: //PgDown
127
			IF(za_kadrom == count - max_kolvo_strok) return;
128
			za_kadrom = za_kadrom + max_kolvo_strok + 2;
129
			IF(max_kolvo_strok + za_kadrom > count) za_kadrom = count - max_kolvo_strok;
130
			BREAK;
131
		case 184: //PgUp
132
			IF(za_kadrom == 0) RETURN;
133
			za_kadrom = za_kadrom - max_kolvo_strok - 2;
134
			IF(za_kadrom < 0) za_kadrom = 0;
135
			BREAK;
136
		case 180: //home
137
			IF (za_kadrom <>0) za_kadrom = 0;
138
			ELSE RETURN;
139
			BREAK;
140
		case 181: //end
141
			za_kadrom = count - max_kolvo_strok;
142
			BREAK;
143
		default:
144
			RETURN;
1971 lev 145
	}
146
	ParseHTML(buf, filesize);
147
}
148
 
149
//скролл
150
void TWebBrowser::DrawScroller() {
151
	dword on_y;
152
	DrawBar(left + width - 15, top + 17, 1, height - 34, 0x94AECE); //линия слева от прокрутки
153
	DrawFlatButton(left + width - 15, top + height - 17, 16, 16, ID2, 0xE4DFE1, "\x19");
154
	DrawFlatButton(left + width - 15, top, 16, 16, ID1, 0xE4DFE1, "\x18");
155
 
2238 leency 156
	IF(count <= max_kolvo_strok) {
1971 lev 157
		DrawBar(left + width - 14, top + 17, 16, height - 34, 0xCED0D0);
158
		return;
159
	}
160
 
2238 leency 161
	scroll_size = height - 16 * max_kolvo_strok / count - 3;
162
	IF(scroll_size < 10) scroll_size = 10;
163
	IF(za_kadrom + max_kolvo_strok >= count) on_y = height - scroll_size + top - 17;
164
	ELSE on_y = height - 32 * za_kadrom / count + top + 16;
165
	DrawFlatButton(left + width - 15, on_y, 16, scroll_size, 0, 0xE4DFE1, ""); //ползунок
1971 lev 166
  IF(on_y > top + 17) DrawBar(left + width - 14, top + 17, 16, on_y - top - 17, 0xCED0D0); //поле до ползунка
2238 leency 167
	IF(height - scroll_size + top - 17 > on_y)
168
		DrawBar(left + width - 14, on_y + scroll_size + 1, 16, height - scroll_size - on_y + top - 18, 0xCED0D0); //поле после ползунка
1971 lev 169
}
170
 
171
 
172
void GetNewUrl(){
173
  IF (!strcmp(get_URL_part(2),"./")) copystr(#URL+1,#URL);
174
	//IF (!strcmp(get_URL_part(3),"../"))
175
	//{
176
 	//	//DrawTitle(#URL+7);
177
	//}
178
 	if (strcmp(get_URL_part(3),"/rd")<>0) && (strcmp(get_URL_part(5),"/sys/")<>0) && (strcmp(get_URL_part(3),"/hd")<>0)
179
	&& (strcmp(get_URL_part(3),"/bd")<>0) && (strcmp(get_URL_part(3),"/fd")<>0) && (strcmp(get_URL_part(3),"/cd")<>0)
180
	&& (strcmp(get_URL_part(5),"http:")<>0)	&& (strcmp(get_URL_part(5),"mailt")<>0)	&& (strcmp(get_URL_part(5),"ftp:/")<>0)
181
	{
182
		copystr(BrowserHistory.CurrentUrl(), #editURL); //достаём адрес текущей страницы
183
 
2238 leency 184
		IF (editURL[find_symbol(#editURL, '/')-2]<>'/')  // если не http://pagename.ua
1971 lev 185
		{
186
			editURL[find_symbol(#editURL, '/')] = 0x00; //обрезаем её урл до последнего /
187
			IF (URL[0]=='/') copystr(#URL+1,#URL);
188
		}
189
		copystr(#URL, #editURL + strlen(#editURL)); //клеим новый адрес
190
		copystr(#editURL, #URL);
191
	}
192
}
193
 
2240 leency 194
void HttpLoad()
2153 leency 195
{
2240 leency 196
	DeleteFile(#download_path);
197
	IF (URL[strlen(#URL)-1]=='/') URL[strlen(#URL)-1]='';
198
	downloader_id = RunProgram("/sys/network/downloader", #URL);
199
	IF (downloader_id<0) RunProgram("@notify", "Error running Downloader. Internet unavilable.");
200
	RunProgram("/sys/network/downloader", #URL);
201
}
1971 lev 202
 
2240 leency 203
/*	if (!strcmp(get_URL_part(5),"http:")))
1971 lev 204
	{
1974 yogev_ezra 205
		IF (DO_LOAD) && (!WindowRePaint)
1971 lev 206
		{
2240 leency 207
			HttpLoad();
208
			//RETURN;
1971 lev 209
		}
2184 leency 210
		file_size stdcall (#download_path);
1971 lev 211
	}
2184 leency 212
	ELSE file_size stdcall (#URL);
2240 leency 213
*/
2184 leency 214
 
2240 leency 215
void ReadHtml(byte DO_LOAD)
216
{
217
	if (!strcmp(get_URL_part(5),"http:")))
218
		file_size stdcall (#download_path);
219
	else
220
		file_size stdcall (#URL);
221
 
1971 lev 222
	filesize = EBX;
2240 leency 223
	if (!filesize) /*{Pause(200); ReadHtml();}*/ return; //Lee 22.09
2184 leency 224
	mem_Free(buf);
225
	buf = mem_Alloc(filesize);
226
	ReadFile(0, filesize, buf, #URL);
1971 lev 227
}
228
 
229
 
230
 
231
void TWebBrowser::Load(dword adress) {
1974 yogev_ezra 232
	IF (URL[0] == '#') {  //мы не умеем переходить по ссылке внутри документа. Пока что...
1971 lev 233
		copystr(#editURL, #URL);
234
		return;
235
	}
236
 
237
	URL[find_symbol(#URL, '#')-1] = 0x00; //заглушка, лучше, чем ничего (хабр, например, будет работать)
238
 
239
	GetNewUrl();
240
 
241
	max_kolvo_stolbcov = width - 30 / 6;
242
	max_kolvo_strok = height - 3 / 10 - 2;
1976 yogev_ezra 243
	copystr(#version, #header);
1974 yogev_ezra 244
	IF (!WindowRePaint) {
1971 lev 245
		za_kadrom = 0;
246
		copystr(#URL, #editURL);
247
		BrowserHistory.AddUrl();
248
	}
249
	edit1.size = edit1.pos = strlen(#editURL);
250
	edit_box_draw stdcall(#edit1); //рисуем строку адреса
251
 
252
	ReadHtml(LETS_LOAD);
2228 leency 253
 
254
	IF (!filesize) return; //Lee 22.09
255
 
1971 lev 256
	wintodos(buf);
257
	ParseHTML(buf, filesize);
258
	IF(!strlen(buf)) {
259
		IF (strcmp(get_URL_part(5),"http:")==0)
260
		{
261
			PutImage(#stop_btn, 24, 24, 88, 10);
262
			WriteText(left + 10, top + 18, 0x80, 0, "Loading...", 0);
263
		}
264
		ELSE
265
			WriteText(left + 10, top + 18, 0x80, 0, "Page not found. May be, URL contains some errors.", 0);
266
	}
267
 
1976 yogev_ezra 268
	IF (!strcmp(#version, #header)) DrawTitle(#header);
1971 lev 269
}
270
 
271
 
272
 
273
void TWebBrowser::ParseHTML(dword bword, fsize){
274
	word bukva[1];
2238 leency 275
	byte ignor_param = 0;
1971 lev 276
	char temp[768];
277
	stroka = -za_kadrom;
278
	stolbec = 0;
279
	FOR(j = 400; j < blink + 1; j++;) DeleteButton(j);
2240 leency 280
	b_text = i_text = u_text = s_text = pre_text = blq_text =
1971 lev 281
	li_text = link = ignor_text = text_color_index = text_colors[0] = li_tab = 0; //обнуляем теги
282
	link_color = 0x0000FF;
283
	blink = 400;
284
	line = '';
285
	copystr("|", #page_links);
286
	IF(!strcmp(#URL + strlen(#URL) - 4, ".txt")) pre_text = 1; //зачётное отображение текста
2228 leency 287
	//IF(!strcmp(#URL + strlen(#URL) - 4, ".rtf")) pre_text = 1;
1971 lev 288
	IF(!strcmp(#URL + strlen(#URL) - 4, ".mht")) ignor_text = 1;
289
	IF(za_kadrom == 0) || (WindowRePaint) DrawBar(left, top, width - 15, 15, 0xFFFFFF); //закрашиваем первую строку
290
	for (; buf + fsize > bword; bword++;) {
291
	  bukva = ESBYTE[bword];
292
	  switch (bukva) {
293
		case 0x0a:
294
			IF(pre_text == 1) {
295
				bukva = '';
296
				temp = '';
297
				goto NEXT_MARK;
298
			}
1974 yogev_ezra 299
		CASE '\9':
2085 leency 300
			if (pre_text == 1) //иначе идём на 0x0d
301
			{
302
				tab_len=strlen(#line)/8;
303
				tab_len=tab_len*8;
304
				tab_len=8+tab_len-strlen(#line);
305
				for (i=0; i
306
				break;
307
			}
308
		case 0x0d:
1971 lev 309
			bukva = ' ';
310
			goto DEFAULT_MARK;
2085 leency 311
		case '<':
1971 lev 312
			bword++; //промотаем символ <
313
			IF(ESBYTE[bword] == '!') //фильтрация внутри , дерзко
314
			{
315
				bword++;
316
				IF(ESBYTE[bword] == '-') {
317
					HH_: do {
318
						bword++;
319
						IF(bword >= buf + fsize) break 1;
320
					} while (ESBYTE[bword] <>'-');
321
					bword++;
322
					IF(ESBYTE[bword] <>'-') GOTO HH_;
323
				}
324
			}
1974 yogev_ezra 325
			WHILE (ESBYTE[bword] <>'>') && (bword < buf + fsize) //получаем тег и его параметры
1971 lev 326
			{
327
				bukva = ESBYTE[bword];
328
				IF(bukva == '\9') || (bukva == '\x0a') || (bukva == '\x0d') bukva = ' ';
329
				IF(!ignor_param) && (bukva <>' ') copystr(#bukva, #tag + strlen(#tag));
330
				ELSE {
331
					ignor_param = true;
332
					copystr(#bukva, #tagparam + strlen(#tagparam));
333
				}
334
				bword++;
335
			}
336
			lowcase(#tag);
337
			lowcase(#tagparam);
338
			//WriteDebug(#tagparam);
339
			//WriteDebug(#tag); Pause(50);
340
			//
341
			IF (tag[strlen(#tag)-1]=='/') tag[strlen(#tag)-1]=''; //небольшой фикс для работы с XHTML-тегами типа br/
342
			IF(strlen(#tagparam) > 0) && (strlen(#tagparam) < 4000) GetNextParam();
343
			WhatTextStyle(left + 5, stroka * 10 + top + 5, width - 20); //обработка тегов
344
 
345
			line = tag = parametr = tagparam = ignor_param = 0; //всё обнуляем
346
			break;
347
		case '=': //поддержка шайтанской кодировки страниц, сохранённых через ИЕ7
348
			IF(strcmp(#URL + strlen(#URL) - 4, ".mht")<>0) goto DEFAULT_MARK;
349
 
350
			bword++;
351
			bukva=ESBYTE[bword];
352
			copystr(#bukva, #temp);
353
 
354
			bword++;
355
			bukva=ESBYTE[bword];
356
			copystr(#bukva, #temp + strlen(#temp));
357
 
358
			bukva=Hex2Symb(#temp);
359
			IF (bukva) goto DEFAULT_MARK;
2228 leency 360
			break;
361
		/*case '\\': //поддержка rtf
362
			IF(strcmp(#URL + strlen(#URL) - 4, ".rtf")<>0) goto DEFAULT_MARK;
363
 
364
			bword++;
365
			IF (ESBYTE[bword] =='\'')
366
			{
367
				bword++;
368
				bukva=ESBYTE[bword];
369
				copystr(#bukva, #temp);
370
 
371
				bword++;
372
				bukva=ESBYTE[bword];
373
				copystr(#bukva, #temp + strlen(#temp));
374
 
375
				bukva=Hex2Symb(#temp);
376
				IF (bukva) goto DEFAULT_MARK;
377
			}
378
			else
379
			{
380
				FOR (j=0;   (ESBYTE[bword] <>'\\') && (buf + fsize < bword);     j++; bword++;)
381
				{
382
					bukva = ESBYTE[bword];
383
					copystr(#bukva, #tag + strlen(#tag));
384
				}
385
				IF ((!strcmp(#tag, "par\0x0a")) || (!strcmp(#tag, "par\0x0b"))) stroka++;
386
				tag='';
387
				bword--;
388
			}
389
			break;*/
390
 
391
		case '&': //обработка тегов типа  
1971 lev 392
			IF(ignor_text) break;
393
			bword++;
2228 leency 394
			tag='';
395
			FOR (j=0;   (ESBYTE[bword] <>';') && (j < 7);     j++; bword++;)
396
			{
1971 lev 397
				bukva = ESBYTE[bword];
398
				copystr(#bukva, #tag + strlen(#tag));
399
			}
2228 leency 400
 
401
			FOR (j=0; unicode_tags[j]!=0; j+=2;)
402
			{
403
				IF(!strcmp(#tag, unicode_tags[j]))
404
				{
405
					copystr(unicode_tags[j+1], #line + strlen(#line));
406
					break 1;
407
				}
408
			}
409
 
1971 lev 410
			rez = StrToInt(#tag + 1) - 1040;
2240 leency 411
			IF(tag[1] == '1') && (rez>=0) && (rez<=72) && (strlen(#tag) == 5)
2228 leency 412
				{
2240 leency 413
					bukva = unicode_chars[rez];
414
					GOTO DEFAULT_MARK; //обрабатываем букву
2228 leency 415
				}
416
 
2240 leency 417
			WriteDebug(#tag); //тэг не найден - выводим на доску отладки
2228 leency 418
			copystr(#tag, #line + strlen(#line)); //выводим на экран необработанный тег, так браузеры зачем-то делают
419
			break;
1971 lev 420
		default:
421
			DEFAULT_MARK:
422
			IF(ignor_text) break;
423
			IF(pre_text == 0) && (bukva == ' ') && (strcmp(#line + strlen(#line) - 1, " ") == 0) continue;
424
			//
2240 leency 425
			if (stolbec + strlen(#line) > max_kolvo_stolbcov)
2228 leency 426
			{
1971 lev 427
				copystr(#line + find_symbol(#line, ' '), #temp); //перенос по словам
428
				line[find_symbol(#line, ' ')] = 0x00;
429
				NEXT_MARK: IF(stroka - 1 > max_kolvo_strok) && (za_kadrom <>0) break 1; //уходим...
430
				WhatTextStyle(left + 5, stroka * 10 + top + 5, width - 20); //вывод строки
2228 leency 431
				TextGoDown(left + 5, stroka * 10 + top + 5, width - 20); //закрашиваем следущую строку
1971 lev 432
				copystr(#temp, #line);
433
			}
1974 yogev_ezra 434
			IF(pre_text == 0) && (bukva == ' ') && (stolbec == 0) && (strlen(#line) == 0) CONTINUE;
1971 lev 435
			copystr(#bukva, #line + strlen(#line));
436
	  }
437
	}
438
	IF(max_kolvo_strok * 10 + 25 <= height)
439
		DrawBar(left, max_kolvo_strok * 10 + top + 25, width - 15, -max_kolvo_strok * 10 + height - 25, 0xFFFFFF);
440
	IF(stroka * 10 + 15 <= height)
441
		DrawBar(left, stroka * 10 + top + 15, width - 15, -stroka * 10 + height - 15, 0xFFFFFF); //закрашиваем всё до конца
2238 leency 442
	IF(za_kadrom == 0) count = stroka;
1971 lev 443
	DrawScroller(); //рисуем скролл
444
}
445
 
446
 
2182 leency 447
void GetNextParam()
448
{
449
	byte	kavichki = false;
450
	int		i = strlen(#tagparam) - 1;
451
 
452
	WHILE((i > 0) && ((tagparam[i] == '"') || (tagparam[i] == ' ') || (tagparam[i] == '\'') || (tagparam[i] == '/')))
1971 lev 453
	{
2182 leency 454
		IF (tagparam[i] == '"') || (tagparam[i] == '\'') kavichki=tagparam[i];
1971 lev 455
		tagparam[i] = 0x00;
456
		i--;
457
	}
458
 
2182 leency 459
	IF (kavichki)
1971 lev 460
	{
2182 leency 461
		i=find_symbol(#tagparam, kavichki);
1971 lev 462
		copystr(#tagparam + i, #options);
463
	}
1974 yogev_ezra 464
	ELSE
1971 lev 465
	{
2182 leency 466
		WHILE((i > 0) && (tagparam[i] <>'=')) i--; //i=find_symbol(#tagparam, '=')+1;
467
		i++;
468
 
1971 lev 469
		copystr(#tagparam + i, #options); //копируем опцию
470
		WHILE (options[0] == ' ') copystr(#options + 1, #options);
471
	}
472
	tagparam[i] = 0x00;
473
 
2182 leency 474
	FOR ( ; ((tagparam[i] <>' ') && (i > 0); i--)
475
	{
476
		IF (tagparam[i] == '=') //дерзкая заглушка
1971 lev 477
		{
478
			//copystr(#tagparam+i+2,#options);
479
			tagparam[i + 1] = 0x00;
480
		}
481
	}
2182 leency 482
 
1971 lev 483
	copystr(#tagparam + i + 1, #parametr); //копируем параметр
484
	tagparam[i] = 0x00;
485
}
486
 
487
 
488
 
489
char oldtag[100];
2085 leency 490
void TWebBrowser::WhatTextStyle(int left1, top1, width1) {
1971 lev 491
	dword hr_color;
492
 
493
    dword image=0;
2182 leency 494
    char temp[4096];
495
    int w, h, img_za_kadrom=0;
1971 lev 496
 
2238 leency 497
	//проверяем тег открывается или закрывается
498
	IF(tag[0] == '/')
499
	{
1971 lev 500
		rez = 0;
501
		copystr(#tag + 1, #tag);
2238 leency 502
	}
503
	ELSE
504
		rez = 1;
505
 
1971 lev 506
	//
507
	IF(!chTag("html")) {
508
		IF(!strcmp(#URL + strlen(#URL) - 4, ".mht")) IF (rez==0) ignor_text = 1; ELSE ignor_text = 0;
509
		return;
510
	}
511
	IF(!chTag("script")) || (!chTag("style")) ignor_text = rez;
512
	IF (ignor_text == 1) return;
513
	//
514
 
2240 leency 515
	if(!chTag("title")) && (!rez) && (stroka == 0)
2238 leency 516
	{
1971 lev 517
		copystr(#line, #header);
1977 yogev_ezra 518
		copystr(" -", #header + strlen(#header));
519
		copystr(#version, #header + strlen(#header));
2240 leency 520
		DrawTitle(#header);
1971 lev 521
		return;
522
	}
2238 leency 523
 
1971 lev 524
	//
525
	IF(!chTag("q")) copystr("\"", #line + strlen(#line));
2238 leency 526
 
527
	//вывод на экран
528
	if (stroka >= 0) && (stroka - 2 < max_kolvo_strok) && (line)
529
	{
1971 lev 530
		WriteText(stolbec * 6 + left1, top1, 0x80, text_colors[text_color_index], #line, 0);
2238 leency 531
		IF (b_text) WriteText(stolbec * 6 + left1 + 1, top1, 0x80, text_colors[text_color_index], #line, 0);
532
		IF (i_text) Skew(stolbec * 6 + left1, top1, strlen(#line)+1*6, 10); //наклонный текст
533
		IF (s_text) DrawBar(stolbec * 6 + left1, top1 + 4, strlen(#line) * 6, 1, text_colors[text_color_index]); //зачёркнутый
534
		IF (u_text) DrawBar(stolbec * 6 + left1, top1 + 8, strlen(#line) * 6, 1, text_colors[text_color_index]); //подчёркнутый
535
		IF (link) {
1971 lev 536
			DefineButton(stolbec * 6 + left1 - 2, top1, strlen(#line) * 6 + 3, 9, blink + BT_HIDE, 0xB5BFC9); //
537
			DrawBar(stolbec * 6 + left1, top1 + 8, strlen(#line) * 6, 1, text_colors[text_color_index]);
538
		}
539
	}
540
	//
541
	IF(!tag) return;
542
	stolbec += strlen(#line);
2238 leency 543
	////////////////////////// 
544
	if (!chTag("body"))
545
	{
546
		BODY_MARK:
547
 
548
		if (strcmp(#parametr, "link=") == 0)
549
			link_color = GetColor(#options);
550
 
551
		/*if (strcmp(#parametr, "text=") == 0)
552
		{
553
			text_colors[0]=GetColor(#options);
554
		}
555
 
556
		if (strcmp(#parametr, "bgcolor=") == 0)
557
		{
558
			//text_colors[0]=GetColor(#options);
559
			WriteDebug("bgcolor=");
560
			WriteDebug(#options);
561
		}*/
562
 
563
		IF(tagparam) {
564
			GetNextParam();
565
			GOTO BODY_MARK;
566
		}
567
	}
1971 lev 568
	//////////////////////////
569
	if (!chTag("a")) {
570
		IF (stroka - 1 > max_kolvo_strok) || (stroka < -2) return;
571
		if (rez) {
572
			HREF: IF(strcmp(#parametr, "href=") == 0) {
573
				IF(link == 1) text_color_index--; //если какой-то долбоёб не закрыл тэг
574
				link = 1;
575
				blink++;
576
				text_color_index++;
577
				text_colors[text_color_index] = link_color;
578
				copystr(#options, #page_links + strlen(#page_links));
579
				copystr("|", #page_links + strlen(#page_links));
580
			}
581
			IF(tagparam) {
582
				GetNextParam();
583
				GOTO HREF;
584
			}
585
		}
586
		ELSE {
587
			link = 0;
588
			IF(text_color_index > 0) text_color_index--;
589
		}
590
		return;
591
	}
592
	/////////////////////////
2152 leency 593
	if (!chTag("font"))
594
	{
595
		IF(stroka < 0) || (stroka - 1 > max_kolvo_strok) return;
596
		COL_MARK:
597
		if (strcmp(#parametr, "color=") == 0) //&& (parametr[1] == '#')
1971 lev 598
		{
2152 leency 599
			text_color_index++;
2238 leency 600
			text_colors[text_color_index] = GetColor(#options);
1971 lev 601
		}
2238 leency 602
		IF(tagparam) {
1971 lev 603
			GetNextParam();
604
			GOTO COL_MARK;
605
		}
606
		IF(!rez) && (text_color_index > 0) text_color_index--;
607
		return;
608
	}
609
	//////////////////////////
610
	IF(!chTag("tr")) || (!chTag("br")) {
611
		TextGoDown(left1, top1, width1);
612
		return;
613
	}
614
	IF(!chTag("div")) {
615
		IF(oldtag[0] <>'h') TextGoDown(left1, top1, width1);
616
		return;
617
	}
618
	IF(!chTag("p")) {
619
		IF(oldtag[0] == 'h') return;
620
		TextGoDown(left1, top1, width1);
621
		IF(rez) TextGoDown(left1, top1 + 10, width1);
622
		return;
623
	}
624
	////////////////////////////
625
	IF(!chTag("h1")) || (!chTag("h2")) || (!chTag("h3")) || (!chTag("h4")) {
626
		TextGoDown(left1, top1, width1);
627
		IF(rez) TextGoDown(left1, top1 + 10, width1);
628
		b_text = rez;
629
		copystr(#tag, #oldtag);
630
		return;
631
	} ELSE copystr("", #oldtag);
632
	IF(!chTag("b")) || (!chTag("strong")) || (!chTag("big")) {
633
		b_text = rez;
634
		return;
635
	}
636
	////////////////////////////
637
	IF(!chTag("i")) || (!chTag("em")) {
638
		i_text = rez;
639
		return;
640
	}
641
	////////////////////////////
642
	if(!chTag("li")) || (!chTag("dt")) //надо сделать вложенные списки
643
	{
644
		li_text = rez;
645
		IF(rez == 0) return;
646
		TextGoDown(left1, top1, width1);
647
		IF(stroka > -1) && (stroka - 2 < max_kolvo_strok) IF(!chTag("li")) DrawBar(li_tab * 5 * 6 + left1 - 5, top1 + 12, 2, 2, 0);
648
		return;
649
	}
650
	////////////////////////////
651
	IF(!chTag("u")) || (!chTag("ins")) u_text = rez;
652
	IF(!chTag("s")) || (!chTag("strike")) || (!chTag("del")) s_text = rez;
653
	IF(!chTag("ul")) || (!chTag("ol")) IF(!rez) {
654
		li_text = rez;
655
		li_tab--;
656
		TextGoDown(left1, top1, width1);
657
	} ELSE li_tab++;
658
	IF(!chTag("dd")) stolbec += 5;
659
	IF(!chTag("blockquote")) blq_text = rez;
660
	IF(!chTag("pre")) pre_text = rez;
661
	IF(!chTag("hr")) {
662
		TextGoDown(left1, top1, width1);
663
		TextGoDown(left1, top1 + 10, width1);
2238 leency 664
		IF(strcmp(#parametr, "color=") == 0) hr_color = GetColor(#options);
1971 lev 665
		ELSE hr_color = 0x999999;
666
		IF(stroka > 0) DrawBar(left1, top1 + 14, width1 - 8, 1, hr_color);
667
	}
668
 
669
	if (!chTag("img"))
670
	{
671
		//IF (GetFileInfo(#libimg)<>0) return;  //если библиотеки нет
672
		IMG_TAG:
1974 yogev_ezra 673
			IF (strcmp(#parametr,"src=")==0)   //надо объединить с GetNewUrl()
1971 lev 674
	          {
675
				copystr(BrowserHistory.CurrentUrl(), #temp); //достаём адрес текущей страницы
676
				temp[find_symbol(#temp, '/')] = 0x00; //обрезаем её урл до последнего /
677
				copystr(#options,#temp+strlen(#temp));
678
				image=load_image(#temp);
679
 
680
	                w=DSWORD[image+4];
681
	                h=DSWORD[image+8];
682
	          }
683
		IF(tagparam) {
684
			GetNextParam();
685
			GOTO IMG_TAG;
686
		}
687
 
2155 leency 688
		if (w>width1) w=width1;
689
 
1971 lev 690
        if (image)
691
        {
2085 leency 692
			stroka+=h/10;
693
 
694
			if (top1+hWB1.top+WB1.height-10) //если ВСЁ изображение ушло ВЕРХ или ВНИЗ
695
				return;
2182 leency 696
 
2085 leency 697
			if (top1
698
			{
2182 leency 699
				img_za_kadrom=WB1.top-top1;
700
				h=h-img_za_kadrom;
2085 leency 701
				top1=WB1.top-5;
702
			}
703
 
704
			if (top1>WB1.top+WB1.height-h-10) //если часть изображения снизу     IF (stroka - 2 < max_kolvo_strok)
705
			{
706
				h=WB1.top+WB1.height-top1-10;
2155 leency 707
			}
708
 
709
			IF (h<=0) return;
710
 
2182 leency 711
			img_draw stdcall (image,left1-5,top1+10,w, h,0,img_za_kadrom);
2085 leency 712
			DrawBar(left1+w - 5, top1 + 10, width1-w + 5, h, 0xFFFFFF);
1971 lev 713
        }
2155 leency 714
		return;
1971 lev 715
	}
716
 
2155 leency 717
	if (!chTag("meta"))
718
	{
1971 lev 719
		META:
720
		if (!strcmp(#parametr, "charset=")) || (!strcmp(#parametr, "content="))
721
		{
722
			copystr(#options[find_symbol(#options, '=')],#options); //поиск в content=
723
 
2155 leency 724
			IF (!strcmp(#options,"utf-8")) || (!strcmp(#options,"utf8"))
1971 lev 725
			{
726
				ReadHtml(DONT_LOAD);
2155 leency 727
				utf8rutodos(buf);
1971 lev 728
			}
729
			IF(!strcmp(#options, "koi8-r")) || (!strcmp(#options, "koi8-u"))
730
			{
731
				ReadHtml(DONT_LOAD);
732
				koitodos(buf);
733
			}
734
			IF(!strcmp(#options, "dos")) || (!strcmp(#options, "cp-866"))
735
			{
736
				ReadHtml(DONT_LOAD);
737
			}
738
		}
2238 leency 739
		IF(tagparam)
2155 leency 740
		{
1971 lev 741
			GetNextParam();
742
			goto META;
743
		}
2155 leency 744
		return;
1971 lev 745
	}
746
}
747
 
748
 
749
void TextGoDown(int left1, top1, width1) {
750
	stroka++;
751
	IF(blq_text == 1) stolbec = 8;
752
	ELSE stolbec = 0;
753
	IF(li_text == 1) stolbec = li_tab * 5;
754
	IF(stroka >= 0) && (stroka - 2 < max_kolvo_strok) DrawBar(left1 - 5, top1 + 10, width1 + 5, 10, 0xFFFFFF);
755
}