Compare commits

..

No commits in common. "main" and "bar_cristobal_anuncio" have entirely different histories.

509 changed files with 1740 additions and 430863 deletions

View File

@ -10,10 +10,7 @@ module.exports = {
sourceType: 'module',
project: 'tsconfig.json'
},
parser: '@typescript-eslint/parser',
plugins: ['@typescript-eslint'],
extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'],
root: true,
plugins: [ ],
rules: {
indent: ['error', 4, { SwitchCase: 1 }],
},

3
.gitmodules vendored
View File

@ -1,3 +0,0 @@
[submodule "conversejs"]
path = conversejs
url = https://github.com/conversejs/converse.js/

View File

@ -17,7 +17,6 @@ my $build = Module::Build->new(
'DBD::Pg' => 0,
'DateTime::Format::ISO8601.pm' => 0,
'DateTime::Format::Mail.pm' => 0,
'DateTime::Format::Pg' => 0,
'SVG' => 0,
'XML::Twig' => 0,
'JSON' => 0,
@ -26,7 +25,6 @@ my $build = Module::Build->new(
'Moo::Role' => 0,
'Module::Pluggable' => 0,
'List::AllUtils' => 0,
'Lingua::Stem::Snowball' => 0,
},
);
$build->create_build_script;

View File

@ -5,8 +5,6 @@
"database": "example"
},
"base_url": "https://burguillos.info",
"search_backend": "http://localhost:3303",
"search_index": "burguillos_info",
"geoip_database": "/usr/share/GeoLite2-City_20230804/GeoLite2-City.mmdb",
"onion_base_url": "http://example.onion";
"listen": "https:localhost:3555"

View File

@ -1,38 +0,0 @@
<category>
<title>Donde hacer deporte en Burguillos.</title>
<description>
<h2>Actividades deportivas disponibles en Burguillos.</h2>
<p>Aquí puedes encontrar información acerca de las actividades deportivas disponibles en Burguillos, ejercitate para tener un cuerpo y mente más sanos.</p>
<p>¿Conoces alguna actividad deportiva que debiera estar aquí? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a> y haznoslo saber.</p>
</description>
<parent>comercios</parent>
<priority>0</priority>
<menu_text>Deporte</menu_text>
<slug>actividades-deportivas</slug>
<attributes>
<attribute>
<title>Danza en Burguillos.</title>
<identifier>danza</identifier>
<priority>1</priority>
<menu_text>Donde bailar en Burguillos.</menu_text>
<description>
<p>Baila, salta, ejercitaté.</p>
<p>Deslumbra en las redes sociales y los eventos con tus habilidades de danza.</p>
<p>¿A que esperas para echarte un baile?</p>
</description>
</attribute>
<attribute>
<title>Artes marciales en Burguillos.</title>
<identifier>artes-marciales</identifier>
<priority>1</priority>
<menu_text>Donde prácticar artes marciales en Burguillos.</menu_text>
<description>
<p>Práctica artes marciales en Burguillos.</p>
<p>Las artes marciales son un deporte con muchos beneficios, aumenta la flexibilidad, el equilibrio, la disciplina y además son un pasatiempo genial para dedicar tus tardes.</p>
<p>Unete a alguna y aprende una habilidad única.</p>
</description>
</attribute>
</attributes>
</category>

View File

@ -1,13 +0,0 @@
<category>
<title>Tiendas de alimentación en Burguillos</title>
<img src="/img/alimentacion.webp"/>
<description>
<p>Este es un listado de las tiendas de alimentación en Burguillos con la información relevante para disfrutar de tu estancia en Burguillos.</p>
<p>¿Quieres que tu comercio aparezca aquí? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a></p>
</description>
<parent>comercios</parent>
<priority>0</priority>
<menu_text>Tiendas de alimentación</menu_text>
<slug>tiendas-alimentacion</slug>
</category>

View File

@ -1,17 +0,0 @@
<category>
<title>Productos artesanales en Burguillos.</title>
<description>
<p>Descubre la mejor artesanía de Burguillos.</p>
<p>Compra artesanos productos locales de Burguillos.</p>
<p>¿Quieres que tu comercio aparezca aquí? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a></p>
</description>
<parent>comercios</parent>
<priority>0</priority>
<menu_text>Artesanía</menu_text>
<slug>artesania</slug>
<img src="/img/artesania.webp" bottom-preview="630"/>
<attributes>
</attributes>
</category>

View File

@ -1,9 +1,8 @@
<category>
<title>Autobuses.</title>
<title>Horarios de Autobuses.</title>
<description>
<p>Aquí puedes encontrar toda la información sobre los autobuses de Burguillos.</p>
<p>Aquí puedes encontrar toda la información sobre los horarios de autobuses de Burguillos.</p>
</description>
<img src="/img/autobus.webp" bottom-preview="500"/>
<priority>1</priority>
<menu_text>Autobuses</menu_text>
<slug>autobuses</slug>

View File

@ -1,15 +0,0 @@
<category>
<title>Lugares donde celebrar ocasiones.</title>
<description>
<p>Ya sean bodas, bautizos, cumpleaños, fiestas infantiles o comuniones, encuentra en Burguillos el lugar perfecto para recordar para siempre con cariño los momentos especiales de la vida.</p>
<p>¿Quieres que tu comercio aparezca aquí? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a></p>
</description>
<parent>comercios</parent>
<priority>0</priority>
<menu_text>Celebraciones</menu_text>
<slug>celebraciones</slug>
<img src="/img/celebraciones.webp"/>
<attributes>
</attributes>
</category>

View File

@ -1,12 +1,10 @@
<category>
<title>Comercios de Burguillos.</title>
<description>
<p>Aquí puedes encontrar información acerca de los comercios de Burguillos.</p>
<p>¿Quieres que tu comercio aparezca aquí? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a></p>
</description>
<priority>2</priority>
<img src="/img/comercio.webp" bottom-preview="600"/>
<menu_text>Comercios</menu_text>
<slug>comercios</slug>
<random>true</random>
<title>Comercios de Burguillos.</title>
<description>
<p>Aquí puedes encontrar información acerca de los comercios de Burguillos.</p>
<p>¿Quieres que tu comercio aparezca aquí? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a></p>
</description>
<priority>2</priority>
<menu_text>Comercios</menu_text>
<slug>comercios</slug>
</category>

View File

@ -1,14 +0,0 @@
<category>
<title>Dentistas en Burguillos.</title>
<description>
<p>Te traemos una lista de dentistas en Burguillos para que puedas cuidar de la salud y estética de tu boca con los mejores profesionales.</p>
<p>¿Quieres que tu comercio aparezca aquí? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a></p>
<p><a rel="noreferrer nofollow" href="https://www.freepik.es/vector-gratis/mujer-dentista-examinando-dientes-paciente-sobre-fondo-blanco_24553482.htm">Imagen de preview cortesía de Brgfx</a>.</p>
</description>
<priority>2</priority>
<img src="/img/dentista.webp" bottom-preview="530"/>
<menu_text>Dentistas</menu_text>
<slug>dentistas</slug>
<parent>comercios</parent>
</category>

View File

@ -1,23 +1,21 @@
<category>
<title>Donde comer en Burguillos. - Cartas y Menús.</title>
<description>
<title>Donde comer en Burguillos. - Cartas y Menús.</title>
<description>
<h2>Descubre los bares y restaurantes de Burguillos con sus cartas, menús y datos de contacto.</h2>
<p>Aquí puedes encontrar información acerca de los negocios de hostelería de Burguillos.</p>
<p>Aquí puedes encontrar información acerca de los negocios de hostelería de Burguillos.</p>
<p>Disfruta tu comida.</p>
<p>¿Quieres que tu comercio aparezca aquí? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a></p>
</description>
<p>¿Quieres que tu comercio aparezca aquí? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a></p>
</description>
<parent>comercios</parent>
<priority>0</priority>
<menu_text>Donde comer</menu_text>
<slug>donde-comer</slug>
<img src="/img/donde-comer.webp"/>
<priority>0</priority>
<menu_text>Donde comer</menu_text>
<slug>donde-comer</slug>
<attributes>
<attribute>
<title>Comida vegana en Burguillos.</title>
<identifier>comida-vegana</identifier>
<priority>1</priority>
<menu_text>Listado de sitios que tienen oferta de platos veganos.</menu_text>
<img src="/img/vegano.webp" bottom-preview="400"/>
<description>
<h2>Restaurantes y bares con comida vegana en Burguillos.</h2>
@ -33,7 +31,6 @@
<identifier>reparto-a-domicilio-comida</identifier>
<priority>0</priority>
<menu_text>Listado de sitios de comida con reparto a domicilio.</menu_text>
<img src="/img/comida-domicilio.webp" bottom-preview="400"/>
<description>
<h2>Cartas y Menús de Pizzerías, Hamburgueserías, Kebab, Restaurantes, Bares, etc.</h2>
@ -46,7 +43,6 @@
<title>Comer hamburguesas en Burguillos - Cartas y Menús.</title>
<identifier>hamburguesas</identifier>
<priority>0</priority>
<img src="/img/hamburguesa.webp" bottom-preview="600"/>
<menu_text>Listado de sitios de comida que preparan hamburguesas.</menu_text>
<description>
<h2>Hamburgueserias y todo tipo de establecimientos que preparan hamburguesas.</h2>

View File

@ -1,29 +0,0 @@
<category>
<title>Negocios de estética en Burguillos.</title>
<description>
<h2>Descubre todos los negocios que te ayudan a estar más guapo o guapa.</h2>
<p>¿Quieres que tu comercio aparezca aquí? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a></p>
</description>
<parent>comercios</parent>
<priority>0</priority>
<menu_text>Estética</menu_text>
<slug>estetica</slug>
<img src="/img/estetica.webp" bottom-preview="630"/>
<attributes>
<attribute>
<title>Belleza de manos.</title>
<identifier>belleza-manos</identifier>
<priority>1</priority>
<menu_text>Belleza de manos.</menu_text>
<img src="/img/unas.webp"/>
<description>
<h2>¿Andas buscando donde hacerte las uñas en Burguillos?</h2>
<p>No busques más, aquí puedes encontrar una lista de los lugares más destacados.</p>
<p>¿Conoces algún negocio que debería estar listado aquí? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a> y lo añadiremos a este registro.</p>
</description>
</attribute>
</attributes>
</category>

View File

@ -1,17 +1,16 @@
<category>
<title>Información de Burguillos.</title>
<description>
<div class="easter-egg">
<div class="burguillos-logo-container">
<img alt="The logo of Burguillos.info" src="/img/burguillos-new-logo.svg"/>
</div>
</div>
<p>Descubre todo lo que Burguillos, Sevilla tiene para ofrecerte.</p>
<description>
<div class="easter-egg">
<div class="burguillos-logo-container">
<img alt="The logo of Burguillos.info" src="/img/burguillos-new-logo.svg"/>
</div>
</div>
<p>Burguillos.info no está afiliado con el Ayuntamiento de Burguillos.</p>
<p>Un mundo de posibilidades a tu alcance en Burguillos.</p>
</description>
<img src="/img/rotonda.webp"/>
<priority>0</priority>
<menu_text><img alt="Principio" class="index-image-menu" src="/img/burguillos-new-logo.svg?v=1"/></menu_text>
<slug>index</slug>
<p>Esta página está destinada a informar de los sucesos y negocios de nuestro pueblo, cualquiera puede redactar una noticia para que aparezca en este medio mientras pase un proceso de revisión por parte del staff de Burguillos.info.</p>
</description>
<priority>0</priority>
<menu_text><img alt="Principio" class="index-image-menu" src="/img/burguillos-new-logo.svg?v=1"/></menu_text>
<slug>index</slug>
</category>

View File

@ -1,17 +0,0 @@
<category>
<title>Tiendas de ropa y accesorios en Burguillos.</title>
<description>
<p>Descubre las mejores prendas de vestir disponibles en Burguillos.</p>
<p>Compra productos locales de Burguillos.</p>
<p>¿Quieres que tu comercio aparezca aquí? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a></p>
</description>
<parent>comercios</parent>
<priority>0</priority>
<menu_text>Tiendas de ropa y accesorios</menu_text>
<slug>tiendas-ropa</slug>
<img src="/img/tienda-ropa.webp" bottom-preview="630"/>
<attributes>
</attributes>
</category>

View File

@ -1,12 +1,12 @@
<post>
<author>Burguillos.info</author>
<date>2022-11-09T22:38+00:00</date>
<title>Horarios autobuses Burguillos - Sevilla.</title>
<last_modification_date>2024-05-28T03:40+00:00</last_modification_date>
<title>Horarios autobuses Burguillos - Sevilla 2023.</title>
<last_modification_date>2023-05-03T03:40+00:00</last_modification_date>
<ogdesc>Los horarios de autobuses de Burguillos.</ogdesc>
<category>autobuses</category>
<slug>horarios-autobuses</slug>
<img src="/img/autobus.webp" bottom-preview="500"/>
<img src="/img/autobus.webp"/>
<content>
<h2>Horarios Autobuses Castiblanco - Burguillos - Sevilla - Almaden de la Plata - Alcalá del Río - Rinconada - San Ignacio del Viar.</h2>
<h3>Destino Sevilla.</h3>

View File

@ -0,0 +1,25 @@
<post>
<author>Burguillos.info</author>
<date>2022-11-14T12:00+00:00</date>
<title>Últimas plazas para Taller de Macrame.</title>
<ogdesc>Últimas plazas para Taller de Macrame.</ogdesc>
<category>talleres</category>
<img src="/img/poster-macrame-preview.webp"/>
<slug>ultimas-plazas-taller-de-macrame</slug>
<content>
<img alt="Poster del taller" src="/img/poster-macrame.webp"/>
<p>Ultima hora, nos hemos enterado de un taller de Macramé planeado para el 26 de Noviembre de 10:00 a 18:00 en la Mercería la Gallina Costurera localizada en Avenida Pepe Luna.</p>
<p>El taller está organizado por Maka Guijo y costará 45€ por persona.</p>
<p>Los materiales vienen incluidos con el precio de la plaza.</p>
<p>Si os preguntáis.-¿Qué es el Macramé?.- No os angustieis que yo os lo cuento.</p>
<p>Según Wikipedia, el Macramé es la técnica de crear tejidos mediante el uso de nudos decorativos.</p>
<p>Usando Macramé puedes crear regalos preciosos para tus familiares o amigos; o incluso quedarte tú con tu obra para exponerla, en el cartel se puede apreciar algunas de las cosas que se pueden realizar mediante el uso de Macramé.</p>
<p>Si quieres pasar un buen rato y divertirte con este peculiar estilo de artesanía no dudes en contactar con <a href="tel:+34611489981">611 489 981</a>, no esperes hasta el último momento ya que las plazas son limitadas.</p>
</content>
</post>

View File

@ -0,0 +1,19 @@
<post>
<author>Burguillos.info</author>
<date>2022-11-15T23:41+00:00</date>
<title>Clases de Guitarra con Eduardo Trassierra.</title>
<ogdesc>Clases de Guitarra con Eduardo Trassierra.</ogdesc>
<category>talleres</category>
<img src="/img/eduardo-trasierra-preview.webp"/>
<slug>clases-guitarra-eduardo-trassierra</slug>
<content>
<img alt="Imagen de las clases de guitarra, el profesor Eduardo Trassierra" src="/img/eduardo-trasierra.webp"/>
<p>Os informamos de que se ha abierto el plazo de inscripción para clases de guitarra impartidas por Eduardo Trassierra, un reputado guitarrista a escala nacional.</p>
<p>Las clases estarán localizadas en nuestro municipio, Burguillos.</p>
<p>Desde Burguillos.info aun no conocemos el precio de las clases, el organizador, Ángel, nos ha proporcionado un telefono de contacto donde podéis preguntar todos los detalles. <a href="tel:+34676334071">676334071</a></p>
<p>Las clases comenzarán tan pronto como se reunan 5 personas interesadas. ¡No te demores en inscribirte!</p>
</content>
</post>

View File

@ -15,16 +15,16 @@
<content>
<h2>Café - Bar - Pastelería - Pizzeria - Hamburguesería</h2>
<h3 style="background: black; color: red;">Traspaso completado, se mantiene la marca del Bar y gran parte de la marca.</h3>
<h3 style="background: black; color: red;">Cerrado por traspaso.</h3>
<img alt="Exterior del Bar Bocatón." src="/img/bocaton-4.webp"/>
<p>Damos la bienvenida a un nuevo negocio al directorio de Burguillos.info, El Bocatón.</p>
<p>El Bocatón es un Café - Bar ubicado al lado del Parque del Barrio Lejos, (Calle Naranjo, 11) ideal para tomarte algo mientras tus hijos juegan en el parque.</p>
<p>En El Bocatón implementan los siguientes servicios: Pastelería, Pizzería y Hamburguesería.</p>
<p>Además también puedes pedir a domicilio por un 1.50€ extra llamando al siguiente número. <a href="tel:+34633138586">633 138 586</a></p>
<p>Además también puedes pedir a domicilio por un 1.50€ extra llamando al siguiente número. <a href="tel:+34603043304">603043304</a></p>
<p>A continuación listamos la carta:</p>
<p>A continuación listamos la carta para que tengas todas las facilidades para darte un capricho no sin antes indicaros que el catalogo de pizzas solo está disponible Viernes, Sabados y Domingos; no obstante puedes pedir cualquier otra cosa entre semana.</p>
<h3>Ingredientes para añadir a tu pizza.</h3>
@ -57,7 +57,7 @@
<img alt="Chapata Pizza" src="/img/chapata-pizza.webp"/>
<ol>
<li>Completa con dos ingredientes. <b>4.00</b></li>
<li>Completa con dos ingredientes. <b>4€</b></li>
<li>Media con dos ingredientes. <b>2.50€</b></li>
</ol>
@ -74,14 +74,15 @@
<ol>
<li>Papas chicas. <b>1.50€</b></li>
<li>Papas grandes. <b>2.50€</b></li>
<li>Papas gratinadas. <b>4.00</b></li>
<li>Papas bravas. <b>3.00</b></li>
<li>Papas gratinadas. <b>4€</b></li>
<li>Papas bravas. <b>3€</b></li>
<li>Churrasco de cerdo/pollo. <b>4.50€</b></li>
<li>Montadito de cerdo/pollo. <b>3.00</b></li>
<li>Nuggets de pollo con papas. <b>3.00</b></li>
<li>Montadito de cerdo/pollo. <b>3€</b></li>
<li>Nuggets de pollo con papas. <b>3€</b></li>
<li>Solomillo al whisky. <b>4.50€</b></li>
<li>Tocinito. <b>4.00€</b></li>
<li>Carne asada. <b>4.00€</b></li>
<li>Tocinito. <b>4€</b></li>
<li>Carne asada. <b>4€</b></li>
<li>Croquetas caseras. (5 unidades) <b>3€</b></li>
<li>Sandwich york o vegetal. <b>2.50€</b></li>
<li>Perrito caliente. <b>2.50€</b></li>
</ol>
@ -96,8 +97,8 @@
<li>Doble carne, tomate, bacon, cebolla, lechuga y queso. <b>3.30€</b></li>
<li>Carne, queso, cochinito y pepinillos. <b>2.50€</b></li>
<li>Filete de pollo, lechuga, tomate, cebolla y queso. <b>2.60€</b></li>
<li>Buey, lechuga, tomate, cebolla y queso. <b>4.00</b></li>
<li>Buey, lechuga, tomate, cebolla, huevo y queso. <b>5.00</b></li>
<li>Buey, lechuga, tomate, cebolla y queso. <b>4€</b></li>
<li>Buey, lechuga, tomate, cebolla, huevo y queso. <b>5€</b></li>
<li>Crujiente de pollo, lechuga, tomate y cebolla. <b>3.80€</b></li>
</ol>
@ -109,19 +110,20 @@
<li>Bacon y queso. <b>2.80€</b></li>
<li>Frankfurt. <b>2.80€</b></li>
<li>Vegetal, mayonesa, lechuga, tomate, atún y huevo. <b>2.80€</b></li>
<li>Tortilla de patatas. <b>2.80€</b></li>
<li>Tortilla francesa, york y queso. <b>2.80€</b></li>
<li>Vegetal pollo. <b>4.00</b></li>
<li>Vegetal pollo. <b>4€</b></li>
<li>Pollo, lechuga y tomate. <b>3.30€</b></li>
<li>Filete de lomo, lechuga y tomate. <b>3.30€</b></li>
<li>Serranito de lomo o pollo <i>incluye patatas</i>. <b>5.00</b></li>
<li>Bocatón Burguer <i>incluye patatas</i>. <b>5.00</b></li>
<li>Serranito de lomo o pollo <i>incluye patatas</i>. <b>5€</b></li>
<li>Bocatón Burguer <i>incluye patatas</i>. <b>5€</b></li>
</ol>
<h3>Ensaladas</h3>
<ol>
<li>Ensalada completa: Lechuga, tomate, maíz, cebolla y esparrago. <b>3.50€</b></li>
<li>Ensaladilla. <b>3.00</b></li>
<li>Ensaladilla. <b>3€</b></li>
</ol>
<h3>Bebidas</h3>
@ -130,7 +132,7 @@
<li>Refresco 2L. <b>2.50€</b></li>
<li>Refresco lata. <b>1.20€</b></li>
<li>Litrona. <b>2.50€</b></li>
<li>Botella de Agua de 1.5L. <b>1.00</b></li>
<li>Botella de Agua de 1.5L. <b>1€</b></li>
<li>Botella de Agua pequeña. <b>0.50€</b></li>
<li>Bolsa de hielo. <b>1.20€</b></li>
</ol>

View File

@ -3,7 +3,7 @@
<date>2022-11-19T18:03+00:00</date>
<title>Centro Médico Juan Manuel Pérez Sanchez - Datos de Contacto - Pedir Cita</title>
<ogdesc>Centro Médico Juan Manuel Pérez Sanchez - Datos de Contacto - Pedir Cita</ogdesc>
<last_modification_date>2023-05-03T00:59+00:00</last_modification_date>
<last_modification_date>2023-05-03T00:59+00:00</last_modification_date>
<category>comercios</category>
<slug>centro-medico-juan-manuel-perez-sanchez</slug>
<img src="/img/policlinica-burguillos-preview.webp"/>
@ -13,7 +13,7 @@
<p>La clínica Juan Manuel Pérez Sanchez es un centro de atención a la salud dedicado a las siguientes especialidades:</p>
<ul>
<li>Odontologia general, Ortodoncia, Ortodoncia Invisible, Odontopediatría, Estetica Dental y Labios, Protesis y Aparatos Dentales, Implantes...</li>
<li>Odontologia general, Ortodoncia, Ortodoncia Invisible, Odontopediatria, Estetica Dental y Labios, Protesis y Aparatos Dentales, Implantes...</li>
<li>Clínica concertada del plan de atención infantil de la Junta de Andalucía.</li>
<li>Radiografías Panorex-Teleradiografía.</li>
<li>Pedagogia, Especialista en trastornos de lenguaje y audicion, Clases de apoyo, Talleres, Tramitacion de becas escolares.</li>

View File

@ -1,142 +1,422 @@
<post>
<author>Burguillos.info</author>
<date>2022-11-22T09:47+00:00</date>
<title>Mesón - Bar - Cristóbal - Carta y Menú.</title>
<ogdesc>Mesón - Bar - Cristóbal - Carta y Menú.</ogdesc>
<last_modification_date>2023-09-06T11:16+00:00</last_modification_date>
<category>donde-comer</category>
<category>index</category>
<slug>bar-cristobal</slug>
<attributes>
<attribute>hamburguesas</attribute>
</attributes>
<pinned>1</pinned>
<img src="/img/cristobal-preview.webp" />
<content>
<h2 style="background: black; color: red;">Menú actualizado con
nuevos precios y productos 2023-09-06</h2>
<img alt="Entrada al Mesón - Bar Cristobal."
src="/img/cristobal.webp" />
<p>El Mesón - Bar Cristóbal ubicado en la Calle los Palmeros
número 32 es una opción ideal para tomarte un café o comer en
Burguillos.</p>
<p>Además acepta pedidos a domicilio durante los meses
Noviembre, Diciembre, Enero y Febrero de Martes a Domingo
durante las noches.</p>
<p>El número de teléfono de contacto es
<a href="tel:+34621210460">621 210 460</a>.</p>
<p>A continuación procedemos a dejar la carta para que podáis
realizar el pedido que deseeis:</p>
<details>
<summary><h2>Entrantes</h2></summary>
<ul>
<li>Ensaladilla -- Tapa: <b>2.50€</b> 1/2 Ración: <b>5.00€</b> Ración: <b>10.00€</b></li>
<li>Aliño de Pimientos -- Tapa: <b>2.50€</b> 1/2 Ración: <b>5.00€</b> Ración: <b>10.00€</b></li>
<li>Aliño de Pulpo -- Tapa: <b>2.50€</b> 1/2 Ración: <b>5.00€</b> Ración: <b>10.00€</b></li>
<li>Aliño de Huevas -- Tapa: <b>2.50€</b> 1/2 Ración: <b>5.00€</b> Ración: <b>10.00€</b></li>
<li>Huevas con Mayonesa -- Tapa: <b>2.50€</b> 1/2 Ración: <b>5.00€</b> Ración: <b>10.00€</b></li>
<li>Ensalada Mixta -- Ración: <b>4.00€</b></li>
<li>Ensalada Normal -- Ración: <b>3.00€</b></li>
</ul>
</details>
<details>
<summary><h2>Aperitivos</h2></summary>
<ul>
<li>Papas Bravas -- Tapa: <b>3.00€</b> 1/2 Ración: <b>6.00€</b> Ración: <b>12.00€</b></li>
<li>Papas Alioli Calientes -- Tapa: <b>3.00€</b> 1/2 Ración: <b>6.00€</b> Ración: <b>12.00€</b></li>
<li>Papas Alioli Frías -- Tapa: <b>2.50€</b> 1/2 Ración: <b>5.00€</b> Ración: <b>10.00€</b></li>
<li>Croquetas de Jamón -- Tapa: <b>3.00€</b> 1/2 Ración: <b>6.00€</b> Ración: <b>12.00€</b></li>
<li>Croquetas de Cola de Toro -- Tapa: <b>3.50€</b> 1/2 Ración: <b>7.00€</b> Ración: <b>14.00€</b></li>
<li>Nugget de Pollo -- Tapa: <b>3.00€</b> 1/2 Ración: <b>6.00€</b> Ración: <b>12.00€</b></li>
<li>Cachopo -- Ración: <b>8.00€</b></li>
</ul>
</details>
<details>
<summary><h2>En Temporada</h2></summary>
<ul>
<li>Cabrillas -- Tapa: <b>3.00€</b> 1/2 Ración: <b>6.00€</b> Ración: <b>12.00€</b></li>
<li>Caracoles -- Tapa: <b>3.00€</b> 1/2 Ración: <b>6.00€</b> Ración: <b>12.00€</b></li>
</ul>
</details>
<details>
<summary><h2>Ibéricos</h2></summary>
<ul>
<li>Secreto -- Ración: <b>S-P</b></li>
<li>Lagrimitas -- Tapa: <b>3.50€</b> 1/2 Ración: <b>7.00€</b> Ración: <b>14.00€</b></li>
<li>Lagarto -- Tapa: <b>3.50€</b> 1/2 Ración: <b>7.00€</b> Ración: <b>14.00€</b></li>
<li>Tocinito -- Tapa: <b>3.00€</b> 1/2 Ración: <b>6.00€</b> Ración: <b>12.00€</b></li>
</ul>
</details>
<details>
<summary><h2>Carnes</h2></summary>
<ul>
<li>Carne Asá -- Tapa: <b>3.00€</b> 1/2 Ración: <b>6.00€</b> Ración: <b>12.00€</b></li>
<li>Solomillo al Whisky -- Tapa: <b>3.50€</b> 1/2 Ración: <b>8.00€</b> Ración: <b>16.00€</b></li>
<li>Solomillo a la Pimienta -- Tapa: <b>3.50€</b> 1/2 Ración: <b>8.00€</b> Ración: <b>16.00€</b></li>
<li>Solomillo al Roquefort -- Tapa: <b>3.50€</b> 1/2 Ración: <b>8.00€</b> Ración: <b>16.00€</b></li>
<li>Churrasco de Pollo/Cerdo -- Ración: <b>5.50€</b></li>
<li>Mini Serranito de Pollo/Cerdo -- Ración: <b>3.00€</b></li>
<li>Serranito de Pollo/Cerdo -- Ración: <b>5.00€</b></li>
<li>Pechuga de Pollo -- Ración: <b>5.50€</b></li>
<li>Pinchito de Pollo/Cerdo -- Ración: <b>3.00€</b></li>
<li>Brocheta de Solomillo -- Ración: <b>7.00€</b></li>
<li>Hamburguesa Simple -- Ración: <b>2.50€</b></li>
<li>Hamburguesa Completa -- Ración: <b>3.00€</b></li>
<li>Hamburguesa de Buey -- Ración: <b>5.00€</b></li>
</ul>
</details>
<details>
<summary><h2>Montaditos</h2></summary>
<ul>
<li>Montadito de Pollo/Cerdo -- Precio: <b>2.50€</b></li>
<li>Mantecadito de Pollo/Cerdo -- Precio: <b>3.00€</b></li>
<li>Montadito de Gambas -- Precio: <b>3.00€</b></li>
</ul>
</details>
<details>
<summary><h2>Cazuelitas</h2></summary>
<ul>
<li>Carne con tomate -- Tapa: <b>3.00€</b> 1/2 Ración: <b>6.00€</b> Ración: <b>12.00€</b></li>
<li>Carrillada Ibérica -- Tapa: <b>3.00€</b> 1/2 Ración: <b>6.00€</b> Ración: <b>12.00€</b></li>
<li>Atún Encebollado -- Tapa: <b>3.00€</b> 1/2 Ración: <b>6.00€</b> Ración: <b>12.00€</b></li>
<li>Bacalao con Tomate -- Tapa: <b>3.00€</b> 1/2 Ración: <b>6.00€</b> Ración: <b>12.00€</b></li>
<li>Espinacas -- Tapa: <b>3.00€</b> 1/2 Ración: <b>6.00€</b> Ración: <b>12.00€</b></li>
</ul>
</details>
<details>
<summary><h2>Pescados</h2></summary>
<ul>
<li>Chipirón a la Plancha/Frito -- Tapa: <b>3.50€</b> 1/2 Ración: <b>8.00€</b> Ración: <b>16.00€</b></li>
<li>Calamares Fritos -- Tapa: <b>3.00€</b> 1/2 Ración: <b>6.00€</b> Ración: <b>12.00€</b></li>
<li>Choco Frito -- Tapa: <b>3.50€</b> 1/2 Ración: <b>7.00€</b> Ración: <b>14.00€</b></li>
<li>Boquerones -- Tapa: <b>3.00€</b> 1/2 Ración: <b>6.00€</b> Ración: <b>12.00€</b></li>
<li>Acedias -- Tapa: <b>3.00€</b> 1/2 Ración: <b>6.00€</b> Ración: <b>12.00€</b></li>
<li>Puntillitas -- Tapa: <b>3.00€</b> 1/2 Ración: <b>6.00€</b> Ración: <b>12.00€</b></li>
<li>Adobo -- Tapa: <b>3.00€</b> 1/2 Ración: <b>6.00€</b> Ración: <b>12.00€</b></li>
<li>Brocheta de Gambas -- Tapa: <b>3.00€</b> 1/2 Ración: <b>8.00€</b> Ración: <b>14.00€</b></li>
<li>Pescado Variado -- 1/2 Ración: <b>7.00€</b> Ración: <b>14.00€</b></li>
<li>Pez Espada -- Ración: <b>8.00€</b></li>
<li>Merluza -- Ración: <b>6.00€</b></li>
<li>Dorada -- Ración: <b>6.00€</b></li>
</ul>
</details>
<author>Burguillos.info</author>
<date>2022-11-22T09:47+00:00</date>
<title>Mesón - Bar - Cristobal - Carta y Menú.</title>
<ogdesc>Mesón - Bar - Cristobal - Carta y Menú.</ogdesc>
<last_modification_date>2023-05-03T02:34+02:00</last_modification_date>
<category>donde-comer</category>
<slug>bar-cristobal</slug>
<attributes>
<attribute>hamburguesas</attribute>
</attributes>
<img src="/img/cristobal-preview.webp"/>
<content>
<h2 style="background: black; color: red;">Menú actualizado con nuevos precios y productos 2023-05-03</h2>
<img alt="Entrada al Mesón - Bar Cristobal." src="/img/cristobal.webp"/>
<p>El Mesón - Bar Cristobal ubicado en la Calle los Palmeros número 32 es una opción ideal para tomarte un café o comer en Burguillos.</p>
<p>Además acepta pedidos a domicilio durante los meses Noviembre, Diciembre, Enero y Febrero de Martes a Domingo durante las noches.</p>
<details>
<summary><h2>Postres</h2></summary>
<ol>
<li>Arroz con leche <b>2.50€</b></li>
<li>Natillas <b>2.50€</b></li>
<li>Flan de Huevo <b>2.50€</b></li>
<li>Helados Nestle <b>3.00€</b></li>
</ol>
</details>
<p>Por último desde Burguillos.info os indicamos que el precio
por el servicio de pan y picos por comensal es de 0.50€ y que
tenéis la posibilidad de pedir un extra en salsas por
0.50€.</p>
<p>¿Quieres ver tu negocio localizado en Burguillos en este
espacio? Contacta con
<a href="mailto:contact@owlcode.tech">
contact@owlcode.tech</a>.</p>
</content>
<p>El número de teléfono de contacto es <a href="tel:+34621210460">621210460</a>.</p>
<p>A continuación procedemos a dejar la carta para que podáis realizar el pedido que deseeis:</p>
<h2>Entrantes</h2>
<table>
<tr>
<th></th>
<th>Tapa</th>
<th>1/2 Ración</th>
<th>Ración</th>
</tr>
<tr>
<td>Ensaladilla</td>
<td>2.50€</td>
<td>5€</td>
<td>10€</td>
</tr>
<tr>
<td>Aliño de Pimientos</td>
<td>2.50€</td>
<td>5€</td>
<td>10€</td>
</tr>
<tr>
<td>Aliño de Pulpo</td>
<td>2.50€</td>
<td>5€</td>
<td>10€</td>
</tr>
<tr>
<td>Aliño de Huevas</td>
<td>2.50€</td>
<td>5€</td>
<td>10€</td>
</tr>
<tr>
<td>Huevas con Mayonesa</td>
<td>2.50€</td>
<td>5€</td>
<td>10€</td>
</tr>
<tr>
<td>Ensalada Mixta</td>
<td>-</td>
<td>-</td>
<td>4€</td>
</tr>
<tr>
<td>Ensalada Normal</td>
<td>-</td>
<td>-</td>
<td>3€</td>
</tr>
</table>
<h2>Aperitivos</h2>
<table>
<tr>
<th></th>
<th>Tapa</th>
<th>1/2 Ración</th>
<th>Ración</th>
</tr>
<tr>
<td>Papas Bravas</td>
<td>3€</td>
<td>6€</td>
<td>12€</td>
</tr>
<tr>
<td>Papas Alioli Calientes</td>
<td>3€</td>
<td>6€</td>
<td>12€</td>
</tr>
<tr>
<td>Papas Alioli Frías</td>
<td>2.50€</td>
<td>5€</td>
<td>10€</td>
</tr>
<tr>
<td>Croquetas de Jamón</td>
<td>3€</td>
<td>6€</td>
<td>12€</td>
</tr>
<tr>
<td>Croquetas de Cola de Toro</td>
<td>3.50€</td>
<td>7€</td>
<td>14€</td>
</tr>
<tr>
<td>Nugget de Pollo</td>
<td>3€</td>
<td>6€</td>
<td>12€</td>
</tr>
<tr>
<td>Cachopo</td>
<td>--</td>
<td>--</td>
<td>8€</td>
</tr>
</table>
<h2>En Temporada</h2>
<table>
<tr>
<th></th>
<th>Tapa</th>
<th>1/2 Ración</th>
<th>Ración</th>
</tr>
<tr>
<td>Cabrillas</td>
<td>2.50€</td>
<td>5€</td>
<td>10€</td>
</tr>
<tr>
<td>Caracoles</td>
<td>2.50€</td>
<td>5€</td>
<td>10€</td>
</tr>
</table>
<h2>Ibéricos</h2>
<table>
<tr>
<th></th>
<th>Tapa</th>
<th>1/2 Ración</th>
<th>Ración</th>
</tr>
<tr>
<td>Secreto</td>
<td>--</td>
<td>S-P</td>
<td>--</td>
</tr>
<tr>
<td>Lagrimitas</td>
<td>3.50€</td>
<td>7€</td>
<td>14€</td>
</tr>
<tr>
<td>Lagarto</td>
<td>3.50€</td>
<td>7€</td>
<td>14€</td>
</tr>
<tr>
<td>Tocinito</td>
<td>3€</td>
<td>6€</td>
<td>12€</td>
</tr>
</table>
<h2>Carnes</h2>
<table>
<tr>
<th></th>
<th>Tapa</th>
<th>1/2 Ración</th>
<th>Ración</th>
</tr>
<tr>
<td>Carne Asá</td>
<td>3€</td>
<td>6€</td>
<td>12€</td>
</tr>
<tr>
<td>Solomillo al Whisky</td>
<td>3.50€</td>
<td>8€</td>
<td>16€</td>
</tr>
<tr>
<td>Solomillo a la Pimienta</td>
<td>3.50€</td>
<td>8€</td>
<td>16€</td>
</tr>
<tr>
<td>Solomillo al Roquefort</td>
<td>3.50€</td>
<td>8€</td>
<td>16€</td>
</tr>
<tr>
<td>Churrasco de Pollo/Cerdo</td>
<td>--</td>
<td>5.50€</td>
<td>--</td>
</tr>
<tr>
<td>Mini Serranito de Pollo/Cerdo</td>
<td>--</td>
<td>3€</td>
<td>--</td>
</tr>
<tr>
<td>Serranito de Pollo/Cerdo</td>
<td>--</td>
<td>5€</td>
<td>--</td>
</tr>
<tr>
<td>Montadito de Pollo/Cerdo</td>
<td>--</td>
<td>2.50€</td>
<td>--</td>
</tr>
<tr>
<td>Montadito de Gambas</td>
<td>--</td>
<td>3€</td>
<td>--</td>
</tr>
<tr>
<td>Mantecadito de Pollo/Cerdo</td>
<td>--</td>
<td>3€</td>
<td>--</td>
</tr>
<tr>
<td>Pechuga de Pollo</td>
<td>--</td>
<td>5.50€</td>
<td>--</td>
</tr>
<tr>
<td>Pinchito de Pollo/Cerdo</td>
<td>--</td>
<td>3€</td>
<td>--</td>
</tr>
<tr>
<td>Brocheta de Solomillo</td>
<td>--</td>
<td>7€</td>
<td>--</td>
</tr>
<tr>
<td>Hamburguesa Simple</td>
<td>--</td>
<td>2.50€</td>
<td>--</td>
</tr>
<tr>
<td>Hamburguesa Completa</td>
<td>--</td>
<td>3€</td>
<td>--</td>
</tr>
<tr>
<td>Hamburguesa de Buey</td>
<td>--</td>
<td>5€</td>
<td>--</td>
</tr>
</table>
<h2>Pescados</h2>
<table>
<tr>
<th></th>
<th>Tapa</th>
<th>1/2 Ración</th>
<th>Ración</th>
</tr>
<tr>
<td>Chipirón a la Plancha/Frito</td>
<td>3.50€</td>
<td>8€</td>
<td>16€</td>
</tr>
<tr>
<td>Calamares Fritos</td>
<td>3€</td>
<td>6€</td>
<td>12€</td>
</tr>
<tr>
<td>Choco Frito</td>
<td>3.50€</td>
<td>7€</td>
<td>14€</td>
</tr>
<tr>
<td>Boquerones</td>
<td>3€</td>
<td>6€</td>
<td>12€</td>
</tr>
<tr>
<td>Acedias</td>
<td>3€</td>
<td>6€</td>
<td>12€</td>
</tr>
<tr>
<td>Puntillitas</td>
<td>3€</td>
<td>6€</td>
<td>12€</td>
</tr>
<tr>
<td>Adobo</td>
<td>3€</td>
<td>6€</td>
<td>12€</td>
</tr>
<tr>
<td>Pescado Variado</td>
<td>--</td>
<td>7€</td>
<td>14€</td>
</tr>
<tr>
<td>Brocheta de Gambas</td>
<td>3€</td>
<!-- Precio raro preguntar. -->
<td>8€</td>
<td>14€</td>
</tr>
<tr>
<td>Pescado Variado.</td>
<td>-</td>
<td>7€</td>
<td>-</td>
</tr>
<tr>
<td>Pez Espada</td>
<td>--</td>
<td>8€</td>
<td>--</td>
</tr>
<tr>
<td>Merluza.</td>
<td>--</td>
<td>6€</td>
<td>--</td>
</tr>
<tr>
<td>Dorada.</td>
<td>--</td>
<td>6€</td>
<td>--</td>
</tr>
</table>
<h2>Cazuelitas</h2>
<table>
<tr>
<th></th>
<th>Tapa</th>
<th>1/2 Ración</th>
<th>Ración</th>
</tr>
<tr>
<td>Atún Encebollado</td>
<td>3€</td>
<td>6€</td>
<td>12€</td>
</tr>
<tr>
<td>Bacalao con Tomate</td>
<td>3€</td>
<td>6€</td>
<td>12€</td>
</tr>
<tr>
<td>Espinacas</td>
<td>3€</td>
<td>6€</td>
<td>12€</td>
</tr>
<tr>
<td>Carne con tomate</td>
<td>3€</td>
<td>6€</td>
<td>12€</td>
</tr>
<tr>
<td>Carrillada Ibérica</td>
<td>3€</td>
<td>6€</td>
<td>12€</td>
</tr>
</table>
<h2>Postres</h2>
<ol>
<li>Arroz con leche <b>2.50€</b></li>
<li>Natillas <b>2.50€</b></li>
<li>Flan de Huevo <b>2.50€</b></li>
<li>Helados Nestle <b>Precio Variable</b></li>
</ol>
<p>Por último desde Burguillos.info os indicamos que el precio por el servicio de pan y picos por comensal es de 0.30€ y que tenéis la posibilidad de pedir un extra en salsas por 0.50€.</p>
</content>
</post>

View File

@ -0,0 +1,75 @@
<post>
<author>Sergio Iglesias (Lead Developer)</author>
<date>2022-11-23T12:58+00:00</date>
<title>Diaspora para las masas.</title>
<ogdesc>Diaspora para las masas.</ogdesc>
<category>index</category>
<img src="/img/diaspora-article-preview.webp"/>
<slug>social-burguillos-info</slug>
<content>
<h3 style="color: red; background: black;">Este servicio ha sido temporalmente descontinuado por falta de actualizaciones por parte de sus desarrolladores. Disculpen las molestias</h3>
<p>Hoy desde Burguillos.info os traemos por un lado un nuevo método de estar al tanto de las novedades de la web y por otro una forma nueva de comunicarte con los otros burguilleros y burguilleras.</p>
<p>La nueva web <a href="https://social.burguillos.info">social.burguillos.info</a> es eso y más, dicha web es una instancia de Diaspora, una red social de software libre que te permite interactuar con quien quieras de la red independientemente de en que instancia te encuentras mediante un algoritmo conocido como federación.</p>
<p>Esto significa que puedes comentar en los posts de Burguillos.info desde un usuario en cualquier instancia, no necesariamente desde <a href="https://social.burguillos.info">social.burguillos.info</a>, evitando así el poder centralizado de grandes compañias malvadas como Meta, Twitter, Google, Amazon, etc. Cuyo negocio es la intrusión en tu privacidad y la manipulación mediática.</p>
<p>Recupera tu libertad y tu privacidad con esta sencilla receta.</p>
<p>En primer lugar en la parte de abajo de la web podrás encontrar un nuevo icono a parte del ya conocido de suscripción por RSS, uno que es una suerte de asteristo con un circulo negro alrededor.</a>
<img alt="Indicaciones para encontrar el icono de suscripción por Diaspora" style="border: solid 1px black;" src="/img/diaspora-article-image-1.webp"/>
<p>Al pulsar sobre el llegarás a nuestro perfil en dicha red.</p>
<img alt="Perfil de Burguillos.info en Diaspora." style="border: solid 1px black;" src="/img/diaspora-article-image-2.webp"/>
<p>No obstante aun no podremos seguir a la cuenta porque aun no nos hemos registrado. Como he dicho, podemos seguir a Burguillos.info desde cualquier instancia, puedes elegir una de <a href="https://diaspora.fediverse.observer/">diaspora.fediverse.observer</a> o usar la propia de Burguillos.info, en este caso voy a seguir el tutorial desde la instancia de Burguillos.info.</p>
<img alt="Perfil de Burguillos.info en Diaspora con la opción de registrarse marcada." style="border: solid 1px black;" src="/img/diaspora-article-image-3.webp"/>
<p>Pulsamos sobre "Create account" para registrarnos y empezar a disfrutar Diaspora.</p>
<img alt="Datos de inscripción rellenos." style="border: solid 1px black;" src="/img/diaspora-article-image-4.webp"/>
<p>Rellenamos la información con nuestro correo electrónico, nombre de usuario, contraseña repetida dos veces y resolvemos la comprobación de que somos humanos, para despues presionar de nuevo en "Create Account".</p>
<p>Si tienes dificultades en este paso o cualquier otro contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a>.</p>
<img alt="Menú pidiendonos más datos que queramos incluir." style="border: solid 1px black;" src="/img/diaspora-article-image-5.webp"/>
<p>Una vez hayamos completado la inscripción con exito aparecerá una nueva pantalla ofreciendonos a introducir más información para hacer la experiencia mejor como un avatar y hashtags para que otros usuarios sepan cuales son tus intereses.</p>
<p>Esta información se puede cambiar más adelante, así que yo la dejaré en blanco, pero tú puedes personalizar en esta pantalla tu cuenta tanto como quieras.</p>
<p>Una vez hayas terminado de personalizar a tu gusto tu cuenta, pulsamos sobre "Awesome! Take me to diaspora* >>"</p>
<img alt="Vista principal de Diaspora*." style="border: solid 1px black;" src="/img/diaspora-article-image-6.webp"/>
<p>Al llegar a esta imagen habremos terminado el proceso de registro en Diaspora*, ahora querremos seguir a Burguillos.info, para ello pulsamos en el icono de suscripción en la parte de abajo de este artículo.</p>
<img alt="Indicaciones para encontrar el icono de suscripción por Diaspora" style="border: solid 1px black;" src="/img/diaspora-article-image-1.webp"/>
<p>Seguimos el enlace.</p>
<img alt="El perfil de Burguillos.info con el nombre de usuario al estilo email seleccionado." style="border: solid 1px black;" src="/img/diaspora-article-image-7.webp"/>
<p>Seleccionamos el nombre de usuario, que será siempre parecido a una dirección de correo electrónico.</p>
<img alt="El nombre de usuario copiado en la barra de busqueda." style="border: solid 1px black;" src="/img/diaspora-article-image-8.webp"/>
<p>Copiamos dicho nombre en la barra de busqueda y pulsamos intro.</p>
<img alt="La nueva pantalla tras pulsar sobre add contact y indicando que se pulse sobre Acquaintances." style="border: solid 1px black;" src="/img/diaspora-article-image-9.webp"/>
<p>Pulsamos sobre "Add contact" y aparecerá un menú desplegable donde pulsaremos sobre Acquaintances para indicar que eres conocido de Burguillos.info, con usuarios con los que tengas mayor confianza puedes pulsar Family, Friend o Work, de ese modo puedes redactar tus posts para que lleguen solo a las personas que deseés.</p>
<p>Cuando lo hagas y pulses a "stream", verás que en tu timeline ya aparecen los posts de Burguillos.info.</p>
<img alt="Timeline lleno de posts de Burguillos.info" style="border: solid 1px black;" src="/img/diaspora-article-image-10.webp"/>
<p>Tan solo me queda desearte una feliz estancia en Diaspora*.</p>
<p>PD: No se admitirán conflictos, malas formas ni acusaciones de ningún tipo en la instancia.</p>
</content>
</post>

View File

@ -0,0 +1,52 @@
<post>
<author>Sergio Iglesias (Lead Developer)</author>
<date>2022-11-24T17:02+00:00</date>
<title>Servidor de chat de Burguillos.</title>
<ogdesc>Servidor de chat de Burguillos.</ogdesc>
<category>index</category>
<img src="/img/xmpp-preview.webp"/>
<slug>chat-burguillos</slug>
<content>
<p>Desde Burguillos.info creemos en las tecnologías de comunicación descentralizadas, debido a ello configuramos hace poco un servidor de Diaspora* para que los burguilleros y burguilleras puedan usarlo como foro sustituyendo a Facebook.</p>
<p>No obstante no todo es debate público y los habitantes de Burguillos siguen sin tener alternativas para la mensajería instantanea o privada que no puedan interceptar las grandes multinacionales para sus fines oscuros.</p>
<p>Es por ello que acabamos de inagurar el servidor de XMPP de Burguillos.info.</p>
<p>Esta nueva modalidad de mensajería instantanea tiene todas las ventajas de Diaspora*:</p>
<ul>
<li>No tiene un solo dueño si no que puedes hablar desde cualquier servidor con cualquiera en cualquier otro.</li>
<li>Tus mensajes no pasan por las manos de las grandes multinacionanes.</li>
</ul>
<p>Y además al contrario que sus competidores (Whatsapp, Telegram y Signal.) No requiere que cedas tu número de teléfono a ningún tercero, de hecho puedes tener tantas cuentas como quieras.</p>
<p>¿Estás deseando probarlo? Pues allá vamos.</p>
<p>En primer lugar tendrás que descargar un cliente de XMPP, os recomiendo usar <a href="https://play.google.com/store/apps/details?id=eu.siacs.conversations&gl=US">Conversations</a> ya que implementa encriptación de extremo a extremo, lo que significa que el dueño de tu servidor nunca podrá leer tus mensajes. (Si usas bien esa feature verificando las claves para evitar que sean interceptadas.)</p>
<p>Una vez lo hayas instalado, cuando abras la nueva aplicación encontrarás una pantalla como esta.</p>
<img alt="Pantalla de bienvenida de Conversations" src="/img/xmpp-1.webp"/>
<p>Como aun no tenemos una cuenta pulsaremos sobre "Create new account".</p>
<img alt="Pantalla de selección entre servidor por defecto o custom." src="/img/xmpp-2.webp"/>
<p>Una vez hayamos pulsado nos hará una nueva pregunta, si queremos usar el proveedor de Conversations.im o otro.</p>
<p>Para favorecer la descentralización y aprovechar el servidor del pueblo pulsaremos sobre "Use my own provider", si quisieses escoger la primera opción también podrías hablar con la gente suscrita a Burguillos.info, la única desventaja es que no podrías ver las salas públicas creadas en Burguillos.info, tendrías que buscarlas manualmente por su nombre.</p>
<img alt="Pantalla de introducción de datos" src="/img/xmpp-3.webp"/>
<p>Ahora la aplicación nos pide que introduzcamos el nuevo usuario a crear, para crear tu nombre de usuario deberás hacerlo como si fuese un email terminado en @burguillos.info, por ejemplo manuelsanchez@burguillos.info, anarodriguez@burguillos.info, asociacionX@burguillos.info...</p>
<p>Debes tener cuídado al introducir la contraseña, ya que si la pierdes no tendrás ninguna forma de recuperarla y perderás el acceso a la cuenta, de todos modos crear una nueva es gratis y puedes tener tantas como quieras.</p>
<img alt="Pantalla de selección de avatar" src="/img/xmpp-4.webp"/>
<p>Ahora nos da la opción de introducir un avatar para hacer nuestra cuenta única y que la gente pueda reconocernos en la red, un avatar es una pequeña imagen que puede ser una foto tuya, de tu mascota, de algo que te guste...</p>
<p>Una vez hayamos terminado de configurar el avatar o hayamos pulsado skip nos encontraremos en la pantalla principal de la aplicación. ¿Por que no pruebas a enviarnos un mensaje a admin@burguillos.info para contarnos que estás por aquí?</p>
<p>Espero que lo paséis genial en las distintas redes descentralizadas que iremos abriendo para el pueblo.</p>
</content>
</post>

View File

@ -0,0 +1,48 @@
<post>
<author>Sergio Iglesias (Lead Developer)</author>
<date>2023-04-30T23:58:37+02:00</date>
<title>Problemas técnicos.</title>
<ogdesc>Explicación sobre porque no se ha podido acceder a la web estos últimos días.</ogdesc>
<category>index</category>
<img src="/img/fibra-cortada.webp"/>
<slug>problemas-tecnicos</slug>
<content>
<h3>Burguillos.info ha vuelto a la normalidad tras 5 días inoperativo, te explicamos las razones.</h3>
<img style="border: 1px black solid;" src="/img/fibra-cortada.webp" alt="A fiber cable cutted down"/>
<p>En burguillos.info siempre hemos pensado que tenía lógica tener el servidor localizado en Burguillos y no
en otro país como Alemania. Debido a que ningún proveedor de VPS tiene localización en nuestro municipio decidimos
alojar la web en un pequeño ordenador en mi casa que es también sede de la empresa que lleva burguillos.info,
owlcode.tech.</p>
<p>Esta decisión técnica tuvo sentido a pesar de existir proveedores que la podrían alojar con menos problemas habituales
en Burguillos como pueden ser los frecuentes cortes en el suministro eléctrico. Pensamos que si vas a hacer una web sobre Burguillos que menos que
el servidor se encuentre aquí fomentando la economía local y no la economía de otra localidad o país.</p>
<p>No obstante en un despreciable acto de mala voluntad alguien decidió que el cable de fibra óptica de esta web
le estorbaba y lo cortó. Hasta aquí todo tiene fácil solución y no hubiese justificado más de
dos días de tiempo inactivo ya que el técnico de la fibra llegó al día siguiente y realizó el diagnóstico
de que la falta de conectividad se debía a que el cable de fibra óptica había sido seccionado de forma completa
resultando de ese modo imposible que la información fluyese por el mismo, por lo que al día siguiente procedería
a la reinstalación completa del cable.</p>
<p>No obstante uno de los vecinos.- Que en ningún modo está demostrado que tuviese nada que ver con el corte del canal
de comunicación a pesar de haber estado realizando una obra donde reorganizó la disposición del cableado en su fachada.-
Se negó en rotundo a la reposición del cable, fundamental no solo para el funcionamiento de esta web sino también para
mi trabajo.</p>
<p>A día de hoy la sede de esta empresa continúa sin un canal de fibra óptica para operar debido a las reiteradas
negativas del sujeto en cuestión.</p>
<p>El servidor ha sido desplazado a otra localización donde permanecerá hasta que se restaure el servicio y desde
owlcode.tech nos reservamos el derecho a ejercer acciones legales.</p>
<p>Tras el desplazamiento al inspeccionar el servicio social.burguillos.info hemos constatado que no es compatible
con versiones soportadas por la comunidad del lenguaje de programación Ruby, por lo que hemos decidido apagarlo
y sustituirlo por otro servicio de naturaleza federada como puede ser Mastodon. Aceptamos sugerencias sobre qué
software de red social os gustaría ver en este sitio.</p>
<p>Esperamos desde burguillos.info que paséis una mejor semana que la que yo he tenido.</p>
</content>
</post>

View File

@ -0,0 +1,34 @@
<post>
<author>Burguillos.info</author>
<date>2023-04-30T23:58:37+02:00</date>
<title>Subida de precio de los autobuses.</title>
<ogdesc>Precios premium por un servicio tercermundista, el estado actual de los autobuses de Burguillos.</ogdesc>
<category>index</category>
<img src="/img/autobus-burguillos-tercer-mundo.webp"/>
<slug>subida-precio-autobus-burguillos</slug>
<content>
<img style="border: 1px black solid;" src="/img/autobus-burguillos-tercer-mundo.webp" alt="Image of an overloaded bus in a third world country."/>
<h3>Precios premium por un servicio tercermundista, el estado actual de los autobuses de Burguillos.</h3>
<p>Damas ha incrementado una vez más el precio del autobús de 2.31€ a <b>2.50€</b>,
mientras el descuento del gobierno nos llega mal y tarde.</p>
<p>Este es solo uno más de la lista de <b>atropellos</b> que la empresa Damas lleva
realizados en la línea de nuestra localidad con los infinitos retrasos de las líneas,
la gente que esta línea.- Supuestamente deficitaria.- Ha dejado en tierra por estar el
autobús demasiado lleno y horarios que no permiten el desarrollo sostenible efectivo
de nuestra localidad.</p>
<p>Desde Damas nos avocan a utilizar coche para desplazarnos a los municipios cercanos, un
medio de transporte extremadamente contaminante comparativamente al autobús haciendo de
este modo lobby de la industria automovilística que está destruyendo nuestro planeta.</p>
<p>Los burguilleros y burguilleras debemos plantarnos ante este insulto a la inteligencia
que es querernos vender como un descuento una subida de precio, debemos hacer saber a
Damas que con Burguillos no se juega.</p>
<p>Por Burguillos y nuestro planeta pasemos a la acción, si no nos quieren escuchar obliguemosles
a hacerlo.</p>
</content>
</post>

View File

@ -3,7 +3,7 @@
<date>2023-05-05T22:21+00:00</date>
<title>Carta y Menú del Bar - Restaurante Durán - Centro de día en Burguillos.</title>
<ogdesc>Carta y Menú del Bar - Restaurante Durán - Centro de día en Burguillos.</ogdesc>
<img src="/img/duran.webp" bottom-preview="600"/>
<img src="/img/duran.webp"/>
<category>donde-comer</category>
<attributes>
<attribute>hamburguesas</attribute>

View File

@ -2,12 +2,9 @@
<author>Burguillos.info</author>
<date>2023-05-06T15:33+00:00</date>
<title>Carta y Menú del Café - Bar Beluche en Burguillos.</title>
<last_modification_date>2023-09-13T16:03+00:00</last_modification_date>
<ogdesc>Carta y Menú del Café - Bar Beluche en Burguillos.</ogdesc>
<img src="/img/beluche.webp" bottom-preview="500"/>
<pinned>2</pinned>
<img src="/img/beluche.webp"/>
<category>donde-comer</category>
<category>index</category>
<attributes>
<attribute>hamburguesas</attribute>
<attribute>reparto-a-domicilio-comida</attribute>
@ -21,120 +18,304 @@
<p>El Café - Bar Beluche es uno de los lugares favoritos de los habitantes de Burguillos para comer o simplemente tomar un refresco o un café.</p>
<p>Su ubicación en calle Albahaca número 13 es inmejorable, ofreciendo terrazas a parte de mesas en el interior.</p>
<p>El teléfono de contacto es <a href="tel:+34691492054">691 492 054</a>, puedes usarlo para reservar, pedir comida a domicilio o pedir que te preparen platos para llevar.</p>
<p>Los teléfonos de contacto son <a href="tel:+34694200713">694 200 713</a> y <a href="tel:+34691492054">691 492 054</a>, puedes usarlos para reservar, pedir comida a domicilio o pedir que te preparen platos para llevar.</p>
<p>Procedemos a transcribir la carta a continuación:</p>
<details>
<summary><h3>Ensaladas</h3></summary>
<ul>
<li>Mixta -- Precio: <b>6.00€</b></li>
<li>César -- Precio: <b>6.50€</b></li>
<li>Trópical -- Precio: <b>N/A</b></li>
</ul>
</details>
<details>
<summary><h3>Revueltos</h3></summary>
<ul>
<li>Gula langostinos -- Precio: <b>7.50€</b></li>
<li>Bacalao dorado -- Precio: <b>7.50€</b></li>
<li>Morcilla de arroz -- Precio: <b>7.50€</b></li>
</ul>
</details>
<details>
<summary><h3>Tapas frías.</h3></summary>
<ul>
<li>Ensaladilla rusa -- Tapa: <b>3.00€</b> Plato: <b>6.00€</b></li>
<li>Aliños del día (Aliño Melva/Salpicón de marisco) -- Tapa: <b>3.00€</b> Plato: <b>6.00€</b></li>
<li>Cóctel de mariscos -- Plato: <b>4.00€</b></li>
<li>Ensaladilla de cangrejo -- Tapa: <b>3.50€</b> Plato: <b>7.00€</b></li>
</ul>
</details>
<details>
<summary><h3>Para compartir</h3></summary>
<ul>
<li>Papas bravas -- Precio tapa: <b>3.50€</b> Precio plato: <b>6.00€</b></li>
<li>Papas de mi prima -- Precio tapa: <b>3.50€</b> Precio plato: <b>6.00€</b></li>
<li>Papas arrieras -- Precio tapa: <b>3.80€</b> Precio plato: <b>7.00€</b></li>
<li>Bartolitos. (Langostinos con bacon) -- Precio tapa: <b>3.80€</b> Precio plato: <b>6.00€</b></li>
<li>Queso rulo con bacon, nueces y miel de caña -- Precio tapa: <b>3.80€</b> Precio plato: <b>6.00€</b></li>
<li>Morcilla crocanti -- Precio tapa: <b>3.50€</b> Precio plato: <b>6.00€</b></li>
<li>Muss de pato -- Precio tapa: <b>4.00€</b> Precio plato: <b>8.00€</b></li>
<li>Duo de rulo y muss de pato -- Precio plato: <b>7.00€</b></li>
<li>Talegitas de queso -- Precio tapa: <b>3.50€</b> Precio plato: <b>6.00€</b></li>
<li>Champiñones con alioli y jamón -- Precio tapa: <b>3.50€</b> Precio plato: <b>6.50€</b></li>
<li>Fideos tostados -- Precio plato: <b>4.00€</b></li>
<li>Variado de croquetas -- Precio plato: <b>11.00€</b></li>
<li>Croquetas de secreto y miel -- Precio tapa: <b>4.00€</b> Precio plato: <b>8.00€</b></li>
</ul>
</details>
<details>
<summary><h3>Rico rico</h3></summary>
<ul>
<li>Pollo kentucky -- Precio tapa: <b>3.50€</b> Precio plato: <b>7.00€</b></li>
<li>Pollo mostaza -- Precio tapa: <b>4.50€</b> Precio plato: <b>8.50€</b></li>
<li>Huevos rotos -- Precio plato: <b>5.00€</b></li>
<li>Pan bao -- Precio tapa: <b>5.00€</b> Precio plato: <b>10.00€</b></li>
<li>Carrillada ibérica -- Precio tapa: <b>3.50€ (Preguntar, en menú real 8.50€)</b> Precio plato: <b>7.00€</b></li>
</ul>
</details>
<details>
<summary><h3>Arroces</h3></summary>
<ul>
<li>Timbal de arroz con chipirones y alioli -- Tapa: <b>4.00€</b> Plato: <b>7.50€</b></li>
<li>Arroz negro -- Tapa: <b>4.50€</b> Plato: <b>8.50€</b></li>
<li>Rissotto cuatro quesos -- Tapa: <b>4.50€</b> Plato: <b>8.50€</b></li>
</ul>
</details>
<details>
<summary><h3>Pescados</h3></summary>
<ul>
<li>Gambas al ajillo -- Precio tapa: <b>4.50€</b> Precio plato: <b>8.00€</b></li>
<li>Gambas a la plancha -- Precio tapa: <b>5.00€</b> Precio plato: <b>10.00€</b></li>
<li>Flamenquín de melva -- Precio tapa: <b>3.50€</b> Precio plato: <b>7.00€</b></li>
<li>Chipirones -- Precio tapa: <b>4.00€</b> Precio plato: <b>7.50€</b></li>
<li>Choco -- Precio plato: <b>S/P</b></li>
<li>Lubina -- Precio plato: <b>S/P</b></li>
<li>Pez espada -- Precio plato: <b>12.00€</b></li>
<li>Merluza confitada -- Precio plato: <b>8.00€</b></li>
<li>Bacalao confitado -- Precio plato: <b>9.00€</b></li>
<li>Montadito de gambas con alioli -- Precio plato: <b>3.20€</b></li>
<li>Almejas con langostinos -- Precio tapa: <b>4.50€</b> Precio plato: <b>8.00€</b></li>
</ul>
</details>
<details>
<summary><h3>Carnes</h3></summary>
<ul>
<li>Solomillo de pavo -- Precio plato: <b>9.00€</b></li>
<li>Medallones de solomillo (Roque, whisky, mojo) -- Precio tapa: <b>3.50€</b> Precio plato: <b>6.50€</b></li>
<li>Solomillo rulo de queso y miel de caña -- Precio tapa: <b>4.00€</b> Precio plato: <b>7.50€</b></li>
<li>Solomillo ibérico -- Precio plato: <b>12.50€</b></li>
<li>Abanico ibérico -- Precio plato: <b>12.50€</b></li>
<li>Presa ibérica -- Precio plato: <b>14.00€</b></li>
<li>Presa con mostaza -- Precio tapa: <b>4.00€</b> Precio plato: <b>8.00€</b></li>
<li>Presa con setas y roquefort -- Precio tapa: <b>4.50€</b> Precio plato: <b>9.00€</b></li>
<li>Chuletón de ternera -- Precio plato: <b>S/P</b></li>
<li>Entrecot de ternera -- Precio plato: <b>S/P</b></li>
<li>Chuletón de vaca vieja madurada -- Precio plato: <b>S/P</b></li>
<li>Entrecot de vaca vieja -- Precio plato: <b>S/P</b></li>
<li>Hamburguesa de buey -- Precio plato: <b>5.50€</b></li>
<li>Mini hamburguesa -- Precio plato: <b>3.00€</b></li>
<li>Montadito de pollo o lomo -- Precio plato: <b>3.00€</b></li>
<li>Montadito de solomillo y queso viejo -- Precio plato: <b>3.80€</b></li>
<li>Serranito -- Precio plato: <b>5.50€</b></li>
<li>Mini serranito de pollo o lomo -- Precio plato: <b>4.00€</b></li>
</ul>
</details>
<details>
<summary><h3>Postres</h3></summary>
<ul>
<li>Gofres con nata y chocolate -- Precio: <b>3.80€</b></li>
<li>Tortitas americanas -- Precio: <b>4.00€</b></li>
<li>Tarta (Porción) -- Precio: <b>3.80€</b></li>
<li>Coulant con helado de vainilla -- Precio: <b>4.00€</b></li>
</ul>
</details>
<h3>Ensaladas</h3>
<table>
<tr>
<th>Nombre</th>
<th>Precio</th>
</tr>
<tr>
<td>Mixta</td>
<td>6.00€</td>
</tr>
<tr>
<td>César</td>
<td>6.50€</td>
</tr>
</table>
<h3>Revueltos</h3>
<table>
<tr>
<th>Nombre</th>
<th>Precio</th>
</tr>
<tr>
<td>Gula langostinos</td>
<td>7.50€</td>
</tr>
<tr>
<td>Bacalao dorado</td>
<td>7.50€</td>
</tr>
</table>
<h3>Para compartir</h3>
<table>
<tr>
<th>Nombre</th>
<th>Precio tapa</th>
<th>Precio plato</th>
</tr>
<tr>
<td>Papas bravas</td>
<td>3.00€</td>
<td>5.50€</td>
</tr>
<tr>
<td>Papas de mi prima</td>
<td>3.50€</td>
<td>6.00€</td>
</tr>
<tr>
<td>Papas arrieras</td>
<td>3.80€</td>
<td>6.50€</td>
</tr>
<tr>
<td>Bartolitos. (Langostinos con bacon)</td>
<td>3.80€</td>
<td>6.00€</td>
</tr>
<tr>
<td>Queso rulo con bacon, nueces y miel de caña</td>
<td>3.80€</td>
<td>6.00€</td>
</tr>
<tr>
<td>Morcilla crocanti</td>
<td>3.50€</td>
<td>6.00€</td>
</tr>
<tr>
<td>Muss de pato</td>
<td>4.00€</td>
<td>8.00€</td>
</tr>
<tr>
<td>Duo de rulo y muss de pato</td>
<td>---</td>
<td>7.00€</td>
</tr>
<tr>
<td>Talegitas de queso</td>
<td>3.50€</td>
<td>6.00€</td>
</tr>
<tr>
<td>Champiñones con alioli y jamón</td>
<td>3.50€</td>
<td>6.50€</td>
</tr>
<tr>
<td>Fideos tostados</td>
<td>---</td>
<td>4.00€</td>
</tr>
<tr>
<td>Variado de croquetas</td>
<td>---</td>
<td>11.00€</td>
</tr>
</table>
<h3>Rico rico</h3>
<table>
<tr>
<th>Nombre</th>
<th>Precio tapa</th>
<th>Precio plato</th>
</tr>
<tr>
<td>Pastel de berenjenas</td>
<td>---</td>
<td>3.50€</td>
</tr>
<tr>
<td>Timbal de arroz con chipirones y alioli</td>
<td>4.00€</td>
<td>7.50€</td>
</tr>
<tr>
<td>Gambas al ajillo</td>
<td>---</td>
<td>7.50€</td>
</tr>
<tr>
<td>Flauta de jamón york y queso</td>
<td>3.00€</td>
<td>6.00€</td>
</tr>
<tr>
<td>Saquitos de gambas y salsa de mango</td>
<td>---</td>
<td>4.80€</td>
</tr>
<tr>
<td>Medallones de solomillo. (Roque, whisky, mojo)</td>
<td>3.50€</td>
<td>6.50€</td>
</tr>
<tr>
<td>Solomillo rulo de queso y miel de caña</td>
<td>4.00€</td>
<td>7.50€</td>
</tr>
<tr>
<td>Carrillada ibérica</td>
<td>3.50€</td>
<td>7.00€</td>
</tr>
<tr>
<td>Pollo bechamel</td>
<td>3.60€</td>
<td>6.50€</td>
</tr>
<tr>
<td>Pollo kentucky</td>
<td>---</td>
<td>3.50€</td>
</tr>
</table>
<h3>Pescados</h3>
<table>
<tr>
<th>Nombre</th>
<th>Precio tapa</th>
<th>Precio plato</th>
</tr>
<tr>
<td>Chipirones</td>
<td>3.90€</td>
<td>7.50€</td>
</tr>
<tr>
<td>Pez espada</td>
<td>---</td>
<td>12.00€</td>
</tr>
<tr>
<td>Merluza confitada</td>
<td>---</td>
<td>7.50€</td>
</tr>
<tr>
<td>Bacalao confitado</td>
<td>---</td>
<td>9.00€</td>
</tr>
</table>
<h3>Carnes</h3>
<table>
<tr>
<th>Nombre</th>
<th>Precio tapa</th>
<th>Precio plato</th>
</tr>
<tr>
<td>Solomillo ibérico</td>
<td>---</td>
<td>12.00€</td>
</tr>
<tr>
<td>Presa ibérica</td>
<td>---</td>
<td>14.00€</td>
</tr>
<tr>
<td>Pluma ibérica</td>
<td>---</td>
<td>13.00€</td>
</tr>
<tr>
<td>Presa con mostaza</td>
<td>4.00€</td>
<td>8.00€</td>
</tr>
<tr>
<td>Solomillo de pavo</td>
<td>---</td>
<td>9.00€</td>
</tr>
<tr>
<td>Medallones de solomillo</td>
<td>3.50€</td>
<td>6.50€</td>
</tr>
<tr>
<td>Hamburguesa de buey</td>
<td>---</td>
<td>5.50€</td>
</tr>
<tr>
<td>Abanico ibérico</td>
<td>---</td>
<td>11.00€</td>
</tr>
<tr>
<td>Mini hamburguesa</td>
<td>---</td>
<td>2.50€</td>
</tr>
<tr>
<td>Montadito de pollo o lomo</td>
<td>---</td>
<td>2.50€</td>
</tr>
<tr>
<td>Mini de pollo o lomo</td>
<td>---</td>
<td>3.50€</td>
</tr>
<tr>
<td>Serranito</td>
<td>---</td>
<td>5.50€</td>
</tr>
<tr>
<td>Montadito de gambas con alioli</td>
<td>---</td>
<td>3.20€</td>
</tr>
</table>
<h3>Postres</h3>
<table>
<tr>
<th>Nombre</th>
<th>Precio</th>
</tr>
<tr>
<td>Gofres con nata y chocolate</td>
<td>3.50€</td>
</tr>
<tr>
<td>Tortitas americanas</td>
<td>3.80€</td>
</tr>
<tr>
<td>Tartas (Porción)</td>
<td>3.50€</td>
</tr>
<tr>
<td>Coulant con helado de vainilla</td>
<td>4.00€</td>
</tr>
</table>
<p>¿Quieres ver tu negocio localizado en Burguillos en este espacio? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a>.</p>
</content>

View File

@ -1,8 +1,8 @@
<post>
<author>Burguillos.info</author>
<date>2023-05-06T22:14+00:00</date>
<title>Carta y Menú del Pepín - Pizzería - Hamburguesería - Baguetería</title>
<ogdesc>Carta y Menú del Pepín - Pizzería - Hamburguesería - Baguetería</ogdesc>
<title>Carta y Menú de la Pizzería - Hamburguesería - Baguetería Pepín</title>
<ogdesc>Carta y Menú de la Pizzería - Hamburguesería - Baguetería Pepín</ogdesc>
<img src="/img/pepin.webp"/>
<category>donde-comer</category>
<attributes>

View File

@ -1,10 +1,10 @@
<post>
<author>Burguillos.info</author>
<date>2023-05-12T14:03+00:00</date>
<last_modification_date>2023-09-02T21:48+00:00</last_modification_date>
<last_modification_date>2023-06-06T15:06+00:00</last_modification_date>
<title>Carta y Menú de la Hamburguesería la Ermita</title>
<ogdesc>Carta y Menú de la Hamburguesería la Ermita</ogdesc>
<img src="/img/hamburgueseria-la-ermita.webp" bottom-preview="500"/>
<img src="/img/hamburgueseria-la-ermita.webp"/>
<category>donde-comer</category>
<attributes>
<attribute>hamburguesas</attribute>
@ -13,224 +13,185 @@
</attributes>
<slug>hamburgueseria-la-ermita</slug>
<content>
<h2 style="background: black; color: red;">Menú actualizado con nuevos precios y productos 2024-05-21.</h2>
<h2 style="background: black; color: red;">Ahora aceptan pedidos a domicilio.</h2>
<img width="50%" alt="Front door of 'Hamburguesería la Ermita'" style="border: solid 1px black;" src="/img/hamburgueseria-la-ermita.webp"/>
<h2>Información de contacto para preparación de pedidos.</h2>
<p>La Hamburguesería Pizzería la Ermita es una de las hamburgueserías/pizzerías más populares del pueblo,
sus hamburguesas son de una calidad excelente, los tiempos de espera para la preparación son
cortos y la comida está buenisima.</p>
<p>Siguelos en instagram <a href="https://www.instagram.com/pizzeriaburguillos/">@pizzeriaburguillos</a>
o en Tiktok <a href="https://www.tiktok.com/@hamburgueserialaermita_3">@hamburgueserialaermita_3</a>.</p>
<p>Los horarios son de martes a domingo de 20:00 a 00:00 horas.</p>
<p>(Parrafo actualizado tras la cata del equipo de Burguillos.info) La hamburguesería la Ermita es un restaurante de nueva apertura, sus hamburguesas son de una calidad excelente, los tiempos de espera para la preparación son cortos y cuídan hasta el mínimo detalle.</p>
<p>Su localización es calle Cádiz número 3 y su número de teléfono para la preparación de pedidos y envío a domicilio es <a href="tel:+34682283189">682 283 189</a>.</p>
<p>Procedemos a listar la carta.</p>
<details>
<summary><h3>Entrantes.</h3></summary>
<h3>Entrantes.</h3>
<ul>
<li>Alitas <b>3€ tapa</b>.</li>
<li>Chili Cheese Bite <b>3€ tapa</b>.</li>
<li>Fingers de mozarella <b>3€ tapa</b>.</li>
<li>Aros de cebolla <b>3€ tapa</b>.</li>
<li>Nuggets <b>3€ tapa</b>.</li>
<li>Crujientes de pollo <b>3€ tapa</b>.</li>
<li>Lagrimitas <b>3€ tapa</b>.</li>
<li>Croquetas de jamón / queso azul y cebolla caramelizada / pizza <b>3€ tapa</b>.</li>
<li>Patatas alioli <b>3€ tapa 5.50€ plato</b>.</li>
<li>Ensaladilla <b>3€ tapa 5.50€ plato</b>.</li>
<li>Croquetas caseras <b>4.50€ tapa</b>.</li>
<li>Capirote de Gambas <b>4.50€ tapa</b>.</li>
<li>Langostino Mariposa <b>4.50€ tapa</b>.</li>
<li>Delicias de Pollo Cajun <b>3.50€ tapa</b>.</li>
<li>Mini Philadelphia <b>3.50€ tapa</b>.</li>
<li>Bolitas Ibéricas <b>3.50€ tapa</b>.</li>
</ul>
</details>
<ul>
<li>Chili Cheese Bite <b>3€ tapa</b>.</li>
<li>Fingers de mozarella <b>3€ tapa</b>.</li>
<li>Aros de cebolla <b>3€ tapa</b>.</li>
<li>Nuggets <b>3€ tapa</b>.</li>
<li>Crujientes de pollo <b>3€ tapa</b>.</li>
<li>Lagrimitas <b>3€ tapa</b>.</li>
<li>Croquetas de jamón / queso azul y cebolla caramelizada / pizza <b>3€ tapa</b>.</li>
<li>Patatas alioli <b>2.50€ tapa 4€ plato</b>.</li>
<li>Ensaladilla <b>2.50€ tapa 4€ plato</b>.</li>
</ul>
<details>
<summary><h3>Pizzas.</h3></summary>
<h3>Pizzas.</h3>
<p>Todas las pizzas vienen con 2 ingredientes incluidos en el precio, puedes añadir un ingrediente extra por 0.70€ o una salsa extra por 0.50€.</p>
<p>Todas las pizzas vienen con 2 ingredientes incluidos en el precio, por 0.60€ puedes añadir un ingrediente extra o una salsa extra por 0.30€.</p>
<h4>Tamaño de pizza.</h4>
<p>Tienes la posibilidad de pedir una pizza mediana nutella por 5.50€ desde Burguillos.info suponemos que no se permiten
otros ingredientes para evitar aberraciones gastronómicas.</p>
<ul>
<li>Mediana <b>5.90€</b>.</li>
<li>Grande <b>9.50€</b>.</li>
</ul>
<h4>Tamaño de pizza.</h4>
<h4>Ingredientes disponibles.</h4>
<ul>
<li>Mediana <b>5.50€</b>.</li>
<li>Grande <b>9.00€</b>.</li>
</ul>
<ul>
<li>Jamón York</li>
<li>Bacon</li>
<li>Salchicha</li>
<li>Pepperoni</li>
<li>Roquefort</li>
<li>Jamón</li>
<li>Barbacoa</li>
<li>Atún</li>
<li>Cebolla</li>
<li>Pimientos</li>
<li>Gambas</li>
<li>Huevo</li>
<li>Aceitunas</li>
<li>Pepinillos</li>
<li>Champiñones</li>
<li>Maíz</li>
<li>Piña</li>
<li>Anchoa</li>
<li>Rulo de cabra</li>
<li>Rúcula</li>
<li>Tomate natural</li>
<li>Carbonara</li>
<li>Carne kebab</li>
<li>Pollo asado y salsa kebab</li>
<li>4 quesos</li>
</ul>
</details>
<h4>Ingredientes disponibles.</h4>
<details>
<summary><h3>Carnes.</h3></summary>
<ul>
<li>Pechuga y patatas <b>5.90€ plato</b>.</li>
<li>Solomillo (Whisky, roquefort o pimienta) <b>3.00€ tapa 7.00€ plato</b>.</li>
</ul>
</details>
<ul>
<li>Jamón York</li>
<li>Bacon</li>
<li>Salchicha</li>
<li>Pepperoni</li>
<li>Roquefort</li>
<li>Jamón</li>
<li>Barbacoa</li>
<li>Atún</li>
<li>Cebolla</li>
<li>Pimientos</li>
<li>Gambas</li>
<li>Huevo</li>
<li>Aceitunas</li>
<li>Pepinillos</li>
<li>Champiñones</li>
<li>Maíz</li>
<li>Piña</li>
<li>Anchoa</li>
<li>Rulo de cabra</li>
<li>Rúcula</li>
<li>Tomate natural</li>
<li>Carbonara</li>
<li>Carne kebab</li>
<li>Pollo asado y salsa kebab</li>
<li>4 quesos</li>
</ul>
<details>
<summary><h3>Patatas gratinadas.</h3></summary>
<h3>Bebidas.</h3>
<p>En formato pequeño cuestan 4.00€ y en formato grande 6.00€, a elegir entre las siguientes combinaciones.</p>
<ul>
<li>Refresco <b>1.50€</b></li>
<li>Cerveza de barril <b>1.80€</b></li>
<li>Pitufo (3/4) <b>1.80€</b></li>
<li>Tinto <b>1.50€</b></li>
<li>Radler <b>1.80€</b></li>
<li>Cerveza sin botellín <b>1.20€ 3/4 1.80€</b></li>
<li>Litro <b>2.20€</b></li>
<li>Agua pequeña <b>0.80€</b></li>
<li>Agua grande <b>1.20€</b></li>
<li>Zumo <b>1.00€</b></li>
<li>Café e infusión <b>1.20€</b></li>
<li>Combinado <b>4.50€</b></li>
</ul>
<ul>
<li>Alioli + queso + bacon <b>4.50€</b>.</li>
<li>Salsa cheedar + bacon + cebolla frita <b>4.50€</b>.</li>
<li>Salsa kebab + carne kebab <b>4.50€</b>.</li>
<li>Gaucha -- Salsa Gaucha, Salchicha <b>4.50€</b>.</li>
<li>Ranchera -- Salsa Ranchera, Pollo <b>4.50€</b>.</li>
<li>Patatas Bravas <b>4.50€</b>.</li>
</ul>
</details>
<h3>Helados.</h3>
<details>
<summary><h3>Patatas normales.</h3></summary>
<ul>
<li>Sandy <b>2.20€</b></li>
<li>Mini Sandy <b>1.50€</b></li>
<li>Mix Sandy <b>3.20€</b></li>
<li>Mini Mix Sandy <b>2.50€</b></li>
<li>Batido pequeño <b>2.50€</b></li>
<li>Batido grande <b>3.20€</b></li>
</ul>
<ul>
<li>Pequeñas <b>1.00€</b></li>
<li>Grandes <b>1.50€</b></li>
<li>Gajo <b>grande 1.50€</b></li>
</ul>
</details>
<h3>Bocadillos.</h3>
<details>
<summary><h3>Hamburguesas.</h3></summary>
<ul>
<li>Tortilla <b>3.00€</b></li>
<li>Cochinito <b>3.00€</b></li>
<li>Lomo adobado <b>3.00€</b></li>
<li>Bacon y queso <b>3.00€</b></li>
<li>Atún y pimiento <b>3.00€</b></li>
<li>Carne mechada y chimichurri <b>3.50€</b></li>
<li>Filete de lomo, mayonesa y lechuga <b>3.50€</b></li>
<li>Serranito de pollo o cerdo <b>4.50€</b></li>
</ul>
<p>Puedes solicitar un extra en salsa por 0.50€.</p>
<h3>Montaditos.</h3>
<ul>
<li>Solo carne <b>1.80€</b>.</li>
<li>Solo queso <b>2.30€</b>.</li>
<li>BBQ (Carne, salsa barbacoa, queso y pepinillo) <b>2.90€</b>.</li>
<li>Texas (Carne, salsa barbacoa, queso y aros de cebolla) <b>2.90€</b>.</li>
<li>Cheedar simple (Carne, salsa cheedar, tomate, cebolla frita) <b>2.90€</b>.</li>
<li>Salad (Carne, mayonesa, lechuga y tomate) <b>2.90€</b>.</li>
<li>Chicken Burguer (Mayonesa, lechuga, pollo rebozado) <b>3.00€</b>.</li>
<li>Crispi Chicken (Mayonesa, lechuga, tomate, pollo crujiente) <b>5.50€</b>.</li>
<li>Porky (Carne cerdo, bacon, salsa bacon, queso, tomate, cebolla frita) + patatas <b>6.90€</b>.</li>
<li>Campera (Pollo campero, mayonesa, lechuga, tomate, queso y bacon) + patatas <b>6.90€</b>.</li>
<li>Miel y mostaza (Carne mixta, rúcula, tomate, cebolla caramelizada, queso gouda, bacon, salsa miel y mostaza) + patatas <b>6.90€</b>.</li>
<li>La Ermita (Carne retinto, salsa barbacoa especial, tomate, cebolla frita, rulo de cabra y bacon) + patatas <b>7.90€</b>.</li>
<li>Cabrales (Carne mixta, salsa cabrales, gouda, bacon, lechuga, tomate y queso) + patatas <b>6.90€</b>.</li>
<li>Cheedar (Carne mixta o pollo empanado, salsa cheedar, cebolla frita, tomate, queso y bacon) + patatas <b>6.90€</b>.</li>
<li>Completa (Carne mixta, mayonesa, lechuga, cebolla frita, tomate, pepinillo y cebolla) + patatas <b>6.90€</b>.</li>
<li>Huevo (Carne mixta, mayonesa, lechuga, cebolla frita, tomate, queso, huevo y bacon) + patatas <b>6.90€</b>.</li>
<li>Steak (Carne mixta, mayonesa, lechuga, tomate, queso, bacon y salsa bbq) + patatas <b>6.90€</b>.</li>
<li>Cheese bacon (Carne mixta, queso, bacon, pepinillo, ketchup, mostaza y cebolla) + patatas <b>6.90€</b>.</li>
<li>Whisky (Carne Angus, salsa whisky, lechuga, tomate, rulo de cabra, cebolla caramelizada, bacon) + patatas <b>7.90€</b>.</li>
<li>Trufada (Carne mixta, mayonesa trufada, lechuga, tomate, queso, bacon, cebolla) + patatas <b>7.90€</b>.</li>
<li>Mangonesa (Carne pollo campero, mayonesa, curry y mango, lechuga, tomate, queso, bacon, cebolla caramelizada) + patatas <b>7.90€</b>.</li>
<li>Hamburguesa semanal + patatas (Sujeto a disponibilidad, unidades limitadas) <b>12€</b>.</li>
<ul>
<li>Gambas alioli <b>2.50€</b></li>
<li>Melva con pimiento <b>2.50€</b></li>
<li>Carne mechada con chimichurri <b>2.50€</b></li>
<li>Solomillo (Whisky, roquefort o pimienta) <b>2.50€</b></li>
<li>Pollo o lomo <b>2.50€</b></li>
</ul>
</ul>
</details>
<h3>Perritos.</h3>
<details>
<summary><h3>Bocadillos.</h3></summary>
<ul>
<li>Simple (Salchicha + salsa) <b>2.00€</b></li>
<li>Completo (Salchicha, cebolla frita, zanahoria, patatas paja y salsa) <b>2.50€</b></li>
</ul>
<ul>
<li>Tortilla <b>3.50€</b></li>
<li>Cochinito <b>3.20€</b></li>
<li>Lomo adobado <b>3.20€</b></li>
<li>Bacon y queso <b>3.20€</b></li>
<li>Atún y pimiento <b>3.20€</b></li>
<li>Carne mechada y chimichurri <b>3.70€</b></li>
<li>Filete de lomo, mayonesa y lechuga <b>3.90€</b></li>
<li>Serranito de pollo o cerdo <b>4.90€</b></li>
</ul>
</details>
<h3>Carnes.</h3>
<ul>
<li>Pechuga y patatas <b>5€ plato</b>.</li>
<li>Churrasco y patatas <b>5€ plato</b>.</li>
<li>Solomillo (Whisky, roquefort o pimienta) <b>3.00€ tapa 5.00€ plato</b>.</li>
</ul>
<details>
<summary><h3>Montaditos.</h3></summary>
<h3>Patatas gratinadas.</h3>
<ul>
<li>Gambas alioli <b>3.00€</b></li>
<li>Melva con pimiento <b>3.00€</b></li>
<li>Carne mechada con chimichurri <b>3.00€</b></li>
<li>Solomillo (Whisky, roquefort o pimienta) <b>3.00€</b></li>
<li>Pollo o lomo <b>3.00€</b></li>
<li>Pringa <b>3.50€</b></li>
</ul>
</details>
<p>En formato pequeño cuestan 4.00€ y en formato grande 6.00€, a elegir entre las siguientes combinaciones.</p>
<details>
<summary><h3>Perritos.</h3></summary>
<ul>
<li>Alioli + queso + bacon.</li>
<li>Salsa cheedar + bacon + cebolla frita.</li>
<li>Salsa kebab + carne kebab.</li>
</ul>
<ul>
<li>Simple (Salchicha + salsa) <b>2.20€</b></li>
<li>Completo (Salchicha, cebolla frita, zanahoria, patatas paja y salsa) <b>2.70€</b></li>
</ul>
</details>
<h3>Patatas normales.</h3>
<details>
<summary><h3>Bebidas.</h3></summary>
<ul>
<li>Pequeñas <b>1.00€</b></li>
<li>Grandes <b>1.50€</b></li>
<li>Gajo <b>grande 1.50€</b></li>
<li>Cris Criss - Cross <b>grande 2.00€</b></li>
</ul>
<ul>
<li>Refresco <b>1.50€</b></li>
<li>Cerveza de barril <b>1.40€</b></li>
<li>Tercio <b>1.50€</b></li>
<li>Tinto <b>1.50€</b></li>
<li>Radler <b>1.50€</b></li>
<li>Cerveza sin alcohol botellín <b>1.30€</b></li>
<li>Litro <b>3.00€</b></li>
<li>Agua pequeña <b>1.00€</b></li>
<li>Agua grande <b>1.50€</b></li>
<li>Zumo <b>1.20€</b></li>
<li>Combinado <b>5.00€</b></li>
</ul>
</details>
<h3>Hamburguesas.</h3>
<details>
<summary><h3>Helados.</h3></summary>
<p>Puedes solicitar un extra en salsa por 0.30€.</p>
<ul>
<li>Sandy <b>2.30€</b></li>
<li>Mix Sandy <b>3.30€</b></li>
<li>Mini Mix Sandy <b>2.60€</b></li>
<li>Batido pequeño <b>2.60€</b></li>
<li>Batido grande <b>3.30€</b></li>
</ul>
</details>
<ul>
<li>Solo carne <b>1.50€</b>.</li>
<li>Solo queso <b>2.00€</b>.</li>
<li>BBQ (Carne, salsa barbacoa, queso y pepinillo) <b>2.50€</b>.</li>
<li>Texas (Carne, salsa barbacoa, queso y aros de cebolla) <b>2.50€</b>.</li>
<li>Cheedar simple (Carne, salsa cheedar, tomate, cebolla frita) <b>2.50€</b>.</li>
<li>Salad (Carne, mayonesa, lechuga y tomate) <b>2.50€</b>.</li>
<li>Porky (Carne cerdo, bacon, salsa bacon, queso, tomate, cebolla frita) + patatas <b>6.50€</b>.</li>
<li>Roquefort (Carne mixta, salsa roquefort, lechuga, tomate, queso granapadano, bacon y cebolla frita) + patatas <b>6.50€</b>.</li>
<li>Campera (Pollo campero, mayonesa, lechuga, tomate, queso y bacon) + patatas <b>6.50€</b>.</li>
<li>Miel y mostaza (Carne mixta, rúcula, tomate, cebolla caramelizada, queso gouda, bacon, salsa miel y mostaza) + patatas <b>6.50€</b>.</li>
<li>Boletus (Carne mixta, queso gouda, bacon, champiñones y salsa boletus) + patatas <b>6.50€</b>.</li>
<li>La Ermita (Carne retinto, salsa barbacoa especial, tomate, cebolla frita, rulo de cabra y bacon) + patatas <b>7.50€</b>.</li>
<li>Cabrales (Carne mixta, salsa cabrales, gouda, bacon, lechuga, tomate y queso) + patatas <b>6.50€</b>.</li>
<li>Cheedar (Carne mixta o pollo empanado, salsa cheedar, cebolla frita, tomate, queso y bacon) + patatas <b>6.50€</b>.</li>
<li>Completa (Carne mixta, mayonesa, lechuga, cebolla frita, tomate, pepinillo y cebolla) + patatas <b>6.50€</b>.</li>
<li>Huevo (Carne mixta, mayonesa, lechuga, cebolla frita, tomate, queso, huevo y bacon) + patatas <b>6.50€</b>.</li>
<li>Steak (Carne mixta, mayonesa, lechuga, tomate, queso, bacon y salsa bbq) + patatas <b>6.50€</b>.</li>
<li>Cheese bacon (Carne mixta, queso, bacon, pepinillo, ketchup, mostaza y cebolla) + patatas <b>6.50€</b>.</li>
<li>Romana (Carne mixta, salsa bbq, lechuga, tomate, queso y aros de cebolla) + patatas <b>6.50€</b>.</li>
</ul>
<p>¿Quieres ver tu negocio localizado en Burguillos en este espacio? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a>.</p>
</content>

View File

@ -1,48 +1,42 @@
<post>
<author>Burguillos.info</author>
<date>2023-08-21T13:23+00:00</date>
<last_modification_date>2023-10-01T14:25+00:00</last_modification_date>
<title>Descubre "YoTeLoGuiso" en Burguillos y sus datos de
contacto.</title>
<ogdesc>Descubre "YoTeLoGuiso" en Burguillos y sus datos de
contacto.</ogdesc>
<img src="/img/yo-to-lo-guiso.webp" />
<title>Descubre "YoTeLoGuiso" en Burguillos y sus datos de contacto.</title>
<ogdesc>Descubre "YoTeLoGuiso" en Burguillos y sus datos de contacto.</ogdesc>
<img src="/img/yo-to-lo-guiso.webp"/>
<category>donde-comer</category>
<category>index</category>
<attributes>
<attribute>hamburguesas</attribute>
<attribute>comida-vegana</attribute>
<attribute>reparto-a-domicilio-comida</attribute>
</attributes>
<slug>yo-te-lo-guiso</slug>
<pinned>1</pinned>
<content>
<img witdh="50%" alt="Cartel 'Yo te lo guiso'"
style="border: solid 1px black"
src="/img/yo-to-lo-guiso.webp" />
<p>Con localización en Calle los Palmeros número 32, "Yo te lo
guiso" ofrece una propuesta de catering de comida al peso única
en Burguillos con sus especialidades siempre disponibles y
algunas novedades todos los días.</p>
<p>Podeis hacer encargos para recoger en tienda o envio a domicilio a
Burguillos en este número de teléfono
<img witdh="50%" alt="Cartel 'Yo te lo guiso'" style="border: solid 1px black" src="/img/yo-to-lo-guiso.webp"/>
<p>Con localización en Calle los Palmeros número 32,
"Yo te lo guiso" ofrece una propuesta de catering de
comida al peso única en Burguillos con sus especialidades
siempre disponibles y algunas novedades todos los días.</p>
<p>Podeis hacer encargos para recoger en tienda en este número de teléfono
<a href="tel:+34604424439">604 424 439</a>.</p>
<p>El envio a domicilio tan solo cuesta 1.50€ extra comparado
a comprar en el local.</p>
<p>Recuerda mirar las novedades en Instagram
<a href="https://www.instagram.com/yoteloguiso/">@yoteloguiso</a>.</p>
<p>Los horarios del negocio son de 12:00 a 15:00 y de 20:30 a 23:00 de Miercoles a Sabado.
El Domingo abre de 12:00 a 15:00.</p>
<p>El negocio además de su oferta habitual de carne y pescado ofrece
comida <b>vegana</b> y <b>vegetariana</b> siendo de los pocos negocios
en Burguillos que ofrecen este tipo de servicio. Si quieres
disfrutar de este tipo de comida llamanos con antelación para
que te podamos explicar toda nuestra carta vegana y vegetariana.</p>
<p>Los Jueves son los días del pescado, la oferta de pescado es mucho mayor esos días.
El domingo es el día del arroz.</p>
<p>Recuerda mirar las novedades en Instagram
<a href="https://www.instagram.com/yoteloguiso/">
@yoteloguiso</a>.</p>
<p>El negocio además de su oferta habitual de carne y pescado
ofrece comida <b>vegana</b> y <b>vegetariana</b> siendo de los
pocos negocios en Burguillos
que ofrecen este tipo de servicio. Si quieres disfrutar de este
tipo de comida llamanos con antelación para que te podamos
explicar toda nuestra carta vegana y vegetariana.</p>
<p>Los Jueves son los días del pescado, la oferta de pescado es
mucho mayor esos días. El domingo es el día del arroz.</p>
<p>Especialidades siempre en tienda:</p>
<ul>
<li>Pollo asado.</li>
<li>Pollo relleno.</li>
@ -50,14 +44,14 @@
<li>Empanadas y empanadillas.</li>
<li>Croquetas.</li>
<li>Ensaladas.</li>
<li>Hamburguesas veganas. (Encargar con antelación)</li>
<li>Empanidillas veganas. (Encargar con antelación)</li>
</ul>
<p>Hay una tabla de precios que puedes aplicar para la mayoría
de platos:</p>
<p>Hay una tabla de precios que puedes
aplicar para la mayoría de platos:</p>
<ul>
<li>Verduras:
<b>1.30€/100g</b>.</li>
<li>Verduras: <b>1.30€/100g</b>.</li>
<li>Tortilla: <b>1.80€/100g</b>.</li>
<li>Carnes: <b>1.30€/100g</b>.</li>
<li>Ensaladilla: <b>1.50€</b>.</li>
<li>Empanadilla: <b>2€/unidad</b>.</li>
@ -65,6 +59,7 @@
<li>Paella: <b>1.80€/100g</b>.</li>
<li>Arroz caldoso: <b>1.80€/100g</b>.</li>
</ul>
<p>¿Quieres ver tu negocio localizado en Burguillos en este espacio? Contacta con <a href="mailto:contact@owlcode.tech"> contact@owlcode.tech</a>.</p>
</content>
<p>¿Quieres ver tu negocio localizado en Burguillos en este espacio? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a>.</p>
</content>
</post>

View File

@ -3,7 +3,7 @@
<date>2023-08-24T21:37+00:00</date>
<title>Cervecería el Cañon - Cafetería la Tazza - Carta y Menú</title>
<ogdesc>Cervecería el Cañon - Cafetería la Tazza - Carta y Menú</ogdesc>
<img src="/img/tazza.webp" bottom-preview="470"/>
<img src="/img/tazza.webp"/>
<category>donde-comer</category>
<attributes>
<attribute>hamburguesas</attribute>
@ -12,7 +12,13 @@
<content>
<img witdh="50%" alt="Puerta de la Tazza" style="border: solid 1px black" src="/img/tazza.webp"/>
<p>La Cervecería el Cañon, ubicado en Calle el Castaño número 29, también conocido como Cafetería la Tazza además de su oferta habitual de desayunos como ya sabréis añadió un catalogo de comidas y tapas. ¡Y están riquísimas!</p> <p>Actualmente tiene un horario de verano donde algunas tardes permanece cerrado, informaremos cuando tengamos todos los datos.</p>
<p>La Cervecería el Cañon, ubicado en Calle el Castaño número 29,
también conocido como Cafetería la Tazza
además de su oferta habitual de desayunos como ya sabréis
añadió un catalogo de comidas y tapas. ¡Y están riquísimas!</p>
<p>Actualmente tiene un horario de verano donde algunas tardes
permanece cerrado, informaremos cuando tengamos todos los datos.</p>
<p>Os adjunto la carta para que la tengáis siempre disponible:</p>
@ -173,7 +179,7 @@
<td>4.50€</td>
</tr>
</table>
<h3>Carnes</h3>
<table>

View File

@ -1,25 +0,0 @@
<post>
<author>Sergio Iglesias (Lead Developer.)</author>
<date>2023-09-05T11:02:00+00:00</date>
<title>Mejoras en Burguillos.info.</title>
<ogdesc>Mejoras en Burguillos.info.</ogdesc>
<category>index</category>
<img src="/img/burguillos-front.webp"/>
<slug>mejoras-burguillos-info</slug>
<content>
<img style="border: 1px black solid;" src="/img/burguillos-new-logo.svg" alt=""/>
<p>Desde los albores de Burguillos.info nuestro objetivo ha sido tratar de ofrecer lo mejor a nuestro alcance a nuestros usuarios.</p>
<p>Ha sido una larga travesía y hemos descubierto muchas cosas por el camino que pueden mejorar vuestra experiencia en la página.</p>
<p>Una de las cosas más obvias que tardamos en descubir es que por muy bien que esté estructurada la página a los usuarios nos da vertigo navegar por lo
desconocido buscando lo que queremos.</p>
<p>Es por ello que nos pusimos manos a la obra y creamos un buscador donde ahora sí podéis buscar directamente el nombre de vuestros platos favoritos, restaurantes, tipo de establecimiento y directamente obtener el resultado que buscáis.</p>
<p>Debido a que navegar por internet suele despertar de igual manera ese miedo a lo desconocido hemos creado también una aplicación de Android de Burguillos.info que si usáis Android os saldrá promocionada en la parte superior de la página.</p>
<p>Todo esto con un único objetivo, continuar ofreciendo la mejor experiencia posible a los burguilleros en internet y en nuestra nueva aplicación.</p>
</content>
</post>

View File

@ -1,22 +0,0 @@
<post>
<author>Burguillos.info</author>
<date>2023-09-07T16:11:00+00:00</date>
<title>Farmacia de Guardia en Burguillos.</title>
<ogdesc>Farmacia de Guardia en Burguillos.</ogdesc>
<img src="/img/farmacia.webp"/>
<category>index</category>
<slug>farmacia-guardia</slug>
<pinned>100</pinned>
<content>
<img alt="Imagen de cruz de Farmacia" src="/img/farmacia.webp"/>
<p>La farmacia de guardia esta semana es:</p>
<ul>
<li>Nombre: <b id="farmacia-name"></b></li>
<li>Dirección: <b id="farmacia-address"></b></li>
</ul>
<p><small>Este artículo se rellena automáticamente con los datos de la Farmacia de Guardia, tu navegador o móvil debe soportar Javascript para que funcione.</small></p>
</content>
</post>

View File

@ -1,73 +0,0 @@
<post>
<author>Burguillos.info</author>
<date>2023-09-07T19:49:00+00:00</date>
<title>Teléfonos de interés de Burguillos.</title>
<ogdesc>Teléfonos de interés de Burguillos.</ogdesc>
<img src="/img/ayuntamiento.webp"/>
<category>index</category>
<slug>telefono-interes-burguillos</slug>
<pinned>100</pinned>
<content>
<img alt="Imagen del ayuntamiento" src="/img/ayuntamiento.webp"/>
<p>Os compartimos un listado de números de teléfono que os pueden hacer falta durante tu estancia en Burguillos:</p>
<p>Teléfono del Ayuntamiento de Burguillos: <b><a href="tel:+34955738125">955 738 125</a></b> dirección: <b>Plaza de la Constitución Española 1</b></p>
<p>Teléfono del Juzgado de paz y registro civil de Burguillos: <b><a href="tel:+34955738820">955 738 820</a></b> dirección: <b>Calle Francisco Hernández sin número</b></p>
<p>Teléfono de los Servicios Sociales de Burguillos: <b><a href="tel:+34955738125">955 738 125</a></b> dirección: <b>Calle Real sin número</b></p>
<p>Teléfono de Consultorio - Centro de salud Nuestra Señora de los Dolores de Burguillos: <b><a href="tel:+34955738612">955 738 612</a></b> dirección: <b>Calle Juan Carlos I sin número</b></p>
<p>Teléfono de Farmacia Cruz de la Ermita de Burguillos: <b><a href="tel:+34955738822">955 738 822</a></b> dirección: <b>Avenida Cruz de la Ermita/José Cuesta Godoy número 98</b></p>
<p>Teléfono de Farmacia Óptica Morera de Burguillos: <b><a href="tel:+34955738413">955 738 413</a></b> dirección: <b>Calle Virgen del Rosario número 13</b></p>
<p>Teléfono de Policía Local de Burguillos: <b><a href="tel:+34955738237">955 738 237</a></b> dirección: <b>Calle Gustavo Adolfo Bécquer sin número</b></p>
<p>Teléfono de Guardia civil puesto Alcalá del Río: <b><a href="tel:+34955651111">955 651 111</a></b> dirección: <b>Calle de San Ignacio número 2</b></p>
<p>Teléfono de Bomberos: <b><a href="tel:+34085">085</a></b>.</p>
<p>Teléfono de Autocares "El Teniente": <b><a href="tel:+34955131904">955 131 904</a></b> dirección: <b>Avenida de los Trabajadores número 31</b></p>
<p>Teléfono Autobuses Damas <b><a href="tel:+34902114492">902 114 492</a></b>.</p>
<p>Teléfono de Taxi Mariano Ballesteros Hidalgo en Burguillos <b><a href="tel:+34605924032">605 924 032</a></b> dirección: <b>Calle Sol número 10 bajo</b>.</p>
<p>Teléfono de Oficina de empleo San José de la Rinconada <b><a href="tel:+34955656671">955 656 671</a></b> dirección: <b>Calle Virgen del Pilar</b>.</p>
<p>Teléfono de Correos en Burguillos <b><a href="tel:+34955738338">955 738 338</a></b> dirección: <b>Calle Real número 19</b>.</p>
<p>Dirección de Centro Cultural Carmen Laffon <b>Calle Real número 2</b>.</p>
<p>Dirección de Centro de día para la tercera edad <b>Calle Real número 1</b>.</p>
<p>Teléfono de Guardería municipal <b><a href="tel:+34685850286">685 850 286</a></b> dirección: <b>Calle Concepción de Osuna 4c</b>.</p>
<p>Teléfono de CEIP Ágora <b><a href="tel:+34854560610">854 560 610</a></b> dirección: <b>Calle Alfonso X el Sabio sin número</b>.</p>
<p>Teléfono de CEIP Manuel Medina <b><a href="tel:+34955739905">955 739 905</a> o <a href="tel:+34955739907">34955739907</a></b> dirección: <b>Calle Concepción de Osuna, sin número.</b></p>
<p>Teléfono del IES Burguillos <b><a href="tel:+34955739585">955 739 585</a></b> dirección: Calle Albahaca sin número.</p>
<p>Teléfono Centro de educación para personas adultas SEPER "La Madroña" en Burguillos <b><a href="tel:+34955739623">955 739 623</a></b> dirección: <b>Calle Real número 2, edificio Carmen Laffon, planta baja</b>.</p>
<p>Teléfono del Centro TAS Burguillos <b><a href="tel:+34722132604">722 132 604</a></b> atendido martes en horario de mañana por Rosa dirección <b>Calle Romero, número 1, módulo D</b> email: <a href="mailto:tasburguillos@fundaciontas.org">tasburguillos@fundaciontas.org</a>.</p>
<p>Teléfono del Aula Periferia <b><a href="tel:+34695240441">695 240 441</a></b> dirección: <b>Calle Gustavo Adolfo Bécquer sin número.</b>.</p>
<p>Teléfono de la Caixa <b><a href="tel:+34954868121">954 868 121</a></b> dirección: <b>Calle Real, número 11</b>.</p>
<p>Teléfono del Santander (Popular) <b><a href="tel:+34955738300">955 738 300</a></b> dirección: <b>Calle Real número 37</b>.</p>
<p>Teléfono de la Caja Rural <b><a href="tel:+34955738437">955 738 437</a></b> dirección: <b>Avenida Andalucía número 29</b>.</p>
<p>Dirección de Cáritas parroquial <b>Calle Concepción de Osuna número 4</b>.</p>
<p>Teléfono de Mancomunidad de Servicios de la Vega <b><a href="tel:+34955111140">955111140</a></b> dirección: <b>Plaza España número 1</b>.</p>
<p>Teléfono de Tanatorio y servicios funerarios <b><a href="tel:+34954103023">954 103 023</a> y <a href="tel:+34635357646">635 357 646</a></b>. dirección: <b>Calle Juan de la Cieva, 14, Polígono Industrial El Estanquillo</b>.</p>
</content>
</post>

View File

@ -1,22 +0,0 @@
<post>
<author>Burguillos.info</author>
<date>2023-09-08T00:26:00+00:00</date>
<title>Código fuente de Burguillos.info.</title>
<ogdesc>Código fuente de Burguillos.info.</ogdesc>
<img src="/img/git.webp"/>
<category>index</category>
<slug>codigo-fuente</slug>
<content>
<img alt="" src="/img/git.webp"/>
<p>Todo el código que soporta Burguillos.info es software libre bajo los terminos de la licencia AGPLv3, en los siguientes enlaces compartimos toda la infraestructura de código que usamos hasta ahora, si tienes alguna duda contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a>.</p>
<ul>
<li>Código de la web <a href="https://git.owlcode.tech/sergiotarxz/burguillos.info">https://git.owlcode.tech/sergiotarxz/burguillos.info</a>. Perl/JavaScript/SASS/Webpack/XML/Mojolicious</li>
<li>Código del buscador <a href="https://git.owlcode.tech/sergiotarxz/burguillos.info.search">https://git.owlcode.tech/sergiotarxz/burguillos.info.search</a>. Java/Spring/Lucene</li>
<li>Código de la aplicación de Android <a href="https://git.owlcode.tech/sergiotarxz/BInfoAndroid">https://git.owlcode.tech/sergiotarxz/BInfoAndroid</a>. Gradle/Java</li>
</ul>
<p>Si quieres tener una web como Burguillos.info pero no sabes por donde empezar a implementarla te recomendamos contactar con Owlcode.tech y contratar sus servicios.</p>
</content>
</post>

View File

@ -1,33 +0,0 @@
<post>
<author>Burguillos.info</author>
<date>2023-09-09T21:53+00:00</date>
<title>Taebe Kim Zumba en Burguillos</title>
<ogdesc>Taebe Kim Zumba en Burguillos</ogdesc>
<img src="/img/zumba.webp" bottom-preview="600"/>
<category>actividades-deportivas</category>
<attributes>
<attribute>danza</attribute>
</attributes>
<slug>zumba-taebe-kim</slug>
<content>
<img width="50%" alt="Cartel zumba Taebe Kim (Contenido transcrito en artículo)" style="border: solid 1px black;" src="/img/zumba.webp"/>
<p>Ya ha vuelto tras el descanso de verano la Zumba para Adultos Taebe Kim, localizada en Calle Antonio Machado número 3.</p>
<p>Esta actividad deportiva de danza se realiza todos los lunes, miercoles y jueves a las 20:00.</p>
<p>El número de teléfono de contacto es <a href="tel:+34615085276">615 085 276</a>.</p>
<p>Puedes visitar su Instagram en <a href="https://www.instagram.com/sandra.martin37zumba">@sandra.martin37zumba</a>.</p>
<p>Además los martes y los jueves se realiza zumba para los más pequeños de 18:30 a 19:30.</p>
<p>La Zumba es un tipo de danza que ejercita tu cuerpo mientras te lo pasas bien, además de ayudarte a convertirte en el rey/reina de la fiesta o de las redes sociales con bailes entretenidos también te puede ayudar a mantenerte saludable y alcanzar tu peso ideal.</p>
<p>Además es una oportunidad perfecta de hacer nuevas amistades o fortalezer vínculos ya existentes.</p>
<p>No dejes pasar la oportunidad, apuntaté ya.</p>
<p>¿Quieres ver tu negocio localizado en Burguillos en este espacio? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a>.</p>
</content>
</post>

View File

@ -1,31 +0,0 @@
<post>
<author>Burguillos.info</author>
<date>2023-09-09T21:53+00:00</date>
<title>Taebe Kim Taekwondo en Burguillos</title>
<ogdesc>Taebe Kim Taekwondo en Burguillos</ogdesc>
<img src="/img/taekwondo.webp"/>
<category>actividades-deportivas</category>
<attributes>
<attribute>artes-marciales</attribute>
</attributes>
<slug>taekwondo-taebe-kim</slug>
<content>
<img width="50%" alt="Cartel taekwondo Taebe Kim (Contenido transcrito en artículo)" style="border: solid 1px black;" src="/img/taekwondo.webp"/>
<p>El Taekwondo Taebe Kim con teléfono <a href="tel:+34645825467">645 825 467</a> y localizado en Calle Antonio Machado número 3 ofrece una increíble oportunidad para aprender Taekwondo formado por el profesor Benito, Técnico Deportivo y Maestro Nacional de Taekwondo, Cinturon Negro 4° DAN.</p>
<p>Entre los beneficios del Taekwondo se encuentran los siguientes:</p>
<ul>
<li>Flexibilidad</li>
<li>Disciplina</li>
<li>Coordinación</li>
<li>Concentración</li>
<li>Defensa personal</li>
</ul>
<p>Recuerda exigir <b>deporte federado</b> que por supuesto Taebe Kim provee.</p>
<p>¿Quieres ver tu negocio localizado en Burguillos en este espacio? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a>.</p>
</content>
</post>

View File

@ -1,33 +0,0 @@
<post>
<author>Burguillos.info</author>
<date>2023-09-11T10:08+00:00</date>
<title>Taebe Kim - Clases de Yoga en Burguillos</title>
<ogdesc>Taebe Kim - Clases de Yoga en Burguillos</ogdesc>
<img src="/img/yoga.webp" bottom-preview="400"/>
<category>actividades-deportivas</category>
<slug>yoga-taebe-kim</slug>
<content>
<img width="50%" alt="Cartel yoga Taebe Kim (Contenido transcrito en artículo)" style="border: solid 1px black;" src="/img/yoga.webp"/>
<p>Damos la bienvenida a este directorio a las clases de Yoga de Taebe Kim, localizadas en
Calle Antonio Machado número 3, y con horario de mañana a las 10:00.</p>
<p>Contacta a este número de teléfono si tienes interés en participar <a href="tel:+34615085276">615 085 276</a>.</p>
<p>Tu momento es ahora...</p>
<p>Por si tienes indecisión te listamos los siguientes beneficios del Yoga:</p>
<ul>
<li>Correción postural.</li>
<li>Fortalece músculos.</li>
<li>Aumenta flexibilidad y elasticidad.</li>
<li>Mejora la concentración y relajación.</li>
<li>Alivia dolor articular y de espalda.</li>
</ul>
<p>¡Cuida tu cuerpo y mente!</p>
<p>¿Quieres ver tu negocio localizado en Burguillos en este espacio? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a>.</p>
</content>
</post>

View File

@ -1,93 +0,0 @@
<post>
<author>Burguillos.info</author>
<date>2023-09-21T09:11+00:00</date>
<title>Carta y menú de Bar el Polígono.</title>
<ogdesc>Carta y menú de Bar el Polígono.</ogdesc>
<img src="/img/bar-poligono.webp" bottom-preview="600"/>
<category>donde-comer</category>
<attributes>
<attribute>hamburguesas</attribute>
<attribute>reparto-a-domicilio-comida</attribute>
</attributes>
<slug>bar-poligono</slug>
<content>
<h2 style="background: black; color: red;">Cerrado permanentemente.</h2>
<img witdh="50%" alt="Puerta de la Bar el Poligono" style="border: solid 1px black" src="/img/bar-poligono.webp"/>
<p>El bar el polígono es un negocio de nueva apertura localizado en Calle Tomás Alba Edison número 8 donde antes se encontraba el Bar el Chori II.</p>
<p>Los horarios de mañana es lunes a viernes de 05:30 a 18:00 y en fines de semana de 07:00 a 16:00, el horario nocturo y de envios a domicilio es
de jueves a domingo de 20:00 a 00:00</p>
<p>El teléfono de contacto <a href="tel:+34651611938">651 611 938</a>.</p>
<p>La carta actualizada con fecha 21 de Septiembre de 2023 luce bastante prometedora y procedemos a compartirla por vosotros.</p>
<h2>Hamburguesas</h2>
<ul>
<li>Simple (Carne y queso) Precio: <b>1.50€</b></li>
<li>Gustosa (Carne, queso, lechuga, tomate y cebolla) Precio: <b>2.80€</b></li>
<li>Diferente (Doble carne, queso, huevo, cebolla y bacon) Precio: <b>3.80€</b></li>
<li>Buey (Carne, queso, bacon, lechuga, tomate y cebolla) Precio: <b>5.00€</b></li>
<li>Crujiente (Pollo, queso, lechuga, tomate y cebolla) Precio: <b>3.80€</b></li>
<li>Pollo (Pollo, lechuga, cebolla, tomate y queso) Precio: <b>2.50€</b></li>
</ul>
<h2>Chucasos</h2>
<ul>
<li>Cochino Precio: <b>3.00€</b></li>
<li>Lomo adobado Precio: <b>3.00€</b></li>
<li>Bacon/queso Precio: <b>3.00€</b></li>
<li>Vegetal y pollo Precio: <b>4.00€</b></li>
<li>Tortilla york y queso Precio: <b>3.50€</b></li>
<li>Pollo Precio: <b>3.50€</b></li>
<li>Hamburguesa Precio: <b>3.50€</b></li>
<li>Serranito de pollo o lomo Precio: <b>5.00€</b></li>
</ul>
<h2>Ensaladas</h2>
<ul>
<li>Normal Precio: <b>3.50€</b></li>
<li>Ensaladilla Precio: <b>3.00€</b></li>
<li>Papas alioli Precio: <b>3.00€</b></li>
<li>Salpicón de Mariscos Precio: <b>3.50€</b></li>
</ul>
<h2>Tapas</h2>
<ul>
<li>Plato de papas Precio: <b>2.50€</b></li>
<li>Papas bravas Precio <b>3.00€</b></li>
<li>Papas gratinadas Precio <b>4.00€</b></li>
<li>Carne con tomate Precio <b>3.50€</b></li>
<li>Carne asada Precio <b>4.00€</b></li>
<li>Tocinito frito Precio <b>4.00€</b></li>
<li>Solomillo al whisky Precio <b>4.50€</b></li>
<li>Churrasco de cerdo Precio <b>4.50€</b></li>
<li>Churrasco de pollo Precio <b>4.50€</b></li>
</ul>
<h2>Pescados</h2>
<ul>
<li>Chipirón plancha Tapa: <b>3.50€</b> Ración: <b>7.50€</b></li>
<li>Calamares fritos Tapa: <b>3.50€</b> Ración: <b>7.50€</b></li>
<li>Boquerones fritos Tapa: <b>3.00€</b> Ración: <b>6.00€</b></li>
<li>Frito variado Tapa: <b>4.50€</b> Ración: <b>10.00€</b></li>
</ul>
<h2>Montaditos</h2>
<ul>
<li>Pollo Precio: <b>3.00€</b></li>
<li>Lomo Precio: <b>3.00€</b></li>
<li>Gambas alioli Precio: <b>3.00€</b></li>
<li>Caballa pimiento morrón Precio: <b>3.00€</b></li>
</ul>
<p>¿Quieres ver tu negocio localizado en Burguillos en este espacio? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a>.</p>
</content>
</post>

View File

@ -1,43 +0,0 @@
<post>
<author>Burguillos.info</author>
<date>2023-09-19T06:00+00:00</date>
<title>Meraki - Arte de uñas y belleza.</title>
<ogdesc>Meraki - Arte de uñas y belleza.</ogdesc>
<img src="/img/meraki.webp" bottom-preview="525"/>
<category>estetica</category>
<attributes>
<attribute>belleza-manos</attribute>
</attributes>
<slug>arte-belleza-unas-meraki</slug>
<content>
<img witdh="50%" alt="Cartel de uñas meraki, transcrito en el artículo." style="border: solid 1px black" src="/img/meraki.webp"/>
<h2>Hazte las uñas en Meraki - Nails Art and Beauty.</h2>
<p>Meraki - Nails Art and Beauty localizado en Avenida de Pepe Luna Local 2 con teléfono <a href="tel:+34674021960">674 021 960</a>
es el lugar perfecto para que puedas explotar al máximo la belleza de tus uñas.</p>
<p>Visita su Tiktok <a href="https://www.tiktok.com/@sonialopeznails">@sonialopeznails</a> o su Instagram <a href="https://www.instagram.com/sonialopeznails/">@sonialopeznails</a>
para ver ejemplos de las creaciones de este negocio en cuanto a estética de uñas.</p>
<p>Meraki - Nails Art and Beauty ofrece los siguientes tipos de tratamientos:</p>
<ul>
<li>Uñas acrílicas o esculpidas.</li>
<li>Técnicas nuevas Gelx y Acrigel.</li>
<li>Decoraciones varias.</li>
<li>Manicura rusa semipermanente.</li>
<li>Parafina manos y pies.</li>
<li>Semipermanente con refuerzo.</li>
<li>Pedicura Spa y esmaltado.</li>
<li>Masajes relajantes y anti estrés.</li>
<li>Tratamientos faciales y corporales.</li>
<li>Depilación laser.</li>
<li>Depilación cera.</li>
<li>Microblading.</li>
<li>Extensiones de pestañas.</li>
</ul>
<p>¿Quieres ver tu negocio localizado en Burguillos en este espacio? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a>.</p>
</content>
</post>

View File

@ -1,34 +0,0 @@
<post>
<author>Burguillos.info</author>
<date>2023-09-20T09:11+00:00</date>
<title>Lo&amp;La - Tienda de Ropa y Accesorios en Burguillos.</title>
<ogdesc>Lo&amp;La - Tienda de Ropa y Accesorios en Burguillos.</ogdesc>
<img src="/img/lola-ropa.webp" bottom-preview="700"/>
<category>tiendas-ropa</category>
<slug>lo-la-ropa-accesorios</slug>
<content>
<img witdh="50%" alt="Puerta principal de Lo&amp;La." style="border: solid 1px black" src="/img/lola-ropa.webp"/>
<h2>Compra ropa y accesorios para sorprender a todos en Lo&amp;La.</h2>
<p>La tienda Lo&amp;La localizado en Calle Virgen del Rosario número 14 - bajo - local 4 con teléfono de contacto <a href="tel:+34955198322">955 198 322</a>
es un lugar ideal para comprar ropa y accesorios con los que deslumbrar a todos tus conocidos.</p>
<p>Ofrece los siguientes tipos de productos:</p>
<ul>
<li>Lencería.</li>
<li>Ropa de hogar.</li>
<li>Ropa de bebe.</li>
<li>Ropa de caballero.</li>
<li>Ropa de señora.</li>
<li>Complementos de señora.</li>
<li>Complementos de caballero.</li>
<li>Productos para la vuelta al cole.</li>
</ul>
<p>No lo dudes, compra en negocios locales, compra en Lo&amp;La.</p>
<p>¿Quieres ver tu negocio localizado en Burguillos en este espacio? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a>.</p>
</content>
</post>

View File

@ -1,95 +0,0 @@
<post>
<author>Burguillos.info</author>
<date>2023-09-21T10:33+00:00</date>
<title>Carta y menú de Bar Coripe.</title>
<ogdesc>Carta y menú de Bar Coripe.</ogdesc>
<img src="/img/bar-coripe.webp" bottom-preview="630"/>
<category>donde-comer</category>
<attributes>
</attributes>
<slug>bar-coripe</slug>
<content>
<img witdh="50%" alt="Puerta de la Bar Coripe" style="border: solid 1px black" src="/img/bar-coripe.webp"/>
<p>Localizado en Calle Sevilla número 4, dentro de la Ermita, el Bar Coripe es un lugar
perfecto para tomar un refrigerio y comer algo.</p>
<p>Procedemos a listaros la carta:</p>
<table>
<tr>
<th>Plato</th>
<th>Tapa</th>
<th>Ración</th>
</tr>
<tr>
<td>Carne Asá</td>
<td>3.00€</td>
<td>6.00€</td>
</tr>
<tr>
<td>Tocinito</td>
<td>3.00€</td>
<td>6.00€</td>
</tr>
<tr>
<td>Lagrimitas</td>
<td>3.00€</td>
<td>6.00€</td>
</tr>
<tr>
<td>Alitas</td>
<td>3.00€</td>
<td>6.00€</td>
</tr>
<tr>
<td>Croquetas</td>
<td>3.00€</td>
<td>6.00€</td>
</tr>
<tr>
<td>Bartolito</td>
<td>3.00€</td>
<td>---</td>
</tr>
<tr>
<td>Boquerón</td>
<td>3.00€</td>
<td>6.00€</td>
</tr>
<tr>
<td>M.P. Empanado</td>
<td>3.00€</td>
<td>---</td>
</tr>
<tr>
<td>Bravas</td>
<td>2.00€</td>
<td>4.00€</td>
</tr>
<tr>
<!-- Esto que eh? -->
<td>H. Pollo</td>
<td>3.00€</td>
<td>---</td>
</tr>
<tr>
<td>Filete de pollo empanado</td>
<td>3.00€</td>
<td>---</td>
</tr>
<tr>
<td>Calamares</td>
<td>3.00€</td>
<td>6.00€</td>
</tr>
<tr>
<td>S.P. Empanado</td>
<td>4.50€</td>
<td>---</td>
</tr>
</table>
<p>¿Quieres ver tu negocio localizado en Burguillos en este espacio? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a>.</p>
</content>
</post>

View File

@ -1,30 +0,0 @@
<post>
<author>Burguillos.info</author>
<date>2023-09-25T19:56+00:00</date>
<title>Restaurante Casa Luis Burguillos</title>
<ogdesc>Restaurante Casa Luis Burguillos</ogdesc>
<img src="/img/casa-luis.webp"/>
<category>donde-comer</category>
<attributes>
</attributes>
<slug>restaurante-casa-luis</slug>
<content>
<img witdh="50%" alt="Puerta del restaurante Casa Luis" style="border: solid 1px black" src="/img/casa-luis.webp"/>
<p>¿Buscas un buen lugar para comer en Burguillos? No busques más, Restaurante Casa Luis en Burguillos ofrece unas comidas completamente excepcionales.</p>
<p>La carta cambia con demasiada frecuencia para mantenerla en esta página; no obstante os
dejamos la lista de sugerencias para que se os haga la boca agua.</p>
<ul>
<li>Gambón plancha.</li>
<li>Albondigas de carrilla.</li>
<li>Perdiz en salsa.</li>
<li>Montadito de berenjena.</li>
<li>Queso rulo.</li>
<li>Redondo de solomillo.</li>
</ul>
<p>¿Quieres ver tu negocio localizado en Burguillos en este espacio? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a>.</p>
</content>
</post>

View File

@ -1,22 +0,0 @@
<post>
<author>Burguillos.info</author>
<date>2023-09-28T08:37+00:00</date>
<title>Nunca fui Gloria - Productos artesanales en Burguillos</title>
<ogdesc>Nunca fui Gloria - Productos artesanales en Burguillos</ogdesc>
<img src="/img/nunca-fui-gloria.webp" bottom-preview="500"/>
<category>artesania</category>
<slug>nunca-fui-gloria</slug>
<content>
<img witdh="50%" alt="Logo nunca-fui-gloria." style="border: solid 1px black" src="/img/nunca-fui-gloria.webp"/>
<h2>Compra productos artesanos en Burguillos.</h2>
<p>Nunca fui Gloria ofrece una amplia oferta de productos artesanales y de artesanía, entre ellos <a href="https://sites.google.com/view/nuncafuigloria/inicio/pendientes">pendientes</a>, <a href="https://sites.google.com/view/nuncafuigloria/inicio/collares">collares</a>, <a href="https://sites.google.com/view/nuncafuigloria/inicio/cuencos">cuencos</a> y <a href="https://sites.google.com/view/nuncafuigloria/inicio/otros">otros</a>.</p>
<p>Visita su <a href="https://sites.google.com/view/nuncafuigloria/">web</a> e <a href="https://www.instagram.com/nuncafuigloria/">Instagram</a> para más información.</p>
<p>Puedes encontrar los productos de Nunca fuí Gloria en el local de la Gallina Costurera localizado Avenida Pepe Luna.</p>
<p>¿Quieres ver tu negocio localizado en Burguillos en este espacio? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a>.</p>
</content>
</post>

View File

@ -1,47 +0,0 @@
<post>
<author>Burguillos.info</author>
<date>2023-09-28T09:59+00:00</date>
<title>Baby Parks - Donde celebrar cumpleaños en Burguillos.</title>
<ogdesc>Baby Parks - Donde celebrar cumpleaños en Burguillos.</ogdesc>
<img src="/img/baby-parks.webp" bottom-preview="500"/>
<category>celebraciones</category>
<slug>baby-parks</slug>
<content>
<img witdh="50%" alt="Fotografía baby park" style="border: solid 1px black" src="/img/baby-parks.webp" bottom-preview="500"/>
<h2>¿Aun no sabes donde celebrar el cumpleaños de tu hijo o nieto?</h2>
<p>El Baby Parks, localizado en Calle los Almendros número 2 local c, es un lugar que puedes alquilar y tiene todo lo necesario para que tanto los peques como los mayores se lo puedan pasar bomba.</p>
<p>Contacta al teléfono <a href="tel:+34698902365">698 902 365</a> para reservar o más información.</p>
<p>Los precios son:</p>
<ul>
<li>Lunes a Jueves: 50€</li>
<li>Viernes a domingo y festivos: 75€</li>
</ul>
<p>La infraestructura para adultos incluye:</p>
<ul>
<li>Barra.</li>
<li>Botellero.</li>
<li>Arcón congelador.</li>
<li>Cafetera.</li>
<li>Microondas.</li>
<li>Sandwichera.</li>
<li>Equipo de sonido.</li>
</ul>
<p>Y para los peques:</p>
<ul>
<li>Pista americana.</li>
<li>Cama elástica.</li>
<li>Baby park.</li>
</ul>
<p>¿Quieres ver tu negocio localizado en Burguillos en este espacio? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a>.</p>
</content>
</post>

View File

@ -1,20 +0,0 @@
<post>
<author>Burguillos.info</author>
<date>2023-10-25T11:12+00:00</date>
<title>Alimentación Las Niñas.</title>
<ogdesc>Alimentación Las Niñas.</ogdesc>
<img src="/img/las-ninas.webp" bottom-preview="750"/>
<category>tiendas-alimentacion</category>
<slug>alimentacion-las-niñas</slug>
<content>
<img width="50%" alt="Front door of 'Alimentación Las Niñas'" style="border: solid 1px black;" src="/img/las-ninas.webp"/>
<p>Localizado en Calle los Palmeros número 34 Alimentación las Niñas es una tienda con variedad de genero en la categoría de alimentación y cuidado del hogar con servicio de pan y charcutería.</p>
<p>Puedes dejar tu pedido encargado para recoger en tienda en el siguiente teléfono <a href="tel:+34664090788">664 090 788</a>.</p>
<p>No te lo pienses, compra local, compra en Burguillos.</p>
<p>¿Quieres ver tu negocio localizado en Burguillos en este espacio? Contacta con <a href="mailto:contact@owlcode.tech">contact@owlcode.tech</a>.</p>
</content>
</post>

View File

@ -1,31 +0,0 @@
<post>
<author>Burguillos.info</author>
<date>2022-12-02T12:56+00:00</date>
<title>Burguillos Dental - Dentista en Burguillos.</title>
<ogdesc>Burguillos Dental - Dentista en Burguillos.</ogdesc>
<category>dentistas</category>
<slug>burguillos-dental</slug>
<img src="/img/burguillos-dental.webp"/>
<content>
<img alt="" src="/img/burguillos-dental.webp"/>
<h2>Hazte tu aparato dental/ortodoncia invisible en Burguillos Dental.</h2>
<p>Burguillos Dental, ubicado en la <a href="/posts/centro-medico-juan-manuel-perez-sanchez">Clínica Juan Manuel Pérez Sánchez</a> poseé un equipo de odontologos y dentistas altamente cualificados.</p>
<p>Ofrecen los siguientes servicios para el cuidado de tu boca:</p>
<ul>
<li>Odontologia general.</li>
<li>Ortodoncia.</li>
<li>Ortodoncia Invisible.</li>
<li>Odontopediatria.</li>
<li>Estetica Dental y Labios.</li>
<li>Protesis y Aparatos Dentales, Implantes.</li>
<li>Plan de atención infantil de la Junta de Andalucía.</li>
<li>Radiografías Panorex-Teleradiografía.</li>
</ul>
<p>Cita previa en <a href="tel:+34635061176">635061176</a> o <a href="mailto:policlinicaburguillos@gmail.com">policlinicaburguillos@gmail.com</a>.</p>
<p>Localizado en Calle la Fuente número 24.</p>
</content>
</post>

@ -1 +0,0 @@
Subproject commit ae2bd63d8fbf93b8bb2a2fa9cc16405a16d0223d

View File

@ -1,171 +0,0 @@
export interface Ad {
img: string,
text: string
href: string
seconds: number
}
export default class CarouselAd {
private currentAdNumber: number | null = null
private ad: Ad | null = null
private timeoutNumber: number | null = null
private firstAd = true
private isLockedSwipe: boolean = false
private getCarousel(): HTMLElement {
const carousel = document.querySelector('.carousel');
if (carousel === null || !(carousel instanceof HTMLElement)) {
this.noMoreAds()
CarouselAd.fail('No carousel.')
}
return carousel
}
static fail(error: string): never {
throw new Error(error)
}
public async run(): Promise<void> {
this.loadOneAd()
try {
let start = 0
let end = 0
this.getCarousel().addEventListener('pointerdown', (event: MouseEvent) => {
start = event.pageX
console.log(start)
})
this.getCarousel().addEventListener('pointerup', (event: MouseEvent) => {
end = event.pageX
console.log(end)
if (start - end > 100) {
if (this.isLockedSwipe) {
return
}
if (this.timeoutNumber !== null) {
window.clearTimeout(this.timeoutNumber)
}
this.loadOneAd()
} else {
const a = this.retrieveLinkCarousel()
if (a !== null) {
window.location.href = a.href
}
}
})
} catch (e) {
console.log(e)
return
}
}
private noMoreAds() {
const carousel = this.getCarousel()
if (carousel !== null) {
carousel.remove();
}
this.expandPageContents();
if (this.timeoutNumber === null) {
return
}
window.clearTimeout(this.timeoutNumber)
}
private expandPageContents() {
const pageContents = document.querySelector('div.page-contents');
if (pageContents === null) {
return;
}
pageContents.classList.add('no-carousel');
}
private retrieveLinkCarousel(): HTMLAnchorElement | null{
const carousel = this.getCarousel()
const a = carousel.querySelector('a')
if (a === null) {
return null
}
return a
}
private async loadOneAd() {
try {
const params = new URLSearchParams();
if (this.currentAdNumber !== null) {
params.append('n', ""+this.currentAdNumber);
}
const response = await fetch('/next-ad.json?' + params)
const responseJson = await response.json()
this.currentAdNumber = responseJson.current_ad_number
this.ad = responseJson.ad
if (this.ad === null) {
this.noMoreAds()
return
}
const must_continue = responseJson.continue
const carousel = this.getCarousel()
if (must_continue === 0
|| carousel.offsetWidth === 0) {
this.noMoreAds();
return;
}
const aPrev = this.retrieveLinkCarousel()
const allAnchors = carousel.querySelectorAll('a')
const a = document.createElement('a')
a.addEventListener('click', (event: MouseEvent) => {
event.preventDefault()
})
a.addEventListener('pointerdown', (event: MouseEvent) => {
event.preventDefault()
})
a.addEventListener('pointerup', (event: MouseEvent) => {
event.preventDefault()
})
const image = document.createElement('img')
const text_container = document.createElement('div')
const text = document.createElement('h4')
const promoted = document.createElement('p')
promoted.classList.add('promoted-tag')
promoted.innerText = "Promocionado"
image.src = this.ad.img
image.alt = ""
text.innerText = this.ad.text
a.href = this.ad.href
a.append(image)
text_container.append(promoted)
text_container.append(text)
a.append(text_container)
if (this.firstAd) {
carousel.innerHTML = ''
this.firstAd = false
}
carousel.append(a)
this.isLockedSwipe = true
window.setTimeout(() => {
a.classList.add('show')
if (aPrev !== null) {
aPrev.classList.remove('show')
aPrev.classList.add('remove')
}
window.setTimeout(() => {
if (aPrev !== null) {
aPrev.remove()
}
for (const a of allAnchors) {
a.remove()
}
this.isLockedSwipe = false
}, 1000)
}, 200)
this.timeoutNumber = window.setTimeout(() => {
this.loadOneAd()
}, this.ad.seconds * 1000)
} catch (e) {
console.error(e)
this.timeoutNumber = window.setTimeout(() => {
this.loadOneAd()
}, 1000)
}
}
}

View File

@ -1,46 +1,19 @@
"use strict";
import Tablesort from 'tablesort';
import CarouselAd from '@burguillosinfo/carousel-ad'
window.Tablesort = require('tablesort');
require('tablesort/src/sorts/tablesort.number');
let fakeSearchInput
let searchMobile
document.addEventListener("DOMContentLoaded", function () {
window.onload = () => {
const menu_expand = document.querySelector('a.menu-expand');
const mobile_foldable = document.querySelector('nav.mobile-foldable');
const transparentFullscreenHide = document.querySelector('div.transparent-fullscreen-hide');
const contentsWithoutMenu = document.querySelector('div.contents-without-menu')
const tables = document.querySelectorAll('table')
fillFarmaciaGuardia();
new CarouselAd().run()
loadAd()
addEasterEggAnimation()
if (menu_expand !== null && mobile_foldable !== null && transparentFullscreenHide !== null && contentsWithoutMenu !== null) {
mobile_foldable.toggleAttribute('aria-hidden')
if (mobile_foldable.getAttribute('aria-hidden') !== null) {
mobile_foldable.setAttribute('aria-hidden', true);
}
transparentFullscreenHide.addEventListener('click', () => {
mobile_foldable.classList.remove('show');
transparentFullscreenHide.classList.remove('show');
menu_expand.classList.remove('active');
contentsWithoutMenu.removeAttribute('aria-hidden')
mobile_foldable.setAttribute('aria-hidden', true)
});
if (menu_expand !== null && mobile_foldable !== null) {
menu_expand.addEventListener('click', () => {
menu_expand.classList.toggle('active');
mobile_foldable.classList.toggle('show');
transparentFullscreenHide.classList.toggle('show');
contentsWithoutMenu.toggleAttribute('aria-hidden')
if (contentsWithoutMenu.getAttribute('aria-hidden') !== null) {
contentsWithoutMenu.setAttribute('aria-hidden', true);
}
mobile_foldable.toggleAttribute('aria-hidden')
if (mobile_foldable.getAttribute('aria-hidden') !== null) {
mobile_foldable.setAttribute('aria-hidden', true);
}
});
}
@ -58,265 +31,8 @@ document.addEventListener("DOMContentLoaded", function () {
}
if (window !== undefined && window.Android !== undefined) {
executeAndroidExclusiveCode(Android)
}
searchMobile = document.querySelector('nav.mobile-shortcuts div.search')
if (searchMobile !== null) {
fakeSearchInput = searchMobile.querySelector('input')
addListenersSearch()
}
}, false);
function fillFarmaciaGuardia() {
const farmaciaName = document.querySelector('#farmacia-name');
const farmaciaAddress = document.querySelector('#farmacia-address');
if (farmaciaName !== null || farmaciaAddress !== null) {
const port = _port()
const url = new URL(window.location.protocol
+ "//"
+ window.location.hostname
+ port
+ '/farmacia-guardia.json');
fetch(url).then(async (res) => {
const farmacia = await res.json()
if (farmaciaName !== null) {
farmaciaName.innerText = farmacia.name;
farmaciaAddress.innerText = farmacia.address;
}
})
}
}
function addListenersSearch() {
const searchInPage = document.querySelector('div.search-in-page')
if (searchMobile !== null) {
const searchIcon = searchMobile.querySelector('a.search-icon')
searchIcon.addEventListener('click', (e) => {
const searchOverlay = document.querySelector('div.search-overlay');
const searchInput = searchOverlay.querySelector('div.search input');
searchInput.value = fakeSearchInput.value;
onSearchChange(e)
onFakeSearchClick(e)
return true;
})
fakeSearchInput.addEventListener('keyup', (e) => {
if (searchInPage === null) {
return;
}
if (fakeSearchInput.value === "") {
searchInPage.classList.remove('active')
} else {
searchInPage.classList.add('active')
}
if (e.keyCode !== 13) {
return false;
}
const searchOverlay = document.querySelector('div.search-overlay');
const searchInput = searchOverlay.querySelector('div.search input');
searchInput.value = fakeSearchInput.value;
onSearchChange(e)
onFakeSearchClick(e)
return true;
});
}
const nextResult = searchInPage.querySelector('a.down');
const prevResult = searchInPage.querySelector('a.up');
window.addEventListener("keydown", (e) => {
if (e.key.toLowerCase() === "f" && e.ctrlKey) {
openAllDetails()
}
});
window.addEventListener("blur", (e) => {
openAllDetails()
})
if (nextResult !== null && prevResult !== null) {
nextResult.addEventListener('click', () => {
searchInWebsite(fakeSearchInput.value, true);
});
prevResult.addEventListener('click', () => {
searchInWebsite(fakeSearchInput.value, false);
});
}
const exitSearch = document.querySelector('a.exit-search')
const searchOverlay = document.querySelector('div.search-overlay');
const searchInput = searchOverlay.querySelector('div.search input');
fakeSearchInput.value = searchInput.value;
exitSearch.addEventListener('click', onExitSearch)
const search = document.querySelector('div.search-overlay div.search input');
if (search !== null) {
search.addEventListener('change', onSearchChange);
}
const searchIconDesktop = document.querySelector('nav.desktop a.search-icon');
if (searchIconDesktop !== null) {
searchIconDesktop.addEventListener('click', (e) => {
onFakeSearchClick(e)
})
}
}
function searchInWebsite(value, isToBottom) {
window.find(value, false, !isToBottom, true)
const selection = window.getSelection()
openAllDetails()
if (selection.anchorNode === null) {
const pageContents = document.querySelector('div.page-contents');
pageContents.focus()
searchInWebsite(value, isToBottom)
}
const anchorNode = selection.anchorNode.parentNode
if (anchorNode.tagName !== null
&& anchorNode.tagName === "INPUT") {
const pageContents = document.querySelector('div.page-contents');
pageContents.focus()
searchInWebsite(value, isToBottom)
}
if (anchorNode !== null) {
const pageContents = document.querySelector('div.page-contents');
const offsetTop = _getOffsetTopWithNParent(anchorNode, pageContents);
pageContents.scroll(0, offsetTop - 150)
}
}
function openAllDetails() {
for (const detail of document.querySelectorAll('details')) {
detail.open = true
}
}
function _getOffsetTopWithNParent(element, nParent, _carry = 0) {
if (element === null) {
return null;
}
if (element === nParent) {
return _carry;
}
_carry += element.offsetTop
return _getOffsetTopWithNParent(element.offsetParent, nParent, _carry)
}
function _port() {
let port = window.location.port;
if (port !== '') {
port = ':' + port
}
return port;
}
function onSearchChange() {
const search = document.querySelector('div.search-overlay div.search input');
const searchResults = document.querySelector('div.search-overlay div.search-results');
if (search === null || searchResults === null) {
return;
}
const query = search.value;
fakeSearchInput.value = search.value
const port = _port()
const url = new URL(window.location.protocol
+ "//"
+ window.location.hostname
+ port
+ '/search.json');
url.searchParams.set('q', query);
fetch(url).then(async (res) => {
const json = await res.json()
if (!json.ok) {
noResults(searchResults);
return
}
console.log(json.searchObjects.length)
if (json.searchObjects.length < 1) {
noResults(searchResults);
return;
}
showResults(searchResults, json.searchObjects);
})
search.focus()
}
function showResults(searchResults, searchObjects) {
searchResults.innerHTML = "";
for (let searchObject of searchObjects) {
const searchResultContainer = document.createElement('div')
searchResultContainer.classList.add('search-result')
const rowTitleUrlImageDiv = document.createElement('div');
rowTitleUrlImageDiv.classList.add('row-title-url-image');
const columnTitleUrl = document.createElement('div');
columnTitleUrl.classList.add('column-title-url');
const img = document.createElement('img')
const title = document.createElement('b')
const url = document.createElement('a')
const content = document.createElement('p')
title.innerText = searchObject.title
let port = window.location.port;
if (port !== '') {
port = ':' + port
}
if (searchObject.url.match(/^\//)) {
searchObject.url = window.location.protocol
+ "//" + window.location.hostname
+ port
+ searchObject.url
}
let urlImage = searchObject.urlImage;
if (urlImage !== null && urlImage.match(/^\//)) {
urlImage = window.location.protocol
+ "//" + window.location.hostname
+ port
+ urlImage
}
if (urlImage !== null) {
img.alt = ""
img.src = urlImage
}
url.href = searchObject.url
url.innerText = searchObject.url
content.innerText = searchObject.content
if (urlImage !== null) {
rowTitleUrlImageDiv.appendChild(img)
}
columnTitleUrl.appendChild(title);
columnTitleUrl.appendChild(document.createElement('br'))
columnTitleUrl.appendChild(url)
rowTitleUrlImageDiv.appendChild(columnTitleUrl)
searchResultContainer.appendChild(rowTitleUrlImageDiv)
searchResultContainer.appendChild(content)
searchResults.appendChild(searchResultContainer)
}
}
function noResults(searchResults) {
searchResults.innerHTML = ""
const p = document.createElement('p')
p.innerText = 'No se han encontrado resultados.'
searchResults.appendChild(p)
}
function onExitSearch() {
const searchOverlay = document.querySelector('div.search-overlay');
if (searchOverlay !== null) {
searchOverlay.classList.toggle('active');
}
}
function onFakeSearchClick(e) {
e.preventDefault();
const searchOverlay = document.querySelector('div.search-overlay');
if (searchOverlay === null) {
return
}
searchOverlay.classList.toggle('active');
const search = searchOverlay.querySelector('div.search input');
if (search !== null) {
search.focus()
}
return false;
}
};
function absoluteToHost(imageUrl) {
if (imageUrl.match(/^\//)) {
@ -338,9 +54,6 @@ function executeAndroidExclusiveCode(android) {
document.querySelectorAll('*.android').forEach((element) => {
element.classList.remove('android')
})
document.querySelectorAll('*.no-android-app').forEach((element) => {
element.style.display = 'none';
})
addListenerOpenInBrowserButton(android)
const pinToHomeUrl = document.querySelector('a.pin-to-home')
if (pinToHomeUrl === null) {
@ -378,3 +91,79 @@ function addEasterEggAnimation() {
logoContainer.classList.toggle('active')
})
}
let current_ad_number = null
function expand_page_contents() {
const page_contents = document.querySelector('div.page-contents');
if (page_contents === null) {
return;
}
page_contents.classList.add('no-carousel');
}
function no_more_ads() {
const carousel = document.querySelector('.carousel');
if (carousel !== null) {
carousel.remove();
}
expand_page_contents();
}
function loadAd() {
const params = new URLSearchParams();
if (current_ad_number !== null) {
params.append('n', ""+current_ad_number);
}
fetch('/next-ad.json?' + params).then((res) => {
return res.json()
}).then((res) => {
current_ad_number = res.current_ad_number
const ad = res.ad
const must_continue = res.continue
const carousel = document.querySelector('.carousel');
if (must_continue === 0
|| carousel === null
|| carousel.offsetWidth === 0) {
no_more_ads();
return;
}
const a = _retrieveLinkCarousel(carousel)
a.innerHTML = ""
const image = document.createElement('img')
const text_container = document.createElement('div')
const text = document.createElement('h4')
const promoted = document.createElement('p')
promoted.classList.add('promoted-tag')
promoted.innerText = "Promocionado"
image.src = ad.img
image.alt = ""
text.innerText = ad.text
a.href = ad.href
a.append(image)
text_container.append(promoted)
text_container.append(text)
a.append(text_container)
window.setTimeout(() => {
loadAd()
}, ad.seconds * 1000)
}).catch(() => {
window.setTimeout(() => {
loadAd()
}, 1000)
});
}
function _retrieveLinkCarousel(carousel) {
const maybeA = carousel.querySelector('a')
if (maybeA !== null) {
return maybeA
}
const a = document.createElement('a')
carousel.innerHTML = ""
carousel.append(a)
return a
}

View File

@ -17,13 +17,10 @@ sub startup ($self) {
}
}
);
push @{ $self->commands->namespaces }, 'BurguillosInfo::Command';
$self->hook(
before_render => sub($c, $args) {
my $current_route = $c->url_for;
$c->stash(current_route => $current_route);
my $is_android = $c->req->headers->user_agent =~ /android/i;
$c->stash(is_android => $is_android);
my $onion_base_url = $self->config->{onion_base_url};
my $base_url = $self->config->{base_url};
if (!defined $onion_base_url) {
@ -47,11 +44,10 @@ sub startup ($self) {
$r->get('/privacy.txt')->to('Privacy#index');
$r->get('/sitemap.xml')->to('Sitemap#sitemap');
$r->get('/robots.txt')->to('Robots#robots');
$r->get('/aprende-a-dibujar-con-krita')->to('Page#rickroll');
# $r->get('/:post')->to('Page#post');
$r->get('/stats')->to('Metrics#stats');
$r->get('/search.json')->to('Search#search');
$r->get('/farmacia-guardia.json')->to('FarmaciaGuardia#current');
$r->get('/<:category>.rss')->to('Page#category_rss');
$r->get('/:category_slug/atributo/<:attribute_slug>-preview.png')->to('Attribute#get_attribute_preview');
$r->get('/:category_slug/atributo/:attribute_slug')->to('Attribute#get');

View File

@ -47,23 +47,20 @@ sub get_next ( $self, $current_ad_number = undef ) {
if ( !defined $current_ad_number ) {
$current_ad_number = 0;
}
my $ad;
while (!defined $ad || $ad->id eq $current_ad_number) {
$ad = $self->get_rand_ad($array)->clone;
}
my $ad = $self->get_rand_ad($array)->clone;
return {
ad => $ad->serialize,
continue => 1,
current_ad_number => $ad->id,
current_ad_number => $self->_get_next_number($current_ad_number),
};
}
sub get_rand_ad($self, $array) {
my $valid_ads = [ grep { $_->is_active } @$array ];
my $max_weight = $self->sum_weights($valid_ads);
my $max_weight = $self->sum_weights($array);
my $rand = int(rand() * $max_weight);
my $sum_weight = 0;
for my $ad (@$valid_ads) {
for my $ad (@$array) {
$sum_weight += $ad->weight;
if ($rand < $sum_weight) {
return $ad;

View File

@ -21,7 +21,7 @@ sub weight {
}
sub is_active ($self) {
return 0;
return 1;
}
sub img {

View File

@ -50,7 +50,7 @@ sub href {
sub text($self) {
if ($self->default_alternative == 1) {
return '¡Anunciate en Burguillos.info! Precios a partir de 18.00€, pulsa aquí y escribenos.';
return '¡Anunciate en Burguillos.info! Precios a partir de 18.15€, pulsa aquí y escribenos.';
}
return
'Pulsando este anuncio puedes enviarnos un correo para anunciarte en este sitio. ¡Si me ves funciona!';

View File

@ -1,52 +0,0 @@
package BurguillosInfo::Ads::Beluche;
use v5.36.0;
use strict;
use warnings;
use utf8;
use feature 'signatures';
use Moo;
use parent 'BurguillosInfo::Ad';
sub id ($self) {
return 'beluche';
}
sub weight {
return 50;
}
sub max_alternative {
return 2;
}
sub default_alternative($self) {
return int($self->alternative * ($self->max_alternative + 1));
}
sub is_active ($self) {
return 1;
}
sub img ($self) {
if ( $self->default_alternative == 1 ) {
return '/img/anuncio-beluche-2.webp'
}
return '/img/anuncio-beluche-1.webp'
}
sub text($self) {
if ( $self->default_alternative == 1 ) {
return 'Un ambiente inmejorable en el local y un servicio de reparto a domicilio excelente. Tu comida en Café Bar Beluche.';
}
return 'Increíbles platos en Café Bar Beluche, ve y descubreló.';
}
sub href {
return '/posts/cafe-bar-beluche?come-from-ad=1';
}
1;

View File

@ -1,65 +0,0 @@
package BurguillosInfo::Ads::BurguillosDental;
use v5.36.0;
use strict;
use warnings;
use utf8;
use feature 'signatures';
use Moo;
use parent 'BurguillosInfo::Ad';
sub id ($self) {
return 'burguillos-dental';
}
sub weight {
return 50;
}
sub max_alternative {
return 3;
}
sub seconds($self) {
return 15;
}
sub default_alternative($self) {
return int($self->alternative * ($self->max_alternative + 1));
}
sub is_active ($self) {
return 0;
}
sub img ($self) {
if ( $self->default_alternative == 2 ) {
return '/img/burguillos-dental-ad-0-small.webp'
}
if ( $self->default_alternative == 1 ) {
return '/img/burguillos-dental-ad-1-small.webp'
}
return '/img/burguillos-dental-ad-1-small.webp'
}
sub text($self) {
if ( $self->default_alternative == 2 ) {
return 'Pide presupuesto para conseguir una sonrisa perfecta en Burguillos Dental, '.
'ubicado en Centro Médico Juan Manuel Pérez Sanchez.';
}
if ( $self->default_alternative == 1 ) {
return '¿Te has hecho ya tu limpieza completa de boca anual? Confia en profesionales, confia en Burguillos Dental, '.
'ubicado en Centro Médico Juan Manuel Pérez Sanchez.';
}
return '¿Te duele un diente? No lo dejes, ven a Burguillos Dental '.
'ubicado en Centro Médico Juan Manuel Pérez Sanchez.';
}
sub href {
return '/posts/burguillos-dental?come-from-ad=1';
}
1;

View File

@ -1,55 +0,0 @@
package BurguillosInfo::Ads::ChaletEnVentaCalleHinojo;
use v5.36.0;
use strict;
use warnings;
use utf8;
use DateTime;
use feature 'signatures';
use Moo;
use parent 'BurguillosInfo::Ad';
sub id ($self) {
return 'chalet-en-venta-calle-hinojo';
}
sub weight {
return 50;
}
sub max_alternative {
return 1;
}
sub seconds($self) {
return 15;
}
sub default_alternative($self) {
return int($self->alternative * ($self->max_alternative + 1));
}
sub is_active ($self) {
if (DateTime->new(year => 2024, month => 8, day => 11) < DateTime->now()) {
return 0;
}
return 1;
}
sub img ($self) {
return '/img/chalet-calle-hinojo.webp';
}
sub text($self) {
return '(VENDIDA) Chalet pareado en venta en calle Hinojo por 160 000€';
}
sub href {
return 'https://www.idealista.com/inmueble/104802645/';
}
1;

View File

@ -17,7 +17,7 @@ sub id ($self) {
}
sub weight {
return 50;
return 75;
}
sub max_alternative {
@ -29,7 +29,7 @@ sub default_alternative($self) {
}
sub is_active ($self) {
return 0;
return 1;
}
sub img ($self) {
@ -44,12 +44,12 @@ sub img ($self) {
sub text($self) {
if ( $self->default_alternative == 2 ) {
return 'Disfruta de comidas abundantes en Bar Cristóbal. Contacta a 621 210 460.';
return 'Disfruta de comidas abundantes en Bar Cristóbal.';
}
if ( $self->default_alternative == 1 ) {
return 'Bar Cristóbal, para chuparse los dedos. Contacta a 621 210 460.';
return 'Bar Cristóbal, para chuparse los dedos.';
}
return '¿Te apetece una cervecita y buena comida? Ven a Bar Cristóbal. Contacta a 621 210 460.';
return '¿Te apetece una cervecita y buena comida? Ven a Bar Cristóbal.';
}
sub href {

View File

@ -1,50 +0,0 @@
package BurguillosInfo::Ads::OwlcodeTech;
use v5.36.0;
use strict;
use warnings;
use utf8;
use feature 'signatures';
use Moo;
use parent 'BurguillosInfo::Ad';
sub id ($self) {
return 'owlcode-tech';
}
sub weight {
return 50;
}
sub seconds($self) {
return 15;
}
sub max_alternative {
return 1;
}
sub default_alternative($self) {
return int($self->alternative * ($self->max_alternative + 1));
}
sub is_active ($self) {
return 0;
}
sub img ($self) {
return '/img/owlcode-tech.webp';
}
sub text($self) {
return '¿Tienes una PYME o eres autónomo y aun no tienes presencia web? Consigue una web totalmente subvencionada. Pulsa aquí para más información.';
}
sub href {
return 'mailto:contact@owlcode.tech?subject=Quiero%20una%20web%20completamente%20subvencionada';
}
1;

View File

@ -29,7 +29,7 @@ sub default_alternative($self) {
}
sub is_active ($self) {
return 0;
return 1;
}
sub img ($self) {
@ -48,7 +48,7 @@ sub text($self) {
}
if ( $self->default_alternative == 1 ) {
return
'Una comida como esta no la ves todos los días, disponible en Burguillos, entra y descubrelo. Y O T E L O G U I S O';
'Una comida como esta no la ves todos los días, disponible en Burguillos, entra y descubrelo.';
}
return 'Comida hecha como en tu casa, YoTeLoGuiso...';
}

View File

@ -23,7 +23,7 @@ sub new {
return bless {}, shift;
}
sub Retrieve ($self) {
sub Retrieve($self) {
if ( defined $cached_categories ) {
return $cached_categories;
}
@ -31,45 +31,21 @@ sub Retrieve ($self) {
for my $category_file ( $CATEGORIES_DIR->children ) {
warn "Bad file $category_file, omiting...", next
if !-f $category_file || $category_file !~ /\.xml$/;
my $dom = Mojo::DOM->new( $category_file->slurp_utf8 );
defined( my $title = $dom->at(':root > title')->text )
my $dom = Mojo::DOM->new( $category_file->slurp_utf8 );
defined(my $title = $dom->at(':root > title')->text)
or die "Missing title at $category_file.";
defined( my $description = $dom->at(':root > description')->content )
defined(my $description = $dom->at(':root > description')->content)
or die "Missing description at $category_file";
defined( my $slug = $dom->at(':root > slug')->text )
defined(my $slug = $dom->at(':root > slug')->text)
or die "Missing slug at $category_file";
defined( my $menu_text = $dom->at(':root > menu_text')->content )
defined (my $menu_text = $dom->at(':root > menu_text')->content)
or die "Missing menu_text at $category_file";
defined( my $priority = $dom->at(':root > priority')->text )
defined (my $priority = $dom->at(':root > priority')->text)
or die "Missing priority at $category_file";
my $attributes = $self->_GetAttributes( $dom, $category_file );
my $parent_tag = $dom->at(':root > parent');
my $random_tag = $dom->at(':root > random');
my $image_element = $dom->at(':root > img');
my $image;
my $image_bottom_preview;
my $random;
if ( defined $random_tag ) {
{
$random = $random_tag->text;
if ( $random =~ /^true$/i || $random =~ /^yes$/ ) {
$random = 1;
next;
}
if ( int($random) != 0 ) {
$random = 1;
next;
}
$random = 0;
}
}
if ( defined $image_element ) {
$image = $image_element->attr->{src};
$image_bottom_preview = $image_element->attr->{'bottom-preview'};
}
my $attributes = $self->_GetAttributes($dom, $category_file);
my $parent_tag = $dom->at(':root > parent');
my $parent;
if ( defined $parent_tag ) {
if (defined $parent_tag) {
$parent = $parent_tag->content;
}
my $category = {
@ -79,16 +55,11 @@ sub Retrieve ($self) {
description => $description,
priority => $priority,
(
( defined $parent ) ? ( parent => $parent )
: ()
(defined $parent) ?
(parent => $parent) :
()
),
attributes => $attributes,
(
( defined $random ) ? ( random => $random )
: ()
),
image_bottom_preview => $image_bottom_preview,
image => $image,
};
$cached_categories->{$slug} = $category;
}
@ -97,92 +68,64 @@ sub Retrieve ($self) {
return $cached_categories;
}
sub _GetAttributes ( $self, $dom, $category_file ) {
sub _GetAttributes($self, $dom, $category_file) {
my $attributes_tag = $dom->at(':root > attributes');
my %attributes;
if ( defined $attributes_tag ) {
my @attribute_tag_list =
$attributes_tag->find('attributes > attribute')->each;
if (defined $attributes_tag) {
my @attribute_tag_list = $attributes_tag->find('attributes > attribute')->each;
for my $attribute_tag (@attribute_tag_list) {
defined( my $menu_text =
$attribute_tag->at('attribute > menu_text')->content )
defined (my $menu_text = $attribute_tag->at('attribute > menu_text')->content)
or die "Missing attribute menu_text at $category_file";
defined( my $description =
$attribute_tag->at('attribute > description')->content )
defined (my $description = $attribute_tag->at('attribute > description')->content)
or die "Missing attribute description at $category_file";
defined( my $title = $attribute_tag->at('attribute > title')->text )
defined (my $title = $attribute_tag->at('attribute > title')->text)
or die "Missing attribute title at $category_file";
defined( my $identifier =
$attribute_tag->at('attribute > identifier')->text )
defined (my $identifier = $attribute_tag->at('attribute > identifier')->text)
or die "Missing attribute identifier at $category_file";
defined( my $priority =
$attribute_tag->at('attribute > priority')->text )
defined (my $priority = $attribute_tag->at('attribute > priority')->text)
or die "Missing attribute priority at $category_file";
my $image_element = $attribute_tag->at('attribute > img');
my $image;
my $image_bottom_preview;
if ( defined $image_element ) {
$image = $image_element->attr->{src};
$image_bottom_preview =
$image_element->attr->{'bottom-preview'};
}
$attributes{$identifier} = {
title => $title,
identifier => $identifier,
priority => $priority,
menu_text => $menu_text,
description => $description,
image => $image,
image_bottom_preview => $image_bottom_preview,
title => $title,
identifier => $identifier,
priority => $priority,
menu_text => $menu_text,
description => $description,
};
}
}
return \%attributes;
}
sub _PopulateChildrenField ( $self, $categories ) {
for my $category_name ( keys %$categories ) {
sub _PopulateChildrenField($self, $categories) {
for my $category_name (keys %$categories) {
my $category = $categories->{$category_name};
$category->{children} //= [];
my $parent_name = $category->{parent};
if ( !defined $parent_name ) {
if (!defined $parent_name) {
next;
}
my $parent = $categories->{$parent_name};
if ( !defined $parent ) {
die
"Category $parent_name not exists and it is the parent of $category_name.";
}
if ( !exists $category->{random} && exists $parent->{random} ) {
$category->{random} = $parent->{random};
if (!defined $parent) {
die "Category $parent not exists and is the parent of $category_name.";
}
$parent->{children} //= [];
push $parent->{children}->@*, $category;
}
}
sub _AvoidGrandChildCategories ( $self, $categories ) {
for my $category_slug ( keys %$categories ) {
sub _AvoidGrandChildCategories($self, $categories) {
for my $category_slug (keys %$categories) {
my $category = $categories->{$category_slug};
my $parent = $category->{parent};
if ( defined $parent && defined $categories->{$parent}{parent} ) {
die
"$category_slug category is grandchild of $categories->{$parent}{parent}) category and this is not allowed.";
my $parent = $category->{parent};
if (defined $parent && defined $categories->{$parent}{parent}) {
die "$category_slug category is grandchild of $categories->{$parent}{parent}) category and this is not allowed.";
}
}
}
sub PreviewOg ( $self, $category, $isWhatsApp = 0 ) {
my $title = $category->{title};
my $description = $category->{description};
my $image = $category->{image};
my $image_bottom_preview = $category->{image_bottom_preview};
if ($isWhatsApp) {
return BurguillosInfo::Preview->WhatsappAlternativeGenerate( $title, $description, $image,
$image_bottom_preview );
}
return BurguillosInfo::Preview->Generate( $title, $description, $image,
$image_bottom_preview );
sub PreviewOg($self, $category) {
my $title = $category->{title};
my $description = $category->{description};
return BurguillosInfo::Preview->Generate($title, $description, undef);
}
1;

View File

@ -1,126 +0,0 @@
package BurguillosInfo::Command::index;
use v5.36.0;
use strict;
use warnings;
use utf8;
use feature 'signatures';
use Data::Dumper;
use Mojo::Base 'Mojolicious::Command';
use Moo;
use Mojo::UserAgent;
use BurguillosInfo::Posts;
use BurguillosInfo::Categories;
use BurguillosInfo::IndexUtils;
my $index_utils = BurguillosInfo::IndexUtils->new;
sub run ( $self, @args ) {
require BurguillosInfo;
my $app = BurguillosInfo->new;
my $config = $app->config;
my $search_backend = $config->{search_backend};
my $search_index = $config->{search_index};
my $ua = Mojo::UserAgent->new;
my $posts = BurguillosInfo::Posts->new->Retrieve(0);
my $categories = BurguillosInfo::Categories->new->Retrieve;
my $index = [];
$self->_index_posts( $index, $posts );
$self->_index_categories( $index, $categories );
my $response = $ua->put( $search_backend . '/index/' . $search_index,
{} => json => $index );
say $response->result->body;
}
sub _index_categories ( $self, $index, $categories ) {
my @categories_keys = keys %$categories;
for my $category_key (@categories_keys) {
my $category = $categories->{$category_key};
my $slug = $category->{slug};
my $url = "/$slug";
my $content =
Mojo::DOM->new(
'<html>' . $category->{description} =~ s/\s+/ /gr . '</html>' )
->all_text;
my $title = $category->{title};
my $attributes = $category->{attributes};
my $image = $category->{image};
$self->_index_attributes( $index, $slug, $attributes );
push @$index, {
title => $title,
titleNormalized => $index_utils->n($title),
content => $content,
contentNormalized => $index_utils->n( $content =~ s/\s+/ /gr ),
url => $url,
urlNormalized => $index_utils->n($url),
(
( defined $image )
? ( urlImage => $image )
: ()
)
};
}
}
sub _index_attributes ( $self, $index, $category_slug, $attributes ) {
my @attributes_keys = keys %$attributes;
for my $attribute_key (@attributes_keys) {
my $attribute = $attributes->{$attribute_key};
my $slug = $attribute->{identifier};
my $url = "/$category_slug/atributo/$slug";
my $title = $attribute->{title};
my $image = $attribute->{image};
my $content =
Mojo::DOM->new( '<html>' . $attribute->{description} . '</html>' )
->all_text;
push @$index,
{
titleNormalized => $index_utils->n($title),
title => $title,
contentNormalized => $index_utils->n( $content =~ s/\s+/ /gr ),
content => $content =~ s/\s+/ /gr,
urlNormalized => $index_utils->n($url),
url => $url,
(
( defined $image )
? ( urlImage => $image )
: ()
)
};
}
}
sub _index_posts ( $self, $index, $posts ) {
my @posts_keys = keys %$posts;
for my $post_key (@posts_keys) {
my $post = $posts->{$post_key};
my $slug = $post->{slug};
my $url = "/posts/$slug";
my $urlImage = $post->{image};
my $content =
Mojo::DOM->new( '<html>' . $post->{content} . '</html>' )->all_text;
my $title = $post->{title};
my $author = $post->{author};
push @$index,
{
titleNormalized => $index_utils->n($title),
title => $title,
authorNormalized => $index_utils->n($author),
author => $author,
contentNormalized => $index_utils->n( $content =~ s/\s+/ /gr ),
content => $content =~ s/\s+/ /gr,
urlNormalized => $index_utils->n($url),
url => $url,
urlImageNormalized => $index_utils->n($urlImage),
urlImage => $urlImage,
};
}
}
1;

View File

@ -13,7 +13,6 @@ sub next_ad {
my $self = shift;
my $ads_factory = BurguillosInfo::Ads->new;
my $current_ad_number = $self->param('n');
$self->res->headers->access_control_allow_origin('*');
$self->render( json => $ads_factory->get_next($current_ad_number) );
}
1;

View File

@ -25,24 +25,11 @@ sub get_attribute_preview ($self) {
return $self->reply->not_found;
}
my $is_whatsapp = $self->req->headers->user_agent =~ /whatsapp/i;
$is_whatsapp ||= $self->req->headers->user_agent =~ /facebook/i;
my $data;
if ($is_whatsapp) {
$data = BurguillosInfo::Preview->WhatsappAlternativeGenerate(
$attribute->{title}, $attribute->{description},
$attribute->{image}, $attribute->{image_bottom_preview}
)
} else {
$data = BurguillosInfo::Preview->Generate(
$attribute->{title}, $attribute->{description},
$attribute->{image}, $attribute->{image_bottom_preview}
)
}
$self->render(
format => 'png',
data => $data,
data => BurguillosInfo::Preview->Generate(
$attribute->{title}, $attribute->{description}, undef
),
);
}

View File

@ -1,16 +0,0 @@
package BurguillosInfo::Controller::FarmaciaGuardia;
use v5.34.1;
use strict;
use warnings;
use BurguillosInfo::FarmaciaGuardia;
use Mojo::Base 'Mojolicious::Controller', '-signatures';
sub current($self) {
my $farmacia = BurguillosInfo::FarmaciaGuardia->new->get_current;
$self->render( json => $farmacia->serialize );
}
1;

View File

@ -17,17 +17,16 @@ use Crypt::Bcrypt qw/bcrypt bcrypt_check/;
my $tracking;
my $iso8601 = DateTime::Format::ISO8601->new;
my $iso8601 = DateTime::Format::ISO8601->new;
sub request {
shift;
shift;
eval {
my $c = shift;
my $c = shift;
my $app = $c->app;
if ( !defined $tracking ) {
if (!defined $tracking) {
$tracking = BurguillosInfo::Tracking->new($app);
}
$tracking->register_request($c);
$tracking->register_request($c);
};
if ($@) {
say STDERR $@;
@ -35,34 +34,29 @@ sub request {
}
sub stats {
my $self = shift;
if ( !$self->valid_login ) {
$self->res->headers->location('/stats/login');
$self->render( text => 'You must login', status => 302 );
return;
}
$self->session( expiration => 0 );
my $data = $tracking->get_global_data($self);
my $data_per_url = $tracking->get_data_for_urls($self);
my $google_data = $tracking->get_google_data($self);
$self->_filter_data_per_url($data_per_url);
$self->_filter_data_per_url($google_data);
$self->render(
tracking_data => $data,
tracking_by_url => $data_per_url,
google_data => $google_data
);
my $self = shift;
if (!$self->valid_login) {
$self->res->headers->location('/stats/login');
$self->render(text => 'You must login', status => 302);
return;
}
my $data = $tracking->get_global_data($self);
my $data_per_url = $tracking->get_data_for_urls($self);
my $google_data = $tracking->get_google_data($self);
$self->_filter_data_per_url($data_per_url);
$self->_filter_data_per_url($google_data);
$self->render(tracking_data => $data, tracking_by_url => $data_per_url, google_data => $google_data);
}
sub _filter_data_per_url ( $self, $data_per_url ) {
sub _filter_data_per_url($self, $data_per_url) {
my $filter = $self->param('filter');
if ( !defined $filter ) {
if (!defined $filter) {
return;
}
my @new_data_per_url;
if ( $filter eq 'remove-extensions' ) {
my @new_data_per_url;
if ($filter eq 'remove-extensions') {
for my $url (@$data_per_url) {
if ( $url->{path} =~ /\.\w+$/ ) {
if ($url->{path} =~ /\.\w+$/) {
next;
}
push @new_data_per_url, $url;
@ -72,65 +66,67 @@ sub _filter_data_per_url ( $self, $data_per_url ) {
}
sub submit_login {
my $self = shift;
if ( $self->valid_login ) {
$self->res->headers->location('/stats');
$self->render( text => 'Already logged in.', status => 302 );
return;
}
my $password = $self->param('password');
if ( !defined $password ) {
$self->render( text => 'No password passed.', status => 400 );
return;
}
my $bcrypted_pass = $self->config->{bcrypt_pass_stats};
if ( !defined $bcrypted_pass ) {
warn "No bcrypt pass.";
$self->render( text => 'Server error.', status => 500 );
return;
}
say $password;
say $bcrypted_pass;
if ( !bcrypt_check( $password, $bcrypted_pass ) ) {
$self->render( text => 'Wrong password', status => 401 );
return;
}
say STDERR 'Login success.';
my $expiration_date = DateTime->now->add( days => 1 );
$self->session->{login} = "date_end_login:$expiration_date";
$self->res->headers->location('/stats');
$self->render( text => 'Login success.', status => 302 );
return;
my $self = shift;
if ($self->valid_login) {
$self->res->headers->location('/stats');
$self->render(text => 'Already logged in.', status => 302);
return;
}
my $password = $self->param('password');
if (!defined $password) {
$self->render(text => 'No password passed.', status => 400);
return;
}
my $bcrypted_pass = $self->config->{bcrypt_pass_stats};
if (!defined $bcrypted_pass) {
warn "No bcrypt pass.";
$self->render(text => 'Server error.', status => 500);
return;
}
say $password;
say $bcrypted_pass;
if (!bcrypt_check( $password, $bcrypted_pass )) {
$self->render(text => 'Wrong password', status => 401);
return;
}
say STDERR 'Login success.';
my $expiration_date = DateTime->now->add( days => 1);
$self->session->{login} = "date_end_login:$expiration_date";
$self->res->headers->location('/stats');
$self->render(text => 'Login success.', status => 302);
return;
}
sub valid_login {
my $self = shift;
my $login_cookie = $self->session->{login};
if ( !defined $login_cookie ) {
return;
}
my $self = shift;
my $login_cookie = $self->session->{login};
if (!defined $login_cookie) {
return;
}
my ($date_text) = $login_cookie =~ /^date_end_login:(.*)$/;
my $date;
eval { $date = $iso8601->parse_datetime($date_text); };
if ($@) {
warn "Bad date in cookie $login_cookie.";
return;
}
my $current_date = DateTime->now();
if ( $current_date > $date ) {
return;
}
return 1;
my ($date_text) = $login_cookie =~ /^date_end_login:(.*)$/;
my $date;
eval {
$date = $iso8601->parse_datetime($date_text);
};
if ($@) {
warn "Bad date in cookie $login_cookie.";
return;
}
my $current_date = DateTime->now();
if ($current_date > $date) {
return;
}
return 1;
}
sub login {
my $self = shift;
if ( $self->valid_login ) {
$self->res->headers->location('/stats');
$self->render( text => 'You are already logged in.', status => 302 );
return;
}
$self->render;
my $self = shift;
if ($self->valid_login) {
$self->res->headers->location('/stats');
$self->render(text => 'You are already logged in.', status => 302);
return;
}
$self->render;
}
1;

View File

@ -21,15 +21,20 @@ sub index {
my $current_category = $categories->{'index'};
# Render template "example/welcome.html.ep" with message
my $base_url = $self->config('base_url');
$self->stash( ogimage =>
( $base_url . '/' . $current_category->{slug} . '-preview.png' ) );
$self->render(
categories => $categories,
current_category => $current_category,
current_category => $current_category
);
}
sub rickroll($self) {
if ($self->req->headers->user_agent =~ /bot/i) {
return $self->render(text => '');
}
$self->res->headers->location('http://ibaillanos.tv');
$self->render(text => '', status => 302);
}
sub category_rss {
require BurguillosInfo;
my $self = shift;
@ -44,7 +49,7 @@ sub category_rss {
}
my $dom = Mojo::DOM->new_tag( 'rss', version => '2.0', undef );
my $channel_tag = Mojo::DOM->new_tag('channel');
my $base_url = BurguillosInfo->new->config->{base_url};
my $base_url = BurguillosInfo->new->config->{base_url};
if ( $category_name eq 'all' ) {
my $title_tag = Mojo::DOM->new_tag( 'title', 'Burguillos.info' );
my $description_tag = Mojo::DOM->new_tag( 'description',
@ -68,8 +73,8 @@ sub category_rss {
my $description_tag = Mojo::DOM->new_tag( 'description',
'Todas las noticias de la categoria de Burguillos.info '
. $category->{title} );
my $link_tag =
Mojo::DOM->new_tag( 'link', $base_url . '/' . $category->{slug} );
my $link_tag = Mojo::DOM->new_tag( 'link',
$base_url . '/' . $category->{slug} );
$channel_tag->child_nodes->first->append_content($title_tag);
$channel_tag->child_nodes->first->append_content($description_tag);
$channel_tag->child_nodes->first->append_content($link_tag);
@ -93,9 +98,9 @@ sub _post_to_rss {
my $post = shift;
my $item_tag = Mojo::DOM->new_tag('item');
my $title_tag = Mojo::DOM->new_tag( 'title', $post->{title} );
my $base_url = BurguillosInfo->new->config->{base_url};
my $link =
Mojo::DOM->new_tag( 'link', $base_url = '/posts/' . $post->{slug} );
my $base_url = BurguillosInfo->new->config->{base_url};
my $link = Mojo::DOM->new_tag( 'link',
$base_url = '/posts/' . $post->{slug} );
my $description = Mojo::DOM->new_tag( 'description',
Mojo::DOM->new( $post->{content} )->all_text );
my $guid = Mojo::DOM->new_tag( 'guid', $post->{slug} );
@ -144,11 +149,10 @@ sub category {
$self->render( template => '404', status => 404 );
return;
}
$self->stash( ogimage =>
( $base_url . '/' . $current_category->{slug} . '-preview.png' ) );
$self->render(
template => 'page/index',
categories => $categories,
template => 'page/index',
categories => $categories,
ogimage => $base_url . '/' . $current_category->{slug} . '-preview.png',
current_category => $current_category
);
}
@ -162,12 +166,10 @@ sub get_category_preview {
$self->render( template => '404', status => 404 );
return;
}
my $category = $categories->{$category_slug};
my $is_whatsapp = $self->req->headers->user_agent =~ /whatsapp/i;
$is_whatsapp ||= $self->req->headers->user_agent =~ /facebook/i;
my $category = $categories->{$category_slug};
$self->render(
format => 'png',
data => $category_model->PreviewOg( $category, $is_whatsapp )
data => $category_model->PreviewOg($category)
);
}
@ -180,13 +182,10 @@ sub get_post_preview {
$self->render( template => '404', status => 404 );
return;
}
my $is_whatsapp = $self->req->headers->user_agent =~ /whatsapp/i;
$is_whatsapp ||= $self->req->headers->user_agent =~ /facebook/i;
say $self->req->headers->user_agent;
my $post = $posts_slug->{$slug};
$self->render(
format => 'png',
data => $post_model->PreviewOg( $post, $is_whatsapp )
data => $post_model->PreviewOg($post)
);
}
1;

View File

@ -10,12 +10,10 @@ use Mojo::Base 'Mojolicious::Controller', '-signatures';
sub index($self) {
return $self->render(text => <<"EOF");
Esta aplicación no almacena datos que puedan identificar
de forma única a los usuarios.\r\n
Con fines analíticos y técnicos se almacenan la cantidad
de visitas a cada página.\r\n
La dirección IP, Agente de Usuario y parametros GET con los
que se visita la página es almacenado de forma temporal
(90 días) para detectar posibles ciberataques, tras ese tiempo
es sustituido por un hash.
Esta política puede cambiar en un futuro si se
requieren funcionalidades como registros.\r\n
EOF

View File

@ -1,59 +0,0 @@
package BurguillosInfo::Controller::Search;
use v5.34.1;
use strict;
use warnings;
use Data::Dumper;
use Mojo::Base 'Mojolicious::Controller', '-signatures';
use Mojo::UserAgent;
use BurguillosInfo::IndexUtils;
use BurguillosInfo::Posts;
my $index_utils = BurguillosInfo::IndexUtils->new;
sub search ($self) {
my $ua = Mojo::UserAgent->new;
my $query = $self->param('q');
my $config = $self->config;
my $search_backend = $config->{search_backend};
my $search_index = $config->{search_index};
$query =~ s/\btitle:/titleNormalized:/g;
$query =~ s/\bcontent:/contentNormalized:/g;
my $tx = $ua->get( $search_backend . '/search/' . $search_index,
{}, form => { q => $index_utils->n($query) } );
my $result = $tx->result;
my $output = $result->json;
if ( !defined $output ) {
return $self->render( status => 500, json => { ok => 0 } );
}
my $ok = $output->{ok};
my $reason = $output->{reason};
if ( !$ok ) {
return $self->render( status => 400, json => { ok => 0 } );
}
my $searchObjects = $output->{searchObjects};
$searchObjects = [grep { $self->filterSearch($_) } @$searchObjects];
return $self->render(
status => 200,
json => { ok => 1, searchObjects => $searchObjects }
);
}
sub filterSearch($self, $searchObject) {
my $url = $searchObject->{url};
my ($posts_by_categories, $posts) = BurguillosInfo::Posts->Retrieve;
my $slug;
if ($url =~ m{^/posts/([^/]+?)(?:\?.*)?$}) {
$slug = $1;
if (!defined $posts->{$slug}) {
return 0;
}
}
return 1
}
1;

View File

@ -43,12 +43,6 @@ sub MIGRATIONS {
\&_populate_locations,
\&_populate_locations,
\&_populate_locations,
'CREATE TABLE farmacia_guardia (
uuid UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
date timestamp NOT NULL,
id_farmacia TEXT NOT NULL
);',
'CREATE INDEX farmacia_guardia_index on farmacia_guardia (date, id_farmacia, uuid);',
);
}

View File

@ -1,20 +0,0 @@
package BurguillosInfo::Farmacia;
use v5.36.0;
use strict;
use warnings;
use utf8;
use Moo::Role;
requires qw(id name address);
sub serialize ($self) {
return {
id => $self->id,
name => $self->name,
address => $self->address,
};
}
1;

View File

@ -1,141 +0,0 @@
package BurguillosInfo::FarmaciaGuardia;
use v5.36.0;
use strict;
use warnings;
use utf8;
use feature 'signatures';
use Data::Dumper;
use Moo;
use DateTime;
use DateTime::Format::Pg;
use Mojo::UserAgent;
use BurguillosInfo::Farmacias;
use BurguillosInfo::Farmacias::CruzDeLaErmita;
use BurguillosInfo::Farmacias::Morera;
has _app => ( is => 'lazy', );
has _db => ( is => 'lazy' );
sub _build__app {
require BurguillosInfo;
return BurguillosInfo->new;
}
sub get_current ($self) {
my $date_search = $self->_get_search_date;
my $farmacia_db = $self->_search_horario_db($date_search);
if (defined $farmacia_db) {
return $farmacia_db;
}
my $farmacia;
eval {
$farmacia = $self->_request_horario_internet($date_search);
};
if (!defined $farmacia) {
die "API possibly broken for Farmacia de Guardia. $@";
}
$self->_register_farmacia($date_search, $farmacia);
return $farmacia;
}
sub _register_farmacia($self, $date_search, $farmacia) {
my $f = DateTime::Format::Pg->new;
my $dbh = $self->_db;
$dbh->do(<<'EOF', undef, $f->format_datetime($date_search), $farmacia->id);
INSERT INTO farmacia_guardia (date, id_farmacia) VALUES (?, ?);
EOF
}
sub _search_horario_db ( $self, $date_search ) {
my $f = DateTime::Format::Pg->new;
my $db = $self->_db;
$date_search = $date_search->clone;
$date_search->set_time_zone('UTC');
my $start_farmacia_week = $self->_get_start_date_week($date_search);
my $end_farmacia_week = $self->_get_end_date_week($date_search);
my $horarios = $db->selectall_arrayref(
<<'EOF', { Slice => {} }, $f->format_datetime($start_farmacia_week), $f->format_datetime($end_farmacia_week) );
SELECT id_farmacia from farmacia_guardia where date > ? and date < ?;
EOF
if (!scalar @$horarios) {
return;
}
my $id = $horarios->[0]{id_farmacia};
return BurguillosInfo::Farmacias->new->by_id($id);
}
sub _request_horario_internet ( $self, $date_search ) {
my $ua = $self->_ua;
my $result = $ua->get(
'http://www.farmaciacruzdelaermita.com/index.php/component/dpcalendar/events',
form => {
limit => 0,
compact => 0,
my => 0,
format => 'raw',
ids => 10,
'date-start' => $date_search->epoch,
'date-end' => $date_search->epoch,
_ => $date_search->epoch * 1000,
}
)->result;
my $json;
eval { $json = $result->json; };
if ($@) {
die "Unable to recover data of Farmacia de Guardia $@.";
}
my $data;
eval { $data = $json->[0]{data}; };
if ( $@ || !defined $data ) {
die "Unable to get data of calendar.";
}
if ( scalar @$data ) {
return BurguillosInfo::Farmacias::CruzDeLaErmita->new;
}
return BurguillosInfo::Farmacias::Morera->new;
}
sub _ua {
return Mojo::UserAgent->new;
}
sub _get_search_date ($self) {
my $current_date = DateTime->now;
my $date_search = $current_date->clone;
if ( $date_search < $self->_get_start_date_week($current_date) ) {
$date_search = $date_search->add( days => -1 );
}
return $date_search;
}
sub _get_end_date_week ( $self, $date_search ) {
my $start_farmacia_week = $self->_get_start_date_week($date_search);
my $end_farmacia_week = $start_farmacia_week->clone->add( weeks => 1 );
$end_farmacia_week->set_time_zone('Europe/Madrid');
$end_farmacia_week->set_hour(9);
$end_farmacia_week->set_minute(30);
$end_farmacia_week->set_time_zone('UTC');
return $end_farmacia_week;
}
sub _get_start_date_week ( $self, $date_search ) {
my $start_farmacia_week = $date_search->clone->truncate( to => 'week' );
$start_farmacia_week->set_time_zone('Europe/Madrid');
$start_farmacia_week->set_hour(9);
$start_farmacia_week->set_minute(30);
$start_farmacia_week->set_time_zone('UTC');
return $start_farmacia_week;
}
sub _build__db ($self) {
require BurguillosInfo::DB;
return BurguillosInfo::DB->connect( $self->_app );
}
1;

View File

@ -1,66 +0,0 @@
package BurguillosInfo::Farmacias;
use v5.36.0;
use strict;
use warnings;
use utf8;
use Moo;
use Module::Pluggable
search_path => ['BurguillosInfo::Farmacias'],
instantiate => 'new',
on_require_error => sub ( $plugin, $error ) {
die $error;
};
{
my $array;
sub array($self) {
if (!defined $array) {
$self->_populate_farmacias;
}
return $array;
}
sub _populate_farmacias($self) {
$array = [];
@$array = $self->plugins();
for my $farmacia (@$array) {
$self->_check_farmacia_valid($farmacia);
}
}
}
{
my $farmacias_by_id;
sub by_id($self, $target_id) {
if (!defined $farmacias_by_id) {
$self->_populate_farmacias_by_id;
}
if (!defined $target_id) {
die 'You must pass $target_id.';
}
my $farmacia = $farmacias_by_id->{$target_id};
if (!defined $farmacia) {
die "Farmacia $target_id not found.";
}
return $farmacia;
}
sub _populate_farmacias_by_id($self) {
$farmacias_by_id = {};
my $farmacias = $self->array;
for my $farmacia (@$farmacias) {
$farmacias_by_id->{$farmacia->id} = $farmacia;
}
}
}
sub _check_farmacia_valid($self, $farmacia) {
if ( !$farmacia->does('BurguillosInfo::Farmacia') ) {
die "$farmacia does not implement BurguillosInfo::Farmacia.";
}
}
1;

View File

@ -1,27 +0,0 @@
package BurguillosInfo::Farmacias::CruzDeLaErmita;
use v5.36.0;
use strict;
use warnings;
use utf8;
use feature 'signatures';
use Moo;
use parent 'BurguillosInfo::Farmacia';
sub id {
return 'cruz_de_la_ermita';
}
sub name {
return 'Farmacia Cruz de La Ermita';
}
sub address {
return 'Avenida. Alcalde José Cuesta Godoy, Nº 21. (La calle aun es Avenida Cruz de la Ermita si lo buscas en Google Maps.)';
}
1;

View File

@ -1,24 +0,0 @@
package BurguillosInfo::Farmacias::Morera;
use v5.36.0;
use strict;
use warnings;
use utf8;
use Moo;
sub id {
return 'morera';
}
sub name {
return 'Farmacia Óptica Morera';
}
sub address {
return 'Calle Virgen del Rosario número 13';
};
use parent 'BurguillosInfo::Farmacia';
1;

View File

@ -1,35 +0,0 @@
package BurguillosInfo::IndexUtils;
use v5.36.0;
use strict;
use warnings;
use utf8;
use feature 'signatures';
use Unicode::Normalize qw/NFKD/;
use Moo;
use Lingua::Stem::Snowball;
sub normalize($self, $text) {
return undef if !defined $text;
my $decomposed = NFKD($text);
$decomposed =~ s/\p{NonspacingMark}//g;
my @words;
while ($decomposed =~ /\b(\w+)\b/g) {
push @words, $1;
}
my $stemmer = Lingua::Stem::Snowball->new( lang => 'es' );
$stemmer->stem_in_place(\@words);
$decomposed = join " ", @words;
$decomposed =~ s/\bpizzeri\b/pizz/gi;
return $decomposed;
}
sub n (@args) {
normalize(@args);
}
1;

View File

@ -20,10 +20,10 @@ use DateTime;
use BurguillosInfo::Preview;
const my $CURRENT_FILE => __FILE__;
const my $ROOT_PROJECT => path($CURRENT_FILE)->parent->parent->parent;
const my $PUBLIC_DIR => $ROOT_PROJECT->child('public');
const my $POSTS_DIR => $ROOT_PROJECT->child('content/posts');
const my $CURRENT_FILE => __FILE__;
const my $ROOT_PROJECT => path($CURRENT_FILE)->parent->parent->parent;
const my $PUBLIC_DIR => $ROOT_PROJECT->child('public');
const my $POSTS_DIR => $ROOT_PROJECT->child('content/posts');
my $cached_posts_by_category;
my $cached_posts_by_slug;
@ -32,33 +32,34 @@ sub new {
return bless {}, shift;
}
sub _ReturnCacheFilter ( $self, $filters = 1 ) {
sub _ReturnCacheFilter {
my $self = shift;
my %posts_by_category_filtered;
my %posts_by_slug_filtered;
my $iso8601 = DateTime::Format::ISO8601->new;
my $current_date = DateTime->now;
for my $category ( keys %$cached_posts_by_category ) {
for my $post ( @{ $cached_posts_by_category->{$category} } ) {
if ($filters) {
my $date_post;
eval { $date_post = $iso8601->parse_datetime( $post->{date} ); };
if ($@) {
print $@ . ': ' . Data::Dumper::Dumper $post;
}
if ( $date_post > $current_date ) {
next;
}
my $date_post;
eval {
$date_post = $iso8601->parse_datetime( $post->{date} );
};
if ($@) {
print Data::Dumper::Dumper $post;
}
if ( $date_post > $current_date ) {
next;
}
$posts_by_slug_filtered{ $post->{slug} } = $post;
$posts_by_category_filtered{ $category } //= [];
push @{ $posts_by_category_filtered{ $category } }, $post;
$posts_by_category_filtered{ $post->{category} } //= [];
push @{ $posts_by_category_filtered{ $post->{category} } }, $post;
}
}
return ( \%posts_by_category_filtered, \%posts_by_slug_filtered );
}
sub _GeneratePostFromFile ( $self, $post_file ) {
warn "Bad file $post_file, omiting...", return
warn "Bad file $post_file, omiting...", return
if !-f $post_file || $post_file !~ /\.xml$/;
my $dom = Mojo::DOM->new( $post_file->slurp_utf8 );
my $title = $dom->at(':root > title')->text
@ -69,32 +70,18 @@ sub _GeneratePostFromFile ( $self, $post_file ) {
or die "Missing date at $post_file.";
my $ogdesc = $dom->at(':root > ogdesc')->text
or die "Missing ogdesc at $post_file";
my @categories = $dom->find(':root > category')->map('text')->each;
my $slug = $dom->at(':root > slug')->text
my $category = $dom->at(':root > category')->text
or die "Missing category at $post_file.";
my $slug = $dom->at(':root > slug')->text
or die "Missing slug at $post_file.";
my $content_tag = $dom->at(':root > content')
my $content = $dom->at(':root > content')->content
or die "Missing content at $post_file.";
for my $tag ( $content_tag->children->each ) {
$tag->content( $tag->content =~ s/\n//gr );
}
if ( !scalar @categories ) {
die 'Missing category';
}
my $content = $content_tag->content;
my $pinned_node = $dom->at(':root > pinned');
my $image_element = $dom->at(':root > img');
my $image;
my $image_bottom_preview;
my $attributes = $self->_GetAttributes( $post_file, $dom );
my $attributes = $self->_GetAttributes($post_file, $dom);
my $pinned;
if ( defined $pinned_node ) {
$pinned = int( $pinned_node->text );
}
if ( defined $image_element ) {
$image = $image_element->attr->{src};
$image_bottom_preview = $image_element->attr->{'bottom-preview'};
$image = $image_element->attr->{src};
}
my $last_modification_date_element =
@ -105,38 +92,31 @@ sub _GeneratePostFromFile ( $self, $post_file ) {
}
return {
title => $title,
author => $author,
date => $date,
ogdesc => $ogdesc,
categories => [@categories],
category => $categories[0],
slug => $slug,
content => $content,
attributes => $attributes,
image_bottom_preview => $image_bottom_preview,
title => $title,
author => $author,
date => $date,
ogdesc => $ogdesc,
category => $category,
slug => $slug,
content => $content,
(
( defined $last_modification_date )
? ( last_modification_date => $last_modification_date )
: ()
),
( ( defined $image ) ? ( image => $image ) : () ),
(
( defined $pinned ) ? ( pinned => $pinned )
: ()
)
attributes => $attributes,
};
}
sub _GetAttributes ( $self, $post_file, $dom ) {
sub _GetAttributes($self, $post_file, $dom) {
my $attributes_tag = $dom->at(':root > attributes');
my %attributes;
if ( defined $attributes_tag ) {
my @attribute_list =
$attributes_tag->find('attributes > attribute')->map('text')->each;
%attributes = map {
if (defined $attributes_tag) {
my @attribute_list = $attributes_tag->find('attributes > attribute')->map('text')->each;
%attributes = map {
my $identifier = $_;
( $identifier => 1 );
($identifier => 1);
} @attribute_list;
}
return \%attributes;
@ -148,70 +128,46 @@ sub _GeneratePostCache ($self) {
$cached_posts_by_slug = {};
for my $post_file ( sort { $b cmp $a } $POSTS_DIR->children ) {
my $post = $self->_GeneratePostFromFile($post_file);
if ( !defined $post ) {
if (!defined $post) {
next;
}
my $categories = $post->{categories};
for my $category ($post->{categories}->@*) {
$cached_posts_by_category->{$category} //= [];
my $slug = $post->{slug};
my $category_posts = $cached_posts_by_category->{$category};
$cached_posts_by_slug->{$slug} = $post;
push @$category_posts, $post;
}
my $category = $post->{category};
$cached_posts_by_category->{$category} //= [];
my $slug = $post->{slug};
my $category_posts = $cached_posts_by_category->{$category};
$cached_posts_by_slug->{$slug} = $post;
push @$category_posts, $post;
}
}
sub Retrieve ( $self, $filters = 1 ) {
sub Retrieve {
my $self = shift;
if ( defined $cached_posts_by_category && defined $cached_posts_by_slug ) {
return $self->_ReturnCacheFilter($filters);
return $self->_ReturnCacheFilter;
}
$self->_GeneratePostCache();
return $self->_ReturnCacheFilter($filters);
return $self->_ReturnCacheFilter;
}
my $cache_all_post_categories = {};
sub RetrieveAllPostsForCategory ( $self, $category_name ) {
if (defined $cache_all_post_categories->{$category_name}) {
return $cache_all_post_categories->{$category_name};
}
my $categories = BurguillosInfo::Categories->new->Retrieve;
my $category = $categories->{$category_name};
if ( defined $cache_all_post_categories->{$category_name} ) {
my $posts = $cache_all_post_categories->{$category_name};
return $self->shufflePostsIfRequired( $category, $posts );
}
my $posts = $self->RetrieveDirectPostsForCategory($category_name);
my $posts = $self->RetrieveDirectPostsForCategory($category_name);
for my $child_category ( $category->{children}->@* ) {
my $child_category_name = $child_category->{slug};
push @$posts,
@{ $self->RetrieveDirectPostsForCategory($child_category_name) };
@{$self->RetrieveDirectPostsForCategory($child_category_name)};
}
@$posts = sort {
DateTime::Format::ISO8601->parse_datetime( $b->{date} )
<=> DateTime::Format::ISO8601->parse_datetime( $a->{date} )
@$posts = sort {
DateTime::Format::ISO8601->parse_datetime($b->{date}) <=>
DateTime::Format::ISO8601->parse_datetime($a->{date})
} @$posts;
$cache_all_post_categories->{$category_name} = $posts;
return $self->shufflePostsIfRequired( $category, $posts );
}
sub comparePinned ( $self, $a, $b ) {
my $cmp = $b->{pinned} <=> $a->{pinned};
if ( $cmp != 0 ) {
return $cmp;
}
return int( rand(3) ) - 1;
}
sub shufflePostsIfRequired ( $self, $category, $posts ) {
my $pinned_posts = [
sort { $self->comparePinned( $a, $b ) }
grep { defined $_->{pinned} } @$posts
];
$posts = [ grep { !exists $_->{pinned} } @$posts ];
if ( exists $category->{random} && $category->{random} ) {
require List::AllUtils;
$posts = [ List::AllUtils::shuffle @$posts ];
}
return [ @$pinned_posts, @$posts ];
return $posts;
}
sub RetrieveDirectPostsForCategory ( $self, $category_name ) {
@ -223,19 +179,18 @@ sub RetrieveDirectPostsForCategory ( $self, $category_name ) {
}
my $posts = $post_by_category->{$category_name};
$posts //= [];
return $self->shufflePostsIfRequired( $category, [@$posts] );
return [@$posts];
}
sub PreviewOg ( $self, $post, $isWhatsApp ) {
my $title = $post->{title};
my $content = $post->{content};
my $image_file = $post->{image};
my $image_bottom_preview = $post->{image_bottom_preview};
if ($isWhatsApp) {
return BurguillosInfo::Preview->WhatsappAlternativeGenerate( $title,
$content, $image_file, $image_bottom_preview );
}
return BurguillosInfo::Preview->Generate( $title, $content, $image_file,
$image_bottom_preview );
sub PreviewOg {
my $self = shift;
my $post = shift;
my $title = $post->{title};
my $content = $post->{content};
my $image_file = $post->{image};
return BurguillosInfo::Preview->Generate($title, $content, $image_file);
}
1;

View File

@ -13,57 +13,31 @@ use Path::Tiny;
use Const::Fast;
use Capture::Tiny qw/capture/;
use MIME::Base64;
use Digest::SHA qw/sha512_hex/;
use Encode;
const my $CURRENT_FILE => __FILE__;
const my $ROOT_PROJECT => path($CURRENT_FILE)->parent->parent->parent;
const my $PUBLIC_DIR => $ROOT_PROJECT->child('public');
const my $BURGUILLOS_LOGO => $PUBLIC_DIR->child('img/burguillos-new-logo.svg');
const my $SVG_WIDTH => 1200;
const my $SVG_HEIGHT => 630;
const my $SVG_EMBEDDED_IMAGE_MAX_WIDTH => 1200;
const my $SVG_EMBEDDED_IMAGE_MAX_HEIGHT => 400;
const my $SVG_HEIGHT => 627;
const my $SVG_EMBEDDED_IMAGE_MAX_WIDTH => 1000;
const my $SVG_EMBEDDED_IMAGE_MAX_HEIGHT => 200;
sub Generate (
$self, $title, $content,
$image_file = undef,
$image_bottom_preview = undef
)
{
my $sha512 = sha512_hex(Encode::encode('utf8', $title.$content.($image_file//'').($image_bottom_preview//'')));
my $cached_image = path("public/img/preview.$sha512.generated.png");
if (!-f $cached_image) {
my $dom = Mojo::DOM->new($content);
$content = $dom->all_text;
sub Generate($self, $title, $content, $image_file) {
my $dom = Mojo::DOM->new($content);
$content = $dom->all_text;
my $svg = $self->_GenerateSVGPreview(
$self->_DivideTextContentInLines($title, 62)->[0],
$self->_DivideTextContentInLines($content),
$image_file, $image_bottom_preview
);
$cached_image->spew_raw($self->_SVGToPNG($svg));
}
return $cached_image->slurp_raw;
my $svg =
$self->_GenerateSVGPreview( $title, $self->_DivideTextContentInLines($content), $image_file );
return $self->_SVGToPNG($svg);
}
sub WhatsappAlternativeGenerate($self, $title, $content, $image_file = undef, $image_bottom_preview = undef) {
my $complete_png = $self->Generate($title, $content, $image_file, $image_bottom_preview);
my ( $stdout, $stderr ) = capture {
open my $fh, '|-', 'convert', '/dev/stdin', '-resize', "@{[$SVG_WIDTH/2]}x@{[$SVG_HEIGHT/2]}", 'png:fd:1';
binmode $fh, ':raw';
print $fh $complete_png;
close $fh;
};
say STDERR $stderr;
return $stdout;
}
sub _ToPng ( $self, $image ) {
if ( $image =~ /\.\w+$/ ) {
sub _ToPng($self, $image) {
if ($image =~ /\.\w+$/) {
my $new_image = $image =~ s/\.\w+$/.generated.png/r;
say $new_image;
if ( !-e $new_image ) {
if (!-e $new_image) {
system 'convert', '-background', 'none', "$image", "$new_image";
}
$image = $new_image;
@ -71,7 +45,7 @@ sub _ToPng ( $self, $image ) {
return path($image);
}
sub _GenerateSVGPreviewHeaderBar ( $self, $svg, $group ) {
sub _GenerateSVGPreviewHeaderBar($self, $svg, $group) {
$group->rect(
x => 0,
y => 0,
@ -87,9 +61,10 @@ sub _GenerateSVGPreviewHeaderBar ( $self, $svg, $group ) {
style => { fill => '#F8F8FF' }
);
my $burguillos_logo_png = path( $self->_ToPng($BURGUILLOS_LOGO) );
my $burguillos_logo_png = path($self->_ToPng($BURGUILLOS_LOGO));
say $burguillos_logo_png;
say '' . $burguillos_logo_png;
say ''.$burguillos_logo_png;
$group->image(
x => 10,
y => 5,
@ -105,9 +80,7 @@ sub _GenerateSVGPreviewHeaderBar ( $self, $svg, $group ) {
)->cdata('Burguillos.info');
}
sub _GenerateSVGPreview ( $self, $title, $content, $image_file,
$image_bottom_preview )
{
sub _GenerateSVGPreview($self, $title, $content, $image_file) {
my @content = @$content;
my $svg = SVG->new( width => $SVG_WIDTH, height => $SVG_HEIGHT );
@ -119,40 +92,37 @@ sub _GenerateSVGPreview ( $self, $title, $content, $image_file,
}
);
$self->_GenerateSVGPreviewHeaderBar( $svg, $group );
$self->_GenerateSVGPreviewHeaderBar($svg, $group);
my $new_y;
if ( defined $image_file ) {
$new_y = $self->_AttachImageSVG( $svg, $group, $image_file,
$image_bottom_preview );
$new_y = $self->_AttachImageSVG( $group, $image_file );
}
$new_y //= 100;
$group->text(
x => 10,
y => $new_y,
style => { 'font-size' => 42 }
style => { 'font-size' => 50 }
)->cdata($title);
my $n = 0;
for my $line (@content) {
next if $line =~ /^\s*$/;
$group->text(
x => 10,
y => $new_y + 40 + ( 30 * $n ),
style => { 'font-size' => 32 }
style => { 'font-size' => 38 }
)->cdata($line);
$n++;
last if $n > 2;
}
return $svg->xmlify;
}
sub _SVGToPNG ( $self, $svg ) {
sub _SVGToPNG($self, $svg) {
my ( $stdout, $stderr ) = capture {
open my $fh, '|-', qw{convert /dev/stdin png:fd:1};
binmode $fh, ':utf8';
binmode $fh, 'utf8';
print $fh $svg;
close $fh;
};
@ -160,10 +130,10 @@ sub _SVGToPNG ( $self, $svg ) {
return $stdout;
}
sub _DivideTextContentInLines ( $self, $content, $n_chars_per_line = 79 ) {
$content =~ s/(\s)\s+/$1/g;
sub _DivideTextContentInLines($self, $content) {
my @content_divided_in_lines = split /\n/, $content;
my @new_content;
my $n_chars_per_line = 70;
for my $line (@content_divided_in_lines) {
if ( length($line) <= $n_chars_per_line ) {
@ -183,11 +153,9 @@ sub _DivideTextContentInLines ( $self, $content, $n_chars_per_line = 79 ) {
}
return \@new_content;
}
sub _AttachImageSVG ( $self, $svg, $group, $image_file, $image_bottom_preview )
{
sub _AttachImageSVG($self, $svg, $image_file) {
$image_file = $PUBLIC_DIR->child( './' . $image_file );
$image_file = path( $self->_ToPng($image_file) );
$image_file = path($self->_ToPng($image_file));
my ( $stdout, $stderr, $error ) = capture {
system qw/identify -format "%wx%h"/, $image_file;
};
@ -196,10 +164,6 @@ sub _AttachImageSVG ( $self, $svg, $group, $image_file, $image_bottom_preview )
return;
}
my ( $width, $height ) = $stdout =~ /^"(\d+)x(\d+)"$/;
$height = int( $height * 1200 / $width );
$width = 1200;
my $height_complete_image = ( 1200 / $width ) * $height;
if ( $height > $SVG_EMBEDDED_IMAGE_MAX_HEIGHT ) {
$width /= $height / $SVG_EMBEDDED_IMAGE_MAX_HEIGHT;
$width = int($width);
@ -212,36 +176,18 @@ sub _AttachImageSVG ( $self, $svg, $group, $image_file, $image_bottom_preview )
$width = $SVG_EMBEDDED_IMAGE_MAX_WIDTH;
}
my $defs = $svg->defs();
my $clip_path = $defs->clipPath( id => 'cut-top' );
$clip_path->rect( x => 0, y => 50, width => 1200, height => $height );
my $x = 0;
my $y_image = 50 - $height_complete_image + $height;
if ( defined $image_bottom_preview
&& $height_complete_image > $SVG_EMBEDDED_IMAGE_MAX_HEIGHT )
{
$y_image += $height_complete_image - $image_bottom_preview;
}
my $y = 50;
my $x = int( ( $SVG_WIDTH / 2 ) - ( $width / 2 ) );
my $y = 90;
my ($output) = capture {
system qw/file --mime-type/, $image_file;
};
my ($format) = $output =~ /(\S+)$/;
$group->image(
x => 0,
y => $y_image,
width => $SVG_WIDTH,
height => $height_complete_image,
-href => "data:$format;base64," . encode_base64( $image_file->slurp ),
'clip-path' => 'url(#cut-top)',
);
$group->rect(
x => 0,
y => $y + $height,
width => $SVG_WIDTH,
height => $SVG_HEIGHT,
style => { fill => 'azure' },
$svg->image(
x => $x,
y => $y,
width => $width,
height => $height,
-href => "data:$format;base64," . encode_base64( $image_file->slurp )
);
return $y + $height + 50;
}

View File

@ -10,22 +10,17 @@
"author": "",
"license": "AGPL-v3",
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.62.0",
"eslint": "^8.53.0",
"eslint-config-prettier": "^9.0.0",
"@typescript-eslint/eslint-plugin": "^5.59.2",
"@typescript-eslint/parser": "^5.59.2",
"eslint": "^8.40.0",
"eslint-plugin-no-relative-import-paths": "^1.5.2",
"husky": "^8.0.3",
"lint-staged": "^14.0.1",
"prettier": "^3.0.3",
"prettier-eslint": "^16.1.2",
"typescript": "^5.2.2",
"typescript": "^5.0.4",
"webpack-cli": "^5.1.4"
},
"dependencies": {
"babel-loader": "^9.1.3",
"ol": "^8.1.0",
"tablesort": "^5.3.0",
"ts-loader": "^9.5.0"
"tablesort": "^5.3.0"
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,5 @@
html {
height: 100%;
touch-action: none; }
height: 100%; }
body {
margin: 0;
@ -9,109 +8,6 @@ body {
min-height: 100%;
width: 100%;
height: 100%; }
body summary h2, body summary h3, body summary h4, body summary h5 {
display: inline; }
body converse-muc-sidebar {
display: none !important; }
body div.converse-container {
width: 100%;
height: 400px;
margin-left: 0px; }
body div.page-contents div.footer p.attribution {
font-size: 0.8em; }
body div.page-contents div.footer p.attribution a {
font-size: 0.8em; }
body span.round-center {
background: blueviolet;
color: #FEFEFA;
line-height: 100%;
aspect-ratio: 1 / 1;
display: inline-flex;
border-radius: 0.3em;
height: 0.7em;
font-size: 0.7em;
padding: 0.3em;
text-align: center;
justify-content: center;
align-items: center;
vertical-align: middle;
margin-bottom: 0.15em; }
body div.search-overlay {
overflow-y: scroll;
display: none;
position: fixed;
height: 100%;
width: 100%;
background: white;
z-index: 3;
top: 0;
flex-direction: column; }
body div.search-overlay.active {
display: flex; }
body div.search-overlay div.search-results {
margin: 7px; }
body div.search-overlay div.search-results img {
width: 75px; }
body div.search-overlay div.search-results div.search-result div.row-title-url-image {
display: flex;
flex-direction: row; }
body div.search-overlay div.search-results div.search-result div.row-title-url-image img {
margin: 10px; }
body div.search-overlay div.bounding-search-bar {
margin: 7px;
width: calc(100% - 20px);
border-radius: 10px;
height: 60px;
display: flex; }
body div.search-overlay div.bounding-search-bar div.search {
width: calc(100% - 60px);
height: 60px;
margin-left: 0px;
margin-right: 0px; }
body div.search-overlay div.bounding-search-bar a.up, body div.search-overlay div.bounding-search-bar a.down {
display: none; }
body div.search-overlay div.bounding-search-bar a.exit-search {
width: 60px;
background: whitesmoke;
height: 60px;
display: flex;
justify-content: center;
align-items: center; }
body div.search-overlay div.bounding-search-bar a.exit-search img {
width: 60%; }
body div.search {
background: whitesmoke;
margin-left: 10px;
margin-right: 10px;
display: flex; }
body div.search a.search-icon {
height: calc(100% - 40px);
align-self: center;
margin: 20px;
margin-left: 7px;
margin-right: 7px;
display: flex;
background: aliceblue;
align-items: center;
padding: 7px;
border-radius: 10px;
border: solid gray 1px;
aspect-ratio: 1 / 1;
width: auto; }
body div.search a.search-icon img {
height: 80%;
aspect-ratio: 1 / 1; }
body div.search div.fake-text-box {
width: calc(100% - 60px);
display: flex;
align-items: center; }
body div.search div.fake-text-box input[type="text"] {
font-size: 30px;
width: 100%;
height: 70%;
background: none;
border: none;
outline: none; }
body p, body h1, body h2, body h3, body h4, body a {
font-family: 'arial'; }
body *.android {
@ -130,16 +26,10 @@ body {
body div.carousel {
position: fixed;
top: 80%;
height: 20%;
width: 100%; }
height: calc(20% - 6px);
width: calc(100% - 6px);
border: solid 3px black; }
body div.carousel a {
position: absolute;
top: 0;
border: solid 3px black;
width: calc(100% - 6px);
height: calc(100% - 6px);
left: 100%;
transition: left 1s ease-in;
font-size: 13px;
background: #f2eb8c;
color: blueviolet;
@ -147,18 +37,14 @@ body {
text-align: center;
justify-content: space-between;
align-items: center;
height: 100%;
text-decoration: none; }
body div.carousel a.show {
left: 0%; }
body div.carousel a.remove {
left: -100%; }
body div.carousel a:hover, body div.carousel a:focus {
background: blueviolet;
color: #f2eb8c; }
body div.carousel a p {
margin-bottom: 1px; }
body div.carousel a h4 {
margin: 0; }
body div.carousel div.promoted-tag, body div.carousel h3 {
margin: 0;
margin-right: 5px; }
body div.carousel img {
margin: 10px;
height: calc(100% - 20px);
@ -187,8 +73,7 @@ body {
height: 100%;
text-decoration: none;
color: #f2eb8c;
margin: 0;
background: blueviolet; }
margin: 0; }
body nav a:hover, body nav a:focus {
background: #f2eb8c;
color: blueviolet; }
@ -199,89 +84,35 @@ body {
body nav.desktop {
display: none; }
body nav.desktop a {
vertical-align: middle; }
body nav.desktop a.search-icon {
width: 60px;
height: 60px;
display: flex;
align-items: center;
justify-content: center; }
body nav.desktop a.search-icon img {
background: aliceblue;
border-radius: 10px;
padding: 10%;
width: 60%;
height: 60%; }
body div.transparent-fullscreen-hide {
position: fixed;
background: black;
left: 0;
width: 100%;
opacity: 40%;
top: 80px;
height: calc(100% - 60px);
z-index: 250;
display: none; }
body div.transparent-fullscreen-hide.show {
display: block; }
vertical-align: middle;
background: blueviolet; }
body nav.mobile-foldable {
visibility: hidden;
position: fixed;
left: 100%;
width: Min(70%, 600px);
top: 80px;
height: calc(100% - 80px);
z-index: 500;
transition: left 0.5s ease-in, visibility 0.5s ease-in;
background: #FEFEFA; }
body nav.mobile-foldable > a:first-child {
margin-top: 30px; }
display: none;
background: blueviolet;
color: #f2eb8c; }
body nav.mobile-foldable a {
display: block;
font-size: 1.1em;
height: auto;
padding-left: auto;
padding-right: auto;
color: blueviolet;
background: #FEFEFA;
margin-top: 10px;
padding: 10px;
margin-left: 10px;
border-radius: 20px;
width: calc(100% - 20px - 20px - 2px); }
body nav.mobile-foldable div.child-categories-mobile {
margin-left: 80px;
width: calc(100% - 90px - 20px); }
body nav.mobile-foldable div.child-categories-mobile a {
display: list-item;
font-size: 1em; }
display: block; }
body nav.mobile-foldable.show {
left: 30%;
visibility: visible; }
display: block; }
body nav.mobile-shortcuts > a {
display: flex;
align-items: center;
justify-content: center; }
body nav.mobile-shortcuts > a.active {
background: #FEFEFA;
color: #dcdcf5; }
body nav.mobile-shortcuts > a.active:focus {
background: #f2eb8c; }
body a.menu-expand {
padding-bottom: 9px; }
body a.menu-expand .open-menu-icon-hover {
display: none; }
body a.menu-expand:hover .open-menu-icon-hover, body a.menu-expand:focus .open-menu-icon-hover, body a.menu-expand.active .open-menu-icon-hover {
body a.menu-expand:hover .open-menu-icon-hover, body a.menu-expand:focus .open-menu-icon-hover {
display: block; }
body a.menu-expand:hover .open-menu-icon, body a.menu-expand:focus .open-menu-icon, body a.menu-expand.active .open-menu-icon {
body a.menu-expand:hover .open-menu-icon, body a.menu-expand:focus .open-menu-icon {
display: none; }
body nav > a.menu-expand > img {
width: 40px;
height: 40px; }
width: 30px;
height: 30px; }
body nav > a > img.index-image-menu {
vertical-align: middle;
width: 60px;
height: 60px; }
width: 40px;
height: 40px; }
body nav > a > img.index-image-menu, body div.burguillos-logo-container > img {
transition-property: transform;
transition-duration: 2s;
@ -289,74 +120,27 @@ body {
body nav > a:hover > img.index-image-menu,
body div.burguillos-logo-container.active > img {
transform: rotate(-1.5707963268rad); }
body div.search-in-page {
display: none;
position: fixed;
top: 80px;
height: 60px;
width: 100%;
align-items: center;
background: blueviolet;
z-index: 3; }
body div.search-in-page a.up, body div.search-in-page a.down {
display: flex;
align-items: center;
justify-content: center;
height: calc(100% - 28px);
align-self: center;
margin: 7px;
display: flex;
background: aliceblue;
align-items: center;
padding: 7px;
border-radius: 10px;
border: solid gray 1px;
aspect-ratio: 1/1; }
body div.search-in-page a.up img, body div.search-in-page a.down img {
height: 80%; }
body div.search-in-page span {
color: whitesmoke;
font-size: 25px; }
body div.search-in-page.active {
display: flex; }
body nav.mobile-shortcuts {
position: fixed;
display: flex;
align-items: center;
width: 100%;
background: blueviolet;
height: 80px;
justify-content: start;
flex-direction: row;
height: 60px;
top: 0%; }
body nav.mobile-shortcuts a {
height: 100%;
width: 80px;
width: 16.6666666667%;
padding-left: 0;
padding-top: 0;
padding-right: 0;
padding-bottom: 0; }
body nav.mobile-shortcuts a.go-to-index {
position: absolute;
left: 0;
top: 0; }
body nav.mobile-shortcuts div.search {
position: absolute;
left: 80px;
top: 10%;
width: Min(calc(100% - 90px * 2), 500px);
height: 80%;
border-radius: 10px; }
body nav.mobile-shortcuts a.menu-expand {
position: absolute;
left: Min(calc(100% - 80px), 600px);
top: 0;
align-self: end; }
body nav.mobile-shortcuts div {
width: 66.6666666667%; }
body div.page-contents {
background: #FEFEFA;
position: fixed;
top: 80px;
height: calc(80% - 80px);
top: 60px;
height: calc(80% - 60px);
width: 100%;
overflow-y: scroll; }
body div.page-contents div.child-categories-mobile a {
@ -373,11 +157,6 @@ body {
border-collapse: collapse;
width: 100%;
table-layout: fixed; }
body div.page-contents table tr:hover {
background: blueviolet;
color: #f2eb8c; }
body div.page-contents table tr:hover th, body div.page-contents table tr:hover td {
border: 3px solid #f2eb8c; }
body div.page-contents table td, body div.page-contents table th {
font-size: 12px; }
body div.page-contents th, body div.page-contents td {
@ -398,13 +177,7 @@ body {
body div.page-contents div.description div.articles {
display: flex;
flex-direction: row;
flex-wrap: wrap;
font-size: 0.7rem; }
body div.page-contents div.description div.articles a {
width: 45%;
margin-left: 5%; }
body div.page-contents div.description div.articles a:nth-child(2n+1) {
margin-left: 0%; }
flex-wrap: wrap; }
body div.page-contents div.description div.articles div.image-container {
margin-left: 2.5%;
margin-top: 10px;
@ -418,9 +191,11 @@ body {
background: white;
max-height: 100%;
max-width: 100%;
min-width: 277px;
border: solid 1px black; }
body div.page-contents div.description div.articles a {
min-height: 90%;
width: 100%;
display: block;
text-decoration: none;
text-overflow: ellipsis;
@ -434,11 +209,14 @@ body {
height: 90%;
padding: 5%;
padding-top: 1%;
background: #f2eb8c;
color: blueviolet;
box-shadow: 8px 8px 1px 0px #8ddfd6;
border: 3px solid black; }
body div.page-contents div.description div.articles a article p, body div.page-contents div.description div.articles a article h4, body div.page-contents div.description div.articles a article h3, body div.page-contents div.description div.articles a article h2 {
margin: 0px; }
body div.page-contents div.description div.articles a article p {
font-size: 0.9rem; }
body div.page-contents div.description div.articles a article div.article-up-part {
height: 12em; }
body div.page-contents div.description div.articles a article div.article-down-part {
@ -516,67 +294,45 @@ body {
body div.page-contents table th, body div.page-contents table td {
font-size: 20px; } }
@media (min-width: 768px) {
body converse-muc-sidebar {
display: flex !important; }
body converse-muc-sidebar.hidden {
display: none !important; }
body div.converse-container {
margin-left: 15px; } }
@media (min-width: 694px) {
body div.carousel a {
font-size: 20px; }
body div.carousel h3 {
font-size: 25px; }
body div.page-contents div.description div.articles a {
width: 45%;
margin-left: 5%; }
body div.page-contents div.description div.articles a:nth-child(2n+1) {
margin-left: 0%; }
body div.page-contents img {
max-width: 694px; } }
@media (min-width: 700px) {
body nav.mobile-foldable {
left: -100%; }
body nav.mobile-foldable.show {
left: 0; } }
@media (min-width: 1333px) {
body div.page-contents div.description div.articles a {
width: 30%;
margin-left: 3%; }
body div.page-contents div.description div.articles a:nth-child(2n+1) {
margin-left: 3%; }
body div.page-contents div.description div.articles a:nth-child(3n+1) {
margin-left: 0%; } }
@media (min-width: 848px) {
body div.page-contents div.description div.articles a {
width: 30%;
margin-left: 3%; }
body div.page-contents div.description div.articles a:nth-child(2n+1) {
margin-left: 3%; }
body div.page-contents div.description div.articles a:nth-child(3n+1) {
margin-left: 0%; } }
@media (min-width: 1333px) {
body div.page-contents div.description div.articles a {
width: 22%;
margin-left: 3%; }
body div.page-contents div.description div.articles a:nth-child(3n+1) {
margin-left: 3%; }
body div.page-contents div.description div.articles a:nth-child(4n+1) {
margin-left: 0%; } }
@media (max-width: 200px) {
body {
font-size: 20px; } }
@media (max-height: 400px) {
body div.carousel {
height: 120px;
top: calc(100% - 120px); }
@media (min-width: 1100px) {
body nav.mobile-shortcuts {
display: none; }
body div.page-contents {
height: calc(100% - 60px - 120px); } }
top: 0%;
left: 5%;
height: 80%;
width: 90%;
border: solid 1px black; }
body div.page-contents nav.mobile-foldable, body div.page-contents nav.mobile-foldable.show {
display: none; }
body div.page-contents div.description {
margin-left: 10%;
margin-right: 10%; }
body div.page-contents nav.desktop {
display: block;
height: auto;
height: 60px; }
body div.page-contents nav.desktop a {
display: table-cell;
height: 60px; }
body div.page-contents nav.desktop a img.index-image-menu {
height: 40px;
width: 40px; }
body div.page-contents.no-carousel {
height: 100%; } }
@media (min-width: 1333px) {
body div.page-contents div.description div.articles a {
width: 30%;
margin-left: 3%; }
body div.page-contents div.description div.articles a:nth-child(2n+1) {
margin-left: 3%; }
body div.page-contents div.description div.articles a:nth-child(3n+1) {
margin-left: 0%; } }

View File

@ -8,162 +8,12 @@ $background-secondary: #635283;
$color-secondary: #8eea6d;
$accent-secondary: #fde68f;
$primary-secondary: #590e11;
$background_sidebar: $background-page; //#F5F5DC;
$color_sidebar: #dcdcf5;
$attribution_font_size: 0.8em;
html {
height: 100%;
touch-action: none;
}
body {
summary {
h2, h3, h4, h5 {
display: inline;
}
}
converse-muc-sidebar {
display: none !important;
}
div.converse-container {
width: 100%;
height: 400px;
margin-left: 0px;
}
div.page-contents div.footer p.attribution {
font-size: $attribution_font_size;
a {
font-size: $attribution_font_size;
}
}
span.round-center {
background: $background_div;
color: $background_sidebar;
line-height: 100%;
aspect-ratio: 1 / 1;
display: inline-flex;
border-radius: 0.3em;
height: 0.7em;
font-size: 0.7em;
padding: 0.3em;
text-align: center;
justify-content: center;
align-items: center;
vertical-align: middle;
margin-bottom: 0.15em;
}
div.search-overlay {
overflow-y: scroll;
display: none;
position: fixed;
height: 100%;
width: 100%;
background: white;
z-index: 3;
top: 0;
flex-direction: column;
&.active {
display: flex;
}
div.search-results {
margin: 7px;
img {
width: 75px;
}
div.search-result {
div.row-title-url-image {
display: flex;
flex-direction: row;
img {
margin: 10px;
}
}
}
}
div.bounding-search-bar {
margin: 7px;
width: calc(100% - 20px);
border-radius: 10px;
height: 60px;
display: flex;
div.search {
width: calc(100% - 60px);
height: 60px;
margin-left: 0px;
margin-right: 0px;
}
a.up, a.down {
display: none;
}
a.exit-search {
width: 60px;
background: whitesmoke;
height: 60px;
display: flex;
justify-content: center;
align-items: center;
img {
width: 60%;
}
}
}
}
div.search {
background: whitesmoke;
margin-left: 10px;
margin-right: 10px;
display: flex;
a.search-icon {
height: calc(100% - 40px);
align-self: center;
margin: 20px;
margin-left: 7px;
margin-right: 7px;
display: flex;
background: aliceblue;
align-items: center;
padding: 7px;
border-radius: 10px;
border: solid gray 1px;
aspect-ratio: 1 / 1;
width: auto;
img {
height: 80%;
aspect-ratio: 1 / 1;
}
}
div.fake-text-box {
width: calc(100% - 60px);
display: flex;
align-items: center;
input[type="text"] {
font-size: 30px;
width: 100%;
height: 70%;
background: none;
border: none;
outline: none;
}
}
}
p, h1, h2, h3, h4, a {
font-family: 'arial';
}
@ -196,24 +46,11 @@ body {
div.carousel {
position: fixed;
top: 80%;
height: 20%;
width: 100%;
height: calc(20% - 6px);
width: calc(100% - 6px);
border: solid 3px black;
a {
position: absolute;
top: 0;
border: solid 3px black;
width: calc(100% - 6px);
height: calc(100% - 6px);
left: 100%;
transition: left 1s ease-in;
&.show {
left: 0%;
}
&.remove {
left: -100%;
}
font-size: 13px;
background: $color_div;
color: $background_div;
@ -221,18 +58,18 @@ body {
text-align: center;
justify-content: space-between;
align-items: center;
height: 100%;
text-decoration: none;
&:hover, &:focus {
background: $background_div;
color: $color_div;
}
p {
margin-bottom: 1px;
}
h4 {
margin: 0;
}
}
div.promoted-tag, h3 {
margin: 0;
margin-right: 5px;
}
img {
@ -276,7 +113,6 @@ body {
text-decoration: none;
color: $color_div;
margin: 0;
background: $background_div;
&:hover, &:focus {
background: $color_div;
@ -296,100 +132,30 @@ body {
a {
vertical-align: middle;
}
a.search-icon {
width: 60px;
height: 60px;
display: flex;
align-items: center;
justify-content: center;
img {
background: aliceblue;
border-radius: 10px;
padding: 10%;
width: 60%;
height: 60%;
}
}
}
div.transparent-fullscreen-hide {
position: fixed;
background: black;
left: 0;
width: 100%;
opacity: 40%;
top: 80px;
height: calc(100% - 60px);
z-index: 250;
display: none;
&.show {
display: block;
background: $background_div;
}
}
nav.mobile-foldable {
visibility: hidden;
position: fixed;
left: 100%;
width: Min(70%, 600px);
top: 80px;
height: calc(100% - 80px);
z-index: 500;
transition: left 0.5s ease-in, visibility 0.5s ease-in;
background: $background_sidebar;
& > a:first-child {
margin-top: 30px;
}
display: none;
background: $background_div;
color: $color_div;
a {
//background: $color_div;
//color: $background_div;
display: block;
font-size: 1.1em;
height: auto;
padding-left: auto;
padding-right: auto;
color: $background_div;
// border: 1px solid black;
background: $background_sidebar;
margin-top: 10px;
padding: 10px;
margin-left: 10px;
border-radius: 20px;
width: calc(100% - 20px - 20px - 2px);
}
div.child-categories-mobile {
margin-left: 80px;
width: calc(100% - 90px - 20px);
a {
display: list-item;
font-size: 1em;
}
}
}
nav.mobile-foldable.show {
left: 30%;
visibility: visible;
display: block;
}
nav.mobile-shortcuts > a {
display: flex;
align-items: center;
justify-content: center;
&.active {
background: $background_sidebar;
color: $color_sidebar;
&:focus {
background: $color_div;
}
}
}
a.menu-expand {
@ -399,7 +165,7 @@ body {
display: none;
}
&:hover, &:focus, &.active {
&:hover, &:focus {
.open-menu-icon-hover {
display: block;
}
@ -411,14 +177,14 @@ body {
}
nav > a.menu-expand > img {
width: 40px;
height: 40px;
width: 30px;
height: 30px;
}
nav > a > img.index-image-menu {
vertical-align: middle;
width: 60px;
height: 60px;
width: 40px;
height: 40px;
}
nav > a > img.index-image-menu, div.burguillos-logo-container > img {
@ -432,94 +198,33 @@ body {
transform: rotate(-1.5707963268rad);
}
div.search-in-page {
display: none;
position: fixed;
top: 80px;
height: 60px;
width: 100%;
align-items: center;
background: $background_div;
z-index: 3;
a.up, a.down {
display: flex;
align-items: center;
justify-content: center;
height: calc(100% - 28px);
align-self: center;
margin: 7px;
display: flex;
background: aliceblue;
align-items: center;
padding: 7px;
border-radius: 10px;
border: solid gray 1px;
aspect-ratio: 1/1;
img {
height: 80%;
}
}
span {
color: whitesmoke;
font-size: 25px;
}
&.active {
display: flex;
}
}
nav.mobile-shortcuts {
position: fixed;
display: flex;
align-items: center;
width: 100%;
background: $background_div;
height: 80px;
justify-content: start;
flex-direction: row;
height: 60px;
top: 0%;
a {
height: 100%;
width: 80px;
width: (100% / 6);
padding-left: 0;
padding-top: 0;
padding-right: 0;
padding-bottom: 0;
}
a.go-to-index {
position: absolute;
left: 0;
top: 0;
}
div.search {
position: absolute;
left: 80px;
top: 10%;
width: Min(calc(100% - 90px * 2), 500px);
height: 80%;
border-radius: 10px;
}
a.menu-expand {
position: absolute;
left: Min(calc(100% - 80px), 600px);
top: 0;
align-self: end;
div {
width: 100% * 4 / 6;
}
}
div.page-contents {
background: $background-page;
position: fixed;
top: 80px;
height: calc(80% - 80px);
top: 60px;
height: calc(80% - 60px);
width: 100%;
overflow-y: scroll;
@ -541,15 +246,6 @@ body {
border-collapse: collapse;
width: 100%;
tr:hover {
background: $background_div;
color: $color_div;
th, td {
border: 3px solid $color_div;
}
}
td, th {
font-size: 12px;
}
@ -586,15 +282,6 @@ body {
display: flex;
flex-direction: row;
flex-wrap: wrap;
font-size: 0.7rem;
a {
&:nth-child(2n+1) {
margin-left: 0%;
}
width: 45%;
margin-left: 5%;
}
div.image-container {
margin-left: 2.5%;
@ -610,12 +297,14 @@ body {
background: white;
max-height: 100%;
max-width: 100%;
min-width: 277px;
border: solid 1px black;
}
}
a {
min-height: 90%;
width: 100%;
display: block;
text-decoration: none;
text-overflow: ellipsis;
@ -638,6 +327,10 @@ body {
margin: 0px;
}
p {
font-size: 0.9rem;
}
div.article-up-part {
height: 12em;
}
@ -652,6 +345,7 @@ body {
padding: 5%;
padding-top: 1%;
background: $color_div;
color: $background_div;
box-shadow: 8px 8px 1px 0px #8ddfd6;
border: 3px solid black;
@ -775,32 +469,9 @@ body {
}
}
}
@media (min-width: 768px) {
body {
converse-muc-sidebar {
display: flex !important;
&.hidden {
display: none !important;
}
}
div.converse-container {
margin-left: 15px;
}
}
}
@media (min-width: 694px) {
body {
div.carousel {
a {
font-size: 20px;
}
h3 {
font-size: 25px;
}
}
div.page-contents {
div.description {
div.articles {
@ -814,22 +485,52 @@ body {
}
}
}
img {
max-width: 694px;
}
}
}
}
@media (min-width: 700px) {
@media (min-width: 1100px) {
body {
nav.mobile-foldable {
left: -100%;
nav.mobile-shortcuts {
display: none;
}
div.page-contents {
nav.mobile-foldable, nav.mobile-foldable.show {
display: none;
}
nav.mobile-foldable.show {
left: 0;
div.description {
margin-left: 10%;
margin-right: 10%;
}
nav.desktop {
display: block;
height: auto;
height: 60px;
a {
display: table-cell;
height: 60px;
img.index-image-menu {
height: 40px;
width: 40px;
}
}
}
top: 0%;
left: 5%;
height: 80%;
width: 90%;
border: solid 1px black;
}
div.page-contents.no-carousel {
height: 100%;
}
}
}
@ -855,67 +556,3 @@ body {
}
}
}
@media (min-width: 848px) {
body {
div.page-contents {
div.description {
div.articles {
a {
&:nth-child(2n+1) {
margin-left: 3%;
}
&:nth-child(3n+1) {
margin-left: 0%;
}
width: 30%;
margin-left: 3%;
}
}
}
}
}
}
@media (min-width: 1333px) {
body {
div.page-contents {
div.description {
div.articles {
a {
&:nth-child(3n+1) {
margin-left: 3%;
}
&:nth-child(4n+1) {
margin-left: 0%;
}
width: 22%;
margin-left: 3%;
}
}
}
}
}
}
@media (max-width: 200px) {
body {
font-size: 20px;
}
}
@media (max-height: 400px) {
body {
div.carousel {
height: 120px;
top: calc(100% - 120px);
}
div.page-contents {
height: calc(100% - 60px - 120px);
}
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

79316
public/dist/converse.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,371 +0,0 @@
/*!
MIT License
Copyright (c) 2018 Arturas Molcanovas <a.molcanovas@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
/*!
localForage -- Offline Storage, Improved
Version 1.10.0
https://localforage.github.io/localForage
(c) 2013-2017 Mozilla, Apache License 2.0
*/
/*!
* Sizzle CSS Selector Engine v2.3.6
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
* Date: 2021-02-16
*/
/*!
* URI.js - Mutating URLs
*
* Version: 1.19.11
*
* Author: Rodney Rehm
* Web: http://medialize.github.io/URI.js/
*
* Licensed under
* MIT License http://www.opensource.org/licenses/mit-license
*
*/
/*!
* URI.js - Mutating URLs
* IPv6 Support
*
* Version: 1.19.11
*
* Author: Rodney Rehm
* Web: http://medialize.github.io/URI.js/
*
* Licensed under
* MIT License http://www.opensource.org/licenses/mit-license
*
*/
/*!
* URI.js - Mutating URLs
* Second Level Domain (SLD) Support
*
* Version: 1.19.11
*
* Author: Rodney Rehm
* Web: http://medialize.github.io/URI.js/
*
* Licensed under
* MIT License http://www.opensource.org/licenses/mit-license
*
*/
/*!
2020 Jason Mulligan <jason.mulligan@avoidwork.com>
@version 7.0.0
*/
/*!
MIT License
Copyright (c) 2018 Arturas Molcanovas <a.molcanovas@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
/*! @license DOMPurify 2.3.6 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/2.3.6/LICENSE */
/*! https://mths.be/punycode v1.4.0 by @mathias */
/**
* @copyright 2022, the Converse.js contributors
* @license Mozilla Public License (MPLv2)
* @description This is the form utilities module.
*/
/**
* @copyright 2022, the Converse.js contributors
* @license Mozilla Public License (MPLv2)
*/
/**
* @copyright Alfredo Medrano Sánchez and the Converse.js contributors
* @description
* Component inspired by the one from fa-icons
* https://github.com/obsidiansoft-io/fa-icons/blob/master/LICENSE
* @license Mozilla Public License (MPLv2)
*/
/**
* @copyright JC Brand
* @license Mozilla Public License (MPLv2)
* @description A plugin which restricts Converse to only one chat.
*/
/**
* @copyright Shachaf Ben-Kiki and the Converse.js contributors
* @description
* Started as a fork of Shachaf Ben-Kiki's jsgif library
* https://github.com/shachaf/jsgif
* @license MIT License
*/
/**
* @copyright The Converse.js contributors
* @license Mozilla Public License (MPLv2)
* @description Converse.js plugin which add support for XEP-0206: XMPP Over BOSH
*/
/**
* @copyright The Converse.js contributors
* @license Mozilla Public License (MPLv2)
* @description Converse.js plugin which adds support for XEP-0198: Stream Management
*/
/**
* @copyright The Converse.js contributors
* @license Mozilla Public License (MPLv2)
* @description This is the core utilities module.
*/
/**
* @copyright The Converse.js contributors
* @license Mozilla Public License (MPLv2)
*/
/**
* @description
* Converse.js plugin which shows a list of currently open
* rooms in the "Rooms Panel" of the ControlBox.
* @copyright 2022, the Converse.js contributors
* @license Mozilla Public License (MPLv2)
*/
/**
* @description
* Converse.js plugin which add support for registering
* an "App Server" as defined in XEP-0357
* @copyright 2021, the Converse.js contributors
* @license Mozilla Public License (MPLv2)
*/
/**
* @description
* Converse.js plugin which adds views for bookmarks specified in XEP-0048.
* @copyright 2022, the Converse.js contributors
* @license Mozilla Public License (MPLv2)
*/
/**
* @description Converse.js (A browser based XMPP chat client)
* @copyright 2021, The Converse developers
* @license Mozilla Public License (MPLv2)
*/
/**
* @description Converse.js plugin which adds views for XEP-0048 bookmarks
* @copyright 2022, the Converse.js contributors
* @license Mozilla Public License (MPLv2)
*/
/**
* @description UI code XEP-0313 Message Archive Management
* @copyright 2021, the Converse.js contributors
* @license Mozilla Public License (MPLv2)
*/
/**
* @description XEP-0313 Message Archive Management
* @copyright 2022, the Converse.js contributors
* @license Mozilla Public License (MPLv2)
*/
/**
* @license
* Copyright 2017 Google LLC
* SPDX-License-Identifier: BSD-3-Clause
*/
/**
* @license
* Copyright 2019 Google LLC
* SPDX-License-Identifier: BSD-3-Clause
*/
/**
* @license
* Copyright 2020 Google LLC
* SPDX-License-Identifier: BSD-3-Clause
*/
/**
* @license MIT or GPL-2.0
* @fileOverview Favico animations
* @author Miroslav Magda, http://blog.ejci.net
* @source: https://github.com/ejci/favico.js
* @version 0.3.10
*/
/**
* @module converse-carbons
* @copyright The Converse.js contributors
* @license Mozilla Public License (MPLv2)
* @description Implements support for XEP-0280 Message Carbons
*/
/**
* @module converse-chatboxviews
* @copyright 2022, the Converse.js contributors
* @license Mozilla Public License (MPLv2)
*/
/**
* @module converse-dragresize
* @copyright 2022, the Converse.js contributors
* @license Mozilla Public License (MPLv2)
*/
/**
* @module converse-emoji
* @copyright 2022, the Converse.js contributors
* @license Mozilla Public License (MPLv2)
*/
/**
* @module converse-fullscreen
* @license Mozilla Public License (MPLv2)
* @copyright 2022, the Converse.js contributors
*/
/**
* @module converse-headlines-view
* @copyright 2022, the Converse.js contributors
* @license Mozilla Public License (MPLv2)
*/
/**
* @module converse-minimize
* @copyright 2022, the Converse.js contributors
* @license Mozilla Public License (MPLv2)
*/
/**
* @module converse-notification
* @copyright 2022, the Converse.js contributors
* @license Mozilla Public License (MPLv2)
*/
/**
* @module converse-pubsub
* @copyright The Converse.js contributors
* @license Mozilla Public License (MPLv2)
*/
/**
* @module converse-register
* @description
* This is a Converse.js plugin which add support for in-band registration
* as specified in XEP-0077.
* @copyright 2022, the Converse.js contributors
* @license Mozilla Public License (MPLv2)
*/
/**
* @module converse-rsm
* @copyright The Converse.js contributors
* @license Mozilla Public License (MPLv2)
* @description XEP-0059 Result Set Management
* Some code taken from the Strophe RSM plugin, licensed under the MIT License
* Copyright 2006-2017 Strophe (https://github.com/strophe/strophejs)
*/
/**
* @module i18n
* @copyright 2022, the Converse.js contributors
* @license Mozilla Public License (MPLv2)
* @description This is the internationalization module
*/
/**
* @preserve jed.js https://github.com/SlexAxton/Jed
*/
/**
* Clears the specified timeout and interval.
* @method u#clearTimers
* @param {number} timeout - Id if the timeout to clear.
* @param {number} interval - Id of the interval to clear.
* @private
* @copyright Simen Bekkhus 2016
* @license MIT
*/
/**
* Creates a {@link Promise} that resolves if the passed in function returns a truthy value.
* Rejects if it throws or does not return truthy within the given max_wait.
* @method u#waitUntil
* @param {Function} func - The function called every check_delay,
* and the result of which is the resolved value of the promise.
* @param {number} [max_wait=300] - The time to wait before rejecting the promise.
* @param {number} [check_delay=3] - The time to wait before each invocation of {func}.
* @returns {Promise} A promise resolved with the value of func,
* or rejected with the exception thrown by it or it times out.
* @copyright Simen Bekkhus 2016
* @license MIT
*/
/*@cc_on!@*/

File diff suppressed because one or more lines are too long

11
public/dist/emojis.js vendored

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

Some files were not shown because too many files have changed in this diff Show More