Macro-expansor basico de Tol para ser inyectado en Html o en otros lenguajes de programacion. Por defecto utiliza tags que combinan < y { el inicial y el final } y > como Php utiliza <? y ?> y Asp <% y %>. Esta es la version basica que permite inyectar Tol dentro de semillas Html del tipo seed.htm pero no dentro del Html de las agendas de post, esto es, que al expandir Tol dentro del Html aparezca no solo codigo Html sino, de nuevo, codigo Tol, existe una version que si lo admite.
Constantes
Text TmeIniText TmeEndText TmeSepText TmeEmptyFunciones
Set TmeGetMacros(Text tagIni, Text tagEnd, Text codTxt)Text TmeFormat(Anything retVal)Set TmeEvalMacros(Set codSet)Set TmeShareMacros(Set codSet, Real codPos)Text TmeSubMacros(Text tagIni, Text tagEnd, Text codTxt, Real share)Text TmeExpandFile(Text tagIni, Text tagEnd, Text inpFil, Text outFil)Real TmeFile(Text inpFil, Text outFil)//////////////////////////////////////////////////////////////////////////////
Text TmeIni = "<"+"{";
//////////////////////////////////////////////////////////////////////////////
PutDescription("Tag inicial por defecto, puede usarse otro.", TmeIni);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text TmeEnd = "}"+">";
//////////////////////////////////////////////////////////////////////////////
PutDescription("Tag final por defecto, puede usarse otro.", TmeIni);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text TmeSep = Char(7);
//////////////////////////////////////////////////////////////////////////////
PutDescription("Caracter de uso interno que usa Tokenizer().", TmeSep);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text TmeEmpty = "";
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Todo el codigo inyectado ha de retornar algun texto. Si el codigo solo tiene
definiciones, sin retornar nada util, siempre se puede retornar TmeEmpty.",
TmeEmpty);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set TmeGetMacros(Text tagIni, // Initial tag
Text tagEnd, // Ending tag
Text codTxt) // Other programing language code
//////////////////////////////////////////////////////////////////////////////
{
Text repTxt = Replace(codTxt, tagIni, TmeSep);
Set linSet = Tokenizer(repTxt, TmeSep);
Real lenSet = Card(linSet);
If(lenSet <= 1, Empty, // There aren't macros
{
Set For(2, lenSet, Text(Real posLin)
{
Text linTxt = linSet[posLin];
Real posEnd = TextFind(linTxt, tagEnd, 1);
If(posEnd <= 1, "", // Without ending (0) or not code inside (1)
Sub(linTxt, 1,posEnd-1))
})
})
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna un conjunto con todo el codigo entre los tags inicial y final.",
TmeGetMacros);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text TmeFormat(Anything retVal)
//////////////////////////////////////////////////////////////////////////////
{ F(retVal) };
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Intenta retornar un texto a partir de otros tipo, es una funcion equivalente
a la funcion de nombre corto de textos F().",
TmeFormat);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set TmeEvalMacros(Set codSet) // A set with Tol code that returs text
//////////////////////////////////////////////////////////////////////////////
{
EvalSet(codSet, Text(Text codEle)
{ // All the evaluations at the same level,
Anything retVal = Eval(codEle); // can't share the definitions
TmeFormat(retVal) // Try to convert to text
})
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Returns a set with the text results of all macros. This secuential evaluation
does not let to share functions and variables between macros.",
TmeEvalMacros);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set TmeShareMacros(Set codSet, // Set of tol codes
Real codPos) // Position inside codSet (recursion counter)
//////////////////////////////////////////////////////////////////////////////
{
Real lstPos = Card(codSet);
If(codPos > lstPos, Empty, // Nothing to do
{ // Evaluations at different stack levels,
Anything retVal = Eval(codSet[codPos]); // can inherit definitions
Text txtFmt = TmeFormat(retVal); // Try to convert to text
[[ txtFmt ]] << TmeShareMacros(codSet, codPos+1) // Recursion
})
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Returns a set with the text results of all macros. This recursive evaluation
lets to share definitions, functions and variables between macros.",
TmeShareMacros);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text TmeSubMacros(Text tagIni, // Initial tag
Text tagEnd, // Ending tag
Text codTxt, // Other programing language code
Real share) // If true share definitions between macros
//////////////////////////////////////////////////////////////////////////////
{
Set macSet = TmeGetMacros(tagIni, tagEnd, codTxt);
Set txtSet = If(share, TmeShareMacros(macSet, 1), TmeEvalMacros(macSet));
Set repTab = For(1, Card(macSet), Set(Real macPos)
{ [[ Text(tagIni+macSet[macPos]+tagEnd), txtSet[macPos] ]] });
TxtReplaceSecuence(codTxt, repTab) // ReplaceTable(codTxt, repTab, 1)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Returns the result of full macro expansion.
The original remmark with the old code ReplaceTable(codTxt, repTab, 1) was:
Be aware if you uses duplicated macros and assumes something about your order
definitions. Now the function TxtReplaceSecuence(codTxt, repTab) make the
replacements in a strick order.
Inside this code always is called with share=TRUE.",
TmeSubMacros);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text TmeExpandFile(Text tagIni, // Initial tag
Text tagEnd, // Ending tag
Text inpFil, // Input file
Text outFil) // Output file
//////////////////////////////////////////////////////////////////////////////
{
Text codTxt = ReadFile(inpFil);
Text outTxt = TmeSubMacros(tagIni, tagEnd, codTxt, TRUE); // Sharing
Text outRep = Replace(outTxt, "// FILE : seed.htm",
"// FILE : "+GetFileName(outFil));
Text wriFil = If(outFil != "", WriteFile(outFil, outRep), "");
outTxt
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Returns the result of full macro expansion in inpFil.
Update the file remmark from classic seed.htm to the output file name outFil.
If outFil is not empty then writes the result in outFil
This version does not use FilWriteIfDiff(), it always update all web site.",
TmeExpandFile);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Real TmeFile(Text inpFil, // Input file
Text outFil) // Output file
//////////////////////////////////////////////////////////////////////////////
{ If(TmeExpandFile(TmeIni, TmeEnd, inpFil, outFil) != "", TRUE, FALSE) };
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Easy way to call TmeExpandFile() with the default values and behaviour.
Returns true if some text was generated.",
TmeFile);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// FILE : tme.tol
// AUTHOR : http://www.asolver.com
// PURPOSE : Macro-expansor basico de Tol para ser inyectado en Html o en
// otros lenguajes de programacion.
// Por defecto utiliza tags que combinan < y { el inicial y el final } y >
// como Php utiliza <? y ?> y Asp <% y %>.
// Esta es la version basica que permite inyectar Tol dentro de semillas Html
// del tipo seed.htm pero no dentro del Html de las agendas de post, esto es,
// que al expandir Tol dentro del Html aparezca no solo codigo Html sino,
// de nuevo, codigo Tol, existe una version que si lo admite.
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// CONSTANTS
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text TmeIni = "<"+"{";
//////////////////////////////////////////////////////////////////////////////
PutDescription("Tag inicial por defecto, puede usarse otro.", TmeIni);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text TmeEnd = "}"+">";
//////////////////////////////////////////////////////////////////////////////
PutDescription("Tag final por defecto, puede usarse otro.", TmeIni);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text TmeSep = Char(7);
//////////////////////////////////////////////////////////////////////////////
PutDescription("Caracter de uso interno que usa Tokenizer().", TmeSep);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text TmeEmpty = "";
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Todo el codigo inyectado ha de retornar algun texto. Si el codigo solo tiene
definiciones, sin retornar nada util, siempre se puede retornar TmeEmpty.",
TmeEmpty);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// FUNCTIONS
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set TmeGetMacros(Text tagIni, // Initial tag
Text tagEnd, // Ending tag
Text codTxt) // Other programing language code
//////////////////////////////////////////////////////////////////////////////
{
Text repTxt = Replace(codTxt, tagIni, TmeSep);
Set linSet = Tokenizer(repTxt, TmeSep);
Real lenSet = Card(linSet);
If(lenSet <= 1, Empty, // There aren't macros
{
Set For(2, lenSet, Text(Real posLin)
{
Text linTxt = linSet[posLin];
Real posEnd = TextFind(linTxt, tagEnd, 1);
If(posEnd <= 1, "", // Without ending (0) or not code inside (1)
Sub(linTxt, 1,posEnd-1))
})
})
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Retorna un conjunto con todo el codigo entre los tags inicial y final.",
TmeGetMacros);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text TmeFormat(Anything retVal)
//////////////////////////////////////////////////////////////////////////////
{ F(retVal) };
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Intenta retornar un texto a partir de otros tipo, es una funcion equivalente
a la funcion de nombre corto de textos F().",
TmeFormat);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set TmeEvalMacros(Set codSet) // A set with Tol code that returs text
//////////////////////////////////////////////////////////////////////////////
{
EvalSet(codSet, Text(Text codEle)
{ // All the evaluations at the same level,
Anything retVal = Eval(codEle); // can't share the definitions
TmeFormat(retVal) // Try to convert to text
})
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Returns a set with the text results of all macros. This secuential evaluation
does not let to share functions and variables between macros.",
TmeEvalMacros);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Set TmeShareMacros(Set codSet, // Set of tol codes
Real codPos) // Position inside codSet (recursion counter)
//////////////////////////////////////////////////////////////////////////////
{
Real lstPos = Card(codSet);
If(codPos > lstPos, Empty, // Nothing to do
{ // Evaluations at different stack levels,
Anything retVal = Eval(codSet[codPos]); // can inherit definitions
Text txtFmt = TmeFormat(retVal); // Try to convert to text
[[ txtFmt ]] << TmeShareMacros(codSet, codPos+1) // Recursion
})
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Returns a set with the text results of all macros. This recursive evaluation
lets to share definitions, functions and variables between macros.",
TmeShareMacros);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text TmeSubMacros(Text tagIni, // Initial tag
Text tagEnd, // Ending tag
Text codTxt, // Other programing language code
Real share) // If true share definitions between macros
//////////////////////////////////////////////////////////////////////////////
{
Set macSet = TmeGetMacros(tagIni, tagEnd, codTxt);
Set txtSet = If(share, TmeShareMacros(macSet, 1), TmeEvalMacros(macSet));
Set repTab = For(1, Card(macSet), Set(Real macPos)
{ [[ Text(tagIni+macSet[macPos]+tagEnd), txtSet[macPos] ]] });
TxtReplaceSecuence(codTxt, repTab) // ReplaceTable(codTxt, repTab, 1)
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Returns the result of full macro expansion.
The original remmark with the old code ReplaceTable(codTxt, repTab, 1) was:
Be aware if you uses duplicated macros and assumes something about your order
definitions. Now the function TxtReplaceSecuence(codTxt, repTab) make the
replacements in a strick order.
Inside this code always is called with share=TRUE.",
TmeSubMacros);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Text TmeExpandFile(Text tagIni, // Initial tag
Text tagEnd, // Ending tag
Text inpFil, // Input file
Text outFil) // Output file
//////////////////////////////////////////////////////////////////////////////
{
Text codTxt = ReadFile(inpFil);
Text outTxt = TmeSubMacros(tagIni, tagEnd, codTxt, TRUE); // Sharing
Text outRep = Replace(outTxt, "// FILE : seed.htm",
"// FILE : "+GetFileName(outFil));
Text wriFil = If(outFil != "", WriteFile(outFil, outRep), "");
outTxt
};
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Returns the result of full macro expansion in inpFil.
Update the file remmark from classic seed.htm to the output file name outFil.
If outFil is not empty then writes the result in outFil
This version does not use FilWriteIfDiff(), it always update all web site.",
TmeExpandFile);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
Real TmeFile(Text inpFil, // Input file
Text outFil) // Output file
//////////////////////////////////////////////////////////////////////////////
{ If(TmeExpandFile(TmeIni, TmeEnd, inpFil, outFil) != "", TRUE, FALSE) };
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Easy way to call TmeExpandFile() with the default values and behaviour.
Returns true if some text was generated.",
TmeFile);
//////////////////////////////////////////////////////////////////////////////
Omr.Forms construye las páginas web Html del sitio web omrforms.es
2015 asolver.com | Aviso legal | XHTML | Δ Θ Ξ | Creative Commons | Mapa y funciones del sitio