/***************************************************************************/
// "Меркурий"-"Правда" - open source переводчик
// распространяется в соответсвии с лицензией GNU v 2.0
//
// данные, для отображения подсказки
// Анисимов Д.В. сегодня
/***************************************************************************/
# include <string.h>
# ifndef __WIN__
# include <unistd.h>
#endif
# include <list.h>
# include <mylib.h>
# include <help.h>
extern char *HelpDir ;
/***************************************************************************/
long FileToMass( char *File, char **_Mass )
{
char *Mass ; long L ; FILE *fr ;
fr=Fopen( File,"r" );
L=FileLength( fr );
Mass=(char *)Calloc( L+1,1 );
fread( Mass,L,1,fr );
Fclose(fr);
*_Mass=Mass ;
return L ;
}
/***************************************************************************/
long FileToWord( char *File, char ***_Str )
{ long i,j,L ;
char *m,**ss ;
L=FileToMass( File, &m );
for( i=0 ; i<L ; i++ )
if( m[i]==' ' || m[i]=='\n' || m[i]=='\r' || m[i]=='\t' ) m[i]=0 ;
for( i=j=0 ; i<L ; i++ )
if( m[i]==0 && m[i+1]!=0 ) j++ ;
ss=(char **)Calloc(j+1,sizeof(char *));
j=0 ;
if( m[0]!=0 ) ss[j++]=m ;
for( i=0 ; i<L ; i++ )
if( m[i]==0 && m[i+1]!=0 ) ss[j++]=m+i+1 ;
*_Str=ss ;
return j ;
}
/******************************************************************************/
void t_HelpData :: make( void )
{ long i,i1,z ;
char **ss ;
char Str[200] ;
Strcpy( Path,HelpDir,200 );
unlink( "mkhelp.tmp" );
sprintf( Str,"ls %s/*.html >> mkhelp.tmp",Path );
system( Str );
n_File=FileToWord( "mkhelp.tmp",&ss );
File=(t_HelpFile *)Calloc( n_File,sizeof(t_HelpFile) );
for( i=0 ; i<n_File ; i++ )
{ for( i1=z=0 ; ss[i][i1]!=0 ; i1++ )
if( ss[i][i1]=='/' ) z=i1+1 ;
strcpy( File[i].Name,ss[i]+z );
}
unlink( "mkhelp.tmp" );
for( i=0 ; i<n_File ; i++ )
read_file( i ) ;
mk_href( );
}
/******************************************************************************/
void t_HelpData :: read_file( long i_File )
{
long i,i1,j,j1,z,L ;
char *Text,f ;
char Str[200] ;
t_HelpLink L1 ;
sprintf( Str,"%s/%s",Path,File[i_File].Name );
L=FileToMass( Str,&Text );
strcpy( L1.Name,File[i_File].Name ) ;
L1.i_file=i_File ;
L1.i_pos =0 ;
Link.add( L1 );
f=0 ;
for( i=j=0 ; i<L ; i++ )
{ if( 0==strncmp(Text+i,"<pre>" ,5) )
{ f=1 ; i+=5 ; }
if( 0==strncmp(Text+i,"</pre>",6) ) break ;
if( 0==strncmp(Text+i,"<b>" ,3) ) { Text[j++]=3 ; i+=3 ; }
if( 0==strncmp(Text+i,"</b>",4) ) { Text[j++]=1 ; i+=4 ; }
if( 0==strncmp(Text+i,"<a name=",8) )
{ for( i1=i+9,j1=0 ; i1<L && Text[i1]!='"' ; i1++ )
L1.Name[j1]=Text[i1] ;
L1.Name[j1]=0 ;
L1.i_file=i_File ;
L1.i_pos =j ;
Link1.add( L1 );
i=i1+5 ;
continue ;
}
if( 0==strncmp(Text+i,"<a href=",8) )
{ Text[j++]=2 ;
for( i1=i+9,j1=0 ; i1<L && Text[i1]!='<' ; i1++ )
{ if( Text[i1]=='>' ) z=i1 ;
L1.Name[j1++]=Text[i1] ;
}
L1.i_file=0 ;
L1.i_pos =0 ;
L1.Name[j1]=0 ;
Link.add( L1 );
i=z+1 ;
}
if( 0==strncmp(Text+i,"</a>",4) )
{ Text[j++]=1 ;
i+=3 ; continue ;
}
if( f==1 )
Text[j++]=Text[i] ;
}
Text[j]=0 ;
File[i_File].Text =Text ;
File[i_File].l_Text=j ;
}
/******************************************************************************/
void t_HelpData :: mk_href( void )
{ long i,i1,z,z1 ;
char *Str ;
for( i=0 ; i<Link.j ; i++ )
{ // ------- найти начало имени ссылки --------------
Str=Link[i].Name ;
for( i1=0,z=-1 ; Str[i1]!=0 ; i1++ )
if( Str[i1]=='>' ) { z=i1 ; break ; }
// ------- проставить файл и позицию --------------
z1=find_link( Link[i].Name );
if( 0<=z1 )
{ Link[i].i_file=Link1[z1].i_file ;
Link[i].i_pos =Link1[z1].i_pos ;
}
strcpy( Str,Str+z+1 );
}
}
/******************************************************************************/
long t_HelpData :: find_link( char *Str )
{ char *Str1="" ;
long i,i_File=-1 ;
for( i=0 ; Str[i]!=0 ; i++ )
if( Str[i]=='"' ) { Str[i]=0 ; break ; }
for( i=0 ; Str[i]!=0 ; i++ )
if( Str[i]=='#' ) { Str[i]=0 ; Str1=Str+i+1 ; }
for( i=0 ; i<n_File ; i++ )
if( 0==strcmp(File[i].Name,Str) )
{ i_File=i ; break ; }
if( i_File<0 ) return -1 ;
for( i=0 ; i<Link1.j ; i++ )
if( Link1[i].i_file==i_File && 0==strcmp(Link1[i].Name,Str1) )
return i ;
return -1 ;
}
/******************************************************************************/
char
* t_HelpData :: get_help( char *Str )
{ long i ;
static char *ss="\nПодсказка на эту тему не найдена.\n" ;
for( i=0 ; i<Link.j ; i++ )
{ if( 0==strcmp(Link[i].Name,Str) )
return File[Link[i].i_file].Text ;
}
return ss ;
}
/******************************************************************************/
void t_HelpData :: hprint( void )
{ long i ;
for( i=0 ; i<Link.j ; i++ )
printf("\n %s %ld",File[Link[i].i_file].Name,Link[i].i_pos );
printf("\n");
}
DEFINE_LIST_BTYPE( t_HelpLink, t_HL_List )