Subversion Repositories Kolibri OS

Rev

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