Secciones de la página

Omr. Forms


Árbol de ficheros


Declaraciones


Inclusiones


Estructuras de datos


Constantes


Proceso


Pruebas


Finalización


Time oriented language

Tol

Artículos del sitio

Presentación de Tol

Todos los programas

Simuladores visuales

Sitios que me gustan

Por categorías

Algoritmia

Búsqueda y ordenación

Computación fisiológica

Editorial y edición

Gráficos de datos

Herramientas y utilidades

Hipertexto

Informática forense

Lectura óptica de datos

Metaprogramación

No determinista

Ofimática

Recursión e iteración

Reglas y restricciones

Series y estadística









make.tol de Omr.Forms

Es el programa constructor del sitio web OmrForms.es, que es un sitio dedicado a la comercialización de servicios y formularios en papel para la lectura óptica de datos. Los contenidos para este sitio web se estructuran en base a posts con 3 niveles de importancia (status) y que se guardan en un único fichero de texto denominado agenda de posts que es un banco de contenidos. Los 3 niveles de los posts son: a) A de Anulado, significa que está en el banco de contenidos pero que no se puplica, b) B de Bajo, se publica, pero no sale en el menú principal en la parte superior izquierda de todas las páginas web del sitio y c) C de Común, se publica y aparece enlazado desde el menú principal de todas las páginas.

Omr.Forms es un programa que puede considerarse básico en relación a otros constructores de sitios web desarrollados en lenguaje Tol y que se caracteriza por: a) Emplear una única agenda de posts que se alberga en el fichero de ruta agenda/agendadb.age. b) Los posts no tienen clases para su categorización, a diferencia de otros programas constructores de sitios webs. c) Se basa en un macro-expansor simple de Tol embebido en Html. d) Combina los títulos y los subtítulos, alternativos y disponibles para cada post, de forma que los contenido publicados no son siempre idénticos a los publicados anteriormente. e) La decoración lateral izquierda con ejemplos de formularios para lectoras ópticas de marcas es tambien aleatoria, por lo que es diferente en cada publicación. f) Las páginas las crea de una forma circular, siguiendo la misma secuencia de definición y las enlaza de tal manera, que empezando por cualquier página, leyendo hasta el final y pidiendo leer más, se pueden recorrer todas las páginas.

El programa OmrForms.es está basado en un macro-expansor simple de Tol en Html que permite embeber código Tol dentro de una página semilla Html, que opera a modo de template, y que hace que, al ejecutarse dicho código Tol, se generen con este template todas las páginas del sitio web con todos los diferentes contenidos de los posts de la agenda. El funcionamiento de este programa ha sido comprobado para las versiones de Tol 1.1.5, 1.1.6 y 2.0.1 y no funciona con la versión 1.1.1. Una de las causas de este no funcionamiento con la versión Tol 1.1.1 es la falta de visibilidad desde una macros de las variables definidas dentro de otras macros, esto es, que por ejemplo que la variable global CNT.ALL, que se define dentro de una macro, para la siguiente macro no existe, no la ve, eso si funciona en las versiones del lenguaje Tol más modernas.

Este programa OmrForms.es realiza automáticamente, entre otras funciones: a) la creación de índices de artículos, b) la extracción de las descripciones de las páginas, utilizando para ello los textos resaltados en dichos contenidos y c) la generación, para cada página, de la lista de palabras clave, keywords, extrayendo del contenido las de mayor frecuencia de aparición. De esta forma las descripciones y palabras clave, que declara en sus campos Html meta correspondientes, son los más adecuados y particulares para cada página, sin necesidad de que un humano realice esta tarea. Otras de las funciones principales de este programa OmrForms.es son: a) crear las páginas de control de errores, b) el mapa del sitio web en lenguaje Xml y c) comprobar qué páginas, documentos, imágenes, etc. han sido actualizadas con posterioridad al último envío por ftp y poner dichos nuevos contenidos online o actualizar los existentes.

Las opciones principales de Omr.Forms son: a) la generación de páginas mediante la opción denominada web, b) la creación del índice principal, homepage, y de las páginas absolutas, que valen para protección de directorios y control de errores, con la opción rot, c) la elaboración del mapa del sitio en Xml con la opción xsm, siglas de Xml site map, d) con las opciones ftp, fup y snd la actualización por Ftp del sitio, bien de todo el contenido (opciones ftp + snd, de send) o bien de las últimas páginas, imágenes y documentos actualizados (opciones fup + snd, de ftp update) y e) mediante la opción tst se realizan unos tests de la funcionalidad interna que comprueban ciertos funcionamientos del programa.

Árbol de ficheros

Omr.Forms construye las páginas web Html del sitio web omrforms.es

  • make.tol proceso principal de generación del sitio web omrforms.es
  • tol directorios de código Tol
    • cmm funciones comunes
    • app funciones específicas de la aplicación
      • pdb.tol de manejo de los posts de una agenda
      • key.tol generación de palabras clave para páginas
    • inc.tol para la inclusión de ficheros Tol
  • agenda directorio destinado a la única agenda de post
    • agendadb.age ejemplo de un conjunto de posts de contenido para publicar
  • web directorio destinado a las páginas web generadas
    • css directorio para ficheros de estilo Cascade Style Sheet
      • common.css fichero de estilo para las páginas Html
    • seed.htm semilla de página Html con Tol embebido para generar otras
    • sitemap.xml mapa del sitio web generado automáticamente en Xml
    • preciospresupuestoslecturaoptica.html ejemplo del código Html de una de las páginas web generadas
  • ejemplos.html ejemplos visuales de 3 páginas Html generadas automáticamente
  • omr_forms.pdf documento resumen de funciones del programa constructor de web

Declaraciones

Inclusiones

  • Set allInc
    Inclusion de las funciones comunes y de aplicacion.

Constantes

  • Text makSep
    Linea horizontal para separar fases de operacion.
  • Text agePth
    Ruta a la agenda con el conjunto de post del web.
  • Set frmTab
    Conjunto de las imagenes de los formularios OMR.

Proceso

  • Text ctrExe
    Argumento validado para la ejecucion del make.
  • Real makHlp
    Es cierto si se ha visualizado la ayuda.
  • Real makArt
    Crear todas las paginas de todos los articulos del web, retorna el numero de paginas creadas.
  • Real makRot
    Crea la pagina raiz index, la de enlaces absolutos, la de errores y copia la comun de todos los web sites para enlaces cruzados.
  • Real makXsm
    Crear el mapa del sitio, sitemap, en formato XML.
  • Real makFtp
    Crear los ficheros de mandatos completos ftp o de actualizacion fup.
  • Real makSnd
    Enviado ficheros utilizando los mandatos creados con ftp o fup (update).

Pruebas

  • Real makTst
    Realizar el test de algunas funcionalidades necesarias para el proceso.

Inclusiones

Set allInc

//////////////////////////////////////////////////////////////////////////////
Set  allInc = Include("tol/inc.tol");
//////////////////////////////////////////////////////////////////////////////
PutDescription("Inclusion de las funciones comunes y de aplicacion.", allInc);
//////////////////////////////////////////////////////////////////////////////

Estructuras de datos

Struct PdbSt // Estructura para cada uno de los post que contiene la agenda
{
  Text pstSta, // Status A(nulado), B(ajo, sin menu), C(comun, al menu)
  Text filNam, // Fichero para el post
  Text titLar, // Titulo largo del post
  Text titSor, // Titulo corto del post
  Text titSub, // Subtitulo del post
  Text pstHtm, // Texto del post es html
  Text pstDes  // Descripcion del post
};

Constantes

Text makSep

//////////////////////////////////////////////////////////////////////////////
Text makSep = "\n"+Repeat("_", 72)+"\n";
//////////////////////////////////////////////////////////////////////////////
PutDescription("Linea horizontal para separar fases de operacion.",makSep);
//////////////////////////////////////////////////////////////////////////////

Text agePth

//////////////////////////////////////////////////////////////////////////////
Text agePth = "agenda/agendadb.age";
//////////////////////////////////////////////////////////////////////////////
PutDescription("Ruta a la agenda con el conjunto de post del web.",agePth);
//////////////////////////////////////////////////////////////////////////////

Set frmTab

//////////////////////////////////////////////////////////////////////////////
Set  frmTab =
{
  Text ageTxt = ReadFile(agePth);
  Text ageImg = TxtBetween2Tag(ageTxt,         // Text
                               "<!-- FRM -->", // Initial tag
                               "<!-- END -->", // End tag
                               TRUE);
  Set  ageSet = Tokenizer(ageImg,">");
  Set  ageCic = EvalSet(ageSet, Set(Text imgTxt)
  {
    Text iniTag = "<img class="+Q("FrmCnt")+" src="+Char(34);
    Text endTag = Char(34);
    Text altTag = "alt="+Char(34);
    Text titTag = "title="+Char(34);

    Text imgPth = TxtBetween2Tag(imgTxt, iniTag, endTag, TRUE);
    Text imgAlt = TxtBetween2Tag(imgTxt, altTag, endTag, TRUE);
    Text imgTit = TxtBetween2Tag(imgTxt, titTag, endTag, TRUE);
    If(Or(imgPth=="", imgAlt=="", imgTit==""), Empty,
       SetOfText(imgPth, imgAlt, imgTit))
  });
  Select(ageCic, Real(Set imgSet) { EQ(Card(imgSet), 3) })
};
//////////////////////////////////////////////////////////////////////////////
PutDescription("Conjunto de las imagenes de los formularios OMR.",frmTab);
//////////////////////////////////////////////////////////////////////////////

Proceso

Text ctrExe

//////////////////////////////////////////////////////////////////////////////
Text ctrExe = If(Not(ObjectExist("Text","ctrBat")), "hlp",
              If(ctrBat=="",                        "hlp",
                                                    ToLower(ctrBat)));
//////////////////////////////////////////////////////////////////////////////
PutDescription("Argumento validado para la ejecucion del make.",ctrExe);
//////////////////////////////////////////////////////////////////////////////

Real makHlp

//////////////////////////////////////////////////////////////////////////////
Real makHlp = If(ctrExe!="hlp", FALSE,
{
  Text WriteLn(
  makSep+"help:
  Usage: make [OPTION]
  Builds omrforms.es site
  OPTION
    art: build all articles pages
    rot: build root absolute page
    xsm: build Xml site map
    ftp: build ftp files (go to ftp dir and run manually or use make snd)
    fup: build a file update protocol (newer than ftp.log file)
    snd: send file via ftp/ftu
    ___
    web: build local web: art, rot, xms
    all: do all works: art, rot, xms, fup y snd.
    hlp: show this help
    tst: test some functions");
  TRUE
});
//////////////////////////////////////////////////////////////////////////////
PutDescription("Es cierto si se ha visualizado la ayuda.",makHlp);
//////////////////////////////////////////////////////////////////////////////

Real makArt

//////////////////////////////////////////////////////////////////////////////
Real makArt = If(!(ctrExe <: [["all", "web", "art"]]), FALSE,
{
  Text WriteLn(makSep+"building all web pages...");
  Real CtrMax =   5; // Numero de posts por pagina
  Real CtrCxD = 360; // Caracteres por descripcion, LinkedIn 250, Facebook 300
  Real CtrKxP =  36; // Palabras clave por pagina
  Set  CtrPdb = PdbRead(agePth); // Leer todos los posts

  Set  CtrBas = Select(CtrPdb, Real(Set pstObj) { pstObj->pstSta == "B" });
  Set  CtrCmn = Select(CtrPdb, Real(Set pstObj) { pstObj->pstSta == "C" });
  
  Text WriteLn("Status __C "+F(Card(CtrCmn))+" registers");

  Text CtrInC = PdbIndex(CtrCmn); // Articulos comunes para indices lateral
  Text CtrInB = PdbIndex(CtrBas); // Articulos basicos
  Text CtrInd = PdbIndex(CtrPdb); // Todos los articulos

  Text inpPth = "web/seed.htm";
  Text inpHtm = ReadFile(inpPth);

  Set  wriCic = For(1, Card(CtrPdb), Real(Real pdbPos)
  {
    Set  CtrPst = CtrPdb[pdbPos];
    Text CtrPth = "web/"+CtrPst->filNam+".html";
    Text WriteLn("-> "+CtrPth);

    Set  CtrCic = SetSubCicle(CtrPdb, pdbPos, CtrMax+1); // +1 link siguiente
    Set  CtrFrm = PdbFrm(pdbPos, CtrMax, frmTab, TRUE);  // Aleatorio
    Text CtrKey = PdbTxtKeyword(CtrCic, CtrKxP);         // Aleatorio nº+-6

    TmeFile(inpPth, CtrPth)
  });

  Real wriAll = // Una pagina con todos los articulos para revisiones
  {
    Set  CtrPst = CtrPdb[1]; // El primero
    Text CtrPth = "web/completo.html";
    Text WriteLn("-> "+CtrPth);

    Set  CtrCic = SetSubCicle(CtrPdb, 1, Card(CtrPdb)+1); // +1 link al 1º
    Set  CtrFrm = PdbFrm(1, CtrMax, frmTab, FALSE); // Secuencial
    Text CtrKey = PdbTxtKeyword(CtrCic, 40);

    TmeFile(inpPth, CtrPth)
  };
  
  Card(wriCic)+wriAll
});
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Crear todas las paginas de todos los articulos del web, retorna el numero de
paginas creadas.",
makArt);
//////////////////////////////////////////////////////////////////////////////

Real makRot

//////////////////////////////////////////////////////////////////////////////
Real makRot = If(!(ctrExe <: [["all", "web", "rot"]]), FALSE,
{
  Text WriteLn(makSep+"building root pages...");
  
  Text WriteLn("-> main index");
  Text inxHtm = ReadFile("web/desarrolloimpresionformulariosomr.html");
  Text WriteFile("web/index.html", inxHtm);

  Text WriteLn("-> absolute page and 404 page");
  Text extRef = " href="+Char(34)+"http";
  Text savRef = " _XX_="+Char(34)+"_XX_";
  Text absSav = Replace(inxHtm, extRef, savRef); // Salvar enlaces externos
  Text absRep = TxtReplaceSecuence(absSav,
  [[
     [[ " src=\"", "  src=\"http://www.omrforms.es/"]],
     [[" href=\"", " href=\"http://www.omrforms.es/"]]
  ]]);
  Text absRec = Replace(absRep, savRef, extRef); // Restaurarlos
  Text WriteFile("web/absoluto.html", absRec);
  Text WriteFile("web/error404.html", absRec);

  Text WriteLn("-> common directory page, utf-8");
  FilCopy("../common/dir.html", "web/comxidir.html", TRUE)
});
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Crea la pagina raiz index, la de enlaces absolutos, la de errores y
copia la comun de todos los web sites para enlaces cruzados.",
makRot);
//////////////////////////////////////////////////////////////////////////////

Real makXsm

//////////////////////////////////////////////////////////////////////////////
Real makXsm = If(!(ctrExe <: [["all", "web", "xsm"]]), FALSE,
{
  Text WriteLn(makSep+"building Xml site map...");
  XsmDir("web/sitemap.xml", "web", "http://www.omrforms.es/")
});
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Crear el mapa del sitio, sitemap, en formato XML.",
makXsm);
//////////////////////////////////////////////////////////////////////////////

Real makFtp

//////////////////////////////////////////////////////////////////////////////
Real makFtp = If(!(ctrExe <: [["all", "ftp", "fup"]]), FALSE,
{
  Text msgTxt = If(ctrExe=="ftp", "ftp (all files)", "fup (update)");
  Text absPth = Replace(GetSourcePath(ctrExe),"/make.tol","");     // Absoluto
  Text locPth = absPth+"/web";                  // Ha de ser una ruta absoluta
  Text webNam = GetFileName(absPth);           // Nombre del directorio actual
  Text dtePth = If(ctrExe=="ftp", "", "ftp/"+webNam+".log");       // Relativo

  Text WriteLn(makSep+webNam+": building "+msgTxt+" from "+locPth+"...");
  FtpAll(
    webNam,                   // Web name 
    "www.omrforms.es",        // Host remoto 
    locPth,                   // Directorio local
    dtePth,                   // Fichero señal de fecha de actualizacion
    [[//dir           extension   type      binary or ascii 
      [["",           "html",     "html",   FALSE]],  // ASCII
      [["",           "ico",      "ico",    TRUE]],   // Binary favicon.ico
      [["",           "xml",      "xml",    FALSE]],  // ASCII  site map
      [["css",        "css",      "css",    FALSE]],  // ASCII
      [["src",        "js",       "js",     FALSE]],  // ASCII  javascript
      [["img",        "gif",      "gif",    TRUE]],   // Binary
      [["tecnica",    "png",      "tec",    TRUE]],   // Binary
      [["camposomr",  "png",      "cam",    TRUE]],   // Binary
      [["documentos", "png",      "docpng", TRUE]],   // Binary
      [["documentos", "pdf",      "docpdf", TRUE]],   // Binary
      [["formularios","gif",      "frm",    TRUE]]    // Binary
    ]])
});
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Crear los ficheros de mandatos completos ftp o de actualizacion fup.",
makFtp);
//////////////////////////////////////////////////////////////////////////////

Real makSnd

//////////////////////////////////////////////////////////////////////////////
Real makSnd = If(!(ctrExe <: [["all", "snd"]]), FALSE,
{
  Text WriteLn(makSep+"sending files using ftp/ftu...");
  System(W("ftp/Omr.Forms.bat"))
});
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Enviado ficheros utilizando los mandatos creados con ftp o fup (update).",
makSnd);
//////////////////////////////////////////////////////////////////////////////

Pruebas

Real makTst

//////////////////////////////////////////////////////////////////////////////
Real makTst = If(ctrExe != "tst", FALSE,
{
  Text WriteLn(makSep+"test function Txt2Set()");

  Text tstT2S = " b  b :: aa :: b b :: cc:: ::::d::cc::";
  Text WriteLn(F(Txt2Set(tstT2S, "::", "")));
  Text WriteLn(F(Txt2Set(tstT2S, "::", "C")));
  Text WriteLn(F(Txt2Set(tstT2S, "::", "U")));
  Text WriteLn(F(Txt2Set(tstT2S, "::", "CU")));
  Text WriteLn(F(Txt2Set(tstT2S, "::", "CUN")));
  Text WriteLn(F(Txt2Set(tstT2S, "::", "CNU")));
  Text WriteLn(F(Txt2Set(tstT2S, "::", "CNUS")));
  Text WriteLn(F(Txt2Set(tstT2S, "::", "S")));

  Text WriteLn(makSep+"test function TxtOutside2Tag()");

  Text WriteLn(TxtOutside2Tag("
    a <i>b</i> c
    <img src='...' alt='alternativo uno' title='titulo uno'> d
    <img src='...' title="+Q("titulo dos")+" alt="+Q("alternativo dos")+"> e
    <script...>var x=33;</script> f
  ", "<", ">"));

  Text WriteLn(makSep+"test function TxtOutHtmTag()");

  Text WriteLn(TxtOutHtmTag("
    a <i>b</i> c
    <img src='...' alt='alternativo uno' title='titulo uno'> d
    <img src='...' title="+Q("titulo dos")+" alt="+Q("alternativo dos")+"> e
    <script...>var x=33;</script> f
  "));

  TRUE
});
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Realizar el test de algunas funcionalidades necesarias para el proceso.",
makTst);
//////////////////////////////////////////////////////////////////////////////

Finalización

Text WriteLn("\nOmr.Forms make: end");

Time oriented language

//////////////////////////////////////////////////////////////////////////////
// FILE    : make.tol
// AUTHOR  : http://www.asolver.com
// CLASS   : Metaprogramación; Hipertexto; Omr; Aleatorio
// VERSION : Tol 1.1.5; Tol 1.1.6; Tol 2.0.1
// PURPOSE : Es el programa constructor del sitio web OmrForms.es, que es un
// sitio dedicado a la comercialización de servicios y formularios en papel
// para la lectura óptica de datos.
// 
// Los contenidos para este sitio web se estructuran en base a posts con 3
// niveles de importancia (status) y que se guardan en un único fichero de
// texto denominado agenda de posts que es un banco de contenidos.
// Los 3 niveles de los posts son:
// a) A de Anulado, significa que está en el banco de contenidos pero que
//    no se puplica,
// b) B de Bajo, se publica, pero no sale en el menú principal en la parte
//    superior izquierda de todas las páginas web del sitio y
// c) C de Común, se publica y aparece enlazado desde el menú principal de
//    todas las páginas.
// _
// Omr.Forms es un programa que puede considerarse básico en relación a otros
// constructores de sitios web desarrollados en lenguaje Tol y que se
// caracteriza por:
// a) Emplear una única agenda de posts que se alberga en el fichero de
//    ruta agenda/agendadb.age.
// b) Los posts no tienen clases para su categorización, a diferencia de
//    otros programas constructores de sitios webs.
// c) Se basa en un macro-expansor simple de Tol embebido en Html.
// d) Combina los títulos y los subtítulos,
//    alternativos y disponibles para cada post,
//    de forma que los contenido publicados no son siempre idénticos
//    a los publicados anteriormente.
// e) La decoración lateral izquierda con ejemplos de formularios para
//    lectoras ópticas de marcas es tambien aleatoria,
//    por lo que es diferente en cada publicación.
// f) Las páginas las crea de una forma circular,
//    siguiendo la misma secuencia de definición y las enlaza de tal manera,
//    que empezando por cualquier página, leyendo hasta el final y pidiendo
//    leer más, se pueden recorrer todas las páginas.
// _
// El programa OmrForms.es está basado en un macro-expansor simple de Tol en
// Html que permite embeber código Tol dentro de una página semilla Html,
// que opera a modo de template, y que hace que,
// al ejecutarse dicho código Tol, se generen con este template todas las
// páginas del sitio web con todos los diferentes contenidos de los posts de
// la agenda.
// 
// El funcionamiento de este programa ha sido comprobado para las versiones de
// Tol 1.1.5, 1.1.6 y 2.0.1 y no funciona con la versión 1.1.1.
// Una de las causas de este no funcionamiento con la versión Tol 1.1.1 es la
// falta de visibilidad desde una macros de las variables definidas dentro de
// otras macros, esto es, que por ejemplo que la variable global CNT.ALL,
// que se define dentro de una macro, para la siguiente macro no existe,
// no la ve, eso si funciona en las versiones del lenguaje Tol más modernas.
// _
// Este programa OmrForms.es realiza automáticamente, entre otras funciones:
// a) la creación de índices de artículos,
// b) la extracción de las descripciones de las páginas, utilizando para ello
//    los textos resaltados en dichos contenidos y
// c) la generación, para cada página, de la lista de palabras clave,
//    keywords, extrayendo del contenido las de mayor frecuencia de aparición.
// De esta forma las descripciones y palabras clave, que declara en sus
// campos Html meta correspondientes, son los más adecuados y particulares
// para cada página, sin necesidad de que un humano realice esta tarea.
// 
// Otras de las funciones principales de este programa OmrForms.es son:
// a) crear las páginas de control de errores,
// b) el mapa del sitio web en lenguaje Xml y
// c) comprobar qué páginas, documentos, imágenes, etc. han sido actualizadas
//    con posterioridad al último envío por ftp y poner dichos nuevos
//    contenidos online o actualizar los existentes.
// _
// Las opciones principales de Omr.Forms son:
// a) la generación de páginas mediante la opción denominada web,
// b) la creación del índice principal, homepage, y de las páginas absolutas,
//    que valen para protección de directorios y control de errores,
//    con la opción rot,
// c) la elaboración del mapa del sitio en Xml con la opción xsm,
//    siglas de Xml site map,
// d) con las opciones ftp, fup y snd la actualización por Ftp del sitio,
//    bien de todo el contenido (opciones ftp + snd, de send) o
//    bien de las últimas páginas, imágenes y documentos actualizados
//    (opciones fup + snd, de ftp update) y
// e) mediante la opción tst se realizan unos tests de la funcionalidad
//    interna que comprueban ciertos funcionamientos del programa.
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
// INCLUDE
//////////////////////////////////////////////////////////////////////////////
Text WriteLn("\nOmr.Forms make: begin");

//////////////////////////////////////////////////////////////////////////////
Set  allInc = Include("tol/inc.tol");
//////////////////////////////////////////////////////////////////////////////
PutDescription("Inclusion de las funciones comunes y de aplicacion.", allInc);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
// STRUCTS
//////////////////////////////////////////////////////////////////////////////

Struct PdbSt // Estructura para cada uno de los post que contiene la agenda
{
  Text pstSta, // Status A(nulado), B(ajo, sin menu), C(comun, al menu)
  Text filNam, // Fichero para el post
  Text titLar, // Titulo largo del post
  Text titSor, // Titulo corto del post
  Text titSub, // Subtitulo del post
  Text pstHtm, // Texto del post es html
  Text pstDes  // Descripcion del post
};


//////////////////////////////////////////////////////////////////////////////
// CONSTANTS
//////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
Text makSep = "\n"+Repeat("_", 72)+"\n";
//////////////////////////////////////////////////////////////////////////////
PutDescription("Linea horizontal para separar fases de operacion.",makSep);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Text agePth = "agenda/agendadb.age";
//////////////////////////////////////////////////////////////////////////////
PutDescription("Ruta a la agenda con el conjunto de post del web.",agePth);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Set  frmTab =
{
  Text ageTxt = ReadFile(agePth);
  Text ageImg = TxtBetween2Tag(ageTxt,         // Text
                               "<!-- FRM -->", // Initial tag
                               "<!-- END -->", // End tag
                               TRUE);
  Set  ageSet = Tokenizer(ageImg,">");
  Set  ageCic = EvalSet(ageSet, Set(Text imgTxt)
  {
    Text iniTag = "<img class="+Q("FrmCnt")+" src="+Char(34);
    Text endTag = Char(34);
    Text altTag = "alt="+Char(34);
    Text titTag = "title="+Char(34);

    Text imgPth = TxtBetween2Tag(imgTxt, iniTag, endTag, TRUE);
    Text imgAlt = TxtBetween2Tag(imgTxt, altTag, endTag, TRUE);
    Text imgTit = TxtBetween2Tag(imgTxt, titTag, endTag, TRUE);
    If(Or(imgPth=="", imgAlt=="", imgTit==""), Empty,
       SetOfText(imgPth, imgAlt, imgTit))
  });
  Select(ageCic, Real(Set imgSet) { EQ(Card(imgSet), 3) })
};
//////////////////////////////////////////////////////////////////////////////
PutDescription("Conjunto de las imagenes de los formularios OMR.",frmTab);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
// MAKE
//////////////////////////////////////////////////////////////////////////////
Text WriteLn("\nOmr.Forms make: process");


//////////////////////////////////////////////////////////////////////////////
Text ctrExe = If(Not(ObjectExist("Text","ctrBat")), "hlp",
              If(ctrBat=="",                        "hlp",
                                                    ToLower(ctrBat)));
//////////////////////////////////////////////////////////////////////////////
PutDescription("Argumento validado para la ejecucion del make.",ctrExe);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real makHlp = If(ctrExe!="hlp", FALSE,
{
  Text WriteLn(
  makSep+"help:
  Usage: make [OPTION]
  Builds omrforms.es site
  OPTION
    art: build all articles pages
    rot: build root absolute page
    xsm: build Xml site map
    ftp: build ftp files (go to ftp dir and run manually or use make snd)
    fup: build a file update protocol (newer than ftp.log file)
    snd: send file via ftp/ftu
    ___
    web: build local web: art, rot, xms
    all: do all works: art, rot, xms, fup y snd.
    hlp: show this help
    tst: test some functions");
  TRUE
});
//////////////////////////////////////////////////////////////////////////////
PutDescription("Es cierto si se ha visualizado la ayuda.",makHlp);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real makArt = If(!(ctrExe <: [["all", "web", "art"]]), FALSE,
{
  Text WriteLn(makSep+"building all web pages...");
  Real CtrMax =   5; // Numero de posts por pagina
  Real CtrCxD = 360; // Caracteres por descripcion, LinkedIn 250, Facebook 300
  Real CtrKxP =  36; // Palabras clave por pagina
  Set  CtrPdb = PdbRead(agePth); // Leer todos los posts

  Set  CtrBas = Select(CtrPdb, Real(Set pstObj) { pstObj->pstSta == "B" });
  Set  CtrCmn = Select(CtrPdb, Real(Set pstObj) { pstObj->pstSta == "C" });
  
  Text WriteLn("Status __C "+F(Card(CtrCmn))+" registers");

  Text CtrInC = PdbIndex(CtrCmn); // Articulos comunes para indices lateral
  Text CtrInB = PdbIndex(CtrBas); // Articulos basicos
  Text CtrInd = PdbIndex(CtrPdb); // Todos los articulos

  Text inpPth = "web/seed.htm";
  Text inpHtm = ReadFile(inpPth);

  Set  wriCic = For(1, Card(CtrPdb), Real(Real pdbPos)
  {
    Set  CtrPst = CtrPdb[pdbPos];
    Text CtrPth = "web/"+CtrPst->filNam+".html";
    Text WriteLn("-> "+CtrPth);

    Set  CtrCic = SetSubCicle(CtrPdb, pdbPos, CtrMax+1); // +1 link siguiente
    Set  CtrFrm = PdbFrm(pdbPos, CtrMax, frmTab, TRUE);  // Aleatorio
    Text CtrKey = PdbTxtKeyword(CtrCic, CtrKxP);         // Aleatorio nº+-6

    TmeFile(inpPth, CtrPth)
  });

  Real wriAll = // Una pagina con todos los articulos para revisiones
  {
    Set  CtrPst = CtrPdb[1]; // El primero
    Text CtrPth = "web/completo.html";
    Text WriteLn("-> "+CtrPth);

    Set  CtrCic = SetSubCicle(CtrPdb, 1, Card(CtrPdb)+1); // +1 link al 1º
    Set  CtrFrm = PdbFrm(1, CtrMax, frmTab, FALSE); // Secuencial
    Text CtrKey = PdbTxtKeyword(CtrCic, 40);

    TmeFile(inpPth, CtrPth)
  };
  
  Card(wriCic)+wriAll
});
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Crear todas las paginas de todos los articulos del web, retorna el numero de
paginas creadas.",
makArt);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real makRot = If(!(ctrExe <: [["all", "web", "rot"]]), FALSE,
{
  Text WriteLn(makSep+"building root pages...");
  
  Text WriteLn("-> main index");
  Text inxHtm = ReadFile("web/desarrolloimpresionformulariosomr.html");
  Text WriteFile("web/index.html", inxHtm);

  Text WriteLn("-> absolute page and 404 page");
  Text extRef = " href="+Char(34)+"http";
  Text savRef = " _XX_="+Char(34)+"_XX_";
  Text absSav = Replace(inxHtm, extRef, savRef); // Salvar enlaces externos
  Text absRep = TxtReplaceSecuence(absSav,
  [[
     [[ " src=\"", "  src=\"http://www.omrforms.es/"]],
     [[" href=\"", " href=\"http://www.omrforms.es/"]]
  ]]);
  Text absRec = Replace(absRep, savRef, extRef); // Restaurarlos
  Text WriteFile("web/absoluto.html", absRec);
  Text WriteFile("web/error404.html", absRec);

  Text WriteLn("-> common directory page, utf-8");
  FilCopy("../common/dir.html", "web/comxidir.html", TRUE)
});
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Crea la pagina raiz index, la de enlaces absolutos, la de errores y
copia la comun de todos los web sites para enlaces cruzados.",
makRot);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real makXsm = If(!(ctrExe <: [["all", "web", "xsm"]]), FALSE,
{
  Text WriteLn(makSep+"building Xml site map...");
  XsmDir("web/sitemap.xml", "web", "http://www.omrforms.es/")
});
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Crear el mapa del sitio, sitemap, en formato XML.",
makXsm);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real makFtp = If(!(ctrExe <: [["all", "ftp", "fup"]]), FALSE,
{
  Text msgTxt = If(ctrExe=="ftp", "ftp (all files)", "fup (update)");
  Text absPth = Replace(GetSourcePath(ctrExe),"/make.tol","");     // Absoluto
  Text locPth = absPth+"/web";                  // Ha de ser una ruta absoluta
  Text webNam = GetFileName(absPth);           // Nombre del directorio actual
  Text dtePth = If(ctrExe=="ftp", "", "ftp/"+webNam+".log");       // Relativo

  Text WriteLn(makSep+webNam+": building "+msgTxt+" from "+locPth+"...");
  FtpAll(
    webNam,                   // Web name 
    "www.omrforms.es",        // Host remoto 
    locPth,                   // Directorio local
    dtePth,                   // Fichero señal de fecha de actualizacion
    [[//dir           extension   type      binary or ascii 
      [["",           "html",     "html",   FALSE]],  // ASCII
      [["",           "ico",      "ico",    TRUE]],   // Binary favicon.ico
      [["",           "xml",      "xml",    FALSE]],  // ASCII  site map
      [["css",        "css",      "css",    FALSE]],  // ASCII
      [["src",        "js",       "js",     FALSE]],  // ASCII  javascript
      [["img",        "gif",      "gif",    TRUE]],   // Binary
      [["tecnica",    "png",      "tec",    TRUE]],   // Binary
      [["camposomr",  "png",      "cam",    TRUE]],   // Binary
      [["documentos", "png",      "docpng", TRUE]],   // Binary
      [["documentos", "pdf",      "docpdf", TRUE]],   // Binary
      [["formularios","gif",      "frm",    TRUE]]    // Binary
    ]])
});
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Crear los ficheros de mandatos completos ftp o de actualizacion fup.",
makFtp);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real makSnd = If(!(ctrExe <: [["all", "snd"]]), FALSE,
{
  Text WriteLn(makSep+"sending files using ftp/ftu...");
  System(W("ftp/Omr.Forms.bat"))
});
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Enviado ficheros utilizando los mandatos creados con ftp o fup (update).",
makSnd);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
// TEST
//////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
Real makTst = If(ctrExe != "tst", FALSE,
{
  Text WriteLn(makSep+"test function Txt2Set()");

  Text tstT2S = " b  b :: aa :: b b :: cc:: ::::d::cc::";
  Text WriteLn(F(Txt2Set(tstT2S, "::", "")));
  Text WriteLn(F(Txt2Set(tstT2S, "::", "C")));
  Text WriteLn(F(Txt2Set(tstT2S, "::", "U")));
  Text WriteLn(F(Txt2Set(tstT2S, "::", "CU")));
  Text WriteLn(F(Txt2Set(tstT2S, "::", "CUN")));
  Text WriteLn(F(Txt2Set(tstT2S, "::", "CNU")));
  Text WriteLn(F(Txt2Set(tstT2S, "::", "CNUS")));
  Text WriteLn(F(Txt2Set(tstT2S, "::", "S")));

  Text WriteLn(makSep+"test function TxtOutside2Tag()");

  Text WriteLn(TxtOutside2Tag("
    a <i>b</i> c
    <img src='...' alt='alternativo uno' title='titulo uno'> d
    <img src='...' title="+Q("titulo dos")+" alt="+Q("alternativo dos")+"> e
    <script...>var x=33;</script> f
  ", "<", ">"));

  Text WriteLn(makSep+"test function TxtOutHtmTag()");

  Text WriteLn(TxtOutHtmTag("
    a <i>b</i> c
    <img src='...' alt='alternativo uno' title='titulo uno'> d
    <img src='...' title="+Q("titulo dos")+" alt="+Q("alternativo dos")+"> e
    <script...>var x=33;</script> f
  "));

  TRUE
});
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Realizar el test de algunas funcionalidades necesarias para el proceso.",
makTst);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
// END
//////////////////////////////////////////////////////////////////////////////
Text WriteLn("\nOmr.Forms make: end");

2015 asolver.com | Aviso legal | XHTML | Δ Θ Ξ | Creative Commons | Mapa y funciones del sitio

Tol