Subversion Repositories Kolibri OS

Rev

Rev 1977 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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