Funciones de arboles de estructuras de directorios para dar soporte a la generacion de la documentacion de programas en lenguaje Tol y en otros lenguajes de programacion.
Constantes
Text DtrMrkText DtrOutFunciones
Text DTrAddPath(Text inpPth, Text subPth)Text DTrCompact(Real delMrk, Text txtDes)Text DTrRootFile(Set inpTre)Text DTrText(Set inpTre, Text inpPth, Real padLft)Text DTrHtml(Set inpTre, Text prgNam, Real padLft, Text actFil)Set DtrFileSet(Set inpTre, Text inpPth)Set DtrFileExc(Set filTab)//////////////////////////////////////////////////////////////////////////////
Text DtrMrk = "[+]";
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Marca interna para identificar la raiz del arbol y del modulos principal.",
DtrMrk);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text DtrOut = "[>]";
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Marca interna para identificar los ficheros de salida.",
DtrOut);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text DTrAddPath(Text inpPth, // Ruta superior de entrada
Text subPth) // Subruta que se concatena
//////////////////////////////////////////////////////////////////////////////
{ TxtCat(inpPth, "/", subPth) };
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna el resultado de concatenar 2 trozos de una ruta de un fichero.",
DTrAddPath);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text DTrCompact(Real delMrk, // Si cierto elimina las marcas
Text txtDes) // Texto de descripcion
//////////////////////////////////////////////////////////////////////////////
{
Compact(If(delMrk, ReplaceTable(txtDes, [[ [[DtrMrk, ""]],
[[DtrOut, ""]] ]]), txtDes))
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna una linea de documentación compactada y sin la marca de principal
o de fichero de salida si se le pide con el argumento delMrk.",
DTrCompact);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text DTrRootFile(Set inpTre) // Arbol de entrada
//////////////////////////////////////////////////////////////////////////////
{
Set filTab = DtrFileSet(inpTre, ""); // No necesita el path completo
Set rotSet = Select(filTab, Real(Set filSet) { filSet[1]=="Rot" });
rotSet[1][3]
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna el fichero principal de un arbol de ficheros.", DTrRootFile);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text DTrText(Set inpTre, // Arbol de entrada
Text inpPth, // Directorio previo
Real padLft) // Numero de blancos a la izquierda
//////////////////////////////////////////////////////////////////////////////
{
Text whiLft = Repeat(" ",padLft); // Blancos a la izquierda
If(NE(Card(inpTre), 3), // Las hojas son de 2 o 4
{ // Hoja
Real leaAct = TextEndAt(inpTre[2], DtrMrk);
Real leaOut = TextEndAt(inpTre[2], DtrOut);
Text leaDes = DTrCompact(Or(leaAct,leaOut), inpTre[2]);
Text leaTyp = Case(leaAct, "Act",
leaOut, "Out",
TRUE, "Lea");
whiLft+leaTyp+": "+DTrAddPath(inpPth,inpTre[1])+"|"+leaDes+"\n"
},
{ // Nodo
Text newPth = DTrAddPath(inpPth,inpTre[1]);
Real nodRot = TextEndAt(inpTre[2], DtrMrk);
Text nodDes = DTrCompact(nodRot, inpTre[2]);
Text nodTyp = If(nodRot, "Rot", "Nod");
whiLft+nodTyp+": "+newPth+"|"+nodDes+"\n"+
SetSum(EvalSet(inpTre[3], Text(Set subNod)
{ DTrText(subNod, newPth, padLft+1) }))
})
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna en texto plano con saltos de linea e indentaciones la estructura del
arbol a documentar.
Es una funcion auxiliar, permite comprobar visualmente el contenido de dicho
arbol sin uso para la documentacion.",
DTrText);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text DTrHtml(Set inpTre, // Arbol de entrada
Text prgNam, // Directorio de proyecto
Real padLft, // Numero de blancos a la izquierda
Text actFil) // Fichero actual
//////////////////////////////////////////////////////////////////////////////
{
Text whiLft = Repeat(" ",padLft); // Blancos a la izquierda
If(NE(Card(inpTre), 3), // Las hojas son de 2 o 4
{ // Hoja
Text ahrIni = DctLink(prgNam, inpTre[1], "", "A"); // A href y Url
Real endMrk = TextEndAt(inpTre[2], DtrMrk);
Real leaOut = TextEndAt(inpTre[2], DtrOut);
Text leaDes = DTrCompact(Or(endMrk, leaOut), inpTre[2]);
Text leaTyp =Case(
actFil==inpTre[1], "Act", // Es el actual, azul
endMrk, "Rot", // Es el principal, rojo
leaOut, "Out", // Es un fichero de salida, verde
TRUE, "Lea"); // Es normal, gris
Text arrTxt = If(leaOut, "<b>→</b>", "<b>←</b>");
whiLft+"<li>"+arrTxt+ahrIni+"<span class="+Q(leaTyp)+">"+inpTre[1]+
"</span></a> "+leaDes+"</li>\n"
},
{ // Nodo: raiz o normal
If(TextEndAt(inpTre[2], DtrMrk),
{ // Raiz
Text nodDes = DTrCompact(TRUE, inpTre[2]);
Text ahrIni = DctLink(prgNam, DTrRootFile(inpTre), "", "A");
whiLft+"<div class='Tre'>\n"+
whiLft+"<p>"+ahrIni+"<span class='Rot'>"+inpTre[1]+
"</span></a> "+nodDes+"</p>\n"+
whiLft+" <ul>\n"+
SetSum(EvalSet(inpTre[3], Text(Set subNod)
{ DTrHtml(subNod, prgNam, padLft+4, actFil) })) +
whiLft+" </ul>\n"+
whiLft+"</div>\n"
},
{ // Nodo normal
Text nodDes = DTrCompact(FALSE, inpTre[2]);
whiLft+"<li><span class='Nod'>"+inpTre[1]+"</span> "+nodDes+"\n" +
whiLft+" <ul>\n" +
SetSum(EvalSet(inpTre[3], Text(Set subNod)
{ DTrHtml(subNod, prgNam, padLft+4, actFil) })) +
whiLft+" </ul>\n" +
whiLft+"</li>\n"
})
})
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna en html el contenido del arbol, mediante los tags ul y li ademas de
p, div y span, con el Css adecuado la visualizacion que legible.
Pone si recibe actFil el nombre de uno de los ficheros del arbol lo destaca
como fichero actual, poniendo al resto como simples hojas.
Si no recibe ningun fichero pone como fichero actual el principal del arbol
que ha de estar marcado con la etiqueta DTrMrk al final de su linea de
documentacion.
A todos los ficheros les incluye un enlace a su pagina de documentacion.",
DTrHtml);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set DtrFileSet(Set inpTre, // Arbol de entrada
Text inpPth) // Directorio previo
//////////////////////////////////////////////////////////////////////////////
{
Real inpCrd = Card(inpTre);
If(NE(Card(inpTre), 3), // Las hojas son de 2 o 4
{ // Hoja
Real leaRot = TextEndAt(inpTre[2], DtrMrk);
Real leaOut = TextEndAt(inpTre[2], DtrOut);
Text leaDes = DTrCompact(Or(leaRot,leaOut), inpTre[2]);
Text leaTyp = If(leaRot, "Rot", "Lea");
Text filPth = DTrAddPath(inpPth,inpTre[1]);
Text iniTag = If(EQ(inpCrd, 4), inpTre[3], "");
Text endTag = If(EQ(inpCrd, 4), inpTre[4], "");
[[ SetOfText(leaTyp, filPth, inpTre[1], leaDes, iniTag, endTag) ]]
},
{ // Nodo
Text newPth = DTrAddPath(inpPth,inpTre[1]);
BinGroup("<<", EvalSet(inpTre[3], Set(Set subNod)
{ DtrFileSet(subNod, newPth) }))
})
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna una tabla con el conjunto de los ficheros del arbol, hojas
terminales, que hay que procesar, con sus descripciones compactadas y
con un primer campo que identifica el fichero principal, Rot, porque
pasa a ser la raiz del web de paginas del proyecto), mientras que el
resto de ficheros son hoja, Lea.
La tabla tiene 6 columnas:
1) identificador de si es el principal,
2) ruta del fichero incluyendo su nombre
3) nombre del fichero,
4) la descripcion compactada y sin marcas de fichero principal,
5) la etiqueta inicial de corte, si no procede, la tira vacia, y
6) la etiqueta final de corte, si no procede, la tira vacia.
Los 2 ultimos campos sirven para cuando solo se desea documentar un trozo de
un fichero entre 2 etiquetas, si son vacias, se asume el fichero completo.
Esta programacion es un ejemplo de como se transforma en lineal una estructura
de arbol, si bien en este caso solo de sus hojas.
Para localizar los ficheros utiliza un inicio de camino inpPth.
Si el fichero a documentar no existe entonces introduce un mensaje de error
dentro del campo de documentacion.
Notese que el uso se facilita y el nombre del directorio principal y de como
se denomina al programa coinciden.
El fichero puede no existir, por ejemplo, cuando se ponen ficheros genericos
de ejemplo de muchas paginas web que se complementan con imagenes y no con
el codigo interno de esas paginas.",
DtrFileSet);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set DtrFileExc(Set filTab) // Tabla de ficheros de entrada
//////////////////////////////////////////////////////////////////////////////
{
Set selTab = Select(filTab, Real(Set filSet)
{
If(TextFind (filSet[3], DctExc), FALSE, // Exclusion en el nombre
If(FilTextFind(filSet[3], DctExc), FALSE, // Exclusion en el contenido
TRUE))
});
Real numExc = Card(filTab)-Card(selTab);
If(!numExc, selTab,
{ Text WriteLn("Exclusions: "+F(numExc)); Empty })
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna una tabla con el conjunto de informacion de ficheros de entrada si
todo cumplen los criterios de inclusion y Empty en otro caso.",
DtrFileExc);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// FILE : dtr.tol
// AUTHOR : http://www.asolver.com
// PURPOSE : Funciones de arboles de estructuras de directorios para dar
// soporte a la generacion de la documentacion de programas en lenguaje Tol
// y en otros lenguajes de programacion.
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// CONSTANTS
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text DtrMrk = "[+]";
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Marca interna para identificar la raiz del arbol y del modulos principal.",
DtrMrk);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text DtrOut = "[>]";
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Marca interna para identificar los ficheros de salida.",
DtrOut);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// FUNCTIONS
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text DTrAddPath(Text inpPth, // Ruta superior de entrada
Text subPth) // Subruta que se concatena
//////////////////////////////////////////////////////////////////////////////
{ TxtCat(inpPth, "/", subPth) };
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna el resultado de concatenar 2 trozos de una ruta de un fichero.",
DTrAddPath);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text DTrCompact(Real delMrk, // Si cierto elimina las marcas
Text txtDes) // Texto de descripcion
//////////////////////////////////////////////////////////////////////////////
{
Compact(If(delMrk, ReplaceTable(txtDes, [[ [[DtrMrk, ""]],
[[DtrOut, ""]] ]]), txtDes))
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna una linea de documentación compactada y sin la marca de principal
o de fichero de salida si se le pide con el argumento delMrk.",
DTrCompact);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text DTrRootFile(Set inpTre) // Arbol de entrada
//////////////////////////////////////////////////////////////////////////////
{
Set filTab = DtrFileSet(inpTre, ""); // No necesita el path completo
Set rotSet = Select(filTab, Real(Set filSet) { filSet[1]=="Rot" });
rotSet[1][3]
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna el fichero principal de un arbol de ficheros.", DTrRootFile);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text DTrText(Set inpTre, // Arbol de entrada
Text inpPth, // Directorio previo
Real padLft) // Numero de blancos a la izquierda
//////////////////////////////////////////////////////////////////////////////
{
Text whiLft = Repeat(" ",padLft); // Blancos a la izquierda
If(NE(Card(inpTre), 3), // Las hojas son de 2 o 4
{ // Hoja
Real leaAct = TextEndAt(inpTre[2], DtrMrk);
Real leaOut = TextEndAt(inpTre[2], DtrOut);
Text leaDes = DTrCompact(Or(leaAct,leaOut), inpTre[2]);
Text leaTyp = Case(leaAct, "Act",
leaOut, "Out",
TRUE, "Lea");
whiLft+leaTyp+": "+DTrAddPath(inpPth,inpTre[1])+"|"+leaDes+"\n"
},
{ // Nodo
Text newPth = DTrAddPath(inpPth,inpTre[1]);
Real nodRot = TextEndAt(inpTre[2], DtrMrk);
Text nodDes = DTrCompact(nodRot, inpTre[2]);
Text nodTyp = If(nodRot, "Rot", "Nod");
whiLft+nodTyp+": "+newPth+"|"+nodDes+"\n"+
SetSum(EvalSet(inpTre[3], Text(Set subNod)
{ DTrText(subNod, newPth, padLft+1) }))
})
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna en texto plano con saltos de linea e indentaciones la estructura del
arbol a documentar.
Es una funcion auxiliar, permite comprobar visualmente el contenido de dicho
arbol sin uso para la documentacion.",
DTrText);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text DTrHtml(Set inpTre, // Arbol de entrada
Text prgNam, // Directorio de proyecto
Real padLft, // Numero de blancos a la izquierda
Text actFil) // Fichero actual
//////////////////////////////////////////////////////////////////////////////
{
Text whiLft = Repeat(" ",padLft); // Blancos a la izquierda
If(NE(Card(inpTre), 3), // Las hojas son de 2 o 4
{ // Hoja
Text ahrIni = DctLink(prgNam, inpTre[1], "", "A"); // A href y Url
Real endMrk = TextEndAt(inpTre[2], DtrMrk);
Real leaOut = TextEndAt(inpTre[2], DtrOut);
Text leaDes = DTrCompact(Or(endMrk, leaOut), inpTre[2]);
Text leaTyp =Case(
actFil==inpTre[1], "Act", // Es el actual, azul
endMrk, "Rot", // Es el principal, rojo
leaOut, "Out", // Es un fichero de salida, verde
TRUE, "Lea"); // Es normal, gris
Text arrTxt = If(leaOut, "<b>→</b>", "<b>←</b>");
whiLft+"<li>"+arrTxt+ahrIni+"<span class="+Q(leaTyp)+">"+inpTre[1]+
"</span></a> "+leaDes+"</li>\n"
},
{ // Nodo: raiz o normal
If(TextEndAt(inpTre[2], DtrMrk),
{ // Raiz
Text nodDes = DTrCompact(TRUE, inpTre[2]);
Text ahrIni = DctLink(prgNam, DTrRootFile(inpTre), "", "A");
whiLft+"<div class='Tre'>\n"+
whiLft+"<p>"+ahrIni+"<span class='Rot'>"+inpTre[1]+
"</span></a> "+nodDes+"</p>\n"+
whiLft+" <ul>\n"+
SetSum(EvalSet(inpTre[3], Text(Set subNod)
{ DTrHtml(subNod, prgNam, padLft+4, actFil) })) +
whiLft+" </ul>\n"+
whiLft+"</div>\n"
},
{ // Nodo normal
Text nodDes = DTrCompact(FALSE, inpTre[2]);
whiLft+"<li><span class='Nod'>"+inpTre[1]+"</span> "+nodDes+"\n" +
whiLft+" <ul>\n" +
SetSum(EvalSet(inpTre[3], Text(Set subNod)
{ DTrHtml(subNod, prgNam, padLft+4, actFil) })) +
whiLft+" </ul>\n" +
whiLft+"</li>\n"
})
})
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna en html el contenido del arbol, mediante los tags ul y li ademas de
p, div y span, con el Css adecuado la visualizacion que legible.
Pone si recibe actFil el nombre de uno de los ficheros del arbol lo destaca
como fichero actual, poniendo al resto como simples hojas.
Si no recibe ningun fichero pone como fichero actual el principal del arbol
que ha de estar marcado con la etiqueta DTrMrk al final de su linea de
documentacion.
A todos los ficheros les incluye un enlace a su pagina de documentacion.",
DTrHtml);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set DtrFileSet(Set inpTre, // Arbol de entrada
Text inpPth) // Directorio previo
//////////////////////////////////////////////////////////////////////////////
{
Real inpCrd = Card(inpTre);
If(NE(Card(inpTre), 3), // Las hojas son de 2 o 4
{ // Hoja
Real leaRot = TextEndAt(inpTre[2], DtrMrk);
Real leaOut = TextEndAt(inpTre[2], DtrOut);
Text leaDes = DTrCompact(Or(leaRot,leaOut), inpTre[2]);
Text leaTyp = If(leaRot, "Rot", "Lea");
Text filPth = DTrAddPath(inpPth,inpTre[1]);
Text iniTag = If(EQ(inpCrd, 4), inpTre[3], "");
Text endTag = If(EQ(inpCrd, 4), inpTre[4], "");
[[ SetOfText(leaTyp, filPth, inpTre[1], leaDes, iniTag, endTag) ]]
},
{ // Nodo
Text newPth = DTrAddPath(inpPth,inpTre[1]);
BinGroup("<<", EvalSet(inpTre[3], Set(Set subNod)
{ DtrFileSet(subNod, newPth) }))
})
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna una tabla con el conjunto de los ficheros del arbol, hojas
terminales, que hay que procesar, con sus descripciones compactadas y
con un primer campo que identifica el fichero principal, Rot, porque
pasa a ser la raiz del web de paginas del proyecto), mientras que el
resto de ficheros son hoja, Lea.
La tabla tiene 6 columnas:
1) identificador de si es el principal,
2) ruta del fichero incluyendo su nombre
3) nombre del fichero,
4) la descripcion compactada y sin marcas de fichero principal,
5) la etiqueta inicial de corte, si no procede, la tira vacia, y
6) la etiqueta final de corte, si no procede, la tira vacia.
Los 2 ultimos campos sirven para cuando solo se desea documentar un trozo de
un fichero entre 2 etiquetas, si son vacias, se asume el fichero completo.
Esta programacion es un ejemplo de como se transforma en lineal una estructura
de arbol, si bien en este caso solo de sus hojas.
Para localizar los ficheros utiliza un inicio de camino inpPth.
Si el fichero a documentar no existe entonces introduce un mensaje de error
dentro del campo de documentacion.
Notese que el uso se facilita y el nombre del directorio principal y de como
se denomina al programa coinciden.
El fichero puede no existir, por ejemplo, cuando se ponen ficheros genericos
de ejemplo de muchas paginas web que se complementan con imagenes y no con
el codigo interno de esas paginas.",
DtrFileSet);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set DtrFileExc(Set filTab) // Tabla de ficheros de entrada
//////////////////////////////////////////////////////////////////////////////
{
Set selTab = Select(filTab, Real(Set filSet)
{
If(TextFind (filSet[3], DctExc), FALSE, // Exclusion en el nombre
If(FilTextFind(filSet[3], DctExc), FALSE, // Exclusion en el contenido
TRUE))
});
Real numExc = Card(filTab)-Card(selTab);
If(!numExc, selTab,
{ Text WriteLn("Exclusions: "+F(numExc)); Empty })
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna una tabla con el conjunto de informacion de ficheros de entrada si
todo cumplen los criterios de inclusion y Empty en otro caso.",
DtrFileExc);
//////////////////////////////////////////////////////////////////////////////
Dct.Writer documenta programas Tol generado agendas para Html
2015 asolver.com | Aviso legal | XHTML | Δ Θ Ξ | Creative Commons | Mapa y funciones del sitio