home *** CD-ROM | disk | FTP | other *** search
/ PC World 2002 February / PCWorld_2002-02_cd.bin / Software / Vyzkuste / ranish / SOURCES.ZIP / PART_HTM.C < prev    next >
Text File  |  1998-07-23  |  13KB  |  493 lines

  1. #include "part.h"
  2.  
  3. #define X 1
  4. #define Y 1
  5. #define W 80
  6. #define H 25
  7. #define N 21
  8. #define TX (X+10)
  9. #define TY (Y+H-2)
  10. #define TW (W-12)
  11. #define LEN (W-6)
  12. #define BARX (X+W-3)
  13. #define BARY (Y+2)
  14. #define BARLEN (N-2)
  15.  
  16. #define MAX_BACKS 8
  17.  
  18. #undef BORDER_COLOR
  19.  
  20. #define TEXT_COLOR   (Black+BakWhite)
  21. #define LINK_COLOR   (BrBlue+BakWhite)
  22. #define TYPE_COLOR   (White+BakBlack)
  23. #define FOUND_COLOR  (BrRed+BakWhite)
  24. #define BORDER_COLOR (Yellow+BakWhite)
  25.  
  26. void html_view(char *target_name)
  27. {
  28.  long i, j, k, n, ch, line, len, maxtop, nchars, first_time, enable_timer;
  29.  char *p, *q, *s, *top, *old_top, *bottom, *seek_base, *bs, *bq;
  30.  char *tmp, *col, *str;  /* LEN+1 */
  31.  struct event ev;
  32.  long force_redraw, link_started, seek_cnt;
  33.  long check_mouse, mline, mpos, left_was_pressed;
  34.  char *link_reference, *link_under_mouse;
  35.  char *link_back[MAX_BACKS];
  36.  long num_backs;
  37.  long barpos, old_barpos, forced_barpos, bar_hooked;
  38.  char *mesg, *buf;
  39.  char *text, *text_buf=0;
  40.  static char err_msg[80];
  41.  
  42.  long l;
  43.  FILE *f;
  44.  
  45.  p=base_dir+strlen(base_dir);
  46.  
  47.  if( target_name==0 || *target_name==0 || *target_name=='#' )
  48.    strcat(p,HELP_FILE_NAME);
  49.  else
  50.    {
  51.     for( q=target_name, s=p ; *q!=0 && *q!='#' ; q++, s++ )
  52.       *s=*q;
  53.     *s=0;
  54.     target_name = (*q!=0) ? q : 0;
  55.    }
  56.  
  57.  sprintf(err_msg,HTML_ERROR_READ,base_dir);
  58.  f=fopen(base_dir,"r");
  59.  *p=0;
  60.  
  61.  if( f==0 )
  62.    {
  63.     show_error(err_msg);
  64.     return;
  65.    }
  66.     
  67.  l=filelength(fileno(f));
  68.  l=min(l,65530L);
  69.  if( (text_buf=malloc(l+1))==0 )
  70.    {
  71.     show_error(ERROR_MALLOC);
  72.     return;
  73.    }
  74.  if( fread(text_buf,1,l,f)==0 )
  75.    {
  76.     show_error(err_msg);
  77.     free(text_buf);
  78.     return;
  79.    }
  80.  fclose(f);
  81.  text=text_buf;
  82.  text[l]=0;
  83.  
  84.  if( (buf=malloc(4000+3*LEN+3+16))==0 )
  85.    {
  86.     show_error(ERROR_MALLOC);
  87.     if( text_buf!=0 ) free(text_buf);
  88.     return;
  89.    }
  90.  
  91.  tmp=buf+4000;
  92.  col=tmp+LEN+1;
  93.  str=col+LEN+1;
  94.  
  95.  save_window( X, Y, W, H, buf );
  96.  border_window( BORDER_COLOR, X, Y, W, H, Border22f );
  97.  border_window( BORDER_COLOR, X, Y+H-3, W, 3, Border21if );
  98.  write_char( BORDER_COLOR, BARX, BARY-1, '');
  99.  write_char( BORDER_COLOR, BARX, BARY+BARLEN, '');
  100.         
  101.  
  102.  if( (bs=strstr(text,"<BODY>"))==0 || (bq=strstr(bs+=6,"</BODY>"))==0 )
  103.    {
  104.     bs=text;
  105.     bq=bs+strlen(text);
  106.    }
  107.  
  108.  while( *bs=='\r' || *bs=='\n' ) bs++;
  109.  while( *bq=='\r' || *bq=='\n' ) bq--;
  110.  
  111.  if( bs>=bq )
  112.    {
  113.     bs=HTML_DOC_EMPTY;
  114.     bq=bs+strlen(bs);
  115.    }
  116.  
  117.  i=N;
  118.  p=bq-1;
  119.  if( *p=='\n' ) p--;
  120.  for( ; p!=bs ; p-- )
  121.  if( *p=='\n' )
  122.    {
  123.     i--;
  124.     if( i==0 ) { p++; break; }
  125.    }
  126.  
  127.  maxtop=p-bs;
  128.  
  129.  nchars++; /* no warnings */
  130.  
  131.  mesg=0;
  132.  
  133.  top=bs;
  134.  nchars=0;
  135.  seek_cnt=0;
  136.  num_backs=0;
  137.  bar_hooked=0;
  138.  check_mouse=0;
  139.  force_redraw=1;
  140.  first_time=1;
  141.  enable_timer=0;
  142.  
  143.  move_cursor(1,26);
  144.  
  145.  while(1)
  146.     {
  147.      if( target_name!=0 )
  148.        {
  149.         p=target_name;
  150.         q=strchr(p,'\"');
  151.         if( q!=0 ) k=q-p;
  152.         else k=strlen(p);
  153.         if( k<0 || k>LEN-12 ) k=LEN-12;
  154.         if( *p=='#' )  /* local reference */
  155.           {
  156.            sprintf(tmp,"<A NAME=\"%.*s\"",(int)(k-1),p+1);
  157.            p=strstr(bs,tmp);
  158.            if( p!=0 && p<bq )
  159.              {
  160.               while( p!=bs && *p!='\n' ) p--;
  161.               if( *p=='\n' ) p++;
  162.               if( num_backs<MAX_BACKS && !first_time )
  163.                   link_back[num_backs++]=top;
  164.               top=p;
  165.              }
  166.            else
  167.              {
  168.               sprintf(err_msg,HTML_NOT_FOUND,tmp+8);
  169.               mesg=err_msg;
  170.              }
  171.          }
  172.        else
  173.          {
  174.           sprintf(tmp,"%.*s",(unsigned int)k,p);
  175.           if( strncmpi(tmp,"http://",7)!=0 &&
  176.               strncmpi(tmp,"ftp://",6)!=0 &&
  177.               strncmpi(tmp,"news:",5)!=0 &&
  178.               strncmpi(tmp,"mailto:",7)!=0  )
  179.              {
  180.               html_view(tmp);
  181.              }
  182.          }
  183.  
  184.         target_name=0;
  185.        }/* target_name */
  186.  
  187.      first_time=0;
  188.  
  189.      if( seek_cnt!=0 )
  190.        {
  191.         if( seek_cnt<0 )
  192.           {
  193.            i=-seek_cnt;
  194.            p=seek_base-1;
  195.            if( *p=='\n' ) p--;
  196.            for( ; p!=bs ; p-- )
  197.             if( *p=='\n' )
  198.               {
  199.                i--;
  200.                if( i==0 ) { p++; break; }
  201.               }
  202.            top=p;
  203.           }
  204.         else if( seek_cnt>0 )
  205.           {
  206.            i=seek_cnt;
  207.            p=seek_base;
  208.            for( ; p!=bq ; p++ )
  209.             if( *p=='\n' )
  210.               {
  211.                i--;
  212.                if( i==0 ) { p++; break; }
  213.               }
  214.            if( p==bq ) { seek_base=bq-1; seek_cnt=-1; continue; }
  215.            top=p;
  216.           }
  217.         
  218.         seek_cnt=0;
  219.        }/* seek */
  220.  
  221.      if( maxtop!=0 )
  222.         barpos=((top-bs)*(BARLEN))/maxtop;
  223.      else
  224.         barpos=BARLEN-1;
  225.  
  226.      if( barpos>=BARLEN ) barpos=BARLEN-1;
  227.      
  228.      if( bar_hooked )
  229.        {
  230.         seek_base=top;
  231.         if( forced_barpos==0 )
  232.           {
  233.            top=bs;
  234.            barpos=0;
  235.           }
  236.         else if( forced_barpos==BARLEN-1 && barpos!=forced_barpos )
  237.           {
  238.            old_barpos=barpos;
  239.            seek_base=bq;
  240.            seek_cnt=-N;
  241.            continue;
  242.           }
  243.         else if( forced_barpos<barpos && forced_barpos<old_barpos )
  244.           {
  245.            old_barpos=barpos;
  246.            seek_cnt=-1;
  247.            continue;
  248.           }
  249.         else if( forced_barpos>barpos && forced_barpos>old_barpos )
  250.           {
  251.            old_barpos=barpos;
  252.            seek_cnt=+1;
  253.            continue;
  254.           }
  255.        }/* bar_hooked */
  256.      
  257.      old_barpos=barpos;
  258.  
  259.      if( top!=old_top ) force_redraw=1;
  260.  
  261.      if( force_redraw==1 || check_mouse==1 )
  262.        {
  263.         p=top;
  264.         k=0;
  265.         len=0;
  266.         line=0;
  267.         link_started=0;
  268.         link_under_mouse=0;
  269.  
  270.         while(1)
  271.            {
  272.             if( *p=='\n' || len==LEN || p==bq )
  273.               {
  274.                if( *p!='\n' && p!=bq ) while( *p!='\n' && p!=bq ) p++;
  275.                if( *p=='\n' && p!=bq ) p++;
  276.                
  277.                while( len!=LEN )
  278.                   {
  279.                    tmp[len]=' ';
  280.                    col[len] = TEXT_COLOR;
  281.                    len++;
  282.                   }
  283.  
  284.                if( force_redraw==1 )
  285.                  {
  286.                   for( i=0, j=0 ; i<LEN ; i++ )
  287.                      {
  288.                       str[j++]=tmp[i];
  289.                       str[j++]=col[i];
  290.                      }
  291.               
  292.                   load_window( X+2, Y+1+line, LEN, 1, str );
  293.                  }
  294.  
  295.                line++;
  296.                len=0;
  297.  
  298.                if( p==bq || line==N )
  299.                  {
  300.                   if( line!=N )
  301.                      clear_window( TEXT_COLOR, X+2, Y+1+line, LEN, N-line );
  302.                   break;
  303.                  }
  304.                continue;
  305.               }
  306.  
  307.             if( *p=='\r' ) { p++; continue; }
  308.  
  309.             if( *p=='<' && ( p[1]>='A' && p[1]<='Z' || p[1]=='/' ||
  310.                              p[1]>='a' && p[1]<='z' || p[1]=='!' ) )
  311.               {
  312.                if( link_started==0 && strncmpi(p,"<A HREF=",8)==0 )
  313.                  {
  314.                   link_reference=p+8;
  315.                   link_started=1;
  316.                  }
  317.                else if( link_started==1 && strncmpi(p,"</A>",4)==0 )
  318.                  {
  319.                   link_started=0;
  320.                  }
  321.                else if( strncmpi(p,"<HR",3)==0 )
  322.                  {
  323.                   while( len!=LEN ) 
  324.                      {
  325.                       tmp[len]='─';
  326.                       col[len]=TEXT_COLOR;
  327.                       len++;
  328.                      }
  329.                  }
  330.                while( *p!='>' && p!=bq ) p++;
  331.                if( *p=='>' ) p++;
  332.                continue;
  333.               }
  334.             
  335.             ch=*p;
  336.             
  337.             if( *p=='&' )
  338.               {
  339.                     if( strncmp(p,">",4)==0 && bq-p>4 ) { ch='>'; p+=3; }
  340.                else if( strncmp(p,"<",4)==0 && bq-p>4 ) { ch='<'; p+=3; }
  341.                else if( strncmp(p,""",6)==0 && bq-p>6 ) {ch='\"';p+=5;}
  342.                else if( strncmp(p," ",6)==0 && bq-p>6 ) {ch=' '; p+=5;}
  343.               }
  344.  
  345.             tmp[len] = ( ch!='\t' ) ? ch : ' ';
  346.             col[len] = link_started ? LINK_COLOR : TEXT_COLOR;
  347.             
  348.             if( check_mouse && line==mline && len==mpos && link_started )
  349.                link_under_mouse=link_reference;
  350.  
  351.             len++;
  352.             if( ch!='\t' || len%8==0 ) p++;
  353.            }
  354.  
  355.         if( force_redraw==1 )
  356.           {
  357.            bottom=p;
  358.       
  359.            write_string(BORDER_COLOR, X+2+LEN-6, Y+1, "\x1B Back");
  360.  
  361.            for( i=0 ; i<BARLEN ; i++ )
  362.               {
  363.                write_char( BORDER_COLOR, BARX, BARY+i, (i!=barpos)?'░':'▓');
  364.               }
  365.  
  366.            old_top=top;
  367.            force_redraw=0;
  368.           }
  369.        }/* redraw */
  370.  
  371.      if( link_under_mouse!=0 )
  372.        {
  373.         p=link_under_mouse+1;
  374.         k=strchr(p,'\"')-p;
  375.         if( k<0 || k>LEN-12 ) k=LEN-12;
  376.         sprintf(tmp,"%.*s",(int)k,p);
  377.         if( mesg==0 ) mesg=tmp;
  378.        }
  379.      
  380.      clear_window(TEXT_COLOR,X+2,TY,LEN,1);
  381.      if( mesg!=0 )
  382.        {
  383.         write_string(TEXT_COLOR,X+2,TY,mesg);
  384.         mesg=0;
  385.        }
  386.  
  387.      if( enable_timer )
  388.        {
  389.         ev.timer=1;
  390.         get_event( &ev, EV_KEY | EV_MOUSE | EV_TIMER );
  391.         enable_timer=0;
  392.        }
  393.      else
  394.        {
  395.         get_event( &ev, EV_KEY | EV_MOUSE );
  396.        }
  397.  
  398.  
  399.      if( ev.ev_type==EV_KEY && ev.key==27 ) break;
  400.  
  401.      if( ev.ev_type & (EV_MOUSE | EV_TIMER) )
  402.        {
  403.         if( ((ev.ev_type & EV_TIMER) || left_was_pressed==0) && ev.left==1 )
  404.           {
  405.            if( ev.x>X+2+LEN-7 && ev.x<X+2+LEN && ev.y==Y+1 )
  406.              {
  407.               if( num_backs==0 ) break;
  408.               top=link_back[--num_backs];
  409.               force_redraw=1;
  410.              }
  411.            else if( link_under_mouse!=0 )
  412.              {
  413.               p=link_under_mouse;
  414.               if( *p=='\"' ) p++;
  415.               target_name=p;
  416.              }
  417.            else if( ev.x==BARX && ev.y>=BARY-1 && ev.y<=BARY+BARLEN )
  418.              {
  419.               if( ev.y==BARY-1 )                     /* up */
  420.                 {
  421.                  if( top!=bs ) { seek_base=top; seek_cnt=-1; }
  422.                  enable_timer=1;
  423.                 }
  424.               else if( ev.y==BARY+BARLEN )                 /* down */
  425.                 {
  426.                  if( bottom!=bq ) { seek_base=top; seek_cnt=+1; }
  427.                  enable_timer=1;
  428.                 }
  429.               else
  430.                 {
  431.                  if( ev.y==BARY+barpos ) bar_hooked=1;
  432.                 }
  433.              }/* bar */
  434.           }/* left_button_pressed */
  435.  
  436.         if( ev.x>X+1 && ev.x<X+LEN+2 && ev.y>Y && ev.y<Y+N+1 )
  437.           {
  438.            check_mouse=1;
  439.            mline=ev.y-Y-1;
  440.            mpos=ev.x-X-2;
  441.           }
  442.         else
  443.           {
  444.            check_mouse=0;
  445.            link_under_mouse=0;
  446.           }
  447.  
  448.         left_was_pressed=ev.left;
  449.         if( ev.left==0 ) bar_hooked=0;
  450.         if( bar_hooked )
  451.           {
  452.            if( ev.y<=BARY ) forced_barpos=0;
  453.            else if( ev.y<BARY+BARLEN ) forced_barpos=ev.y-BARY;
  454.            else forced_barpos=BARLEN-1;
  455.           }
  456.        }/* mouse */
  457.      else if( num_backs!=0 && (ev.key==8 || ev.scan==0x9B00) ) /* back */
  458.        {
  459.         top=link_back[--num_backs];
  460.         force_redraw=1;
  461.        }
  462.      else if( ev.scan==0x47E0 || ev.scan==0x4700 ) /* Home */
  463.        {
  464.         top=bs;
  465.        }
  466.      else if( ev.scan==0x48E0 || ev.scan==0x4800 ) /* up */
  467.        {
  468.         if( top!=bs ) { seek_base=top; seek_cnt=-1; }
  469.        }
  470.      else if( ev.scan==0x49E0 || ev.scan==0x4900 ) /* PgUp */
  471.        {
  472.         if( top!=bs ) { seek_base=top; seek_cnt=1-N; }
  473.        }
  474.      else if( ev.scan==0x4FE0 || ev.scan==0x4F00 ) /* End */
  475.        {
  476.         if( bottom!=bq ) { seek_base=bq; seek_cnt=-N; }
  477.        }
  478.      else if( ev.scan==0x50E0 || ev.scan==0x5000 ) /* down */
  479.        {
  480.         if( bottom!=bq ) { seek_base=top; seek_cnt=+1; }
  481.        }
  482.      else if( ev.scan==0x51E0 || ev.scan==0x5100 ) /* PgDn */
  483.        {
  484.         if( bottom!=bq ) { seek_base=top; seek_cnt=N-1; }
  485.        }
  486.      
  487.     }/* while(1) - main loop */
  488.  
  489.  load_window(X,Y,W,H,buf);
  490.  free(text_buf);
  491.  free(buf);
  492. }/* html_view */
  493.