ascii

From twext

Jump to: navigation, search

ascii is dead so dodo xcroll in unicode needs update to code below

image:UnicodeGrowth2008.gif

this is old ascii twext formatter written in c (i think) by urivan saaib

note: script below does more complex "text format" with line breaks
we can focus simply on lyricc format for now and in unicode

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

	/* Extension asignada por default al archivo de salida */
	#define EXT ".txt"
        /* Directorio donde se encuentran los archivos de traduccion */
        #define PATH "/usr/home/www/cgi-bin/twext/TWEXT"




int   MAXLENGTH=55;


int main(int, char *[]);
int OutFile (FILE *, FILE *);



/* 
 *
 * main (void)   Inicia y verifica la existencia de los archivos de
 *               lectura en el programa
*/
main(int argv, char *argvc[])  {
char File_Src[256], File_Trg[256];
FILE *TwSrc, *FTarget, *FTwEXT;

if (argv!=4) {
     printf("Content-type: text/html\n\n");
     printf ("Argv=%d<br>Argvc[1]=%s<BR>Argvc[2]=%s<br>",argv,argvc[1],argvc[2]);
     printf ("<HTML><HEAD><TITLE>ERROR</TITLE></HEAD><BoDy BGCoLoR=#ffffff \
       TeXT=#0d0274>\n<Center>\n<a HReF=/cgi-bin/twext/twexter.pl><IMG \
       SRC=/pix/twexti.gif WiDTH=40 HeIGHt=66 aLiGN=MiDDLe NaTuRaLSiZeFLaG=3 \
       BoRDeR=1></a>\n<BR><BR>\nTwEXT OutPut Error.</BODY></hTML>");
     exit(1);
}

   sprintf(File_Src,"%s%s",PATH,argvc[1]);
   sprintf(File_Trg,"%s%s",PATH,argvc[2]);

	TwSrc=fopen(File_Src,"r");
	if (TwSrc==NULL) {
	   printf ("1");
	   exit(1);
	}

	if ( (FTarget=fopen(File_Trg,"r")) == NULL ) {
	   printf ("2");
	   exit(1);
	}

  MAXLENGTH = 0;
  MAXLENGTH = atoi(argvc[3]);
  if (MAXLENGTH<1)
  {
     printf ("1");
     exit(1);
  }

  /*printf ("MAXLENGTH= %d",MAXLENGTH);*/

  OutFile(TwSrc,FTarget);

  fclose(TwSrc);
  fclose(FTarget);

  return 1;
}


/*
 * OutFile (); Hace el procedimiento de crear el archivo texto con
 *		el contenido necesario mezclado de los dos archivos
 *		el archivo MOTHER y el STUDY.
 *
 */
OutFile (FILE *TwSrc, FILE *TwTrg)  {
	/* lineOfFile almacenar  los caracteres leidos hasta el m ximo
		limite por linea (MAXLENGTH). Solo con el archivo TwSrc
	   pasado : Obtendra el valor de la posicion del ultimo enter
	*/

	char lineOfSrc[256],
	     lineOfTrg[256],
	     a[4],
	     Source[256], Target[256];
	int  finDeLinea=0,tresEnters=0,
	     data_Src=0,
	     data_Trg=0, chSrc,chTrg,
	     ultimo_Char_Src=0,
	     Rompe_Silaba=0,
	     longitud_De_Linea_Src=0,
	     longitud_De_Linea_Trg=0,
	     actual_Linea_Src=0,
	     actual_Linea_Trg=0,
	     i,ii,index_Src,index_Trg,espacios,
	     middleSrc,middleTrg,link=0,link1=0;
	float porcentaje;


  /* Inicializamos los arreglos */
  lineOfSrc[0]='\0';  lineOfTrg[0]='\0';

  printf ("<TR><TD><PRE>\n");

  /* Mientras no se termine la informacion en los archivos se ejecuta el ciclo*/
     sprintf(Source,"");  sprintf(Target,"");
     sprintf(lineOfTrg," ");
     sprintf(lineOfSrc," ");

     while (!finDeLinea && !tresEnters && data_Src!=-1 && data_Trg!=-1 )  {

	data_Src=fgetc(TwSrc); espacios=0;
        if (data_Src == '<') { link = 1; link1 = 1;}
	else if (data_Src == '>') { link = 0; }

	while ( (data_Src!='\n' || link) && data_Src!=-1)
	{
         if (!link) {  /* This makes us sure that the link ha'nt just changed*/
	   if (!link1) {  /*Verificamos si acaba e cambiar la bandera */
	      lineOfSrc[actual_Linea_Src++]=toupper(data_Src); /*Sino, ntonces agregar*/
	      if (data_Src!=' ')
	         longitud_De_Linea_Src+=2;
	      else {
	         longitud_De_Linea_Src+=4;
	         espacios++;
	      }
	   } else {link1 = 0; }
	 }
	 data_Src=fgetc(TwSrc);
         if (data_Src == '<') { link = 1; link1 = 1; }
         else if (data_Src == '>') { link = 0; }
	}
        link1 = 0;  /* Aseguramos el cambio constante de la variable a 0 */

	ultimo_Char_Src=lineOfSrc[actual_Linea_Src-1];
	/* Checamos el siguiente caracter despues del \n */
        data_Src = fgetc(TwSrc);
        if (data_Src == '<') { link = 1; link1 = 1; }
        else if (data_Src == '>') { link = 0; }
	if ( data_Src =='\n')  {
	  /* si se leyo un \n se comparan el ultimo caracter leido */
	   if (ultimo_Char_Src!='.'  && ultimo_Char_Src!=';' && ultimo_Char_Src!=':' && ultimo_Char_Src!='?' && ultimo_Char_Src!='!' ) {
	       lineOfSrc[actual_Linea_Src++]='.';
	   }
	   data_Src=fgetc(TwSrc);
           if (data_Src == '<') { link = 1;  link1 = 1;}
           else if (data_Src == '>') { link = 0; }
	   if ( data_Src =='\n' && !link)  {
	      tresEnters=1; /* 2 = Se imprime el texto antes de cerrar la tabla */
	      /*tabEspace=1;*/
	   }
	}

	data_Trg=fgetc(TwTrg);
	/* Ahora leemos la parte Target */
	while ( data_Trg!='\n' && data_Trg!=-1)
	{
	   lineOfTrg[actual_Linea_Trg++]=data_Trg; longitud_De_Linea_Trg++;
	   /*putc(data_Trg,stdout);*/
	   data_Trg=fgetc(TwTrg);
	}

	if ( (data_Trg=fgetc(TwTrg)) =='\n')
	{
	   if ( (data_Trg=fgetc(TwTrg)) =='\n')
	   {
	      tresEnters=1;
	   }
	} /* Fin de "if (data_Trg!='\n')" */

	if(longitud_De_Linea_Src>MAXLENGTH || longitud_De_Linea_Trg>MAXLENGTH)
	{
	   finDeLinea=1;
	}

       /*
	 Realizamos operaciones para determinar el tipo de acomodo que se tiene
	 que hacer a cada una de las cadenas para que se formateen en modo texto
	 ASCII.
       */

       if (!finDeLinea) {
	  /*
	    Verificar cual de las dos cadenas es mayor y cuantos caracteres para
	    poder formatear correctamente los textos.
	  */
	  if ( (actual_Linea_Src*2)+(espacios*2)>actual_Linea_Trg) {
	     /*
	       Obtenemos los caracteres de diferencia para agregar la mitad de
	       los que restan a la izquierda y derecha de la cadena menor.
	     */
	     i = ( ( (actual_Linea_Src*2)+espacios*2) - actual_Linea_Trg) / 2;
	     /*
	       Agregamos a la izquierda de la cadena
	     */
	     for (ii=0; ii<i; ii++)
		strcat(Target," ");
	     for (ii=0; ii<actual_Linea_Trg; ii++) {
		sprintf(a,"%c",lineOfTrg[ii]);
		strcat(Target,a);
	     }
	     /*
	       Agregamos a la derecha de la cadena
	     */
	     for (ii=0; ii<i; ii++)
		strcat(Target," ");


	     strcpy(a,"");
	     for (ii=0; ii<actual_Linea_Src; ii++) {
		if (lineOfSrc[ii] != ' ')  {
		   sprintf(a,"%c ",lineOfSrc[ii]);
		} else {
		   sprintf(a,"    ");
		}
		strcat(Source,a);
	     }
	     longitud_De_Linea_Trg = longitud_De_Linea_Src;
	  } else {
	     /*
	       Obtenemos los caracteres de diferencia para agregar la mitad de
	       los que restan a la izquierda y derecha de la cadena menor.
	     */
	     i = (actual_Linea_Trg - actual_Linea_Src) / 2;
	     /*
	       Agregamos a la izquierda de la cadena
	     */
	     for (ii=0; ii<i; ii++)
		strcat(Source," ");
	     for (ii=0; ii<actual_Linea_Src; ii++) {
		if (lineOfSrc[ii] != ' ')  {
		   sprintf(a,"%c ",lineOfSrc[ii]);
		} else {
		   sprintf(a,"    ");
		}
		strcat(Source,a);
	     }
	     /*
	       Agregamos a la derecha de la cadena
	     */
	     for (ii=0; ii<i; ii++)
		strcat(Source," ");



	     for (ii=0; ii<actual_Linea_Trg; ii++) {
                if (lineOfTrg[ii] != ' ')  {
                   sprintf(a,"%c ",lineOfTrg[ii]);
                } else {
                   sprintf(a,"    ");
                }
		strcat(Target,a);
	     }

	  }  /* else (Src>Trg) */
	  strcat(Source,"    "); longitud_De_Linea_Src+=4;
	  strcat(Target,"    "); longitud_De_Linea_Trg+=4;
       } else {
	  /*
	     Si se alcanzo la longitud maxima en caracteres MAXLENGTH
	     entonces se obtiene los caracteres que completan la longitud
	     maxima y se hace un corte en dos, la parte izquierda se linea
	     todo a la derecha y se escribe en el archivo la linea completa
	     (Source y Target) y la parte derecha se almacena en una nueva
	     linea alineado a la izquierda.
	  */
	  index_Src =  (actual_Linea_Src*2+espacios*2) - (longitud_De_Linea_Src - MAXLENGTH);

	  /*
	    Localizamos el punto exacto en caracteres y longitud simulada
	    donde se encuentra el punto de "quiebre".
	  */
	  i = 0; middleSrc = 0;
	  while (middleSrc<index_Src)  {
	     if (lineOfSrc[i++] != ' ')
		middleSrc+=2;
	     else
		middleSrc+=4;
	  }

	  /*
	     index_Src ahora contiene el numero de caracteres reales donde se
	     localiza el punto de "qiebre".
	  */
	  index_Src = i;

	  /*
	    Localizamos ahora el inicio de palabra mas proximo(hacia la izq.)
	  */
	  while (index_Src>0 && lineOfSrc[index_Src]!=' ')
	     index_Src--;

	  /*
	    Ahora contamos cuantos caracteres simulados existen a desplegar
	    dentro de los caracteres entre 0<index_Src.
	  */
	  i=0; middleSrc=0;
	  while (i<index_Src) {
	     if (lineOfSrc[i++] != ' ')
		middleSrc+=2;
	     else
		middleSrc+=4;
	  }

	  /*
	     Obtenemos el porcentaje a partir en el Study Languaje.
	  */
	  porcentaje = index_Src / (float)actual_Linea_Src;
	  /*
	     Localizamos el lugar donde se hara el corte.
	  */
	  index_Trg = porcentaje * actual_Linea_Trg;

	  if (middleSrc > index_Trg) {
	     /*
		Agregamos a la izquierda de la cadena de lineOfTrg
	     */
	     i = (middleSrc - index_Trg);
	     for (ii=0; ii<i; ii++)
		strcat(Target," ");
	     for (ii=0; ii<index_Trg; ii++) {
		sprintf(a,"%c",lineOfTrg[ii]);
		strcat(Target,a);
	     }
	     for (ii=0; ii<index_Src; ii++) {
		if (lineOfSrc[ii] != ' ')  {
		   sprintf(a,"%c ",lineOfSrc[ii]);
		} else {
		   sprintf(a,"    ");
		}
		strcat(Source,a);
	     }
	  } else {
	     /*
		Agregamos a la izquierda de la cadena de lineOfSrc
	     */
	     i = (index_Trg - middleSrc);
	     for (ii=0; ii<i; ii++)
		strcat(Source," ");
	     for (ii=0; ii<index_Src; ii++) {
		if (lineOfSrc[ii]!= ' ')
		   sprintf(a,"%c ",lineOfSrc[ii]);
		else
		   sprintf(a,"    ");
		strcat(Source,a);
	     }
	     for (ii=0; ii<index_Trg; ii++) {
		sprintf(a,"%c",lineOfTrg[ii]);
		strcat(Target,a);
	     } /*for*/
	  } /*else*/
	  if (index_Src==0)  {
	     ii = (actual_Linea_Src*2+espacios*2) - (longitud_De_Linea_Src - MAXLENGTH);
	     for (i=0; i<ii;i++)  {
		strcat(Source," ");
		strcat(Target," ");
	     }
	  }
	  if (ii>1) strcat(Target,"-");
       }  /*if (!Fin de linea) */


       if (finDeLinea || tresEnters || data_Src==-1 || data_Trg==-1) {
	  /*
	     Escribimos en el archivo el contenido de las variables
	     lo cual es el texto formateado
	  */
	  printf("%s\n",Source);
	  printf("%s\n",Target);
	  printf("\n");

	  strcpy(Source,"");
	  strcpy(Target,"");
	  /*
	     Verificamos si los consecutivos no son \n's.
	  */
	  if (tresEnters)  {
	     printf ("\n");
	     data_Src=fgetc(TwSrc);
	     if (data_Src =='<') { link=1; link1 = 1; }
	     else if (data_Src == '>') { link=0; }
	     data_Trg=fgetc(TwTrg);
	     while( data_Src !=-1 && data_Src == '\n' &&
		  data_Trg !=-1 && data_Trg == '\n')
		{
		 printf ("\n");
		 data_Src=fgetc(TwSrc);
             	 if (data_Src =='<') { link=1; link1 = 1; }
             	 else if (data_Src == '>') { link=0; }
		 data_Trg=fgetc(TwTrg);
		}
	     longitud_De_Linea_Src = 0;
	     longitud_De_Linea_Trg = 0;
	  }
	  /*
	    Verificamos si se alcanzo la maxima longitud de linea.
	  */
	  if (finDeLinea) {
	     finDeLinea=0;
	     if ((actual_Linea_Src*2+espacios*2) > actual_Linea_Trg) {
	       /*
		 Agregamos a la derecha de la cadena de lineOfTrg
	       */
	       while (index_Trg>0 && lineOfTrg[index_Trg]==' ')
		  index_Trg ++;
	       for (ii=index_Trg; ii<actual_Linea_Trg; ii++) {
		  sprintf(a,"%c",lineOfTrg[ii]);
		  strcat(Target,a);
	       }

	       /*
		 Avanzamos los espacios en blanco.
	       */
	       while (index_Src>0 && lineOfSrc[index_Src]==' ')  {
		  middleSrc += 4; index_Src++;
	       }

	       if (index_Src==0)
		  middleSrc=0;

	       i = ( (actual_Linea_Src*2+espacios*2) - middleSrc) - (actual_Linea_Trg - index_Trg) ;

	       /*
		Insertamos tantos espacios en blanco como falten para
		completar la longitud de actual_Linea_Src.
	       */
	       for (ii=0; ii<i; ii++)
		     strcat(Target," ");
	       for (ii=index_Src; ii<actual_Linea_Src; ii++) {
		  if (lineOfSrc[ii] != ' ')  {
		     sprintf(a,"%c ",lineOfSrc[ii]);
		  } else {
		     sprintf(a,"    ");
		  }
		  strcat(Source,a);
	       }
	       longitud_De_Linea_Src = ( (actual_Linea_Src*2+espacios*2) - middleSrc);
	       longitud_De_Linea_Trg = longitud_De_Linea_Src;
	   } else {
	      /*
		Agregamos a la derecha de la cadena de lineOfSrc
	      */
	       for (ii=index_Src; ii<actual_Linea_Src; ii++) {
			 sprintf(a,"%c",lineOfSrc[ii]);
			 strcat(Source,a);
	       }
	       /*
		Insertamos tantos espacios en blanco como falten para
		completar la longitud de actual_Linea_Trg.
	       */
	       if (index_Src==0)
		  middleSrc=0;

	       i = (actual_Linea_Trg - index_Trg) - (actual_Linea_Src*2+espacios*2) - middleSrc;

	       for (ii=0; ii<i; ii++)
			strcat(Source," ");
	       for (ii=index_Trg; ii<actual_Linea_Trg; ii++) {
			sprintf(a,"%c",lineOfTrg[ii]);
			strcat(Target,a);
	       } /*for*/
	      longitud_De_Linea_Src = actual_Linea_Trg - index_Trg;
	      longitud_De_Linea_Trg = actual_Linea_Trg - index_Trg;
	   } /* Src>Trg*/
	  strcat(Source,"    "); longitud_De_Linea_Src+=4;
	  strcat(Target,"    "); longitud_De_Linea_Trg+=4;
       } /* if (!findelinea) */

       if (data_Src==-1 || data_Trg==-1) {
	   if (!tresEnters)  {
	      printf("%s\n",Source);
	      printf("%s\n",Target);
	      printf("\n");
	   }
       }

       if (tresEnters) tresEnters=0;


  } /* (findelinea || tresEnters) */
    actual_Linea_Src = 0;
    actual_Linea_Trg = 0;
    sprintf(lineOfSrc," ");
    sprintf(lineOfTrg," ");
    if (data_Src!=' ' && data_Src!=-1)
      if (!link) {
	if (!link1) {lineOfSrc[actual_Linea_Src++] = toupper(data_Src); longitud_De_Linea_Src+=2; }
	else { link1 = 0; }
       }
    if (data_Trg!=' ' && data_Trg!=-1)
       lineOfTrg[actual_Linea_Trg++] = data_Trg; longitud_De_Linea_Trg++;

  }  /* while (!findelinea && !tresEnters) */

  printf ("</PR x E></TD>"); <!-- remove " x " -->
  return 1;
}

this old ascii twexter probably centered twxt chunks under TEXT chunks..
preferable now is twxt chunk prints FLUSH LEFT per each TEXT chunk (see below)

dodo xcroll shows ascii preview, probably useful..
in rare case that 'twxt' is wider than 'TEXT' then TEXT must
adapt to width of twxt, ie 3 SPACES ADDED TO "WE" TEXT CHUNK
in order to fit the "nosotros" twxt translation chunk:

W E      A R E   F A M I L Y
nosotros somos   familia

M O T H E R ,  B R O T H E R ,  S I S T E R   A N D   M E
madre          hermano          hermana       y       yo


Retrieved from "http://twext.com/ascii"
Personal tools