Funciones para areas de caracteres.
Funciones
Set AreSub(Set linSet, Real x, Real y, Real w, Real h)Real AreCmp(Set linSetA, Set linSetB)Set AreWri(Set linSet, Set newSet, Real x, Real y)Set AreFnd(Set linSet, Set fndSet)Set AreRep(Set linSet, Set oldSet, Set newSet)Set AreCic(Set linSet, Set parSet)Real AreTrc(Set linSet, Real numCel, Text preFil, Real numCol, Real trcCtr)//////////////////////////////////////////////////////////////////////////////
Set AreSub(Set linSet, // Conjunto de linea
Real x, // Coordenada X
Real y, // Coordenada Y
Real w, // Ancho, width
Real h) // Alto, height
//////////////////////////////////////////////////////////////////////////////
{
Real xEnd = Min(x+w-1,TextLength(linSet[1]));
Real yEnd = Min(y+h-1,Card(linSet));
For(y, yEnd, Text(Real lin) { Sub(linSet[lin], x, xEnd) })
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Dado un conjunto de lineas de texto retorna un conjunto de lineas de texto
cuya esquina superior izquierda corresponden a la posicion x e y y su ancho y
alto a w y h. Esto es si x=3, y=4, w=4 y h=2 entonces de:
123456789
2ABCDEFGH
3ABCDEFGH
4Apor FGH => <por >
5AaquiFGH <aqui>
Se asume que el conjunto de textos es rectangular y no vacio.",
AreSub);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Real AreCmp(Set linSetA, // Primer conjunto de lineas
Set linSetB) // Segundo conjunto de lineas
//////////////////////////////////////////////////////////////////////////////
{
Real carA = Card(linSetA);
Real carB = Card(linSetB);
If(NE(carA, carB), FALSE,
{
Real end = Copy(FALSE);
Real ok = Copy(TRUE);
Real lin = 1;
Real While(Not(end),
{
If(linSetA[lin]!=linSetB[lin],
{ Real(end:=TRUE); Real(ok:=FALSE); FALSE },
{
Real(lin:=lin+1);
If(LE(lin,carA), TRUE, { Real(end:=TRUE); FALSE })
})
});
Copy(ok)
})
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna TRUE si dos areas de texto son iguales, esto es, compara el primer
conjunto de lineas con el segundo conjunto de lineas.
Esta funcion corta y retorna FALSE en cuanto una comparacion falla
Para poder cortar se apoya en la funcion While().",
AreCmp);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set AreWri(Set linSet, // Area que hay que transformar
Set newSet, // Area mas pequeña que se va escribir sobre linSet
Real x, // Coordenada X del punto donde se empieza a escribir
Real y) // Coordenada Y del punto donde se empieza a escribir
//////////////////////////////////////////////////////////////////////////////
{
Real linLen = TextLength(linSet[1]); // Ancho, se asume rectangulo
Real newLen = TextLength(newSet[1]); // Ancho, se asume rectangulo
Set ini = For(1, y-1, Text(Real pos)
{ linSet[pos] });
Set rep = For(y, y+Card(newSet)-1, Text(Real pos)
{
Sub(linSet[pos],1,x-1)+ // Parte inicial de la linea original
newSet[pos-y+1]+ // Nuevo texto
Sub(linSet[pos],x+newLen,linLen) // Parte final de la linea original
});
Set end = For(y+Card(newSet), Card(linSet), Text(Real pos)
{ linSet[pos] });
ini << rep << end
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Dado un conjunto de lineas, setLin, de texto retorna un conjunto de lineas de
texto resultado de sobreescribir el conjunto de textos newSet en la posicion
determinadas por x e y.
Esto es, si x=3, y=4 entonces de:
123456789 123456789
2ABCDEFGH 2ABCDEFGH
3ABCDEFGH 3ABCDEFGH
4ABCDEFGH => <++++> => 4A++++FGH
5ABCDEFGH <++++> 5A++++FGH
Esta funcion asume:
a) que los conjuntos de textos son rectangulares y no vacios y
b) que las coordenadas son razonables, esto es,
que x e y no son tales que parte de la escritura de newSet
se salga fuera de setLin.
Estas suposiciones son razonables si se tiene en cuenta que las coordenadas
proceden de un match correcto de la parte de condicion de las reglas de
reescritura de areas de caracteres.",
AreWri);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set AreFnd(Set linSet, // Conjunto de lineas de texto donde hay que buscar
Set fndSet) // Conjunto rectangular de lineas de texto a buscar
//////////////////////////////////////////////////////////////////////////////
{
Real curX = 1;
Real curY = 1;
Real width = TextLength(fndSet[1]);
Real endX = TextLength(linSet[1]) - width + 1;
Real height = Card(fndSet);
Real endY = Card(linSet)-height+1;
Real end = Copy(FALSE);
Real While(Not(end),
{
Real fst = TextFind(linSet[curY], fndSet[1], curX);
If(LE(fst,0),
{ // No aparece ni la primera linea de fndSet -> Saltar de linea
Real(curY:=curY+1);
Real(curX:=1);
If(LE(curY,endY), TRUE, // Quedan lineas
Real(end:=TRUE)) // Termino
},
{
Set sub = AreSub(linSet, curX, curY, width, height);
If(AreCmp(sub, fndSet), Real(end:=TRUE), // Lo encontro
{ // Aunque la primera linea coincide el resto no -> Saltar en X
Real(curX:=curX+1);
If(LE(curX, endX), TRUE, // Seguir explorando la linea
{
// Ya no aparece en esta linea -> Saltar de linea
Real(curY:=curY+1);
Real(curX:=1);
If(LE(curY,endY), TRUE, // Quedan lineas
Real(end:=TRUE)) // Termino con todas las lineas
})
})
})
});
If(LE(curY, endY), [[ Copy(curX), Copy(curY) ]], Empty)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna el conjunto formado por el par de coordenadas (x,y) de la primera
ocurrencia del conjunto de textos fndSet en linSet.
Si no lo encuentra retorna el conjunto vacio.",
AreFnd);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set AreRep(Set linSet, // Conjunto de lineas de texto con forma rectangular
Set oldSet, // Viejo texto rectangular que se va a sustituir
Set newSet) // Nuevo texto rectangular que se va a escribir
//////////////////////////////////////////////////////////////////////////////
{
Set xySet = AreFnd(linSet, oldSet);
If(EQ(Card(xySet),0), Empty, AreWri(linSet, newSet, xySet[1], xySet[2]))
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Si oldSet aparece en linSet entonces retorna el resultado de reemplazar la
primera ocurrencia de oldSet por newSet, si no aparece retorna Empty.",
AreRep);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set AreCic(Set linSet, // Conjunto de lineas de texto rectangular
Set parSet) // 2 rectangulos (rectangulo viejo, rectangulo nuevo)
//////////////////////////////////////////////////////////////////////////////
{
Real end = Copy(FALSE);
Real par = 1;
Real max = Card(parSet);
Set xySet = Copy(Empty);
Real While(Not(end),
{
Set(xySet:=AreFnd(linSet, parSet[par][1]));
If(GT(Card(xySet),0), Real(end:=TRUE), // Termino con exito
{
Real(par:=par+1); // Probar con el siguiente
If(GT(par,max), Real(end:=TRUE), // Termino sin exito
FALSE) // Cicla
})
});
//Text WriteLn("Rule "+FormatReal(par,"%.0lf"));
If(GT(par,max), Empty, // No lo encontro
AreWri(linSet, parSet[par][2], xySet[1], xySet[2])) // Lo encontro
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna el resultado de cambiar en linSet el primer par de parSet, formado
por un cojunto de pares (oldSet, newSet), donde oldSet aparezca en linSet,
si no aparece ninguno retorna Empty.",
AreCic);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Real AreTrc(Set linSet, // Conjunto de lineas, area rectangular
Real numCel, // Numero de celda, que es el estado o paso
Text preFil, // Ruta y nombre del fichero sin extension
Real numCol, // Numero de columnas de la tabla
Real trcCtr) // 0 abre fichero, 1 ciclo, 2 cierra fichero
//////////////////////////////////////////////////////////////////////////////
{
Text htmFil = preFil+".htm"; // Fichero Html
Text srcFil = preFil+".js"; // Fichero Javascript
Text srcIni = If(trcCtr == 0, // Apertura
{
Text htmOpn = "<table border=0 cellspacing=1 "+
"cellpadding=8 bgcolor='#8080f0'>";
Text WriteFile(htmFil, htmOpn);
Text srcSep = "\n"+Repeat("/", 78)+"\n\n"; // Separador de arrays
Text srcVar = GetFilePrefix(srcFil); // Nombre fichero -> variable
Text srcOpn = srcSep +
"var " + srcVar + " = new Array(\n"; // Array Javascript
Text WriteFile(srcFil, srcOpn);
"" // No hay inicio en la apertura Javascript
}, ",\n"); // En ciclo javascript cierra la linea anterior del array
If(trcCtr <= 1, // Para 0 y 1 hay un estado que escribir
{
Text areBdy = If(EQ(Card(linSet),0), "EMPTY\n", // Para todas las salidas
SetSum(EvalSet(linSet, Text(Text lin) { lin+"\n" })));
// Eliminar < y > para Html y Javascript
Text areRep = ReplaceTable(areBdy, [[ [["<","<"]],[[">",">"]] ]]);
Text areTit = "State = "+FormatReal(numCel,"%.0lf")+"\n";
Text srcBdy = " " + Char(34) + Replace(areRep, "\n", "~") + Char(34);
Text AppendFile(srcFil, srcIni + srcBdy); // Javascript
Text htmIni =
If(EQ(numCel%numCol, 1), "<tr>\n", "") + // Por si es la uno de la fila
"<td bgcolor='#ffffff'>\n"+
"<code><pre>\n";
Text htmEnd =
"</code></pre>\n"+
"</td>\n"+
If(EQ(numCel%numCol, 0), "</tr>\n", ""); // Por si es la ultima de fila
Text AppendFile(htmFil, htmIni + areTit + areRep + htmEnd); // Html
Text panSep = Repeat("_", 78)+"\n"; // Separador para pantalla
Text Write(panSep + areTit + areBdy); // Por pantalla
TRUE // Seguimos en ciclo
},
{
// 2 o mayor es el fin, no hay estado que escribir, solo se cierra
Text AppendFile(htmFil, "\n</tr>\n</table>\n"); // Fin estructura Html
Text AppendFile(srcFil, "\n);\n"); // Fin del array
// La pagina Html, htmFil, que se ha construido, solo contiene la tabla
// de estados, ahora se hace una pagina completa con header, body, etc.
Text htmTab = ReadFile(htmFil); // Lee fichero terminado, tabla completa
Text htmSee = ReadFile(GetFilePath(htmFil) + // Ruta del fichero con /
"/_seed.htm"); // Semilla Html con body
Text filPre = GetFilePrefix(htmFil); // Prefijo del fichero
Text htmTit = FirstToUpper(Replace(filPre, "_", " ")); // Titulo pagina
Text filOut = Replace(htmFil, ".htm", "_html.htm");
Text htmRep = ReplaceTable(htmSee, [[ [["_TIT_", htmTit]],
[["_TAB_", htmTab]] ]]);
Text WriteFile(filOut, htmRep);
FALSE
})
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Visualiza y guarda la traza de de un estado de 3 formas en lenguaje Html, en
Javascript y por pantalla.
Dependiendo del parametro trcCtr, si 0 abre los 2 ficheros Html y Javascript,
si 1 asume que esta en medio ciclo y si 2 cierra ficheros de forma logica,
esto es pone los cierres de las estructuras de programacion de Html y
Javascript.
En Javascript, cada rectangulo de texto se pone como una sola linea de texto
entre comillas, con un separador donde termina realmente cada linea original
del rectangulo, luego este separador se por un br, salto de linea Html.
El caracter separador se ha de elegir de tal forma que pueda reemplazarse
sin probrmas, por ejemplo, el | suele dar problemas pues se usa dentro de
las figuras de las areas, el ; da problemas porque es el fin de los caracteres
especiales Html como o > o <.
En este caso se ha elegido la virgulilla ~.",
AreTrc);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// FILE : are.tol
// AUTHOR : http://www.asolver.com
// PURPOSE : Funciones para areas de caracteres.
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// FUNCTIONS
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set AreSub(Set linSet, // Conjunto de linea
Real x, // Coordenada X
Real y, // Coordenada Y
Real w, // Ancho, width
Real h) // Alto, height
//////////////////////////////////////////////////////////////////////////////
{
Real xEnd = Min(x+w-1,TextLength(linSet[1]));
Real yEnd = Min(y+h-1,Card(linSet));
For(y, yEnd, Text(Real lin) { Sub(linSet[lin], x, xEnd) })
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Dado un conjunto de lineas de texto retorna un conjunto de lineas de texto
cuya esquina superior izquierda corresponden a la posicion x e y y su ancho y
alto a w y h. Esto es si x=3, y=4, w=4 y h=2 entonces de:
123456789
2ABCDEFGH
3ABCDEFGH
4Apor FGH => <por >
5AaquiFGH <aqui>
Se asume que el conjunto de textos es rectangular y no vacio.",
AreSub);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Real AreCmp(Set linSetA, // Primer conjunto de lineas
Set linSetB) // Segundo conjunto de lineas
//////////////////////////////////////////////////////////////////////////////
{
Real carA = Card(linSetA);
Real carB = Card(linSetB);
If(NE(carA, carB), FALSE,
{
Real end = Copy(FALSE);
Real ok = Copy(TRUE);
Real lin = 1;
Real While(Not(end),
{
If(linSetA[lin]!=linSetB[lin],
{ Real(end:=TRUE); Real(ok:=FALSE); FALSE },
{
Real(lin:=lin+1);
If(LE(lin,carA), TRUE, { Real(end:=TRUE); FALSE })
})
});
Copy(ok)
})
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna TRUE si dos areas de texto son iguales, esto es, compara el primer
conjunto de lineas con el segundo conjunto de lineas.
Esta funcion corta y retorna FALSE en cuanto una comparacion falla
Para poder cortar se apoya en la funcion While().",
AreCmp);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set AreWri(Set linSet, // Area que hay que transformar
Set newSet, // Area mas pequeña que se va escribir sobre linSet
Real x, // Coordenada X del punto donde se empieza a escribir
Real y) // Coordenada Y del punto donde se empieza a escribir
//////////////////////////////////////////////////////////////////////////////
{
Real linLen = TextLength(linSet[1]); // Ancho, se asume rectangulo
Real newLen = TextLength(newSet[1]); // Ancho, se asume rectangulo
Set ini = For(1, y-1, Text(Real pos)
{ linSet[pos] });
Set rep = For(y, y+Card(newSet)-1, Text(Real pos)
{
Sub(linSet[pos],1,x-1)+ // Parte inicial de la linea original
newSet[pos-y+1]+ // Nuevo texto
Sub(linSet[pos],x+newLen,linLen) // Parte final de la linea original
});
Set end = For(y+Card(newSet), Card(linSet), Text(Real pos)
{ linSet[pos] });
ini << rep << end
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Dado un conjunto de lineas, setLin, de texto retorna un conjunto de lineas de
texto resultado de sobreescribir el conjunto de textos newSet en la posicion
determinadas por x e y.
Esto es, si x=3, y=4 entonces de:
123456789 123456789
2ABCDEFGH 2ABCDEFGH
3ABCDEFGH 3ABCDEFGH
4ABCDEFGH => <++++> => 4A++++FGH
5ABCDEFGH <++++> 5A++++FGH
Esta funcion asume:
a) que los conjuntos de textos son rectangulares y no vacios y
b) que las coordenadas son razonables, esto es,
que x e y no son tales que parte de la escritura de newSet
se salga fuera de setLin.
Estas suposiciones son razonables si se tiene en cuenta que las coordenadas
proceden de un match correcto de la parte de condicion de las reglas de
reescritura de areas de caracteres.",
AreWri);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set AreFnd(Set linSet, // Conjunto de lineas de texto donde hay que buscar
Set fndSet) // Conjunto rectangular de lineas de texto a buscar
//////////////////////////////////////////////////////////////////////////////
{
Real curX = 1;
Real curY = 1;
Real width = TextLength(fndSet[1]);
Real endX = TextLength(linSet[1]) - width + 1;
Real height = Card(fndSet);
Real endY = Card(linSet)-height+1;
Real end = Copy(FALSE);
Real While(Not(end),
{
Real fst = TextFind(linSet[curY], fndSet[1], curX);
If(LE(fst,0),
{ // No aparece ni la primera linea de fndSet -> Saltar de linea
Real(curY:=curY+1);
Real(curX:=1);
If(LE(curY,endY), TRUE, // Quedan lineas
Real(end:=TRUE)) // Termino
},
{
Set sub = AreSub(linSet, curX, curY, width, height);
If(AreCmp(sub, fndSet), Real(end:=TRUE), // Lo encontro
{ // Aunque la primera linea coincide el resto no -> Saltar en X
Real(curX:=curX+1);
If(LE(curX, endX), TRUE, // Seguir explorando la linea
{
// Ya no aparece en esta linea -> Saltar de linea
Real(curY:=curY+1);
Real(curX:=1);
If(LE(curY,endY), TRUE, // Quedan lineas
Real(end:=TRUE)) // Termino con todas las lineas
})
})
})
});
If(LE(curY, endY), [[ Copy(curX), Copy(curY) ]], Empty)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna el conjunto formado por el par de coordenadas (x,y) de la primera
ocurrencia del conjunto de textos fndSet en linSet.
Si no lo encuentra retorna el conjunto vacio.",
AreFnd);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set AreRep(Set linSet, // Conjunto de lineas de texto con forma rectangular
Set oldSet, // Viejo texto rectangular que se va a sustituir
Set newSet) // Nuevo texto rectangular que se va a escribir
//////////////////////////////////////////////////////////////////////////////
{
Set xySet = AreFnd(linSet, oldSet);
If(EQ(Card(xySet),0), Empty, AreWri(linSet, newSet, xySet[1], xySet[2]))
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Si oldSet aparece en linSet entonces retorna el resultado de reemplazar la
primera ocurrencia de oldSet por newSet, si no aparece retorna Empty.",
AreRep);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set AreCic(Set linSet, // Conjunto de lineas de texto rectangular
Set parSet) // 2 rectangulos (rectangulo viejo, rectangulo nuevo)
//////////////////////////////////////////////////////////////////////////////
{
Real end = Copy(FALSE);
Real par = 1;
Real max = Card(parSet);
Set xySet = Copy(Empty);
Real While(Not(end),
{
Set(xySet:=AreFnd(linSet, parSet[par][1]));
If(GT(Card(xySet),0), Real(end:=TRUE), // Termino con exito
{
Real(par:=par+1); // Probar con el siguiente
If(GT(par,max), Real(end:=TRUE), // Termino sin exito
FALSE) // Cicla
})
});
//Text WriteLn("Rule "+FormatReal(par,"%.0lf"));
If(GT(par,max), Empty, // No lo encontro
AreWri(linSet, parSet[par][2], xySet[1], xySet[2])) // Lo encontro
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna el resultado de cambiar en linSet el primer par de parSet, formado
por un cojunto de pares (oldSet, newSet), donde oldSet aparezca en linSet,
si no aparece ninguno retorna Empty.",
AreCic);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Real AreTrc(Set linSet, // Conjunto de lineas, area rectangular
Real numCel, // Numero de celda, que es el estado o paso
Text preFil, // Ruta y nombre del fichero sin extension
Real numCol, // Numero de columnas de la tabla
Real trcCtr) // 0 abre fichero, 1 ciclo, 2 cierra fichero
//////////////////////////////////////////////////////////////////////////////
{
Text htmFil = preFil+".htm"; // Fichero Html
Text srcFil = preFil+".js"; // Fichero Javascript
Text srcIni = If(trcCtr == 0, // Apertura
{
Text htmOpn = "<table border=0 cellspacing=1 "+
"cellpadding=8 bgcolor='#8080f0'>";
Text WriteFile(htmFil, htmOpn);
Text srcSep = "\n"+Repeat("/", 78)+"\n\n"; // Separador de arrays
Text srcVar = GetFilePrefix(srcFil); // Nombre fichero -> variable
Text srcOpn = srcSep +
"var " + srcVar + " = new Array(\n"; // Array Javascript
Text WriteFile(srcFil, srcOpn);
"" // No hay inicio en la apertura Javascript
}, ",\n"); // En ciclo javascript cierra la linea anterior del array
If(trcCtr <= 1, // Para 0 y 1 hay un estado que escribir
{
Text areBdy = If(EQ(Card(linSet),0), "EMPTY\n", // Para todas las salidas
SetSum(EvalSet(linSet, Text(Text lin) { lin+"\n" })));
// Eliminar < y > para Html y Javascript
Text areRep = ReplaceTable(areBdy, [[ [["<","<"]],[[">",">"]] ]]);
Text areTit = "State = "+FormatReal(numCel,"%.0lf")+"\n";
Text srcBdy = " " + Char(34) + Replace(areRep, "\n", "~") + Char(34);
Text AppendFile(srcFil, srcIni + srcBdy); // Javascript
Text htmIni =
If(EQ(numCel%numCol, 1), "<tr>\n", "") + // Por si es la uno de la fila
"<td bgcolor='#ffffff'>\n"+
"<code><pre>\n";
Text htmEnd =
"</code></pre>\n"+
"</td>\n"+
If(EQ(numCel%numCol, 0), "</tr>\n", ""); // Por si es la ultima de fila
Text AppendFile(htmFil, htmIni + areTit + areRep + htmEnd); // Html
Text panSep = Repeat("_", 78)+"\n"; // Separador para pantalla
Text Write(panSep + areTit + areBdy); // Por pantalla
TRUE // Seguimos en ciclo
},
{
// 2 o mayor es el fin, no hay estado que escribir, solo se cierra
Text AppendFile(htmFil, "\n</tr>\n</table>\n"); // Fin estructura Html
Text AppendFile(srcFil, "\n);\n"); // Fin del array
// La pagina Html, htmFil, que se ha construido, solo contiene la tabla
// de estados, ahora se hace una pagina completa con header, body, etc.
Text htmTab = ReadFile(htmFil); // Lee fichero terminado, tabla completa
Text htmSee = ReadFile(GetFilePath(htmFil) + // Ruta del fichero con /
"/_seed.htm"); // Semilla Html con body
Text filPre = GetFilePrefix(htmFil); // Prefijo del fichero
Text htmTit = FirstToUpper(Replace(filPre, "_", " ")); // Titulo pagina
Text filOut = Replace(htmFil, ".htm", "_html.htm");
Text htmRep = ReplaceTable(htmSee, [[ [["_TIT_", htmTit]],
[["_TAB_", htmTab]] ]]);
Text WriteFile(filOut, htmRep);
FALSE
})
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Visualiza y guarda la traza de de un estado de 3 formas en lenguaje Html, en
Javascript y por pantalla.
Dependiendo del parametro trcCtr, si 0 abre los 2 ficheros Html y Javascript,
si 1 asume que esta en medio ciclo y si 2 cierra ficheros de forma logica,
esto es pone los cierres de las estructuras de programacion de Html y
Javascript.
En Javascript, cada rectangulo de texto se pone como una sola linea de texto
entre comillas, con un separador donde termina realmente cada linea original
del rectangulo, luego este separador se por un br, salto de linea Html.
El caracter separador se ha de elegir de tal forma que pueda reemplazarse
sin probrmas, por ejemplo, el | suele dar problemas pues se usa dentro de
las figuras de las areas, el ; da problemas porque es el fin de los caracteres
especiales Html como o > o <.
En este caso se ha elegido la virgulilla ~.",
AreTrc);
//////////////////////////////////////////////////////////////////////////////
ChRules.Iterative programa de aplicacion iterativa de reglas de areas de caracteres
2015 asolver.com | Aviso legal | XHTML | Δ Θ Ξ | Creative Commons | Mapa y funciones del sitio