Secciones de la página

Ink. Watercolor


Árbol de ficheros


Declaraciones


Inclusiones


Estructuras de datos


Constantes


Proceso


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 Ink.Watercolor

Programa constructor del sitio web del dominio inkwatercolor.com dedicado a contenidos de arte creados con tintas y acuarelas y con otras diferentes técnicas. Los contenidos que emplea para crearlo son: a) registros de obras de arte, en 2 idiomas, castellano e inglés, que se organizan en en un directorio, que se denomina agenda y b) ficheros en formato JPG con imágenes de las obras de arte en diversos tanaños (pequeños, más grandes, DIN A4 y DIN A3). // El directorio de agenda puede contener varios ficheros, en especial, contiene un fichero por cada galería de arte, de esta forma, hay un fichero para: a) la galería llamada chppho, que es la principal, y que está dedicada a obras de pintura automática realizadas en tintas y acuarelas, b) la galería llamada fleurs, que está dedicada a las Flores del Mal de Charles Baudelaire, hay una pintura para cada uno de sus poemas y c) la galería llamada inarmy, que está dedicada a esquemas y apuntes rápidos de la vida castrense.

Este programa para Ink Watercolor: a) Se clasifica de metaprogramación porque se ha escrito código en lenguaje de programación TOL que escribe, a su vez, código en lenguaje de Html para las páginas del sitio web, código TOL que representa los resultados de los análisis estadísticos y código en lenguaje Javascript para la gestión de contenidos artísticos. b) Se clasifica de Hipertexto porque el resultado final más importante es la generación de más de un millar de páginas de hipertexto. c) Se clasifica de arte porque el objetivo es la difusión de contenidos artísticos por internet.

La información sobre las 3 galerías de arte de este sitio web inkwatercolor.com se organiza en un fichero para cada galería, cada fichero contiene de decenas a centenas de registros, tantos registros como obras de arte tiene la galería. // Cada registro de estos ficheros tiene atributos para describir el título, el autor, las técnicas, materiales empleados, los colores, la fecha de realización, la calidad de la obra, etc. // Ha de notarse que este esquema de agenda es el precursos de las estructuras de agendas de posts que se emplean que otros sitios web generados con TOL.

Este programa para la creación del sitio web inkwatercolor.com es de los primeros desarrollados en TOL para la creación de páginas web y conserva mucha de su programación original que tiene las caracteríscas siguientes: a) La creación de las páginas Html se realiza en fases, primero construyendo semillas de páginas web (templeates) a partir de semillas de trozos comunes de páginas web. Por ejemplo, con semillas de títulos, de menús, de estructuras para cuadros, etc. se crean semillas (templates) para páginas que han de albergar cuadros, unas para inglés otras para castellano, unas para 1 cuadro, para 4 cuadros, para listados de cuadros, etc. b) Tiene funcionalidad para crea de forma automática: índices, como listados de enlaces, de ilustraciones, pero los índices principales del sitio web se tienen que crear de forma manual. c) Tiene funcionalidad para rellenar automáticamente la descripción y la lista de palabras clave de cada página web y las crea de una forma personalizada para cada página dependiendo del cuadro o de los cuadros que alberga (campos meta), de forma que la descripción de una página es un resumen da la descripción de sus cuadros, pero las descripciones y las listas de palabras clave que genera no son especialmente largas. d) Delega en Javascript todas aquellas funcionalidades para las que, en el momento de su desarrollo, Javascript parecía más adecuado.

Las funciones principales de este programa para la creación de inkwatercolor.com y que son accesibles a través de sus diferentes opciones, son: a) Crear las páginas de las obras de arte de todas las galerías, el contenido fundamental de estas páginas es un cuadro y su descripción, utiliza unas imágenes que se llaman zoom. b) Crear páginas con las obras de arte de cada galería agrupadas de 4 en 4, estas páginas contienen unas imágenes menores que se llaman tiny, obsérvese que este uso de imágenes de menor tamaño era frecuente cuando el ancho de banda disponible en internet era mucho más limitado. c) Crear listados de índice a obras agrupados de 16 en 16 con enlace a cada una de las obras. d) Secuenciar los enlaces entre todas las obras, por ejemplo, entre las páginas en inglés y castellano de una misma obra, entre cada obra y algunas de las que le siguen o le anteceden, etc. Para la creación de estos enlaces se emplean los números únicos que identifica a haca cuadro en cada garería. e) Crear la homepage del sitio web inkwatercolor.com. f) Crear las páginas por defecto (los index.html) para cada uno de sus directorios y subdirectorios y ha de tenerse en cuenta que en el contenido de estos index.html se da prioridad a la última galería que se haya ejecutado. g) Crear una estructura de pinturas e información sobre ella para ser utilizadas desde Javascript. h) Crear el mapa del sitio web sitemap.xml y ficheros de mandatos para la transmision por FTP, la programación de estas 2 funcionalidades es, en este caso, dependiente de este sitio web y es por lo que sus ficheros TOL están en el directorio de funciones de aplicación (app) y no en el directorio de funciones comunes (cmm).

El sitio web inkwatercolor.com se organiza en una estructura de directorios algo más compleja que otros sitios web desarrollados con TOL. // Este sitio web tiene un directorio para cada una de sus galerías de arte, que a su vez tiene subdirectorios para: a) sus páginas en inglés (page), b) sus páginas en castellano (pags), c) las semillas de páginas, templates, en inglés (sede), d) las semillas de páginas castellano (seds), e) un subdirectorio para imágenes (image) que, a su vez, tiene subdirectorios, por ejemplo, para imágenes pequeñas (tiny), imágenes más grandes (zoom), imágenes limpias y procesadas (clean), escaneados originales de las obras (scan) imágenes den formatos DIN A3 y DIN A4 (da3 y da4). // Además de un directorio para contenidos comunes a todas las galerías con subdirectorios para: a) estilo de páginas web (css), b) imágenes comunes en formato GIF (gif), c) partes de templates para componer semillas para páginas webs (seed) y d) código en lenguaje Javascript (src).

Los comentarios del código de este programa están realizados utilizando unas veces el español no acentuado dentro del código y otras veces el inglés. Se ha comprobado el funcionamiento de este programa para las versiones de Tol 1.1.5, 1.1.6 y 2.0.1. Con la version 1.1.1 da problemas, por ejemplo, por el uso que se hace del tercer parámetro de la función de texto TextReplace(texto, tabla, numero de ciclos), ya que la versión de Tol 1.1.1 no se contemplaba el número de ciclos.

Árbol de ficheros

Ink.Watercolor construye las páginas del sitio web inkwatercolor.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
      • set.tol funciones de manejo de conjuntos
      • tab.tol funciones de tablas como set of sets
      • ser.tol funciones de series temporales
      • fil.tol funciones de gestión de ficheros
      • zip.tol compresor de ficheros en línea de mandatos
      • apa.tol proceso de ficheros de log de Apache
      • dir.tol funciones de gestión de directorios
    • app funciones especificas de Ink.Watercolor
      • pdb.tol funciones de la base de datos de pinturas
      • pag.tol funciones para generar páginas web Html
      • sed.tol semillas, templates, de páginas web Html
      • ftp.tol funciones para generar mandatos para hacer Ftp
      • xml.tol funciones históricas para sitemaps en Xml
      • alc.tol alchemy para la transformación de imágenes
      • ink.tol funciones auxiliares de InkWatercolor
    • 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
    • chpphodb01.txt ejemplo con las 4 primeras obras artísticas que se incluyeron
  • web directorio destinado a las paginas web generadas automáticamente
    • common directorio de recursos comunes a todas las galerías
      • css directorio para ficheros de estilo
        • common.css fichero de estilo para las paginas Html del sitio web
      • seed trozos de código Html para construir templates
        • strseed.htm estructura básica de página Html de inkwatercolor.com
        • pi1lowseed.htm estructura para albergar información sobre una obra
        • pi4cntseed.htm estructura para albergar 4 pinturas en una página
      • src directorio para ficheros javascript
    • chppho directorio para la galería principal de Inkwatercolor
      • index.html ejemplo de página Html generada automáticamente
    • download directorio para material extra para descargas
      • chppho0129.jpg ejemplo de imagen de obra artística para descargar
      • chppho0143.jpg ejemplo de imagen de obra artística para descargar
    • sitemap.xml mapa del sitio web generado en Xml de forma automática
  • history archivo de registro histórico del programa Ink.Watercolor
  • ink_watercolor.pdf documento resumen de funciones del programa de generación Html

Declaraciones

Inclusiones

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

Constantes

  • TimeSet TmsMth
    Conjunto temporal de los meses, llamado mensual.
  • TimeSet TmsWee
    Conjunto temporal de las semanas, llamado semanal.
  • TimeSet TmsDay
    Conjunto temporal de los meses, llamado mensual.

Proceso

  • Text ctrExe
    Funcion que hay que realizarn en el make.
  • Text PagGal
    Galeria para la que se ha de realizar la funcion.
  • Real makHlp
    Es cierto si se ha visualizado la ayuda.
  • Real makSed
    Build seeds files.
  • Real makJpg
    Build jpgs files.
  • Real makSt_
    Build statistics and control information.
  • Real makWeb
    Build web pages.
  • Real makUpd
    Pages with last updates.
  • Real makXsm
    Build XML sitemap.
  • Real makFtp
    Build FTP command files.
  • Real makJbd
    Building javascript picture database.

Inclusiones

Set allInc

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

Estructuras de datos

Struct PdbSt
{
  Text picCla,
  Text picSer,
  Real picWid,
  Real picHei,
  Date endDte,
  Date updDte,
  Real picNum,
  Text picTit,
  Real wrkTim,
  Real wrkQly,
  Set  papTec,
  Set  papCol,
  Set  bckTec,
  Set  bckCol,
  Set  forTec,
  Set  forCol,
  Text picAut,
  Text picOwn,
  Text jpgFil,
  Real picPrn,
  Text picRem
};


Struct CtrSt
{
  Text picNum,
  Real picPrn
};

Constantes

TimeSet TmsMth

//////////////////////////////////////////////////////////////////////////////
TimeSet TmsMth = D(1);
//////////////////////////////////////////////////////////////////////////////
PutDescription("Conjunto temporal de los meses, llamado mensual.", TmsMth);
//////////////////////////////////////////////////////////////////////////////

TimeSet TmsWee

//////////////////////////////////////////////////////////////////////////////
TimeSet TmsWee = WD(1);
//////////////////////////////////////////////////////////////////////////////
PutDescription("Conjunto temporal de las semanas, llamado semanal.", TmsWee);
//////////////////////////////////////////////////////////////////////////////

TimeSet TmsDay

//////////////////////////////////////////////////////////////////////////////
TimeSet TmsDay = C;
//////////////////////////////////////////////////////////////////////////////
PutDescription("Conjunto temporal de los meses, llamado mensual.", TmsDay);
//////////////////////////////////////////////////////////////////////////////

Proceso

Text ctrExe

//////////////////////////////////////////////////////////////////////////////
Text ctrExe = If(Not(ObjectExist("Text","ctrBat")),  "web",
              If(ctrBat=="",                         "hlp",
                                                     ToLower(ctrBat)));
//////////////////////////////////////////////////////////////////////////////
PutDescription("Funcion que hay que realizarn en el make.", ctrExe);
//////////////////////////////////////////////////////////////////////////////

Text PagGal

//////////////////////////////////////////////////////////////////////////////
Text PagGal = If(Not(ObjectExist("Text","ctrGal")),  "chppho",
              If(ctrGal=="",                         "chppho",
              If(!(ToLower(ctrGal) <: [["chppho";
                                        "fleurs";
                                        "inarmy"]]), "chppho",
                                                     ToLower(ctrGal))));
//////////////////////////////////////////////////////////////////////////////
PutDescription("Galeria para la que se ha de realizar la funcion.", PagGal);
//////////////////////////////////////////////////////////////////////////////

Real makHlp

//////////////////////////////////////////////////////////////////////////////
Real makHlp = If(ctrExe!="hlp", FALSE,
{
  Text WriteLn(PdbSep+"\nhelp:"+
    "\nUsage: make [OPTION] [GALLERY]"+
    "\nBuilds inkwatercolor.com site"+
    "\nOPTION"+
    "\n  sed: build seeds files"+
    "\n  jpg: build jpegs and zip files"+
    "\n  st0: build fast stats"+
    "\n  st1: build stat plus painting counts (slow)"+
    "\n  web: build html pages"+
    "\n  upd: build updated html pages"+
    "\n  xsm: build sitemap.xml"+
    "\n  ftp: build ftp files (go to ftp dir and run manually chppho.bat)"+
    "\n  jdb: build javascript pictures database for forms and budgets"+
    "\n  hlp: view this help"+
    "\n  all: do all usual works (sed+web+upd+xsm)"+
    "\nGALLERY"+
    "\n  chppho: ink & watercolor"+
    "\n  fleurs: flowers of evil"+
    "\n  inarmy: ink in the army");
  TRUE
});
//////////////////////////////////////////////////////////////////////////////
PutDescription("Es cierto si se ha visualizado la ayuda.", makHlp);
//////////////////////////////////////////////////////////////////////////////

Real makSed

//////////////////////////////////////////////////////////////////////////////
Real makSed = If(And(ctrExe!="all",ctrExe!="sed"), FALSE,
{
  SedMake(TRUE) +
  SedMake(FALSE)
});
//////////////////////////////////////////////////////////////////////////////
PutDescription("Build seeds files.", makSed);
//////////////////////////////////////////////////////////////////////////////

Real makJpg

//////////////////////////////////////////////////////////////////////////////
Real makJpg = If(ctrExe!="jpg", FALSE,
{
//Text extImg = If(PagGal=="chppho", "*.tif", "*.jpg"); Old
  Text extImg = "*.jpg";

  Text WriteLn(PdbSep+"\nbuilding jpgs...");
  Set  chpSet = DirFiles("web/"+PagGal+"/image/clean", extImg, TRUE, TRUE);

  Set  chpCic = EvalSet(chpSet, Real(Text clsTif)
  {
    Text WriteLn(clsTif+":");
    Text clsJpg = Replace(clsTif, ".tif",    ".jpg");
    Text tinJpg = Replace(clsJpg, "/clean/", "/tiny/");
    Text zooJpg = Replace(clsJpg, "/clean/", "/zoom/");
    Text da5Jpg = Replace(clsJpg, "/clean/", "/da5/");
    Text da4Jpg = Replace(clsJpg, "/clean/", "/da4/");
    Text da4Zip = Replace(da4Jpg, ".jpg",    ".zip");
    Text da3Jpg = Replace(clsJpg, "/clean/", "/da3/");
    Text da3Zip = Replace(da3Jpg, ".jpg",    ".zip");

    Real tinDon = FilMake(clsTif, tinJpg, Real(Text inp, Text out)
                          { AlcImg2JpgDpi(inp, out,  400,  600, 0) });

    Real zooDon = FilMake(clsTif, zooJpg, Real(Text inp, Text out)
                          { AlcImg2JpgDpi(inp, out,  800, 1200, 0) });

//  Real zipDon = FilMakeUpdate(da4Jpg, da4Zip, ZipAdd);

    Real da5Don = If(! DirExist("web/"+PagGal+"/image/da5"), FALSE,
                     FilMake(clsTif, da5Jpg, Real(Text inp, Text out)
                             { AlcImg2JpgDpi(inp, out,  519,  719,  72) }));
//                           { AlcImg2JpgDpi(inp, out, 1539, 2244, 300) }));

    Real da4Don = If(! DirExist("web/"+PagGal+"/image/da4"), FALSE,
                     FilMake(clsTif, da4Jpg, Real(Text inp, Text out)
                             { AlcImg2JpgDpi(inp, out, 2244, 3272, 300) }));

    Real da3Don = If(! DirExist("web/"+PagGal+"/image/da3"), FALSE,
                     FilMake(clsTif, da3Jpg, Real(Text inp, Text out)
                          { AlcImg2JpgDpi(inp, out, 3272, 4724, 300) }));

    tinDon+zooDon+da4Don+da3Don //+zipDon
  });
  SetSum(chpCic)
});
//////////////////////////////////////////////////////////////////////////////
PutDescription("Build jpgs files.", makJpg);
//////////////////////////////////////////////////////////////////////////////

Real makSt_

//////////////////////////////////////////////////////////////////////////////
Real makSt_ = If(Sub(ctrExe,1,2)!="st", FALSE,
{
  Text WriteLn(PdbSep+"\nOnly Apache logs statistics...");
  InkLogsStats(20)
});
//////////////////////////////////////////////////////////////////////////////
PutDescription("Build statistics and control information.", makSt_);
//////////////////////////////////////////////////////////////////////////////

Real makWeb

//////////////////////////////////////////////////////////////////////////////
Real makWeb = If(And(ctrExe!="all",ctrExe!="web"), FALSE,
{
  Real eng = TRUE;

  Text WriteLn(PdbSep+"\nbuilding web...");

// index.html

  Text WriteLn(PdbSep+"\nbuilding index.html from index.htm...");
  Text inxHtm = ReadFile(PagSee(eng)+"/index.htm");
  Text inxHt0 = Replace(inxHtm,"../../","");
  Text inxHt1 = Replace(inxHtm,"../../","../");
  Text inxHt2 = inxHtm;
  Text inxHt3 = Replace(inxHtm,"../../","../../../");


  Text d00 = "web";
  Text WriteFile(d00+"/index.html",inxHt0); // Nivel 0
  Set  dir001 = GetDir(d00)[2];
  Set  cic001 = EvalSet(dir001, Real(Text nam)
  {
    Text d01 = d00+"/"+nam;
    Text WriteFile(d01+"/index.html",inxHt1);

    Set  dir002 = GetDir(d01)[2];
    Set  cic002 = EvalSet(dir002, Real(Text nam)
    {
      Text d02 = d01+"/"+nam;
      Text WriteFile(d02+"/index.html",inxHt2);

      Set  dir003 = GetDir(d02)[2];
      Set  cic003 = EvalSet(dir003, Real(Text nam)
      {
        Text d03 = d02+"/"+nam;
        Text WriteFile(d03+"/index.html",inxHt3);
        TRUE
      });
      TRUE
    });
    TRUE
  });


// indice.html

  Text WriteLn(PdbSep+"\nbuilding indice.html from spanish index.htm...");
  Text indHtm = ReadFile(PagSee(!eng)+"/index.htm"); // !eng -> spanish
  Text indHt0 = Replace(indHtm,"../../","");

  Text WriteFile(d00+"/indice.html",indHt0); // Nivel 0


// inf*.htm

  Text WriteLn(PdbSep+"\nbuilding inf*.htm...");
  Set  ctrInc = Include("ctr/ctr.tol");

  Text inpFil = "agenda/"+PagGal+"db01.txt";
  Set  inpBst = IncludeBST("ctr/img."+PagGal+".bst");
  Set  inpPdb = PdbRead(inpFil, inpBst);


// Gallery

  Set  selSad =
  {
    Select(inpPdb, Real(Set picReg)
           { FileExist("web/"+PagGal+"/image/zoom/"+picReg->jpgFil) })
  };

  Text keySad = "sad"; // set all drawings
  Set  yeaEng = PagYearTab( eng, selSad, keySad);
  Set  yeaSpa = PagYearTab(!eng, selSad, keySad);

  Set  infEng = DirFiles("web/chppho/sede", "inf*", TRUE, TRUE);
  Set  cicEng = EvalSet(infEng, Real(Text infPth)
                        { InkPageInfo( eng, infPth, yeaEng) });

  Set  infSpa = DirFiles("web/chppho/seds", "inf*", TRUE, TRUE);
  Set  cicSpa = EvalSet(infSpa, Real(Text infPth)
                        { InkPageInfo(!eng, infPth, yeaSpa) });

  Text WriteLn(PdbSep+"\nabsolute pages...");
  Text thkFilEng = "web/chppho/page/inffeethk.htm";
  Text thkHtmEng = ReadFile(thkFilEng);
  Text WriteFile(thkFilEng, Replace(thkHtmEng, "../../",
                                    "http://www.inkwatercolor.com/"));
  Text thkFilSpa = "web/chppho/pags/inffeethk.htm";
  Text thkHtmSpa = ReadFile(thkFilSpa);
  Text WriteFile(thkFilSpa, Replace(thkHtmSpa, "../../",
                                    "http://www.inkwatercolor.com/"));


  Text WriteLn(PdbSep+"\nbuilding sad*.htm...");
  Real sadEng = PagSel( eng, selSad, keySad, yeaEng, PagSee( eng));
  Real sadSpa = PagSel(!eng, selSad, keySad, yeaSpa, PagSee(!eng));

  Real comXid = FilCopy("../common/dir.html", "web/comxidir.html", TRUE);

  sadEng+sadSpa+comXid
});
//////////////////////////////////////////////////////////////////////////////
PutDescription("Build web pages.", makWeb);
//////////////////////////////////////////////////////////////////////////////

Real makUpd

//////////////////////////////////////////////////////////////////////////////
Real makUpd = If(And(ctrExe!="all",ctrExe!="upd"), FALSE,
{
  Real eng = TRUE;

  Text WriteLn(PdbSep+"\nbuilding last updated...");

  Text inpFil = "agenda/"+PagGal+"db01.txt";
  Set  inpBst = IncludeBST("ctr/img."+PagGal+".bst");
  Set  inpPdb = PdbRead(inpFil, inpBst);
  Set  selUpd = PdbLastUpdates(inpPdb, 32);

  Text keyUpd = "upd"; // set last updates
  Set  yeaEng = PagYearTab( eng, selUpd, keyUpd);
  Set  yeaSpa = PagYearTab(!eng, selUpd, keyUpd);

  Real updEng = PagSel( eng, selUpd, keyUpd, yeaEng, PagSee( eng));
  Real updSpa = PagSel(!eng, selUpd, keyUpd, yeaSpa, PagSee(!eng));

  updEng+updSpa
});
//////////////////////////////////////////////////////////////////////////////
PutDescription("Pages with last updates.", makUpd);
//////////////////////////////////////////////////////////////////////////////

Real makXsm

//////////////////////////////////////////////////////////////////////////////
Real makXsm = If(And(ctrExe!="all",ctrExe!="xsm"), FALSE,
{
  Text WriteLn(PdbSep+"\nbuilding xml site map...");
  XsmDir("web/sitemap.xml","web")
});
//////////////////////////////////////////////////////////////////////////////
PutDescription("Build XML sitemap.", makXsm);
//////////////////////////////////////////////////////////////////////////////

Real makFtp

//////////////////////////////////////////////////////////////////////////////
Real makFtp = If(ctrExe!="ftp", FALSE,
{
  Text absPth = Replace(GetSourcePath(ctrExe),"/make.tol","");     // Absoluto
  Text locPth = absPth+"/web";                  // Ha de ser una ruta absoluta

  Text WriteLn(PdbSep+"\nbuilding "+locPth+" ftp...");

// Real FtpRecovery("ftp", "recover.log", "recover");

  FtpAll(locPth)
});
//////////////////////////////////////////////////////////////////////////////
PutDescription("Build FTP command files.", makFtp);
//////////////////////////////////////////////////////////////////////////////

Real makJbd

//////////////////////////////////////////////////////////////////////////////
Real makJbd = If(ctrExe!="jdb", FALSE,
{
  Real eng = TRUE;

  Text WriteLn(PdbSep+"\nbuilding javascript picture database...");

  Text inpFil = "agenda/"+PagGal+"db01.txt";
  Set  inpBst = IncludeBST("ctr/img."+PagGal+".bst");
  Set  inpPdb = PdbRead(inpFil, inpBst);
  Text outDir = "web/common/src"; // Output directory
  Text pthSee = "web/common/seed/jdbitem.js"; // Seed file

  Real jdbEng = PagJavascriptDB( eng, inpPdb, outDir, pthSee);
  Real jdbSpa = PagJavascriptDB(!eng, inpPdb, outDir, pthSee);

  jdbEng+jdbSpa
});
//////////////////////////////////////////////////////////////////////////////
PutDescription("Building javascript picture database.", makJbd);
//////////////////////////////////////////////////////////////////////////////

Finalización

Text WriteLn("\nInkWatercolor.com make: end");

Time oriented language

//////////////////////////////////////////////////////////////////////////////
// FILE    : make.tol
// AUTHOR  : http://www.asolver.com
// CLASS   : Metaprogramación; Hipertexto; Arte
// VERSION : Tol 1.1.5; Tol 1.1.6; Tol 2.0.1
// PURPOSE : Programa constructor del sitio web del dominio inkwatercolor.com
// dedicado a contenidos de arte creados con tintas y acuarelas y con otras
// diferentes técnicas.
// 
// Los contenidos que emplea para crearlo son:
// a) registros de obras de arte, en 2 idiomas, castellano e inglés,
//    que se organizan en en un directorio, que se denomina agenda y
// b) ficheros en formato JPG con imágenes de las obras de arte en
//    diversos tanaños (pequeños, más grandes, DIN A4 y DIN A3).
//
// El directorio de agenda puede contener varios ficheros, en especial,
// contiene un fichero por cada galería de arte,
// de esta forma, hay un fichero para:
// a) la galería llamada chppho, que es la principal, y que está dedicada a
//    obras de pintura automática realizadas en tintas y acuarelas,
// b) la galería llamada fleurs, que está dedicada a las Flores del Mal de
//    Charles Baudelaire, hay una pintura para cada uno de sus poemas y
// c) la galería llamada inarmy, que está dedicada a esquemas y apuntes
//    rápidos de la vida castrense.
// _
// Este programa para Ink Watercolor:
// a) Se clasifica de metaprogramación porque
//    se ha escrito código en lenguaje de programación TOL que escribe,
//    a su vez,
//    código en lenguaje de Html para las páginas del sitio web,
//    código TOL que representa los resultados de los análisis estadísticos y
//    código en lenguaje Javascript para la gestión de contenidos artísticos.
// b) Se clasifica de Hipertexto porque el resultado final más importante es
//    la generación de más de un millar de páginas de hipertexto.
// c) Se clasifica de arte porque el objetivo es la difusión de contenidos
//    artísticos por internet.
// _
// La información sobre las 3 galerías de arte de este sitio web
// inkwatercolor.com se organiza en un fichero para cada galería,
// cada fichero contiene de decenas a centenas de registros,
// tantos registros como obras de arte tiene la galería.
//
// Cada registro de estos ficheros tiene atributos para describir el título,
// el autor, las técnicas, materiales empleados, los colores, la fecha de
// realización, la calidad de la obra, etc.
//
// Ha de notarse que este esquema de agenda es el precursos de las estructuras
// de agendas de posts que se emplean que otros sitios web generados con TOL.
// _
// Este programa para la creación del sitio web inkwatercolor.com es de los
// primeros desarrollados en TOL para la creación de páginas web y
// conserva mucha de su programación original que tiene las caracteríscas
// siguientes:
// a) La creación de las páginas Html se realiza en fases,
//    primero construyendo semillas de páginas web (templeates) a partir de
//    semillas de trozos comunes de páginas web.
//    Por ejemplo, con semillas de títulos, de menús, de estructuras para
//    cuadros, etc. se crean semillas (templates) para páginas que han de
//    albergar cuadros, unas para inglés otras para castellano,
//    unas para 1 cuadro, para 4 cuadros, para listados de cuadros, etc.
// b) Tiene funcionalidad para crea de forma automática:
//    índices, como listados de enlaces, de ilustraciones,
//    pero los índices principales del sitio web se tienen que crear de
//    forma manual.
// c) Tiene funcionalidad para rellenar automáticamente la descripción y
//    la lista de palabras clave de cada página web y las crea de una forma
//    personalizada para cada página dependiendo del cuadro o de los cuadros
//    que alberga (campos meta), de forma que la descripción de una página
//    es un resumen da la descripción de sus cuadros,
//    pero las descripciones y las listas de palabras clave que genera
//    no son especialmente largas.
// d) Delega en Javascript todas aquellas funcionalidades para las que,
//    en el momento de su desarrollo, Javascript parecía más adecuado.
// _
// Las funciones principales de este programa para la creación de
// inkwatercolor.com y que son accesibles a través de sus diferentes opciones,
// son:
// a) Crear las páginas de las obras de arte de todas las galerías,
//    el contenido fundamental de estas páginas es un cuadro y su descripción,
//    utiliza unas imágenes que se llaman zoom.
// b) Crear páginas con las obras de arte de cada galería agrupadas de 4 en 4,
//    estas páginas contienen unas imágenes menores que se llaman tiny,
//    obsérvese que este uso de imágenes de menor tamaño era frecuente
//    cuando el ancho de banda disponible en internet era mucho más limitado.
// c) Crear listados de índice a obras agrupados de 16 en 16 con enlace a
//    cada una de las obras.
// d) Secuenciar los enlaces entre todas las obras, por ejemplo,
//    entre las páginas en inglés y castellano de una misma obra,
//    entre cada obra y algunas de las que le siguen o le anteceden, etc.
//    Para la creación de estos enlaces se emplean los números únicos que
//    identifica a haca cuadro en cada garería.
// e) Crear la homepage del sitio web inkwatercolor.com.
// f) Crear las páginas por defecto (los index.html) para cada uno de sus
//    directorios y subdirectorios y ha de tenerse en cuenta que en el 
//    contenido de estos index.html se da prioridad a la última galería
//    que se haya ejecutado.
// g) Crear una estructura de pinturas e información sobre ella para ser 
//    utilizadas desde Javascript.
// h) Crear el mapa del sitio web sitemap.xml y
//    ficheros de mandatos para la transmision por FTP,
//    la programación de estas 2 funcionalidades es, en este caso,
//    dependiente de este sitio web y es por lo que sus ficheros TOL están
//    en el directorio de funciones de aplicación (app) y
//    no en el directorio de funciones comunes (cmm).
// _
// El sitio web inkwatercolor.com se organiza en una estructura de directorios
// algo más compleja que otros sitios web desarrollados con TOL.
//
// Este sitio web tiene un directorio para cada una de sus galerías de arte,
// que a su vez tiene subdirectorios para:
// a) sus páginas en inglés (page),
// b) sus páginas en castellano (pags),
// c) las semillas de páginas, templates, en inglés (sede),
// d) las semillas de páginas castellano (seds),
// e) un subdirectorio para imágenes (image) que, a su vez,
//    tiene subdirectorios, por ejemplo, para
//    imágenes pequeñas (tiny),
//    imágenes más grandes (zoom),
//    imágenes limpias y procesadas (clean),
//    escaneados originales de las obras (scan)
//    imágenes den formatos DIN A3 y DIN A4 (da3 y da4).
//
// Además de un directorio para contenidos comunes a todas las galerías con
// subdirectorios para:
// a) estilo de páginas web (css),
// b) imágenes comunes en formato GIF (gif),
// c) partes de templates para componer semillas para páginas webs (seed) y
// d) código en lenguaje Javascript (src).
// _
// Los comentarios del código de este programa están realizados utilizando
// unas veces el español no acentuado dentro del código y otras veces el
// inglés.
// 
// Se ha comprobado el funcionamiento de este programa para las versiones de
// Tol 1.1.5, 1.1.6 y 2.0.1. 
// Con la version 1.1.1 da problemas, por ejemplo,
// por el uso que se hace del tercer parámetro de la función de texto
// TextReplace(texto, tabla, numero de ciclos),
// ya que la versión de Tol 1.1.1 no se contemplaba el número de ciclos.
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
// INCLUDE
//////////////////////////////////////////////////////////////////////////////
Text WriteLn("\nInkWatercolo.com make: begin");

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


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

Struct PdbSt
{
  Text picCla,
  Text picSer,
  Real picWid,
  Real picHei,
  Date endDte,
  Date updDte,
  Real picNum,
  Text picTit,
  Real wrkTim,
  Real wrkQly,
  Set  papTec,
  Set  papCol,
  Set  bckTec,
  Set  bckCol,
  Set  forTec,
  Set  forCol,
  Text picAut,
  Text picOwn,
  Text jpgFil,
  Real picPrn,
  Text picRem
};


Struct CtrSt
{
  Text picNum,
  Real picPrn
};


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

//////////////////////////////////////////////////////////////////////////////
TimeSet TmsMth = D(1);
//////////////////////////////////////////////////////////////////////////////
PutDescription("Conjunto temporal de los meses, llamado mensual.", TmsMth);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
TimeSet TmsWee = WD(1);
//////////////////////////////////////////////////////////////////////////////
PutDescription("Conjunto temporal de las semanas, llamado semanal.", TmsWee);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
TimeSet TmsDay = C;
//////////////////////////////////////////////////////////////////////////////
PutDescription("Conjunto temporal de los meses, llamado mensual.", TmsDay);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
// MAKE
//////////////////////////////////////////////////////////////////////////////
Text WriteLn("\nInkWatercolor.com: process");


//////////////////////////////////////////////////////////////////////////////
Text ctrExe = If(Not(ObjectExist("Text","ctrBat")),  "web",
              If(ctrBat=="",                         "hlp",
                                                     ToLower(ctrBat)));
//////////////////////////////////////////////////////////////////////////////
PutDescription("Funcion que hay que realizarn en el make.", ctrExe);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Text PagGal = If(Not(ObjectExist("Text","ctrGal")),  "chppho",
              If(ctrGal=="",                         "chppho",
              If(!(ToLower(ctrGal) <: [["chppho";
                                        "fleurs";
                                        "inarmy"]]), "chppho",
                                                     ToLower(ctrGal))));
//////////////////////////////////////////////////////////////////////////////
PutDescription("Galeria para la que se ha de realizar la funcion.", PagGal);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real makHlp = If(ctrExe!="hlp", FALSE,
{
  Text WriteLn(PdbSep+"\nhelp:"+
    "\nUsage: make [OPTION] [GALLERY]"+
    "\nBuilds inkwatercolor.com site"+
    "\nOPTION"+
    "\n  sed: build seeds files"+
    "\n  jpg: build jpegs and zip files"+
    "\n  st0: build fast stats"+
    "\n  st1: build stat plus painting counts (slow)"+
    "\n  web: build html pages"+
    "\n  upd: build updated html pages"+
    "\n  xsm: build sitemap.xml"+
    "\n  ftp: build ftp files (go to ftp dir and run manually chppho.bat)"+
    "\n  jdb: build javascript pictures database for forms and budgets"+
    "\n  hlp: view this help"+
    "\n  all: do all usual works (sed+web+upd+xsm)"+
    "\nGALLERY"+
    "\n  chppho: ink & watercolor"+
    "\n  fleurs: flowers of evil"+
    "\n  inarmy: ink in the army");
  TRUE
});
//////////////////////////////////////////////////////////////////////////////
PutDescription("Es cierto si se ha visualizado la ayuda.", makHlp);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real makSed = If(And(ctrExe!="all",ctrExe!="sed"), FALSE,
{
  SedMake(TRUE) +
  SedMake(FALSE)
});
//////////////////////////////////////////////////////////////////////////////
PutDescription("Build seeds files.", makSed);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real makJpg = If(ctrExe!="jpg", FALSE,
{
//Text extImg = If(PagGal=="chppho", "*.tif", "*.jpg"); Old
  Text extImg = "*.jpg";

  Text WriteLn(PdbSep+"\nbuilding jpgs...");
  Set  chpSet = DirFiles("web/"+PagGal+"/image/clean", extImg, TRUE, TRUE);

  Set  chpCic = EvalSet(chpSet, Real(Text clsTif)
  {
    Text WriteLn(clsTif+":");
    Text clsJpg = Replace(clsTif, ".tif",    ".jpg");
    Text tinJpg = Replace(clsJpg, "/clean/", "/tiny/");
    Text zooJpg = Replace(clsJpg, "/clean/", "/zoom/");
    Text da5Jpg = Replace(clsJpg, "/clean/", "/da5/");
    Text da4Jpg = Replace(clsJpg, "/clean/", "/da4/");
    Text da4Zip = Replace(da4Jpg, ".jpg",    ".zip");
    Text da3Jpg = Replace(clsJpg, "/clean/", "/da3/");
    Text da3Zip = Replace(da3Jpg, ".jpg",    ".zip");

    Real tinDon = FilMake(clsTif, tinJpg, Real(Text inp, Text out)
                          { AlcImg2JpgDpi(inp, out,  400,  600, 0) });

    Real zooDon = FilMake(clsTif, zooJpg, Real(Text inp, Text out)
                          { AlcImg2JpgDpi(inp, out,  800, 1200, 0) });

//  Real zipDon = FilMakeUpdate(da4Jpg, da4Zip, ZipAdd);

    Real da5Don = If(! DirExist("web/"+PagGal+"/image/da5"), FALSE,
                     FilMake(clsTif, da5Jpg, Real(Text inp, Text out)
                             { AlcImg2JpgDpi(inp, out,  519,  719,  72) }));
//                           { AlcImg2JpgDpi(inp, out, 1539, 2244, 300) }));

    Real da4Don = If(! DirExist("web/"+PagGal+"/image/da4"), FALSE,
                     FilMake(clsTif, da4Jpg, Real(Text inp, Text out)
                             { AlcImg2JpgDpi(inp, out, 2244, 3272, 300) }));

    Real da3Don = If(! DirExist("web/"+PagGal+"/image/da3"), FALSE,
                     FilMake(clsTif, da3Jpg, Real(Text inp, Text out)
                          { AlcImg2JpgDpi(inp, out, 3272, 4724, 300) }));

    tinDon+zooDon+da4Don+da3Don //+zipDon
  });
  SetSum(chpCic)
});
//////////////////////////////////////////////////////////////////////////////
PutDescription("Build jpgs files.", makJpg);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real makSt_ = If(Sub(ctrExe,1,2)!="st", FALSE,
{
  Text WriteLn(PdbSep+"\nOnly Apache logs statistics...");
  InkLogsStats(20)
});
//////////////////////////////////////////////////////////////////////////////
PutDescription("Build statistics and control information.", makSt_);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real makWeb = If(And(ctrExe!="all",ctrExe!="web"), FALSE,
{
  Real eng = TRUE;

  Text WriteLn(PdbSep+"\nbuilding web...");

// index.html

  Text WriteLn(PdbSep+"\nbuilding index.html from index.htm...");
  Text inxHtm = ReadFile(PagSee(eng)+"/index.htm");
  Text inxHt0 = Replace(inxHtm,"../../","");
  Text inxHt1 = Replace(inxHtm,"../../","../");
  Text inxHt2 = inxHtm;
  Text inxHt3 = Replace(inxHtm,"../../","../../../");


  Text d00 = "web";
  Text WriteFile(d00+"/index.html",inxHt0); // Nivel 0
  Set  dir001 = GetDir(d00)[2];
  Set  cic001 = EvalSet(dir001, Real(Text nam)
  {
    Text d01 = d00+"/"+nam;
    Text WriteFile(d01+"/index.html",inxHt1);

    Set  dir002 = GetDir(d01)[2];
    Set  cic002 = EvalSet(dir002, Real(Text nam)
    {
      Text d02 = d01+"/"+nam;
      Text WriteFile(d02+"/index.html",inxHt2);

      Set  dir003 = GetDir(d02)[2];
      Set  cic003 = EvalSet(dir003, Real(Text nam)
      {
        Text d03 = d02+"/"+nam;
        Text WriteFile(d03+"/index.html",inxHt3);
        TRUE
      });
      TRUE
    });
    TRUE
  });


// indice.html

  Text WriteLn(PdbSep+"\nbuilding indice.html from spanish index.htm...");
  Text indHtm = ReadFile(PagSee(!eng)+"/index.htm"); // !eng -> spanish
  Text indHt0 = Replace(indHtm,"../../","");

  Text WriteFile(d00+"/indice.html",indHt0); // Nivel 0


// inf*.htm

  Text WriteLn(PdbSep+"\nbuilding inf*.htm...");
  Set  ctrInc = Include("ctr/ctr.tol");

  Text inpFil = "agenda/"+PagGal+"db01.txt";
  Set  inpBst = IncludeBST("ctr/img."+PagGal+".bst");
  Set  inpPdb = PdbRead(inpFil, inpBst);


// Gallery

  Set  selSad =
  {
    Select(inpPdb, Real(Set picReg)
           { FileExist("web/"+PagGal+"/image/zoom/"+picReg->jpgFil) })
  };

  Text keySad = "sad"; // set all drawings
  Set  yeaEng = PagYearTab( eng, selSad, keySad);
  Set  yeaSpa = PagYearTab(!eng, selSad, keySad);

  Set  infEng = DirFiles("web/chppho/sede", "inf*", TRUE, TRUE);
  Set  cicEng = EvalSet(infEng, Real(Text infPth)
                        { InkPageInfo( eng, infPth, yeaEng) });

  Set  infSpa = DirFiles("web/chppho/seds", "inf*", TRUE, TRUE);
  Set  cicSpa = EvalSet(infSpa, Real(Text infPth)
                        { InkPageInfo(!eng, infPth, yeaSpa) });

  Text WriteLn(PdbSep+"\nabsolute pages...");
  Text thkFilEng = "web/chppho/page/inffeethk.htm";
  Text thkHtmEng = ReadFile(thkFilEng);
  Text WriteFile(thkFilEng, Replace(thkHtmEng, "../../",
                                    "http://www.inkwatercolor.com/"));
  Text thkFilSpa = "web/chppho/pags/inffeethk.htm";
  Text thkHtmSpa = ReadFile(thkFilSpa);
  Text WriteFile(thkFilSpa, Replace(thkHtmSpa, "../../",
                                    "http://www.inkwatercolor.com/"));


  Text WriteLn(PdbSep+"\nbuilding sad*.htm...");
  Real sadEng = PagSel( eng, selSad, keySad, yeaEng, PagSee( eng));
  Real sadSpa = PagSel(!eng, selSad, keySad, yeaSpa, PagSee(!eng));

  Real comXid = FilCopy("../common/dir.html", "web/comxidir.html", TRUE);

  sadEng+sadSpa+comXid
});
//////////////////////////////////////////////////////////////////////////////
PutDescription("Build web pages.", makWeb);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real makUpd = If(And(ctrExe!="all",ctrExe!="upd"), FALSE,
{
  Real eng = TRUE;

  Text WriteLn(PdbSep+"\nbuilding last updated...");

  Text inpFil = "agenda/"+PagGal+"db01.txt";
  Set  inpBst = IncludeBST("ctr/img."+PagGal+".bst");
  Set  inpPdb = PdbRead(inpFil, inpBst);
  Set  selUpd = PdbLastUpdates(inpPdb, 32);

  Text keyUpd = "upd"; // set last updates
  Set  yeaEng = PagYearTab( eng, selUpd, keyUpd);
  Set  yeaSpa = PagYearTab(!eng, selUpd, keyUpd);

  Real updEng = PagSel( eng, selUpd, keyUpd, yeaEng, PagSee( eng));
  Real updSpa = PagSel(!eng, selUpd, keyUpd, yeaSpa, PagSee(!eng));

  updEng+updSpa
});
//////////////////////////////////////////////////////////////////////////////
PutDescription("Pages with last updates.", makUpd);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real makXsm = If(And(ctrExe!="all",ctrExe!="xsm"), FALSE,
{
  Text WriteLn(PdbSep+"\nbuilding xml site map...");
  XsmDir("web/sitemap.xml","web")
});
//////////////////////////////////////////////////////////////////////////////
PutDescription("Build XML sitemap.", makXsm);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real makFtp = If(ctrExe!="ftp", FALSE,
{
  Text absPth = Replace(GetSourcePath(ctrExe),"/make.tol","");     // Absoluto
  Text locPth = absPth+"/web";                  // Ha de ser una ruta absoluta

  Text WriteLn(PdbSep+"\nbuilding "+locPth+" ftp...");

// Real FtpRecovery("ftp", "recover.log", "recover");

  FtpAll(locPth)
});
//////////////////////////////////////////////////////////////////////////////
PutDescription("Build FTP command files.", makFtp);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
Real makJbd = If(ctrExe!="jdb", FALSE,
{
  Real eng = TRUE;

  Text WriteLn(PdbSep+"\nbuilding javascript picture database...");

  Text inpFil = "agenda/"+PagGal+"db01.txt";
  Set  inpBst = IncludeBST("ctr/img."+PagGal+".bst");
  Set  inpPdb = PdbRead(inpFil, inpBst);
  Text outDir = "web/common/src"; // Output directory
  Text pthSee = "web/common/seed/jdbitem.js"; // Seed file

  Real jdbEng = PagJavascriptDB( eng, inpPdb, outDir, pthSee);
  Real jdbSpa = PagJavascriptDB(!eng, inpPdb, outDir, pthSee);

  jdbEng+jdbSpa
});
//////////////////////////////////////////////////////////////////////////////
PutDescription("Building javascript picture database.", makJbd);
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
// END
//////////////////////////////////////////////////////////////////////////////
Text WriteLn("\nInkWatercolor.com make: end");

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

Tol