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