Secciones de la página

Ediciones. aContracorriente


Árbol de ficheros


Declaraciones


Inclusiones


Estructuras de datos


Constantes


Proceso


Lee la agenda


Genera el contenido


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 Ediciones.aContracorriente

Este programa se denomina Ediciones.aContracorriente porque es el constructor del sitio web edicionesacontracorriente.com. // Tanto Ediciones aContracorriente como su sitio web están dedicados a la edición, promoción y venta de libros en formato digital y en formato físico. La construcción del sitio web se realiza a partir de contenidos en formato de posts albergados en unos ficheros que se denominan agendas. Cada agenda contiene un conjunto de post, agrupados generalmente por temas, por ejemplo, catalogo, tienda, los autores y sus libros, trámites, etc. Estos ficheros de agendas se almacenan en un directorio que puede considerarse un banco de contenidos.

Los post pueden pertenecer a múltiples clases y este programa crea páginas Html de posts y de conjuntos de post por cada clase, a estas clases también se las denomina categorías. El programa esta basado en un macro-expansor a doble nivel de Tol en Html, donde las semillas de Html contienen Tol embebido y los post para publicar también pueden contener Tol embebido, por lo que: a) dentro de la primera expansion, la de las semillas, b) se pueden realizar otras expansiones, que son las del lenguaje Tol contenido en los post. Ediciones.aContracorriente genera todas las páginas a partir de una misma semilla.

Este programa emplea un directorio de agenda de posts, dentro de este directorio los posts se estructuran en varios ficheros que permiten organizarlos por su tipo de contenido y dentro de cada fichero por su fecha de publicación, los más recientes al principio. En el sitio web los post pueden tener 4 niveles de importancia diferentes que son: a) A de Anulado, b) B de Bajo, c) C de Común, que es el valor que se asume por defecto para los post que no tienen su nivel definido y c) D de Destacado.

Con este programa: a) las páginas de artículos se generan con la opción art, b) las páginas con los artículos agrupados por categorías con la opción cat, c) las páginas Html por defecto del sitio (index.html) y de cada directorio, la página absoluta y la de control de errores con la opción rot, d) el mapa del sitio web en Xml con la opción xsm, que son las siglas de Xml site map y e) las opciones ftp, fup y snd permiten poner el contenido en online. Los comentarios del código de este programa están realizados utilizando unas veces el español, sin acentos, y otras veces el inglés.

Este programa sólo escribe los ficheros de páginas Html que son diferentes a los ya creados en ejecuciones anteriores de forma que no haya que enviar todo el conjunto de páginas sino las de modificadas de fecha más reciente que el último log de envío. Este control lo realiza la opcion fup, de ftp update, frente a la opción ftp que generar ficheros de mandatos de envío con todo el contenido del web. Nótese que las opciones fup y ftp solo generan ficheros de mandatos ftp de envío y luego se pueden ejecutar con la opcion snd.

Árbol de ficheros

Ediciones.aContracorriente construye las páginas del sitio web edicionesacontracorriente.com

  • make.tol proceso principal de generación de contenidos del sitio web
  • tol directorios de código fuente en lenguaje de programación Tol
    • cmm funciones comunes de textos, fechas, conjuntos, ficheros, etc.
      • txt.tol funciones de manejo de textos
      • dte.tol funciones de manejo de fechas en español
      • set.tol funciones de manejo de conjuntos
      • fil.tol funciones de gestión de ficheros
      • dir.tol funciones de gestión de directorios
      • tme.tol del macro-expansor simple de Tol en Html
      • htm.tol funciones básicas del lenguaje Html
      • ftp.tol funciones para generar mandatos para hacer Ftp
      • xsm.tol para construir sitemaps en Xml
    • app funciones específicas de Ediciones.aContracorriente
      • pdb.tol funciones de manejo de los posts de una agenda
      • pht.tol funciones auxiliares para el Html de los post
    • inc.tol inclusión de los ficheros Tol básicos y de aplicación
  • agenda directorio destinado a albergar los ficheros de agendas de posts
  • web directorio destinado a las páginas web generadas automáticamente
    • css directorio para ficheros de estilo
      • common.css fichero de estilo para las páginas Html del sitio web
    • src directorio para ficheros javascript
      • ads.js código Javascript para emitir anuncios desde otros sitios
      • txt.js código Javascript para el manejo de textos
    • articulos directorio para páginas de artículos generadas por este programa
    • categorias directorio para páginas de categorias generadas automáticamente
    • sitemap.xml mapa del sitio web generado en Xml de forma automática
  • history archivo histórico del programa Ediciones.aContracorriente
  • ediciones_acontracorriente.pdf documento resumen de funciones del programa de generación Html

Declaraciones

Inclusiones

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

Constantes

  • Text makSep
    Linea horizontal para separar fases de operacion.
  • Text CtrAge
    All text files inside this directory.
  • Text CtrFil
    Estadísticas de posts por clases.
  • Real CtrRec
    Number of posts per page.
  • Real CtrTit
    Number of posts per title.
  • Real CtrDes
    Number of posts per description.
  • Set CatMnu
    Menu superior, categorias principales.
  • Set CatCol
    Colecciones.
  • Set CatTit
    Titulos publicados o pendientes de publicar.
  • Set CatAut
    Autores de los titulos publicados y portadas.
  • Set CatRes
    Resellers, distribuidores, tiendas online.
  • Set CatSnd
    Categorias secuntarias, pero que dan mucho juego.
  • Set CatGra
    Descargas gratis.
  • Set CatNot
    Categorias no indexables en mapas del web.
  • Set CatBuy
    Categorias de venta que son movidas a la libreria.
  • Set CatInx
    Categorias indexables.
  • Set CatAll
    Todas las categorias.

Proceso

  • Text ctrExe
    Argumento validado para la ejecucion del make.
  • Real makHlp
    Es cierto si se ha visualizado la ayuda.

Lee la agenda

Genera el contenido

  • Real makCat
    build all category pages.
  • Real makArt
    Build all articles pages.
  • Real makRot
    Build root absolute page.
  • Real makXsm
    Build Xml site map.
  • Real makFtp
    Crear los ficheros de mandatos completos ftp o de actualizacion fup.
  • Real makSnd
    Send files via ftp.

Inclusiones

Set allInc

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

Estructuras de datos

Struct PdbSt   // Posts database
{
  Set  pstCla, // Conjunto de tipos de post
  Text pstSta, // Status A(nulado), B(ajo), C(comun, por defecto), D(estacado)
  Text pstCod, // Identificador del post
  Text pstRed, // Titulo del post en Html con 2ª letra roja
  Text pstTit, // Titulo del post en Ascii puro
  Date pstDte, // Fecha de ocurrencia
  Text pstTyp, // Tipo de post
  Text pstAut, // Autor
  Text pstHtm, // Texto del post en Html
  Text pstTxt, // Texto del post en Ascii puro
  Text pstLnk, // Enlaces del post es html
  Text pstPay, // Enlaces para el pago
  Text pstRem  // Comentarios
};

Constantes

Text makSep

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

Text CtrAge

//////////////////////////////////////////////////////////////////////////////
Text CtrAge = "agenda";
//////////////////////////////////////////////////////////////////////////////
PutDescription("All text files inside this directory.",CtrAge);
//////////////////////////////////////////////////////////////////////////////

Text CtrFil

//////////////////////////////////////////////////////////////////////////////
Text CtrFil = "poststat.csv";
//////////////////////////////////////////////////////////////////////////////
PutDescription("Estadísticas de posts por clases.",CtrFil);
//////////////////////////////////////////////////////////////////////////////

Real CtrRec

//////////////////////////////////////////////////////////////////////////////
Real CtrRec =  8;
//////////////////////////////////////////////////////////////////////////////
PutDescription("Number of posts per page.",CtrRec);
//////////////////////////////////////////////////////////////////////////////

Real CtrTit

//////////////////////////////////////////////////////////////////////////////
Real CtrTit =  4;
//////////////////////////////////////////////////////////////////////////////
PutDescription("Number of posts per title.",CtrTit);
//////////////////////////////////////////////////////////////////////////////

Real CtrDes

//////////////////////////////////////////////////////////////////////////////
Real CtrDes =  8;
//////////////////////////////////////////////////////////////////////////////
PutDescription("Number of posts per description.",CtrDes);
//////////////////////////////////////////////////////////////////////////////

Set CatMnu

//////////////////////////////////////////////////////////////////////////////
Set CatMnu =
[[
  "Editorial",
  "Autor",
  "Tienda",
//"Blog",     el blog de blogspot fue dado de baja
  "Publicar"
]];
//////////////////////////////////////////////////////////////////////////////
PutDescription("Menu superior, categorias principales.",CatMnu);
//////////////////////////////////////////////////////////////////////////////

Set CatCol

//////////////////////////////////////////////////////////////////////////////
Set CatCol =
[[
  "aQuemarropa",
  "aMedialuz",
  "aMedianoche",
  "aTodaplana",
  "aFondo"
]];
//////////////////////////////////////////////////////////////////////////////
PutDescription("Colecciones.",CatCol);
//////////////////////////////////////////////////////////////////////////////

Set CatTit

//////////////////////////////////////////////////////////////////////////////
Set CatTit =
[[
  "Azafata Aventuras", // So Blonde
  "El Collar Maya",    // Teo Palacios
  "Gente Muerta",      // J. G. Mesa
  "Leyendas",          // G. A. Bécquer
  "Tibios y Muertos"   // Manuel Arduino
]]; 
//////////////////////////////////////////////////////////////////////////////
PutDescription("Titulos publicados o pendientes de publicar.",CatTit);
//////////////////////////////////////////////////////////////////////////////

Set CatAut

//////////////////////////////////////////////////////////////////////////////
Set CatAut =
[[
  "AnsoteguiL",
  "ArduinoM",
  "CalaveraDiabloCG",
  "BecquerGA",
  "BlondeS",
  "MesaJG",
  "PalaciosT"
]]; 
//////////////////////////////////////////////////////////////////////////////
PutDescription("Autores de los titulos publicados y portadas.",CatAut);
//////////////////////////////////////////////////////////////////////////////

Set CatRes

//////////////////////////////////////////////////////////////////////////////
Set CatRes =
[[
  "Fnac",
  "Amazon",
  "Google Play"
]]; 
//////////////////////////////////////////////////////////////////////////////
PutDescription("Resellers, distribuidores, tiendas online.",CatRes);
//////////////////////////////////////////////////////////////////////////////

Set CatSnd

//////////////////////////////////////////////////////////////////////////////
Set CatSnd =
[[
  "Hojear",
  "Opiniones y reseñas",
  "Sinopsis",
  "Índice de contenidos",
  "Para leer",
  "Contenido extra",
  "Vídeo",
  "Música aconsejada",
  "Catálogo"
]];
//////////////////////////////////////////////////////////////////////////////
PutDescription("Categorias secuntarias, pero que dan mucho juego.",CatSnd);
//////////////////////////////////////////////////////////////////////////////

Set CatGra

//////////////////////////////////////////////////////////////////////////////
Set CatGra =
[[
  "Edición no venal",
  "Material gratuito"
]];
//////////////////////////////////////////////////////////////////////////////
PutDescription("Descargas gratis.",CatGra);
//////////////////////////////////////////////////////////////////////////////

Set CatNot

//////////////////////////////////////////////////////////////////////////////
Set CatNot = 
[[
//"Buscar",          se hacía con Google que deposita cookies
//"Puntos de venta", eran quioscos y librerías y ya no tenemos
  "Completo",
  "Mapa del web"
]]; 
//////////////////////////////////////////////////////////////////////////////
PutDescription("Categorias no indexables en mapas del web.",CatNot);
//////////////////////////////////////////////////////////////////////////////

Set CatBuy

//////////////////////////////////////////////////////////////////////////////
Set CatBuy =
[[
  "Cancelar",
  "Descargar",
  "Agotado",
  "Finalizado",
  "Postal"
]]; 
//////////////////////////////////////////////////////////////////////////////
PutDescription("Categorias de venta que son movidas a la libreria.",CatBuy);
//////////////////////////////////////////////////////////////////////////////

Set CatInx

//////////////////////////////////////////////////////////////////////////////
Set CatInx = CatMnu <<
             CatCol <<
             CatTit <<
             CatAut <<
             CatRes <<
             CatSnd <<
             CatGra;
//////////////////////////////////////////////////////////////////////////////
PutDescription("Categorias indexables.",CatInx);
//////////////////////////////////////////////////////////////////////////////

Set CatAll

//////////////////////////////////////////////////////////////////////////////
Set CatAll = CatInx <<
             CatNot <<
             CatBuy;
//////////////////////////////////////////////////////////////////////////////
PutDescription("Todas las categorias.",CatAll);
//////////////////////////////////////////////////////////////////////////////

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 edicionesacontracorriente.com site
  OPTION
    cat: build all category pages
    art: build all articles pages
    rot: build root absolute page
    xsm: build xml site maps
    ftp: build ftp files (go to ftp dir and run manually)
    fup: build a file update protocol (newer than ftp.log file)
    snd: send file via ftp
    web: build local web: cat, art, rot, xms
    all: do all works: cat, art, rot, xms, fup y snd
    hlp: show this help");
  TRUE
});
//////////////////////////////////////////////////////////////////////////////
PutDescription("Es cierto si se ha visualizado la ayuda.", makHlp);
//////////////////////////////////////////////////////////////////////////////

Lee la agenda

Set CtrPdb

//////////////////////////////////////////////////////////////////////////////
Set CtrPdb = If(! (ctrExe <: [["all", "web", "cat", "art"]]), Empty,
                PdbRead(CtrAge)); // Read all posts
//////////////////////////////////////////////////////////////////////////////
PutDescription("Read all posts.",CtrPdb);
//////////////////////////////////////////////////////////////////////////////

Set CtrCmn

//////////////////////////////////////////////////////////////////////////////
Set CtrCmn = Select(CtrPdb, Real(Set a) { Or(a->pstSta == "C",
                                             a->pstSta == "D") });
//////////////////////////////////////////////////////////////////////////////
PutDescription("Comun y destacados.",CtrCmn);
//////////////////////////////////////////////////////////////////////////////
Text WriteLn("Status __CD "+FormatReal(Card(CtrCmn),"%3.0lf")+" registers");

Set CtrDst

//////////////////////////////////////////////////////////////////////////////
Set CtrDst = Select(CtrPdb, Real(Set a) { a->pstSta == "D" });
//////////////////////////////////////////////////////////////////////////////
PutDescription("Destacados.",CtrDst);
//////////////////////////////////////////////////////////////////////////////
Text WriteLn("Status ___D "+FormatReal(Card(CtrDst),"%3.0lf")+" registers");

Set CtrNVe

//////////////////////////////////////////////////////////////////////////////
Set CtrNVe = Select(CtrPdb, Real(Set p) { CatGra[1] <: p->pstCla }); // Gratis
//////////////////////////////////////////////////////////////////////////////
PutDescription("Ediciones no venales.",CtrNVe);
//////////////////////////////////////////////////////////////////////////////

Set CtrMGr

//////////////////////////////////////////////////////////////////////////////
Set CtrMGr = Select(CtrPdb, Real(Set p) { CatGra[2] <: p->pstCla }); // Gratis
//////////////////////////////////////////////////////////////////////////////
PutDescription("Matarial gratuito.",CtrMGr);
//////////////////////////////////////////////////////////////////////////////

Genera el contenido

Real makCat

//////////////////////////////////////////////////////////////////////////////
Real makCat = If(Or(ctrExe=="all", ctrExe=="web", ctrExe=="cat"),
{
  Text WriteLn(makSep+"building all category pages...");
  Text WriteFile(CtrFil, "Posts; Class\n");
  
  Real CtrArt = FALSE; // Categories, not articles

  // Make category pages
  Set  cicCat = EvalSet(CatAll, Real(Text CtrPag)
  {
    Text filNam = PhtFileName(CtrPag); // Output file
    Text WriteLn("["+CtrPag+"|"+filNam+"]");
    
    Set  SelPdb = // Selected post from database for this page
    {
      Set  selSet = Select(CtrPdb, Real(Set pdbObj)
                           { CtrPag <: pdbObj->pstCla });
      Real selCrd = Card(selSet);
      Text txtCrd = FormatReal(selCrd,"%.0lf");
      Text WriteLn("  "+txtCrd+" posts selected");
      Text AppendFile(CtrFil, txtCrd+"; "+CtrPag+"\n");
  
      // If none then the most recent
      If(selCrd, selSet, PdbFirstN(CtrPdb, CtrRec, Real(Set pdbObj) { TRUE }))
    };
    TmeFile("web/seed/seed.htm", "web/"+filNam)
  });

  Text WriteLn("renaming https file...");
  Set  secCic = EvalSet(CatBuy, Real(Text catNam)
  {
    Text filNam = ToLower(catNam);
    FilRename("web/categorias/"+filNam+".html",
              "web/libreria/"  +filNam+".htm", TRUE)
  });

  Card(cicCat)+Card(secCic)
},FALSE);
//////////////////////////////////////////////////////////////////////////////
PutDescription("build all category pages.",makCat);
//////////////////////////////////////////////////////////////////////////////

Real makArt

//////////////////////////////////////////////////////////////////////////////
Real makArt = If(Or(ctrExe=="all", ctrExe=="web", ctrExe=="art"),
{
  Text WriteLn(makSep+"building all article pages...");
  
  Real CtrArt = TRUE; // Articles

  // Make article pages
  Set  cicArt = For(1, Card(CtrCmn), Real(Real pstNum)
  {
    Set  SelPdb = SetSubCicle(CtrCmn, pstNum, CtrRec);
    Text CtrPag = TxtOutside2Tag(CtrCmn[pstNum]->pstTit,"<",">");

    Text filNam = PhtFileName(CtrPag); // Output file
    Text WriteLn("["+CtrPag+"|"+filNam+"]");
    TmeFile("web/seed/seed.htm", "web/"+filNam)
  });

  Card(cicArt)
},FALSE);
//////////////////////////////////////////////////////////////////////////////
PutDescription("Build all articles pages.", makArt);
//////////////////////////////////////////////////////////////////////////////

Real makRot

//////////////////////////////////////////////////////////////////////////////
Real makRot = If(Or(ctrExe=="all", ctrExe=="web", ctrExe=="rot"),
{
  Text WriteLn(makSep+"building root absolute page...");
  
  Text WriteLn("-> homepage index.html");
  Text inxHtm = ReadFile("web/categorias/editorial.html");
  Text inxRot = Replace(inxHtm,"\"../", "\"");
  Text WriteFile("web/index.html", inxRot);
  
  Text WriteLn("-> absolut index page");
  Text absSav = Replace(inxHtm, " href=\"http",
                                " _XX_=\"_XX_"); // Save external references
  Text absRep = ReplaceTable(absSav,
  [[
     [[ " src=\"../",  "  src=\"http://www.edicionesacontracorriente.com/"]],
     [[" href=\"../",  " href=\"http://www.edicionesacontracorriente.com/"]]
  ]],1);
  Text absRec = Replace(absRep, " _XX_=\"_XX_",
                                " href=\"http"); // Recall external references
  Text WriteFile("web/absoluto.html", absRec);


  Text WriteLn("-> 404 page");
  Text errRec = Replace(absRec,
                        "<span class='ediciones'>ediciones</span>",
                        "<span class='ediciones'>página no encontrada</span>");
  Text WriteFile("web/error404.html", errRec);

  Text WriteLn("-> common directory page, utf-8");
  FilCopy("../common/dir.html", "web/categorias/comxidir.html", TRUE)
},FALSE);
//////////////////////////////////////////////////////////////////////////////
PutDescription("Build root absolute page.", makRot);
//////////////////////////////////////////////////////////////////////////////

Real makXsm

//////////////////////////////////////////////////////////////////////////////
Real makXsm = If(Or(ctrExe=="all", ctrExe=="web", ctrExe=="xsm"),
{
  Text WriteLn(makSep+"building xml site map...");
  XsmDir("web/sitemap.xml","web","http://www.edicionesacontracorriente.com/")
},FALSE);
//////////////////////////////////////////////////////////////////////////////
PutDescription("Build Xml site map.", makXsm);
//////////////////////////////////////////////////////////////////////////////

Real makFtp

//////////////////////////////////////////////////////////////////////////////
Real makFtp = If(ctrExe <: [["ftp","fup","all"]],
{
  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.edicionesacontracorriente.com", // 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, rss
      [["",        "css",      "css",   FALSE]],  // ASCII  styles
      [["",        "js",       "js",    FALSE]],  // ASCII  javascript
      [["",        "png",      "png",   TRUE]],   // Binary
      [["",        "swf",      "swf",   TRUE]],   // Binary flash
      [["",        "pdf",      "pdf",   TRUE]]    // Binary
    ]] << FtpLibTab)
},FALSE);
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Crear los ficheros de mandatos completos ftp o de actualizacion fup.",
makFtp);
//////////////////////////////////////////////////////////////////////////////

Real makSnd

//////////////////////////////////////////////////////////////////////////////
Real makSnd = If(Or(ctrExe=="all", ctrExe=="snd"),
{
  Text WriteLn(makSep+"sending files using ftp...");
  System(W("ftp/Ediciones.aContracorriente.bat"))
},FALSE);
//////////////////////////////////////////////////////////////////////////////
PutDescription("Send files via ftp.",makSnd);
//////////////////////////////////////////////////////////////////////////////

Finalización

Text WriteLn("\nEdiciones.aContracorriente make: end");

Time oriented language

//////////////////////////////////////////////////////////////////////////////
// FILE    : make.tol
// AUTHOR  : http://www.asolver.com
// CLASS   : Metaprogramación; Hipertexto; Editorial
// VERSION : Tol 1.1.5; Tol 1.1.6; Tol 2.0.1
// PURPOSE : Este programa se denomina Ediciones.aContracorriente porque es el
// constructor del sitio web edicionesacontracorriente.com.
//
// Tanto Ediciones aContracorriente como su sitio web están dedicados a la
// edición, promoción y venta de libros en formato digital y en formato
// físico.
// 
// La construcción del sitio web se realiza a partir de contenidos en formato
// de posts albergados en unos ficheros que se denominan agendas.
// Cada agenda contiene un conjunto de post, agrupados generalmente por temas,
// por ejemplo, catalogo, tienda, los autores y sus libros, trámites, etc.
// Estos ficheros de agendas se almacenan en un directorio que puede
// considerarse un banco de contenidos.
// _
// Los post pueden pertenecer a múltiples clases y este programa crea páginas
// Html de posts y de conjuntos de post por cada clase, a estas clases también
// se las denomina categorías.
// 
// El programa esta basado en un macro-expansor a doble nivel de Tol en Html,
// donde las semillas de Html contienen Tol embebido y los post para publicar
// también pueden contener Tol embebido, por lo que:
// a) dentro de la primera expansion, la de las semillas,
// b) se pueden realizar otras expansiones, que son las del lenguaje Tol
//    contenido en los post.
// 
// Ediciones.aContracorriente genera todas las páginas a partir de una misma
// semilla.
// _
// Este programa emplea un directorio de agenda de posts, dentro de este
// directorio los posts se estructuran en varios ficheros que permiten
// organizarlos por su tipo de contenido y dentro de cada fichero por su fecha
// de publicación, los más recientes al principio.
// 
// En el sitio web los post pueden tener 4 niveles de importancia diferentes
// que son:
// a) A de Anulado,
// b) B de Bajo,
// c) C de Común, que es el valor que se asume por defecto para los post que
//    no tienen su nivel definido y
// c) D de Destacado.
// _
// Con este programa:
// a) las páginas de artículos se generan con la opción art,
// b) las páginas con los artículos agrupados por categorías con la opción
//    cat,
// c) las páginas Html por defecto del sitio (index.html) y de cada
//    directorio, la página absoluta y la de control de errores con la
//    opción rot,
// d) el mapa del sitio web en Xml con la opción xsm, que son las siglas de 
//    Xml site map y
// e) las opciones ftp, fup y snd permiten poner el contenido en online.
// 
// Los comentarios del código de este programa están realizados utilizando
// unas veces el español, sin acentos, y otras veces el inglés.
// _
// Este programa sólo escribe los ficheros de páginas Html que son diferentes
// a los ya creados en ejecuciones anteriores de forma que no haya que enviar
// todo el conjunto de páginas sino las de modificadas de fecha más reciente
// que el último log de envío. Este control lo realiza la opcion fup, de
// ftp update, frente a la opción ftp que generar ficheros de mandatos de
// envío con todo el contenido del web. Nótese que las opciones fup y ftp solo
// generan ficheros de mandatos ftp de envío y luego se pueden ejecutar con
// la opcion snd.
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
// INCLUDE
//////////////////////////////////////////////////////////////////////////////
Text WriteLn("\nEdiciones.aContracorriente make: begin");

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


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

Struct PdbSt   // Posts database
{
  Set  pstCla, // Conjunto de tipos de post
  Text pstSta, // Status A(nulado), B(ajo), C(comun, por defecto), D(estacado)
  Text pstCod, // Identificador del post
  Text pstRed, // Titulo del post en Html con 2ª letra roja
  Text pstTit, // Titulo del post en Ascii puro
  Date pstDte, // Fecha de ocurrencia
  Text pstTyp, // Tipo de post
  Text pstAut, // Autor
  Text pstHtm, // Texto del post en Html
  Text pstTxt, // Texto del post en Ascii puro
  Text pstLnk, // Enlaces del post es html
  Text pstPay, // Enlaces para el pago
  Text pstRem  // Comentarios
};


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

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


//////////////////////////////////////////////////////////////////////////////
Text CtrAge = "agenda";
//////////////////////////////////////////////////////////////////////////////
PutDescription("All text files inside this directory.",CtrAge);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Text CtrFil = "poststat.csv";
//////////////////////////////////////////////////////////////////////////////
PutDescription("Estadísticas de posts por clases.",CtrFil);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real CtrRec =  8;
//////////////////////////////////////////////////////////////////////////////
PutDescription("Number of posts per page.",CtrRec);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real CtrTit =  4;
//////////////////////////////////////////////////////////////////////////////
PutDescription("Number of posts per title.",CtrTit);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real CtrDes =  8;
//////////////////////////////////////////////////////////////////////////////
PutDescription("Number of posts per description.",CtrDes);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Set CatMnu =
[[
  "Editorial",
  "Autor",
  "Tienda",
//"Blog",     el blog de blogspot fue dado de baja
  "Publicar"
]];
//////////////////////////////////////////////////////////////////////////////
PutDescription("Menu superior, categorias principales.",CatMnu);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Set CatCol =
[[
  "aQuemarropa",
  "aMedialuz",
  "aMedianoche",
  "aTodaplana",
  "aFondo"
]];
//////////////////////////////////////////////////////////////////////////////
PutDescription("Colecciones.",CatCol);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Set CatTit =
[[
  "Azafata Aventuras", // So Blonde
  "El Collar Maya",    // Teo Palacios
  "Gente Muerta",      // J. G. Mesa
  "Leyendas",          // G. A. Bécquer
  "Tibios y Muertos"   // Manuel Arduino
]]; 
//////////////////////////////////////////////////////////////////////////////
PutDescription("Titulos publicados o pendientes de publicar.",CatTit);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Set CatAut =
[[
  "AnsoteguiL",
  "ArduinoM",
  "CalaveraDiabloCG",
  "BecquerGA",
  "BlondeS",
  "MesaJG",
  "PalaciosT"
]]; 
//////////////////////////////////////////////////////////////////////////////
PutDescription("Autores de los titulos publicados y portadas.",CatAut);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Set CatRes =
[[
  "Fnac",
  "Amazon",
  "Google Play"
]]; 
//////////////////////////////////////////////////////////////////////////////
PutDescription("Resellers, distribuidores, tiendas online.",CatRes);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Set CatSnd =
[[
  "Hojear",
  "Opiniones y reseñas",
  "Sinopsis",
  "Índice de contenidos",
  "Para leer",
  "Contenido extra",
  "Vídeo",
  "Música aconsejada",
  "Catálogo"
]];
//////////////////////////////////////////////////////////////////////////////
PutDescription("Categorias secuntarias, pero que dan mucho juego.",CatSnd);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Set CatGra =
[[
  "Edición no venal",
  "Material gratuito"
]];
//////////////////////////////////////////////////////////////////////////////
PutDescription("Descargas gratis.",CatGra);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Set CatNot = 
[[
//"Buscar",          se hacía con Google que deposita cookies
//"Puntos de venta", eran quioscos y librerías y ya no tenemos
  "Completo",
  "Mapa del web"
]]; 
//////////////////////////////////////////////////////////////////////////////
PutDescription("Categorias no indexables en mapas del web.",CatNot);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Set CatBuy =
[[
  "Cancelar",
  "Descargar",
  "Agotado",
  "Finalizado",
  "Postal"
]]; 
//////////////////////////////////////////////////////////////////////////////
PutDescription("Categorias de venta que son movidas a la libreria.",CatBuy);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Set CatInx = CatMnu <<
             CatCol <<
             CatTit <<
             CatAut <<
             CatRes <<
             CatSnd <<
             CatGra;
//////////////////////////////////////////////////////////////////////////////
PutDescription("Categorias indexables.",CatInx);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Set CatAll = CatInx <<
             CatNot <<
             CatBuy;
//////////////////////////////////////////////////////////////////////////////
PutDescription("Todas las categorias.",CatAll);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
// MAKE
//////////////////////////////////////////////////////////////////////////////
Text WriteLn("\nEdiciones.aContracorriente 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 edicionesacontracorriente.com site
  OPTION
    cat: build all category pages
    art: build all articles pages
    rot: build root absolute page
    xsm: build xml site maps
    ftp: build ftp files (go to ftp dir and run manually)
    fup: build a file update protocol (newer than ftp.log file)
    snd: send file via ftp
    web: build local web: cat, art, rot, xms
    all: do all works: cat, art, rot, xms, fup y snd
    hlp: show this help");
  TRUE
});
//////////////////////////////////////////////////////////////////////////////
PutDescription("Es cierto si se ha visualizado la ayuda.", makHlp);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
// Lee la agenda
//////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
Set CtrPdb = If(! (ctrExe <: [["all", "web", "cat", "art"]]), Empty,
                PdbRead(CtrAge)); // Read all posts
//////////////////////////////////////////////////////////////////////////////
PutDescription("Read all posts.",CtrPdb);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Set CtrCmn = Select(CtrPdb, Real(Set a) { Or(a->pstSta == "C",
                                             a->pstSta == "D") });
//////////////////////////////////////////////////////////////////////////////
PutDescription("Comun y destacados.",CtrCmn);
//////////////////////////////////////////////////////////////////////////////
Text WriteLn("Status __CD "+FormatReal(Card(CtrCmn),"%3.0lf")+" registers");


//////////////////////////////////////////////////////////////////////////////
Set CtrDst = Select(CtrPdb, Real(Set a) { a->pstSta == "D" });
//////////////////////////////////////////////////////////////////////////////
PutDescription("Destacados.",CtrDst);
//////////////////////////////////////////////////////////////////////////////
Text WriteLn("Status ___D "+FormatReal(Card(CtrDst),"%3.0lf")+" registers");


//////////////////////////////////////////////////////////////////////////////
Set CtrNVe = Select(CtrPdb, Real(Set p) { CatGra[1] <: p->pstCla }); // Gratis
//////////////////////////////////////////////////////////////////////////////
PutDescription("Ediciones no venales.",CtrNVe);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Set CtrMGr = Select(CtrPdb, Real(Set p) { CatGra[2] <: p->pstCla }); // Gratis
//////////////////////////////////////////////////////////////////////////////
PutDescription("Matarial gratuito.",CtrMGr);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
// Genera el contenido
//////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
Real makCat = If(Or(ctrExe=="all", ctrExe=="web", ctrExe=="cat"),
{
  Text WriteLn(makSep+"building all category pages...");
  Text WriteFile(CtrFil, "Posts; Class\n");
  
  Real CtrArt = FALSE; // Categories, not articles

  // Make category pages
  Set  cicCat = EvalSet(CatAll, Real(Text CtrPag)
  {
    Text filNam = PhtFileName(CtrPag); // Output file
    Text WriteLn("["+CtrPag+"|"+filNam+"]");
    
    Set  SelPdb = // Selected post from database for this page
    {
      Set  selSet = Select(CtrPdb, Real(Set pdbObj)
                           { CtrPag <: pdbObj->pstCla });
      Real selCrd = Card(selSet);
      Text txtCrd = FormatReal(selCrd,"%.0lf");
      Text WriteLn("  "+txtCrd+" posts selected");
      Text AppendFile(CtrFil, txtCrd+"; "+CtrPag+"\n");
  
      // If none then the most recent
      If(selCrd, selSet, PdbFirstN(CtrPdb, CtrRec, Real(Set pdbObj) { TRUE }))
    };
    TmeFile("web/seed/seed.htm", "web/"+filNam)
  });

  Text WriteLn("renaming https file...");
  Set  secCic = EvalSet(CatBuy, Real(Text catNam)
  {
    Text filNam = ToLower(catNam);
    FilRename("web/categorias/"+filNam+".html",
              "web/libreria/"  +filNam+".htm", TRUE)
  });

  Card(cicCat)+Card(secCic)
},FALSE);
//////////////////////////////////////////////////////////////////////////////
PutDescription("build all category pages.",makCat);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real makArt = If(Or(ctrExe=="all", ctrExe=="web", ctrExe=="art"),
{
  Text WriteLn(makSep+"building all article pages...");
  
  Real CtrArt = TRUE; // Articles

  // Make article pages
  Set  cicArt = For(1, Card(CtrCmn), Real(Real pstNum)
  {
    Set  SelPdb = SetSubCicle(CtrCmn, pstNum, CtrRec);
    Text CtrPag = TxtOutside2Tag(CtrCmn[pstNum]->pstTit,"<",">");

    Text filNam = PhtFileName(CtrPag); // Output file
    Text WriteLn("["+CtrPag+"|"+filNam+"]");
    TmeFile("web/seed/seed.htm", "web/"+filNam)
  });

  Card(cicArt)
},FALSE);
//////////////////////////////////////////////////////////////////////////////
PutDescription("Build all articles pages.", makArt);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real makRot = If(Or(ctrExe=="all", ctrExe=="web", ctrExe=="rot"),
{
  Text WriteLn(makSep+"building root absolute page...");
  
  Text WriteLn("-> homepage index.html");
  Text inxHtm = ReadFile("web/categorias/editorial.html");
  Text inxRot = Replace(inxHtm,"\"../", "\"");
  Text WriteFile("web/index.html", inxRot);
  
  Text WriteLn("-> absolut index page");
  Text absSav = Replace(inxHtm, " href=\"http",
                                " _XX_=\"_XX_"); // Save external references
  Text absRep = ReplaceTable(absSav,
  [[
     [[ " src=\"../",  "  src=\"http://www.edicionesacontracorriente.com/"]],
     [[" href=\"../",  " href=\"http://www.edicionesacontracorriente.com/"]]
  ]],1);
  Text absRec = Replace(absRep, " _XX_=\"_XX_",
                                " href=\"http"); // Recall external references
  Text WriteFile("web/absoluto.html", absRec);


  Text WriteLn("-> 404 page");
  Text errRec = Replace(absRec,
                        "<span class='ediciones'>ediciones</span>",
                        "<span class='ediciones'>página no encontrada</span>");
  Text WriteFile("web/error404.html", errRec);

  Text WriteLn("-> common directory page, utf-8");
  FilCopy("../common/dir.html", "web/categorias/comxidir.html", TRUE)
},FALSE);
//////////////////////////////////////////////////////////////////////////////
PutDescription("Build root absolute page.", makRot);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real makXsm = If(Or(ctrExe=="all", ctrExe=="web", ctrExe=="xsm"),
{
  Text WriteLn(makSep+"building xml site map...");
  XsmDir("web/sitemap.xml","web","http://www.edicionesacontracorriente.com/")
},FALSE);
//////////////////////////////////////////////////////////////////////////////
PutDescription("Build Xml site map.", makXsm);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real makFtp = If(ctrExe <: [["ftp","fup","all"]],
{
  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.edicionesacontracorriente.com", // 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, rss
      [["",        "css",      "css",   FALSE]],  // ASCII  styles
      [["",        "js",       "js",    FALSE]],  // ASCII  javascript
      [["",        "png",      "png",   TRUE]],   // Binary
      [["",        "swf",      "swf",   TRUE]],   // Binary flash
      [["",        "pdf",      "pdf",   TRUE]]    // Binary
    ]] << FtpLibTab)
},FALSE);
//////////////////////////////////////////////////////////////////////////////
PutDescription(
"Crear los ficheros de mandatos completos ftp o de actualizacion fup.",
makFtp);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real makSnd = If(Or(ctrExe=="all", ctrExe=="snd"),
{
  Text WriteLn(makSep+"sending files using ftp...");
  System(W("ftp/Ediciones.aContracorriente.bat"))
},FALSE);
//////////////////////////////////////////////////////////////////////////////
PutDescription("Send files via ftp.",makSnd);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
// END
//////////////////////////////////////////////////////////////////////////////
Text WriteLn("\nEdiciones.aContracorriente make: end");

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

Tol