Funciones de texto.
Funciones de nombre corto
Text W(Text txtVal)Funciones
Real TxtCountLeftChars(Text txtInp, Text oneChr)Set TxtLineWrap(Text txtInp, Real linMax, Real cmpCtr)Set TxtParagraphWrap(Text txtInp, Real linMax, Real cmpCtr)Text TxtParagraphsWrap(Text txtInp, Real linMax)Set TxtTokenizer(Text txtInp, Text tagBrk)//////////////////////////////////////////////////////////////////////////////
Text W(Text txtVal) // Text
//////////////////////////////////////////////////////////////////////////////
{ Replace(txtVal, "/", "\\") };
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna un camino en formato Unix convertido a formato Windows/DOS.",
W);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Real TxtCountLeftChars(Text txtInp, // Texto de entrada
Text oneChr) // Caracteres iniciales a contar
//////////////////////////////////////////////////////////////////////////////
{
Real numChr = 1; // Contador de elementos
Real txtLen = TextLength(txtInp); // Numero de caracteres
Real While(And(LE(numChr, txtLen), Sub(txtInp, numChr, numChr) == oneChr),
{
Real (numChr:= Copy(numChr) + 1);
TRUE
});
If(Sub(txtInp, numChr, numChr) != oneChr, numChr-1, numChr)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna el numero de caracteres iniciales de txtInp que son iguales al
caracter de entrada oneChr.",
TxtCountLeftChars);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set TxtLineWrap(Text txtInp, // Texto de entrada
Real linMax, // Maximo numero de caracteres por linea
Real cmpCtr) // Si true entonces compacta
//////////////////////////////////////////////////////////////////////////////
{
Text txtCmp = If(cmpCtr, Compact(txtInp), txtInp);
Text txtRev = Reverse(txtCmp);
Real txtLen = TextLength(txtCmp);
Set cutSet = If(LE(txtLen, linMax), [[txtCmp, ""]], // Ya esta hecho
{
Real blkPos = TextFind(txtRev, " ", txtLen-linMax); // Busca para atras
If(GE(blkPos, 1),
{
SetOfText(Sub(txtCmp, 0, txtLen-blkPos),
Sub(txtCmp, txtLen-blkPos+1, txtLen))
},
{
// No se puede cortar
Real blkBad = TextFind(txtCmp, " ", linMax+1); // Busca hacia adelante
If(LT(blkBad, 0), [[txtCmp, ""]], // No hay corte posible
{
SetOfText(Sub(txtCmp, 0, blkBad-1), // Hay un mal corte
Sub(txtCmp, blkBad+1, txtLen))
})
})
});
If(cmpCtr, SetOfText(Compact(cutSet[1]),Compact(cutSet[2])), cutSet)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna un conjunto de 2 texto el primero con un máximo de linMax caracteres
y el segundo con el resto.
Es el resultado de cortar txtInp por el primer blanco que permita que el corte
cumpla la condición inicial.
Si el texto de entrada es mas corte que linMax retorna un conjunto formado
por el texto inicial y la tira vacia.
Si el corte es imposible busca el mejor corte posible y si no lo encuentra
retorna un conjunto formado por el texto inicial y la tira vacia.
Si cmpCtr es true los resultados son compactados.
Tambien existe en Tol la funcion Wrap() con ciertas semejanzas,
aunque mas a TxtParagraphWrap().",
TxtLineWrap);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set TxtParagraphWrap(Text txtInp, // Texto de entrada
Real linMax, // Maximo numero de caracteres por linea
Real cmpCtr) // Si true entonces compacta
//////////////////////////////////////////////////////////////////////////////
{
Set setTxt = TxtLineWrap(txtInp, linMax, cmpCtr);
Set setIni = SetOfText(setTxt[1]);
If(setTxt[2]=="", setIni,
setIni << TxtParagraphWrap(setTxt[2], linMax, cmpCtr))
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna un conjunto de textos resultado de aplicar recursivamente la funcion
TxtLineWrap(), lo que permite recortar párrafos.
Tambien existe en Tol la funcion Wrap() con ciertas semejanzas.",
TxtParagraphWrap);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text TxtParagraphsWrap(Text txtInp, // Texto de entrada
Real linMax) // Maximo numero de caracteres por linea
//////////////////////////////////////////////////////////////////////////////
{
Text txtCls = ReplaceTable(txtInp,
[[
[[" \n","\n"]] // Limpiar blancos finales
]]);
Set parSet = TxtTokenizer(txtCls, ".\n"); // Respetar los parrafos puros
Set parCic = EvalSet(parSet, Text(Text inpPar)
{
If(inpPar=="", "",
{
Real iniWhi = TxtCountLeftChars(inpPar, " "); // Indentacion del parrafo
Set linSet = TxtParagraphWrap(inpPar+".", linMax - iniWhi, TRUE);
Text indent = Repeat(" ", iniWhi);
Set linCic = EvalSet(linSet, Text(Text linInp) { indent+linInp+"\n" });
SetSum(linCic)
})
});
SetSum(parCic)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna un textos resultado de aplicar la funcion TxtParagraphWrap() a todos
sus parrafos.
Entiende que cada parrafo termina en un punto y salto de linea.",
TxtParagraphsWrap);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set TxtTokenizer(Text txtInp, // Texto de entrada
Text tagBrk) // Tag por el que se corta
//////////////////////////////////////////////////////////////////////////////
{ Tokenizer(Replace(txtInp, tagBrk, Char(7)), Char(7)) };
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna un conjunto de textos resultado de cortar el texto de entrada por un
unico tag tagBrk no incluyendo el tag tagBrk dentro de los textos.
Se soporta en la funcion Tol Tokenizer() que rompe por un unico caracter.
Usa como caracter interno de corte el 7 (bell), esperando que no aparezca.",
TxtTokenizer);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// FILE : txt.tol
// AUTHOR : http://www.asolver.com
// PURPOSE : Funciones de texto.
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// SHORTNAMES
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text W(Text txtVal) // Text
//////////////////////////////////////////////////////////////////////////////
{ Replace(txtVal, "/", "\\") };
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna un camino en formato Unix convertido a formato Windows/DOS.",
W);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// FUNCTIONS
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Real TxtCountLeftChars(Text txtInp, // Texto de entrada
Text oneChr) // Caracteres iniciales a contar
//////////////////////////////////////////////////////////////////////////////
{
Real numChr = 1; // Contador de elementos
Real txtLen = TextLength(txtInp); // Numero de caracteres
Real While(And(LE(numChr, txtLen), Sub(txtInp, numChr, numChr) == oneChr),
{
Real (numChr:= Copy(numChr) + 1);
TRUE
});
If(Sub(txtInp, numChr, numChr) != oneChr, numChr-1, numChr)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna el numero de caracteres iniciales de txtInp que son iguales al
caracter de entrada oneChr.",
TxtCountLeftChars);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set TxtLineWrap(Text txtInp, // Texto de entrada
Real linMax, // Maximo numero de caracteres por linea
Real cmpCtr) // Si true entonces compacta
//////////////////////////////////////////////////////////////////////////////
{
Text txtCmp = If(cmpCtr, Compact(txtInp), txtInp);
Text txtRev = Reverse(txtCmp);
Real txtLen = TextLength(txtCmp);
Set cutSet = If(LE(txtLen, linMax), [[txtCmp, ""]], // Ya esta hecho
{
Real blkPos = TextFind(txtRev, " ", txtLen-linMax); // Busca para atras
If(GE(blkPos, 1),
{
SetOfText(Sub(txtCmp, 0, txtLen-blkPos),
Sub(txtCmp, txtLen-blkPos+1, txtLen))
},
{
// No se puede cortar
Real blkBad = TextFind(txtCmp, " ", linMax+1); // Busca hacia adelante
If(LT(blkBad, 0), [[txtCmp, ""]], // No hay corte posible
{
SetOfText(Sub(txtCmp, 0, blkBad-1), // Hay un mal corte
Sub(txtCmp, blkBad+1, txtLen))
})
})
});
If(cmpCtr, SetOfText(Compact(cutSet[1]),Compact(cutSet[2])), cutSet)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna un conjunto de 2 texto el primero con un máximo de linMax caracteres
y el segundo con el resto.
Es el resultado de cortar txtInp por el primer blanco que permita que el corte
cumpla la condición inicial.
Si el texto de entrada es mas corte que linMax retorna un conjunto formado
por el texto inicial y la tira vacia.
Si el corte es imposible busca el mejor corte posible y si no lo encuentra
retorna un conjunto formado por el texto inicial y la tira vacia.
Si cmpCtr es true los resultados son compactados.
Tambien existe en Tol la funcion Wrap() con ciertas semejanzas,
aunque mas a TxtParagraphWrap().",
TxtLineWrap);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set TxtParagraphWrap(Text txtInp, // Texto de entrada
Real linMax, // Maximo numero de caracteres por linea
Real cmpCtr) // Si true entonces compacta
//////////////////////////////////////////////////////////////////////////////
{
Set setTxt = TxtLineWrap(txtInp, linMax, cmpCtr);
Set setIni = SetOfText(setTxt[1]);
If(setTxt[2]=="", setIni,
setIni << TxtParagraphWrap(setTxt[2], linMax, cmpCtr))
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna un conjunto de textos resultado de aplicar recursivamente la funcion
TxtLineWrap(), lo que permite recortar párrafos.
Tambien existe en Tol la funcion Wrap() con ciertas semejanzas.",
TxtParagraphWrap);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text TxtParagraphsWrap(Text txtInp, // Texto de entrada
Real linMax) // Maximo numero de caracteres por linea
//////////////////////////////////////////////////////////////////////////////
{
Text txtCls = ReplaceTable(txtInp,
[[
[[" \n","\n"]] // Limpiar blancos finales
]]);
Set parSet = TxtTokenizer(txtCls, ".\n"); // Respetar los parrafos puros
Set parCic = EvalSet(parSet, Text(Text inpPar)
{
If(inpPar=="", "",
{
Real iniWhi = TxtCountLeftChars(inpPar, " "); // Indentacion del parrafo
Set linSet = TxtParagraphWrap(inpPar+".", linMax - iniWhi, TRUE);
Text indent = Repeat(" ", iniWhi);
Set linCic = EvalSet(linSet, Text(Text linInp) { indent+linInp+"\n" });
SetSum(linCic)
})
});
SetSum(parCic)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna un textos resultado de aplicar la funcion TxtParagraphWrap() a todos
sus parrafos.
Entiende que cada parrafo termina en un punto y salto de linea.",
TxtParagraphsWrap);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set TxtTokenizer(Text txtInp, // Texto de entrada
Text tagBrk) // Tag por el que se corta
//////////////////////////////////////////////////////////////////////////////
{ Tokenizer(Replace(txtInp, tagBrk, Char(7)), Char(7)) };
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna un conjunto de textos resultado de cortar el texto de entrada por un
unico tag tagBrk no incluyendo el tag tagBrk dentro de los textos.
Se soporta en la funcion Tol Tokenizer() que rompe por un unico caracter.
Usa como caracter interno de corte el 7 (bell), esperando que no aparezca.",
TxtTokenizer);
//////////////////////////////////////////////////////////////////////////////
Sfk.Wrap formateador a lineas de 78 caracteres de textos en Ascii
2015 asolver.com | Aviso legal | XHTML | Δ Θ Ξ | Creative Commons | Mapa y funciones del sitio