Para generar las páginas que va a usar Antora como fuente, el script simplemente va a :
new XmlParser().parseText(new InputStreamReader(url.toURL().openStream(), 'UTF-8').text).ListaEESSPrecio
-
recorrer cada estación, extraer la información de interés de cada una e ir añadiendolas a un "mapa de mapas" por
provincia, municipios y localidades de tal forma que al terminar tenemos en memoria todas las estaciones agrupadas
[ Albacete : [Abengibre: [ [ Estacion1:[ precio95:1.23, precio98:1.33] ] ] ] ]
nav = new File('docs/modules/ROOT/nav.adoc')
nav.text = ""
map.each{ kvp ->
provincia = kvp.value
nav << "* xref:${kvp.key}.adoc[$provincia.name]\n"
provincia.municipios.each{ kvm ->
municipio = kvm.value
nav << "** xref:${kvp.key}.adoc#${municipio.name.toLowerCase().replaceAll(' ','_')}[$municipio.name]\n"
}
}
- NOTE
-
Añadir líneas a un fichero de texto en groovy es tan fácil como file << "una cadena"
Básicamente indicamos que tendremos un fichero por cada provincia (01.adoc, 02.adoc, …) y que dentro de él tendremos
secciones con el nombre de cada municipio. Para facilitar la navegación usaremos el nombre del municipio en minúsculas
y cambiaremos los espacios en blanco por guiones bajos
Lo que nos genera un fichero parecido a:
nav.adoc
* xref:02.adoc[ALBACETE]
** xref:02.adoc#abengibre[Abengibre]
** xref:02.adoc#albacete[Albacete]
...
** xref:50.adoc#villarroya_de_la_sierra[Villarroya de la Sierra]
** xref:50.adoc#zaragoza[Zaragoza]
** xref:50.adoc#zuera[Zuera]
map.each{ kvp ->
provincia = kvp.value
file = new File("docs/modules/ROOT/pages/${kvp.key}.adoc") (1)
file.parentFile.mkdirs()
file.text ="= $provincia.name\n:tabs:\n\n" (2)
...
}
1 |
Creamos un fichero por provincia |
2 |
Lo inicializamos con una cabecera asciidoctor con su titulo y el atributo :tabs: |
Para cada provincia recorremos sus municipios y localidades
map.each{ kvp ->
...
provincia.municipios.each{ kvm ->
municipio = kvm.value
file << "[#${municipio.name.toLowerCase().replaceAll(' ','_')}]\n"
file << "== $municipio.name \n\n"
municipio.localidades.each{ kvl ->
kvl.value.sort{it.direccion}.each{ estacion ->
file << "=== $estacion.direccion \n\n"
file << "*$estacion.rotulo* $estacion.horario \n\n"
file << "https://www.openstreetmap.org/?mlat=$estacion.latitud&mlon=$estacion.longitud#map=17/$estacion.latitud/$estacion.longitud[Ver en mapa,window=_blank]\n\n"
file << "[TIP]\n====\n"
estacion.precios.findAll{ it.value }.each{
file << "* _${it.key}_ a *${it.value}* €\n"
}
file << "====\n\n"
}
}
}
...
}
Como se puede adivinar, simplemente vamos concatenando al fichero de la provincia texto en formato asciidoc hasta
que llegamos a una estación donde volcamos sus datos.
Para cada provincia se genera un fichero similar a:
= ARABA/ÁLAVA
:tabs:
[#alegría-dulantzi]
== Alegría-Dulantzi
=== CALLE GASTEIZBIDEA 59
*ES DULANTZI REPSOL* L-D: 07:00-22:00
https://www.openstreetmap.org/?mlat=42.842917&mlon=-2.519194#map=17/42.842917/-2.519194[Ver en mapa,window=_blank]
[TIP]
====
* _95 E5_ a *1.239* €
* _Gasoleo A_ a *1.139* €
====
(más estaciones)
- WARNING
-
El script actual genera algo más de código por cada provincia como una serie de tabs con las estaciones
más baratas al inicio del fichero. En este post no voy a explicarlo pero si te interesa es muy fácil de seguir.
Para generar las páginas simplemente ejecuto:
- NOTE
-
Este script será ejecutado por el pipeline de Gitlab por lo que al final no necesitarías ni tener Groovy instalado
en tu local, aunque sería bueno tenerlo para probarlo primero antes de pasar a publicarlo.