void ParseTxt() { _canvas canvas; byte ch, zeroch=0; dword bufoff, buflen, line_start, srch_pos; int stroka_y=5, line_length=0; line_start=io.buffer_data; buflen = strlen(io.buffer_data) + io.buffer_data; for (bufoff=io.buffer_data; bufoff=list.w-30) || (ch==10) { srch_pos = bufoff; loop() { if (__isWhite(ESBYTE[srch_pos])) { bufoff=srch_pos+1; break; } //normal word-break if (srch_pos == line_start) break; //no white space found in whole line srch_pos--; } if (kfont.size.height) { ESBYTE[bufoff] >< zeroch; //set line end canvas.write_text(8, stroka_y, 0x000000, line_start); ESBYTE[bufoff] >< zeroch; //restore line } stroka_y += list.item_h; line_start = bufoff; line_length = 0; } } if (!kfont.size.height) { list.count = stroka_y/list.item_h+3; if (list.count < list.visible) list.count = list.visible; kfont.size.height = list.count+5*list.item_h; kfont.raw_size = 0; ParseTxt(); } else canvas.write_text(8, stroka_y, 0x000000, line_start); } /*======================================================== = = = STYLE = = = ========================================================*/ #define HTML_PADDING_X 8; #define HTML_PADDING_Y 5; struct _style { bool b, u, i, s; bool h1, h2, h3, h4, h5, h6; bool a; bool pre; bool ignore; dword color; void clear(); }; void _style::clear() { b=u=i=s=0; h1=h2=h3=h4=h5=h6=0; a=0; pre=0; ignore=0; color=0; } /*======================================================== = = = TAG = = = ========================================================*/ struct _tag { dword start; dword end; dword name; dword param[10]; dword value[10]; void parse(); int nameis(); }; void _tag::parse() { strlwr(name); } int _tag::nameis(dword _in_tag_name) { if (name) && (strcmp(_in_tag_name, start)==0) return true; return false; } /*======================================================== = = = DRAW = = = ========================================================*/ struct _draw { dword x; dword y; void init(); void line_break(); }; void _draw::init() { x = HTML_PADDING_X; y = HTML_PADDING_Y; } void _draw::line_break() { y+= list.item_h; x = HTML_PADDING_X; } /*======================================================== = = = BUF = = = ========================================================*/ struct _buf { dword pointer; dword len; dword start; dword end; void init(); }; void _buf::init(dword _buf_pointer, _buf_len) { pointer = _buf_pointer; len = _buf_len; start = malloc(len); end = start + len; strlcpy(start, pointer, len); } /*======================================================== = = = TEXT = = = ========================================================*/ struct _text { int size_pt_change; dword start; dword end; }; /* dword line_break; byte char_holder; if (ESBYTE[buf.pos]==0x0A) { if (style.pre) { draw.line_break(); continue; } } while (get_label_len(text.start) + draw.x + 30 > list.w) { for (line_break=tag.start-1; line_break>text.start; line_break--;) { char_holder = ESBYTE[line_break]; //set line end ESBYTE[line_break] = '\0'; if (get_label_len(text.start) + draw.x + 30 <= list.w) break; ESBYTE[line_break] = char_holder; //restore line } if (draw_on) { if (style.a) { link.add(draw.x,draw.y + size_pt_change,get_label_len(text.start),list.item_h,text.start," "); label_draw_bar(draw.x, draw.y+kfont.size.pt+1, get_label_len(text.start), style.color); } WriteTextIntoBuf(draw.x, draw.y, style.color, text.start); } draw.x+=char_width[' ']; ESBYTE[line_break] = char_holder; //restore line text.start = line_break; draw.line_break(); } if (draw_on) { if (style.a) { link.add(draw.x,draw.y + size_pt_change,get_label_len(text.start),list.item_h,text.start," "); label_draw_bar(draw.x, draw.y+kfont.size.pt+1, get_label_len(text.start), style.color); } WriteTextIntoBuf(draw.x, draw.y, style.color, text.start); } draw.x += char_width[' ']; draw.x += get_label_len(text.start); */ /*======================================================== = = = DOM = = = ========================================================*/ struct _dom { _tag tag; _style style; _draw draw; _buf buf; _text text; _canvas canvas; void init(); void set_style(); void parse(); void apply_text(); }; void _dom::init() { style.clear(); draw.init(); buf.init(io.buffer_data, strlen(io.buffer_data)); } void _dom::set_style() { /* if (tag.nameis("pre")) style.pre = true; if (tag.nameis("/pre")) style.pre = false; if (tag.nameis("script")) || (tag.nameis("style")) style.ignore = true; if (tag.nameis("/script")) || (tag.nameis("/style")) style.ignore = false; if (tag.nameis("a")) { style.a = true; style.color=0x0000FF; } if (tag.nameis("/a")) { style.a = false; style.color=0x000000; } if (tag.nameis("br")) || (tag.nameis("p")) || (tag.nameis("div")) || (tag.nameis("tr")) { draw.line_break(); return; } if (dom.tag.nameis("title")) { strcpy(#title, text.start); strcat(#title, " - Aelia"); DrawTitle(#title); } if (tag.nameis("h1")) || (tag.nameis("/h1")) || (tag.nameis("h2")) || (tag.nameis("/h2")) || (tag.nameis("h3")) || (tag.nameis("/h3")) { if (tag.nameis("h1")) { text.size_pt_change = 8; } else if (tag.nameis("/h1")) { text.size_pt_change = -8; } else if (tag.nameis("h2")) { text.size_pt_change = 6; } else if (tag.nameis("/h2")) { text.size_pt_change = -6; } else if (tag.nameis("h3")) { text.size_pt_change = 4; } else if (tag.nameis("/h3")) { text.size_pt_change = -4; } kfont.size.pt += text.size_pt_change; get_label_symbols_size(); if (text.size_pt_change > 0) { draw.y+= list.item_h;//что если будет очень длинная строка в теге? } else {//коммент выше и коммент ниже связаны draw.y+= list.item_h - text.size_pt_change;//не очень понятна логика этого места text.size_pt_change = 0; } draw.x = HTML_PADDING_X; return; } */ } void _dom::apply_text() { if (kfont.size.height) canvas.write_text(draw.x, draw.y, style.color, text.start); draw.line_break(); } void _dom::parse() { dword i; init(); text.start = buf.start; tag.start = buf.start; for ( i=buf.start; i') { tag.end = i-1; text.start = i+1; ESBYTE[i] = '\0'; debug("TAG "); debugln(tag.start); //tag.parse(); //set_style(); } } free(buf.start); if (!kfont.size.height) { list.count = draw.y/list.item_h+3; if (list.count < list.visible) list.count = list.visible; kfont.size.height = list.count+5*list.item_h; kfont.raw_size = 0; parse(); } } /*======================================================== = = = PREPARE = = = ========================================================*/ void PreparePage() { _dom dom; list.SetSizes(0, TOOLBAR_H, Form.cwidth-scroll.size_x-1, Form.cheight-TOOLBAR_H, kfont.size.pt+4); strcpy(#title, history.current()+strrchr(history.current(),'/')); get_label_symbols_size(); //get font chars width, need to increase performance ChangeCharset(charsets[encoding], "CP866", io.buffer_data); link.clear(); kfont.size.height = 0; if ( strstri(io.buffer_data, "