commit 02083bd05511bcf9c25a469d54085e2551a43152 Author: Ubuntu Date: Sat Jun 27 11:49:19 2026 +0000 Primer Commit diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f2751bd --- /dev/null +++ b/Dockerfile @@ -0,0 +1,18 @@ +FROM php:8.2-apache + +# 0. Instalar ImageMagick, sus librerías base y la extensión imagick para PHP +RUN apt-get update && apt-get install -y \ + imagemagick \ + libmagickwand-dev \ + && pecl install imagick \ + && docker-php-ext-enable imagick \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +# 1. Activar mod_rewrite (para URLs amigables) +RUN a2enmod rewrite + +# 2. Permitir .htaccess (Cambiar AllowOverride None a All) +RUN sed -i '//,/<\/Directory>/ s/AllowOverride None/AllowOverride All/' /etc/apache2/apache2.conf + +# 3. Instalar y habilitar extensiones de base de datos +RUN docker-php-ext-install mysqli pdo pdo_mysql && docker-php-ext-enable mysqli \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..4484dae --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,17 @@ +version: '3.8' + +services: + web: + build: . + container_name: trastoweb-container + restart: always + ports: + - "8002:80" # IMPORTANTE: Cambiamos al 8002 para que no choque con Daikaku + volumes: + - ./src:/var/www + networks: + - red-compartida + +networks: + red-compartida: + external: true \ No newline at end of file diff --git a/src/books/0/config/config.json b/src/books/0/config/config.json new file mode 100644 index 0000000..c00eaa8 --- /dev/null +++ b/src/books/0/config/config.json @@ -0,0 +1,134 @@ +{ + "book_id": 0, + "book_name": "Libro de demo", + "settings": { + "dpi": 300, + "fonts": { + "main": "Mali-Bold.ttf", + "secondary": "Calibri.ttf" + }, + "base_font_size": 130, + "colors": { + "black": "#1E293B", + "white": "#FFFFFF", + "title": "#0284C7", + "accent": "#0D9488" + }, + "variables": { + "name": "Nombre Prota", + "FOTO_NINYO": "demo\/woman.png", + "FOTO_PAPA": "demo\/face1.png" + } + }, + "user_photo": { + "width": 450, + "height": 450 + }, + "pages": [ + { + "page_id": 0, + "description": "Portada del Cuento", + "background": "paginas\/72dpi\/1.jpg", + "elements": [ + { + "type": "photo", + "x": 1073, + "y": 622, + "width": 450, + "height": 450, + "variable": "FOTO_NINYO", + "rotation": 0 + }, + { + "type": "text", + "x": 191, + "y": 1310, + "width": 1800, + "height": 300, + "rotation": 0, + "text": { + "es": "La gran selva de {{name}}", + "en": "The great jungle of {{name}}", + "ca": "La gran selva de {{name}}" + }, + "style": { + "size": 150, + "color": "white", + "gravity": "CENTER" + }, + "variable": "" + } + ] + }, + { + "page_id": 1, + "description": "El mono juguetón", + "background": "paginas\/72dpi\/2.jpg", + "elements": [ + { + "type": "photo", + "x": 338, + "y": 268, + "width": 1417, + "height": 1417, + "variable": "FOTO_NINYO", + "rotation": 0 + }, + { + "type": "text", + "x": 467, + "y": 1676, + "width": 1350, + "height": 450, + "rotation": 0, + "text": { + "es": "¡Mira ahí, {{name}}! Un monito travieso nos saluda desde la rama de un cocotero.", + "en": "Look over there, {{name}}! A naughty little monkey waves at us from the coconut tree.", + "ca": "Mira allà, {{name}}! Un mico trapella ens saluda des de la branca d'un cocoter." + }, + "style": { + "size": 100, + "color": "black", + "gravity": "WEST" + }, + "variable": "" + } + ] + }, + { + "page_id": 2, + "description": "Pagina Extra", + "background": "paginas\/72dpi\/2.jpg", + "elements": [ + { + "type": "text", + "x": 718, + "y": 926, + "width": 600, + "height": 200, + "rotation": 162, + "text": { + "es": "Este es un texto de prueba", + "en": "New text for {{name}}!", + "ca": "Nou text per {{name}}!" + }, + "style": { + "size": 300, + "color": "title", + "gravity": "CENTER" + }, + "variable": "" + }, + { + "type": "photo", + "x": 1356, + "y": 167, + "width": 591, + "height": 591, + "rotation": 0, + "variable": "FOTO_PAPA" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/books/0/config/portada.jpg b/src/books/0/config/portada.jpg new file mode 100755 index 0000000..ac71129 Binary files /dev/null and b/src/books/0/config/portada.jpg differ diff --git a/src/books/0/demo/face1.png b/src/books/0/demo/face1.png new file mode 100755 index 0000000..759c7f8 Binary files /dev/null and b/src/books/0/demo/face1.png differ diff --git a/src/books/0/demo/face2.png b/src/books/0/demo/face2.png new file mode 100755 index 0000000..0b8030a Binary files /dev/null and b/src/books/0/demo/face2.png differ diff --git a/src/books/0/demo/man.png b/src/books/0/demo/man.png new file mode 100755 index 0000000..6709f48 Binary files /dev/null and b/src/books/0/demo/man.png differ diff --git a/src/books/0/demo/woman.png b/src/books/0/demo/woman.png new file mode 100755 index 0000000..5ed256b Binary files /dev/null and b/src/books/0/demo/woman.png differ diff --git a/src/books/0/fonts/Calibri.ttf b/src/books/0/fonts/Calibri.ttf new file mode 100755 index 0000000..2fede68 Binary files /dev/null and b/src/books/0/fonts/Calibri.ttf differ diff --git a/src/books/0/fonts/Mali-Bold.ttf b/src/books/0/fonts/Mali-Bold.ttf new file mode 100755 index 0000000..f70c67e Binary files /dev/null and b/src/books/0/fonts/Mali-Bold.ttf differ diff --git a/src/books/0/paginas/72dpi/0.jpg b/src/books/0/paginas/72dpi/0.jpg new file mode 100755 index 0000000..926fac7 Binary files /dev/null and b/src/books/0/paginas/72dpi/0.jpg differ diff --git a/src/books/0/paginas/72dpi/1.jpg b/src/books/0/paginas/72dpi/1.jpg new file mode 100755 index 0000000..1343690 Binary files /dev/null and b/src/books/0/paginas/72dpi/1.jpg differ diff --git a/src/books/0/paginas/72dpi/2.jpg b/src/books/0/paginas/72dpi/2.jpg new file mode 100755 index 0000000..080217c Binary files /dev/null and b/src/books/0/paginas/72dpi/2.jpg differ diff --git a/src/books/0/paginas/72dpi/3.png b/src/books/0/paginas/72dpi/3.png new file mode 100755 index 0000000..cb17540 Binary files /dev/null and b/src/books/0/paginas/72dpi/3.png differ diff --git a/src/books/3/config/config_11.json b/src/books/3/config/config_11.json new file mode 100644 index 0000000..35f9b21 --- /dev/null +++ b/src/books/3/config/config_11.json @@ -0,0 +1,321 @@ +{ + "book_id": 8, + "scenario_description": "1 Adulto, 1 Niño", + "settings": { + "dimensions": { "width": 2480, "height": 1748 }, + "fonts": { + "main": "Mali-Medium.ttf", + "fancy": "BerkshireSwash-Regular.ttf", + "legal": "Montserrat-Regular.ttf" + }, + "colors": { + "black": "#000000", + "white": "#FFFFFF", + "red": "#E30445", + "blue": "#00A7E3" + } + }, + "user_photo": { + "adult_width": 292, + "adult_height": 336, + "child_width": 292, + "child_height": 336, + "dedication_width": 360, + "dedication_height": 403 + }, + "pages": [ + { + "page_id": 0, + "description": "Portada", + "elements": [ + { "type": "text", "x": 1325, "y": -900, "text": "El Mejor Regalo", "style": { "font": "fancy", "size": 175, "color": "white" } }, + { "type": "text", "x": 1325, "y": -710, "text": "De La Navidad", "style": { "font": "fancy", "size": 175, "color": "white" } }, + { "type": "text", "x": 2845, "y": -1050, "text": "El Mejor Regalo De La Navidad", "style": { "font": "main", "size": 50, "color": "red", "gravity": "EAST", "rotation": -90 } }, + { "type": "photo", "content": "photo_adulto_0", "x": 3925, "y": 1452 }, + { "type": "photo", "content": "photo_hijo_1", "x": 3900, "y": 820 } + ] + }, + { + "page_id": 4, + "description": "Dedicatoria", + "elements": [ + { "type": "photo", "content": "photo_dedicatoria", "x": 353, "y": 216 }, + { "type": "text", "x": 120, "y": 350, "text": "{{dedication}}", "style": { "font": "main", "size": 63, "color": "black", "rotation": 9 } } + ] + }, + { + "page_id": 5, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1456, "y": 1150 }, + { "type": "text", "x": 200, "y": -1045, "text": "Es muy temprano y la casa de {{child_1}}", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "está en silencio. Aún no se escucha la", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "cucharilla dando vueltas al café de {{adult_0}}.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "Pero {{child_1}} ha oído un ruido en el", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -685, "text": "salón y se levanta a investigar.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 6, + "elements": [ + { "type": "text", "x": 0, "y": 775, "text": "Al lado del sofá ha crecido un abeto, igualito que un árbol de", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": 0, "y": 865, "text": "Navidad, pero sin adornos. De él cuelga una cuerda con un sobre", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": 0, "y": 955, "text": "que lleva su nombre escrito con letra grande.", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": 0, "y": 1045, "text": "{{child_1}} se apresura a cogerlo.", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": -10, "y": -30, "text": "{{child_1}}", "style": { "color": "black", "size": 55, "rotation": -5 } } + ] + }, + { + "page_id": 7, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 927, "y": 628 }, + { "type": "text", "x": 200, "y": -1045, "text": "Dentro del sobre hay una carta sin firmar", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "cuyas instrucciones son claras:", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 8, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1075, "y": 1330 }, + { "type": "text", "x": 200, "y": -1045, "text": "“Si quieres recibir el regalo de Navidad más maravilloso del mundo, tendrás que", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "superar una serie de pruebas”. ¡Qué emocionante! ¿Quién mandará esa carta?", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "Algo cae de dentro del sobre y se esparce por el suelo. ¡Es arena!", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "¡Lo han enviado los Reyes Magos! {{child_1}} no se lo puede creer,", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -685, "text": "los mismísimos Reyes Magos le han mandado una carta, ¡a {{child_1}}!", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 9, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 550, "y": 1192 }, + { "type": "text", "x": 200, "y": -1045, "text": "La primera prueba que debe superar consiste en cocinar las galletas de", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "Navidad más originales.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "¡No hay tiempo que perder! Nunca ha cocinado galletas, pero no puede ser", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "tan difícil.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 10, + "elements": [ + { "type": "text", "x": 200, "y": 685, "text": "Seguro que llevan harina, huevos, mantequilla y azúcar, mucho azúcar. Abre el", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 775, "text": "armario de las especias y añade canela, jengibre, nuez moscada y virutas de", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 865, "text": "chocolate, ¡serán las galletas más deliciosas que ha comido jamás! Toda la", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 955, "text": "casa huele a Navidad.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 1045, "text": "Amasa la mezcla y le da la forma de los miembros de la familia.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 11, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 940, "y": 510 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1295, "y": 942 }, + { "type": "text", "x": 200, "y": 865, "text": "Las saca del horno y las prueba aún calientes. Son muy bonitas, pero están", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 955, "text": "durísimas, no se las puede comer, a no ser que quiera romperse los dientes.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 1045, "text": "¡Qué decepción!", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 12, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "Está pensando en intentarlo de nuevo cuando descubre un nuevo sobre", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "colgado del árbol. En él viene explicada la segunda prueba: debe decorar el", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "árbol de una manera especial.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 15, "y": 75, "text": "{{child_1}}", "style": { "size": 50 } } + ] + }, + { + "page_id": 13, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 450, "y": 828 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1025, "y": 1315 }, + { "type": "text", "x": 200, "y": -1045, "text": "{{child_1}}, con ayuda de {{adult_0}}, lo adorna con bolas de colores,", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "guirnaldas de espumillón y una estrella en la punta, como todos los años.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "¿Qué puede hacer para que este año sea especial?", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 14, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "Sobre la mesa están las galletas que acaba de cocinar. ¡Qué buena idea! Así todos", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "formarán parte del árbol.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 15, + "elements": [ + { "type": "text", "x": 50, "y": 181, "text": "Al día siguiente, {{child_1}} no quita ojo del árbol esperando el próximo", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 50, "y": 204, "text": "sobre. Pero, esta vez, la siguiente prueba aparece junto a la chimenea. ¿La enviará", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 50, "y": 227, "text": "Papá Noel? La carta dice que deberá montar una banda de villancicos.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": -5, "y": -145, "text": "{{child_1}}", "style": { "size": 35 } } + ] + }, + { + "page_id": 16, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 325, "y": 1015 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1700, "y": 1320 }, + { "type": "text", "x": 200, "y": -1045, "text": "Fabrica unas entradas para {{adult_0}}, y organiza un concierto en el", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "salón. {{child_1}} toca la pandereta, Trasto la zambomba y juntos cantan villancicos", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "hasta el anochecer. A todos les parece muy divertido; a los vecinos, no tanto.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 17, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "La cuarta prueba aparece en la caja de los bloques de construcción. Le pide que", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "reúna aquellos juguetes que ya no utilice y se los regale a niños y niñas que", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "tienen menos que {{child_1}}.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": -35, "y": 15, "text": "{{child_1}}", "style": { "size": 50 } } + ] + }, + { + "page_id": 18, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 565, "y": 845 }, + { "type": "text", "x": 50, "y": 955, "text": "Esta prueba es muy difícil porque le da mucha pena despedirse de sus posesiones,", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 50, "y": 1045, "text": "pero le ayuda a pensar en lo felices que estarán otros niños jugando con ellas.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 19, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 885, "y": 544 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1178, "y": 1025 } + ] + }, + { + "page_id": 20, + "elements": [ + { "type": "text", "x": 0, "y": 1045, "text": "La quinta prueba tarda varios días en aparecer...", "style": { "gravity": "CENTER", "color": "white" } } + ] + }, + { + "page_id": 21, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 956, "y": 560 }, + { "type": "text", "x": 200, "y": -1045, "text": "La descubre Trasto en su cama junto a un trozo de carbón. Tiene que crear", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "su propia felicitación de Navidad y enviársela a sus amigos y familiares.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "Se pasa el día rodeado de cartulinas de colores, témperas y purpurina. La", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "purpurina aparece hasta en la sopa de la cena.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 15, "y": 5, "text": "{{child_1}}", "style": { "size": 35 } } + ] + }, + { + "page_id": 23, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1972, "y": 1020 }, + { "type": "text", "x": -138, "y": 70, "text": "{{child_1}}", "style": { "size": 35 } } + ] + }, + { + "page_id": 24, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 1135, "y": 740 }, + { "type": "text", "x": 0, "y": 1045, "text": "Un sexto sobre aparece dentro del congelador.", "style": { "gravity": "CENTER", "color": "white" } } + ] + }, + { + "page_id": 25, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 315, "y": 522 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1110, "y": 905 }, + { "type": "text", "x": 200, "y": 865, "text": "Toda la familia debe salir a buscar dos adornos de Navidad, el más grande y", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 955, "text": "el más pequeño que puedan encontrar. Sin duda el mejor lugar para conseguir", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 1045, "text": "adornos es el mercadillo de la ciudad.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 26, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "El camino está deslumbrante. Cascadas de luces adornan las calles y estrellas de", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "colores cubren el cielo como si fuera el firmamento. Pasan junto a un Belén en el", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "que las figuras se mueven y el río tiene agua de verdad, ¿habrá peces bebiendo?", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 27, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 758, "y": 570 }, + { "type": "text", "x": 750, "y": -1045, "text": "En el mercadillo compran bastoncillos de caramelo, mazapanes", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 750, "y": -955, "text": "y un gorro gigante. ¿Será lo bastante grande?", "style": { "gravity": "WEST", "color": "white" } } + ] + }, + { + "page_id": 28, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "{{adult_0}} ha encontrado una estrella de madera muy", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 200, "y": -955, "text": "pequeña, pero {{child_1}} no está muy segura", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 200, "y": -865, "text": "de haber superado la prueba.", "style": { "gravity": "WEST", "color": "white" } } + ] + }, + { + "page_id": 29, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 272, "y": 515 }, + { "type": "photo", "content": "photo_hijo_1", "x": 655, "y": 288 }, + { "type": "text", "x": 200, "y": 775, "text": "De camino a casa empieza a nevar y las calles se cubren de un manto blanco.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 865, "text": "Toda la familia comienza a hacer un muñeco de nieve. Los mazapanes sirven de", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 955, "text": "ojos y un bastoncillo de nariz. Le colocan el gorro sobre la cabeza. Cuando se", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 1045, "text": "quieren dar cuenta, han hecho un muñeco de nieve más grande que {{adult_0}}.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 30, + "elements": [ + { "type": "text", "x": 650, "y": -1045, "text": "Un copo de nieve diminuto cae sobre el pelo rojo de Trasto", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 650, "y": -955, "text": "y, sorprendentemente, no se derrite. ¡Parece magia!", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 650, "y": -865, "text": "¡Ahora sí que lo han conseguido!", "style": { "gravity": "WEST", "color": "white" } } + ] + }, + { + "page_id": 31, + "elements": [ + { "type": "text", "x": 450, "y": -1045, "text": "Ha llegado el gran día. Es muy temprano y,", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -955, "text": "antes de que se despierte {{adult_0}},", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -865, "text": "{{child_1}} corre ilusionada a abrir", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -775, "text": "los regalos que están debajo del árbol.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -685, "text": "¿Cuál será el más", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -595, "text": "maravilloso del mundo?", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 32, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1115, "y": 1075 }, + { "type": "text", "x": 200, "y": -1045, "text": "Allí están un juego de mesa, muchos libros,", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "un oso de peluche gigante y un patinete. Al", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "fondo, envuelta en papel rojo con un lazo", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "dorado, hay una caja muy muy pequeña. Tan", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -685, "text": "pequeña que {{child_1}} no cree que ahí", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -595, "text": "dentro pueda haber ningún regalo especial.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 33, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1050, "y": 1310 } + ] + }, + { + "page_id": 34, + "elements": [ + { "type": "text", "x": 300, "y": -1045, "text": "La abre desconfiada y dentro descubre un sobre. Un sobre igual al que ha", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 300, "y": -955, "text": "recibido todos los días anteriores. En él hay una carta sin firmar cuyo mensaje", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 300, "y": -865, "text": "es muy claro, una sola palabra escrita en letra grande, que le dice cuál es el", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 300, "y": -775, "text": "mejor regalo que podemos tener en Navidad:", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 100, "y": 20, "text": "Familia", "style": { "size": 250, "color": "red" } } + ] + }, + { + "page_id": 35, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 685, "y": 805 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1020, "y": 1365 }, + { "type": "text", "x": 200, "y": -1045, "text": "La casa de {{child_1}} ya no está en silencio. Toda su familia", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "ha venido a celebrar con ella la Navidad. Ríen, cantan, bailan el burrito", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "sabanero y {{adult_0}} casi se atraganta con un polvorón.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "Todos están convencidos de haber conseguido el regalo más maravilloso", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -685, "text": "del mundo.", "style": { "gravity": "WEST" } } + ] + } + ] +} \ No newline at end of file diff --git a/src/books/3/config/config_12.json b/src/books/3/config/config_12.json new file mode 100644 index 0000000..e69de29 diff --git a/src/books/3/config/config_13.json b/src/books/3/config/config_13.json new file mode 100644 index 0000000..e69de29 diff --git a/src/books/3/config/config_21.json b/src/books/3/config/config_21.json new file mode 100644 index 0000000..e69de29 diff --git a/src/books/3/config/config_22.json b/src/books/3/config/config_22.json new file mode 100644 index 0000000..e69de29 diff --git a/src/books/3/config/config_23.json b/src/books/3/config/config_23.json new file mode 100644 index 0000000..e69de29 diff --git a/src/books/3/config/configfull.json b/src/books/3/config/configfull.json new file mode 100644 index 0000000..df7a68b --- /dev/null +++ b/src/books/3/config/configfull.json @@ -0,0 +1,1997 @@ +{ + "book_id": 8, + "settings": { + "dimensions": { "width": 2480, "height": 1748 }, + "fonts": { + "nexa": "nexa_black.otf", + "legal": "montserrat_regular.ttf", + "mali": "mali_medium.ttf", + "crayon": "hanoded_crayon_crumble.ttf", + "hand": "hand_of_sean.ttf", + "segoe": "segoepr.ttf", + "indie": "indie_flower.ttf", + "londrina": "LondrinaSolid-Light.ttf", + "signature": "Photograph-Signature.ttf", + "calibri": "calibri.ttf", + "ebrima": "ebrima.ttf", + "main": "mali-medium.ttf" + }, + "colors": { + "black": "#000000", + "white": "#FFFFFF", + "red": "#E30445", + "blue": "#00A7E3", + "pink": "#8D3B65", + "gold": "#F2DA7F", + "purple": "#8C5F9D" + } + }, + "user_photo": { + "adult_width": 292, + "adult_height": 336, + "child_width": 292, + "child_height": 336, + "dedication_width": 360, + "dedication_height": 403 + }, + "scenarios": { + "1_adult_1_child": { + "description": "1 Adulto, 1 Niño", + "pages": [ + { + "page_id": 0, + "elements": [ + { "type": "text", "x": 1325, "y": -900, "text": "El Mejor Regalo", "style": { "font": "fancy", "size": 175, "color": "white" } }, + { "type": "text", "x": 1325, "y": -710, "text": "De La Navidad", "style": { "font": "fancy", "size": 175, "color": "white" } }, + { "type": "photo", "content": "photo_adulto_0", "x": 3925, "y": 1452 }, + { "type": "photo", "content": "photo_hijo_1", "x": 3900, "y": 820 } + ] + }, + { + "page_id": 4, + "elements": [ + { "type": "photo", "content": "photo_dedicatoria", "x": 353, "y": 216 }, + { "type": "text", "x": 120, "y": 350, "text": "{{dedication}}", "style": { "font": "hand", "size": 80, "color": "black", "rotation": 0 } } + ] + }, + { + "page_id": 5, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "Es muy temprano y la casa de {{child_1}}", "style": { "font": "segoe", "size": 56, "color": "purple" } }, + { "type": "text", "x": 200, "y": -955, "text": "está en silencio. Aún no se escucha la", "style": { "font": "segoe", "size": 56, "color": "purple" } }, + { "type": "text", "x": 200, "y": -865, "text": "cucharilla dando vueltas al café de {{adult_0}}.", "style": { "font": "segoe", "size": 56, "color": "purple" } }, + { "type": "text", "x": 200, "y": -775, "text": "Pero {{child_1}} ha oído un ruido en el", "style": { "font": "segoe", "size": 56, "color": "purple" } }, + { "type": "text", "x": 200, "y": -685, "text": "salón y se levanta a investigar.", "style": { "font": "segoe", "size": 56, "color": "purple" } }, + { "type": "photo", "content": "photo_hijo_1", "x": 1456, "y": 1150 } + ] + }, + { + "page_id": 6, + "elements": [ + { "type": "text", "x": 0, "y": 775, "text": "Al lado del sofá ha crecido un abeto, igualito que un árbol de", "style": { "font": "mali", "size": 55, "color": "white" } }, + { "type": "text", "x": 0, "y": 865, "text": "Navidad, pero sin adornos. De él cuelga una cuerda con un sobre", "style": { "font": "mali", "size": 55, "color": "white" } }, + { "type": "text", "x": 0, "y": 955, "text": "que lleva su nombre escrito con letra grande.", "style": { "font": "mali", "size": 55, "color": "white" } }, + { "type": "text", "x": 0, "y": 1045, "text": "{{child_1}} se apresura a cogerlo.", "style": { "font": "mali", "size": 55, "color": "white" } }, + { "type": "text", "x": -10, "y": -30, "text": "{{child_1}}", "style": { "font": "mali", "size": 55, "color": "black" } } + ] + }, + { + "page_id": 7, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 927, "y": 628 }, + { "type": "text", "x": 200, "y": -1045, "text": "Dentro del sobre hay una carta sin firmar", "style": { "font": "segoe", "size": 56, "color": "purple" } }, + { "type": "text", "x": 200, "y": -955, "text": "cuyas instrucciones son claras:", "style": { "font": "segoe", "size": 56, "color": "purple" } } + ] + }, + { + "page_id": 8, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1075, "y": 1330 }, + { "type": "text", "x": 200, "y": -1045, "text": "“Si quieres recibir el regalo de Navidad más maravilloso del mundo, tendrás que", "style": { "font": "indie", "size": 56, "color": "black", "gravity": "NORTHWEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "superar una serie de pruebas”. ¡Qué emocionante! ¿Quién mandará esa carta?", "style": { "font": "indie", "size": 56, "color": "black", "gravity": "NORTHWEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "Algo cae de dentro del sobre y se esparce por el suelo. ¡Es arena!", "style": { "font": "indie", "size": 56, "color": "black", "gravity": "NORTHWEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "¡Lo han enviado los Reyes Magos! {{child_1}} no se lo puede creer,", "style": { "font": "indie", "size": 56, "color": "black", "gravity": "NORTHWEST" } }, + { "type": "text", "x": 200, "y": -685, "text": "los mismísimos Reyes Magos le han mandado una carta, ¡a {{child_1}}!", "style": { "font": "indie", "size": 56, "color": "black", "gravity": "NORTHWEST" } } + ] + }, + { + "page_id": 9, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 550, "y": 1192 }, + { "type": "text", "x": 200, "y": -1045, "text": "La primera prueba que debe superar consiste en cocinar las galletas de", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "Navidad más originales.", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -865, "text": "¡No hay tiempo que perder! Nunca ha cocinado galletas, pero no puede ser", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -775, "text": "tan difícil.", "style": { "font": "segoe", "size": 56, "color": "black" } } + ] + }, + { + "page_id": 10, + "elements": [ + { "type": "text", "x": 200, "y": 685, "text": "Seguro que llevan harina, huevos, mantequilla y azúcar, mucho azúcar. Abre el", "style": { "font": "crayon", "size": 160, "color": "white" } }, + { "type": "text", "x": 200, "y": 775, "text": "armario de las especias y añade canela, jengibre, nuez moscada y virutas de", "style": { "font": "crayon", "size": 160, "color": "white" } }, + { "type": "text", "x": 200, "y": 865, "text": "chocolate, ¡serán las galletas más deliciosas que ha comido jamás! Toda la", "style": { "font": "crayon", "size": 160, "color": "white" } }, + { "type": "text", "x": 200, "y": 955, "text": "casa huele a Navidad.", "style": { "font": "crayon", "size": 160, "color": "white" } }, + { "type": "text", "x": 200, "y": 1045, "text": "Amasa la mezcla y le da la forma de los miembros de la familia.", "style": { "font": "crayon", "size": 160, "color": "white" } } + ] + }, + { + "page_id": 11, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 900, "y": 458 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1295, "y": 942 }, + { "type": "text", "x": 200, "y": 865, "text": "Las saca del horno y las prueba aún calientes. Son muy bonitas, pero están", "style": { "font": "crayon", "size": 160, "color": "white" } }, + { "type": "text", "x": 200, "y": 955, "text": "durísimas, no se las puede comer, a no ser que quiera romperse los dientes.", "style": { "font": "crayon", "size": 160, "color": "white" } }, + { "type": "text", "x": 200, "y": 1045, "text": "¡Qué decepción!", "style": { "font": "crayon", "size": 160, "color": "white" } } + ] + }, + { + "page_id": 12, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "Está pensando en intentarlo de nuevo cuando descubre un nuevo sobre", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "colgado del árbol. En él viene explicada la segunda prueba: debe decorar el", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -865, "text": "árbol de una manera especial.", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 15, "y": 75, "text": "{{child_1}}", "style": { "font": "ebrima", "size": 70, "color": "black" } } + ] + }, + { + "page_id": 13, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 450, "y": 828 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1025, "y": 1315 }, + { "type": "text", "x": 200, "y": -1045, "text": "{{child_1}}, con ayuda de {{adult_0}}, lo adorna con bolas de colores,", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "guirnaldas de espumillón y una estrella en la punta, como todos los años.", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -865, "text": "¿Qué puede hacer para que este año sea especial?", "style": { "font": "segoe", "size": 56, "color": "black" } } + ] + }, + { + "page_id": 14, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "Sobre la mesa están las galletas que acaba de cocinar. ¡Qué buena idea! Así todos", "style": { "font": "crayon", "size": 120, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "formarán parte del árbol.", "style": { "font": "crayon", "size": 120, "color": "black" } } + ] + }, + { + "page_id": 15, + "elements": [ + { "type": "text", "x": 50, "y": 181, "text": "Al día siguiente, {{child_1}} no quita ojo del árbol esperando el próximo", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 50, "y": 204, "text": "sobre. Pero, esta vez, la siguiente prueba aparece junto a la chimenea. ¿La enviará", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 50, "y": 227, "text": "Papá Noel? La carta dice que deberá montar una banda de villancicos.", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": -5, "y": -152, "text": "{{child_1}}", "style": { "font": "ebrima", "size": 70, "color": "black" } } + ] + }, + { + "page_id": 16, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 325, "y": 1015 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1700, "y": 1320 }, + { "type": "text", "x": 200, "y": -1045, "text": "Fabrica unas entradas para {{adult_0}}, y organiza un concierto en el", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "salón. {{child_1}} toca la pandereta, Trasto la zambomba y juntos cantan villancicos", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -865, "text": "hasta el anochecer. A todos les parece muy divertido; a los vecinos, no tanto.", "style": { "font": "segoe", "size": 56, "color": "black" } } + ] + }, + { + "page_id": 17, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "La cuarta prueba aparece en la caja de los bloques de construcción. Le pide que", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "reúna aquellos juguetes que ya no utilice y se los regale a niños y niñas que", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -865, "text": "tienen menos que ella.", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": -35, "y": 15, "text": "{{child_1}}", "style": { "font": "ebrima", "size": 70, "color": "black" } } + ] + }, + { + "page_id": 18, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 565, "y": 845 }, + { "type": "text", "x": 50, "y": 955, "text": "Esta prueba es muy difícil porque le da mucha pena despedirse de sus posesiones,", "style": { "font": "ebrima", "size": 64, "color": "black" } }, + { "type": "text", "x": 50, "y": 1045, "text": "pero le ayuda a pensar en lo felices que estarán otros niños jugando con ellas.", "style": { "font": "ebrima", "size": 64, "color": "black" } } + ] + }, + { + "page_id": 19, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 885, "y": 544 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1178, "y": 1025 } + ] + }, + { + "page_id": 20, + "elements": [ + { "type": "text", "x": 0, "y": 1045, "text": "La quinta prueba tarda varios días en aparecer...", "style": { "font": "segoe", "size": 56, "color": "white" } } + ] + }, + { + "page_id": 21, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 956, "y": 560 }, + { "type": "text", "x": 200, "y": -1045, "text": "La descubre Trasto en su cama junto a un trozo de carbón. Tiene que crear", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "su propia felicitación de Navidad y enviársela a sus amigos y familiares.", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -865, "text": "Se pasa el día rodeado de cartulinas de colores, témperas y purpurina. La", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -775, "text": "purpurina aparece hasta en la sopa de la cena.", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 15, "y": 5, "text": "{{child_1}}", "style": { "font": "ebrima", "size": 70, "color": "black" } } + ] + }, + { + "page_id": 23, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1972, "y": 1020 }, + { "type": "text", "x": -138, "y": 70, "text": "{{child_1}}", "style": { "font": "ebrima", "size": 70, "color": "black", "rotation": 90 } } + ] + }, + { + "page_id": 24, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 1135, "y": 740 }, + { "type": "text", "x": 0, "y": 1045, "text": "Un sexto sobre aparece dentro del congelador.", "style": { "font": "segoe", "size": 56, "color": "white" } } + ] + }, + { + "page_id": 25, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 315, "y": 522 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1110, "y": 905 }, + { "type": "text", "x": 200, "y": 865, "text": "Toda la familia debe salir a buscar dos adornos de Navidad, el más grande y", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": 955, "text": "el más pequeño que puedan encontrar. Sin duda el mejor lugar para conseguir", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": 1045, "text": "adornos es el mercadillo de la ciudad.", "style": { "font": "segoe", "size": 56, "color": "white" } } + ] + }, + { + "page_id": 26, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "El camino está deslumbrante. Cascadas de luces adornan las calles y estrellas de", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": -955, "text": "colores cubren el cielo como si fuera el firmamento. Pasan junto a un Belén en el", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": -865, "text": "que las figuras se mueven y el río tiene agua de verdad, ¿habrá peces bebiendo?", "style": { "font": "segoe", "size": 56, "color": "white" } } + ] + }, + { + "page_id": 27, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 758, "y": 570 }, + { "type": "text", "x": 750, "y": -1045, "text": "En el mercadillo compran bastoncillos de caramelo, mazapanes", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 750, "y": -955, "text": "y un gorro gigante. ¿Será lo bastante grande?", "style": { "font": "segoe", "size": 56, "color": "white" } } + ] + }, + { + "page_id": 28, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "{{adult_0}} ha encontrado una estrella de madera muy", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": -955, "text": "pequeña, pero {{child_1}} no está muy segura", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": -865, "text": "de haber superado la prueba.", "style": { "font": "segoe", "size": 56, "color": "white" } } + ] + }, + { + "page_id": 29, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 272, "y": 515 }, + { "type": "photo", "content": "photo_hijo_1", "x": 655, "y": 288 }, + { "type": "text", "x": 200, "y": 775, "text": "De camino a casa empieza a nevar y las calles se cubren de un manto blanco.", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": 865, "text": "Toda la familia comienza a hacer un muñeco de nieve. Los mazapanes sirven de", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": 955, "text": "ojos y un bastoncillo de nariz. Le colocan el gorro sobre la cabeza. Cuando se", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": 1045, "text": "quieren dar cuenta, han hecho un muñeco de nieve más grande que {{adult_0}}.", "style": { "font": "segoe", "size": 56, "color": "white" } } + ] + }, + { + "page_id": 30, + "elements": [ + { "type": "text", "x": 650, "y": -1045, "text": "Un copo de nieve diminuto cae sobre el pelo rojo de Trasto", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 650, "y": -955, "text": "y, sorprendentemente, no se derrite. ¡Parece magia!", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 650, "y": -865, "text": "¡Ahora sí que lo han conseguido!", "style": { "font": "segoe", "size": 56, "color": "white" } } + ] + }, + { + "page_id": 31, + "elements": [ + { "type": "text", "x": 450, "y": -1045, "text": "Ha llegado el gran día. Es muy temprano y,", "style": { "font": "segoe", "size": 40, "color": "black" } }, + { "type": "text", "x": 450, "y": -955, "text": "antes de que se despierte {{adult_0}},", "style": { "font": "segoe", "size": 40, "color": "black" } }, + { "type": "text", "x": 450, "y": -865, "text": "{{child_1}} corre ilusionada a abrir", "style": { "font": "segoe", "size": 40, "color": "black" } }, + { "type": "text", "x": 450, "y": -775, "text": "los regalos que están debajo del árbol.", "style": { "font": "segoe", "size": 40, "color": "black" } }, + { "type": "text", "x": 450, "y": -685, "text": "¿Cuál será el más", "style": { "font": "segoe", "size": 40, "color": "black" } }, + { "type": "text", "x": 450, "y": -595, "text": "maravilloso del mundo?", "style": { "font": "segoe", "size": 40, "color": "black" } } + ] + }, + { + "page_id": 32, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1115, "y": 1075 }, + { "type": "text", "x": 200, "y": -1045, "text": "Allí están un juego de mesa, muchos libros,", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "un oso de peluche gigante y un patinete. Al", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -865, "text": "fondo, envuelta en papel rojo con un lazo", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -775, "text": "dorado, hay una caja muy muy pequeña. Tan", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -685, "text": "pequeña que {{child_1}} no cree que ahí", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -595, "text": "dentro pueda haber ningún regalo especial.", "style": { "font": "segoe", "size": 56, "color": "black" } } + ] + }, + { + "page_id": 33, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1050, "y": 1310 } + ] + }, + { + "page_id": 34, + "elements": [ + { "type": "text", "x": 300, "y": -1045, "text": "La abre desconfiada y dentro descubre un sobre. Un sobre igual al que ha", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 300, "y": -955, "text": "recibido todos los días anteriores. En él hay una carta sin firmar cuyo mensaje", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 300, "y": -865, "text": "es muy claro, una sola palabra escrita en letra grande, que le dice cuál es el", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 300, "y": -775, "text": "mejor regalo que podemos tener en Navidad:", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 100, "y": 20, "text": "Familia", "style": { "font": "crayon", "size": 250, "color": "red" } } + ] + }, + { + "page_id": 35, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 685, "y": 805 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1020, "y": 1365 }, + { "type": "text", "x": 200, "y": -1045, "text": "La casa de {{child_1}} ya no está en silencio. Toda su familia", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "ha venido a celebrar con ella la Navidad. Ríen, cantan, bailan el burrito", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -865, "text": "sabanero y {{adult_0}} casi se atraganta con un polvorón.", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -775, "text": "Todos están convencidos de haber conseguido el regalo más maravilloso", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -685, "text": "del mundo.", "style": { "font": "segoe", "size": 56, "color": "black" } } + ] + } + ] + }, + "1_adult_2_children": { + "description": "1 Adulto, 2 Niños/as", + "pages": [ + { + "page_id": 0, + "elements": [ + { "type": "text", "x": 1325, "y": -900, "text": "El Mejor Regalo", "style": { "font": "fancy", "size": 175, "color": "white" } }, + { "type": "text", "x": 1325, "y": -710, "text": "De La Navidad", "style": { "font": "fancy", "size": 175, "color": "white" } }, + { "type": "text", "x": 2845, "y": -1050, "text": "El Mejor Regalo De La Navidad", "style": { "font": "main", "size": 50, "color": "red", "gravity": "EAST", "rotation": -90 } }, + { "type": "photo", "content": "photo_adulto_0", "x": 3925, "y": 1452 }, + { "type": "photo", "content": "photo_hijo_1", "x": 3900, "y": 820 }, + { "type": "photo", "content": "photo_hijo_2", "x": 3005, "y": 810 } + ] + }, + { + "page_id": 4, + "elements": [ + { "type": "photo", "content": "photo_dedicatoria", "x": 353, "y": 216 }, + { "type": "text", "x": 120, "y": 350, "text": "{{dedication}}", "style": { "font": "main", "size": 63, "color": "black", "rotation": 9 } } + ] + }, + { + "page_id": 5, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "Es muy temprano y la casa de {{child_1}} y", "style": { "font": "segoe", "size": 56, "color": "purple" } }, + { "type": "text", "x": 200, "y": -955, "text": "{{child_2}} está en silencio.", "style": { "font": "segoe", "size": 56, "color": "purple" } }, + { "type": "text", "x": 200, "y": -865, "text": "Aún no se escucha la cucharilla dando vueltas", "style": { "font": "segoe", "size": 56, "color": "purple" } }, + { "type": "text", "x": 200, "y": -775, "text": "al café de {{adult_0}}. Pero {{child_1}}", "style": { "font": "segoe", "size": 56, "color": "purple" } }, + { "type": "text", "x": 200, "y": -685, "text": "y {{child_2}} han oído un ruido en el", "style": { "font": "segoe", "size": 56, "color": "purple" } }, + { "type": "text", "x": 200, "y": -595, "text": "salón y se levantan a investigar.", "style": { "font": "segoe", "size": 56, "color": "purple" } }, + { "type": "photo", "content": "photo_hijo_1", "x": 1456, "y": 1150 }, + { "type": "photo", "content": "photo_hijo_2", "x": 595, "y": 1202 } + ] + }, + { + "page_id": 6, + "elements": [ + { "type": "text", "x": 0, "y": 775, "text": "Al lado del sofá ha crecido un abeto, igualito que un árbol de", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": 0, "y": 865, "text": "Navidad, pero sin adornos. De él cuelga una cuerda con un sobre", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": 0, "y": 955, "text": "que lleva sus nombres escritos con letra grande.", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": 0, "y": 1045, "text": "{{child_1}} y {{child_2}} se apresuran a cogerlo.", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": -10, "y": -35, "text": "{{child_1}}", "style": { "color": "black", "size": 55, "rotation": -5 } }, + { "type": "text", "x": -10, "y": -20, "text": "{{child_2}}", "style": { "color": "black", "size": 55, "rotation": -5 } } + ] + }, + { + "page_id": 7, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 927, "y": 628 }, + { "type": "text", "x": 200, "y": -1045, "text": "Dentro del sobre hay una carta sin firmar", "style": { "font": "segoe", "size": 56, "color": "purple" } }, + { "type": "text", "x": 200, "y": -955, "text": "cuyas instrucciones son claras:", "style": { "font": "segoe", "size": 56, "color": "purple" } } + ] + }, + { + "page_id": 8, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1075, "y": 1330 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1520, "y": 1340 }, + { "type": "text", "x": 200, "y": -1045, "text": "“Si quieren recibir el regalo de Navidad más maravilloso del mundo, tendrán que", "style": { "font": "indie", "size": 56, "color": "black", "gravity": "NORTHWEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "superar una serie de pruebas”. ¡Qué emocionante! ¿Quién mandará esa carta?", "style": { "font": "indie", "size": 56, "color": "black", "gravity": "NORTHWEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "Algo cae de dentro del sobre y se esparce por el suelo. ¡Es arena!", "style": { "font": "indie", "size": 56, "color": "black", "gravity": "NORTHWEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "¡Lo han enviado los Reyes Magos! {{child_1}} y {{child_2}} no se lo", "style": { "font": "indie", "size": 56, "color": "black", "gravity": "NORTHWEST" } }, + { "type": "text", "x": 200, "y": -685, "text": "pueden creer, los mismísimos Reyes Magos les han mandado una carta, ¡a ellos!", "style": { "font": "indie", "size": 56, "color": "black", "gravity": "NORTHWEST" } } + ] + }, + { + "page_id": 9, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 550, "y": 1192 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1438, "y": 1243 }, + { "type": "text", "x": 200, "y": -1045, "text": "La primera prueba que deben superar consiste en cocinar las galletas de", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "Navidad más originales.", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -865, "text": "¡No hay tiempo que perder! Nunca han cocinado galletas, pero no puede ser", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -775, "text": "tan difícil.", "style": { "font": "segoe", "size": 56, "color": "black" } } + ] + }, + { + "page_id": 10, + "elements": [ + { "type": "text", "x": 200, "y": 685, "text": "Seguro que llevan harina, huevos, mantequilla y azúcar, mucho azúcar. Abren el", "style": { "font": "crayon", "size": 160, "color": "white" } }, + { "type": "text", "x": 200, "y": 775, "text": "armario de las especias y añaden canela, jengibre, nuez moscada y virutas de", "style": { "font": "crayon", "size": 160, "color": "white" } }, + { "type": "text", "x": 200, "y": 865, "text": "chocolate, ¡serán las galletas más deliciosas que han comido jamás! Toda la", "style": { "font": "crayon", "size": 160, "color": "white" } }, + { "type": "text", "x": 200, "y": 955, "text": "casa huele a Navidad.", "style": { "font": "crayon", "size": 160, "color": "white" } }, + { "type": "text", "x": 200, "y": 1045, "text": "Amasan la mezcla y le dan la forma de los miembros de la familia.", "style": { "font": "crayon", "size": 160, "color": "white" } } + ] + }, + { + "page_id": 11, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 900, "y": 458 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1295, "y": 942 }, + { "type": "photo", "content": "photo_hijo_2", "x": 530, "y": 758 }, + { "type": "text", "x": 200, "y": 865, "text": "Las sacan del horno y las prueban aún calientes. Son muy bonitas, pero están", "style": { "font": "crayon", "size": 160, "color": "white" } }, + { "type": "text", "x": 200, "y": 955, "text": "durísimas, no se las pueden comer, a no ser que quieran romperse los dientes.", "style": { "font": "crayon", "size": 160, "color": "white" } }, + { "type": "text", "x": 200, "y": 1045, "text": "¡Qué decepción!", "style": { "font": "crayon", "size": 160, "color": "white" } } + ] + }, + { + "page_id": 12, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "Están pensando en intentarlo de nuevo cuando descubren un nuevo sobre", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "colgado del árbol. En él viene explicada la segunda prueba: deben decorar el", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -865, "text": "árbol de una manera especial.", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 15, "y": 60, "text": "{{child_1}}", "style": { "font": "ebrima", "size": 70, "color": "black" } }, + { "type": "text", "x": 17, "y": 90, "text": "{{child_2}}", "style": { "font": "ebrima", "size": 70, "color": "black" } } + ] + }, + { + "page_id": 13, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 450, "y": 828 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1025, "y": 1315 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1720, "y": 1442 }, + { "type": "text", "x": 200, "y": -1045, "text": "{{child_1}} y {{child_2}}, con ayuda de {{adult_0}}, lo adornan con bolas", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "de colores, guirnaldas de espumillón y una estrella en la punta,", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -865, "text": "como todos los años. ¿Qué pueden hacer para que este año sea especial?", "style": { "font": "segoe", "size": 56, "color": "black" } } + ] + }, + { + "page_id": 14, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "Sobre la mesa están las galletas que acaban de cocinar. ¡Qué buena idea! Así todos", "style": { "font": "crayon", "size": 120, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "formarán parte del árbol.", "style": { "font": "crayon", "size": 120, "color": "black" } } + ] + }, + { + "page_id": 15, + "elements": [ + { "type": "text", "x": 50, "y": 181, "text": "Al día siguiente, {{child_1}} y {{child_2}} no quitan ojo del árbol", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 50, "y": 204, "text": "esperando el próximo sobre. Pero, esta vez, la siguiente prueba aparece junto a la", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 50, "y": 227, "text": "chimenea. ¿La enviará Papá Noel? La carta dice que deberán montar una banda de", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 50, "y": 250, "text": "villancicos.", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": -5, "y": -152, "text": "{{child_1}}", "style": { "font": "ebrima", "size": 70, "color": "black" } }, + { "type": "text", "x": -4, "y": -142, "text": "{{child_2}}", "style": { "font": "ebrima", "size": 70, "color": "black" } } + ] + }, + { + "page_id": 16, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 325, "y": 1015 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1700, "y": 1320 }, + { "type": "photo", "content": "photo_hijo_2", "x": 2025, "y": 990 }, + { "type": "text", "x": 200, "y": -1045, "text": "Fabrican unas entradas para {{adult_0}}, y organizan un concierto en el salón.", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "{{child_1}} y {{child_2}} tocan la pandereta, Trasto la zambomba", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -865, "text": "y juntos cantan villancicos hasta el anochecer. A todos les parece muy", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -775, "text": "divertido; a los vecinos, no tanto.", "style": { "font": "segoe", "size": 56, "color": "black" } } + ] + }, + { + "page_id": 17, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "La cuarta prueba aparece en la caja de los bloques de construcción. Les pide que", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "reúnan aquellos juguetes que ya no utilicen y se los regalen a niños y niñas que", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -865, "text": "tienen menos que ellas.", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": -35, "y": -5, "text": "{{child_1}}", "style": { "font": "ebrima", "size": 70, "color": "black" } }, + { "type": "text", "x": -25, "y": 35, "text": "{{child_2}}", "style": { "font": "ebrima", "size": 70, "color": "black" } } + ] + }, + { + "page_id": 18, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 565, "y": 845 }, + { "type": "photo", "content": "photo_hijo_2", "x": 920, "y": 818 }, + { "type": "text", "x": 50, "y": 955, "text": "Esta prueba es muy difícil porque les da mucha pena despedirse de sus posesiones,", "style": { "font": "ebrima", "size": 64, "color": "black" } }, + { "type": "text", "x": 50, "y": 1045, "text": "pero les ayuda a pensar en lo felices que estarán otros niños jugando con ellas.", "style": { "font": "ebrima", "size": 64, "color": "black" } } + ] + }, + { + "page_id": 19, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 885, "y": 544 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1178, "y": 1025 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1435, "y": 1020 } + ] + }, + { + "page_id": 20, + "elements": [ + { "type": "text", "x": 0, "y": 1045, "text": "La quinta prueba tarda varios días en aparecer...", "style": { "font": "segoe", "size": 56, "color": "white" } } + ] + }, + { + "page_id": 21, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 956, "y": 560 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1356, "y": 560 }, + { "type": "text", "x": 200, "y": -1045, "text": "La descubre Trasto en su cama junto a un trozo de carbón. Tienen que crear", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "sus propias felicitaciones de Navidad y enviárselas a sus amigos y familiares.", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -865, "text": "Se pasan el día rodeados de cartulinas de colores, témperas y purpurina. La", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -775, "text": "purpurina aparece hasta en la sopa de la cena.", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 15, "y": 5, "text": "{{child_1}}", "style": { "font": "ebrima", "size": 70, "color": "black" } }, + { "type": "text", "x": 20, "y": 50, "text": "{{child_2}}", "style": { "font": "ebrima", "size": 70, "color": "black" } } + ] + }, + { + "page_id": 23, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1972, "y": 1020 }, + { "type": "photo", "content": "photo_hijo_2", "x": 862, "y": 1150 }, + { "type": "text", "x": -138, "y": 70, "text": "{{child_1}}", "style": { "font": "ebrima", "size": 70, "color": "black", "rotation": 90 } }, + { "type": "text", "x": -7, "y": 90, "text": "{{child_2}}", "style": { "font": "ebrima", "size": 70, "color": "black", "rotation": 90 } } + ] + }, + { + "page_id": 24, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 1135, "y": 740 }, + { "type": "text", "x": 0, "y": 1045, "text": "Un sexto sobre aparece dentro del congelador.", "style": { "gravity": "CENTER", "color": "white" } } + ] + }, + { + "page_id": 25, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 315, "y": 522 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1110, "y": 905 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1925, "y": 975 }, + { "type": "text", "x": 200, "y": 865, "text": "Toda la familia debe salir a buscar dos adornos de Navidad, el más grande y", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": 955, "text": "el más pequeño que puedan encontrar. Sin duda el mejor lugar para conseguir", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": 1045, "text": "adornos es el mercadillo de la ciudad.", "style": { "font": "segoe", "size": 56, "color": "white" } } + ] + }, + { + "page_id": 26, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "El camino está deslumbrante. Cascadas de luces adornan las calles y estrellas de", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": -955, "text": "colores cubren el cielo como si fuera el firmamento. Pasan junto a un Belén en el", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": -865, "text": "que las figuras se mueven y el río tiene agua de verdad, ¿habrá peces bebiendo?", "style": { "font": "segoe", "size": 56, "color": "white" } } + ] + }, + { + "page_id": 27, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 758, "y": 570 }, + { "type": "text", "x": 750, "y": -1045, "text": "En el mercadillo compran bastoncillos de caramelo, mazapanes", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 750, "y": -955, "text": "y un gorro gigante. ¿Será lo bastante grande?", "style": { "font": "segoe", "size": 56, "color": "white" } } + ] + }, + { + "page_id": 28, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "{{adult_0}} ha encontrado una estrella de madera muy", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": -955, "text": "pequeña, pero {{child_1}} y {{child_2}} no están", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": -865, "text": "muy seguras de haber superado la prueba.", "style": { "font": "segoe", "size": 56, "color": "white" } } + ] + }, + { + "page_id": 29, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 272, "y": 515 }, + { "type": "photo", "content": "photo_hijo_1", "x": 655, "y": 288 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1435, "y": 945 }, + { "type": "text", "x": 200, "y": 775, "text": "De camino a casa empieza a nevar y las calles se cubren de un manto blanco.", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": 865, "text": "Toda la familia comienza a hacer un muñeco de nieve. Los mazapanes sirven de", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": 955, "text": "ojos y un bastoncillo de nariz. Le colocan el gorro sobre la cabeza. Cuando se", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": 1045, "text": "quieren dar cuenta, han hecho un muñeco de nieve más grande que {{adult_0}}.", "style": { "font": "segoe", "size": 56, "color": "white" } } + ] + }, + { + "page_id": 30, + "elements": [ + { "type": "text", "x": 650, "y": -1045, "text": "Un copo de nieve diminuto cae sobre el pelo rojo de Trasto", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 650, "y": -955, "text": "y, sorprendentemente, no se derrite. ¡Parece magia!", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 650, "y": -865, "text": "¡Ahora sí que lo han conseguido!", "style": { "font": "segoe", "size": 56, "color": "white" } } + ] + }, + { + "page_id": 31, + "elements": [ + { "type": "text", "x": 450, "y": -1045, "text": "Ha llegado el gran día. Es muy temprano y,", "style": { "font": "segoe", "size": 40, "color": "black" } }, + { "type": "text", "x": 450, "y": -955, "text": "antes de que se despierte {{adult_0}},", "style": { "font": "segoe", "size": 40, "color": "black" } }, + { "type": "text", "x": 450, "y": -865, "text": "{{child_1}} y {{child_2}} corren ilusionadas a abrir", "style": { "font": "segoe", "size": 40, "color": "black" } }, + { "type": "text", "x": 450, "y": -775, "text": "los regalos que están debajo del árbol.", "style": { "font": "segoe", "size": 40, "color": "black" } }, + { "type": "text", "x": 450, "y": -685, "text": "¿Cuál será el más", "style": { "font": "segoe", "size": 40, "color": "black" } }, + { "type": "text", "x": 450, "y": -595, "text": "maravilloso del mundo?", "style": { "font": "segoe", "size": 40, "color": "black" } } + ] + }, + { + "page_id": 32, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1115, "y": 1075 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1825, "y": 925 }, + { "type": "text", "x": 200, "y": -1045, "text": "Allí están un juego de mesa, muchos libros, un", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "oso de peluche gigante y un patinete. Al fondo,", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -865, "text": "envuelta en papel rojo con un lazo dorado, hay", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -775, "text": "una caja muy muy pequeña. Tan pequeña que", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -685, "text": "{{child_1}} y {{child_2}} no creen que ahí", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -595, "text": "dentro pueda haber ningún regalo especial.", "style": { "font": "segoe", "size": 56, "color": "black" } } + ] + }, + { + "page_id": 33, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1050, "y": 1310 }, + { "type": "photo", "content": "photo_hijo_2", "x": 715, "y": 1425 } + ] + }, + { + "page_id": 34, + "elements": [ + { "type": "text", "x": 300, "y": -1045, "text": "La abren desconfiadas y dentro descubren un sobre. Un sobre igual al que han", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 300, "y": -955, "text": "recibido todos los días anteriores. En él hay una carta sin firmar cuyo mensaje", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 300, "y": -865, "text": "es muy claro, una sola palabra escrita en letra grande, que les dice cuál es el", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 300, "y": -775, "text": "mejor regalo que podemos tener en Navidad:", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 100, "y": 20, "text": "Familia", "style": { "font": "crayon", "size": 250, "color": "red" } } + ] + }, + { + "page_id": 35, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 685, "y": 805 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1020, "y": 1365 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1575, "y": 1375 }, + { "type": "text", "x": 200, "y": -1045, "text": "La casa de {{child_1}} y {{child_2}} ya no está en silencio. Toda su familia", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "ha venido a celebrar con ellas la Navidad. Ríen, cantan, bailan el burrito", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -865, "text": "sabanero y {{adult_0}} casi se atraganta con un polvorón.", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -775, "text": "Todos están convencidos de haber conseguido el regalo más maravilloso", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -685, "text": "del mundo.", "style": { "font": "segoe", "size": 56, "color": "black" } } + ] + } + ] + }, + "1_adult_3_children": { + "description": "1 Adulto, 3 Niños/as", + "pages": [ + { + "page_id": 0, + "elements": [ + { "type": "text", "x": 1325, "y": -900, "text": "El Mejor Regalo", "style": { "font": "fancy", "size": 175, "color": "white" } }, + { "type": "text", "x": 1325, "y": -710, "text": "De La Navidad", "style": { "font": "fancy", "size": 175, "color": "white" } }, + { "type": "text", "x": 2845, "y": -1050, "text": "El Mejor Regalo De La Navidad", "style": { "font": "main", "size": 50, "color": "red", "gravity": "EAST", "rotation": -90 } }, + { "type": "photo", "content": "photo_adulto_0", "x": 3925, "y": 1452 }, + { "type": "photo", "content": "photo_hijo_1", "x": 3900, "y": 820 }, + { "type": "photo", "content": "photo_hijo_2", "x": 3005, "y": 810 }, + { "type": "photo", "content": "photo_hijo_3", "x": 1610, "y": 570 } + ] + }, + { + "page_id": 4, + "elements": [ + { "type": "photo", "content": "photo_dedicatoria", "x": 353, "y": 216 }, + { "type": "text", "x": 120, "y": 350, "text": "{{dedication}}", "style": { "font": "main", "size": 63, "color": "black", "rotation": 9 } } + ] + }, + { + "page_id": 5, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "Es muy temprano y la casa de {{child_1}},", "style": { "font": "segoe", "size": 56, "color": "purple" } }, + { "type": "text", "x": 200, "y": -955, "text": "{{child_2}} y {{child_3}} está en silencio.", "style": { "font": "segoe", "size": 56, "color": "purple" } }, + { "type": "text", "x": 200, "y": -865, "text": "Aún no se escucha la cucharilla dando vueltas", "style": { "font": "segoe", "size": 56, "color": "purple" } }, + { "type": "text", "x": 200, "y": -775, "text": "al café de {{adult_0}}. Pero {{child_1}}, {{child_2}}", "style": { "font": "segoe", "size": 56, "color": "purple" } }, + { "type": "text", "x": 200, "y": -685, "text": "y {{child_3}} han oído un ruido en el salón y", "style": { "font": "segoe", "size": 56, "color": "purple" } }, + { "type": "text", "x": 200, "y": -595, "text": "se levantan a investigar.", "style": { "font": "segoe", "size": 56, "color": "purple" } }, + { "type": "photo", "content": "photo_hijo_1", "x": 1456, "y": 1150 }, + { "type": "photo", "content": "photo_hijo_2", "x": 595, "y": 1202 }, + { "type": "photo", "content": "photo_hijo_3", "x": 998, "y": 1365 } + ] + }, + { + "page_id": 6, + "elements": [ + { "type": "text", "x": 0, "y": 775, "text": "Al lado del sofá ha crecido un abeto, igualito que un árbol de", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": 0, "y": 865, "text": "Navidad, pero sin adornos. De él cuelga una cuerda con un sobre", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": 0, "y": 955, "text": "que lleva sus nombres escritos con letra grande.", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": 0, "y": 1045, "text": "{{child_1}}, {{child_2}} y {{child_3}} se apresuran a cogerlo.", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": -10, "y": -40, "text": "{{child_1}}", "style": { "color": "black", "size": 55, "rotation": -5 } }, + { "type": "text", "x": -10, "y": -25, "text": "{{child_2}}", "style": { "color": "black", "size": 55, "rotation": -5 } }, + { "type": "text", "x": -10, "y": -10, "text": "{{child_3}}", "style": { "color": "black", "size": 55, "rotation": -5 } } + ] + }, + { + "page_id": 7, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 927, "y": 628 }, + { "type": "text", "x": 200, "y": -1045, "text": "Dentro del sobre hay una carta sin firmar", "style": { "font": "segoe", "size": 56, "color": "purple" } }, + { "type": "text", "x": 200, "y": -955, "text": "cuyas instrucciones son claras:", "style": { "font": "segoe", "size": 56, "color": "purple" } } + ] + }, + { + "page_id": 8, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1075, "y": 1330 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1520, "y": 1340 }, + { "type": "photo", "content": "photo_hijo_3", "x": 785, "y": 1398 }, + { "type": "text", "x": 200, "y": -1045, "text": "“Si quieren recibir el regalo de Navidad más maravilloso del mundo, tendrán que", "style": { "font": "indie", "size": 56, "color": "black", "gravity": "NORTHWEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "superar una serie de pruebas”. ¡Qué emocionante! ¿Quién mandará esa carta?", "style": { "font": "indie", "size": 56, "color": "black", "gravity": "NORTHWEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "Algo cae de dentro del sobre y se esparce por el suelo. ¡Es arena!", "style": { "font": "indie", "size": 56, "color": "black", "gravity": "NORTHWEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "¡Lo han enviado los Reyes Magos! {{child_1}}, {{child_2}} y {{child_3}} no se lo", "style": { "font": "indie", "size": 56, "color": "black", "gravity": "NORTHWEST" } }, + { "type": "text", "x": 200, "y": -685, "text": "pueden creer, los mismísimos Reyes Magos les han mandado una carta, ¡a ellos!", "style": { "font": "indie", "size": 56, "color": "black", "gravity": "NORTHWEST" } } + ] + }, + { + "page_id": 9, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 550, "y": 1192 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1438, "y": 1243 }, + { "type": "photo", "content": "photo_hijo_3", "x": 842, "y": 1200 }, + { "type": "text", "x": 200, "y": -1045, "text": "La primera prueba que deben superar consiste en cocinar las galletas de", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "Navidad más originales.", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -865, "text": "¡No hay tiempo que perder! Nunca han cocinado galletas, pero no puede ser", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -775, "text": "tan difícil.", "style": { "font": "segoe", "size": 56, "color": "black" } } + ] + }, + { + "page_id": 10, + "elements": [ + { "type": "text", "x": 200, "y": 685, "text": "Seguro que llevan harina, huevos, mantequilla y azúcar, mucho azúcar. Abren el", "style": { "font": "crayon", "size": 160, "color": "white" } }, + { "type": "text", "x": 200, "y": 775, "text": "armario de las especias y añaden canela, jengibre, nuez moscada y virutas de", "style": { "font": "crayon", "size": 160, "color": "white" } }, + { "type": "text", "x": 200, "y": 865, "text": "chocolate, ¡serán las galletas más deliciosas que han comido jamás! Toda la", "style": { "font": "crayon", "size": 160, "color": "white" } }, + { "type": "text", "x": 200, "y": 955, "text": "casa huele a Navidad.", "style": { "font": "crayon", "size": 160, "color": "white" } }, + { "type": "text", "x": 200, "y": 1045, "text": "Amasan la mezcla y le dan la forma de los miembros de la familia.", "style": { "font": "crayon", "size": 160, "color": "white" } } + ] + }, + { + "page_id": 11, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 900, "y": 458 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1295, "y": 942 }, + { "type": "photo", "content": "photo_hijo_2", "x": 530, "y": 758 }, + { "type": "photo", "content": "photo_hijo_3", "x": 928, "y": 982 }, + { "type": "text", "x": 200, "y": 865, "text": "Las sacan del horno y las prueban aún calientes. Son muy bonitas, pero están", "style": { "font": "crayon", "size": 160, "color": "white" } }, + { "type": "text", "x": 200, "y": 955, "text": "durísimas, no se las pueden comer, a no ser que quieran romperse los dientes.", "style": { "font": "crayon", "size": 160, "color": "white" } }, + { "type": "text", "x": 200, "y": 1045, "text": "¡Qué decepción!", "style": { "font": "crayon", "size": 160, "color": "white" } } + ] + }, + { + "page_id": 12, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "Están pensando en intentarlo de nuevo cuando descubren un nuevo sobre", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "colgado del árbol. En él viene explicada la segunda prueba: deben decorar el", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -865, "text": "árbol de una manera especial.", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 15, "y": 60, "text": "{{child_1}}", "style": { "font": "ebrima", "size": 70, "color": "black" } }, + { "type": "text", "x": 17, "y": 90, "text": "{{child_2}}", "style": { "font": "ebrima", "size": 70, "color": "black" } }, + { "type": "text", "x": 17, "y": 110, "text": "{{child_3}}", "style": { "font": "ebrima", "size": 70, "color": "black" } } + ] + }, + { + "page_id": 13, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 450, "y": 828 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1025, "y": 1315 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1720, "y": 1442 }, + { "type": "text", "x": 200, "y": -1045, "text": "{{child_1}}, {{child_2}} y {{child_3}}, con ayuda de {{adult_0}}, lo adornan", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "con bolas de colores, guirnaldas de espumillón y una estrella en la punta,", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -865, "text": "como todos los años. ¿Qué pueden hacer para que este año sea especial?", "style": { "font": "segoe", "size": 56, "color": "black" } } + ] + }, + { + "page_id": 14, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "Sobre la mesa están las galletas que acaban de cocinar. ¡Qué buena idea! Así todos", "style": { "font": "crayon", "size": 120, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "formarán parte del árbol.", "style": { "font": "crayon", "size": 120, "color": "black" } } + ] + }, + { + "page_id": 15, + "elements": [ + { "type": "text", "x": 50, "y": 181, "text": "Al día siguiente, {{child_1}}, {{child_2}} y {{child_3}} no quitan ojo del árbol", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 50, "y": 204, "text": "esperando el próximo sobre. Pero, esta vez, la siguiente prueba aparece junto a la", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 50, "y": 227, "text": "chimenea. ¿La enviará Papá Noel? La carta dice que deberán montar una banda de", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 50, "y": 250, "text": "villancicos.", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": -5, "y": -152, "text": "{{child_1}}", "style": { "font": "ebrima", "size": 70, "color": "black" } }, + { "type": "text", "x": -4, "y": -142, "text": "{{child_2}}", "style": { "font": "ebrima", "size": 70, "color": "black" } }, + { "type": "text", "x": -5, "y": -132, "text": "{{child_3}}", "style": { "font": "ebrima", "size": 70, "color": "black" } } + ] + }, + { + "page_id": 16, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 325, "y": 1015 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1700, "y": 1320 }, + { "type": "photo", "content": "photo_hijo_2", "x": 2025, "y": 990 }, + { "type": "photo", "content": "photo_hijo_3", "x": 1285, "y": 995 }, + { "type": "text", "x": 200, "y": -1045, "text": "Fabrican unas entradas para {{adult_0}}, y organizan un concierto en el", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "salón. {{child_1}}, {{child_2}} y {{child_3}} tocan la pandereta, Trasto la zambomba", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -865, "text": "y juntos cantan villancicos hasta el anochecer. A todos les parece muy", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -775, "text": "divertido; a los vecinos, no tanto.", "style": { "font": "segoe", "size": 56, "color": "black" } } + ] + }, + { + "page_id": 17, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "La cuarta prueba aparece en la caja de los bloques de construcción. Les pide que", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "reúnan aquellos juguetes que ya no utilicen y se los regalen a niños y niñas que", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -865, "text": "tienen menos que ellas.", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": -35, "y": -5, "text": "{{child_1}}", "style": { "font": "ebrima", "size": 70, "color": "black" } }, + { "type": "text", "x": -25, "y": 35, "text": "{{child_2}}", "style": { "font": "ebrima", "size": 70, "color": "black" } }, + { "type": "text", "x": -15, "y": 55, "text": "{{child_3}}", "style": { "font": "ebrima", "size": 70, "color": "black" } } + ] + }, + { + "page_id": 18, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 565, "y": 845 }, + { "type": "photo", "content": "photo_hijo_2", "x": 920, "y": 818 }, + { "type": "photo", "content": "photo_hijo_3", "x": 255, "y": 965 }, + { "type": "text", "x": 50, "y": 955, "text": "Esta prueba es muy difícil porque les da mucha pena despedirse de sus posesiones,", "style": { "font": "ebrima", "size": 64, "color": "black" } }, + { "type": "text", "x": 50, "y": 1045, "text": "pero les ayuda a pensar en lo felices que estarán otros niños jugando con ellas.", "style": { "font": "ebrima", "size": 64, "color": "black" } } + ] + }, + { + "page_id": 19, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 885, "y": 544 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1178, "y": 1025 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1435, "y": 1020 }, + { "type": "photo", "content": "photo_hijo_3", "x": 910, "y": 1080 } + ] + }, + { + "page_id": 20, + "elements": [ + { "type": "text", "x": 0, "y": 1045, "text": "La quinta prueba tarda varios días en aparecer...", "style": { "font": "segoe", "size": 56, "color": "white" } } + ] + }, + { + "page_id": 21, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 956, "y": 560 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1356, "y": 560 }, + { "type": "photo", "content": "photo_hijo_3", "x": 1792, "y": 565 }, + { "type": "text", "x": 200, "y": -1045, "text": "La descubre Trasto en su cama junto a un trozo de carbón. Tienen que crear", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -955, "text": "sus propias felicitaciones de Navidad y enviárselas a sus amigos y familiares.", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -865, "text": "Se pasan el día rodeados de cartulinas de colores, témperas y purpurina. La", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 200, "y": -775, "text": "purpurina aparece hasta en la sopa de la cena.", "style": { "font": "segoe", "size": 56, "color": "black" } }, + { "type": "text", "x": 15, "y": 5, "text": "{{child_1}}", "style": { "font": "ebrima", "size": 70, "color": "black" } }, + { "type": "text", "x": 20, "y": 50, "text": "{{child_2}}", "style": { "font": "ebrima", "size": 70, "color": "black" } }, + { "type": "text", "x": 25, "y": 75, "text": "{{child_3}}", "style": { "font": "ebrima", "size": 70, "color": "black" } } + ] + }, + { + "page_id": 23, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1972, "y": 1020 }, + { "type": "photo", "content": "photo_hijo_2", "x": 862, "y": 1150 }, + { "type": "text", "x": -138, "y": 70, "text": "{{child_1}}", "style": { "font": "ebrima", "size": 70, "color": "black", "rotation": 90 } }, + { "type": "text", "x": -7, "y": 90, "text": "{{child_2}}", "style": { "font": "ebrima", "size": 70, "color": "black", "rotation": 90 } }, + { "type": "text", "x": 125, "y": 80, "text": "{{child_3}}", "style": { "font": "ebrima", "size": 70, "color": "black", "rotation": 90 } } + ] + }, + { + "page_id": 24, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 1135, "y": 740 }, + { "type": "photo", "content": "photo_hijo_3", "x": 282, "y": 510 }, + { "type": "text", "x": 0, "y": 1045, "text": "Un sexto sobre aparece dentro del congelador.", "style": { "gravity": "CENTER", "color": "white" } } + ] + }, + { + "page_id": 25, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 315, "y": 522 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1110, "y": 905 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1925, "y": 975 }, + { "type": "photo", "content": "photo_hijo_3", "x": 565, "y": 895 }, + { "type": "text", "x": 200, "y": 865, "text": "Toda la familia debe salir a buscar dos adornos de Navidad, el más grande y", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": 955, "text": "el más pequeño que puedan encontrar. Sin duda el mejor lugar para conseguir", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": 1045, "text": "adornos es el mercadillo de la ciudad.", "style": { "font": "segoe", "size": 56, "color": "white" } } + ] + }, + { + "page_id": 26, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "El camino está deslumbrante. Cascadas de luces adornan las calles y estrellas de", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": -955, "text": "colores cubren el cielo como si fuera el firmamento. Pasan junto a un Belén en el", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": -865, "text": "que las figuras se mueven y el río tiene agua de verdad, ¿habrá peces bebiendo?", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "photo", "content": "photo_hijo_2", "x": 1025, "y": 745 }, + { "type": "photo", "content": "photo_hijo_3", "x": 790, "y": 770 } + ] + }, + { + "page_id": 27, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 758, "y": 570 }, + { "type": "photo", "content": "photo_hijo_3", "x": 1720, "y": 1035 }, + { "type": "text", "x": 750, "y": -1045, "text": "En el mercadillo compran bastoncillos de caramelo, mazapanes", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 750, "y": -955, "text": "y un gorro gigante. ¿Será lo bastante grande?", "style": { "gravity": "WEST", "color": "white" } } + ] + }, + { + "page_id": 28, + "elements": [ + { "type": "photo", "content": "photo_hijo_2", "x": 1030, "y": 950 }, + { "type": "photo", "content": "photo_hijo_3", "x": 600, "y": 1030 }, + { "type": "text", "x": 200, "y": -1045, "text": "{{adult_0}} ha encontrado una estrella de madera muy", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 200, "y": -955, "text": "pequeña, pero {{child_1}}, {{child_2}} y {{child_3}}", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 200, "y": -865, "text": "no están muy seguras de haber superado la prueba.", "style": { "gravity": "WEST", "color": "white" } } + ] + }, + { + "page_id": 29, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 272, "y": 515 }, + { "type": "photo", "content": "photo_hijo_1", "x": 655, "y": 288 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1435, "y": 945 }, + { "type": "photo", "content": "photo_hijo_3", "x": 1825, "y": 965 }, + { "type": "text", "x": 200, "y": 775, "text": "De camino a casa empieza a nevar y las calles se cubren de un manto blanco.", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": 865, "text": "Toda la familia comienza a hacer un muñeco de nieve. Los mazapanes sirven de", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": 955, "text": "ojos y un bastoncillo de nariz. Le colocan el gorro sobre la cabeza. Cuando se", "style": { "font": "segoe", "size": 56, "color": "white" } }, + { "type": "text", "x": 200, "y": 1045, "text": "quieren dar cuenta, han hecho un muñeco de nieve más grande que {{adult_0}}.", "style": { "font": "segoe", "size": 56, "color": "white" } } + ] + }, + { + "page_id": 30, + "elements": [ + { "type": "text", "x": 650, "y": -1045, "text": "Un copo de nieve diminuto cae sobre el pelo rojo de Trasto", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 650, "y": -955, "text": "y, sorprendentemente, no se derrite. ¡Parece magia!", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 650, "y": -865, "text": "¡Ahora sí que lo han conseguido!", "style": { "gravity": "WEST", "color": "white" } } + ] + }, + { + "page_id": 31, + "elements": [ + { "type": "text", "x": 450, "y": -1045, "text": "Ha llegado el gran día. Es muy temprano y,", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -955, "text": "antes de que se despierte {{adult_0}},", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -865, "text": "{{child_1}}, {{child_2}} y {{child_3}} corren", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -775, "text": "ilusionadas a abrir los regalos que están", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -685, "text": "debajo del árbol. ¿Cuál será el más", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -595, "text": "maravilloso del mundo?", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 32, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1115, "y": 1075 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1825, "y": 925 }, + { "type": "photo", "content": "photo_hijo_3", "x": 655, "y": 1185 }, + { "type": "text", "x": 200, "y": -1045, "text": "Allí están un juego de mesa, muchos libros, un", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "oso de peluche gigante y un patinete. Al fondo,", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "envuelta en papel rojo con un lazo dorado, hay", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "una caja muy muy pequeña. Tan pequeña que", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -685, "text": "{{child_1}}, {{child_2}} y {{child_3}} no", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -595, "text": "creen que ahí dentro pueda haber ningún", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -505, "text": "regalo especial.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 33, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1050, "y": 1310 }, + { "type": "photo", "content": "photo_hijo_2", "x": 715, "y": 1425 }, + { "type": "photo", "content": "photo_hijo_3", "x": 1580, "y": 1410 } + ] + }, + { + "page_id": 34, + "elements": [ + { "type": "text", "x": 300, "y": -1045, "text": "La abren desconfiadas y dentro descubren un sobre. Un sobre igual al que han", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 300, "y": -955, "text": "recibido todos los días anteriores. En él hay una carta sin firmar cuyo mensaje", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 300, "y": -865, "text": "es muy claro, una sola palabra escrita en letra grande, que les dice cuál es el", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 300, "y": -775, "text": "mejor regalo que podemos tener en Navidad:", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 100, "y": 20, "text": "Familia", "style": { "size": 250, "color": "red" } } + ] + }, + { + "page_id": 35, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 685, "y": 805 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1020, "y": 1365 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1575, "y": 1375 }, + { "type": "photo", "content": "photo_hijo_3", "x": 1885, "y": 1375 }, + { "type": "text", "x": 200, "y": -1045, "text": "La casa de {{child_1}}, {{child_2}} y {{child_3}} ya no está en silencio.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "Toda su familia ha venido a celebrar con ellas la Navidad. Ríen, cantan,", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "bailan el burrito sabanero y {{adult_0}} casi se atraganta con un polvorón.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "Todos están convencidos de haber conseguido el regalo más maravilloso", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -685, "text": "del mundo.", "style": { "gravity": "WEST" } } + ] + } + ] + }, + "2_adults_1_child": { + "description": "2 Adultos, 1 Niño/a", + "pages": [ + { + "page_id": 0, + "elements": [ + { "type": "text", "x": 1325, "y": -900, "text": "El Mejor Regalo", "style": { "font": "fancy", "size": 175, "color": "white" } }, + { "type": "text", "x": 1325, "y": -710, "text": "De La Navidad", "style": { "font": "fancy", "size": 175, "color": "white" } }, + { "type": "text", "x": 2845, "y": -1050, "text": "El Mejor Regalo De La Navidad", "style": { "font": "main", "size": 50, "color": "red", "gravity": "EAST", "rotation": -90 } }, + { "type": "photo", "content": "photo_adulto_0", "x": 3810, "y": 1000 }, + { "type": "photo", "content": "photo_adulto_1", "x": 3295, "y": 1000 }, + { "type": "photo", "content": "photo_hijo_1", "x": 4762, "y": 1365 } + ] + }, + { + "page_id": 4, + "elements": [ + { "type": "photo", "content": "photo_dedicatoria", "x": 353, "y": 216 }, + { "type": "text", "x": 120, "y": 350, "text": "{{dedication}}", "style": { "font": "main", "size": 63, "color": "black", "rotation": 9 } } + ] + }, + { + "page_id": 5, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "Es muy temprano y la casa de {{child_1}}", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "está en silencio. Aún no se escucha la", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "cucharilla dando vueltas al café", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "de {{adult_0}} ni la tostadora con el pan", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -685, "text": "de {{adult_1}}. Pero {{child_1}} ha oído", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -595, "text": "un ruido en el salón y se levanta", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -505, "text": "a investigar.", "style": { "gravity": "WEST" } }, + { "type": "photo", "content": "photo_hijo_1", "x": 1456, "y": 1150 } + ] + }, + { + "page_id": 6, + "elements": [ + { "type": "text", "x": 0, "y": 775, "text": "Al lado del sofá ha crecido un abeto, igualito que un árbol de", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": 0, "y": 865, "text": "Navidad, pero sin adornos. De él cuelga una cuerda con un sobre", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": 0, "y": 955, "text": "que lleva su nombre escrito con letra grande.", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": 0, "y": 1045, "text": "{{child_1}} se apresura a cogerlo.", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": -10, "y": -40, "text": "{{child_1}}", "style": { "color": "black", "size": 55, "rotation": -5 } } + ] + }, + { + "page_id": 7, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 927, "y": 628 }, + { "type": "photo", "content": "photo_adulto_1", "x": 953, "y": 983 }, + { "type": "text", "x": 200, "y": -1045, "text": "Dentro del sobre hay una carta sin firmar", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "cuyas instrucciones son claras:", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 8, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1075, "y": 1330 }, + { "type": "text", "x": 200, "y": -1045, "text": "“Si quieres recibir el regalo de Navidad más maravilloso del mundo, tendrás que", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "superar una serie de pruebas”. ¡Qué emocionante! ¿Quién mandará esa carta?", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "Algo cae de dentro del sobre y se esparce por el suelo. ¡Es arena!", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "¡Lo han enviado los Reyes Magos! {{child_1}} no se lo puede creer,", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -685, "text": "los mismísimos Reyes Magos les han mandado una carta, ¡a {{child_1}}!", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 9, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 550, "y": 1192 }, + { "type": "text", "x": 200, "y": -1045, "text": "La primera prueba que debe superar consiste en cocinar las galletas de", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "Navidad más originales.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "¡No hay tiempo que perder! Nunca ha cocinado galletas, pero no puede ser", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "tan difícil.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 10, + "elements": [ + { "type": "text", "x": 200, "y": 685, "text": "Seguro que llevan harina, huevos, mantequilla y azúcar, mucho azúcar. Abren el", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 775, "text": "armario de las especias y añaden canela, jengibre, nuez moscada y virutas de", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 865, "text": "chocolate, ¡serán las galletas más deliciosas que han comido jamás! Toda la", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 955, "text": "casa huele a Navidad.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 1045, "text": "Amasan la mezcla y le dan la forma de los miembros de la familia.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 11, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 900, "y": 458 }, + { "type": "photo", "content": "photo_adulto_1", "x": 1550, "y": 462 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1295, "y": 942 }, + { "type": "text", "x": 200, "y": 865, "text": "Las sacan del horno y las prueban aún calientes. Son muy bonitas, pero están", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 955, "text": "durísimas, no se las pueden comer, a no ser que quieran romperse los dientes.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 1045, "text": "¡Qué decepción!", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 12, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "Están pensando en intentarlo de nuevo cuando descubren un nuevo sobre", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "colgado del árbol. En él viene explicada la segunda prueba: debe decorar el", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "árbol de una manera especial.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 15, "y": 60, "text": "{{child_1}}", "style": { "size": 50 } } + ] + }, + { + "page_id": 13, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 450, "y": 828 }, + { "type": "photo", "content": "photo_adulto_1", "x": 1595, "y": 1360 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1025, "y": 1315 }, + { "type": "text", "x": 200, "y": -1045, "text": "{{child_1}}, con ayuda de {{adult_0}} y {{adult_1}}, lo adorna con", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "bolas de colores, guirnaldas de espumillón y una estrella en la punta,", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "como todos los años. ¿Qué puede hacer para que este año sea especial?", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 14, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "Sobre la mesa están las galletas que acaba de cocinar. ¡Qué buena idea! Así todos", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "formarán parte del árbol.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 15, + "elements": [ + { "type": "text", "x": 50, "y": 181, "text": "Al día siguiente, {{child_1}} no quita ojo del árbol esperando el próximo sobre.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 50, "y": 204, "text": "Pero, esta vez, la siguiente prueba aparece junto a la chimenea. ¿La enviará", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 50, "y": 227, "text": "Papá Noel? La carta dice que deberá montar una banda de villancicos.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": -5, "y": -152, "text": "{{child_1}}", "style": { "size": 35 } } + ] + }, + { + "page_id": 16, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 325, "y": 1015 }, + { "type": "photo", "content": "photo_adulto_1", "x": 660, "y": 1040 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1700, "y": 1320 }, + { "type": "text", "x": 200, "y": -1045, "text": "Fabrican unas entradas para {{adult_0}} y {{adult_1}}, y organizan un concierto en el", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "salón. {{child_1}} toca la pandereta, Trasto la zambomba", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "y juntos cantan villancicos hasta el anochecer. A todos les parece muy", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "divertido; a los vecinos, no tanto.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 17, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "La cuarta prueba aparece en la caja de los bloques de construcción. Les pide que", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "reúnan aquellos juguetes que ya no utilicen y se los regalen a niños y niñas que", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "tienen menos que ellas.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": -35, "y": 15, "text": "{{child_1}}", "style": { "size": 50 } } + ] + }, + { + "page_id": 18, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 565, "y": 845 }, + { "type": "text", "x": 50, "y": 955, "text": "Esta prueba es muy difícil porque les da mucha pena despedirse de sus posesiones,", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 50, "y": 1045, "text": "pero les ayuda a pensar en lo felices que estarán otros niños jugando con ellas.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 19, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 885, "y": 544 }, + { "type": "photo", "content": "photo_adulto_1", "x": 1255, "y": 515 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1178, "y": 1025 } + ] + }, + { + "page_id": 20, + "elements": [ + { "type": "text", "x": 0, "y": 1045, "text": "La quinta prueba tarda varios días en aparecer...", "style": { "gravity": "CENTER", "color": "white" } } + ] + }, + { + "page_id": 21, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 956, "y": 560 }, + { "type": "text", "x": 200, "y": -1045, "text": "La descubre Trasto en su cama junto a un trozo de carbón. Tienen que crear", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "sus propias felicitaciones de Navidad y enviárselas a sus amigos y familiares.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "Se pasan el día rodeados de cartulinas de colores, témperas y purpurina. La", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "purpurina aparece hasta en la sopa de la cena.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 15, "y": 5, "text": "{{child_1}}", "style": { "size": 35 } } + ] + }, + { + "page_id": 23, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1972, "y": 1020 }, + { "type": "text", "x": -138, "y": 70, "text": "{{child_1}}", "style": { "size": 35 } } + ] + }, + { + "page_id": 24, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 1135, "y": 740 }, + { "type": "text", "x": 0, "y": 1045, "text": "Un sexto sobre aparece dentro del congelador.", "style": { "gravity": "CENTER", "color": "white" } } + ] + }, + { + "page_id": 25, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 315, "y": 522 }, + { "type": "photo", "content": "photo_adulto_1", "x": 1505, "y": 570 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1110, "y": 905 }, + { "type": "text", "x": 200, "y": 865, "text": "Toda la familia debe salir a buscar dos adornos de Navidad, el más grande y", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 955, "text": "el más pequeño que puedan encontrar. Sin duda el mejor lugar para conseguir", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 1045, "text": "adornos es el mercadillo de la ciudad.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 26, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "El camino está deslumbrante. Cascadas de luces adornan las calles y estrellas de", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "colores cubren el cielo como si fuera el firmamento. Pasan junto a un Belén en el", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "que las figuras se mueven y el río tiene agua de verdad, ¿habrá peces bebiendo?", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 27, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 758, "y": 570 }, + { "type": "text", "x": 750, "y": -1045, "text": "En el mercadillo compran bastoncillos de caramelo, mazapanes", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 750, "y": -955, "text": "y un gorro gigante. ¿Será lo bastante grande?", "style": { "gravity": "WEST", "color": "white" } } + ] + }, + { + "page_id": 28, + "elements": [ + { "type": "photo", "content": "photo_adulto_1", "x": 1490, "y": 645 }, + { "type": "text", "x": 200, "y": -1045, "text": "{{adult_1}} ha encontrado una estrella de madera muy", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 200, "y": -955, "text": "pequeña, pero {{child_1}} no está muy segura", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 200, "y": -865, "text": "de haber superado la prueba.", "style": { "gravity": "WEST", "color": "white" } } + ] + }, + { + "page_id": 29, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 272, "y": 515 }, + { "type": "photo", "content": "photo_adulto_1", "x": 1710, "y": 475 }, + { "type": "photo", "content": "photo_hijo_1", "x": 655, "y": 288 }, + { "type": "text", "x": 200, "y": 775, "text": "De camino a casa empieza a nevar y las calles se cubren de un manto blanco.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 865, "text": "Toda la familia comienza a hacer un muñeco de nieve. Los mazapanes sirven de", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 955, "text": "ojos y un bastoncillo de nariz. Le colocan el gorro sobre la cabeza. Cuando se", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 1045, "text": "quieren dar cuenta, han hecho un muñeco de nieve más grande que {{adult_1}}.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 30, + "elements": [ + { "type": "text", "x": 650, "y": -1045, "text": "Un copo de nieve diminuto cae sobre el pelo rojo de Trasto", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 650, "y": -955, "text": "y, sorprendentemente, no se derrite. ¡Parece magia!", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 650, "y": -865, "text": "¡Ahora sí que lo han conseguido!", "style": { "gravity": "WEST", "color": "white" } } + ] + }, + { + "page_id": 31, + "elements": [ + { "type": "text", "x": 450, "y": -1045, "text": "Ha llegado el gran día. Es muy temprano y,", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -955, "text": "antes de que se despierten {{adult_0}} y", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -865, "text": "{{adult_1}}, {{child_1}} corre ilusionada a abrir", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -775, "text": "los regalos que están debajo del árbol.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -685, "text": "¿Cuál será el más", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -595, "text": "maravilloso del mundo?", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 32, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1115, "y": 1075 }, + { "type": "text", "x": 200, "y": -1045, "text": "Allí están un juego de mesa, muchos libros, un", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "oso de peluche gigante y un patinete. Al fondo,", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "envuelta en papel rojo con un lazo dorado, hay", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "una caja muy muy pequeña. Tan pequeña que", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -685, "text": "{{child_1}} no cree que ahí", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -595, "text": "dentro pueda haber ningún regalo especial.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 34, + "elements": [ + { "type": "text", "x": 300, "y": -1045, "text": "La abre desconfiada y dentro descubre un sobre. Un sobre igual al que ha", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 300, "y": -955, "text": "recibido todos los días anteriores. En él hay una carta sin firmar cuyo mensaje", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 300, "y": -865, "text": "es muy claro, una sola palabra escrita en letra grande, que le dice cuál es el", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 300, "y": -775, "text": "mejor regalo que podemos tener en Navidad:", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 100, "y": 20, "text": "Familia", "style": { "size": 250, "color": "red" } } + ] + }, + { + "page_id": 35, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 685, "y": 805 }, + { "type": "photo", "content": "photo_adulto_1", "x": 1285, "y": 815 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1020, "y": 1365 }, + { "type": "text", "x": 200, "y": -1045, "text": "La casa de {{child_1}} ya no está en silencio. Toda su familia", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "ha venido a celebrar con ella la Navidad. Ríen, cantan, bailan el burrito", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "sabanero y {{adult_0}} casi se atraganta con un polvorón.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "Todos están convencidos de haber conseguido el regalo más maravilloso", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -685, "text": "del mundo.", "style": { "gravity": "WEST" } } + ] + } + ] + }, + "2_adults_2_children": { + "description": "2 Adultos, 2 Niños/as", + "pages": [ + { + "page_id": 0, + "elements": [ + { "type": "text", "x": 1325, "y": -900, "text": "El Mejor Regalo", "style": { "font": "fancy", "size": 175, "color": "white" } }, + { "type": "text", "x": 1325, "y": -710, "text": "De La Navidad", "style": { "font": "fancy", "size": 175, "color": "white" } }, + { "type": "text", "x": 2845, "y": -1050, "text": "El Mejor Regalo De La Navidad", "style": { "font": "main", "size": 50, "color": "red", "gravity": "EAST", "rotation": -90 } }, + { "type": "photo", "content": "photo_adulto_0", "x": 3810, "y": 1000 }, + { "type": "photo", "content": "photo_adulto_1", "x": 3295, "y": 1000 }, + { "type": "photo", "content": "photo_hijo_1", "x": 4762, "y": 1365 }, + { "type": "photo", "content": "photo_hijo_2", "x": 4335, "y": 1525 } + ] + }, + { + "page_id": 4, + "elements": [ + { "type": "photo", "content": "photo_dedicatoria", "x": 353, "y": 216 }, + { "type": "text", "x": 120, "y": 350, "text": "{{dedication}}", "style": { "font": "main", "size": 63, "color": "black", "rotation": 9 } } + ] + }, + { + "page_id": 5, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "Es muy temprano y la casa de {{child_1}} y", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "{{child_2}} está en silencio. Aún no se", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "escucha la cucharilla dando vueltas al café", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "de {{adult_0}} ni la tostadora con el pan", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -685, "text": "de {{adult_1}}. Pero {{child_1}} y {{child_2}}", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -595, "text": "han oído un ruido en el salón y se levantan", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -505, "text": "a investigar.", "style": { "gravity": "WEST" } }, + { "type": "photo", "content": "photo_hijo_1", "x": 1456, "y": 1150 }, + { "type": "photo", "content": "photo_hijo_2", "x": 595, "y": 1202 } + ] + }, + { + "page_id": 6, + "elements": [ + { "type": "text", "x": 0, "y": 775, "text": "Al lado del sofá ha crecido un abeto, igualito que un árbol de", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": 0, "y": 865, "text": "Navidad, pero sin adornos. De él cuelga una cuerda con un sobre", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": 0, "y": 955, "text": "que lleva sus nombres escritos con letra grande.", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": 0, "y": 1045, "text": "{{child_1}} y {{child_2}} se apresuran a cogerlo.", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": -10, "y": -35, "text": "{{child_1}}", "style": { "color": "black", "size": 55, "rotation": -5 } }, + { "type": "text", "x": -10, "y": -20, "text": "{{child_2}}", "style": { "color": "black", "size": 55, "rotation": -5 } } + ] + }, + { + "page_id": 7, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 927, "y": 628 }, + { "type": "photo", "content": "photo_adulto_1", "x": 953, "y": 983 }, + { "type": "text", "x": 200, "y": -1045, "text": "Dentro del sobre hay una carta sin firmar", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "cuyas instrucciones son claras:", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 8, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1075, "y": 1330 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1520, "y": 1340 }, + { "type": "text", "x": 200, "y": -1045, "text": "“Si quieren recibir el regalo de Navidad más maravilloso del mundo, tendrán que", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "superar una serie de pruebas”. ¡Qué emocionante! ¿Quién mandará esa carta?", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "Algo cae de dentro del sobre y se esparce por el suelo. ¡Es arena!", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "¡Lo han enviado los Reyes Magos! {{child_1}} y {{child_2}} no se lo", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -685, "text": "pueden creer, los mismísimos Reyes Magos les han mandado una carta, ¡a ellos!", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 9, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 550, "y": 1192 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1438, "y": 1243 }, + { "type": "text", "x": 200, "y": -1045, "text": "La primera prueba que deben superar consiste en cocinar las galletas de", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "Navidad más originales.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "¡No hay tiempo que perder! Nunca han cocinado galletas, pero no puede ser", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "tan difícil.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 10, + "elements": [ + { "type": "text", "x": 200, "y": 685, "text": "Seguro que llevan harina, huevos, mantequilla y azúcar, mucho azúcar. Abren el", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 775, "text": "armario de las especias y añaden canela, jengibre, nuez moscada y virutas de", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 865, "text": "chocolate, ¡serán las galletas más deliciosas que han comido jamás! Toda la", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 955, "text": "casa huele a Navidad.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 1045, "text": "Amasan la mezcla y le dan la forma de los miembros de la familia.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 11, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 900, "y": 458 }, + { "type": "photo", "content": "photo_adulto_1", "x": 1550, "y": 462 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1295, "y": 942 }, + { "type": "photo", "content": "photo_hijo_2", "x": 530, "y": 758 }, + { "type": "text", "x": 200, "y": 865, "text": "Las sacan del horno y las prueban aún calientes. Son muy bonitas, pero están", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 955, "text": "durísimas, no se las pueden comer, a no ser que quieran romperse los dientes.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 1045, "text": "¡Qué decepción!", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 12, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "Están pensando en intentarlo de nuevo cuando descubren un nuevo sobre", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "colgado del árbol. En él viene explicada la segunda prueba: deben decorar el", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "árbol de una manera especial.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 15, "y": 60, "text": "{{child_1}}", "style": { "size": 50 } }, + { "type": "text", "x": 17, "y": 90, "text": "{{child_2}}", "style": { "size": 50 } } + ] + }, + { + "page_id": 13, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 450, "y": 828 }, + { "type": "photo", "content": "photo_adulto_1", "x": 1595, "y": 1360 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1025, "y": 1315 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1720, "y": 1442 }, + { "type": "text", "x": 200, "y": -1045, "text": "{{child_1}} y {{child_2}}, con ayuda de {{adult_0}} y {{adult_1}}, lo adornan", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "con bolas de colores, guirnaldas de espumillón y una estrella en la punta,", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "como todos los años. ¿Qué pueden hacer para que este año sea especial?", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 14, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "Sobre la mesa están las galletas que acaban de cocinar. ¡Qué buena idea! Así todos", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "formarán parte del árbol.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 15, + "elements": [ + { "type": "text", "x": 50, "y": 181, "text": "Al día siguiente, {{child_1}} y {{child_2}} no quitan ojo del árbol", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 50, "y": 204, "text": "esperando el próximo sobre. Pero, esta vez, la siguiente prueba aparece junto a la", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 50, "y": 227, "text": "chimenea. ¿La enviará Papá Noel? La carta dice que deberán montar una banda de", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 50, "y": 250, "text": "villancicos.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": -5, "y": -152, "text": "{{child_1}}", "style": { "size": 35 } }, + { "type": "text", "x": -4, "y": -142, "text": "{{child_2}}", "style": { "size": 35 } } + ] + }, + { + "page_id": 16, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 325, "y": 1015 }, + { "type": "photo", "content": "photo_adulto_1", "x": 660, "y": 1040 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1700, "y": 1320 }, + { "type": "photo", "content": "photo_hijo_2", "x": 2025, "y": 990 }, + { "type": "text", "x": 200, "y": -1045, "text": "Fabrican unas entradas para {{adult_0}} y {{adult_1}}, y organizan un concierto en el", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "salón. {{child_1}} y {{child_2}} tocan la pandereta, Trasto la zambomba", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "y juntos cantan villancicos hasta el anochecer. A todos les parece muy", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "divertido; a los vecinos, no tanto.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 17, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "La cuarta prueba aparece en la caja de los bloques de construcción. Les pide que", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "reúnan aquellos juguetes que ya no utilicen y se los regalen a niños y niñas que", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "tienen menos que ellas.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": -35, "y": -5, "text": "{{child_1}}", "style": { "size": 50 } }, + { "type": "text", "x": -25, "y": 35, "text": "{{child_2}}", "style": { "size": 50 } } + ] + }, + { + "page_id": 18, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 565, "y": 845 }, + { "type": "photo", "content": "photo_hijo_2", "x": 920, "y": 818 }, + { "type": "text", "x": 50, "y": 955, "text": "Esta prueba es muy difícil porque les da mucha pena despedirse de sus posesiones,", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 50, "y": 1045, "text": "pero les ayuda a pensar en lo felices que estarán otros niños jugando con ellas.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 19, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 885, "y": 544 }, + { "type": "photo", "content": "photo_adulto_1", "x": 1255, "y": 515 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1178, "y": 1025 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1435, "y": 1020 } + ] + }, + { + "page_id": 20, + "elements": [ + { "type": "text", "x": 0, "y": 1045, "text": "La quinta prueba tarda varios días en aparecer...", "style": { "gravity": "CENTER", "color": "white" } } + ] + }, + { + "page_id": 21, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 956, "y": 560 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1356, "y": 560 }, + { "type": "text", "x": 200, "y": -1045, "text": "La descubre Trasto en su cama junto a un trozo de carbón. Tienen que crear", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "sus propias felicitaciones de Navidad y enviárselas a sus amigos y familiares.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "Se pasan el día rodeados de cartulinas de colores, témperas y purpurina. La", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "purpurina aparece hasta en la sopa de la cena.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 15, "y": 5, "text": "{{child_1}}", "style": { "size": 35 } }, + { "type": "text", "x": 20, "y": 50, "text": "{{child_2}}", "style": { "size": 35 } } + ] + }, + { + "page_id": 23, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1972, "y": 1020 }, + { "type": "photo", "content": "photo_hijo_2", "x": 862, "y": 1150 }, + { "type": "text", "x": -138, "y": 70, "text": "{{child_1}}", "style": { "size": 35 } }, + { "type": "text", "x": -7, "y": 90, "text": "{{child_2}}", "style": { "size": 35 } } + ] + }, + { + "page_id": 24, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 1135, "y": 740 }, + { "type": "text", "x": 0, "y": 1045, "text": "Un sexto sobre aparece dentro del congelador.", "style": { "gravity": "CENTER", "color": "white" } } + ] + }, + { + "page_id": 25, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 315, "y": 522 }, + { "type": "photo", "content": "photo_adulto_1", "x": 1505, "y": 570 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1110, "y": 905 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1925, "y": 975 }, + { "type": "text", "x": 200, "y": 865, "text": "Toda la familia debe salir a buscar dos adornos de Navidad, el más grande y", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 955, "text": "el más pequeño que puedan encontrar. Sin duda el mejor lugar para conseguir", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 1045, "text": "adornos es el mercadillo de la ciudad.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 26, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "El camino está deslumbrante. Cascadas de luces adornan las calles y estrellas de", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "colores cubren el cielo como si fuera el firmamento. Pasan junto a un Belén en el", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "que las figuras se mueven y el río tiene agua de verdad, ¿habrá peces bebiendo?", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 27, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 758, "y": 570 }, + { "type": "text", "x": 750, "y": -1045, "text": "En el mercadillo compran bastoncillos de caramelo, mazapanes", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 750, "y": -955, "text": "y un gorro gigante. ¿Será lo bastante grande?", "style": { "gravity": "WEST", "color": "white" } } + ] + }, + { + "page_id": 28, + "elements": [ + { "type": "photo", "content": "photo_adulto_1", "x": 1490, "y": 645 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1030, "y": 950 }, + { "type": "text", "x": 200, "y": -1045, "text": "{{adult_1}} ha encontrado una estrella de madera muy", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 200, "y": -955, "text": "pequeña, pero {{child_1}} y {{child_2}} no están", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 200, "y": -865, "text": "muy seguras de haber superado la prueba.", "style": { "gravity": "WEST", "color": "white" } } + ] + }, + { + "page_id": 29, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 272, "y": 515 }, + { "type": "photo", "content": "photo_adulto_1", "x": 1710, "y": 475 }, + { "type": "photo", "content": "photo_hijo_1", "x": 655, "y": 288 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1435, "y": 945 }, + { "type": "text", "x": 200, "y": 775, "text": "De camino a casa empieza a nevar y las calles se cubren de un manto blanco.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 865, "text": "Toda la familia comienza a hacer un muñeco de nieve. Los mazapanes sirven de", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 955, "text": "ojos y un bastoncillo de nariz. Le colocan el gorro sobre la cabeza. Cuando se", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 1045, "text": "quieren dar cuenta, han hecho un muñeco de nieve más grande que {{adult_1}}.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 30, + "elements": [ + { "type": "text", "x": 650, "y": -1045, "text": "Un copo de nieve diminuto cae sobre el pelo rojo de Trasto", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 650, "y": -955, "text": "y, sorprendentemente, no se derrite. ¡Parece magia!", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 650, "y": -865, "text": "¡Ahora sí que lo han conseguido!", "style": { "gravity": "WEST", "color": "white" } } + ] + }, + { + "page_id": 31, + "elements": [ + { "type": "text", "x": 450, "y": -1045, "text": "Ha llegado el gran día. Es muy temprano y,", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -955, "text": "antes de que se despierten {{adult_0}} y", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -865, "text": "{{adult_1}}, {{child_1}} y {{child_2}} corren ilusionadas a abrir", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -775, "text": "los regalos que están debajo del árbol.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -685, "text": "¿Cuál será el más", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -595, "text": "maravilloso del mundo?", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 32, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1115, "y": 1075 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1825, "y": 925 }, + { "type": "text", "x": 200, "y": -1045, "text": "Allí están un juego de mesa, muchos libros, un", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "oso de peluche gigante y un patinete. Al fondo,", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "envuelta en papel rojo con un lazo dorado, hay", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "una caja muy muy pequeña. Tan pequeña que", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -685, "text": "{{child_1}} y {{child_2}} no creen que ahí", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -595, "text": "dentro pueda haber ningún regalo especial.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 33, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1050, "y": 1310 }, + { "type": "photo", "content": "photo_hijo_2", "x": 715, "y": 1425 } + ] + }, + { + "page_id": 34, + "elements": [ + { "type": "text", "x": 300, "y": -1045, "text": "La abren desconfiadas y dentro descubren un sobre. Un sobre igual al que han", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 300, "y": -955, "text": "recibido todos los días anteriores. En él hay una carta sin firmar cuyo mensaje", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 300, "y": -865, "text": "es muy claro, una sola palabra escrita en letra grande, que les dice cuál es el", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 300, "y": -775, "text": "mejor regalo que podemos tener en Navidad:", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 100, "y": 20, "text": "Familia", "style": { "size": 250, "color": "red" } } + ] + }, + { + "page_id": 35, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 685, "y": 805 }, + { "type": "photo", "content": "photo_adulto_1", "x": 1285, "y": 815 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1020, "y": 1365 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1575, "y": 1375 }, + { "type": "text", "x": 200, "y": -1045, "text": "La casa de {{child_1}} y {{child_2}} ya no está en silencio. Toda su familia", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "ha venido a celebrar con ellas la Navidad. Ríen, cantan, bailan el burrito", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "sabanero y {{adult_0}} casi se atraganta con un polvorón.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "Todos están convencidos de haber conseguido el regalo más maravilloso", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -685, "text": "del mundo.", "style": { "gravity": "WEST" } } + ] + } + ] + }, + "2_adults_3_children": { + "description": "2 Adultos, 3 Niños/as", + "pages": [ + { + "page_id": 0, + "elements": [ + { "type": "text", "x": 1325, "y": -900, "text": "El Mejor Regalo", "style": { "font": "fancy", "size": 175, "color": "white" } }, + { "type": "text", "x": 1325, "y": -710, "text": "De La Navidad", "style": { "font": "fancy", "size": 175, "color": "white" } }, + { "type": "text", "x": 2845, "y": -1050, "text": "El Mejor Regalo De La Navidad", "style": { "font": "main", "size": 50, "color": "red", "gravity": "EAST", "rotation": -90 } }, + { "type": "photo", "content": "photo_adulto_0", "x": 3810, "y": 1000 }, + { "type": "photo", "content": "photo_adulto_1", "x": 3295, "y": 1000 }, + { "type": "photo", "content": "photo_hijo_1", "x": 4762, "y": 1365 }, + { "type": "photo", "content": "photo_hijo_2", "x": 4335, "y": 1525 }, + { "type": "photo", "content": "photo_hijo_3", "x": 4455, "y": 980 } + ] + }, + { + "page_id": 4, + "elements": [ + { "type": "photo", "content": "photo_dedicatoria", "x": 353, "y": 216 }, + { "type": "text", "x": 120, "y": 350, "text": "{{dedication}}", "style": { "font": "main", "size": 63, "color": "black", "rotation": 9 } } + ] + }, + { + "page_id": 5, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "Es muy temprano y la casa de {{child_1}},", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "{{child_2}} y {{child_3}} está en silencio.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "Aún no se escucha la cucharilla dando vueltas", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "al café de {{adult_0}} ni la tostadora con el pan", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -685, "text": "de {{adult_1}}. Pero {{child_1}}, {{child_2}}", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -595, "text": "y {{child_3}} han oído un ruido en el salón y", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -505, "text": "se levantan a investigar.", "style": { "gravity": "WEST" } }, + { "type": "photo", "content": "photo_hijo_1", "x": 1456, "y": 1150 }, + { "type": "photo", "content": "photo_hijo_2", "x": 595, "y": 1202 }, + { "type": "photo", "content": "photo_hijo_3", "x": 998, "y": 1365 } + ] + }, + { + "page_id": 6, + "elements": [ + { "type": "text", "x": 0, "y": 775, "text": "Al lado del sofá ha crecido un abeto, igualito que un árbol de", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": 0, "y": 865, "text": "Navidad, pero sin adornos. De él cuelga una cuerda con un sobre", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": 0, "y": 955, "text": "que lleva sus nombres escritos con letra grande.", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": 0, "y": 1045, "text": "{{child_1}}, {{child_2}} y {{child_3}} se apresuran a cogerlo.", "style": { "color": "white", "size": 55, "rotation": -5 } }, + { "type": "text", "x": -10, "y": -40, "text": "{{child_1}}", "style": { "color": "black", "size": 55, "rotation": -5 } }, + { "type": "text", "x": -10, "y": -25, "text": "{{child_2}}", "style": { "color": "black", "size": 55, "rotation": -5 } }, + { "type": "text", "x": -10, "y": -10, "text": "{{child_3}}", "style": { "color": "black", "size": 55, "rotation": -5 } } + ] + }, + { + "page_id": 7, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 927, "y": 628 }, + { "type": "photo", "content": "photo_adulto_1", "x": 953, "y": 983 }, + { "type": "text", "x": 200, "y": -1045, "text": "Dentro del sobre hay una carta sin firmar", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "cuyas instrucciones son claras:", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 8, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1075, "y": 1330 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1520, "y": 1340 }, + { "type": "photo", "content": "photo_hijo_3", "x": 785, "y": 1398 }, + { "type": "text", "x": 200, "y": -1045, "text": "“Si quieren recibir el regalo de Navidad más maravilloso del mundo, tendrán que", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "superar una serie de pruebas”. ¡Qué emocionante! ¿Quién mandará esa carta?", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "Algo cae de dentro del sobre y se esparce por el suelo. ¡Es arena!", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "¡Lo han enviado los Reyes Magos! {{child_1}}, {{child_2}} y {{child_3}} no se lo", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -685, "text": "pueden creer, los mismísimos Reyes Magos les han mandado una carta, ¡a ellos!", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 9, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 550, "y": 1192 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1438, "y": 1243 }, + { "type": "photo", "content": "photo_hijo_3", "x": 842, "y": 1200 }, + { "type": "text", "x": 200, "y": -1045, "text": "La primera prueba que deben superar consiste en cocinar las galletas de", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "Navidad más originales.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "¡No hay tiempo que perder! Nunca han cocinado galletas, pero no puede ser", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "tan difícil.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 10, + "elements": [ + { "type": "text", "x": 200, "y": 685, "text": "Seguro que llevan harina, huevos, mantequilla y azúcar, mucho azúcar. Abren el", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 775, "text": "armario de las especias y añaden canela, jengibre, nuez moscada y virutas de", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 865, "text": "chocolate, ¡serán las galletas más deliciosas que han comido jamás! Toda la", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 955, "text": "casa huele a Navidad.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 1045, "text": "Amasan la mezcla y le dan la forma de los miembros de la familia.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 11, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 900, "y": 458 }, + { "type": "photo", "content": "photo_adulto_1", "x": 1550, "y": 462 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1295, "y": 942 }, + { "type": "photo", "content": "photo_hijo_2", "x": 530, "y": 758 }, + { "type": "photo", "content": "photo_hijo_3", "x": 928, "y": 982 }, + { "type": "text", "x": 200, "y": 865, "text": "Las sacan del horno y las prueban aún calientes. Son muy bonitas, pero están", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 955, "text": "durísimas, no se las pueden comer, a no ser que quieran romperse los dientes.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 1045, "text": "¡Qué decepción!", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 12, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "Están pensando en intentarlo de nuevo cuando descubren un nuevo sobre", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "colgado del árbol. En él viene explicada la segunda prueba: deben decorar el", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "árbol de una manera especial.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 15, "y": 60, "text": "{{child_1}}", "style": { "size": 50 } }, + { "type": "text", "x": 17, "y": 90, "text": "{{child_2}}", "style": { "size": 50 } }, + { "type": "text", "x": 17, "y": 110, "text": "{{child_3}}", "style": { "size": 50 } } + ] + }, + { + "page_id": 13, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 450, "y": 828 }, + { "type": "photo", "content": "photo_adulto_1", "x": 1595, "y": 1360 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1025, "y": 1315 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1720, "y": 1442 }, + { "type": "text", "x": 200, "y": -1045, "text": "{{child_1}}, {{child_2}} y {{child_3}}, con ayuda de {{adult_0}} y {{adult_1}}, lo adornan", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "con bolas de colores, guirnaldas de espumillón y una estrella en la punta,", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "como todos los años. ¿Qué pueden hacer para que este año sea especial?", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 14, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "Sobre la mesa están las galletas que acaban de cocinar. ¡Qué buena idea! Así todos", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "formarán parte del árbol.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 15, + "elements": [ + { "type": "text", "x": 50, "y": 181, "text": "Al día siguiente, {{child_1}}, {{child_2}} y {{child_3}} no quitan ojo del árbol", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 50, "y": 204, "text": "esperando el próximo sobre. Pero, esta vez, la siguiente prueba aparece junto a la", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 50, "y": 227, "text": "chimenea. ¿La enviará Papá Noel? La carta dice que deberán montar una banda de", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 50, "y": 250, "text": "villancicos.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": -5, "y": -152, "text": "{{child_1}}", "style": { "size": 35 } }, + { "type": "text", "x": -4, "y": -142, "text": "{{child_2}}", "style": { "size": 35 } }, + { "type": "text", "x": -5, "y": -132, "text": "{{child_3}}", "style": { "size": 35 } } + ] + }, + { + "page_id": 16, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 325, "y": 1015 }, + { "type": "photo", "content": "photo_adulto_1", "x": 660, "y": 1040 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1700, "y": 1320 }, + { "type": "photo", "content": "photo_hijo_2", "x": 2025, "y": 990 }, + { "type": "photo", "content": "photo_hijo_3", "x": 1285, "y": 995 }, + { "type": "text", "x": 200, "y": -1045, "text": "Fabrican unas entradas para {{adult_0}} y {{adult_1}}, y organizan un concierto en el", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "salón. {{child_1}}, {{child_2}} y {{child_3}} tocan la pandereta, Trasto la zambomba", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "y juntos cantan villancicos hasta el anochecer. A todos les parece muy", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "divertido; a los vecinos, no tanto.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 17, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "La cuarta prueba aparece en la caja de los bloques de construcción. Les pide que", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "reúnan aquellos juguetes que ya no utilicen y se los regalen a niños y niñas que", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "tienen menos que ellas.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": -35, "y": -5, "text": "{{child_1}}", "style": { "size": 50 } }, + { "type": "text", "x": -25, "y": 20, "text": "{{child_2}}", "style": { "size": 50 } }, + { "type": "text", "x": -15, "y": 55, "text": "{{child_3}}", "style": { "size": 50 } } + ] + }, + { + "page_id": 18, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 565, "y": 845 }, + { "type": "photo", "content": "photo_hijo_2", "x": 920, "y": 818 }, + { "type": "photo", "content": "photo_hijo_3", "x": 255, "y": 965 }, + { "type": "text", "x": 50, "y": 955, "text": "Esta prueba es muy difícil porque les da mucha pena despedirse de sus posesiones,", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 50, "y": 1045, "text": "pero les ayuda a pensar en lo felices que estarán otros niños jugando con ellas.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 19, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 885, "y": 544 }, + { "type": "photo", "content": "photo_adulto_1", "x": 1255, "y": 515 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1178, "y": 1025 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1435, "y": 1020 }, + { "type": "photo", "content": "photo_hijo_3", "x": 910, "y": 1080 } + ] + }, + { + "page_id": 20, + "elements": [ + { "type": "text", "x": 0, "y": 1045, "text": "La quinta prueba tarda varios días en aparecer...", "style": { "gravity": "CENTER", "color": "white" } } + ] + }, + { + "page_id": 21, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 956, "y": 560 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1356, "y": 560 }, + { "type": "photo", "content": "photo_hijo_3", "x": 1792, "y": 565 }, + { "type": "text", "x": 200, "y": -1045, "text": "La descubre Trasto en su cama junto a un trozo de carbón. Tienen que crear", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "sus propias felicitaciones de Navidad y enviárselas a sus amigos y familiares.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "Se pasan el día rodeados de cartulinas de colores, témperas y purpurina. La", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "purpurina aparece hasta en la sopa de la cena.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 15, "y": 5, "text": "{{child_1}}", "style": { "size": 35 } }, + { "type": "text", "x": 20, "y": 50, "text": "{{child_2}}", "style": { "size": 35 } }, + { "type": "text", "x": 25, "y": 75, "text": "{{child_3}}", "style": { "size": 35 } } + ] + }, + { + "page_id": 23, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1972, "y": 1020 }, + { "type": "photo", "content": "photo_hijo_2", "x": 862, "y": 1150 }, + { "type": "text", "x": -138, "y": 70, "text": "{{child_1}}", "style": { "size": 35 } }, + { "type": "text", "x": -7, "y": 90, "text": "{{child_2}}", "style": { "size": 35 } }, + { "type": "text", "x": 125, "y": 80, "text": "{{child_3}}", "style": { "size": 35 } } + ] + }, + { + "page_id": 24, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 1135, "y": 740 }, + { "type": "photo", "content": "photo_hijo_3", "x": 282, "y": 510 }, + { "type": "text", "x": 0, "y": 1045, "text": "Un sexto sobre aparece dentro del congelador.", "style": { "gravity": "CENTER", "color": "white" } } + ] + }, + { + "page_id": 25, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 315, "y": 522 }, + { "type": "photo", "content": "photo_adulto_1", "x": 1505, "y": 570 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1110, "y": 905 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1925, "y": 975 }, + { "type": "photo", "content": "photo_hijo_3", "x": 565, "y": 895 }, + { "type": "text", "x": 200, "y": 865, "text": "Toda la familia debe salir a buscar dos adornos de Navidad, el más grande y", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 955, "text": "el más pequeño que puedan encontrar. Sin duda el mejor lugar para conseguir", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 1045, "text": "adornos es el mercadillo de la ciudad.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 26, + "elements": [ + { "type": "text", "x": 200, "y": -1045, "text": "El camino está deslumbrante. Cascadas de luces adornan las calles y estrellas de", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "colores cubren el cielo como si fuera el firmamento. Pasan junto a un Belén en el", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "que las figuras se mueven y el río tiene agua de verdad, ¿habrá peces bebiendo?", "style": { "gravity": "WEST" } }, + { "type": "photo", "content": "photo_hijo_2", "x": 1025, "y": 745 }, + { "type": "photo", "content": "photo_hijo_3", "x": 790, "y": 770 } + ] + }, + { + "page_id": 27, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 758, "y": 570 }, + { "type": "photo", "content": "photo_hijo_3", "x": 1720, "y": 1035 }, + { "type": "text", "x": 750, "y": -1045, "text": "En el mercadillo compran bastoncillos de caramelo, mazapanes", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 750, "y": -955, "text": "y un gorro gigante. ¿Será lo bastante grande?", "style": { "gravity": "WEST", "color": "white" } } + ] + }, + { + "page_id": 28, + "elements": [ + { "type": "photo", "content": "photo_adulto_1", "x": 1490, "y": 645 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1030, "y": 950 }, + { "type": "text", "x": 200, "y": -1045, "text": "{{adult_1}} ha encontrado una estrella de madera muy", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 200, "y": -955, "text": "pequeña, pero {{child_1}}, {{child_2}} y {{child_3}}", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 200, "y": -865, "text": "no están muy seguras de haber superado la prueba.", "style": { "gravity": "WEST", "color": "white" } } + ] + }, + { + "page_id": 29, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 272, "y": 515 }, + { "type": "photo", "content": "photo_adulto_1", "x": 1710, "y": 475 }, + { "type": "photo", "content": "photo_hijo_1", "x": 655, "y": 288 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1435, "y": 945 }, + { "type": "photo", "content": "photo_hijo_3", "x": 1825, "y": 965 }, + { "type": "text", "x": 200, "y": 775, "text": "De camino a casa empieza a nevar y las calles se cubren de un manto blanco.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 865, "text": "Toda la familia comienza a hacer un muñeco de nieve. Los mazapanes sirven de", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 955, "text": "ojos y un bastoncillo de nariz. Le colocan el gorro sobre la cabeza. Cuando se", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": 1045, "text": "quieren dar cuenta, han hecho un muñeco de nieve más grande que {{adult_1}}.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 30, + "elements": [ + { "type": "text", "x": 650, "y": -1045, "text": "Un copo de nieve diminuto cae sobre el pelo rojo de Trasto", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 650, "y": -955, "text": "y, sorprendentemente, no se derrite. ¡Parece magia!", "style": { "gravity": "WEST", "color": "white" } }, + { "type": "text", "x": 650, "y": -865, "text": "¡Ahora sí que lo han conseguido!", "style": { "gravity": "WEST", "color": "white" } } + ] + }, + { + "page_id": 31, + "elements": [ + { "type": "text", "x": 450, "y": -1045, "text": "Ha llegado el gran día. Es muy temprano y,", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -955, "text": "antes de que se despierten {{adult_0}} y", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -865, "text": "{{adult_1}}, {{child_1}}, {{child_2}} y {{child_3}}", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -775, "text": "corren ilusionadas a abrir los regalos", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -685, "text": "que están debajo del árbol. ¿Cuál será", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 450, "y": -595, "text": "el más maravilloso del mundo?", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 32, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1115, "y": 1075 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1825, "y": 925 }, + { "type": "photo", "content": "photo_hijo_3", "x": 655, "y": 1185 }, + { "type": "text", "x": 200, "y": -1045, "text": "Allí están un juego de mesa, muchos libros, un", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "oso de peluche gigante y un patinete. Al fondo,", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "envuelta en papel rojo con un lazo dorado, hay", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "una caja muy muy pequeña. Tan pequeña que", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -685, "text": "{{child_1}}, {{child_2}} y {{child_3}} no", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -595, "text": "creen que ahí dentro pueda haber ningún", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -505, "text": "regalo especial.", "style": { "gravity": "WEST" } } + ] + }, + { + "page_id": 33, + "elements": [ + { "type": "photo", "content": "photo_hijo_1", "x": 1050, "y": 1310 }, + { "type": "photo", "content": "photo_hijo_2", "x": 715, "y": 1425 }, + { "type": "photo", "content": "photo_hijo_3", "x": 1580, "y": 1410 } + ] + }, + { + "page_id": 34, + "elements": [ + { "type": "text", "x": 300, "y": -1045, "text": "La abren desconfiadas y dentro descubren un sobre. Un sobre igual al que han", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 300, "y": -955, "text": "recibido todos los días anteriores. En él hay una carta sin firmar cuyo mensaje", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 300, "y": -865, "text": "es muy claro, una sola palabra escrita en letra grande, que les dice cuál es el", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 300, "y": -775, "text": "mejor regalo que podemos tener en Navidad:", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 100, "y": 20, "text": "Familia", "style": { "size": 250, "color": "red" } } + ] + }, + { + "page_id": 35, + "elements": [ + { "type": "photo", "content": "photo_adulto_0", "x": 685, "y": 805 }, + { "type": "photo", "content": "photo_adulto_1", "x": 1285, "y": 815 }, + { "type": "photo", "content": "photo_hijo_1", "x": 1020, "y": 1365 }, + { "type": "photo", "content": "photo_hijo_2", "x": 1575, "y": 1375 }, + { "type": "photo", "content": "photo_hijo_3", "x": 1885, "y": 1375 }, + { "type": "text", "x": 200, "y": -1045, "text": "La casa de {{child_1}}, {{child_2}} y {{child_3}} ya no está en silencio.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -955, "text": "Toda su familia ha venido a celebrar con ellas la Navidad. Ríen, cantan,", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -865, "text": "bailan el burrito sabanero y {{adult_0}} casi se atraganta con un polvorón.", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -775, "text": "Todos están convencidos de haber conseguido el regalo más maravilloso", "style": { "gravity": "WEST" } }, + { "type": "text", "x": 200, "y": -685, "text": "del mundo.", "style": { "gravity": "WEST" } } + ] + } + ] + } + } +} \ No newline at end of file diff --git a/src/books/3/config/function.txt b/src/books/3/config/function.txt new file mode 100644 index 0000000..a888a3b --- /dev/null +++ b/src/books/3/config/function.txt @@ -0,0 +1,4188 @@ +function admin_book_8_generate_pdf ( $id_book_customized ) +{ + + $this->autoRender = false; + + # obtenemos los datos del cuento a través de su id de la tabla books. + if ( $book = $this->Book->findById( $id_book_customized ) ) { + + # iniciamos la medición del tiempo de procesamiento de creación del cuento + $timeOutput = new OutputTime(); + + # damos formato al texto de la dedicatoria + $book['Book']['dedication'] = wordwrap( $book['Book']['dedication'], 30, "\n" ); + + # creamos el código qr para incluirlo en la portada y en las páginas interiores + //$url_qr_image = $this->_qr_generator( $book['Book']['ref_order'] . '-' . $book['Book']['order_pdf_to_printing'], $this->params['id_book'], $book['Book']['id_cart'], $id_book_customized ); + //$frameQrImage = new Imagick( $url_qr_image ); + + # cargamos las fotos de adultos, hijos y dedicatoria. + # definimos la variables para saber si en los textos en plural tenemos que hablar en masculino o femenimo + $txt_femenino = true; + + # mejora para cuando solo haya un adulto poner bien los keys de los hijos + if ( $book['Book']['num_adultos'] == 1 ) { + + if ( array_key_exists( 3, $book['BookData'] ) ) { + + $book['BookData'][4] = $book['BookData'][3]; + unset( $book['BookData'][3] ); + + } + + if ( array_key_exists( 2, $book['BookData'] ) ) { + + $book['BookData'][3] = $book['BookData'][2]; + unset( $book['BookData'][2] ); + + } + + if ( array_key_exists( 1, $book['BookData'] ) ) { + + $book['BookData'][2] = $book['BookData'][1]; + unset( $book['BookData'][1] ); + + } + + ksort( $book['BookData'] ); + + + } + + foreach ( $book['BookData'] as $order_prota => $prota ) { + + if ( $book['Book']['num_adultos'] == 2 ) { + + if ( in_array( $order_prota, array( 0, 1 ) ) ) { // adulto 1 o 2 + + ${ 'user_image_adulto_' . $order_prota } = new Imagick( WWW_ROOT . 'files'. DS . 'cuentos' . DS . 'user-photo' . DS . $prota['foto_prota_cropped'] ); + + } else { + + if ( $prota['genero_prota'] == 2 ) $txt_femenino = false; + + ${ 'user_image_hijo_' . $order_prota } = new Imagick( WWW_ROOT . 'files'. DS . 'cuentos' . DS . 'user-photo' . DS . $prota['foto_prota_cropped'] ); + ${ 'user_image_hijo_' . $order_prota }->scaleImage( 292, 336 ); + + } + + } else { + + if ( in_array( $order_prota, array( 0 ) ) ) { // adulto 1 + + ${ 'user_image_adulto_' . $order_prota } = new Imagick( WWW_ROOT . 'files'. DS . 'cuentos' . DS . 'user-photo' . DS . $prota['foto_prota_cropped'] ); + + } else { + + if ( $prota['genero_prota'] == 2 ) $txt_femenino = false; + + ${ 'user_image_hijo_' . $order_prota } = new Imagick( WWW_ROOT . 'files'. DS . 'cuentos' . DS . 'user-photo' . DS . $prota['foto_prota_cropped'] ); + ${ 'user_image_hijo_' . $order_prota }->scaleImage( 292, 336 ); + + } + + } + + } + + if ( isset( $book['Book']['foto_dedicatoria_cropped'] ) && !empty( $book['Book']['foto_dedicatoria_cropped'] ) ) { + + $user_image_dedicatoria = new Imagick( WWW_ROOT . 'files'. DS . 'cuentos' . DS . 'user-photo' . DS . $book['Book']['foto_dedicatoria_cropped'] ); + + } + # fin cargamos las fotos del padre, dedicatoria e hijos. + + # definimos el directorio donde tenemos las láminas del cuento + $url_laminas = APP . 'Files' . DS . $book['Book']['id_book'] . DS . 'paginas' . DS . $book['Book']['num_adultos'] . '_adultos_' . $book['Book']['num_hijos'] . '_hijos' . DS . '300dpi'; + + # cargamos la imagen de cada lámina + for ( $i = 4; $i <= 35 ; $i++ ) { + + if ( $i == 4 ) { + + if ( !empty( $book['Book']['foto_dedicatoria_cropped'] ) ) { + + ${ 'frameBase' . $i } = new Imagick( $url_laminas . DS . $i . '_1.png' ); + + } else { + + ${ 'frameBase' . $i } = new Imagick( $url_laminas . DS . $i . '_2.png' ); + + } + + } else { + + ${ 'frameBase' . $i } = new Imagick( $url_laminas . DS . $i . '.png' ); + + } + + if ( IS_PRODUCTION ) { + + ${ 'frameBase' . $i }->setRegistry( 'temporary-path', '/home/trastobooks/tmpbig' ); + + } + + } + + # array de fotos + $aFotos = array( + + 4 => array( + 1 => array( + 'photo_dedicatoria' => array( 'x' => 353, 'y' => 216 ) + ) + ), + + 5 => array( + 1 => array( + 'photo_hijo_2' => array( 'x' => 1456, 'y' => 1150 ) + ), + 2 => array( + 'photo_hijo_3' => array( 'x' => 595, 'y' => 1202 ) + ), + 3 => array( + 'photo_hijo_4' => array( 'x' => 998, 'y' => 1365 ) + ) + ), + + 6 => array( array() ), + + 7 => array( + 1 => array( + 'photo_adulto_0' => array( 'x' => 927, 'y' => 628 ) + ), + 2 => array( + 'photo_adulto_1' => array( 'x' => 953, 'y' => 983 ) + ) + ), + + 8 => array( + 1 => array( + 'photo_hijo_2' => array( 'x' => 1075, 'y' => 1330 ) + ), + 2 => array( + 'photo_hijo_3' => array( 'x' => 1520, 'y' => 1340 ) + ), + 3 => array( + 'photo_hijo_4' => array( 'x' => 785, 'y' => 1398 ) + ) + ), + + 9 => array( + 1 => array( + 'photo_hijo_2' => array( 'x' => 550, 'y' => 1192 ) + ), + 2 => array( + 'photo_hijo_3' => array( 'x' => 1438, 'y' => 1243 ) + ), + 3 => array( + 'photo_hijo_4' => array( 'x' => 842, 'y' => 1200 ) + ) + ), + + 10 => array( array() ), + + 11 => array( + 1 => array( + 'photo_adulto_0' => array( 'x' => 900, 'y' => 458 ) + ), + 2 => array( + 'photo_adulto_1' => array( 'x' => 1550, 'y' => 462 ) + ), + 3 => array( + 'photo_hijo_2' => array( 'x' => 1295, 'y' => 942 ) + ), + 4 => array( + 'photo_hijo_3' => array( 'x' => 530, 'y' => 758 ) + ), + 5 => array( + 'photo_hijo_4' => array( 'x' => 928, 'y' => 982 ) + ) + ), + + 12 => array( array() ), + + 13 => array( + 1 => array( + 'photo_adulto_0' => array( 'x' => 450, 'y' => 828 ) + ), + 2 => array( + 'photo_hijo_2' => array( 'x' => 1025, 'y' => 1315 ) + ), + 3 => array( + 'photo_hijo_3' => array( 'x' => 1720, 'y' => 1442 ) + ) + ), + + 14 => array( + 1 => array( + 'photo_adulto_1' => array( 'x' => 1595, 'y' => 1360 ) + ), + 2 => array( + 'photo_hijo_4' => array( 'x' => 985, 'y' => 1350 ) + ) + ), + + 15 => array( array() ), + + 16 => array( + 1 => array( + 'photo_adulto_0' => array( 'x' => 325, 'y' => 1015 ) + ), + 2 => array( + 'photo_adulto_1' => array( 'x' => 660, 'y' => 1040 ) + ), + 3 => array( + 'photo_hijo_2' => array( 'x' => 1700, 'y' => 1320 ) + ), + 4 => array( + 'photo_hijo_3' => array( 'x' => 2025, 'y' => 990 ) + ), + 5 => array( + 'photo_hijo_4' => array( 'x' => 1285, 'y' => 995 ) + ) + ), + + 17 => array( array() ), + + 18 => array( + 1 => array( + 'photo_hijo_2' => array( 'x' => 565, 'y' => 845 ) + ), + 2 => array( + 'photo_hijo_3' => array( 'x' => 920, 'y' => 818 ) + ), + 3 => array( + 'photo_hijo_4' => array( 'x' => 255, 'y' => 965 ) + ) + ), + + 19 => array( + 1 => array( + 'photo_adulto_0' => array( 'x' => 885, 'y' => 544 ) + ), + 2 => array( + 'photo_adulto_1' => array( 'x' => 1255, 'y' => 515 ) + ), + 3 => array( + 'photo_hijo_2' => array( 'x' => 1178, 'y' => 1025 ) + ), + 4 => array( + 'photo_hijo_3' => array( 'x' => 1435, 'y' => 1020 ) + ), + 5 => array( + 'photo_hijo_4' => array( 'x' => 910, 'y' => 1080 ) + ) + ), + + 20 => array( array() ), + + 21 => array( array() ), + + 22 => array( + 1 => array( + 'photo_adulto_0' => array( 'x' => 785, 'y' => 630 ) + ), + 2 => array( + 'photo_adulto_1' => array( 'x' => 1515, 'y' => 782 ) + ), + 3 => array( + 'photo_hijo_2' => array( 'x' => 1100, 'y' => 1088 ) + ), + 4 => array( + 'photo_hijo_3' => array( 'x' => 1722, 'y' => 1200 ) + ), + 5 => array( + 'photo_hijo_4' => array( 'x' => 325, 'y' => 1175 ) + ) + ), + + 23 => array( array() ), + + 24 => array( array() ), + + 25 => array( + 1 => array( + 'photo_adulto_0' => array( 'x' => 315, 'y' => 522 ) + ), + 2 => array( + 'photo_adulto_1' => array( 'x' => 1505, 'y' => 570 ) + ), + 3 => array( + 'photo_hijo_2' => array( 'x' => 1110, 'y' => 905 ) + ), + 4 => array( + 'photo_hijo_3' => array( 'x' => 1925, 'y' => 975 ) + ), + 5 => array( + 'photo_hijo_4' => array( 'x' => 565, 'y' => 895 ) + ) + ), + + 26 => array( array() ), + + 27 => array( + 1 => array( + 'photo_adulto_0' => array( 'x' => 758, 'y' => 570 ) + ), + 2 => array( + 'photo_hijo_3' => array( 'x' => 1720, 'y' => 1035 ) + ) + ), + + 28 => array( + 1 => array( + 'photo_adulto_1' => array( 'x' => 1490, 'y' => 645 ) + ), + 2 => array( + 'photo_hijo_2' => array( 'x' => 1030, 'y' => 950 ) + ), + 3 => array( + 'photo_hijo_4' => array( 'x' => 600, 'y' => 1030 ) + ) + ), + + 29 => array( + 1 => array( + 'photo_adulto_0' => array( 'x' => 272, 'y' => 515 ) + ), + 2 => array( + 'photo_adulto_1' => array( 'x' => 1710, 'y' => 475 ) + ), + 3 => array( + 'photo_hijo_2' => array( 'x' => 655, 'y' => 288 ) + ), + 4 => array( + 'photo_hijo_3' => array( 'x' => 1435, 'y' => 945 ) + ), + 5 => array( + 'photo_hijo_4' => array( 'x' => 1825, 'y' => 965 ) + ) + ), + + 30 => array( array() ), + + 31 => array( array() ), + + 32 => array( + 1 => array( + 'photo_hijo_2' => array( 'x' => 1115, 'y' => 1075 ) + ), + 2 => array( + 'photo_hijo_3' => array( 'x' => 1825, 'y' => 925 ) + ), + 3 => array( + 'photo_hijo_4' => array( 'x' => 655, 'y' => 1185 ) + ) + ), + + 33 => array( + 1 => array( + 'photo_hijo_2' => array( 'x' => 1050, 'y' => 1310 ) + ), + 2 => array( + 'photo_hijo_3' => array( 'x' => 715, 'y' => 1425 ) + ), + 3 => array( + 'photo_hijo_4' => array( 'x' => 1580, 'y' => 1410 ) + ) + ), + + 34 => array( array() ), + + 35 => array( + 1 => array( + 'photo_adulto_0' => array( 'x' => 685, 'y' => 805 ) + ), + 2 => array( + 'photo_adulto_1' => array( 'x' => 1285, 'y' => 815 ) + ), + 3 => array( + 'photo_hijo_2' => array( 'x' => 1020, 'y' => 1365 ) + ), + 4 => array( + 'photo_hijo_3' => array( 'x' => 1575, 'y' => 1375 ) + ), + 5 => array( + 'photo_hijo_4' => array( 'x' => 1885, 'y' => 1375 ) + ) + ) + + ); + + # obtenemos los datos del family_relationship + if ( isset( $book['BookData'][0]['family_relationship_id'] ) ) $aDataFamilyRelationshipAdulto0 = $this->FamilyRelationshipsBook8->findById( $book['BookData'][0]['family_relationship_id'] ); + if ( isset( $book['BookData'][1]['family_relationship_id'] ) ) $aDataFamilyRelationshipAdulto1 = $this->FamilyRelationshipsBook8->findById( $book['BookData'][1]['family_relationship_id'] ); + + # array de texto para todas las combinaciones posibles de adultos + niños (1-1, 1-2, 1-3, 2-1, 2-2 y 2-3) + if ( $book['Book']['num_adultos'] == 1 && $book['Book']['num_hijos'] == 1 ) { + + $aTextosTmp = array( + + 4 => array( + 2 => array( + 'txt' => $book['Book']['dedication'], + 'coordenadas' => array( 'x' => 120, 'y' => 350 ) + ) + ), + + 5 => array( + 4 => array( + 'txt' => 'Es muy temprano y la casa de ' . $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'está en silencio. Aún no se escucha la', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'cucharilla dando vueltas al café ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=5].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . '.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => 'Pero ' . $book['BookData'][2]['nombre_prota'] . ' ha oído un ruido en el', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 8 => array( + 'txt' => 'salón y se levanta a investigar.', + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ) + ), + + 6 => array( + 1 => array( + 'txt' => 'Al lado del sofá ha crecido un abeto, igualito que un árbol de', + 'coordenadas' => array( 'x' => 0, 'y' => 775 ) + ), + 2 => array( + 'txt' => 'Navidad, pero sin adornos. De él cuelga una cuerda con un sobre', + 'coordenadas' => array( 'x' => 0, 'y' => 865 ) + ), + 3 => array( + 'txt' => 'que lleva su nombre escrito con letra grande.', + 'coordenadas' => array( 'x' => 0, 'y' => 955 ) + ), + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'] . ' se apresura a cogerlo.', + 'coordenadas' => array( 'x' => 0, 'y' => 1045 ) + ), + 5 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -50, 'y' => -105 ) + ) + ), + + 7 => array( + 3 => array( + 'txt' => 'Dentro del sobre hay una carta sin firmar', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 4 => array( + 'txt' => 'cuyas instrucciones son claras:', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ) + ), + + 8 => array( + 4 => array( + 'txt' => '“Si quieres recibir el regalo de Navidad más maravilloso del mundo, tendrás que', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'superar una serie de pruebas”. ¡Qué emocionante! ¿Quién mandará esa carta?', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'Algo cae de dentro del sobre y se esparce por el suelo. ¡Es arena!', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => '¡Lo han enviado los Reyes Magos! ' . $book['BookData'][2]['nombre_prota'] . ' no se lo puede creer,', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 8 => array( + 'txt' => 'los mismísimos Reyes Magos le han mandado una carta, ¡a ' . ( $book['BookData'][2]['genero_prota'] == 1 ? 'ella' : 'él' ) . '!', + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ) + ), + + 9 => array( + 4 => array( + 'txt' => 'La primera prueba que debe superar consiste en cocinar las galletas de', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'Navidad más originales.', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => '¡No hay tiempo que perder! Nunca ha cocinado galletas, pero no puede ser', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => 'tan difícil.', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ) + ), + + 10 => array( + 1 => array( + 'txt' => 'Seguro que llevan harina, huevos, mantequilla y azúcar, mucho azúcar. Abre el', + 'coordenadas' => array( 'x' => 200, 'y' => 685 ) + ), + 2 => array( + 'txt' => 'armario de las especias y añade canela, jengibre, nuez moscada y virutas de', + 'coordenadas' => array( 'x' => 200, 'y' => 775 ) + ), + 3 => array( + 'txt' => 'chocolate, ¡serán las galletas más deliciosas que ha comido jamás! Toda la', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 4 => array( + 'txt' => 'casa huele a Navidad.', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 5 => array( + 'txt' => 'Amasa la mezcla y le da la forma de los miembros de la familia.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 11 => array( + 6 => array( + 'txt' => 'Las saca del horno y las prueba aún calientes. Son muy bonitas, pero están', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 7 => array( + 'txt' => 'durísimas, no se las puede comer, a no ser que quiera romperse los dientes.', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 8 => array( + 'txt' => '¡Qué decepción!', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 12 => array( + 1 => array( + 'txt' => 'Está pensando en intentarlo de nuevo cuando descubre un nuevo sobre', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'colgado del árbol. En él viene explicada la segunda prueba: debe decorar el', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'árbol de una manera especial.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => 65, 'y' => 350 ) + ) + ), + + 13 => array( + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'] . ', con ayuda ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=13].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ', lo adorna con bolas de colores,', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'guirnaldas de espumillón y una estrella en la punta, como todos los años.', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => '¿Qué puede hacer para que este año sea especial?', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ) + ), + + 14 => array( + 3 => array( + 'txt' => 'Sobre la mesa están las galletas que acaba de cocinar. ¡Qué buena idea! Así todos', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 4 => array( + 'txt' => 'formarán parte del árbol.', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ) + ), + + 15 => array( + 1 => array( + 'txt' => 'Al día siguiente, ' . $book['BookData'][2]['nombre_prota'] . ' no quita ojo del árbol esperando el próximo', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 2 => array( + 'txt' => 'sobre. Pero, esta vez, la siguiente prueba aparece junto a la chimenea. ¿La enviará', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 3 => array( + 'txt' => 'Papá Noel? La carta dice que deberá montar una banda de villancicos.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ), + 5 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -20, 'y' => -600 ) + ) + ), + + 16 => array( + 6 => array( + 'txt' => 'Fabrica unas entradas para ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=16].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ', y organiza un concierto en el', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 7 => array( + 'txt' => 'salón. ' . $book['BookData'][2]['nombre_prota'] . ' toca la pandereta, Trasto la zambomba', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 8 => array( + 'txt' => 'y juntos cantan villancicos hasta el anochecer. A todos les parece muy', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 9 => array( + 'txt' => 'divertido; a los vecinos, no tanto.', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ) + ), + + 17 => array( + 1 => array( + 'txt' => 'La cuarta prueba aparece en la caja de los bloques de construcción. Le pide que', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'reúna aquellos juguetes que ya no utilice y se los regale a niños y niñas que', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'tienen menos que ' . ( $book['BookData'][2]['genero_prota'] == 1 ? 'ella' : 'él' ) . '.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -100, 'y' => 70 ) + ) + ), + + 18 => array( + 4 => array( + 'txt' => 'Esta prueba es muy difícil porque le da mucha pena despedirse de sus posesiones,', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 5 => array( + 'txt' => 'pero le ayuda a pensar en lo felices que estarán otros niños jugando con ellas.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 20 => array( + 1 => array( + 'txt' => 'La quinta prueba tarda varios días en aparecer...', + 'coordenadas' => array( 'x' => 0, 'y' => 1045 ) + ) + ), + + 21 => array( + 1 => array( + 'txt' => 'La descubre Trasto en su cama junto a un trozo de carbón. Tiene que crear', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'su propia felicitación de Navidad y enviársela a sus amigos y familiares.', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'Se pasa el día rodeado de cartulinas de colores, témperas y purpurina. La', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 4 => array( + 'txt' => 'purpurina aparece hasta en la sopa de la cena.', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 5 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => 60, 'y' => 140 ) + ) + ), + + 23 => array( + 1 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -28, 'y' => 380 ) + ) + ), + + 24 => array( + 1 => array( + 'txt' => 'Un sexto sobre aparece dentro del congelador.', + 'coordenadas' => array( 'x' => 0, 'y' => 1045 ) + ) + ), + + 25 => array( + 6 => array( + 'txt' => 'Toda la familia debe salir a buscar dos adornos de Navidad, el más grande y', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 7 => array( + 'txt' => 'el más pequeño que puedan encontrar. Sin duda el mejor lugar para conseguir', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 8 => array( + 'txt' => 'adornos es el mercadillo de la ciudad.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 26 => array( + 1 => array( + 'txt' => 'El camino está deslumbrante. Cascadas de luces adornan las calles y estrellas de', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'colores cubren el cielo como si fuera el firmamento. Pasan junto a un Belén en el', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'que las figuras se mueven y el río tiene agua de verdad, ¿habrá peces bebiendo?', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ) + ), + + 27 => array( + 3 => array( + 'txt' => 'En el mercadillo compran bastoncillos de caramelo, mazapanes', + 'coordenadas' => array( 'x' => 750, 'y' => -1045 ) + ), + 4 => array( + 'txt' => 'y un gorro gigante. ¿Será lo bastante grande?', + 'coordenadas' => array( 'x' => 750, 'y' => -955 ) + ) + ), + + 28 => array( + 4 => array( + 'txt' => ucfirst( Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=28].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] ) . ' ha encontrado una estrella de madera', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'muy pequeña, pero ' . $book['BookData'][2]['nombre_prota'] . ' no está muy ' . ( $book['BookData'][2]['genero_prota'] == 1 ? 'segura' : 'seguro' ), + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'de haber superado la prueba.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ) + ), + + 29 => array( + 6 => array( + 'txt' => 'De camino a casa empieza a nevar y las calles se cubren de un manto blanco.', + 'coordenadas' => array( 'x' => 200, 'y' => 775 ) + ), + 7 => array( + 'txt' => 'Toda la familia comienza a hacer un muñeco de nieve. Los mazapanes sirven de', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 8 => array( + 'txt' => 'ojos y un bastoncillo de nariz. Le colocan el gorro sobre la cabeza. Cuando se', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 9 => array( + 'txt' => 'quieren dar cuenta, han hecho un muñeco de nieve más grande que ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=29].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . '.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 30 => array( + 1 => array( + 'txt' => 'Un copo de nieve diminuto cae sobre el pelo rojo de Trasto', + 'coordenadas' => array( 'x' => 650, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'y, sorprendentemente, no se derrite. ¡Parece magia!', + 'coordenadas' => array( 'x' => 650, 'y' => -955 ) + ), + 3 => array( + 'txt' => '¡Ahora sí que lo han conseguido!', + 'coordenadas' => array( 'x' => 650, 'y' => -865 ) + ) + ), + + 31 => array( + 1 => array( + 'txt' => 'Ha llegado el gran día. Es muy temprano y,', + 'coordenadas' => array( 'x' => 450, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'antes de que se despierte ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=31].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ',', + 'coordenadas' => array( 'x' => 450, 'y' => -955 ) + ), + 3 => array( + 'txt' => $book['BookData'][2]['nombre_prota'] . ' corre ' . ( $book['BookData'][2]['genero_prota'] == 1 ? 'ilusionada' : 'ilusionado' ) . ' a abrir', + 'coordenadas' => array( 'x' => 450, 'y' => -865 ) + ), + 4 => array( + 'txt' => 'los regalos que están debajo del árbol.', + 'coordenadas' => array( 'x' => 450, 'y' => -775 ) + ), + 5 => array( + 'txt' => '¿Cuál será el más maravilloso del mundo?', + 'coordenadas' => array( 'x' => 450, 'y' => -685 ) + ) + ), + + 32 => array( + 4 => array( + 'txt' => 'Allí están un juego de mesa, muchos libros,', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'un oso de peluche gigante y un patinete. Al', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'fondo, envuelta en papel rojo con un lazo', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => 'dorado, hay una caja muy muy pequeña. Tan', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 8 => array( + 'txt' => 'pequeña que ' . $book['BookData'][2]['nombre_prota'] . ' no cree que ahí', + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ), + 9 => array( + 'txt' => 'dentro pueda haber ningún regalo especial.', + 'coordenadas' => array( 'x' => 200, 'y' => -595 ) + ) + ), + + 34 => array( + 1 => array( + 'txt' => 'La abre ' . ( $book['BookData'][2]['genero_prota'] == 1 ? 'desconfiada' : 'desconfiado' ) . ' y dentro descubre un sobre. Un sobre igual al que ha', + 'coordenadas' => array( 'x' => 300, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'recibido todos los días anteriores. En él hay una carta sin firmar cuyo mensaje', + 'coordenadas' => array( 'x' => 300, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'es muy claro, una sola palabra escrita en letra grande, que le dice cuál es el', + 'coordenadas' => array( 'x' => 300, 'y' => -865 ) + ), + 4 => array( + 'txt' => 'mejor regalo que podemos tener en Navidad:', + 'coordenadas' => array( 'x' => 300, 'y' => -775 ) + ), + 5 => array( + 'txt' => 'Familia', + 'coordenadas' => array( 'x' => 100, 'y' => 20 ) + ) + ), + + 35 => array( + 6 => array( + 'txt' => 'La casa de ' . $book['BookData'][2]['nombre_prota'] . ' ya no está en silencio. Toda su familia', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 7 => array( + 'txt' => 'ha venido a celebrar con ' . ( $book['BookData'][2]['genero_prota'] == 1 ? 'ella' : 'él' ) . ' la Navidad. Ríen, cantan, bailan el burrito', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 8 => array( + 'txt' => 'sabanero y ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=35].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ' casi se atraganta con un polvorón.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 9 => array( + 'txt' => 'Todos están convencidos de haber conseguido el regalo más maravilloso', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 10 => array( + 'txt' => 'del mundo.', + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ) + ) + + ); + + } else if ( $book['Book']['num_adultos'] == 1 && $book['Book']['num_hijos'] == 2 ) { + + $aTextosTmp = array( + + 4 => array( + 2 => array( + 'txt' => $book['Book']['dedication'], + 'coordenadas' => array( 'x' => 120, 'y' => 350 ) + ) + ), + + 5 => array( + 4 => array( + 'txt' => 'Es muy temprano y la casa de ' . $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'y ' . $book['BookData'][3]['nombre_prota'] . ' está en silencio.', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'Aún no se escucha la cucharilla dando vueltas', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => 'al café ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=5].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . '. Pero ' . $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 8 => array( + 'txt' => 'y ' . $book['BookData'][3]['nombre_prota'] . ' han oído un ruido en el', + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ), + 9 => array( + 'txt' => 'salón y se levantan a investigar.', + 'coordenadas' => array( 'x' => 200, 'y' => -595 ) + ) + ), + + 6 => array( + 1 => array( + 'txt' => 'Al lado del sofá ha crecido un abeto, igualito que un árbol de', + 'coordenadas' => array( 'x' => 0, 'y' => 775 ) + ), + 2 => array( + 'txt' => 'Navidad, pero sin adornos. De él cuelga una cuerda con un sobre', + 'coordenadas' => array( 'x' => 0, 'y' => 865 ) + ), + 3 => array( + 'txt' => 'que lleva sus nombres escritos con letra grande.', + 'coordenadas' => array( 'x' => 0, 'y' => 955 ) + ), + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'] . ' y ' . $book['BookData'][3]['nombre_prota'] . ' se apresuran a cogerlo.', + 'coordenadas' => array( 'x' => 0, 'y' => 1045 ) + ), + 5 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -50, 'y' => -140 ) + ), + 6 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => -50, 'y' => -70 ) + ) + ), + + 7 => array( + 3 => array( + 'txt' => 'Dentro del sobre hay una carta sin firmar ', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 4 => array( + 'txt' => 'cuyas instrucciones son claras:', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ) + ), + + 8 => array( + 4 => array( + 'txt' => '“Si quieren recibir el regalo de Navidad más maravilloso del mundo, tendrán que', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'superar una serie de pruebas”. ¡Qué emocionante! ¿Quién mandará esa carta?', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'Algo cae de dentro del sobre y se esparce por el suelo. ¡Es arena!', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => '¡Lo han enviado los Reyes Magos! ' . $book['BookData'][2]['nombre_prota'] . ' y ' . $book['BookData'][3]['nombre_prota'] . ' no se lo', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 8 => array( + 'txt' => 'pueden creer, los mismísimos Reyes Magos les han mandado una carta, ¡a ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 ) ? 'ellas' : 'ellos' ) . '!', + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ) + ), + + 9 => array( + 4 => array( + 'txt' => 'La primera prueba que deben superar consiste en cocinar las galletas de', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'Navidad más originales.', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => '¡No hay tiempo que perder! Nunca han cocinado galletas, pero no puede ser', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => 'tan difícil.', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ) + ), + + 10 => array( + 1 => array( + 'txt' => 'Seguro que llevan harina, huevos, mantequilla y azúcar, mucho azúcar. Abren el', + 'coordenadas' => array( 'x' => 200, 'y' => 685 ) + ), + 2 => array( + 'txt' => 'armario de las especias y añaden canela, jengibre, nuez moscada y virutas de', + 'coordenadas' => array( 'x' => 200, 'y' => 775 ) + ), + 3 => array( + 'txt' => 'chocolate, ¡serán las galletas más deliciosas que han comido jamás! Toda la', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 4 => array( + 'txt' => 'casa huele a Navidad.', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 5 => array( + 'txt' => 'Amasan la mezcla y le dan la forma de los miembros de la familia.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 11 => array( + 6 => array( + 'txt' => 'Las sacan del horno y las prueban aún calientes. Son muy bonitas, pero están', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 7 => array( + 'txt' => 'durísimas, no se las pueden comer, a no ser que quieran romperse los dientes.', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 8 => array( + 'txt' => '¡Qué decepción!', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 12 => array( + 1 => array( + 'txt' => 'Están pensando en intentarlo de nuevo cuando descubren un nuevo sobre', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'colgado del árbol. En él viene explicada la segunda prueba: deben decorar el', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'árbol de una manera especial.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => 60, 'y' => 300 ) + ), + 5 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => 65, 'y' => 400 ) + ) + ), + + 13 => array( + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'] . ' y ' . $book['BookData'][3]['nombre_prota'] . ', con ayuda ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=13].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ', lo adornan con bolas', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'de colores, guirnaldas de espumillón y una estrella en la punta,', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'como todos los años. ¿Qué pueden hacer para que este año sea especial?', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ) + ), + + 14 => array( + 3 => array( + 'txt' => 'Sobre la mesa están las galletas que acaban de cocinar. ¡Qué buena idea! Así todos', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 4 => array( + 'txt' => 'formarán parte del árbol.', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ) + ), + + 15 => array( + 1 => array( + 'txt' => 'Al día siguiente, ' . $book['BookData'][2]['nombre_prota'] . ' y ' . $book['BookData'][3]['nombre_prota'] . ' no quitan ojo del árbol', + 'coordenadas' => array( 'x' => 200, 'y' => 775 ) + ), + 2 => array( + 'txt' => 'esperando el próximo sobre. Pero, esta vez, la siguiente prueba aparece junto a la', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 3 => array( + 'txt' => 'chimenea. ¿La enviará Papá Noel? La carta dice que deberán montar una banda de', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 4 => array( + 'txt' => 'villancicos.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ), + 5 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -20, 'y' => -620 ) + ), + 6 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => -20, 'y' => -580 ) + ) + ), + + 16 => array( + 6 => array( + 'txt' => 'Fabrican unas entradas para ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=16].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ', y organizan un concierto en el ', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 7 => array( + 'txt' => 'salón. ' . $book['BookData'][2]['nombre_prota'] . ' y ' . $book['BookData'][3]['nombre_prota'] . ' tocan la pandereta, Trasto la zambomba', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 8 => array( + 'txt' => 'y juntos cantan villancicos hasta el anochecer. A todos les parece muy', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 9 => array( + 'txt' => 'divertido; a los vecinos, no tanto.', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ) + ), + + 17 => array( + 1 => array( + 'txt' => 'La cuarta prueba aparece en la caja de los bloques de construcción. Les pide que', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'reúnan aquellos juguetes que ya no utilicen y se los regalen a niños y niñas que', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'tienen menos que ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 ) ? 'ellas' : 'ellos' ) . '.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -140, 'y' => 10 ) + ), + 5 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => -100, 'y' => 130 ) + ) + ), + + 18 => array( + 4 => array( + 'txt' => 'Esta prueba es muy difícil porque les da mucha pena despedirse de sus posesiones,', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 5 => array( + 'txt' => 'pero les ayuda a pensar en lo felices que estarán otros niños jugando con ellas.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 20 => array( + 1 => array( + 'txt' => 'La quinta prueba tarda varios días en aparecer...', + 'coordenadas' => array( 'x' => 0, 'y' => 1045 ) + ) + ), + + 21 => array( + 1 => array( + 'txt' => 'La descubre Trasto en su cama junto a un trozo de carbón. Tienen que crear', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'sus propias felicitaciones de Navidad y enviárselas a sus amigos y familiares.', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'Se pasan el día rodeados de cartulinas de colores, témperas y purpurina. La', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 4 => array( + 'txt' => 'purpurina aparece hasta en la sopa de la cena.', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 5 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => 40, 'y' => 15 ) + ), + 6 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => 80, 'y' => 265 ) + ) + ), + + 23 => array( + 1 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -570, 'y' => 290 ) + ), + 2 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => -28, 'y' => 380 ) + ) + ), + + 24 => array( + 1 => array( + 'txt' => 'Un sexto sobre aparece dentro del congelador.', + 'coordenadas' => array( 'x' => 0, 'y' => 1045 ) + ) + ), + + 25 => array( + 6 => array( + 'txt' => 'Toda la familia debe salir a buscar dos adornos de Navidad, el más grande y', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 7 => array( + 'txt' => 'el más pequeño que puedan encontrar. Sin duda el mejor lugar para conseguir', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 8 => array( + 'txt' => 'adornos es el mercadillo de la ciudad.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 26 => array( + 1 => array( + 'txt' => 'El camino está deslumbrante. Cascadas de luces adornan las calles y estrellas de', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'colores cubren el cielo como si fuera el firmamento. Pasan junto a un Belén en el', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'que las figuras se mueven y el río tiene agua de verdad, ¿habrá peces bebiendo?', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ) + ), + + 27 => array( + 3 => array( + 'txt' => 'En el mercadillo compran bastoncillos de caramelo, mazapanes', + 'coordenadas' => array( 'x' => 750, 'y' => -1045 ) + ), + 4 => array( + 'txt' => 'y un gorro gigante. ¿Será lo bastante grande?', + 'coordenadas' => array( 'x' => 750, 'y' => -955 ) + ) + ), + + 28 => array( + 4 => array( + 'txt' => ucfirst( Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=28].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] ) . ' ha encontrado una estrella de madera muy', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'pequeña, pero ' . $book['BookData'][2]['nombre_prota'] . ' y ' . $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'no están muy ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 ) ? 'seguras' : 'seguros' ) . ' de haber superado la prueba.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ) + ), + + 29 => array( + 6 => array( + 'txt' => 'De camino a casa empieza a nevar y las calles se cubren de un manto blanco.', + 'coordenadas' => array( 'x' => 200, 'y' => 775 ) + ), + 7 => array( + 'txt' => 'Toda la familia comienza a hacer un muñeco de nieve. Los mazapanes sirven de', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 8 => array( + 'txt' => 'ojos y un bastoncillo de nariz. Le colocan el gorro sobre la cabeza. Cuando se', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 9 => array( + 'txt' => 'quieren dar cuenta, han hecho un muñeco de nieve más grande que ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=29].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . '.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 30 => array( + 1 => array( + 'txt' => 'Un copo de nieve diminuto cae sobre el pelo rojo de Trasto', + 'coordenadas' => array( 'x' => 650, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'y, sorprendentemente, no se derrite. ¡Parece magia!', + 'coordenadas' => array( 'x' => 650, 'y' => -955 ) + ), + 3 => array( + 'txt' => '¡Ahora sí que lo han conseguido!', + 'coordenadas' => array( 'x' => 650, 'y' => -865 ) + ) + ), + + 31 => array( + 1 => array( + 'txt' => 'Ha llegado el gran día. Es muy temprano y,', + 'coordenadas' => array( 'x' => 450, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'antes de que se despierte ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=31].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ',', + 'coordenadas' => array( 'x' => 450, 'y' => -955 ) + ), + 3 => array( + 'txt' => $book['BookData'][2]['nombre_prota'] . ' y ' . $book['BookData'][3]['nombre_prota'] . ' corren', + 'coordenadas' => array( 'x' => 450, 'y' => -865 ) + ), + 4 => array( + 'txt' => ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 ) ? 'ilusionadas' : 'ilusionados' ) . ' a abrir los regalos que están', + 'coordenadas' => array( 'x' => 450, 'y' => -775 ) + ), + 5 => array( + 'txt' => 'debajo del árbol. ¿Cuál será el más', + 'coordenadas' => array( 'x' => 450, 'y' => -685 ) + ), + 6 => array( + 'txt' => 'maravilloso del mundo?', + 'coordenadas' => array( 'x' => 450, 'y' => -595 ) + ) + ), + + 32 => array( + 4 => array( + 'txt' => 'Allí están un juego de mesa, muchos libros, un', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'oso de peluche gigante y un patinete. Al fondo,', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'envuelta en papel rojo con un lazo dorado, hay', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => 'una caja muy muy pequeña. Tan pequeña que', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 8 => array( + 'txt' => $book['BookData'][2]['nombre_prota'] . ' y ' . $book['BookData'][3]['nombre_prota'] . ' no creen que ahí', + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ), + 9 => array( + 'txt' => 'dentro pueda haber ningún regalo especial.', + 'coordenadas' => array( 'x' => 200, 'y' => -595 ) + ) + ), + + 34 => array( + 1 => array( + 'txt' => 'La abren ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 ) ? 'desconfiadas' : 'desconfiados' ) . ' y dentro descubren un sobre. Un sobre igual al que han', + 'coordenadas' => array( 'x' => 300, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'recibido todos los días anteriores. En él hay una carta sin firmar cuyo mensaje', + 'coordenadas' => array( 'x' => 300, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'es muy claro, una sola palabra escrita en letra grande, que les dice cuál es el', + 'coordenadas' => array( 'x' => 300, 'y' => -865 ) + ), + 4 => array( + 'txt' => 'mejor regalo que podemos tener en Navidad:', + 'coordenadas' => array( 'x' => 300, 'y' => -775 ) + ), + 5 => array( + 'txt' => 'Familia', + 'coordenadas' => array( 'x' => 100, 'y' => 20 ) + ) + ), + + 35 => array( + 6 => array( + 'txt' => 'La casa de ' . $book['BookData'][2]['nombre_prota'] . ' y ' . $book['BookData'][3]['nombre_prota'] . ' ya no está en silencio.', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 7 => array( + 'txt' => 'Toda su familia ha venido a celebrar con ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 && $book['BookData'][4]['genero_prota'] == 1 ) ? 'ellas' : 'ellos' ) . ' la Navidad. Ríen, cantan,', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 8 => array( + 'txt' => 'bailan el burrito sabanero y ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=35].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ' casi se atraganta con un polvorón.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 9 => array( + 'txt' => 'Todos están convencidos de haber conseguido el regalo más maravilloso', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 10 => array( + 'txt' => 'del mundo.', + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ) + ) + + ); + + } else if ( $book['Book']['num_adultos'] == 1 && $book['Book']['num_hijos'] == 3 ) { + + $aTextosTmp = array( + + 4 => array( + 2 => array( + 'txt' => $book['Book']['dedication'], + 'coordenadas' => array( 'x' => 120, 'y' => 350 ) + ) + ), + + 5 => array( + 4 => array( + 'txt' => 'Es muy temprano y la casa de ' . $book['BookData'][2]['nombre_prota'] . ',', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => $book['BookData'][3]['nombre_prota'] . ' y ' . $book['BookData'][4]['nombre_prota'] . ' está en silencio.', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'Aún no se escucha la cucharilla dando vueltas', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => 'al café ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=5].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . '. Pero ' . $book['BookData'][2]['nombre_prota'] . ', ', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 8 => array( + 'txt' => $book['BookData'][3]['nombre_prota'] . ' y ' . $book['BookData'][4]['nombre_prota'] . ' han oído un', + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ), + 9 => array( + 'txt' => 'ruido en el salón y se levantan', + 'coordenadas' => array( 'x' => 200, 'y' => -595 ) + ), + 10 => array( + 'txt' => 'a investigar.', + 'coordenadas' => array( 'x' => 200, 'y' => -505 ) + ) + ), + + 6 => array( + 1 => array( + 'txt' => 'Al lado del sofá ha crecido un abeto, igualito que un árbol de', + 'coordenadas' => array( 'x' => 0, 'y' => 775 ) + ), + 2 => array( + 'txt' => 'Navidad, pero sin adornos. De él cuelga una cuerda con un sobre', + 'coordenadas' => array( 'x' => 0, 'y' => 865 ) + ), + 3 => array( + 'txt' => 'que lleva sus nombres escritos con letra grande.', + 'coordenadas' => array( 'x' => 0, 'y' => 955 ) + ), + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'] . ', ' . $book['BookData'][3]['nombre_prota'] . ' y ' . $book['BookData'][4]['nombre_prota'] . ' se apresuran a cogerlo.', + 'coordenadas' => array( 'x' => 0, 'y' => 1045 ) + ), + 5 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -50, 'y' => -160 ) + ), + 6 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => -50, 'y' => -105 ) + ), + 7 => array( + 'txt' => $book['BookData'][4]['nombre_prota'], + 'coordenadas' => array( 'x' => -50, 'y' => -50 ) + ) + ), + + 7 => array( + 3 => array( + 'txt' => 'Dentro del sobre hay una carta sin firmar ', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 4 => array( + 'txt' => 'cuyas instrucciones son claras:', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ) + ), + + 8 => array( + 4 => array( + 'txt' => '“Si quieren recibir el regalo de Navidad más maravilloso del mundo, tendrán que', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'superar una serie de pruebas”. ¡Qué emocionante! ¿Quién mandará esa carta?', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'Algo cae de dentro del sobre y se esparce por el suelo. ¡Es arena!', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => '¡Lo han enviado los Reyes Magos! ' . $book['BookData'][2]['nombre_prota'] . ', ' . $book['BookData'][3]['nombre_prota'] . ' y ' . $book['BookData'][4]['nombre_prota'] . ' no se lo', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 8 => array( + 'txt' => 'pueden creer, los mismísimos Reyes Magos les han mandado una carta, ¡a ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 && $book['BookData'][4]['genero_prota'] == 1 ) ? 'ellas' : 'ellos' ) . '!', + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ) + ), + + 9 => array( + 4 => array( + 'txt' => 'La primera prueba que deben superar consiste en cocinar las galletas de', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'Navidad más originales.', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => '¡No hay tiempo que perder! Nunca han cocinado galletas, pero no puede ser', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => 'tan difícil.', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ) + ), + + 10 => array( + 1 => array( + 'txt' => 'Seguro que llevan harina, huevos, mantequilla y azúcar, mucho azúcar. Abren el', + 'coordenadas' => array( 'x' => 200, 'y' => 685 ) + ), + 2 => array( + 'txt' => 'armario de las especias y añaden canela, jengibre, nuez moscada y virutas de', + 'coordenadas' => array( 'x' => 200, 'y' => 775 ) + ), + 3 => array( + 'txt' => 'chocolate, ¡serán las galletas más deliciosas que han comido jamás! Toda la', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 4 => array( + 'txt' => 'casa huele a Navidad.', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 5 => array( + 'txt' => 'Amasan la mezcla y le dan la forma de los miembros de la familia.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 11 => array( + 6 => array( + 'txt' => 'Las sacan del horno y las prueban aún calientes. Son muy bonitas, pero están', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 7 => array( + 'txt' => 'durísimas, no se las pueden comer, a no ser que quieran romperse los dientes.', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 8 => array( + 'txt' => '¡Qué decepción!', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 12 => array( + 1 => array( + 'txt' => 'Están pensando en intentarlo de nuevo cuando descubren un nuevo sobre', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'colgado del árbol. En él viene explicada la segunda prueba: deben decorar el', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'árbol de una manera especial.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => 60, 'y' => 250 ) + ), + 5 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => 65, 'y' => 350 ) + ), + 6 => array( + 'txt' => $book['BookData'][4]['nombre_prota'], + 'coordenadas' => array( 'x' => 65, 'y' => 450 ) + ) + ), + + 13 => array( + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'] . ', ' . $book['BookData'][3]['nombre_prota'] . ' y ' . $book['BookData'][4]['nombre_prota'] . ', con ayuda ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=13].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ', lo adornan', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'con bolas de colores, guirnaldas de espumillón y una estrella en la punta,', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'como todos los años. ¿Qué pueden hacer para que este año sea especial?', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ) + ), + + 14 => array( + 3 => array( + 'txt' => 'Sobre la mesa están las galletas que acaban de cocinar. ¡Qué buena idea! Así todos', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 4 => array( + 'txt' => 'formarán parte del árbol.', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ) + ), + + 15 => array( + 1 => array( + 'txt' => 'Al día siguiente, ' . $book['BookData'][2]['nombre_prota'] . ', ' . $book['BookData'][3]['nombre_prota'] . ' y ' . $book['BookData'][4]['nombre_prota'] . ' no quitan ojo del árbol', + 'coordenadas' => array( 'x' => 200, 'y' => 775 ) + ), + 2 => array( + 'txt' => 'esperando el próximo sobre. Pero, esta vez, la siguiente prueba aparece junto a la', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 3 => array( + 'txt' => 'chimenea. ¿La enviará Papá Noel? La carta dice que deberán montar una banda de', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 4 => array( + 'txt' => 'villancicos.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ), + 5 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -20, 'y' => -640 ) + ), + 6 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => -20, 'y' => -600 ) + ), + 7 => array( + 'txt' => $book['BookData'][4]['nombre_prota'], + 'coordenadas' => array( 'x' => -20, 'y' => -560 ) + ) + ), + + 16 => array( + 6 => array( + 'txt' => 'Fabrican unas entradas para ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=16].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ', y organizan un concierto en el', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 7 => array( + 'txt' => 'salón. ' . $book['BookData'][2]['nombre_prota'] . ', ' . $book['BookData'][3]['nombre_prota'] . ' y ' . $book['BookData'][4]['nombre_prota'] . ' tocan la pandereta, Trasto la', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 8 => array( + 'txt' => 'zambomba y juntos cantan villancicos hasta el anochecer. A todos les parece muy', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 9 => array( + 'txt' => 'divertido; a los vecinos, no tanto.', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ) + ), + + 17 => array( + 1 => array( + 'txt' => 'La cuarta prueba aparece en la caja de los bloques de construcción. Les pide que', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'reúnan aquellos juguetes que ya no utilicen y se los regalen a niños y niñas que', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'tienen menos que ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 && $book['BookData'][4]['genero_prota'] == 1 ) ? 'ellas' : 'ellos' ) . '.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -140, 'y' => -50 ) + ), + 5 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => -100, 'y' => 70 ) + ), + 6 => array( + 'txt' => $book['BookData'][4]['nombre_prota'], + 'coordenadas' => array( 'x' => -65, 'y' => 190 ) + ) + ), + + 18 => array( + 4 => array( + 'txt' => 'Esta prueba es muy difícil porque les da mucha pena despedirse de sus posesiones,', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 5 => array( + 'txt' => 'pero les ayuda a pensar en lo felices que estarán otros niños jugando con ellas.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 20 => array( + 1 => array( + 'txt' => 'La quinta prueba tarda varios días en aparecer...', + 'coordenadas' => array( 'x' => 0, 'y' => 1045 ) + ) + ), + + 21 => array( + 1 => array( + 'txt' => 'La descubre Trasto en su cama junto a un trozo de carbón. Tienen que crear', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'sus propias felicitaciones de Navidad y enviárselas a sus amigos y familiares.', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'Se pasan el día rodeados de cartulinas de colores, témperas y purpurina. La', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 4 => array( + 'txt' => 'purpurina aparece hasta en la sopa de la cena.', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 5 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => 40, 'y' => -10 ) + ), + 6 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => 60, 'y' => 140 ) + ), + 7 => array( + 'txt' => $book['BookData'][4]['nombre_prota'], + 'coordenadas' => array( 'x' => 80, 'y' => 290 ) + ) + ), + + 23 => array( + 1 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -570, 'y' => 290 ) + ), + 2 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => -28, 'y' => 380 ) + ), + 3 => array( + 'txt' => $book['BookData'][4]['nombre_prota'], + 'coordenadas' => array( 'x' => 530, 'y' => 330 ) + ) + ), + + 24 => array( + 1 => array( + 'txt' => 'Un sexto sobre aparece dentro del congelador.', + 'coordenadas' => array( 'x' => 0, 'y' => 1045 ) + ) + ), + + 25 => array( + 6 => array( + 'txt' => 'Toda la familia debe salir a buscar dos adornos de Navidad, el más grande y', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 7 => array( + 'txt' => 'el más pequeño que puedan encontrar. Sin duda el mejor lugar para conseguir', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 8 => array( + 'txt' => 'adornos es el mercadillo de la ciudad.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 26 => array( + 1 => array( + 'txt' => 'El camino está deslumbrante. Cascadas de luces adornan las calles y estrellas de', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'colores cubren el cielo como si fuera el firmamento. Pasan junto a un Belén en el', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'que las figuras se mueven y el río tiene agua de verdad, ¿habrá peces bebiendo?', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ) + ), + + 27 => array( + 3 => array( + 'txt' => 'En el mercadillo compran bastoncillos de caramelo, mazapanes', + 'coordenadas' => array( 'x' => 750, 'y' => -1045 ) + ), + 4 => array( + 'txt' => 'y un gorro gigante. ¿Será lo bastante grande?', + 'coordenadas' => array( 'x' => 750, 'y' => -955 ) + ) + ), + + 28 => array( + 4 => array( + 'txt' => ucfirst( Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=28].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] ) . ' ha encontrado una estrella de madera muy', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'pequeña, pero ' . $book['BookData'][2]['nombre_prota'] . ', ' . $book['BookData'][3]['nombre_prota'] . ' y ' . $book['BookData'][4]['nombre_prota'], + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'no están muy ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 && $book['BookData'][4]['genero_prota'] == 1 ) ? 'seguras' : 'seguros' ) . ' de haber superado la prueba.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ) + ), + + 29 => array( + 6 => array( + 'txt' => 'De camino a casa empieza a nevar y las calles se cubren de un manto blanco.', + 'coordenadas' => array( 'x' => 200, 'y' => 775 ) + ), + 7 => array( + 'txt' => 'Toda la familia comienza a hacer un muñeco de nieve. Los mazapanes sirven de', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 8 => array( + 'txt' => 'ojos y un bastoncillo de nariz. Le colocan el gorro sobre la cabeza. Cuando se', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 9 => array( + 'txt' => 'quieren dar cuenta, han hecho un muñeco de nieve más grande que ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=29].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . '.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 30 => array( + 1 => array( + 'txt' => 'Un copo de nieve diminuto cae sobre el pelo rojo de Trasto', + 'coordenadas' => array( 'x' => 650, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'y, sorprendentemente, no se derrite. ¡Parece magia!', + 'coordenadas' => array( 'x' => 650, 'y' => -955 ) + ), + 3 => array( + 'txt' => '¡Ahora sí que lo han conseguido!', + 'coordenadas' => array( 'x' => 650, 'y' => -865 ) + ) + ), + + 31 => array( + 1 => array( + 'txt' => 'Ha llegado el gran día. Es muy temprano y,', + 'coordenadas' => array( 'x' => 450, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'antes de que se despierte ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=31].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ', ', + 'coordenadas' => array( 'x' => 450, 'y' => -955 ) + ), + 3 => array( + 'txt' => $book['BookData'][2]['nombre_prota'] . ', ' . $book['BookData'][3]['nombre_prota'] . ' y ' . $book['BookData'][4]['nombre_prota'], + 'coordenadas' => array( 'x' => 450, 'y' => -865 ) + ), + 4 => array( + 'txt' => 'corren ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 && $book['BookData'][4]['genero_prota'] == 1 ) ? 'ilusionadas' : 'ilusionados' ) . ' a abrir los regalos que', + 'coordenadas' => array( 'x' => 450, 'y' => -775 ) + ), + 5 => array( + 'txt' => 'están debajo del árbol. ¿Cuál será el más', + 'coordenadas' => array( 'x' => 450, 'y' => -685 ) + ), + 6 => array( + 'txt' => 'maravilloso del mundo?', + 'coordenadas' => array( 'x' => 450, 'y' => -595 ) + ) + ), + + 32 => array( + 4 => array( + 'txt' => 'Allí están un juego de mesa, muchos libros, un', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'oso de peluche gigante y un patinete. Al fondo,', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'envuelta en papel rojo con un lazo dorado, hay', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => 'una caja muy muy pequeña. Tan pequeña que', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 8 => array( + 'txt' => $book['BookData'][2]['nombre_prota'] . ', ' . $book['BookData'][3]['nombre_prota'] . ' y ' . $book['BookData'][4]['nombre_prota'] . ' no', + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ), + 9 => array( + 'txt' => 'creen que ahí dentro pueda haber ningún', + 'coordenadas' => array( 'x' => 200, 'y' => -595 ) + ), + 10 => array( + 'txt' => 'regalo especial.', + 'coordenadas' => array( 'x' => 200, 'y' => -505 ) + ) + ), + + 34 => array( + 1 => array( + 'txt' => 'La abren ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 && $book['BookData'][4]['genero_prota'] == 1 ) ? 'desconfiadas' : 'desconfiados' ) . ' y dentro descubren un sobre. Un sobre igual al que han', + 'coordenadas' => array( 'x' => 300, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'recibido todos los días anteriores. En él hay una carta sin firmar cuyo mensaje', + 'coordenadas' => array( 'x' => 300, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'es muy claro, una sola palabra escrita en letra grande, que les dice cuál es el', + 'coordenadas' => array( 'x' => 300, 'y' => -865 ) + ), + 4 => array( + 'txt' => 'mejor regalo que podemos tener en Navidad:', + 'coordenadas' => array( 'x' => 300, 'y' => -775 ) + ), + 5 => array( + 'txt' => 'Familia', + 'coordenadas' => array( 'x' => 100, 'y' => 20 ) + ) + ), + + 35 => array( + 6 => array( + 'txt' => 'La casa de ' . $book['BookData'][2]['nombre_prota'] . ', ' . $book['BookData'][3]['nombre_prota'] . ' y ' . $book['BookData'][4]['nombre_prota'] . ' ya no está en silencio.', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 7 => array( + 'txt' => 'Toda su familia ha venido a celebrar con ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 && $book['BookData'][4]['genero_prota'] == 1 ) ? 'ellas' : 'ellos' ) . ' la Navidad. Ríen, cantan,', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 8 => array( + 'txt' => 'bailan el burrito sabanero y ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=35].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ' casi se atraganta con un polvorón.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 9 => array( + 'txt' => 'Todos están convencidos de haber conseguido el regalo más maravilloso', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 10 => array( + 'txt' => 'del mundo.', + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ) + ) + + ); + + } else if ( $book['Book']['num_adultos'] == 2 && $book['Book']['num_hijos'] == 1 ) { + + $aTextosTmp = array( + + 4 => array( + 2 => array( + 'txt' => $book['Book']['dedication'], + 'coordenadas' => array( 'x' => 120, 'y' => 350 ) + ) + ), + + 5 => array( + 4 => array( + 'txt' => 'Es muy temprano y la casa de ' . $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'está en silencio. Aún no se escucha la', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'cucharilla dando vueltas al café', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=5].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ' ni la tostadora con el pan', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 8 => array( + 'txt' => Hash::extract( $aDataFamilyRelationshipAdulto1, 'FamilyRelationshipsBook8Article.{n}[page=5].article')[0] . $aDataFamilyRelationshipAdulto1['FamilyRelationshipsBook8']['name'] . '. Pero ' . $book['BookData'][2]['nombre_prota'] . ' ha oído', + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ), + 9 => array( + 'txt' => 'un ruido en el salón y se levanta', + 'coordenadas' => array( 'x' => 200, 'y' => -595 ) + ), + 10 => array( + 'txt' => 'a investigar.', + 'coordenadas' => array( 'x' => 200, 'y' => -505 ) + ) + ), + + 6 => array( + 1 => array( + 'txt' => 'Al lado del sofá ha crecido un abeto, igualito que un árbol de', + 'coordenadas' => array( 'x' => 0, 'y' => 775 ) + ), + 2 => array( + 'txt' => 'Navidad, pero sin adornos. De él cuelga una cuerda con un sobre', + 'coordenadas' => array( 'x' => 0, 'y' => 865 ) + ), + 3 => array( + 'txt' => 'que lleva su nombre escrito con letra grande.', + 'coordenadas' => array( 'x' => 0, 'y' => 955 ) + ), + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'] . ' se apresura a cogerlo.', + 'coordenadas' => array( 'x' => 0, 'y' => 1045 ) + ), + 5 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -50, 'y' => -105 ) + ) + ), + + 7 => array( + 3 => array( + 'txt' => 'Dentro del sobre hay una carta sin firmar ', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 4 => array( + 'txt' => 'cuyas instrucciones son claras:', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ) + ), + + 8 => array( + 4 => array( + 'txt' => '“Si quieres recibir el regalo de Navidad más maravilloso del mundo, tendrás que', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'superar una serie de pruebas”. ¡Qué emocionante! ¿Quién mandará esa carta?', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'Algo cae de dentro del sobre y se esparce por el suelo. ¡Es arena!', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => '¡Lo han enviado los Reyes Magos! ' . $book['BookData'][2]['nombre_prota'] . ' no se lo puede creer,', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 8 => array( + 'txt' => 'los mismísimos Reyes Magos les han mandado una carta, ¡a ' . ( ( $book['BookData'][2]['genero_prota'] == 1 ) ? 'ella' : 'él' ) . '!', + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ) + ), + + 9 => array( + 4 => array( + 'txt' => 'La primera prueba que debe superar consiste en cocinar las galletas de', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'Navidad más originales.', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => '¡No hay tiempo que perder! Nunca ha cocinado galletas, pero no puede ser', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => 'tan difícil.', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ) + ), + + 10 => array( + 1 => array( + 'txt' => 'Seguro que llevan harina, huevos, mantequilla y azúcar, mucho azúcar. Abre el', + 'coordenadas' => array( 'x' => 200, 'y' => 685 ) + ), + 2 => array( + 'txt' => 'armario de las especias y añade canela, jengibre, nuez moscada y virutas de', + 'coordenadas' => array( 'x' => 200, 'y' => 775 ) + ), + 3 => array( + 'txt' => 'chocolate, ¡serán las galletas más deliciosas que ha comido jamás! Toda la', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 4 => array( + 'txt' => 'casa huele a Navidad.', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 5 => array( + 'txt' => 'Amasa la mezcla y le da la forma de los miembros de la familia.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 11 => array( + 6 => array( + 'txt' => 'Las saca del horno y las prueba aún calientes. Son muy bonitas, pero están', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 7 => array( + 'txt' => 'durísimas, no se las puede comer, a no ser que quiera romperse los dientes.', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 8 => array( + 'txt' => '¡Qué decepción!', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 12 => array( + 1 => array( + 'txt' => 'Está pensando en intentarlo de nuevo cuando descubren un nuevo sobre', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'colgado del árbol. En él viene explicada la segunda prueba: debe decorar el', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'árbol de una manera especial.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => 65, 'y' => 350 ) + ) + ), + + 13 => array( + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'] . ', con ayuda ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=13].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ' y ' . Hash::extract( $aDataFamilyRelationshipAdulto1, 'FamilyRelationshipsBook8Article.{n}[page=13].article')[0] . $aDataFamilyRelationshipAdulto1['FamilyRelationshipsBook8']['name'] . ', lo adorna con', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'bolas de colores, guirnaldas de espumillón y una estrella en la punta,', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'como todos los años. ¿Qué puede hacer para que este año sea especial?', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ) + ), + + 14 => array( + 3 => array( + 'txt' => 'Sobre la mesa están las galletas que acaba de cocinar. ¡Qué buena idea! Así todos', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 4 => array( + 'txt' => 'formarán parte del árbol.', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ) + ), + + 15 => array( + 1 => array( + 'txt' => 'Al día siguiente, ' . $book['BookData'][2]['nombre_prota'] . ' no quita ojo del árbol esperando el próximo sobre.', + 'coordenadas' => array( 'x' => 200, 'y' => 775 ) + ), + 2 => array( + 'txt' => 'Pero, esta vez, la siguiente prueba aparece junto a la chimenea. ¿La enviará', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 3 => array( + 'txt' => 'Papá Noel? La carta dice que deberá montar una banda de villancicos.', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 5 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -20, 'y' => -600 ) + ) + ), + + 16 => array( + 6 => array( + 'txt' => 'Fabrica unas entradas para ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=16].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ' y ' . Hash::extract( $aDataFamilyRelationshipAdulto1, 'FamilyRelationshipsBook8Article.{n}[page=16].article')[0] . $aDataFamilyRelationshipAdulto1['FamilyRelationshipsBook8']['name'] . ', y organiza un concierto en el', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 7 => array( + 'txt' => 'salón. ' . $book['BookData'][2]['nombre_prota'] . ' toca la pandereta, Trasto la zambomba', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 8 => array( + 'txt' => 'y juntos cantan villancicos hasta el anochecer. A todos les parece muy', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 9 => array( + 'txt' => 'divertido; a los vecinos, no tanto.', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ) + ), + + 17 => array( + 1 => array( + 'txt' => 'La cuarta prueba aparece en la caja de los bloques de construcción. Le pide', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'que reúna aquellos juguetes que ya no utilice y se los regale a niños y niñas', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'que tienen menos que ' . ( $book['BookData'][2]['genero_prota'] == 1 ? 'ella' : 'él' ) . '.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -100, 'y' => 70 ) + ) + ), + + 18 => array( + 4 => array( + 'txt' => 'Esta prueba es muy difícil porque le da mucha pena despedirse de sus posesiones,', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 5 => array( + 'txt' => 'pero le ayuda a pensar en lo felices que estarán otros niños jugando con ellas.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 20 => array( + 1 => array( + 'txt' => 'La quinta prueba tarda varios días en aparecer...', + 'coordenadas' => array( 'x' => 0, 'y' => 1045 ) + ) + ), + + 21 => array( + 1 => array( + 'txt' => 'La descubre Trasto en su cama junto a un trozo de carbón. Tiene que crear', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'sus propias felicitaciones de Navidad y enviárselas a sus amigos y familiares.', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'Se pasa el día rodeado de cartulinas de colores, témperas y purpurina. La', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 4 => array( + 'txt' => 'purpurina aparece hasta en la sopa de la cena.', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 5 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => 60, 'y' => 140 ) + ) + ), + + 23 => array( + 1 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -28, 'y' => 380 ) + ) + ), + + 24 => array( + 1 => array( + 'txt' => 'Un sexto sobre aparece dentro del congelador.', + 'coordenadas' => array( 'x' => 0, 'y' => 1045 ) + ) + ), + + 25 => array( + 6 => array( + 'txt' => 'Toda la familia debe salir a buscar dos adornos de Navidad, el más grande y', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 7 => array( + 'txt' => 'el más pequeño que puedan encontrar. Sin duda el mejor lugar para conseguir', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 8 => array( + 'txt' => 'adornos es el mercadillo de la ciudad.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 26 => array( + 1 => array( + 'txt' => 'El camino está deslumbrante. Cascadas de luces adornan las calles y estrellas de', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'colores cubren el cielo como si fuera el firmamento. Pasan junto a un Belén en el', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'que las figuras se mueven y el río tiene agua de verdad, ¿habrá peces bebiendo?', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ) + ), + + 27 => array( + 3 => array( + 'txt' => 'En el mercadillo compran bastoncillos de caramelo, mazapanes', + 'coordenadas' => array( 'x' => 750, 'y' => -1045 ) + ), + 4 => array( + 'txt' => 'y un gorro gigante. ¿Será lo bastante grande?', + 'coordenadas' => array( 'x' => 750, 'y' => -955 ) + ) + ), + + 28 => array( + 4 => array( + 'txt' => ucfirst( Hash::extract( $aDataFamilyRelationshipAdulto1, 'FamilyRelationshipsBook8Article.{n}[page=28].article')[0] . $aDataFamilyRelationshipAdulto1['FamilyRelationshipsBook8']['name'] ) . ' ha encontrado una estrella de madera muy', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'pequeña, pero ' . $book['BookData'][2]['nombre_prota'] . ' no está muy ' . ( $book['BookData'][2]['genero_prota'] == 1 ? 'segura' : 'seguro' ), + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'de haber superado la prueba.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ) + ), + + 29 => array( + 6 => array( + 'txt' => 'De camino a casa empieza a nevar y las calles se cubren de un manto blanco.', + 'coordenadas' => array( 'x' => 200, 'y' => 775 ) + ), + 7 => array( + 'txt' => 'Toda la familia comienza a hacer un muñeco de nieve. Los mazapanes sirven de', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 8 => array( + 'txt' => 'ojos y un bastoncillo de nariz. Le colocan el gorro sobre la cabeza. Cuando se', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 9 => array( + 'txt' => 'quieren dar cuenta, han hecho un muñeco de nieve más grande que ' . Hash::extract( $aDataFamilyRelationshipAdulto1, 'FamilyRelationshipsBook8Article.{n}[page=29].article')[0] . $aDataFamilyRelationshipAdulto1['FamilyRelationshipsBook8']['name'] . '.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 30 => array( + 1 => array( + 'txt' => 'Un copo de nieve diminuto cae sobre el pelo rojo de Trasto', + 'coordenadas' => array( 'x' => 650, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'y, sorprendentemente, no se derrite. ¡Parece magia!', + 'coordenadas' => array( 'x' => 650, 'y' => -955 ) + ), + 3 => array( + 'txt' => '¡Ahora sí que lo han conseguido!', + 'coordenadas' => array( 'x' => 650, 'y' => -865 ) + ) + ), + + 31 => array( + 1 => array( + 'txt' => 'Ha llegado el gran día. Es muy temprano y,', + 'coordenadas' => array( 'x' => 450, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'antes de que se despierten ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=31].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ' y', + 'coordenadas' => array( 'x' => 450, 'y' => -955 ) + ), + 3 => array( + 'txt' => Hash::extract( $aDataFamilyRelationshipAdulto1, 'FamilyRelationshipsBook8Article.{n}[page=31].article')[0] . $aDataFamilyRelationshipAdulto1['FamilyRelationshipsBook8']['name'] . ', ' . $book['BookData'][2]['nombre_prota'] . ' corre ' . ( $book['BookData'][2]['genero_prota'] == 1 ? 'ilusionada' : 'ilusionado' ), + 'coordenadas' => array( 'x' => 450, 'y' => -865 ) + ), + 4 => array( + 'txt' => 'a abrir los regalos que están debajo', + 'coordenadas' => array( 'x' => 450, 'y' => -775 ) + ), + 5 => array( + 'txt' => 'del árbol. ¿Cuál será el más', + 'coordenadas' => array( 'x' => 450, 'y' => -685 ) + ), + 6 => array( + 'txt' => 'maravilloso del mundo?', + 'coordenadas' => array( 'x' => 450, 'y' => -595 ) + ) + ), + + 32 => array( + 4 => array( + 'txt' => 'Allí están un juego de mesa, muchos libros, un', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'oso de peluche gigante y un patinete. Al fondo,', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'envuelta en papel rojo con un lazo dorado, hay', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => 'una caja muy muy pequeña. Tan pequeña que', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 8 => array( + 'txt' => $book['BookData'][2]['nombre_prota']. ' no cree que ahí dentro pueda', + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ), + 9 => array( + 'txt' => 'haber ningún regalo especial.', + 'coordenadas' => array( 'x' => 200, 'y' => -595 ) + ) + ), + + 34 => array( + 1 => array( + 'txt' => 'La abre ' . ( ( $book['BookData'][2]['genero_prota'] == 1 ) ? 'desconfiada' : 'desconfiado' ) . ' y dentro descubre un sobre. Un sobre igual al que ha', + 'coordenadas' => array( 'x' => 300, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'recibido todos los días anteriores. En él hay una carta sin firmar cuyo mensaje', + 'coordenadas' => array( 'x' => 300, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'es muy claro, una sola palabra escrita en letra grande, que le dice cuál es el', + 'coordenadas' => array( 'x' => 300, 'y' => -865 ) + ), + 4 => array( + 'txt' => 'mejor regalo que podemos tener en Navidad:', + 'coordenadas' => array( 'x' => 300, 'y' => -775 ) + ), + 5 => array( + 'txt' => 'Familia', + 'coordenadas' => array( 'x' => 100, 'y' => 20 ) + ) + ), + + 35 => array( + 6 => array( + 'txt' => 'La casa de ' . $book['BookData'][2]['nombre_prota'] . ' ya no está en silencio. Toda su familia ha venido', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 7 => array( + 'txt' => 'a celebrar con ' . ( $book['BookData'][2]['genero_prota'] == 1 ? 'ellas' : 'ellos' ) . ' la Navidad. Ríen, cantan, bailan el burrito sabanero y', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 8 => array( + 'txt' => Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=35].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ' casi se atraganta con un polvorón. Todos están convencidos de', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 9 => array( + 'txt' => 'haber conseguido el regalo más maravilloso del mundo.', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ) + ) + + ); + + } else if ( $book['Book']['num_adultos'] == 2 && $book['Book']['num_hijos'] == 2 ) { + + $aTextosTmp = array( + + 4 => array( + 2 => array( + 'txt' => $book['Book']['dedication'], + 'coordenadas' => array( 'x' => 120, 'y' => 350 ) + ) + ), + + 5 => array( + 4 => array( + 'txt' => 'Es muy temprano y la casa de ' . $book['BookData'][2]['nombre_prota'] . ' y', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => $book['BookData'][3]['nombre_prota'] . ' está en silencio. Aún no se', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'escucha la cucharilla dando vueltas al café', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=5].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ' ni la tostadora con el pan', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 8 => array( + 'txt' => Hash::extract( $aDataFamilyRelationshipAdulto1, 'FamilyRelationshipsBook8Article.{n}[page=5].article')[0] . $aDataFamilyRelationshipAdulto1['FamilyRelationshipsBook8']['name'] . '. Pero ' . $book['BookData'][2]['nombre_prota'] . ' y ' . $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ), + 9 => array( + 'txt' => 'han oído un ruido en el salón y se levantan', + 'coordenadas' => array( 'x' => 200, 'y' => -595 ) + ), + 10 => array( + 'txt' => 'a investigar.', + 'coordenadas' => array( 'x' => 200, 'y' => -505 ) + ) + ), + + 6 => array( + 1 => array( + 'txt' => 'Al lado del sofá ha crecido un abeto, igualito que un árbol de', + 'coordenadas' => array( 'x' => 0, 'y' => 775 ) + ), + 2 => array( + 'txt' => 'Navidad, pero sin adornos. De él cuelga una cuerda con un sobre', + 'coordenadas' => array( 'x' => 0, 'y' => 865 ) + ), + 3 => array( + 'txt' => 'que lleva sus nombres escritos con letra grande.', + 'coordenadas' => array( 'x' => 0, 'y' => 955 ) + ), + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'] . ' y ' . $book['BookData'][3]['nombre_prota'] . ' se apresuran a cogerlo.', + 'coordenadas' => array( 'x' => 0, 'y' => 1045 ) + ), + 5 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -50, 'y' => -140 ) + ), + 6 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => -50, 'y' => -70 ) + ) + ), + + 7 => array( + 3 => array( + 'txt' => 'Dentro del sobre hay una carta sin firmar ', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 4 => array( + 'txt' => 'cuyas instrucciones son claras:', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ) + ), + + 8 => array( + 4 => array( + 'txt' => '“Si quieren recibir el regalo de Navidad más maravilloso del mundo, tendrán que', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'superar una serie de pruebas”. ¡Qué emocionante! ¿Quién mandará esa carta?', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'Algo cae de dentro del sobre y se esparce por el suelo. ¡Es arena!', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => '¡Lo han enviado los Reyes Magos! ' . $book['BookData'][2]['nombre_prota'] . ' y ' . $book['BookData'][3]['nombre_prota'] . ' no se lo', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 8 => array( + 'txt' => 'pueden creer, los mismísimos Reyes Magos les han mandado una carta, ¡a ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 ) ? 'ellas' : 'ellos' ) . '!', + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ) + ), + + 9 => array( + 4 => array( + 'txt' => 'La primera prueba que deben superar consiste en cocinar las galletas de', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'Navidad más originales.', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => '¡No hay tiempo que perder! Nunca han cocinado galletas, pero no puede ser', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => 'tan difícil.', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ) + ), + + 10 => array( + 1 => array( + 'txt' => 'Seguro que llevan harina, huevos, mantequilla y azúcar, mucho azúcar. Abren el', + 'coordenadas' => array( 'x' => 200, 'y' => 685 ) + ), + 2 => array( + 'txt' => 'armario de las especias y añaden canela, jengibre, nuez moscada y virutas de', + 'coordenadas' => array( 'x' => 200, 'y' => 775 ) + ), + 3 => array( + 'txt' => 'chocolate, ¡serán las galletas más deliciosas que han comido jamás! Toda la', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 4 => array( + 'txt' => 'casa huele a Navidad.', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 5 => array( + 'txt' => 'Amasan la mezcla y le dan la forma de los miembros de la familia.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 11 => array( + 6 => array( + 'txt' => 'Las sacan del horno y las prueban aún calientes. Son muy bonitas, pero están', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 7 => array( + 'txt' => 'durísimas, no se las pueden comer, a no ser que quieran romperse los dientes.', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 8 => array( + 'txt' => '¡Qué decepción!', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 12 => array( + 1 => array( + 'txt' => 'Están pensando en intentarlo de nuevo cuando descubren un nuevo sobre', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'colgado del árbol. En él viene explicada la segunda prueba: deben decorar el', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'árbol de una manera especial.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => 60, 'y' => 300 ) + ), + 5 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => 65, 'y' => 400 ) + ) + ), + + 13 => array( + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'] . ' y ' . $book['BookData'][3]['nombre_prota'] . ', con ayuda ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=13].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ' y ' . Hash::extract( $aDataFamilyRelationshipAdulto1, 'FamilyRelationshipsBook8Article.{n}[page=13].article')[0] . $aDataFamilyRelationshipAdulto1['FamilyRelationshipsBook8']['name'] . ', lo adornan', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'con bolas de colores, guirnaldas de espumillón y una estrella en la punta,', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'como todos los años. ¿Qué pueden hacer para que este año sea especial?', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ) + ), + + 14 => array( + 3 => array( + 'txt' => 'Sobre la mesa están las galletas que acaban de cocinar. ¡Qué buena idea! Así todos', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 4 => array( + 'txt' => 'formarán parte del árbol.', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ) + ), + + 15 => array( + 1 => array( + 'txt' => 'Al día siguiente, ' . $book['BookData'][2]['nombre_prota'] . ' y ' . $book['BookData'][3]['nombre_prota'] . ' no quitan ojo del árbol esperando', + 'coordenadas' => array( 'x' => 200, 'y' => 775 ) + ), + 2 => array( + 'txt' => 'el próximo sobre. Pero, esta vez, la siguiente prueba aparece junto a la', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 3 => array( + 'txt' => 'chimenea. ¿La enviará Papá Noel? La carta dice que deberán montar una banda de', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 4 => array( + 'txt' => 'villancicos.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ), + 5 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -20, 'y' => -620 ) + ), + 6 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => -20, 'y' => -580 ) + ) + ), + + 16 => array( + 6 => array( + 'txt' => 'Fabrican unas entradas para ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=16].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ' y ' . Hash::extract( $aDataFamilyRelationshipAdulto1, 'FamilyRelationshipsBook8Article.{n}[page=16].article')[0] . $aDataFamilyRelationshipAdulto1['FamilyRelationshipsBook8']['name'] . ', y organizan un concierto en el', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 7 => array( + 'txt' => 'salón. ' . $book['BookData'][2]['nombre_prota'] . ' y ' . $book['BookData'][3]['nombre_prota'] . ' tocan la pandereta, Trasto la zambomba', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 8 => array( + 'txt' => 'y juntos cantan villancicos hasta el anochecer. A todos les parece muy', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 9 => array( + 'txt' => 'divertido; a los vecinos, no tanto.', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ) + ), + + 17 => array( + 1 => array( + 'txt' => 'La cuarta prueba aparece en la caja de los bloques de construcción. Les pide que', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'reúnan aquellos juguetes que ya no utilicen y se los regalen a niños y niñas que', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'tienen menos que ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 ) ? 'ellas' : 'ellos' ) . '.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -140, 'y' => 10 ) + ), + 5 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => -100, 'y' => 150 ) + ) + ), + + 18 => array( + 4 => array( + 'txt' => 'Esta prueba es muy difícil porque les da mucha pena despedirse de sus posesiones,', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 5 => array( + 'txt' => 'pero les ayuda a pensar en lo felices que estarán otros niños jugando con ellas.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 20 => array( + 1 => array( + 'txt' => 'La quinta prueba tarda varios días en aparecer...', + 'coordenadas' => array( 'x' => 0, 'y' => 1045 ) + ) + ), + + 21 => array( + 1 => array( + 'txt' => 'La descubre Trasto en su cama junto a un trozo de carbón. Tienen que crear', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'sus propias felicitaciones de Navidad y enviárselas a sus amigos y familiares.', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'Se pasan el día rodeados de cartulinas de colores, témperas y purpurina. La', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 4 => array( + 'txt' => 'purpurina aparece hasta en la sopa de la cena.', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 5 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => 40, 'y' => 15 ) + ), + 6 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => 80, 'y' => 265 ) + ) + ), + + 23 => array( + 1 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -570, 'y' => 290 ) + ), + 2 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => -28, 'y' => 380 ) + ) + ), + + 24 => array( + 1 => array( + 'txt' => 'Un sexto sobre aparece dentro del congelador.', + 'coordenadas' => array( 'x' => 0, 'y' => 1045 ) + ) + ), + + 25 => array( + 6 => array( + 'txt' => 'Toda la familia debe salir a buscar dos adornos de Navidad, el más grande y', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 7 => array( + 'txt' => 'el más pequeño que puedan encontrar. Sin duda el mejor lugar para conseguir', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 8 => array( + 'txt' => 'adornos es el mercadillo de la ciudad.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 26 => array( + 1 => array( + 'txt' => 'El camino está deslumbrante. Cascadas de luces adornan las calles y estrellas de', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'colores cubren el cielo como si fuera el firmamento. Pasan junto a un Belén en el', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'que las figuras se mueven y el río tiene agua de verdad, ¿habrá peces bebiendo?', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ) + ), + + 27 => array( + 3 => array( + 'txt' => 'En el mercadillo compran bastoncillos de caramelo, mazapanes', + 'coordenadas' => array( 'x' => 750, 'y' => -1045 ) + ), + 4 => array( + 'txt' => 'y un gorro gigante. ¿Será lo bastante grande?', + 'coordenadas' => array( 'x' => 750, 'y' => -955 ) + ) + ), + + 28 => array( + 4 => array( + 'txt' => ucfirst( Hash::extract( $aDataFamilyRelationshipAdulto1, 'FamilyRelationshipsBook8Article.{n}[page=28].article')[0] . $aDataFamilyRelationshipAdulto1['FamilyRelationshipsBook8']['name'] ) . ' ha encontrado una estrella de madera muy', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'pequeña, pero ' . $book['BookData'][2]['nombre_prota'] . ' y ' . $book['BookData'][3]['nombre_prota'] . ' no están', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'muy ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 ) ? 'seguras' : 'seguros' ) . ' de haber superado la prueba.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ) + ), + + 29 => array( + 6 => array( + 'txt' => 'De camino a casa empieza a nevar y las calles se cubren de un manto blanco.', + 'coordenadas' => array( 'x' => 200, 'y' => 775 ) + ), + 7 => array( + 'txt' => 'Toda la familia comienza a hacer un muñeco de nieve. Los mazapanes sirven de', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 8 => array( + 'txt' => 'ojos y un bastoncillo de nariz. Le colocan el gorro sobre la cabeza. Cuando se', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 9 => array( + 'txt' => 'quieren dar cuenta, han hecho un muñeco de nieve más grande que ' . Hash::extract( $aDataFamilyRelationshipAdulto1, 'FamilyRelationshipsBook8Article.{n}[page=29].article')[0] . $aDataFamilyRelationshipAdulto1['FamilyRelationshipsBook8']['name'] . '.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 30 => array( + 1 => array( + 'txt' => 'Un copo de nieve diminuto cae sobre el pelo rojo de Trasto', + 'coordenadas' => array( 'x' => 650, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'y, sorprendentemente, no se derrite. ¡Parece magia!', + 'coordenadas' => array( 'x' => 650, 'y' => -955 ) + ), + 3 => array( + 'txt' => '¡Ahora sí que lo han conseguido!', + 'coordenadas' => array( 'x' => 650, 'y' => -865 ) + ) + ), + + 31 => array( + 1 => array( + 'txt' => 'Ha llegado el gran día. Es muy temprano y,', + 'coordenadas' => array( 'x' => 450, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'antes de que se despierten ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=31].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ' y', + 'coordenadas' => array( 'x' => 450, 'y' => -955 ) + ), + 3 => array( + 'txt' => Hash::extract( $aDataFamilyRelationshipAdulto1, 'FamilyRelationshipsBook8Article.{n}[page=31].article')[0] . $aDataFamilyRelationshipAdulto1['FamilyRelationshipsBook8']['name'] . ', ' . $book['BookData'][2]['nombre_prota'] . ' y ' . $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => 450, 'y' => -865 ) + ), + 4 => array( + 'txt' => 'corren ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 ) ? 'ilusionadas' : 'ilusionados' ) . ' a abrir los regalos', + 'coordenadas' => array( 'x' => 450, 'y' => -775 ) + ), + 5 => array( + 'txt' => 'que están debajo del árbol. ¿Cuál será', + 'coordenadas' => array( 'x' => 450, 'y' => -685 ) + ), + 6 => array( + 'txt' => 'el más maravilloso del mundo?', + 'coordenadas' => array( 'x' => 450, 'y' => -595 ) + ) + ), + + 32 => array( + 4 => array( + 'txt' => 'Allí están un juego de mesa, muchos libros, un', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'oso de peluche gigante y un patinete. Al fondo,', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'envuelta en papel rojo con un lazo dorado, hay', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => 'una caja muy muy pequeña. Tan pequeña que', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 8 => array( + 'txt' => $book['BookData'][2]['nombre_prota'] . ' y ' . $book['BookData'][3]['nombre_prota'] . ' no creen que ahí', + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ), + 9 => array( + 'txt' => 'dentro pueda haber ningún regalo especial.', + 'coordenadas' => array( 'x' => 200, 'y' => -595 ) + ) + ), + + 34 => array( + 1 => array( + 'txt' => 'La abren ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 ) ? 'desconfiadas' : 'desconfiados' ) . ' y dentro descubren un sobre. Un sobre igual al que han', + 'coordenadas' => array( 'x' => 300, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'recibido todos los días anteriores. En él hay una carta sin firmar cuyo mensaje', + 'coordenadas' => array( 'x' => 300, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'es muy claro, una sola palabra escrita en letra grande, que les dice cuál es el', + 'coordenadas' => array( 'x' => 300, 'y' => -865 ) + ), + 4 => array( + 'txt' => 'mejor regalo que podemos tener en Navidad:', + 'coordenadas' => array( 'x' => 300, 'y' => -775 ) + ), + 5 => array( + 'txt' => 'Familia', + 'coordenadas' => array( 'x' => 100, 'y' => 20 ) + ) + ), + + 35 => array( + 6 => array( + 'txt' => 'La casa de ' . $book['BookData'][2]['nombre_prota'] . ' y ' . $book['BookData'][3]['nombre_prota'] . ' ya no está en silencio.', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 7 => array( + 'txt' => 'Toda su familia ha venido a celebrar con ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 ) ? 'ellas' : 'ellos' ) . ' la Navidad. Ríen, cantan,', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 8 => array( + 'txt' => 'bailan el burrito sabanero y ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=35].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ' casi se atraganta con un polvorón.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 9 => array( + 'txt' => 'Todos están convencidos de haber conseguido el regalo más maravilloso', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 10 => array( + 'txt' => 'del mundo.', + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ) + ) + + ); + + } else if ( $book['Book']['num_adultos'] == 2 && $book['Book']['num_hijos'] == 3 ) { + + $aTextosTmp = array( + + 4 => array( + 2 => array( + 'txt' => $book['Book']['dedication'], + 'coordenadas' => array( 'x' => 120, 'y' => 350 ) + ) + ), + + 5 => array( + 4 => array( + 'txt' => 'Es muy temprano y la casa de ' . $book['BookData'][2]['nombre_prota'] . ',', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => $book['BookData'][3]['nombre_prota'] . ' y ' . $book['BookData'][4]['nombre_prota'] . ' está en silencio.', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'Aún no se escucha la cucharilla dando vueltas', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => 'al café ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=5].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ' ni la tostadora con el pan', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 8 => array( + 'txt' => Hash::extract( $aDataFamilyRelationshipAdulto1, 'FamilyRelationshipsBook8Article.{n}[page=5].article')[0] . $aDataFamilyRelationshipAdulto1['FamilyRelationshipsBook8']['name'] . '. Pero ' . $book['BookData'][2]['nombre_prota'] . ', ' . $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ), + 9 => array( + 'txt' => 'y ' . $book['BookData'][4]['nombre_prota'] . ' han oído un ruido en el salón y', + 'coordenadas' => array( 'x' => 200, 'y' => -595 ) + ), + 10 => array( + 'txt' => 'se levantan a investigar.', + 'coordenadas' => array( 'x' => 200, 'y' => -505 ) + ) + ), + + 6 => array( + 1 => array( + 'txt' => 'Al lado del sofá ha crecido un abeto, igualito que un árbol de', + 'coordenadas' => array( 'x' => 0, 'y' => 775 ) + ), + 2 => array( + 'txt' => 'Navidad, pero sin adornos. De él cuelga una cuerda con un sobre', + 'coordenadas' => array( 'x' => 0, 'y' => 865 ) + ), + 3 => array( + 'txt' => 'que lleva sus nombres escritos con letra grande.', + 'coordenadas' => array( 'x' => 0, 'y' => 955 ) + ), + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'] . ', ' . $book['BookData'][3]['nombre_prota'] . ' y ' . $book['BookData'][4]['nombre_prota'] . ' se apresuran a cogerlo.', + 'coordenadas' => array( 'x' => 0, 'y' => 1045 ) + ), + 5 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -50, 'y' => -160 ) + ), + 6 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => -50, 'y' => -105 ) + ), + 7 => array( + 'txt' => $book['BookData'][4]['nombre_prota'], + 'coordenadas' => array( 'x' => -50, 'y' => -50 ) + ) + ), + + 7 => array( + 3 => array( + 'txt' => 'Dentro del sobre hay una carta sin firmar ', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 4 => array( + 'txt' => 'cuyas instrucciones son claras:', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ) + ), + + 8 => array( + 4 => array( + 'txt' => '“Si quieren recibir el regalo de Navidad más maravilloso del mundo, tendrán que', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'superar una serie de pruebas”. ¡Qué emocionante! ¿Quién mandará esa carta?', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'Algo cae de dentro del sobre y se esparce por el suelo. ¡Es arena!', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => '¡Lo han enviado los Reyes Magos! ' . $book['BookData'][2]['nombre_prota'] . ', ' . $book['BookData'][3]['nombre_prota'] . ' y ' . $book['BookData'][4]['nombre_prota'] . ' no se lo', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 8 => array( + 'txt' => 'pueden creer, los mismísimos Reyes Magos les han mandado una carta, ¡a ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 && $book['BookData'][4]['genero_prota'] == 1 ) ? 'ellas' : 'ellos' ) . '!', + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ) + ), + + 9 => array( + 4 => array( + 'txt' => 'La primera prueba que deben superar consiste en cocinar las galletas de', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'Navidad más originales.', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => '¡No hay tiempo que perder! Nunca han cocinado galletas, pero no puede ser', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => 'tan difícil.', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ) + ), + + 10 => array( + 1 => array( + 'txt' => 'Seguro que llevan harina, huevos, mantequilla y azúcar, mucho azúcar. Abren el', + 'coordenadas' => array( 'x' => 200, 'y' => 685 ) + ), + 2 => array( + 'txt' => 'armario de las especias y añaden canela, jengibre, nuez moscada y virutas de', + 'coordenadas' => array( 'x' => 200, 'y' => 775 ) + ), + 3 => array( + 'txt' => 'chocolate, ¡serán las galletas más deliciosas que han comido jamás! Toda la', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 4 => array( + 'txt' => 'casa huele a Navidad.', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 5 => array( + 'txt' => 'Amasan la mezcla y le dan la forma de los miembros de la familia.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 11 => array( + 6 => array( + 'txt' => 'Las sacan del horno y las prueban aún calientes. Son muy bonitas, pero están', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 7 => array( + 'txt' => 'durísimas, no se las pueden comer, a no ser que quieran romperse los dientes.', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 8 => array( + 'txt' => '¡Qué decepción!', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 12 => array( + 1 => array( + 'txt' => 'Están pensando en intentarlo de nuevo cuando descubren un nuevo sobre', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'colgado del árbol. En él viene explicada la segunda prueba: deben decorar el', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'árbol de una manera especial.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => 60, 'y' => 250 ) + ), + 5 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => 65, 'y' => 350 ) + ), + 6 => array( + 'txt' => $book['BookData'][4]['nombre_prota'], + 'coordenadas' => array( 'x' => 65, 'y' => 450 ) + ) + ), + + 13 => array( + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'] . ', ' . $book['BookData'][3]['nombre_prota'] . ' y ' . $book['BookData'][4]['nombre_prota'] . ', con ayuda ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=13].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ' y ' . Hash::extract( $aDataFamilyRelationshipAdulto1, 'FamilyRelationshipsBook8Article.{n}[page=13].article')[0] . $aDataFamilyRelationshipAdulto1['FamilyRelationshipsBook8']['name'] . ', ', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'lo adornan con bolas de colores, guirnaldas de espumillón y una estrella en la', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'punta, como todos los años. ¿Qué pueden hacer para que este año sea especial?', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ) + ), + + 14 => array( + 3 => array( + 'txt' => 'Sobre la mesa están las galletas que acaban de cocinar. ¡Qué buena idea! Así todos', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 4 => array( + 'txt' => 'formarán parte del árbol.', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ) + ), + + 15 => array( + 1 => array( + 'txt' => 'Al día siguiente, ' . $book['BookData'][2]['nombre_prota'] . ', ' . $book['BookData'][3]['nombre_prota'] . ' y ' . $book['BookData'][4]['nombre_prota'] . ' no quitan ojo del árbol', + 'coordenadas' => array( 'x' => 200, 'y' => 775 ) + ), + 2 => array( + 'txt' => 'esperando el próximo sobre. Pero, esta vez, la siguiente prueba aparece junto a la', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 3 => array( + 'txt' => 'chimenea. ¿La enviará Papá Noel? La carta dice que deberán montar una banda de', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 4 => array( + 'txt' => 'villancicos.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ), + 5 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -20, 'y' => -640 ) + ), + 6 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => -20, 'y' => -600 ) + ), + 7 => array( + 'txt' => $book['BookData'][4]['nombre_prota'], + 'coordenadas' => array( 'x' => -20, 'y' => -560 ) + ) + ), + + 16 => array( + 6 => array( + 'txt' => 'Fabrican unas entradas para ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=16].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ' y ' . Hash::extract( $aDataFamilyRelationshipAdulto1, 'FamilyRelationshipsBook8Article.{n}[page=16].article')[0] . $aDataFamilyRelationshipAdulto1['FamilyRelationshipsBook8']['name'] . ', y organizan un concierto en el', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 7 => array( + 'txt' => 'salón.' . $book['BookData'][2]['nombre_prota'] . ', ' . $book['BookData'][3]['nombre_prota'] . ' y ' . $book['BookData'][4]['nombre_prota'] . ' tocan la pandereta, Trasto la', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 8 => array( + 'txt' => 'zambomba y juntos cantan villancicos hasta el anochecer. A todos les parece muy', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 9 => array( + 'txt' => 'divertido; a los vecinos, no tanto.', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ) + ), + + 17 => array( + 1 => array( + 'txt' => 'La cuarta prueba aparece en la caja de los bloques de construcción. Les pide que', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'reúnan aquellos juguetes que ya no utilicen y se los regalen a niños y niñas que', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'tienen menos que ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 && $book['BookData'][4]['genero_prota'] == 1 ) ? 'ellas' : 'ellos' ) . '.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 4 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -140, 'y' => -50 ) + ), + 5 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => -100, 'y' => 70 ) + ), + 6 => array( + 'txt' => $book['BookData'][4]['nombre_prota'], + 'coordenadas' => array( 'x' => -65, 'y' => 190 ) + ) + ), + + 18 => array( + 4 => array( + 'txt' => 'Esta prueba es muy difícil porque les da mucha pena despedirse de sus posesiones,', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 5 => array( + 'txt' => 'pero les ayuda a pensar en lo felices que estarán otros niños jugando con ellas.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 20 => array( + 1 => array( + 'txt' => 'La quinta prueba tarda varios días en aparecer...', + 'coordenadas' => array( 'x' => 0, 'y' => 1045 ) + ) + ), + + 21 => array( + 1 => array( + 'txt' => 'La descubre Trasto en su cama junto a un trozo de carbón. Tienen que crear', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'sus propias felicitaciones de Navidad y enviárselas a sus amigos y familiares.', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'Se pasan el día rodeados de cartulinas de colores, témperas y purpurina. La', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 4 => array( + 'txt' => 'purpurina aparece hasta en la sopa de la cena.', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 5 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => 40, 'y' => -10 ) + ), + 6 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => 60, 'y' => 140 ) + ), + 7 => array( + 'txt' => $book['BookData'][4]['nombre_prota'], + 'coordenadas' => array( 'x' => 80, 'y' => 290 ) + ) + ), + + 23 => array( + 1 => array( + 'txt' => $book['BookData'][2]['nombre_prota'], + 'coordenadas' => array( 'x' => -570, 'y' => 290 ) + ), + 2 => array( + 'txt' => $book['BookData'][3]['nombre_prota'], + 'coordenadas' => array( 'x' => -28, 'y' => 380 ) + ), + 3 => array( + 'txt' => $book['BookData'][4]['nombre_prota'], + 'coordenadas' => array( 'x' => 530, 'y' => 330 ) + ) + ), + + 24 => array( + 1 => array( + 'txt' => 'Un sexto sobre aparece dentro del congelador.', + 'coordenadas' => array( 'x' => 0, 'y' => 1045 ) + ) + ), + + 25 => array( + 6 => array( + 'txt' => 'Toda la familia debe salir a buscar dos adornos de Navidad, el más grande y', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 7 => array( + 'txt' => 'el más pequeño que puedan encontrar. Sin duda el mejor lugar para conseguir', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 8 => array( + 'txt' => 'adornos es el mercadillo de la ciudad.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 26 => array( + 1 => array( + 'txt' => 'El camino está deslumbrante. Cascadas de luces adornan las calles y estrellas de', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'colores cubren el cielo como si fuera el firmamento. Pasan junto a un Belén en el', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'que las figuras se mueven y el río tiene agua de verdad, ¿habrá peces bebiendo?', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ) + ), + + 27 => array( + 3 => array( + 'txt' => 'En el mercadillo compran bastoncillos de caramelo, mazapanes', + 'coordenadas' => array( 'x' => 750, 'y' => -1045 ) + ), + 4 => array( + 'txt' => 'y un gorro gigante. ¿Será lo bastante grande?', + 'coordenadas' => array( 'x' => 750, 'y' => -955 ) + ) + ), + + 28 => array( + 4 => array( + 'txt' => ucfirst( Hash::extract( $aDataFamilyRelationshipAdulto1, 'FamilyRelationshipsBook8Article.{n}[page=28].article')[0] . $aDataFamilyRelationshipAdulto1['FamilyRelationshipsBook8']['name'] ) . ' ha encontrado una estrella de madera muy', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'pequeña, pero ' . $book['BookData'][2]['nombre_prota'] . ', ' . $book['BookData'][3]['nombre_prota'] . ' y ' . $book['BookData'][4]['nombre_prota'], + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'no están muy ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 && $book['BookData'][4]['genero_prota'] == 1 ) ? 'seguras' : 'seguros' ) . ' de haber superado la prueba.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ) + ), + + 29 => array( + 6 => array( + 'txt' => 'De camino a casa empieza a nevar y las calles se cubren de un manto blanco.', + 'coordenadas' => array( 'x' => 200, 'y' => 775 ) + ), + 7 => array( + 'txt' => 'Toda la familia comienza a hacer un muñeco de nieve. Los mazapanes sirven de', + 'coordenadas' => array( 'x' => 200, 'y' => 865 ) + ), + 8 => array( + 'txt' => 'ojos y un bastoncillo de nariz. Le colocan el gorro sobre la cabeza. Cuando se', + 'coordenadas' => array( 'x' => 200, 'y' => 955 ) + ), + 9 => array( + 'txt' => 'quieren dar cuenta, han hecho un muñeco de nieve más grande que ' . Hash::extract( $aDataFamilyRelationshipAdulto1, 'FamilyRelationshipsBook8Article.{n}[page=29].article')[0] . $aDataFamilyRelationshipAdulto1['FamilyRelationshipsBook8']['name'] . '.', + 'coordenadas' => array( 'x' => 200, 'y' => 1045 ) + ) + ), + + 30 => array( + 1 => array( + 'txt' => 'Un copo de nieve diminuto cae sobre el pelo rojo de Trasto', + 'coordenadas' => array( 'x' => 650, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'y, sorprendentemente, no se derrite. ¡Parece magia!', + 'coordenadas' => array( 'x' => 650, 'y' => -955 ) + ), + 3 => array( + 'txt' => '¡Ahora sí que lo han conseguido!', + 'coordenadas' => array( 'x' => 650, 'y' => -865 ) + ) + ), + + 31 => array( + 1 => array( + 'txt' => 'Ha llegado el gran día. Es muy temprano y,', + 'coordenadas' => array( 'x' => 450, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'antes de que se despierten ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=31].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ' y', + 'coordenadas' => array( 'x' => 450, 'y' => -955 ) + ), + 3 => array( + 'txt' => Hash::extract( $aDataFamilyRelationshipAdulto1, 'FamilyRelationshipsBook8Article.{n}[page=31].article')[0] . $aDataFamilyRelationshipAdulto1['FamilyRelationshipsBook8']['name'] . ', ' . $book['BookData'][2]['nombre_prota'] . ', ' . $book['BookData'][3]['nombre_prota'] . ' y', + 'coordenadas' => array( 'x' => 450, 'y' => -865 ) + ), + 4 => array( + 'txt' => $book['BookData'][4]['nombre_prota'] . ' corren ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 && $book['BookData'][4]['genero_prota'] == 1 ) ? 'ilusionadas' : 'ilusionados' ) . ' a abrir', + 'coordenadas' => array( 'x' => 450, 'y' => -775 ) + ), + 5 => array( + 'txt' => 'los regalos que están debajo del árbol.', + 'coordenadas' => array( 'x' => 450, 'y' => -685 ) + ), + 6 => array( + 'txt' => '¿Cuál será el más maravilloso del mundo?', + 'coordenadas' => array( 'x' => 450, 'y' => -595 ) + ) + ), + + 32 => array( + 4 => array( + 'txt' => 'Allí están un juego de mesa, muchos libros, un', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 5 => array( + 'txt' => 'oso de peluche gigante y un patinete. Al fondo,', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 6 => array( + 'txt' => 'envuelta en papel rojo con un lazo dorado, hay', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 7 => array( + 'txt' => 'una caja muy muy pequeña. Tan pequeña que', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 8 => array( + 'txt' => $book['BookData'][2]['nombre_prota'] . ', ' . $book['BookData'][3]['nombre_prota'] . ' y ' . $book['BookData'][4]['nombre_prota'] . ' no', + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ), + 9 => array( + 'txt' => 'creen que ahí dentro pueda haber ningún', + 'coordenadas' => array( 'x' => 200, 'y' => -595 ) + ), + 10 => array( + 'txt' => 'regalo especial.', + 'coordenadas' => array( 'x' => 200, 'y' => -505 ) + ) + ), + + 34 => array( + 1 => array( + 'txt' => 'La abren ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 && $book['BookData'][4]['genero_prota'] == 1 ) ? 'desconfiadas' : 'desconfiados' ) . ' y dentro descubren un sobre. Un sobre igual al que han', + 'coordenadas' => array( 'x' => 300, 'y' => -1045 ) + ), + 2 => array( + 'txt' => 'recibido todos los días anteriores. En él hay una carta sin firmar cuyo mensaje', + 'coordenadas' => array( 'x' => 300, 'y' => -955 ) + ), + 3 => array( + 'txt' => 'es muy claro, una sola palabra escrita en letra grande, que les dice cuál es el', + 'coordenadas' => array( 'x' => 300, 'y' => -865 ) + ), + 4 => array( + 'txt' => 'mejor regalo que podemos tener en Navidad:', + 'coordenadas' => array( 'x' => 300, 'y' => -775 ) + ), + 5 => array( + 'txt' => 'Familia', + 'coordenadas' => array( 'x' => 100, 'y' => 20 ) + ) + ), + + 35 => array( + 6 => array( + 'txt' => 'La casa de ' . $book['BookData'][2]['nombre_prota'] . ', ' . $book['BookData'][3]['nombre_prota'] . ' y ' . $book['BookData'][4]['nombre_prota'] . ' ya no está en silencio.', + 'coordenadas' => array( 'x' => 200, 'y' => -1045 ) + ), + 7 => array( + 'txt' => 'Toda su familia ha venido a celebrar con ' . ( ( $book['BookData'][2]['genero_prota'] == 1 && $book['BookData'][3]['genero_prota'] == 1 && $book['BookData'][4]['genero_prota'] == 1 ) ? 'ellas' : 'ellos' ) . ' la Navidad. Ríen, cantan,', + 'coordenadas' => array( 'x' => 200, 'y' => -955 ) + ), + 8 => array( + 'txt' => 'bailan el burrito sabanero y ' . Hash::extract( $aDataFamilyRelationshipAdulto0, 'FamilyRelationshipsBook8Article.{n}[page=35].article')[0] . $aDataFamilyRelationshipAdulto0['FamilyRelationshipsBook8']['name'] . ' casi se atraganta con un polvorón.', + 'coordenadas' => array( 'x' => 200, 'y' => -865 ) + ), + 9 => array( + 'txt' => 'Todos están convencidos de haber conseguido el regalo más maravilloso', + 'coordenadas' => array( 'x' => 200, 'y' => -775 ) + ), + 10 => array( + 'txt' => 'del mundo.', + 'coordenadas' => array( 'x' => 200, 'y' => -685 ) + ) + ) + + ); + + } + # fin array de texto para todas las combinaciones posibles de adultos + niños (1-1, 1-2, 1-3, 2-1, 2-2 y 2-3) + + # array final (texto + fotos) + $aTextos = Hash::merge( $aFotos, $aTextosTmp ); + + # configuramos el texto + $draw = new ImagickDraw(); + $draw->setGravity( Imagick::GRAVITY_CENTER ); + $angle = 0; + $fontSize = ( $book['Book']['font_type'] == 2 ) ? 42 : 50; + + # recorremos lámina a lámina y vamos metiendo textos e imágenes + foreach ( $aTextos as $num_pag => $texto ) { + + foreach ( $texto as $num_txt => $txt ) { + + # escribimos sobre la imagen + if ( !empty( $txt['coordenadas'] ) ) { + + if ( $num_pag == 4 ) { // dedicatoria + + $draw->setFillColor( '#000000' ); + $draw->setFontSize( $fontSize + ( $fontSize * 0.50 ) ); + $draw->setFont( APP . 'Files' . DS . '8' . DS . 'fonts' . DS . 'Mali-Medium.ttf' ); + $angle = 9; + + } else if ( $num_pag == 5 ) { + + $draw->setFillColor( '#000000' ); + $draw->setFont( APP . 'Files' . DS . '8' . DS . 'fonts' . DS . 'Mali-Medium.ttf' ); + $draw->setGravity( Imagick::GRAVITY_WEST ); + $draw->setFontSize( $fontSize ); + $angle = 0; + + } else if ( $num_pag == 6 ) { + + if ( in_array( $num_txt, array( 5, 6, 7 ) ) ) { + + $draw->setFillColor( '#000000' ); + + } else { + + $draw->setFillColor( '#FFFFFF' ); + + } + + $draw->setGravity( Imagick::GRAVITY_CENTER ); + + } else if ( $num_pag == 7 ) { + + $draw->setFillColor( '#000000' ); + $draw->setGravity( Imagick::GRAVITY_WEST ); + + } else if ( $num_pag == 11 ) { + + $draw->setFillColor( '#FFFFFF' ); + + } else if ( $num_pag == 12 ) { + + if ( in_array( $num_txt, array( 4, 5, 6 ) ) ) { + + $draw->setGravity( Imagick::GRAVITY_CENTER ); + $draw->setFontSize( $fontSize + ( $fontSize * 0.75 ) ); + $angle = -1.2; + + } + + $draw->setFillColor( '#000000' ); + + } else if ( $num_pag == 15 ) { + + if ( in_array( $num_txt, array( 5, 6, 7 ) ) ) { + + $draw->setGravity( Imagick::GRAVITY_CENTER ); + $draw->setFontSize( $fontSize - ( $fontSize * 0.20 ) ); + + } + + } else if ( $num_pag == 17 ) { + + if ( in_array( $num_txt, array( 4, 5, 6 ) ) ) { + + $draw->setGravity( Imagick::GRAVITY_CENTER ); + $draw->setFontSize( $fontSize + ( $fontSize * 1.5 ) ); + $angle = -16; + + } + + } else if ( $num_pag == 18 ) { + + $draw->setFillColor( '#FFFFFF' ); + $draw->setGravity( Imagick::GRAVITY_WEST ); + $draw->setFontSize( $fontSize ); + $angle = 0; + + } else if ( $num_pag == 20 ) { + + $draw->setFillColor( '#FFFFFF' ); + $draw->setGravity( Imagick::GRAVITY_CENTER ); + + } else if ( $num_pag == 21 ) { + + if ( in_array( $num_txt, array( 5, 6, 7 ) ) ) { + + $draw->setGravity( Imagick::GRAVITY_CENTER ); + $draw->setFontSize( $fontSize + ( $fontSize * 2 ) ); + $angle = -6.5; + + } else { + + $draw->setFillColor( '#000000' ); + $draw->setGravity( Imagick::GRAVITY_WEST ); + + } + + } else if ( $num_pag == 23 ) { + + $draw->setGravity( Imagick::GRAVITY_CENTER ); + $draw->setFontSize( $fontSize - ( $fontSize * 0.25 ) ); + $angle = 0; + + } else if ( $num_pag == 24 ) { + + $draw->setGravity( Imagick::GRAVITY_CENTER ); + $draw->setFillColor( '#FFFFFF' ); + $draw->setFontSize( $fontSize ); + + } else if ( $num_pag == 25 ) { + + $draw->setFillColor( '#FFFFFF' ); + $draw->setGravity( Imagick::GRAVITY_WEST ); + $draw->setFontSize( $fontSize ); + + } else if ( $num_pag == 26 ) { + + $draw->setFillColor( '#FFFFFF' ); + + } else if ( $num_pag == 27 ) { + + $draw->setFillColor( '#FFFFFF' ); + + } else if ( $num_pag == 28 ) { + + $draw->setFillColor( '#FFFFFF' ); + + } else if ( $num_pag == 30 ) { + + $draw->setFillColor( '#FFFFFF' ); + + } else if ( $num_pag == 34 ) { + + if ( $num_txt == 5 ) { + + $draw->setGravity( Imagick::GRAVITY_CENTER ); + $draw->setFontSize( $fontSize + ( $fontSize * 4 ) ); + $angle = -8; + + } + + } else { + + $draw->setFillColor( '#000000' ); + $draw->setGravity( Imagick::GRAVITY_WEST ); + $draw->setFont( APP . 'Files' . DS . '8' . DS . 'fonts' . DS . 'Mali-Medium.ttf' ); + $draw->setFontSize( $fontSize ); + $angle = 0; + + } + + # convertimos el texto a mayúsculas en caso de ser seleccionado por el usuario + if ( $book['Book']['font_type'] == 2 ) { + + $txt_format = mb_strtoupper( $txt['txt'], 'UTF-8' ); + + } else { + + $txt_format = $txt['txt']; + + } + + ${ 'frameBase' . $num_pag }->annotateImage( $draw, $txt['coordenadas']['x'], $txt['coordenadas']['y'], $angle, $txt_format ); + + } + + # hacemos el composite del texto y foto de la dedicatoria + if ( isset( $user_image_dedicatoria ) && !empty( $txt['photo_dedicatoria'] ) ) { + + # clonamos la imagen original para que no se guarde la rotación en posteriores páginas + $user_image_dedicatoria_clone = clone $user_image_dedicatoria; + + # rotamos la imagen + $user_image_dedicatoria_clone->rotateimage( new ImagickPixel( '#00000000' ), -9.37 ); + + # hacemos el composite + ${ 'frameBase' . $num_pag }->compositeImage( $user_image_dedicatoria_clone, Imagick::COMPOSITE_DEFAULT, $txt['photo_dedicatoria']['x'], $txt['photo_dedicatoria']['y'] ); + + # eliminamos la imagen clone y la variable de rotación + $user_image_dedicatoria_clone->clear(); + + } + + # hacemos el composite del texto y foto del padre e hijos + if ( isset( $user_image_adulto_0 ) && !empty( $txt['photo_adulto_0'] ) ) { + + # mejora para en la página 10 la cara del padre repetida no coja la rotación de la otra cara del padre de la misma página + if ( !( $num_pag == 10 && $num_txt == 1 ) ) { + + switch ( $num_pag ) { + + case '7': + $rotate_clone_image = -16; + break; + + case '19': + $rotate_clone_image = -7; + break; + + case '29': + $rotate_clone_image = -12; + break; + + } + + } + + if ( isset( $rotate_clone_image ) ) { + + # clonamos la imagen original para que no se guarde la rotación en posteriores páginas + $user_image_adulto_0_clone = clone $user_image_adulto_0; + + # rotamos la imagen + $user_image_adulto_0_clone->rotateimage( new ImagickPixel( '#00000000' ), $rotate_clone_image ); + + # hacemos el composite + ${ 'frameBase' . $num_pag }->compositeImage( $user_image_adulto_0_clone, Imagick::COMPOSITE_DEFAULT, $txt['photo_adulto_0']['x'], $txt['photo_adulto_0']['y'] ); + + # eliminamos la imagen clone y la variable de rotación + $user_image_adulto_0_clone->clear(); + unset( $rotate_clone_image ); + + } else { + + ${ 'frameBase' . $num_pag }->compositeImage( $user_image_adulto_0, Imagick::COMPOSITE_DEFAULT, $txt['photo_adulto_0']['x'], $txt['photo_adulto_0']['y'] ); + + } + + } + + if ( isset( $user_image_adulto_1 ) && !empty( $txt['photo_adulto_1'] ) ) { + + # mejora para en la página 10 la cara del padre repetida no coja la rotación de la otra cara del padre de la misma página + if ( !( $num_pag == 10 && $num_txt == 1 ) ) { + + switch ( $num_pag ) { + + case '7': + $rotate_clone_image = -8; + break; + + case '19': + $rotate_clone_image = -3; + break; + + case '22': + $rotate_clone_image = -6; + break; + + } + + } + + if ( isset( $rotate_clone_image ) ) { + + # clonamos la imagen original para que no se guarde la rotación en posteriores páginas + $user_image_adulto_1_clone = clone $user_image_adulto_1; + + # rotamos la imagen + $user_image_adulto_1_clone->rotateimage( new ImagickPixel( '#00000000' ), $rotate_clone_image ); + + # hacemos el composite + ${ 'frameBase' . $num_pag }->compositeImage( $user_image_adulto_1_clone, Imagick::COMPOSITE_DEFAULT, $txt['photo_adulto_1']['x'], $txt['photo_adulto_1']['y'] ); + + # eliminamos la imagen clone y la variable de rotación + $user_image_adulto_1_clone->clear(); + unset( $rotate_clone_image ); + + } else { + + ${ 'frameBase' . $num_pag }->compositeImage( $user_image_adulto_1, Imagick::COMPOSITE_DEFAULT, $txt['photo_adulto_1']['x'], $txt['photo_adulto_1']['y'] ); + + } + + } + + if ( isset( $user_image_hijo_2 ) && !empty( $txt['photo_hijo_2'] ) ) { + + switch ( $num_pag ) { + + case '6': + $rotate_clone_image = -5; + break; + + case '19': + $rotate_clone_image = -4; + break; + + case '32': + $rotate_clone_image = 3; + break; + + } + + # mejora para cuando son 2 hijos colocar en el centro de la cesta de la cigüeña + if ( $num_pag == 6 && $this->data['Book']['num_hijos'] == 2 ) { + + $txt['photo_hijo_2']['x'] = 217; + $txt['photo_hijo_2']['y'] = 255; + + } + + # mejora para cuando hay 2 hijos colocar en el centro del zapato + if ( $num_pag == 21 && $this->data['Book']['num_hijos'] == 2 ) { + + $txt['photo_hijo_2']['x'] = 368; + $txt['photo_hijo_2']['y'] = 122; + + } + + if ( isset( $rotate_clone_image ) ) { + + # clonamos la imagen original para que no se guarde la rotación en posteriores páginas + # mejora para que cuando estemos en la página 10 y solo tengamos 1 hijo, mostremos 3 veces al hijo 1 + if ( $num_pag == 10 && $this->data['Book']['num_hijos'] == 1 ) { + + $user_image_hijo_2_clone = clone $user_image_hijo_1; + + } else { + + $user_image_hijo_2_clone = clone $user_image_hijo_2; + + } + + # rotamos la imagen + $user_image_hijo_2_clone->rotateimage( new ImagickPixel( '#00000000' ), $rotate_clone_image ); + + # hacemos el composite + ${ 'frameBase' . $num_pag }->compositeImage( $user_image_hijo_2_clone, Imagick::COMPOSITE_DEFAULT, $txt['photo_hijo_2']['x'], $txt['photo_hijo_2']['y'] ); + + # eliminamos la imagen clone y la variable de rotación + $user_image_hijo_2_clone->clear(); + unset( $rotate_clone_image ); + + } else { + + ${ 'frameBase' . $num_pag }->compositeImage( $user_image_hijo_2, Imagick::COMPOSITE_DEFAULT, $txt['photo_hijo_2']['x'], $txt['photo_hijo_2']['y'] ); + + } + + } + + if ( isset( $user_image_hijo_3 ) && !empty( $txt['photo_hijo_3'] ) ) { + + switch ( $num_pag ) { + + case '5': + $rotate_clone_image = -8; + break; + + case '9': + $rotate_clone_image= -10; + break; + + case '19': + $rotate_clone_image = -3; + break; + + } + + if ( isset( $rotate_clone_image ) ) { + + # clonamos la imagen original para que no se guarde la rotación en posteriores páginas + # mejora para que cuando estemos en la página 10 y solo tengamos 1 hijo, mostremos 3 veces al hijo 1 + if ( $num_pag == 10 && $this->data['Book']['num_hijos'] == 1 ) { + + $user_image_hijo_3_clone = clone $user_image_hijo_1; + + } else { + + $user_image_hijo_3_clone = clone $user_image_hijo_3; + + } + + # rotamos la imagen + $user_image_hijo_3_clone->rotateimage( new ImagickPixel( '#00000000' ), $rotate_clone_image ); + + # hacemos el composite + ${ 'frameBase' . $num_pag }->compositeImage( $user_image_hijo_3_clone, Imagick::COMPOSITE_DEFAULT, $txt['photo_hijo_3']['x'], $txt['photo_hijo_3']['y'] ); + + # eliminamos la imagen clone y la variable de rotación + $user_image_hijo_3_clone->clear(); + unset( $rotate_clone_image ); + + } else { + + ${ 'frameBase' . $num_pag }->compositeImage( $user_image_hijo_3, Imagick::COMPOSITE_DEFAULT, $txt['photo_hijo_3']['x'], $txt['photo_hijo_3']['y'] ); + + } + + } + + if ( isset( $user_image_hijo_4 ) && !empty( $txt['photo_hijo_4'] ) ) { + + switch ( $num_pag ) { + + case '12': + $rotate_clone_image = -5; + break; + case '16': + $rotate_clone_image = -5; + break; + + case '19': + $rotate_clone_image = -3; + break; + + } + + # mejora para cuando es 1 o 2 hijos colocar en el centro de la cesta de la cigüeña + if ( $num_pag == 6 ) { + + switch ( $this->data['Book']['num_hijos'] ) { + + case '1': + $txt['photo_hijo_4']['x'] = 175; + $txt['photo_hijo_4']['y'] = 258; + break; + + case '2': + $txt['photo_hijo_4']['x'] = 140; + $txt['photo_hijo_4']['y'] = 262; + break; + + } + + } + + # mejora para cuando es 1 o 2 hijos colocar en el centro del zapato + if ( $num_pag == 21 ) { + + switch ( $this->data['Book']['num_hijos'] ) { + + case '1': + $txt['photo_hijo_4']['x'] = 326; + $txt['photo_hijo_4']['y'] = 122; + break; + + case '2': + $txt['photo_hijo_4']['x'] = 260; + $txt['photo_hijo_4']['y'] = 124; + break; + + } + + } + + if ( isset( $rotate_clone_image ) ) { + + # clonamos la imagen original para que no se guarde la rotación en posteriores páginas + $user_image_hijo_4_clone = clone $user_image_hijo_4; + + # rotamos la imagen + $user_image_hijo_4_clone->rotateimage( new ImagickPixel( '#00000000' ), $rotate_clone_image ); + + # hacemos el composite + ${ 'frameBase' . $num_pag }->compositeImage( $user_image_hijo_4_clone, Imagick::COMPOSITE_DEFAULT, $txt['photo_hijo_4']['x'], $txt['photo_hijo_4']['y'] ); + + # eliminamos la imagen clone y la variable de rotación + $user_image_hijo_4_clone->clear(); + unset( $rotate_clone_image ); + + } else { + + ${ 'frameBase' . $num_pag }->compositeImage( $user_image_hijo_4, Imagick::COMPOSITE_DEFAULT, $txt['photo_hijo_4']['x'], $txt['photo_hijo_4']['y'] ); + + } + + } + # fin hacemos el composite del texto y foto del padre e hijos + + # metemos el código qr en la página 27 + /* + if ( $num_pag == 35 ) { + + ${ 'frameBase' . $num_pag }->compositeImage( $frameQrImage, Imagick::COMPOSITE_DEFAULT, 293, 2127 ); + + } + */ + + } + + # definimos la ruta donde guardaremos la página ya montada + $path_pag = 'files'. DS . 'cuentos' . DS . $this->params['id_book'] . DS . 'final-frames' . DS . $book['Book']['id_cart'] . '_' . $book['Book']['id']; + + # definimos el nombre de la lámina + $name_file = '_page' . '_' . $num_pag . '.jpg'; + + # guardamos la lámina ya montada en el servidor + ${ 'frameBase' . $num_pag }->writeImage( WWW_ROOT . $path_pag . $name_file ); + + # guardamos la ruta de la lámina para montar el PDF + $aDataPagesToPdf[ $num_pag ] = WWW_ROOT . $path_pag . $name_file; + + } + + # una vez creadas todas las páginas, montamos el PDF final que enviaremos + $pdf = new Imagick( $aDataPagesToPdf ); + $pdf->setImageFormat( 'pdf' ); + $pdf->writeImages( WWW_ROOT . $path_pag . '_page' . '.pdf', true ); + + # guardamos el nombre del pdf en la tabla books + $this->Book->id = $id_book_customized; + $this->Book->saveField( 'page', DS . $path_pag . '_page' . '.pdf' ); + + # eliminamos las láminas interiores y nos quedamos solamente con el pdf generado + foreach ( $aDataPagesToPdf as $page ) { + + unlink( $page ); + + } + + # creamos la portada + $txt_cover_format_line_1 = 'El Mejor Regalo'; + $txt_cover_format_line_2 = 'De La Navidad'; + + $frameCover = new Imagick( $url_laminas . DS . 'cover' . '.png' ); + + $draw->setFillColor( '#FFFFFF' ); + $draw->setFont( APP . 'Files' . DS . '8' . DS . 'fonts' . DS . 'BerkshireSwash-Regular.ttf' ); + + # escribimos la primera línea de la portada + $draw->setGravity( Imagick::GRAVITY_CENTER ); + $draw->setFontSize( $fontSize + ( $fontSize * 2.5 ) ); + $frameCover->annotateImage( $draw, 1325, -900, 0, $txt_cover_format_line_1 ); + $frameCover->annotateImage( $draw, 1325, -710, 0, $txt_cover_format_line_2 ); + + # escribimos el nombre en el lomo + $draw->setFontSize( $fontSize + ( $fontSize * 0 ) ); + $draw->setGravity( Imagick::GRAVITY_EAST ); + $frameCover->annotateImage( $draw, 2845, -1050, -90, $txt_cover_format_line_1 . ' ' . $txt_cover_format_line_2 ); + + # añadimos la foto de los adultos e hijos + $frameCover->compositeImage( $user_image_adulto_0, Imagick::COMPOSITE_DEFAULT, 4730, 1325 ); + + if ( isset( $user_image_adulto_1 ) ) { $frameCover->compositeImage( $user_image_adulto_1, Imagick::COMPOSITE_DEFAULT, 3278, 1358 ); } + + if ( isset( $user_image_hijo_2 ) ) { $frameCover->compositeImage( $user_image_hijo_2, Imagick::COMPOSITE_DEFAULT, 3730, 1168 ); } + + if ( isset( $user_image_hijo_3 ) ) { $frameCover->compositeImage( $user_image_hijo_3, Imagick::COMPOSITE_DEFAULT, 4568, 1795 ); } + + if ( isset( $user_image_hijo_4 ) ) { $frameCover->compositeImage( $user_image_hijo_4, Imagick::COMPOSITE_DEFAULT, 3570, 1825 ); } + # añadimos la foto de los adultos e hijos + + # añadimos el código qr + //$frameCover->compositeImage( $frameQrImage, Imagick::COMPOSITE_DEFAULT, 2250, 2435 ); + + $name_cover = '_cover' . '.jpg'; + $frameCover->writeImage( WWW_ROOT . $path_pag . $name_cover ); + + $pdfCover = new Imagick( WWW_ROOT . $path_pag . $name_cover ); + $pdfCover->setImageFormat( 'pdf' ); + $pdfCover->writeImages( WWW_ROOT . $path_pag . '_cover' . '.pdf', true ); + + $this->Book->saveField( 'cover', DS . $path_pag . '_cover' . '.pdf' ); + + unlink( $path_pag . $name_cover ); + //unlink( $url_qr_image ); + # ./creamos la portada + + # fin de medimos el tiempo de procesamiento del cuento + $timeOutput->finishProcess(); + $this->Book->saveField( 'processing_time_pdf', $timeOutput->getTotalTime() ); + + $this->Flash->success( 'PDFs creados correctamente' ); + + $this->redirect( $this->referer() ); + + } else { + + $this->Flash->error( 'No existe libro con ese ID' ); + } + +} \ No newline at end of file diff --git a/src/books/3/fonts/3Dumb Regular.ttf b/src/books/3/fonts/3Dumb Regular.ttf new file mode 100644 index 0000000..978409a Binary files /dev/null and b/src/books/3/fonts/3Dumb Regular.ttf differ diff --git a/src/books/3/fonts/BerkshireSwash-Regular.ttf b/src/books/3/fonts/BerkshireSwash-Regular.ttf new file mode 100644 index 0000000..924bdb3 Binary files /dev/null and b/src/books/3/fonts/BerkshireSwash-Regular.ttf differ diff --git a/src/books/3/fonts/ChelseaMarket-Regular.ttf b/src/books/3/fonts/ChelseaMarket-Regular.ttf new file mode 100644 index 0000000..7308753 Binary files /dev/null and b/src/books/3/fonts/ChelseaMarket-Regular.ttf differ diff --git a/src/books/3/fonts/Dokdo-Regular.ttf b/src/books/3/fonts/Dokdo-Regular.ttf new file mode 100644 index 0000000..bff20cd Binary files /dev/null and b/src/books/3/fonts/Dokdo-Regular.ttf differ diff --git a/src/books/3/fonts/LondrinaSolid-Light.ttf b/src/books/3/fonts/LondrinaSolid-Light.ttf new file mode 100644 index 0000000..65f8637 Binary files /dev/null and b/src/books/3/fonts/LondrinaSolid-Light.ttf differ diff --git a/src/books/3/fonts/Mali-Bold.ttf b/src/books/3/fonts/Mali-Bold.ttf new file mode 100644 index 0000000..f70c67e Binary files /dev/null and b/src/books/3/fonts/Mali-Bold.ttf differ diff --git a/src/books/3/fonts/Mali-Medium.ttf b/src/books/3/fonts/Mali-Medium.ttf new file mode 100644 index 0000000..75b7d3d Binary files /dev/null and b/src/books/3/fonts/Mali-Medium.ttf differ diff --git a/src/books/3/fonts/Mali-Regular.ttf b/src/books/3/fonts/Mali-Regular.ttf new file mode 100644 index 0000000..70cd35b Binary files /dev/null and b/src/books/3/fonts/Mali-Regular.ttf differ diff --git a/src/books/3/fonts/Photograph-Signature.ttf b/src/books/3/fonts/Photograph-Signature.ttf new file mode 100644 index 0000000..883cdb8 Binary files /dev/null and b/src/books/3/fonts/Photograph-Signature.ttf differ diff --git a/src/books/3/fonts/Simplicity-Regular.otf b/src/books/3/fonts/Simplicity-Regular.otf new file mode 100644 index 0000000..650f6fc Binary files /dev/null and b/src/books/3/fonts/Simplicity-Regular.otf differ diff --git a/src/books/3/fonts/bubbleboddyneue-bold.ttf b/src/books/3/fonts/bubbleboddyneue-bold.ttf new file mode 100644 index 0000000..2557b70 Binary files /dev/null and b/src/books/3/fonts/bubbleboddyneue-bold.ttf differ diff --git a/src/books/3/fonts/bubbleboddyneue-light.ttf b/src/books/3/fonts/bubbleboddyneue-light.ttf new file mode 100644 index 0000000..cd488ec Binary files /dev/null and b/src/books/3/fonts/bubbleboddyneue-light.ttf differ diff --git a/src/books/3/fonts/bubbleboddyneue-regular.ttf b/src/books/3/fonts/bubbleboddyneue-regular.ttf new file mode 100644 index 0000000..a1ec2ad Binary files /dev/null and b/src/books/3/fonts/bubbleboddyneue-regular.ttf differ diff --git a/src/books/3/fonts/calibri.ttf b/src/books/3/fonts/calibri.ttf new file mode 100644 index 0000000..2fede68 Binary files /dev/null and b/src/books/3/fonts/calibri.ttf differ diff --git a/src/books/3/fonts/ebrima.ttf b/src/books/3/fonts/ebrima.ttf new file mode 100644 index 0000000..c4de3a7 Binary files /dev/null and b/src/books/3/fonts/ebrima.ttf differ diff --git a/src/books/3/fonts/hand_of_sean.ttf b/src/books/3/fonts/hand_of_sean.ttf new file mode 100644 index 0000000..ee51d76 Binary files /dev/null and b/src/books/3/fonts/hand_of_sean.ttf differ diff --git a/src/books/3/fonts/hanoded_crayon_crumble.ttf b/src/books/3/fonts/hanoded_crayon_crumble.ttf new file mode 100644 index 0000000..db57127 Binary files /dev/null and b/src/books/3/fonts/hanoded_crayon_crumble.ttf differ diff --git a/src/books/3/fonts/indie_flower.ttf b/src/books/3/fonts/indie_flower.ttf new file mode 100644 index 0000000..c1d7c17 Binary files /dev/null and b/src/books/3/fonts/indie_flower.ttf differ diff --git a/src/books/3/fonts/montserrat_regular.ttf b/src/books/3/fonts/montserrat_regular.ttf new file mode 100644 index 0000000..5b4b5af Binary files /dev/null and b/src/books/3/fonts/montserrat_regular.ttf differ diff --git a/src/books/3/fonts/nexa_black.otf b/src/books/3/fonts/nexa_black.otf new file mode 100644 index 0000000..517322f Binary files /dev/null and b/src/books/3/fonts/nexa_black.otf differ diff --git a/src/books/3/fonts/pulang.ttf b/src/books/3/fonts/pulang.ttf new file mode 100644 index 0000000..875b6e4 Binary files /dev/null and b/src/books/3/fonts/pulang.ttf differ diff --git a/src/books/3/fonts/segoepr.ttf b/src/books/3/fonts/segoepr.ttf new file mode 100644 index 0000000..5951172 Binary files /dev/null and b/src/books/3/fonts/segoepr.ttf differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/300dpi/11.png b/src/books/3/paginas/1_adultos_1_hijos/300dpi/11.png new file mode 100644 index 0000000..90b987a Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/300dpi/11.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/300dpi/13.png b/src/books/3/paginas/1_adultos_1_hijos/300dpi/13.png new file mode 100644 index 0000000..e8c74db Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/300dpi/13.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/300dpi/14.png b/src/books/3/paginas/1_adultos_1_hijos/300dpi/14.png new file mode 100644 index 0000000..06c6598 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/300dpi/14.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/300dpi/15.png b/src/books/3/paginas/1_adultos_1_hijos/300dpi/15.png new file mode 100644 index 0000000..834604e Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/300dpi/15.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/300dpi/16.png b/src/books/3/paginas/1_adultos_1_hijos/300dpi/16.png new file mode 100644 index 0000000..2a88b4d Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/300dpi/16.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/300dpi/18.png b/src/books/3/paginas/1_adultos_1_hijos/300dpi/18.png new file mode 100644 index 0000000..4c57d77 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/300dpi/18.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/300dpi/19.png b/src/books/3/paginas/1_adultos_1_hijos/300dpi/19.png new file mode 100644 index 0000000..d75b545 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/300dpi/19.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/300dpi/22.png b/src/books/3/paginas/1_adultos_1_hijos/300dpi/22.png new file mode 100644 index 0000000..8adb647 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/300dpi/22.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/300dpi/24.png b/src/books/3/paginas/1_adultos_1_hijos/300dpi/24.png new file mode 100644 index 0000000..4c82e7e Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/300dpi/24.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/300dpi/25.png b/src/books/3/paginas/1_adultos_1_hijos/300dpi/25.png new file mode 100644 index 0000000..0f71c3f Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/300dpi/25.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/300dpi/26.png b/src/books/3/paginas/1_adultos_1_hijos/300dpi/26.png new file mode 100644 index 0000000..e5473be Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/300dpi/26.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/300dpi/27.png b/src/books/3/paginas/1_adultos_1_hijos/300dpi/27.png new file mode 100644 index 0000000..ea36c38 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/300dpi/27.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/300dpi/28.png b/src/books/3/paginas/1_adultos_1_hijos/300dpi/28.png new file mode 100644 index 0000000..610715f Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/300dpi/28.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/300dpi/29.png b/src/books/3/paginas/1_adultos_1_hijos/300dpi/29.png new file mode 100644 index 0000000..422aa05 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/300dpi/29.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/300dpi/33.png b/src/books/3/paginas/1_adultos_1_hijos/300dpi/33.png new file mode 100644 index 0000000..53f6828 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/300dpi/33.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/300dpi/35.png b/src/books/3/paginas/1_adultos_1_hijos/300dpi/35.png new file mode 100644 index 0000000..d545bd6 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/300dpi/35.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/300dpi/8.png b/src/books/3/paginas/1_adultos_1_hijos/300dpi/8.png new file mode 100644 index 0000000..49a8957 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/300dpi/8.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/300dpi/9.png b/src/books/3/paginas/1_adultos_1_hijos/300dpi/9.png new file mode 100644 index 0000000..fd2a691 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/300dpi/9.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/300dpi/cover.png b/src/books/3/paginas/1_adultos_1_hijos/300dpi/cover.png new file mode 100644 index 0000000..5ac4ed9 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/300dpi/cover.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/300dpi/z_1_adultos_1_hijos.png b/src/books/3/paginas/1_adultos_1_hijos/300dpi/z_1_adultos_1_hijos.png new file mode 100644 index 0000000..61d6eee Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/300dpi/z_1_adultos_1_hijos.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/0.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/0.png new file mode 100644 index 0000000..62c672e Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/0.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/10.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/10.png new file mode 100644 index 0000000..f5e3b08 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/10.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/11.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/11.png new file mode 100644 index 0000000..32fd620 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/11.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/12.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/12.png new file mode 100644 index 0000000..55187be Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/12.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/13.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/13.png new file mode 100644 index 0000000..7a84afe Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/13.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/14.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/14.png new file mode 100644 index 0000000..eab58be Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/14.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/15.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/15.png new file mode 100644 index 0000000..324358b Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/15.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/16.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/16.png new file mode 100644 index 0000000..38b7881 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/16.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/17.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/17.png new file mode 100644 index 0000000..ba90daa Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/17.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/18.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/18.png new file mode 100644 index 0000000..1129442 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/18.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/19.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/19.png new file mode 100644 index 0000000..ae4c4b7 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/19.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/20.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/20.png new file mode 100644 index 0000000..873c673 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/20.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/21.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/21.png new file mode 100644 index 0000000..7cb082b Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/21.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/22.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/22.png new file mode 100644 index 0000000..90458c9 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/22.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/23.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/23.png new file mode 100644 index 0000000..fd148d0 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/23.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/24.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/24.png new file mode 100644 index 0000000..9d17906 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/24.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/25.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/25.png new file mode 100644 index 0000000..0a38581 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/25.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/26.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/26.png new file mode 100644 index 0000000..5c5f2c9 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/26.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/27.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/27.png new file mode 100644 index 0000000..c908ae8 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/27.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/28.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/28.png new file mode 100644 index 0000000..8075818 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/28.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/29.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/29.png new file mode 100644 index 0000000..5402824 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/29.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/30.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/30.png new file mode 100644 index 0000000..5c0d6e9 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/30.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/31.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/31.png new file mode 100644 index 0000000..2aab9ed Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/31.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/32.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/32.png new file mode 100644 index 0000000..a85954c Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/32.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/33.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/33.png new file mode 100644 index 0000000..155826f Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/33.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/34.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/34.png new file mode 100644 index 0000000..232e74b Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/34.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/35.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/35.png new file mode 100644 index 0000000..3bdcdd1 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/35.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/37.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/37.png new file mode 100644 index 0000000..daa0f6e Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/37.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/39.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/39.png new file mode 100644 index 0000000..73b1203 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/39.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/4_1.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/4_1.png new file mode 100644 index 0000000..5ffde36 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/4_1.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/5.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/5.png new file mode 100644 index 0000000..1d1c325 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/5.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/6.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/6.png new file mode 100644 index 0000000..2be0e7b Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/6.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/7.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/7.png new file mode 100644 index 0000000..c37071c Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/7.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/8.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/8.png new file mode 100644 index 0000000..b8c5843 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/8.png differ diff --git a/src/books/3/paginas/1_adultos_1_hijos/72dpi/9.png b/src/books/3/paginas/1_adultos_1_hijos/72dpi/9.png new file mode 100644 index 0000000..7cfdbc5 Binary files /dev/null and b/src/books/3/paginas/1_adultos_1_hijos/72dpi/9.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/300dpi/11.png b/src/books/3/paginas/1_adultos_2_hijos/300dpi/11.png new file mode 100644 index 0000000..9c418bb Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/300dpi/11.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/300dpi/13.png b/src/books/3/paginas/1_adultos_2_hijos/300dpi/13.png new file mode 100644 index 0000000..f35943e Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/300dpi/13.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/300dpi/15.png b/src/books/3/paginas/1_adultos_2_hijos/300dpi/15.png new file mode 100644 index 0000000..e0ae8e6 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/300dpi/15.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/300dpi/16.png b/src/books/3/paginas/1_adultos_2_hijos/300dpi/16.png new file mode 100644 index 0000000..03e01f5 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/300dpi/16.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/300dpi/17.png b/src/books/3/paginas/1_adultos_2_hijos/300dpi/17.png new file mode 100644 index 0000000..ecb8231 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/300dpi/17.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/300dpi/18.png b/src/books/3/paginas/1_adultos_2_hijos/300dpi/18.png new file mode 100644 index 0000000..d1b89da Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/300dpi/18.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/300dpi/19.png b/src/books/3/paginas/1_adultos_2_hijos/300dpi/19.png new file mode 100644 index 0000000..f552116 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/300dpi/19.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/300dpi/22.png b/src/books/3/paginas/1_adultos_2_hijos/300dpi/22.png new file mode 100644 index 0000000..77ee1dc Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/300dpi/22.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/300dpi/25.png b/src/books/3/paginas/1_adultos_2_hijos/300dpi/25.png new file mode 100644 index 0000000..ff2927d Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/300dpi/25.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/300dpi/27.png b/src/books/3/paginas/1_adultos_2_hijos/300dpi/27.png new file mode 100644 index 0000000..8f61090 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/300dpi/27.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/300dpi/29.png b/src/books/3/paginas/1_adultos_2_hijos/300dpi/29.png new file mode 100644 index 0000000..02f97d7 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/300dpi/29.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/300dpi/31.png b/src/books/3/paginas/1_adultos_2_hijos/300dpi/31.png new file mode 100644 index 0000000..1332272 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/300dpi/31.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/300dpi/33.png b/src/books/3/paginas/1_adultos_2_hijos/300dpi/33.png new file mode 100644 index 0000000..4f6eaf6 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/300dpi/33.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/300dpi/35.png b/src/books/3/paginas/1_adultos_2_hijos/300dpi/35.png new file mode 100644 index 0000000..b480034 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/300dpi/35.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/300dpi/4_1 - copia.png b/src/books/3/paginas/1_adultos_2_hijos/300dpi/4_1 - copia.png new file mode 100644 index 0000000..d04b85a Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/300dpi/4_1 - copia.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/300dpi/5.png b/src/books/3/paginas/1_adultos_2_hijos/300dpi/5.png new file mode 100644 index 0000000..f83dc19 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/300dpi/5.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/300dpi/cover.png b/src/books/3/paginas/1_adultos_2_hijos/300dpi/cover.png new file mode 100644 index 0000000..026bfb6 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/300dpi/cover.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/300dpi/z_1_adultos_2_hijos.png b/src/books/3/paginas/1_adultos_2_hijos/300dpi/z_1_adultos_2_hijos.png new file mode 100644 index 0000000..40325e4 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/300dpi/z_1_adultos_2_hijos.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/0.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/0.png new file mode 100644 index 0000000..b395b13 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/0.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/10.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/10.png new file mode 100644 index 0000000..70298aa Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/10.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/11.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/11.png new file mode 100644 index 0000000..2a98861 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/11.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/12.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/12.png new file mode 100644 index 0000000..269ff1a Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/12.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/13.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/13.png new file mode 100644 index 0000000..df62390 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/13.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/14.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/14.png new file mode 100644 index 0000000..bb4cd62 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/14.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/15.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/15.png new file mode 100644 index 0000000..3877207 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/15.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/16.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/16.png new file mode 100644 index 0000000..8f77455 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/16.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/17.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/17.png new file mode 100644 index 0000000..2646de7 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/17.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/18.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/18.png new file mode 100644 index 0000000..97fa6a4 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/18.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/19.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/19.png new file mode 100644 index 0000000..fae9e8c Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/19.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/20.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/20.png new file mode 100644 index 0000000..522e040 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/20.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/21.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/21.png new file mode 100644 index 0000000..f13d029 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/21.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/22.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/22.png new file mode 100644 index 0000000..7075e9d Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/22.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/23.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/23.png new file mode 100644 index 0000000..8eae280 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/23.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/24.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/24.png new file mode 100644 index 0000000..638ae1d Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/24.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/25.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/25.png new file mode 100644 index 0000000..17a5528 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/25.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/26.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/26.png new file mode 100644 index 0000000..964cafb Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/26.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/27.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/27.png new file mode 100644 index 0000000..d7923f3 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/27.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/28.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/28.png new file mode 100644 index 0000000..fb06228 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/28.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/29.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/29.png new file mode 100644 index 0000000..6ec0b6b Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/29.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/30.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/30.png new file mode 100644 index 0000000..34116fc Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/30.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/31.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/31.png new file mode 100644 index 0000000..fa8d2a1 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/31.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/32.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/32.png new file mode 100644 index 0000000..f045491 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/32.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/33.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/33.png new file mode 100644 index 0000000..7b52022 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/33.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/34.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/34.png new file mode 100644 index 0000000..c518acf Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/34.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/35.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/35.png new file mode 100644 index 0000000..a417924 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/35.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/5.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/5.png new file mode 100644 index 0000000..d732342 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/5.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/6.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/6.png new file mode 100644 index 0000000..7844e72 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/6.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/7.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/7.png new file mode 100644 index 0000000..dfe04b3 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/7.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/8.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/8.png new file mode 100644 index 0000000..2e00630 Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/8.png differ diff --git a/src/books/3/paginas/1_adultos_2_hijos/72dpi/9.png b/src/books/3/paginas/1_adultos_2_hijos/72dpi/9.png new file mode 100644 index 0000000..88d4a2d Binary files /dev/null and b/src/books/3/paginas/1_adultos_2_hijos/72dpi/9.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/300dpi/11.png b/src/books/3/paginas/1_adultos_3_hijos/300dpi/11.png new file mode 100644 index 0000000..d5cc933 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/300dpi/11.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/300dpi/12.png b/src/books/3/paginas/1_adultos_3_hijos/300dpi/12.png new file mode 100644 index 0000000..e539574 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/300dpi/12.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/300dpi/14.png b/src/books/3/paginas/1_adultos_3_hijos/300dpi/14.png new file mode 100644 index 0000000..bebe5f9 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/300dpi/14.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/300dpi/16.png b/src/books/3/paginas/1_adultos_3_hijos/300dpi/16.png new file mode 100644 index 0000000..1a85119 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/300dpi/16.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/300dpi/19.png b/src/books/3/paginas/1_adultos_3_hijos/300dpi/19.png new file mode 100644 index 0000000..9a3b15d Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/300dpi/19.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/300dpi/22.png b/src/books/3/paginas/1_adultos_3_hijos/300dpi/22.png new file mode 100644 index 0000000..61f583c Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/300dpi/22.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/300dpi/25.png b/src/books/3/paginas/1_adultos_3_hijos/300dpi/25.png new file mode 100644 index 0000000..3f9c643 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/300dpi/25.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/300dpi/28.png b/src/books/3/paginas/1_adultos_3_hijos/300dpi/28.png new file mode 100644 index 0000000..8d72385 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/300dpi/28.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/300dpi/29.png b/src/books/3/paginas/1_adultos_3_hijos/300dpi/29.png new file mode 100644 index 0000000..db1051d Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/300dpi/29.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/300dpi/30.png b/src/books/3/paginas/1_adultos_3_hijos/300dpi/30.png new file mode 100644 index 0000000..3dc4c8b Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/300dpi/30.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/300dpi/31.png b/src/books/3/paginas/1_adultos_3_hijos/300dpi/31.png new file mode 100644 index 0000000..f7bca23 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/300dpi/31.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/300dpi/33.png b/src/books/3/paginas/1_adultos_3_hijos/300dpi/33.png new file mode 100644 index 0000000..8575b7f Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/300dpi/33.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/300dpi/35.png b/src/books/3/paginas/1_adultos_3_hijos/300dpi/35.png new file mode 100644 index 0000000..6de92a1 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/300dpi/35.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/300dpi/7.png b/src/books/3/paginas/1_adultos_3_hijos/300dpi/7.png new file mode 100644 index 0000000..94a2861 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/300dpi/7.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/300dpi/cover.png b/src/books/3/paginas/1_adultos_3_hijos/300dpi/cover.png new file mode 100644 index 0000000..dd45af2 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/300dpi/cover.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/0.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/0.png new file mode 100644 index 0000000..1f55fcb Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/0.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/10.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/10.png new file mode 100644 index 0000000..dd618ce Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/10.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/11.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/11.png new file mode 100644 index 0000000..f1e635d Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/11.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/12.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/12.png new file mode 100644 index 0000000..e2cca91 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/12.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/13.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/13.png new file mode 100644 index 0000000..826513e Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/13.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/14.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/14.png new file mode 100644 index 0000000..61ffce0 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/14.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/15.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/15.png new file mode 100644 index 0000000..5729a3e Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/15.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/16.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/16.png new file mode 100644 index 0000000..51a1580 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/16.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/17.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/17.png new file mode 100644 index 0000000..b19e44d Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/17.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/18.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/18.png new file mode 100644 index 0000000..2f75d9a Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/18.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/19.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/19.png new file mode 100644 index 0000000..de39940 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/19.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/20.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/20.png new file mode 100644 index 0000000..3aea849 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/20.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/21.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/21.png new file mode 100644 index 0000000..d0549a5 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/21.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/22.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/22.png new file mode 100644 index 0000000..9039715 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/22.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/23.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/23.png new file mode 100644 index 0000000..7db5de6 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/23.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/24.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/24.png new file mode 100644 index 0000000..b454824 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/24.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/25.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/25.png new file mode 100644 index 0000000..4dd9f99 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/25.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/26.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/26.png new file mode 100644 index 0000000..dfce824 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/26.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/27.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/27.png new file mode 100644 index 0000000..b011f31 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/27.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/28.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/28.png new file mode 100644 index 0000000..2d9ee3e Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/28.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/29.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/29.png new file mode 100644 index 0000000..54cff35 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/29.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/3.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/3.png new file mode 100644 index 0000000..df8f31e Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/3.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/30.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/30.png new file mode 100644 index 0000000..d2dad1b Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/30.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/31.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/31.png new file mode 100644 index 0000000..ba181f6 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/31.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/32.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/32.png new file mode 100644 index 0000000..b88a0b5 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/32.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/33.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/33.png new file mode 100644 index 0000000..063b942 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/33.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/34.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/34.png new file mode 100644 index 0000000..388bd54 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/34.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/35.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/35.png new file mode 100644 index 0000000..bdfd578 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/35.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/36.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/36.png new file mode 100644 index 0000000..fdd7f26 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/36.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/38.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/38.png new file mode 100644 index 0000000..6f10cdd Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/38.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/4.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/4.png new file mode 100644 index 0000000..7770503 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/4.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/4_2.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/4_2.png new file mode 100644 index 0000000..5b66d76 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/4_2.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/5.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/5.png new file mode 100644 index 0000000..4620bf5 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/5.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/6.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/6.png new file mode 100644 index 0000000..0f8098d Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/6.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/7.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/7.png new file mode 100644 index 0000000..0e84510 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/7.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/8.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/8.png new file mode 100644 index 0000000..67bdde3 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/8.png differ diff --git a/src/books/3/paginas/1_adultos_3_hijos/72dpi/9.png b/src/books/3/paginas/1_adultos_3_hijos/72dpi/9.png new file mode 100644 index 0000000..d0d39c5 Binary files /dev/null and b/src/books/3/paginas/1_adultos_3_hijos/72dpi/9.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/300dpi/30.png b/src/books/3/paginas/2_adultos_1_hijos/300dpi/30.png new file mode 100644 index 0000000..64345a8 Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/300dpi/30.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/300dpi/31.png b/src/books/3/paginas/2_adultos_1_hijos/300dpi/31.png new file mode 100644 index 0000000..d10bee3 Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/300dpi/31.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/300dpi/32.png b/src/books/3/paginas/2_adultos_1_hijos/300dpi/32.png new file mode 100644 index 0000000..c0c4c9d Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/300dpi/32.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/300dpi/33.png b/src/books/3/paginas/2_adultos_1_hijos/300dpi/33.png new file mode 100644 index 0000000..fcaf225 Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/300dpi/33.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/300dpi/35.png b/src/books/3/paginas/2_adultos_1_hijos/300dpi/35.png new file mode 100644 index 0000000..f5591a9 Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/300dpi/35.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/300dpi/5.png b/src/books/3/paginas/2_adultos_1_hijos/300dpi/5.png new file mode 100644 index 0000000..545a363 Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/300dpi/5.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/300dpi/7.png b/src/books/3/paginas/2_adultos_1_hijos/300dpi/7.png new file mode 100644 index 0000000..51a12d6 Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/300dpi/7.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/300dpi/cover.png b/src/books/3/paginas/2_adultos_1_hijos/300dpi/cover.png new file mode 100644 index 0000000..fb24bab Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/300dpi/cover.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/300dpi/z_2_adultos_1_hijos.png b/src/books/3/paginas/2_adultos_1_hijos/300dpi/z_2_adultos_1_hijos.png new file mode 100644 index 0000000..53e53d0 Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/300dpi/z_2_adultos_1_hijos.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/0.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/0.png new file mode 100644 index 0000000..4632496 Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/0.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/10.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/10.png new file mode 100644 index 0000000..7ffa18d Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/10.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/11.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/11.png new file mode 100644 index 0000000..43603e7 Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/11.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/12.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/12.png new file mode 100644 index 0000000..74e93cb Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/12.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/13.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/13.png new file mode 100644 index 0000000..bfa35ef Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/13.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/14.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/14.png new file mode 100644 index 0000000..6d295e7 Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/14.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/15.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/15.png new file mode 100644 index 0000000..585ee45 Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/15.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/16.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/16.png new file mode 100644 index 0000000..e0cedab Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/16.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/17.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/17.png new file mode 100644 index 0000000..566e080 Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/17.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/18.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/18.png new file mode 100644 index 0000000..1b6cf6d Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/18.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/19.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/19.png new file mode 100644 index 0000000..f97062a Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/19.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/20.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/20.png new file mode 100644 index 0000000..7a2d61c Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/20.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/21.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/21.png new file mode 100644 index 0000000..05febaa Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/21.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/22.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/22.png new file mode 100644 index 0000000..23e5474 Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/22.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/23.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/23.png new file mode 100644 index 0000000..90ab22c Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/23.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/24.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/24.png new file mode 100644 index 0000000..6b67876 Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/24.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/25.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/25.png new file mode 100644 index 0000000..e18eae3 Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/25.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/26.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/26.png new file mode 100644 index 0000000..5e979cd Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/26.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/27.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/27.png new file mode 100644 index 0000000..7193d41 Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/27.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/28.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/28.png new file mode 100644 index 0000000..b5fed72 Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/28.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/29.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/29.png new file mode 100644 index 0000000..79fec6f Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/29.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/30.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/30.png new file mode 100644 index 0000000..e80e6ff Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/30.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/31.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/31.png new file mode 100644 index 0000000..707ac81 Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/31.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/32.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/32.png new file mode 100644 index 0000000..c7d5bb4 Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/32.png differ diff --git a/src/books/3/paginas/2_adultos_1_hijos/72dpi/33.png b/src/books/3/paginas/2_adultos_1_hijos/72dpi/33.png new file mode 100644 index 0000000..3185a06 Binary files /dev/null and b/src/books/3/paginas/2_adultos_1_hijos/72dpi/33.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/10.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/10.png new file mode 100644 index 0000000..3c61298 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/10.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/11.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/11.png new file mode 100644 index 0000000..4c7be9a Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/11.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/14.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/14.png new file mode 100644 index 0000000..fdc1270 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/14.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/15.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/15.png new file mode 100644 index 0000000..fbde58d Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/15.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/16.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/16.png new file mode 100644 index 0000000..ff235fa Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/16.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/19.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/19.png new file mode 100644 index 0000000..32a5bd4 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/19.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/20.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/20.png new file mode 100644 index 0000000..1359062 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/20.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/21.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/21.png new file mode 100644 index 0000000..10270e5 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/21.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/22.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/22.png new file mode 100644 index 0000000..cd984c0 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/22.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/23.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/23.png new file mode 100644 index 0000000..11a5a39 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/23.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/25.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/25.png new file mode 100644 index 0000000..f8f9e2f Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/25.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/28.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/28.png new file mode 100644 index 0000000..7100366 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/28.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/29.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/29.png new file mode 100644 index 0000000..7dd62f7 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/29.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/31.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/31.png new file mode 100644 index 0000000..347eab2 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/31.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/32.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/32.png new file mode 100644 index 0000000..d69358b Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/32.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/33.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/33.png new file mode 100644 index 0000000..5e2b659 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/33.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/34.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/34.png new file mode 100644 index 0000000..6b36ca3 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/34.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/35.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/35.png new file mode 100644 index 0000000..a7b0e2e Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/35.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/4_1.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/4_1.png new file mode 100644 index 0000000..7245ffe Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/4_1.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/4_2.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/4_2.png new file mode 100644 index 0000000..e116be8 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/4_2.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/6.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/6.png new file mode 100644 index 0000000..ccb89ed Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/6.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/8.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/8.png new file mode 100644 index 0000000..1800a4c Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/8.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/9.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/9.png new file mode 100644 index 0000000..6493f5e Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/9.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/cover.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/cover.png new file mode 100644 index 0000000..de82331 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/cover.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/300dpi/z_2_adultos_2_hijos.png b/src/books/3/paginas/2_adultos_2_hijos/300dpi/z_2_adultos_2_hijos.png new file mode 100644 index 0000000..800a700 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/300dpi/z_2_adultos_2_hijos.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/0.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/0.png new file mode 100644 index 0000000..a66342d Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/0.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/10.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/10.png new file mode 100644 index 0000000..7068151 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/10.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/11.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/11.png new file mode 100644 index 0000000..7a983d3 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/11.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/12.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/12.png new file mode 100644 index 0000000..7a0e144 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/12.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/13.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/13.png new file mode 100644 index 0000000..d58d2dc Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/13.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/14.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/14.png new file mode 100644 index 0000000..0b7ccad Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/14.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/15.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/15.png new file mode 100644 index 0000000..25d1c4a Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/15.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/16.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/16.png new file mode 100644 index 0000000..45b9bbc Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/16.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/17.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/17.png new file mode 100644 index 0000000..429a432 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/17.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/18.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/18.png new file mode 100644 index 0000000..d08fbfa Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/18.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/19.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/19.png new file mode 100644 index 0000000..4f91791 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/19.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/20.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/20.png new file mode 100644 index 0000000..5386024 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/20.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/21.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/21.png new file mode 100644 index 0000000..98d1e6d Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/21.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/22.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/22.png new file mode 100644 index 0000000..86af046 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/22.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/23.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/23.png new file mode 100644 index 0000000..03de46d Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/23.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/24.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/24.png new file mode 100644 index 0000000..e51fdd6 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/24.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/25.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/25.png new file mode 100644 index 0000000..6d59310 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/25.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/26.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/26.png new file mode 100644 index 0000000..1829e7b Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/26.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/27.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/27.png new file mode 100644 index 0000000..538c6a0 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/27.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/28.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/28.png new file mode 100644 index 0000000..f4ed3c4 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/28.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/29.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/29.png new file mode 100644 index 0000000..32398ad Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/29.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/30.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/30.png new file mode 100644 index 0000000..9db3bf6 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/30.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/31.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/31.png new file mode 100644 index 0000000..bd5225f Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/31.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/32.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/32.png new file mode 100644 index 0000000..f6d57b7 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/32.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/33.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/33.png new file mode 100644 index 0000000..63f7534 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/33.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/34.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/34.png new file mode 100644 index 0000000..6d5da28 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/34.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/35.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/35.png new file mode 100644 index 0000000..acfe97b Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/35.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/5.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/5.png new file mode 100644 index 0000000..7af1f3b Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/5.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/6.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/6.png new file mode 100644 index 0000000..d817b01 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/6.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/7.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/7.png new file mode 100644 index 0000000..703f020 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/7.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/8.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/8.png new file mode 100644 index 0000000..3452f89 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/8.png differ diff --git a/src/books/3/paginas/2_adultos_2_hijos/72dpi/9.png b/src/books/3/paginas/2_adultos_2_hijos/72dpi/9.png new file mode 100644 index 0000000..4516e69 Binary files /dev/null and b/src/books/3/paginas/2_adultos_2_hijos/72dpi/9.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/300dpi/11.png b/src/books/3/paginas/2_adultos_3_hijos/300dpi/11.png new file mode 100644 index 0000000..024aa0d Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/300dpi/11.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/300dpi/14.png b/src/books/3/paginas/2_adultos_3_hijos/300dpi/14.png new file mode 100644 index 0000000..06b147e Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/300dpi/14.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/300dpi/15.png b/src/books/3/paginas/2_adultos_3_hijos/300dpi/15.png new file mode 100644 index 0000000..5dfdb0b Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/300dpi/15.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/300dpi/16.png b/src/books/3/paginas/2_adultos_3_hijos/300dpi/16.png new file mode 100644 index 0000000..375ac52 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/300dpi/16.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/300dpi/18.png b/src/books/3/paginas/2_adultos_3_hijos/300dpi/18.png new file mode 100644 index 0000000..5235da4 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/300dpi/18.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/300dpi/19.png b/src/books/3/paginas/2_adultos_3_hijos/300dpi/19.png new file mode 100644 index 0000000..e667b17 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/300dpi/19.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/300dpi/22.png b/src/books/3/paginas/2_adultos_3_hijos/300dpi/22.png new file mode 100644 index 0000000..1a37be7 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/300dpi/22.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/300dpi/25.png b/src/books/3/paginas/2_adultos_3_hijos/300dpi/25.png new file mode 100644 index 0000000..fa38141 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/300dpi/25.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/300dpi/28.png b/src/books/3/paginas/2_adultos_3_hijos/300dpi/28.png new file mode 100644 index 0000000..71c7072 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/300dpi/28.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/300dpi/29.png b/src/books/3/paginas/2_adultos_3_hijos/300dpi/29.png new file mode 100644 index 0000000..6182ef0 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/300dpi/29.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/300dpi/31.png b/src/books/3/paginas/2_adultos_3_hijos/300dpi/31.png new file mode 100644 index 0000000..104ce0c Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/300dpi/31.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/300dpi/32.png b/src/books/3/paginas/2_adultos_3_hijos/300dpi/32.png new file mode 100644 index 0000000..46b03c9 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/300dpi/32.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/300dpi/33.png b/src/books/3/paginas/2_adultos_3_hijos/300dpi/33.png new file mode 100644 index 0000000..4bc0736 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/300dpi/33.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/300dpi/35.png b/src/books/3/paginas/2_adultos_3_hijos/300dpi/35.png new file mode 100644 index 0000000..efcba9c Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/300dpi/35.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/300dpi/5.png b/src/books/3/paginas/2_adultos_3_hijos/300dpi/5.png new file mode 100644 index 0000000..ef36770 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/300dpi/5.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/300dpi/8.png b/src/books/3/paginas/2_adultos_3_hijos/300dpi/8.png new file mode 100644 index 0000000..6d8d97e Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/300dpi/8.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/300dpi/9.png b/src/books/3/paginas/2_adultos_3_hijos/300dpi/9.png new file mode 100644 index 0000000..d44c341 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/300dpi/9.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/300dpi/cover.png b/src/books/3/paginas/2_adultos_3_hijos/300dpi/cover.png new file mode 100644 index 0000000..ee6218e Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/300dpi/cover.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/300dpi/z_2_adultos_3_hijos.png b/src/books/3/paginas/2_adultos_3_hijos/300dpi/z_2_adultos_3_hijos.png new file mode 100644 index 0000000..fef20d2 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/300dpi/z_2_adultos_3_hijos.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/0.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/0.png new file mode 100644 index 0000000..c4628a4 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/0.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/1.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/1.png new file mode 100644 index 0000000..b8366b7 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/1.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/10.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/10.png new file mode 100644 index 0000000..4e86747 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/10.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/11.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/11.png new file mode 100644 index 0000000..d12cd5e Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/11.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/12.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/12.png new file mode 100644 index 0000000..dc4cc7b Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/12.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/13.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/13.png new file mode 100644 index 0000000..0346562 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/13.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/14.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/14.png new file mode 100644 index 0000000..10eb81e Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/14.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/15.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/15.png new file mode 100644 index 0000000..1000e6e Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/15.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/16.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/16.png new file mode 100644 index 0000000..43916fa Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/16.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/17.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/17.png new file mode 100644 index 0000000..c2d71d5 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/17.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/18.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/18.png new file mode 100644 index 0000000..16ed8cb Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/18.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/19.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/19.png new file mode 100644 index 0000000..f628f47 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/19.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/2.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/2.png new file mode 100644 index 0000000..7cef719 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/2.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/20.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/20.png new file mode 100644 index 0000000..7f8207d Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/20.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/21.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/21.png new file mode 100644 index 0000000..c7c79ef Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/21.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/22.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/22.png new file mode 100644 index 0000000..149f6b6 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/22.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/23.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/23.png new file mode 100644 index 0000000..717a5a7 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/23.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/24.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/24.png new file mode 100644 index 0000000..a2fdb4f Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/24.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/25.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/25.png new file mode 100644 index 0000000..3854c9d Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/25.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/26.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/26.png new file mode 100644 index 0000000..8d3f750 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/26.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/27.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/27.png new file mode 100644 index 0000000..228fa67 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/27.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/28.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/28.png new file mode 100644 index 0000000..22c0270 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/28.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/29.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/29.png new file mode 100644 index 0000000..2aa1654 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/29.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/30.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/30.png new file mode 100644 index 0000000..c54dbb5 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/30.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/32.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/32.png new file mode 100644 index 0000000..8aa6e37 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/32.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/33.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/33.png new file mode 100644 index 0000000..a94b041 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/33.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/34.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/34.png new file mode 100644 index 0000000..0cc010c Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/34.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/35.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/35.png new file mode 100644 index 0000000..f1190cc Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/35.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/5.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/5.png new file mode 100644 index 0000000..e26a4c8 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/5.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/6.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/6.png new file mode 100644 index 0000000..3f17501 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/6.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/7.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/7.png new file mode 100644 index 0000000..ebd37a1 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/7.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/8.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/8.png new file mode 100644 index 0000000..ebc8c67 Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/8.png differ diff --git a/src/books/3/paginas/2_adultos_3_hijos/72dpi/9.png b/src/books/3/paginas/2_adultos_3_hijos/72dpi/9.png new file mode 100644 index 0000000..f3b88ab Binary files /dev/null and b/src/books/3/paginas/2_adultos_3_hijos/72dpi/9.png differ diff --git a/src/books/3/paginas/guardas/trasto_navidad_guardas_delanteras.pdf b/src/books/3/paginas/guardas/trasto_navidad_guardas_delanteras.pdf new file mode 100644 index 0000000..e55fd24 Binary files /dev/null and b/src/books/3/paginas/guardas/trasto_navidad_guardas_delanteras.pdf differ diff --git a/src/books/3/paginas/guardas/trasto_navidad_guardas_traseras.pdf b/src/books/3/paginas/guardas/trasto_navidad_guardas_traseras.pdf new file mode 100644 index 0000000..2b3c070 Binary files /dev/null and b/src/books/3/paginas/guardas/trasto_navidad_guardas_traseras.pdf differ diff --git a/src/books/4/config/config.json b/src/books/4/config/config.json new file mode 100644 index 0000000..c260a11 --- /dev/null +++ b/src/books/4/config/config.json @@ -0,0 +1,191 @@ +{ + "book_id": 4, + "settings": { + "dpi": 300, + "fonts": { + "main": "Mali-Bold.ttf", + "secondary": "Calibri.ttf" + }, + "base_font_size": 140, + "colors": { + "black": "#000000", + "white": "#FFFFFF", + "title": "#D82746", + "number": "#66C3D0" + } + }, + "user_photo": { + "width": 300, + "height": 300 + }, + "pages": [ + { + "page_id": 0, + "description": "Portada", + "elements": [ + { + "type": "photo", + "x": 3392, + "y": 1275 + }, + { + "type": "text", + "x": 1135, + "y": -895, + "text": { "es": "{{name}}", "en": "{{name}}", "ca": "{{article}}{{name}}" } + }, + { + "type": "text", + "x": 1135, + "y": -685, + "text": { "es": "Y LOS NÚMEROS", "en": "AND THE NUMBERS", "ca": "I ELS NOMBRES" }, + "style": { "size": 145, "color": "title" } + }, + { + "type": "text", + "x": 1135, + "y": 1005, + "text": { "es": "ILUSTRACIÓN: INMA BAÑEGIL LOZANO", "en": "ILLUSTRATION: INMA BAÑEGIL LOZANO", "ca": "IL·LUSTRACIÓ: INMA BAÑEGIL LOZANO" }, + "style": { "size": 50, "color": "white" } + } + ] + }, + { + "page_id": 1, + "description": "Créditos y Dedicatoria", + "defaults": { "style": { "size": 45, "gravity": "WEST", "font": "secondary" } }, + "elements": [ + { "type": "text", "x": 170, "y": 80, "text": { "es": "Dirección, edición y producción: Cuentos con fotos, S.L.", "en": "Direction, editing and production: Cuentos con fotos, S.L.", "ca": "Direcció, edició i producció: Cuentos con fotos, S.L." } }, + { "type": "text", "x": 170, "y": 140, "text": { "es": "Escrito e ilustrado por: Inma Bañegil Lozano.", "en": "Written and illustrated by Inma Bañegil Lozano.", "ca": "Escrit i Il·lustrat per Inma Bañegil Lozano." } }, + { "type": "text", "x": 170, "y": 240, "text": { "es": "La propiedad intelectual de los textos, las ilustraciones y la edición 2020: Cuentos con fotos, S.L", "en": "Intellectual property of the texts, illustrations and the 2021 edition: Cuentos con fotos, S.L.", "ca": "La propietat intel·lectual dels textos, les il·lustracions i l’edició 2021: Cuentos con fotos, S.L." } }, + { "type": "text", "x": 170, "y": 340, "text": { "es": "Todos los derechos reservados. Ninguna parte de esta publicación puede ser reproducida, almacenada en", "en": "All rights reserved. No part of this publication may be reproduced, stored in", "ca": "Tots els drets reservats. Cap part d’aquesta publicació es pot reproduir, emmagatzemar en" } }, + { "type": "text", "x": 170, "y": 400, "text": { "es": "un sistema de extracción electrónica ni transmitida de manera alguna ni por ningún medio sin el", "en": "an electronic extraction system, or transmitted in any way, or by any means, without", "ca": "un sistema d’extracció electrònica ni transmetre de cap manera ni per cap mitjà sense el" } }, + { "type": "text", "x": 170, "y": 460, "text": { "es": "consentimiento previo por escrito del titular de la propiedad intelectual.", "en": "the prior, written consent of the owner of the intellectual property.", "ca": "consentiment previ per escrit del titular de la propietat intel·lectual." } }, + { "type": "text", "x": 170, "y": 560, "text": { "es": "El cliente se hace responsable del contenido de las imágenes que sube a nuestra web para la elaboración del", "en": "The client is responsible for the content of the images that he uploads to our website for the preparation of", "ca": "El client es fa responsable del contingut de les imatges que puja al nostre web per elaborar el" } }, + { "type": "text", "x": 170, "y": 620, "text": { "es": "libro y declara que es el único titular de todos los derechos que existen, bien sea por ser el tutor legal del", "en": "the book and declares that he is the sole owner of all the rights that exist, either because he is the legal guardian", "ca": "llibre i declara que és l’únic titular de tots els drets que existeixen, en ser el tutor legal del" } }, + { "type": "text", "x": 170, "y": 680, "text": { "es": "menor o por tener la autorización expresa por escrito de un tercero, sobre las fotografías contenidas en el", "en": "of the minor, or has express, written authorization from a third party to the photographs contained", "ca": "menor o en tenir l’autorització expressa per escrit d’un tercer, sobre les fotografies que conté." } }, + { "type": "text", "x": 170, "y": 740, "text": { "es": "presente libro. Igualmente, el cliente se compromete a no utilizar en la elaboración del libro, fotografías ni", "en": "in this book. Likewise, the client agrees not to use, in the preparation of the book, photographs or", "ca": "Igualment, el client es compromet a no fer servir per elaborar el llibre fotografies ni textos amb" } }, + { "type": "text", "x": 170, "y": 800, "text": { "es": "textos que contengan contenido insultante, violento, pornográfico, discriminatorio que puedan perjudicar a", "en": "texts that contain any insulting, violent, pornographic, or discriminatory content that may violate", "ca": "contingut insultant, violent, pornogràfic o discriminatori que puguin perjudicar els drets de la" } }, + { "type": "text", "x": 170, "y": 860, "text": { "es": "los derechos de la infancia o que pueda dañar su propia imagen o la de cualquier otra persona representada", "en": "the rights of children or that may do damage to their own image or that of any other person appearing", "ca": "infància o danyar la seva pròpia imatge o la de qualsevol altra persona representada en les fotografies." } }, + { "type": "text", "x": 170, "y": 920, "text": { "es": "en las fotografías. Cuentos con fotos, S.L queda exonerada de cualquier tipo de responsabilidad al respecto.", "en": "in the photographs. Cuentos con fotos S.L. waives any type of responsibility in this regard.", "ca": "Cuentos con fotos, S.L. queda exonerada de qualsevol tipus de responsabilitat en aquest sentit." } }, + { + "type": "text", + "x": 1063, + "y": 500, + "text": { "es": "{{dedication}}", "en": "{{dedication}}", "ca": "{{dedication}}" }, + "style": { "size": 80, "gravity": "CENTER", "font": "main" } + } + ] + }, + { + "page_id": 2, + "description": "1 Tiburón", + "elements": [ + { "type": "photo", "x": 1501, "y": 1020 }, + { "type": "text", "x": -1063, "y": -840, "text": { "es": "{{name}} y Trasto", "en": "{{name}} and Trasto", "ca": "{{article}}{{name}} i en Trasto" } }, + { "type": "text", "x": -1063, "y": -675, "text": { "es": "se encuentran con...", "en": "come across...", "ca": "es troben amb..." } }, + { "type": "text", "x": 1063, "y": -840, "text": { "es": "¡Un tiburón!", "en": "a shark!", "ca": "un tauró!" } }, + { "type": "text", "x": 1063, "y": 760, "text": { "es": "uno", "en": "one", "ca": "u" }, "style": { "size": 400, "color": "number" } } + ] + }, + { + "page_id": 3, + "description": "2 Caballitos", + "elements": [ + { "type": "photo", "x": 344, "y": 1034 }, + { "type": "text", "x": -1063, "y": -840, "text": { "es": "{{name}} y Trasto", "en": "{{name}} and Trasto", "ca": "{{article}}{{name}} i en Trasto" } }, + { "type": "text", "x": -1063, "y": -675, "text": { "es": "saludan a...", "en": "say hello to...", "ca": "saluden..." } }, + { "type": "text", "x": 1063, "y": -840, "text": { "es": "¡Dos caballitos de mar!", "en": "two seahorses!", "ca": "dos cavallets marins!" } }, + { "type": "text", "x": 1063, "y": 760, "text": { "es": "dos", "en": "two", "ca": "dos" }, "style": { "size": 400, "color": "number" } } + ] + }, + { + "page_id": 4, + "description": "3 Cangrejos", + "elements": [ + { "type": "photo", "x": 1098, "y": 1010 }, + { "type": "text", "x": -1063, "y": -840, "text": { "es": "{{name}} y Trasto", "en": "{{name}} and Trasto", "ca": "{{article}}{{name}} i en Trasto" } }, + { "type": "text", "x": -1063, "y": -675, "text": { "es": "conocen a...", "en": "meet...", "ca": "coneixen..." } }, + { "type": "text", "x": 1063, "y": -840, "text": { "es": "¡Tres cangrejos!", "en": "three crabs!", "ca": "tres crancs!" } }, + { "type": "text", "x": 1063, "y": 760, "text": { "es": "tres", "en": "three", "ca": "tres" }, "style": { "size": 400, "color": "number" } } + ] + }, + { + "page_id": 5, + "description": "4 Tortugas", + "elements": [ + { "type": "photo", "x": 1729, "y": 1391 }, + { "type": "text", "x": -1063, "y": -840, "text": { "es": "{{name}} y Trasto", "en": "{{name}} and Trasto", "ca": "{{article}}{{name}} i en Trasto" } }, + { "type": "text", "x": -1063, "y": -675, "text": { "es": "hacen una carrera con...", "en": "race with...", "ca": "fan una cursa amb..." } }, + { "type": "text", "x": 1063, "y": -840, "text": { "es": "¡Cuatro tortugas!", "en": "four turtles!", "ca": "quatre tortugues!" } }, + { "type": "text", "x": 1063, "y": 760, "text": { "es": "cuatro", "en": "four", "ca": "quatre" }, "style": { "size": 400, "color": "number" } } + ] + }, + { + "page_id": 6, + "description": "5 Medusas", + "elements": [ + { "type": "photo", "x": 1020, "y": 1094 }, + { "type": "text", "x": -1063, "y": -840, "text": { "es": "{{name}} y Trasto", "en": "{{name}} and Trasto", "ca": "{{article}}{{name}} i en Trasto" } }, + { "type": "text", "x": -1063, "y": -675, "text": { "es": "juegan con...", "en": "play with...", "ca": "juguen amb..." } }, + { "type": "text", "x": 1063, "y": -840, "text": { "es": "¡Cinco medusas!", "en": "five jellyfish!", "ca": "cinc meduses!" } }, + { "type": "text", "x": 1063, "y": 760, "text": { "es": "cinco", "en": "five", "ca": "cinc" }, "style": { "size": 400, "color": "number" } } + ] + }, + { + "page_id": 7, + "description": "6 Peces Globo", + "elements": [ + { "type": "photo", "x": 1005, "y": 1187 }, + { "type": "text", "x": -1063, "y": -840, "text": { "es": "{{name}} y Trasto", "en": "{{name}} and Trasto", "ca": "{{article}}{{name}} i en Trasto" } }, + { "type": "text", "x": -1063, "y": -675, "text": { "es": "bailan con...", "en": "dance with...", "ca": "ballen amb..." } }, + { "type": "text", "x": 1063, "y": -840, "text": { "es": "¡Seis peces globo!", "en": "six puffer fish!", "ca": "sis peixos globus!" } }, + { "type": "text", "x": 1063, "y": 760, "text": { "es": "seis", "en": "six", "ca": "sis" }, "style": { "size": 400, "color": "number" } } + ] + }, + { + "page_id": 8, + "description": "7 Pulpos", + "elements": [ + { "type": "photo", "x": 1007, "y": 839 }, + { "type": "text", "x": -1063, "y": -840, "text": { "es": "{{name}} y Trasto", "en": "{{name}} and Trasto", "ca": "{{article}}{{name}} i en Trasto" } }, + { "type": "text", "x": -1063, "y": -675, "text": { "es": "bucean con...", "en": "dive with...", "ca": "bussegen amb..." } }, + { "type": "text", "x": 1063, "y": -840, "text": { "es": "¡Siete pulpos!", "en": "seven octopuses!", "ca": "set pops!" } }, + { "type": "text", "x": 1063, "y": 760, "text": { "es": "siete", "en": "seven", "ca": "set" }, "style": { "size": 400, "color": "number" } } + ] + }, + { + "page_id": 9, + "description": "8 Erizos", + "elements": [ + { "type": "photo", "x": 1004, "y": 1088 }, + { "type": "text", "x": -1063, "y": -840, "text": { "es": "{{name}} y Trasto", "en": "{{name}} and Trasto", "ca": "{{article}}{{name}} i en Trasto" } }, + { "type": "text", "x": -1063, "y": -675, "text": { "es": "se esconden de...", "en": "hide from...", "ca": "s’amaguen de..." } }, + { "type": "text", "x": 1063, "y": -840, "text": { "es": "¡Ocho erizos!", "en": "eight hedgehogs!", "ca": "vuit eriçons!" } }, + { "type": "text", "x": 1063, "y": 760, "text": { "es": "ocho", "en": "eight", "ca": "vuit" }, "style": { "size": 400, "color": "number" } } + ] + }, + { + "page_id": 10, + "description": "9 Peces", + "elements": [ + { "type": "photo", "x": 828, "y": 914 }, + { "type": "text", "x": -1063, "y": -840, "text": { "es": "{{name}} y Trasto", "en": "{{name}} and Trasto", "ca": "{{article}}{{name}} i en Trasto" } }, + { "type": "text", "x": -1063, "y": -675, "text": { "es": "nadan junto a...", "en": "swim with...", "ca": "neden al costat de..." } }, + { "type": "text", "x": 1063, "y": -840, "text": { "es": "¡Nueve peces!", "en": "nine fish!", "ca": "nou peixos!" } }, + { "type": "text", "x": 1063, "y": 760, "text": { "es": "nueve", "en": "nine", "ca": "nou" }, "style": { "size": 400, "color": "number" } } + ] + }, + { + "page_id": 11, + "description": "10 Estrellas", + "elements": [ + { "type": "photo", "x": 372, "y": 913 }, + { "type": "text", "x": -1063, "y": -840, "text": { "es": "{{name}} y Trasto", "en": "{{name}} and Trasto", "ca": "{{article}}{{name}} i en Trasto" } }, + { "type": "text", "x": -1063, "y": -675, "text": { "es": "sonríen con...", "en": "smile with...", "ca": "somriuen amb..." } }, + { "type": "text", "x": 1063, "y": -840, "text": { "es": "¡Diez estrellitas de mar!", "en": "ten little sea stars!", "ca": "deu estrelletes de mar!" } }, + { "type": "text", "x": 1063, "y": 760, "text": { "es": "diez", "en": "ten", "ca": "deu" }, "style": { "size": 400, "color": "number" } } + ] + } + ] +} \ No newline at end of file diff --git a/src/books/4/config/config.rar b/src/books/4/config/config.rar new file mode 100644 index 0000000..2eb1e0d Binary files /dev/null and b/src/books/4/config/config.rar differ diff --git a/src/books/4/fonts/Calibri.ttf b/src/books/4/fonts/Calibri.ttf new file mode 100644 index 0000000..2fede68 Binary files /dev/null and b/src/books/4/fonts/Calibri.ttf differ diff --git a/src/books/4/fonts/Mali-Bold.ttf b/src/books/4/fonts/Mali-Bold.ttf new file mode 100644 index 0000000..f70c67e Binary files /dev/null and b/src/books/4/fonts/Mali-Bold.ttf differ diff --git a/src/books/4/fonts/Mali-Regular.ttf b/src/books/4/fonts/Mali-Regular.ttf new file mode 100644 index 0000000..70cd35b Binary files /dev/null and b/src/books/4/fonts/Mali-Regular.ttf differ diff --git a/src/books/4/paginas/300dpi/0.png b/src/books/4/paginas/300dpi/0.png new file mode 100644 index 0000000..f39fd9d Binary files /dev/null and b/src/books/4/paginas/300dpi/0.png differ diff --git a/src/books/4/paginas/300dpi/0_sin_lomo.png b/src/books/4/paginas/300dpi/0_sin_lomo.png new file mode 100644 index 0000000..da2bb29 Binary files /dev/null and b/src/books/4/paginas/300dpi/0_sin_lomo.png differ diff --git a/src/books/4/paginas/300dpi/1.png b/src/books/4/paginas/300dpi/1.png new file mode 100644 index 0000000..31094bf Binary files /dev/null and b/src/books/4/paginas/300dpi/1.png differ diff --git a/src/books/4/paginas/300dpi/10.png b/src/books/4/paginas/300dpi/10.png new file mode 100644 index 0000000..9b1ff97 Binary files /dev/null and b/src/books/4/paginas/300dpi/10.png differ diff --git a/src/books/4/paginas/300dpi/11.png b/src/books/4/paginas/300dpi/11.png new file mode 100644 index 0000000..51b6e27 Binary files /dev/null and b/src/books/4/paginas/300dpi/11.png differ diff --git a/src/books/4/paginas/300dpi/2.png b/src/books/4/paginas/300dpi/2.png new file mode 100644 index 0000000..b12a2ed Binary files /dev/null and b/src/books/4/paginas/300dpi/2.png differ diff --git a/src/books/4/paginas/300dpi/3.png b/src/books/4/paginas/300dpi/3.png new file mode 100644 index 0000000..c974e75 Binary files /dev/null and b/src/books/4/paginas/300dpi/3.png differ diff --git a/src/books/4/paginas/300dpi/4.png b/src/books/4/paginas/300dpi/4.png new file mode 100644 index 0000000..9ecaccf Binary files /dev/null and b/src/books/4/paginas/300dpi/4.png differ diff --git a/src/books/4/paginas/300dpi/5.png b/src/books/4/paginas/300dpi/5.png new file mode 100644 index 0000000..3dd72c8 Binary files /dev/null and b/src/books/4/paginas/300dpi/5.png differ diff --git a/src/books/4/paginas/300dpi/6.png b/src/books/4/paginas/300dpi/6.png new file mode 100644 index 0000000..ab7b7b4 Binary files /dev/null and b/src/books/4/paginas/300dpi/6.png differ diff --git a/src/books/4/paginas/300dpi/7.png b/src/books/4/paginas/300dpi/7.png new file mode 100644 index 0000000..28316b2 Binary files /dev/null and b/src/books/4/paginas/300dpi/7.png differ diff --git a/src/books/4/paginas/300dpi/8.png b/src/books/4/paginas/300dpi/8.png new file mode 100644 index 0000000..fd9b2af Binary files /dev/null and b/src/books/4/paginas/300dpi/8.png differ diff --git a/src/books/4/paginas/300dpi/9.png b/src/books/4/paginas/300dpi/9.png new file mode 100644 index 0000000..1acd864 Binary files /dev/null and b/src/books/4/paginas/300dpi/9.png differ diff --git a/src/books/4/paginas/300dpi/cut_lines_cover.png b/src/books/4/paginas/300dpi/cut_lines_cover.png new file mode 100644 index 0000000..d75a17a Binary files /dev/null and b/src/books/4/paginas/300dpi/cut_lines_cover.png differ diff --git a/src/books/4/paginas/300dpi_ok_imprenta/0.png b/src/books/4/paginas/300dpi_ok_imprenta/0.png new file mode 100644 index 0000000..9851c76 Binary files /dev/null and b/src/books/4/paginas/300dpi_ok_imprenta/0.png differ diff --git a/src/books/4/paginas/300dpi_ok_imprenta/1.png b/src/books/4/paginas/300dpi_ok_imprenta/1.png new file mode 100644 index 0000000..0cecfa4 Binary files /dev/null and b/src/books/4/paginas/300dpi_ok_imprenta/1.png differ diff --git a/src/books/4/paginas/300dpi_ok_imprenta/10.png b/src/books/4/paginas/300dpi_ok_imprenta/10.png new file mode 100644 index 0000000..48c62d4 Binary files /dev/null and b/src/books/4/paginas/300dpi_ok_imprenta/10.png differ diff --git a/src/books/4/paginas/300dpi_ok_imprenta/11.png b/src/books/4/paginas/300dpi_ok_imprenta/11.png new file mode 100644 index 0000000..8cf51ff Binary files /dev/null and b/src/books/4/paginas/300dpi_ok_imprenta/11.png differ diff --git a/src/books/4/paginas/300dpi_ok_imprenta/2.png b/src/books/4/paginas/300dpi_ok_imprenta/2.png new file mode 100644 index 0000000..3a9d53f Binary files /dev/null and b/src/books/4/paginas/300dpi_ok_imprenta/2.png differ diff --git a/src/books/4/paginas/300dpi_ok_imprenta/3.png b/src/books/4/paginas/300dpi_ok_imprenta/3.png new file mode 100644 index 0000000..9ef7fb9 Binary files /dev/null and b/src/books/4/paginas/300dpi_ok_imprenta/3.png differ diff --git a/src/books/4/paginas/300dpi_ok_imprenta/4.png b/src/books/4/paginas/300dpi_ok_imprenta/4.png new file mode 100644 index 0000000..171e7dc Binary files /dev/null and b/src/books/4/paginas/300dpi_ok_imprenta/4.png differ diff --git a/src/books/4/paginas/300dpi_ok_imprenta/5.png b/src/books/4/paginas/300dpi_ok_imprenta/5.png new file mode 100644 index 0000000..786752f Binary files /dev/null and b/src/books/4/paginas/300dpi_ok_imprenta/5.png differ diff --git a/src/books/4/paginas/300dpi_ok_imprenta/6.png b/src/books/4/paginas/300dpi_ok_imprenta/6.png new file mode 100644 index 0000000..0962412 Binary files /dev/null and b/src/books/4/paginas/300dpi_ok_imprenta/6.png differ diff --git a/src/books/4/paginas/300dpi_ok_imprenta/7.png b/src/books/4/paginas/300dpi_ok_imprenta/7.png new file mode 100644 index 0000000..df23a6d Binary files /dev/null and b/src/books/4/paginas/300dpi_ok_imprenta/7.png differ diff --git a/src/books/4/paginas/300dpi_ok_imprenta/8.png b/src/books/4/paginas/300dpi_ok_imprenta/8.png new file mode 100644 index 0000000..d88ddbc Binary files /dev/null and b/src/books/4/paginas/300dpi_ok_imprenta/8.png differ diff --git a/src/books/4/paginas/300dpi_ok_imprenta/9.png b/src/books/4/paginas/300dpi_ok_imprenta/9.png new file mode 100644 index 0000000..0e65eef Binary files /dev/null and b/src/books/4/paginas/300dpi_ok_imprenta/9.png differ diff --git a/src/books/4/paginas/300dpi_ok_imprenta/cut_lines.png b/src/books/4/paginas/300dpi_ok_imprenta/cut_lines.png new file mode 100644 index 0000000..1504d30 Binary files /dev/null and b/src/books/4/paginas/300dpi_ok_imprenta/cut_lines.png differ diff --git a/src/books/4/paginas/300dpi_ok_imprenta/cut_lines_cover.png b/src/books/4/paginas/300dpi_ok_imprenta/cut_lines_cover.png new file mode 100644 index 0000000..42b7de5 Binary files /dev/null and b/src/books/4/paginas/300dpi_ok_imprenta/cut_lines_cover.png differ diff --git a/src/books/4/paginas/72dpi - copia/0.png b/src/books/4/paginas/72dpi - copia/0.png new file mode 100644 index 0000000..5044b72 Binary files /dev/null and b/src/books/4/paginas/72dpi - copia/0.png differ diff --git a/src/books/4/paginas/72dpi - copia/0_recuadro_nombre_origial.png b/src/books/4/paginas/72dpi - copia/0_recuadro_nombre_origial.png new file mode 100644 index 0000000..9561ad5 Binary files /dev/null and b/src/books/4/paginas/72dpi - copia/0_recuadro_nombre_origial.png differ diff --git a/src/books/4/paginas/72dpi - copia/10.png b/src/books/4/paginas/72dpi - copia/10.png new file mode 100644 index 0000000..931c13e Binary files /dev/null and b/src/books/4/paginas/72dpi - copia/10.png differ diff --git a/src/books/4/paginas/72dpi - copia/11.png b/src/books/4/paginas/72dpi - copia/11.png new file mode 100644 index 0000000..c3f2dd6 Binary files /dev/null and b/src/books/4/paginas/72dpi - copia/11.png differ diff --git a/src/books/4/paginas/72dpi - copia/12.png b/src/books/4/paginas/72dpi - copia/12.png new file mode 100644 index 0000000..cb258eb Binary files /dev/null and b/src/books/4/paginas/72dpi - copia/12.png differ diff --git a/src/books/4/paginas/72dpi - copia/13.png b/src/books/4/paginas/72dpi - copia/13.png new file mode 100644 index 0000000..40e7719 Binary files /dev/null and b/src/books/4/paginas/72dpi - copia/13.png differ diff --git a/src/books/4/paginas/72dpi - copia/14.png b/src/books/4/paginas/72dpi - copia/14.png new file mode 100644 index 0000000..be431a3 Binary files /dev/null and b/src/books/4/paginas/72dpi - copia/14.png differ diff --git a/src/books/4/paginas/72dpi - copia/16.png b/src/books/4/paginas/72dpi - copia/16.png new file mode 100644 index 0000000..98d8be9 Binary files /dev/null and b/src/books/4/paginas/72dpi - copia/16.png differ diff --git a/src/books/4/paginas/72dpi - copia/17.png b/src/books/4/paginas/72dpi - copia/17.png new file mode 100644 index 0000000..ddd0dc6 Binary files /dev/null and b/src/books/4/paginas/72dpi - copia/17.png differ diff --git a/src/books/4/paginas/72dpi - copia/18.png b/src/books/4/paginas/72dpi - copia/18.png new file mode 100644 index 0000000..4e50ebb Binary files /dev/null and b/src/books/4/paginas/72dpi - copia/18.png differ diff --git a/src/books/4/paginas/72dpi - copia/2.png b/src/books/4/paginas/72dpi - copia/2.png new file mode 100644 index 0000000..a19d54f Binary files /dev/null and b/src/books/4/paginas/72dpi - copia/2.png differ diff --git a/src/books/4/paginas/72dpi - copia/20.png b/src/books/4/paginas/72dpi - copia/20.png new file mode 100644 index 0000000..6a2dbc0 Binary files /dev/null and b/src/books/4/paginas/72dpi - copia/20.png differ diff --git a/src/books/4/paginas/72dpi - copia/22.png b/src/books/4/paginas/72dpi - copia/22.png new file mode 100644 index 0000000..1288535 Binary files /dev/null and b/src/books/4/paginas/72dpi - copia/22.png differ diff --git a/src/books/4/paginas/72dpi - copia/23.png b/src/books/4/paginas/72dpi - copia/23.png new file mode 100644 index 0000000..4b9e265 Binary files /dev/null and b/src/books/4/paginas/72dpi - copia/23.png differ diff --git a/src/books/4/paginas/72dpi - copia/3.png b/src/books/4/paginas/72dpi - copia/3.png new file mode 100644 index 0000000..542ac7c Binary files /dev/null and b/src/books/4/paginas/72dpi - copia/3.png differ diff --git a/src/books/4/paginas/72dpi - copia/4.png b/src/books/4/paginas/72dpi - copia/4.png new file mode 100644 index 0000000..3db889e Binary files /dev/null and b/src/books/4/paginas/72dpi - copia/4.png differ diff --git a/src/books/4/paginas/72dpi - copia/6.png b/src/books/4/paginas/72dpi - copia/6.png new file mode 100644 index 0000000..a1c2bb5 Binary files /dev/null and b/src/books/4/paginas/72dpi - copia/6.png differ diff --git a/src/books/4/paginas/72dpi - copia/7.png b/src/books/4/paginas/72dpi - copia/7.png new file mode 100644 index 0000000..d7ccb0c Binary files /dev/null and b/src/books/4/paginas/72dpi - copia/7.png differ diff --git a/src/books/4/paginas/72dpi - copia/8.png b/src/books/4/paginas/72dpi - copia/8.png new file mode 100644 index 0000000..cc6c881 Binary files /dev/null and b/src/books/4/paginas/72dpi - copia/8.png differ diff --git a/src/books/4/paginas/72dpi - copia/9.png b/src/books/4/paginas/72dpi - copia/9.png new file mode 100644 index 0000000..74142da Binary files /dev/null and b/src/books/4/paginas/72dpi - copia/9.png differ diff --git a/src/books/4/paginas/72dpi/0.png b/src/books/4/paginas/72dpi/0.png new file mode 100644 index 0000000..f39fd9d Binary files /dev/null and b/src/books/4/paginas/72dpi/0.png differ diff --git a/src/books/4/paginas/72dpi/1 - copia.png b/src/books/4/paginas/72dpi/1 - copia.png new file mode 100644 index 0000000..b4e27d7 Binary files /dev/null and b/src/books/4/paginas/72dpi/1 - copia.png differ diff --git a/src/books/4/paginas/72dpi/1.png b/src/books/4/paginas/72dpi/1.png new file mode 100644 index 0000000..7016814 Binary files /dev/null and b/src/books/4/paginas/72dpi/1.png differ diff --git a/src/books/4/paginas/72dpi/10.png b/src/books/4/paginas/72dpi/10.png new file mode 100644 index 0000000..e6dfc43 Binary files /dev/null and b/src/books/4/paginas/72dpi/10.png differ diff --git a/src/books/4/paginas/72dpi/12.png b/src/books/4/paginas/72dpi/12.png new file mode 100644 index 0000000..e455c9e Binary files /dev/null and b/src/books/4/paginas/72dpi/12.png differ diff --git a/src/books/4/paginas/72dpi/14.png b/src/books/4/paginas/72dpi/14.png new file mode 100644 index 0000000..252e997 Binary files /dev/null and b/src/books/4/paginas/72dpi/14.png differ diff --git a/src/books/4/paginas/72dpi/15.png b/src/books/4/paginas/72dpi/15.png new file mode 100644 index 0000000..a6da53e Binary files /dev/null and b/src/books/4/paginas/72dpi/15.png differ diff --git a/src/books/4/paginas/72dpi/16.png b/src/books/4/paginas/72dpi/16.png new file mode 100644 index 0000000..00dcb40 Binary files /dev/null and b/src/books/4/paginas/72dpi/16.png differ diff --git a/src/books/4/paginas/72dpi/18.png b/src/books/4/paginas/72dpi/18.png new file mode 100644 index 0000000..5e6daec Binary files /dev/null and b/src/books/4/paginas/72dpi/18.png differ diff --git a/src/books/4/paginas/72dpi/19.png b/src/books/4/paginas/72dpi/19.png new file mode 100644 index 0000000..f0ca8d5 Binary files /dev/null and b/src/books/4/paginas/72dpi/19.png differ diff --git a/src/books/4/paginas/72dpi/20.png b/src/books/4/paginas/72dpi/20.png new file mode 100644 index 0000000..ff82fce Binary files /dev/null and b/src/books/4/paginas/72dpi/20.png differ diff --git a/src/books/4/paginas/72dpi/21.png b/src/books/4/paginas/72dpi/21.png new file mode 100644 index 0000000..62dd7eb Binary files /dev/null and b/src/books/4/paginas/72dpi/21.png differ diff --git a/src/books/4/paginas/72dpi/22.png b/src/books/4/paginas/72dpi/22.png new file mode 100644 index 0000000..06c4ea7 Binary files /dev/null and b/src/books/4/paginas/72dpi/22.png differ diff --git a/src/books/4/paginas/72dpi/4.png b/src/books/4/paginas/72dpi/4.png new file mode 100644 index 0000000..7bcb72f Binary files /dev/null and b/src/books/4/paginas/72dpi/4.png differ diff --git a/src/books/4/paginas/72dpi/5.png b/src/books/4/paginas/72dpi/5.png new file mode 100644 index 0000000..93b4543 Binary files /dev/null and b/src/books/4/paginas/72dpi/5.png differ diff --git a/src/books/4/paginas/72dpi/6.png b/src/books/4/paginas/72dpi/6.png new file mode 100644 index 0000000..c6c051c Binary files /dev/null and b/src/books/4/paginas/72dpi/6.png differ diff --git a/src/books/4/paginas/72dpi/8.png b/src/books/4/paginas/72dpi/8.png new file mode 100644 index 0000000..d7a60fe Binary files /dev/null and b/src/books/4/paginas/72dpi/8.png differ diff --git a/src/books/temp/dedicatoria.png b/src/books/temp/dedicatoria.png new file mode 100644 index 0000000..8434955 Binary files /dev/null and b/src/books/temp/dedicatoria.png differ diff --git a/src/books/temp/face1.png b/src/books/temp/face1.png new file mode 100644 index 0000000..759c7f8 Binary files /dev/null and b/src/books/temp/face1.png differ diff --git a/src/books/temp/face2.jpg b/src/books/temp/face2.jpg new file mode 100644 index 0000000..35cede3 Binary files /dev/null and b/src/books/temp/face2.jpg differ diff --git a/src/books/temp/face2.png b/src/books/temp/face2.png new file mode 100644 index 0000000..0b8030a Binary files /dev/null and b/src/books/temp/face2.png differ diff --git a/src/books/temp/foto_test2.png b/src/books/temp/foto_test2.png new file mode 100644 index 0000000..3fcb9cd Binary files /dev/null and b/src/books/temp/foto_test2.png differ diff --git a/src/books/temp/libro8_1a1c_generado/libro_completo.pdf b/src/books/temp/libro8_1a1c_generado/libro_completo.pdf new file mode 100644 index 0000000..e4399a0 Binary files /dev/null and b/src/books/temp/libro8_1a1c_generado/libro_completo.pdf differ diff --git a/src/books/temp/libro8_1a1c_generado/page_00.jpg b/src/books/temp/libro8_1a1c_generado/page_00.jpg new file mode 100644 index 0000000..5e25a28 Binary files /dev/null and b/src/books/temp/libro8_1a1c_generado/page_00.jpg differ diff --git a/src/books/temp/libro8_1a1c_generado/page_08.jpg b/src/books/temp/libro8_1a1c_generado/page_08.jpg new file mode 100644 index 0000000..f5f32cd Binary files /dev/null and b/src/books/temp/libro8_1a1c_generado/page_08.jpg differ diff --git a/src/books/temp/libro8_1a1c_generado/page_09.jpg b/src/books/temp/libro8_1a1c_generado/page_09.jpg new file mode 100644 index 0000000..8afce84 Binary files /dev/null and b/src/books/temp/libro8_1a1c_generado/page_09.jpg differ diff --git a/src/books/temp/libro8_1a1c_generado/page_11.jpg b/src/books/temp/libro8_1a1c_generado/page_11.jpg new file mode 100644 index 0000000..201ae81 Binary files /dev/null and b/src/books/temp/libro8_1a1c_generado/page_11.jpg differ diff --git a/src/books/temp/libro8_1a1c_generado/page_13.jpg b/src/books/temp/libro8_1a1c_generado/page_13.jpg new file mode 100644 index 0000000..ece7e18 Binary files /dev/null and b/src/books/temp/libro8_1a1c_generado/page_13.jpg differ diff --git a/src/books/temp/libro8_1a1c_generado/page_14.jpg b/src/books/temp/libro8_1a1c_generado/page_14.jpg new file mode 100644 index 0000000..d9d3bb4 Binary files /dev/null and b/src/books/temp/libro8_1a1c_generado/page_14.jpg differ diff --git a/src/books/temp/libro8_1a1c_generado/page_15.jpg b/src/books/temp/libro8_1a1c_generado/page_15.jpg new file mode 100644 index 0000000..1752447 Binary files /dev/null and b/src/books/temp/libro8_1a1c_generado/page_15.jpg differ diff --git a/src/books/temp/libro8_1a1c_generado/page_16.jpg b/src/books/temp/libro8_1a1c_generado/page_16.jpg new file mode 100644 index 0000000..094cfd3 Binary files /dev/null and b/src/books/temp/libro8_1a1c_generado/page_16.jpg differ diff --git a/src/books/temp/libro8_1a1c_generado/page_18.jpg b/src/books/temp/libro8_1a1c_generado/page_18.jpg new file mode 100644 index 0000000..d264c60 Binary files /dev/null and b/src/books/temp/libro8_1a1c_generado/page_18.jpg differ diff --git a/src/books/temp/libro8_1a1c_generado/page_19.jpg b/src/books/temp/libro8_1a1c_generado/page_19.jpg new file mode 100644 index 0000000..a761988 Binary files /dev/null and b/src/books/temp/libro8_1a1c_generado/page_19.jpg differ diff --git a/src/books/temp/libro8_1a1c_generado/page_24.jpg b/src/books/temp/libro8_1a1c_generado/page_24.jpg new file mode 100644 index 0000000..a9fa038 Binary files /dev/null and b/src/books/temp/libro8_1a1c_generado/page_24.jpg differ diff --git a/src/books/temp/libro8_1a1c_generado/page_25.jpg b/src/books/temp/libro8_1a1c_generado/page_25.jpg new file mode 100644 index 0000000..18b6d36 Binary files /dev/null and b/src/books/temp/libro8_1a1c_generado/page_25.jpg differ diff --git a/src/books/temp/libro8_1a1c_generado/page_26.jpg b/src/books/temp/libro8_1a1c_generado/page_26.jpg new file mode 100644 index 0000000..36117f5 Binary files /dev/null and b/src/books/temp/libro8_1a1c_generado/page_26.jpg differ diff --git a/src/books/temp/libro8_1a1c_generado/page_27.jpg b/src/books/temp/libro8_1a1c_generado/page_27.jpg new file mode 100644 index 0000000..b74be42 Binary files /dev/null and b/src/books/temp/libro8_1a1c_generado/page_27.jpg differ diff --git a/src/books/temp/libro8_1a1c_generado/page_28.jpg b/src/books/temp/libro8_1a1c_generado/page_28.jpg new file mode 100644 index 0000000..9f4154e Binary files /dev/null and b/src/books/temp/libro8_1a1c_generado/page_28.jpg differ diff --git a/src/books/temp/libro8_1a1c_generado/page_29.jpg b/src/books/temp/libro8_1a1c_generado/page_29.jpg new file mode 100644 index 0000000..a11ab9b Binary files /dev/null and b/src/books/temp/libro8_1a1c_generado/page_29.jpg differ diff --git a/src/books/temp/libro8_1a1c_generado/page_33.jpg b/src/books/temp/libro8_1a1c_generado/page_33.jpg new file mode 100644 index 0000000..4618bd9 Binary files /dev/null and b/src/books/temp/libro8_1a1c_generado/page_33.jpg differ diff --git a/src/books/temp/libro8_1a1c_generado/page_35.jpg b/src/books/temp/libro8_1a1c_generado/page_35.jpg new file mode 100644 index 0000000..3e02b79 Binary files /dev/null and b/src/books/temp/libro8_1a1c_generado/page_35.jpg differ diff --git a/src/books/temp/libroprueba1/libro_completo.pdf b/src/books/temp/libroprueba1/libro_completo.pdf new file mode 100644 index 0000000..ed6989f Binary files /dev/null and b/src/books/temp/libroprueba1/libro_completo.pdf differ diff --git a/src/books/temp/libroprueba1/page_0.jpg b/src/books/temp/libroprueba1/page_0.jpg new file mode 100644 index 0000000..0685a59 Binary files /dev/null and b/src/books/temp/libroprueba1/page_0.jpg differ diff --git a/src/books/temp/libroprueba1/page_0_gd.jpg b/src/books/temp/libroprueba1/page_0_gd.jpg new file mode 100644 index 0000000..e8e723c Binary files /dev/null and b/src/books/temp/libroprueba1/page_0_gd.jpg differ diff --git a/src/books/temp/libroprueba1/page_1.jpg b/src/books/temp/libroprueba1/page_1.jpg new file mode 100644 index 0000000..97bb4ac Binary files /dev/null and b/src/books/temp/libroprueba1/page_1.jpg differ diff --git a/src/books/temp/libroprueba1/page_10.jpg b/src/books/temp/libroprueba1/page_10.jpg new file mode 100644 index 0000000..1e1c221 Binary files /dev/null and b/src/books/temp/libroprueba1/page_10.jpg differ diff --git a/src/books/temp/libroprueba1/page_10_gd.jpg b/src/books/temp/libroprueba1/page_10_gd.jpg new file mode 100644 index 0000000..95206bc Binary files /dev/null and b/src/books/temp/libroprueba1/page_10_gd.jpg differ diff --git a/src/books/temp/libroprueba1/page_11.jpg b/src/books/temp/libroprueba1/page_11.jpg new file mode 100644 index 0000000..3d765b8 Binary files /dev/null and b/src/books/temp/libroprueba1/page_11.jpg differ diff --git a/src/books/temp/libroprueba1/page_11_gd.jpg b/src/books/temp/libroprueba1/page_11_gd.jpg new file mode 100644 index 0000000..96897a0 Binary files /dev/null and b/src/books/temp/libroprueba1/page_11_gd.jpg differ diff --git a/src/books/temp/libroprueba1/page_1_gd.jpg b/src/books/temp/libroprueba1/page_1_gd.jpg new file mode 100644 index 0000000..105b9f9 Binary files /dev/null and b/src/books/temp/libroprueba1/page_1_gd.jpg differ diff --git a/src/books/temp/libroprueba1/page_2.jpg b/src/books/temp/libroprueba1/page_2.jpg new file mode 100644 index 0000000..9d68319 Binary files /dev/null and b/src/books/temp/libroprueba1/page_2.jpg differ diff --git a/src/books/temp/libroprueba1/page_2_gd.jpg b/src/books/temp/libroprueba1/page_2_gd.jpg new file mode 100644 index 0000000..58e31ea Binary files /dev/null and b/src/books/temp/libroprueba1/page_2_gd.jpg differ diff --git a/src/books/temp/libroprueba1/page_3.jpg b/src/books/temp/libroprueba1/page_3.jpg new file mode 100644 index 0000000..aa75d18 Binary files /dev/null and b/src/books/temp/libroprueba1/page_3.jpg differ diff --git a/src/books/temp/libroprueba1/page_3_gd.jpg b/src/books/temp/libroprueba1/page_3_gd.jpg new file mode 100644 index 0000000..4da2f23 Binary files /dev/null and b/src/books/temp/libroprueba1/page_3_gd.jpg differ diff --git a/src/books/temp/libroprueba1/page_4.jpg b/src/books/temp/libroprueba1/page_4.jpg new file mode 100644 index 0000000..0f642ef Binary files /dev/null and b/src/books/temp/libroprueba1/page_4.jpg differ diff --git a/src/books/temp/libroprueba1/page_4_gd.jpg b/src/books/temp/libroprueba1/page_4_gd.jpg new file mode 100644 index 0000000..c61d146 Binary files /dev/null and b/src/books/temp/libroprueba1/page_4_gd.jpg differ diff --git a/src/books/temp/libroprueba1/page_5.jpg b/src/books/temp/libroprueba1/page_5.jpg new file mode 100644 index 0000000..90d770f Binary files /dev/null and b/src/books/temp/libroprueba1/page_5.jpg differ diff --git a/src/books/temp/libroprueba1/page_5_gd.jpg b/src/books/temp/libroprueba1/page_5_gd.jpg new file mode 100644 index 0000000..2b6bc53 Binary files /dev/null and b/src/books/temp/libroprueba1/page_5_gd.jpg differ diff --git a/src/books/temp/libroprueba1/page_6.jpg b/src/books/temp/libroprueba1/page_6.jpg new file mode 100644 index 0000000..c9b449c Binary files /dev/null and b/src/books/temp/libroprueba1/page_6.jpg differ diff --git a/src/books/temp/libroprueba1/page_6_gd.jpg b/src/books/temp/libroprueba1/page_6_gd.jpg new file mode 100644 index 0000000..08d7080 Binary files /dev/null and b/src/books/temp/libroprueba1/page_6_gd.jpg differ diff --git a/src/books/temp/libroprueba1/page_7.jpg b/src/books/temp/libroprueba1/page_7.jpg new file mode 100644 index 0000000..c64a18f Binary files /dev/null and b/src/books/temp/libroprueba1/page_7.jpg differ diff --git a/src/books/temp/libroprueba1/page_7_gd.jpg b/src/books/temp/libroprueba1/page_7_gd.jpg new file mode 100644 index 0000000..2e03b0b Binary files /dev/null and b/src/books/temp/libroprueba1/page_7_gd.jpg differ diff --git a/src/books/temp/libroprueba1/page_8.jpg b/src/books/temp/libroprueba1/page_8.jpg new file mode 100644 index 0000000..980a0c5 Binary files /dev/null and b/src/books/temp/libroprueba1/page_8.jpg differ diff --git a/src/books/temp/libroprueba1/page_8_gd.jpg b/src/books/temp/libroprueba1/page_8_gd.jpg new file mode 100644 index 0000000..64c9670 Binary files /dev/null and b/src/books/temp/libroprueba1/page_8_gd.jpg differ diff --git a/src/books/temp/libroprueba1/page_9.jpg b/src/books/temp/libroprueba1/page_9.jpg new file mode 100644 index 0000000..92957cf Binary files /dev/null and b/src/books/temp/libroprueba1/page_9.jpg differ diff --git a/src/books/temp/libroprueba1/page_9_gd.jpg b/src/books/temp/libroprueba1/page_9_gd.jpg new file mode 100644 index 0000000..be4b0f7 Binary files /dev/null and b/src/books/temp/libroprueba1/page_9_gd.jpg differ diff --git a/src/books/temp/man.png b/src/books/temp/man.png new file mode 100644 index 0000000..6709f48 Binary files /dev/null and b/src/books/temp/man.png differ diff --git a/src/books/temp/woman.png b/src/books/temp/woman.png new file mode 100644 index 0000000..5ed256b Binary files /dev/null and b/src/books/temp/woman.png differ diff --git a/src/config/config.ini b/src/config/config.ini new file mode 100644 index 0000000..fab9a01 --- /dev/null +++ b/src/config/config.ini @@ -0,0 +1,28 @@ +;; APP config File + +[APP_DATA] +app_dir = "/var/www/" +uploads_dir = "/var/www/uploads/" +temp_dir = "/var/www/temp/" +default_controller = "index" +default_action = "index" +app_name = "TrastoBooks" +debug_mode = false +create_mode = false +demo_mode = true +max_pages_demo = 2 +max_sentences_demo = 20 + +web_url = "https://beta.natxovera.es" + +song_extras_enabled = true + +[DB] +database.default.host = "servidor-mysql-compartido" +database.default.user = "trasto_user"; +database.default.password = "tr43t0-$ser!."; +database.default.databasename = "trastobooks_db"; + +[SESSION] +enabled = 1 +name = "trastobooks-web" diff --git a/src/controllers/adminController.php b/src/controllers/adminController.php new file mode 100644 index 0000000..b32d150 --- /dev/null +++ b/src/controllers/adminController.php @@ -0,0 +1,633 @@ +"; + + $this->onlyContent = false; + + $result = array(); + + if (isset($_SESSION["database"]["default"])) { + $dbinfo = $_SESSION["database"]["default"]; + $this->db = new \database\mysql($dbinfo->host, $dbinfo->user, $dbinfo->pass, $dbinfo->dbname); + } else { + echo "Cannot find database configuration. Aborting"; + die; + } + + $this->view = new views(); + + if(isset($_SESSION["userdata"]["id"])) + { + //$this->userinfo = $_SESSION["userdata"]; + $this->view->userinfo = $_SESSION["userdata"]; //@TODO: No me mola -> Repensar + } + else + { + + redirect::goto("/index/login"); + die; + } + + $this->template = APP_DIR."views/template_admin.phtml"; + } + + + function __call($name, $arguments) + { + //echo "Invalid Call $name";die; + redirect::goto("/error"); + die; + } + function index() + { + } + + function miscuentos() + { + $mock = new \data\mockup(); + + $this->view->miscuentos = $mock->getPedidosByUsuario($this->view->userinfo["id"]); + } + + function misdatos() + { + + } + + function gestionlibros() + { + $mock = new \data\mockup(); + + $this->view->libros = $mock->getLibros(); + } + + function gestionpedidos() + { + $mock = new \data\mockup(); + + $this->view->pedidos = $mock->getPedidos(); + } + + function logout() + { + unset($_SESSION["userinfo"]); + redirect::goto("/index"); + } + + function editlibro() + { + // Establecemos que la respuesta siempre será un JSON UTF-8 estructurado + header('Content-Type: application/json; charset=utf-8'); + + try { + // 1. Validar que la petición sea estrictamente por POST + if ($_SERVER['REQUEST_METHOD'] !== 'POST') { + throw new Exception('Método de petición no permitido. Se esperaba una petición POST.'); + } + + // 2. Obtener los datos JSON crudos enviados por el cliente mediante Fetch + $jsonCrudo = file_get_contents('php://input'); + if (empty($jsonCrudo)) { + throw new Exception('No se han recibido datos en el cuerpo de la petición.'); + } + + // Decodificamos el JSON convirtiéndolo a array asociativo + $datosForm = json_decode($jsonCrudo, true); + + if (json_last_error() !== JSON_ERROR_NONE) { + throw new Exception('El formato de los datos JSON enviados no es válido.'); + } + + // 3. Sanitizar y mapear el array de datos para la base de datos o mockup + $datosLibro = []; + + // Si ID viene vacío o nulo (creación), lo dejamos como null para que SQL / Mockup genere la nueva ID + $datosLibro['id'] = (!empty($datosForm['id'])) ? (int)$datosForm['id'] : null; + + // Validación de campos obligatorios + if (empty($datosForm['titulo'])) { + throw new Exception('El título del cuento es obligatorio.'); + } + $datosLibro['titulo'] = htmlspecialchars(trim($datosForm['titulo']), ENT_QUOTES, 'UTF-8'); + + // El autor por defecto es el equipo creativo de la marca + $datosLibro['autor'] = (!empty($datosForm['autor'])) ? htmlspecialchars(trim($datosForm['autor']), ENT_QUOTES, 'UTF-8') : 'Equipo Creativo TrastoBooks'; + + if (empty($datosForm['numero_paginas']) || (int)$datosForm['numero_paginas'] <= 0) { + throw new Exception('El número de páginas debe ser un número entero positivo.'); + } + $datosLibro['numero_paginas'] = (int)$datosForm['numero_paginas']; + + // Comprobación de precio (enviado ya en céntimos desde el JS) + if (!isset($datosForm['precio']) || (int)$datosForm['precio'] <= 0) { + throw new Exception('El precio de venta es obligatorio y debe ser mayor que cero.'); + } + $datosLibro['precio'] = (int)$datosForm['precio']; + + if (empty($datosForm['ruta_archivo_config'])) { + throw new Exception('La ruta del archivo de configuración .json es obligatoria.'); + } + $datosLibro['ruta_archivo_config'] = htmlspecialchars(trim($datosForm['ruta_archivo_config']), ENT_QUOTES, 'UTF-8'); + + if (empty($datosForm['ruta_portada'])) { + throw new Exception('La URL o ruta física de la portada es obligatoria.'); + } + // Mantenemos la URL limpia si es válida, en caso contrario sanitizamos + $datosLibro['ruta_portada'] = filter_var($datosForm['ruta_portada'], FILTER_VALIDATE_URL) ? $datosForm['ruta_portada'] : htmlspecialchars(trim($datosForm['ruta_portada']), ENT_QUOTES, 'UTF-8'); + + $datosLibro['sinopsis'] = (!empty($datosForm['sinopsis'])) ? htmlspecialchars(trim($datosForm['sinopsis']), ENT_QUOTES, 'UTF-8') : ''; + + // El estado activo se almacena en BD como un entero pequeño/booleano (1 o 0) + $datosLibro['activo'] = isset($datosForm['activo']) ? (int)$datosForm['activo'] : 1; + + // 4. Instanciamos la clase Mockup (Simulador de DB) + $mockup = new \data\mockup(); + + // Guardamos o actualizamos en el almacén de datos + $idResultante = $mockup->saveLibro($datosLibro); + + // 5. Responder con éxito y retornar el identificador + echo json_encode([ + 'success' => true, + 'id' => $idResultante, + 'message' => $datosLibro['id'] ? '¡Cuento actualizado correctamente!' : '¡Cuento creado con éxito!' + ]); + exit; + + } catch (Exception $e) { + // Devolvemos un código de error Bad Request e información para depuración + http_response_code(400); + echo json_encode([ + 'success' => false, + 'message' => $e->getMessage() + ]); + exit; + } + } + + function togglestatuslibro() + { + + } + + function deletelibro() + { + + } + + function editorlibro() + { + $libroId = $_REQUEST["id"]; + + $mockup= new \data\mockup(); + + $librodata = $mockup->getLibroById($libroId); + + if($librodata["ruta_archivo_config"]!="") + { + //Check que existe la ruta del archivo + $config_path = APP_DIR.$librodata["ruta_archivo_config"]; + if(!file_exists($config_path)) + { + echo "No existe el archivo config de este libro"; + die; + } + else + { + $this->view->config = json_decode(file_get_contents($config_path), true); + } + } + + + } + + function guardarconfig() + { + + + // Forzar cabecera de respuesta JSON + header('Content-Type: application/json'); + + $mockup = new \data\mockup(); + + // Leer el payload JSON asíncrono + $rawInput = file_get_contents('php://input'); + $payload = json_decode($rawInput, true); + + if (!$payload || !isset($payload['book_id']) || !isset($payload['pages'])) { + http_response_code(400); + echo json_encode(["success" => false, "message" => "Datos de configuración incompletos o inválidos."]); + exit; + } + + // Definir la ruta física del archivo config del libro + $bookId = intval($payload['book_id']); + + // 1. Cargamos el Mockup para localizar la ruta real configurada en la BD + $libroInfo = $mockup->getLibroById($bookId); + + if (!$libroInfo || empty($libroInfo['ruta_archivo_config'])) { + http_response_code(404); + echo json_encode(["success" => false, "message" => "Libro o ruta de configuración no encontrados en la base de datos."]); + exit; + } + + $rutaArchivo = APP_DIR . $libroInfo['ruta_archivo_config']; + + // Asegurar que el directorio de configs existe + $directorio = dirname($rutaArchivo); + echo "Temp file to $directorio"; + if (!is_dir($directorio)) { + mkdir($directorio, 0755, true); + } + + // Convertir la estructura limpia con formato legible (JSON_PRETTY_PRINT) + $jsonFormateado = json_encode($payload, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); + + // Escritura atómica para evitar corrupción de ficheros + $archivoTemporal = tempnam($directorio, 'tmp_config_'); + if (file_put_contents($archivoTemporal, $jsonFormateado) !== false) { + // Reemplazar de forma segura (atomic rename) y dar permisos adecuados + if (rename($archivoTemporal, $rutaArchivo)) { + chmod($rutaArchivo, 0666); + echo json_encode([ + "success" => true, + "message" => "Configuración física escrita con éxito en data.", + "ruta" => $libroInfo['ruta_archivo_config'] + ]); + exit; + } + } + + // Fallback si la escritura segura falló + @unlink($archivoTemporal); + http_response_code(500); + echo json_encode(["success" => false, "message" => "No se pudo escribir en el archivo físico. Compruebe los permisos chown/chmod."]); + + + } + + function getImage() + { + + + + // 2. Capturar y sanitizar la ruta solicitada (ej: ?file=assets/fondos/selva_portada_bg.png) + $book = isset($_GET['book']) ? $_GET['book'] : ''; + $file = isset($_GET['file']) ? $_GET['file'] : ''; + + // Evitar Path Traversal básico (eliminar cualquier intento de subir de nivel con ../) + $file = str_replace(['../', '..\\'], '', $file); + + // 3. Definir el directorio base real donde almacenas las imágenes privadas + $baseDir = APP_DIR."books/$book/"; // Ajusta esta ruta a donde realmente estén tus recursos + $realPath = $baseDir . $file; + + // 4. Verificar que el archivo existe físicamente + if (empty($file) || !file_exists($realPath) || is_dir($realPath)) { + http_response_code(404); + echo "Imagen no encontrada"; + exit; + } + + // 5. Detectar el tipo mime de la imagen dinámicamente + $mimeType = mime_content_type($realPath); + $allowedMimeTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp','image/avif']; + + if (!in_array($mimeType, $allowedMimeTypes)) { + http_response_code(400); + echo "Formato de archivo no válido"; + exit; + } + + // 6. Enviar las cabeceras correctas y el archivo + header("Content-Type: " . $mimeType); + header("Content-Length: " . filesize($realPath)); + readfile($realPath); + exit; + } + + /** + * Endpoint POST para instanciar la maqueta de un cuento personalizado para un niño. + * Genera un hash de sesión, copia la plantilla config.json e inyecta las variables dinámicas de compra. + * Crea los directorios físicos correspondientes para el render de ImageMagick y el PDF final. + * + * Ruta recomendada de llamada: /admin/instanciarlibro + */ + public function instanciarlibro() { + header('Content-Type: application/json; charset=utf-8'); + + try { + // 1. Validar que la petición sea POST + /*if ($_SERVER['REQUEST_METHOD'] !== 'POST') { + throw new Exception('Método de petición no permitido. Se requiere POST.'); + }*/ + + // 2. Obtener y decodificar el payload JSON de la petición + /* + $jsonCrudo = file_get_contents('php://input'); + $payload = json_decode($jsonCrudo, true); + + if (json_last_error() !== JSON_ERROR_NONE || empty($payload)) { + throw new Exception('El cuerpo de la petición debe contener un objeto JSON válido.'); + } + */ + $payload = array(); + + $bookId = isset($_GET['book_id']) ? $_GET['book_id'] : ''; + + // 4. Localizar los datos del libro y su config.json original mediante el mockup + $mockup = new \data\mockup(); + $libroInfo = $mockup->getLibroById($bookId); + + if (!$libroInfo || empty($libroInfo['ruta_archivo_config'])) { + throw new Exception('El cuento especificado o su plantilla de configuración no existen en el sistema.'); + } + + // Definimos la ruta física absoluta de la plantilla maestra (config.json) + $rutaConfigMaestra = APP_DIR . $libroInfo['ruta_archivo_config']; + if (!file_exists($rutaConfigMaestra)) { + throw new Exception('No se encuentra físicamente la plantilla config.json en la ruta especificada.'); + } + + // Leemos y decodificamos el config.json maestro + $jsonMaestroContenido = file_get_contents($rutaConfigMaestra); + $configMaestra = json_decode($jsonMaestroContenido, true); + + if (json_last_error() !== JSON_ERROR_NONE) { + throw new Exception('La plantilla maestra config.json contiene un formato JSON corrupto.'); + } + + // 5. Gestión e inyección de variables personalizadas + // Si el cliente envía un diccionario de variables (ej: "variables": {"name": "Gael", "ninyo1": "..."}), las mezclamos + if (isset($payload['variables']) && is_array($payload['variables'])) { + // Aseguramos que existan nodos de variables en la plantilla para evitar errores de asignación + if (!isset($configMaestra['settings'])) { + $configMaestra['settings'] = []; + } + if (!isset($configMaestra['settings']['variables'])) { + $configMaestra['settings']['variables'] = []; + } + + // Mezclamos conservando las variables de plantilla que no se enviaron para evitar inconsistencias + $configMaestra['settings']['variables'] = array_merge( + $configMaestra['settings']['variables'], + $payload['variables'] + ); + } + + // 6. Generar el identificador HASH único para esta sesión de renderizado + // Usamos un hash seguro de 16 caracteres hexadecimales único para evitar colisiones + $hashSession = bin2hex(random_bytes(8)); + + // Definimos la ruta física absoluta para este pedido en el almacén de subidas + $dirPedidoAbsoluto = UPLOADS_DIR . '/' . $bookId . '/' . $hashSession; + $dirFramesAbsoluto = $dirPedidoAbsoluto . '/frames'; + $dirPdfAbsoluto = $dirPedidoAbsoluto . '/finalpdf'; + $dirResourcesAbsoluto = $dirPedidoAbsoluto . '/resources'; + + // 7. Crear directorios de forma recursiva con permisos seguros (chown/chmod 755 o 775) + // Esto evita colisiones de propiedad si el script es ejecutado por el usuario del sistema o de Apache/Nginx + if (!is_dir($dirPedidoAbsoluto)) { + if (!mkdir($dirPedidoAbsoluto, 0775, true)) { + throw new Exception('Error de permisos en el servidor al crear la carpeta base del pedido.'); + } + } + if (!is_dir($dirFramesAbsoluto)) { + if (!mkdir($dirFramesAbsoluto, 0775, true)) { + throw new Exception('Error al crear el subdirectorio /frames para renders intermedios.'); + } + } + if (!is_dir($dirPdfAbsoluto)) { + if (!mkdir($dirPdfAbsoluto, 0775, true)) { + throw new Exception('Error al crear el subdirectorio /finalpdf para la exportación.'); + } + } + if (!is_dir($dirResourcesAbsoluto)) { + if (!mkdir($dirResourcesAbsoluto, 0775, true)) { + throw new Exception('Error al crear el subdirectorio /resources para almacenar recursos multimedia.'); + } + } + + // 8. Escribir físicamente el instance.json personalizado dentro de la carpeta del pedido + $rutaInstanceJson = $dirPedidoAbsoluto . '/instance.json'; + $jsonFormateado = json_encode($configMaestra, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); + + if (file_put_contents($rutaInstanceJson, $jsonFormateado) === false) { + throw new Exception('No se ha podido escribir el archivo de plano de ensamblado instance.json en el disco.'); + } + + // Aplicamos permisos de lectura/escritura seguros al archivo + chmod($rutaInstanceJson, 0664); + + // 8b. Registrar la nueva instancia como un Pedido persistente en data.json + $clientId = isset($payload['cliente_id']) ? $payload['cliente_id'] : 1; + if ($clientId === 'admin') { + $clientId = 2; // ID del usuario administrativo en data.json + } else { + $clientId = (int)$clientId; + } + + $datosPedido = [ + 'id_pedido_tienda' => 'PED-2026-' . rand(100, 999), //@TODO Ver como calcular el id de pedido o hacer un link a prestashop + 'id_usuario' => $clientId, + 'id_libro' => $bookId, + //VARIABLE POR CUENTO NO DEBE IR AQUI + 'nombre_peque' => $configMaestra['settings']['variables']['name'] ?? 'Desconocido', + 'genero_peque' => $payload['variables']['genero_peque'] ?? 'boy', + 'tipo_letra' => $payload['variables']['tipo_letra'] ?? 'lower', + 'foto_prota_url' => $configMaestra['settings']['variables']['ninyo1'] ?? '', + //----------------------------------> + 'precio_total' => $libroInfo['precio'] ?? 2995, + 'estado' => 'diseñando', + 'fecha_pedido' => date('Y-m-d H:i:s'), + 'instance_dir' => "uploads/{$bookId}/{$hashSession}", + 'instance_file' => "uploads/{$bookId}/{$hashSession}/instance.json", + 'hash' => $hashSession + ]; + $mockup->savePedido($datosPedido); + + // 9. Retornar los detalles de instanciación con éxito para que el front-end empiece a renderizar + /* + echo json_encode([ + 'success' => true, + 'book_id' => $bookId, + 'hash' => $hashSession, + 'instance_dir' => "uploads/{$bookId}/{$hashSession}", + 'instance_file'=> "uploads/{$bookId}/{$hashSession}/instance.json", + 'message' => 'Libro instanciado con éxito. Estructura de directorios /frames y /finalpdf lista para procesar.' + ]); + */ + + redirect::goto("/admin/gestionpedidos"); + die; + + } catch (Exception $e) { + http_response_code(400); + echo json_encode([ + 'success' => false, + 'message' => $e->getMessage() + ]); + exit; + } + } + + function editarinstancia() + { + + $pedidoId = isset($_GET['id']) ? $_GET['id'] : ''; + + try { + + // 1. Instanciar Mockup para localizar el pedido por su Hash de sesión único + $mockup = new \data\mockup(); + $pedidoEncontrado = $mockup->getPedidoById($pedidoId); + + if (!isset($pedidoEncontrado["id"])) { + throw new Exception('La orden de trabajo o pedido solicitado no existe.'); + } + + // 2. Localizar el archivo físico instance.json en el directorio de subidas + $rutaInstanceJson = APP_DIR . $pedidoEncontrado['instance_file']; + if (!file_exists($rutaArchivoInstance = realpath($rutaInstanceJson))) { + throw new Exception('No se encuentra físicamente el plano de montaje instance.json para esta sesión.'); + } + + // 3. Leer y decodificar el instance.json + $jsonCrudo = file_get_contents($rutaInstanceJson); + $instanceData = json_decode($jsonCrudo, true); + + if (json_last_error() !== JSON_ERROR_NONE) { + throw new Exception('El archivo instance.json contiene un formato JSON corrupto.'); + } + + // 4. Inyectar meta-información para que el editor visual renderice dinámicamente los badges superiores + $libroInfo = $mockup->getLibroById($pedidoEncontrado['id_libro']); + $usuarioInfo = $mockup->getUsuarioById($pedidoEncontrado['id_usuario']); + $libroData = json_decode(file_get_contents(APP_DIR.$libroInfo["ruta_archivo_config"]), true); + + + $this->view->config = [ + "order_id" => $pedidoEncontrado['id_pedido_tienda'], + "book_id" => $pedidoEncontrado['id_libro'], + "book_title" => $libroInfo['titulo'] ?? 'Cuento Personalizado', + "client_name" => $usuarioInfo['nombre'] ?? 'Cliente Desconocido', + "instance_dir" => $pedidoEncontrado['instance_dir'], + "settings" => $instanceConfig['settings'] ?? [], + "user_photo" => $instanceConfig['user_photo'] ?? ["width" => 450, "height" => 450], + "pages" => $libroData["pages"], + "variables" => $libroData["settings"]["variables"] + ]; + + + + } catch (Exception $e) { + // Renderizar fallback de error amigable en el backoffice + http_response_code(500); + echo "
"; + echo "

⚠️ Error en el Taller de Producción

"; + echo "

" . htmlspecialchars($e->getMessage()) . "

"; + echo "Volver a Pedidos"; + echo "
"; + } + } + + /** + * Endpoint asíncrono POST para actualizar y salvar el instance.json corregido por el taller de imprenta. + * Sincroniza simultáneamente los campos modificados en la colección global de pedidos (data.json). + * + * Ruta: /admin/guardarinstance + */ + public function guardarinstance() { + header('Content-Type: application/json; charset=utf-8'); + + try { + if ($_SERVER['REQUEST_METHOD'] !== 'POST') { + throw new Exception('Método de petición no permitido. Se requiere POST.'); + } + + $jsonCrudo = file_get_contents('php://input'); + $payload = json_decode($jsonCrudo, true); + + if (json_last_error() !== JSON_ERROR_NONE || empty($payload)) { + throw new Exception('El cuerpo de la petición contiene un JSON corrupto.'); + } + + // Localizar el pedido en la persistencia común de data.json + $mockup = new \data\mockup(); + $pedidoEncontrado = null; + $pedidoKey = null; + + foreach ($mockup->getPedidos() as $id => $p) { + if ($p['id_pedido_tienda'] === $payload['order_id']) { + $pedidoEncontrado = $p; + $pedidoKey = $id; + break; + } + } + + if (!$pedidoEnfirm) { + throw new Exception('No se encuentra registrado este pedido en la base de datos.'); + } + + // 1. Escribir físicamente los datos corregidos en el instance.json de la carpeta del pedido + $rutaFisicaConfig = UPLOADS_DIR . $pedidoEncontrado['instance_dir'] . '/instance.json'; + + // Re-maquetamos la estructura para limpiarla de metadatos de visualización inyectados + $configParaGuardar = $payload; + unset($configParaGuardar['order_id'], $configParaGuardar['book_title'], $configParaGuardar['client_name'], $configParaGuardar['instance_dir']); + + $jsonFormateado = json_encode($configParaGuardar, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); + if (file_put_contents($rutaFisicaConfig, $jsonFormateado) === false) { + throw new Exception('Error al escribir el archivo instance.json en el disco. Compruebe los permisos.'); + } + + // 2. Sincronizar en caliente los campos corregidos por el taller en la base de datos data.json + $pedidoEncontrado['nombre_peque'] = $configParaGuardar['settings']['variables']['name'] ?? $pedidoEncontrado['nombre_peque']; + $pedidoEncontrado['foto_prota_url'] = $configParaGuardar['settings']['variables']['ninyo1'] ?? $pedidoEncontrado['foto_prota_url']; + + $mockup->savePedido($pedidoEncontrado); + + echo json_encode([ + 'success' => true, + 'message' => '¡Configuración de instancia escrita físicamente y persistida en data.json con éxito!' + ]); + exit; + + } catch (Exception $e) { + http_response_code(400); + echo json_encode([ + 'success' => false, + 'message' => $e->getMessage() + ]); + exit; + } + } + + function eliminarpedido() + { + $pedidoId = isset($_GET['id']) ? $_GET['id'] : ''; + + $mockup = new \data\mockup(); + + //@TODO: Borrar la carpeta con el contenido integro + $mockup->deletePedido($pedidoId); + + redirect::goto("/admin/gestionpedidos"); + } +} +?> \ No newline at end of file diff --git a/src/controllers/errorController.php b/src/controllers/errorController.php new file mode 100644 index 0000000..b3511e0 --- /dev/null +++ b/src/controllers/errorController.php @@ -0,0 +1,47 @@ +onlyContent = false; + + $this->view = new views(); + + $this->userinfo = array(); + $this->template = APP_DIR."views/template_interior.phtml"; + } + + function index() + { + + } + + function timeout() + { + + } + + function identity() + { + + } + + function fatal() + { + if(!isset($_REQUETS["message"])) + $this->view->message = "Unkonwn Error."; + else + $this->view->message = $_REQUEST["message"]; + } +} \ No newline at end of file diff --git a/src/controllers/indexController.php b/src/controllers/indexController.php new file mode 100644 index 0000000..21bb854 --- /dev/null +++ b/src/controllers/indexController.php @@ -0,0 +1,55 @@ +"; + $this->view = new views(); + + if (isset($_SESSION["database"]["default"])) { + $dbinfo = $_SESSION["database"]["default"]; + $this->db = new \database\mysql($dbinfo->host, $dbinfo->user, $dbinfo->pass, $dbinfo->dbname); + } else { + echo "Cannot find database configuration. Aborting"; + die; + } + } + + function __call($name, $arguments) + { + echo "Invalid Call $name";die; + } + function index() + { + + } + + function login() + { + if($_POST) + { + $user = $_REQUEST["email"]; + $pass = $_REQUEST["password"]; + + $mc = new \data\mockup(); + + $usuarioLogueado = $mc->login($user, $pass); + if ($usuarioLogueado) { + $_SESSION["userdata"] = $usuarioLogueado; + $s = new \common\strings(); + $_SESSION["userdata"]["iniciales"] = $s->obtenerIniciales($usuarioLogueado["nombre"]); + redirect::goto("/admin"); + } + + $this->view->error = true; + $this->view->message = "Datos introducidos invalidos"; + } + } +} \ No newline at end of file diff --git a/src/html/.htaccess b/src/html/.htaccess new file mode 100644 index 0000000..fb29273 --- /dev/null +++ b/src/html/.htaccess @@ -0,0 +1,14 @@ + + RewriteEngine On + RewriteBase / + RewriteRule ^index\.php$ - [L] + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule . /index.php [L] + + +# CONFIGURACIÓN DE LOGS DE PHP +# Activar el registro de errores +php_flag log_errors On +# Decirle dónde guardarlos (Ruta interna del contenedor) +php_value error_log /var/www/logs/php_error.log \ No newline at end of file diff --git a/src/html/edit.html b/src/html/edit.html new file mode 100644 index 0000000..c9aa36e --- /dev/null +++ b/src/html/edit.html @@ -0,0 +1,844 @@ + + + + + + + Personalizar cuento | TrastoBooks 2026 + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + +
+
+
+
+ + + + + Nuevo servicio premium +
+

"Te lo hacemos nosotros"

+

+ ¿No tienes tiempo o tienes dudas subiendo las fotos? ¡Nosotros nos encargamos de todo gratis! Te preparamos el cuento por WhatsApp y tú solo decides si comprarlo al final. +

+
+ + + Quiero que me hagáis el cuento + +
+
+ + +
+
+
+
+
+ + +
+
1
+ Personalización +
+ + +
+
2
+ Previsualización +
+ + +
+
3
+ Compra +
+
+
+ + +
+ + +
+
+ Crea un recuerdo inolvidable +

Configura a tu pequeño héroe

+

Completa los campos a continuación para que la magia empiece.

+
+ +
+ + +
+ +
+ +
+ 6/12 +
+
+

Máximo 12 letras para un encuadre perfecto en portada.

+
+ + +
+ +
+ + + + + + + +
+
+ + +
+ +
+ + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
+

Sube una foto clara de frente

+

Formatos JPG o PNG. Le quitaremos el fondo automáticamente.

+
+ + +
+ + + + +
+
+ + +
+ +

+ Al hacer clic accederás a la pasarela de previsualización final del libro completo antes de imprimir. +

+
+ +
+
+ + +
+ + +
+
+

Vista Previa del Álbum

+ Portada +
+ +
+ +
+ + +
+
+ + +
+
+ Colección Aventuras +

+ Martín y Trasto +

+

quieren ser...

+
+ + +
+ +
+ 👦 +
+ + +
+ +
+

TrastoBooks Editor

+
+
+ + + + + + + +
+
+ + +
+ +
+ + + +
+ +
+ +
+ + +
+

¿De qué trata este cuento?

+
+

+ Vive una aventura a través de este cuento personalizado donde Trasto acompañará a tu peque en su crecimiento, mostrándole que existe una enorme diversidad de profesiones y hobbies por descubrir. +

+

+ De esta forma ayudamos a los más pequeños en su proceso de aprendizaje de una forma divertida y personal, fomentando en ellos el hábito de la lectura y su capacidad imaginativa. +

+
+
+ +
+ +
+ +
+ + + + + + + + Ayuda + + + +
+ + Mensaje +
+ + + + + + + + \ No newline at end of file diff --git a/src/html/index.html b/src/html/index.html new file mode 100644 index 0000000..92ab598 --- /dev/null +++ b/src/html/index.html @@ -0,0 +1,746 @@ + + + + + + + TrastoBooks | Cuentos Personalizados para niños y niñas (Rediseño Claro 2026) + + + + + + + + + + + + + + + + + + + + + +
+
+ 🎁 -20% dto en tu 2ª unidad con el código TRASTO20 + + 🔥 -30% dto al comprar 3 o más con el código TRASTO30 +
+
+ +
+ + + + +
+ +
+ +
+
+ +
+
+ + +
+ + 🚀 Cuentos con un claro propósito educativo y pedagógico + +

+ Cuentos donde tus peques son los verdaderos héroes +

+

+ Libros educativos personalizados diseñados para estimular el amor por la lectura, el aprendizaje natural y el autoestima. El regalo perfecto que guardarán para siempre. +

+ + + + +
+
+ + + + + +
+

+ Valorado como Excelente en Trustpilot por miles de familias reales. +

+
+
+ + +
+
+
+
+ Te quiero papá +
+
+ Quiero Ser +
+
+
+
+ Gracias Abuelos +
+
+ Aprende los colores +
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+

En 7-10 días en casa

+

Una vez realizas tu pedido, te llegará el cuento personalizado a casa por mensajería urgente.

+
+
+ + +
+
+ +
+
+

Con foto real o avatar

+

Máxima identificación: los peques se ven reflejados con fotos reales de sus caritas o simpáticos avatares.

+
+
+ + +
+
+ +
+
+

Libros de Calidad Premium

+

Álbumes resistentes (21x21 o 18x18 cm) con papel antihuellas ideales para ser manipulados por niños.

+
+
+
+
+
+ +
+
+ + +
+

Cuentos personalizados destacados

+

+ Selecciona el tema pedagógico ideal. Todos nuestros libros están elaborados y revisados por profesionales de la educación. +

+ + +
+ + + + +
+
+ + +
+ + +
+
+ Top Ventas + Te quiero, papá... +
+
+ Con fotos reales +

Te quiero, papá... (Fotos)

+
+ 32,00 € + + Personalizar + +
+
+
+ + +
+
+ ¡Gracias, abuelos! +
+
+ Familia +

¡Gracias, abuelos!

+
+ 32,00 € + + Personalizar + +
+
+
+ + +
+
+ Nombre y Trasto +
+
+ Educativo +

[Nombre] & Trasto quieren ser...

+
+ 29,95 € + + Personalizar + +
+
+
+ + +
+
+ Fin de Curso + Regalo Profe +
+
+ Colegios +

Gracias por ser nuestra profe

+
+ 49,00 € + + Personalizar + +
+
+
+ + +
+
+ Cleo y Cuquín +
+
+ Licencia Oficial +

Cleo y Cuquín: El Abecedario

+
+ 32,00 € + + Personalizar + +
+
+
+ + +
+
+ Aprende los números +
+
+ Matemáticas +

Aprende los números

+
+ 24,95 € + + Personalizar + +
+
+
+ + +
+
+ Aprende los colores +
+
+ Estimulación +

Aprende los colores

+
+ 24,95 € + + Personalizar + +
+
+
+ + +
+
+ Aprende las vocales +
+
+ Lectura +

Aprende las vocales

+
+ 24,95 € + + Personalizar + +
+
+
+ + +
+
+ Te quiero, papá avatares +
+
+ Con Ilustración +

Te quiero, papá (Avatares)

+
+ 32,00 € + + Personalizar + +
+
+
+ + +
+
+ Superando los miedos +
+
+ Psicología infantil +

Superando los miedos

+
+ 29,95 € + + Personalizar + +
+
+
+ + +
+
+ Barriga de mamá +
+
+ Hermanos +

En la barriga de mamá hay...

+
+ 29,95 € + + Personalizar + +
+
+
+ + +
+
+ Cleo y Cuquín Navidad +
+
+ Navidad +

Cleo y Cuquín: Navidad

+
+ 32,00 € + + Personalizar + +
+
+
+ +
+ + + + +
+
+ +
+
+
+ + +
+
+
+
+ +
+
+
+ + +
+ Elaboración Artesanal y Pedagógica +

+ ¡Últimas Novedades de Trasto! +

+
+

+ Todos nuestros cuentos están diseñados y revisados por profesionales de la educación, buscando siempre nuevas ideas con las que ilusionar a los pequeños de la casa. +

+

+ Nuestra elaboración es casi artesanal: combinamos tecnologías digitales para que puedas personalizar los nombres e imágenes de manera rápida, pero nuestro proceso de ilustración y desarrollo pedagógico es 100% humano y pensado con amor. +

+

+ Son el regalo perfecto para fechas señaladas, cumpleaños, el día del padre o de la madre, y para construir recuerdos imborrables que perdurarán con el paso de los años. +

+
+ +
+ +
+
+
+ +
+
+ + +
+
+

Únete a nuestra comunidad

+

Recibe ofertas exclusivas, novedades editoriales y consejos educativos de manera mensual.

+
+
+
+
+ + +
+ +
+
+
+ + +
+ + +
+ TrastoBooks +

+ Creamos cuentos donde la magia y el aprendizaje se encuentran. Personaliza el cuento perfecto que recordarán para siempre. +

+
+ + + +
+
+ + + + + + + + +
+

Atención al Cliente

+

¿Dudas con el pedido? Llámanos o escríbenos directamente por WhatsApp de lunes a viernes.

+
+

Teléfono: 633763957

+

Email: info@trastobooks.com

+
+
+ +
+ + +
+

© 2026 TrastoBooks.com. Todos los derechos reservados.

+

Hecho con ❤️ en España.

+
+
+
+ + + + + Ayuda + + + + + + +
+ + Mensaje +
+ + + + + \ No newline at end of file diff --git a/src/html/index.php b/src/html/index.php new file mode 100644 index 0000000..0bfbc90 --- /dev/null +++ b/src/html/index.php @@ -0,0 +1,33 @@ +$value) + { + define(strtoupper($var),$value); + } +} +/* + +if(error_log("API Access")) + echo "SI"; +else + echo "NO"; +*/ +try{ + $b = new boot(); +} catch (Exception $e) { + echo 'Caught exception: ', $e->getMessage(), "\n"; +} + +//session_destroy();die; + + +//echo core\debug\debug::getLog(); die; + +?> diff --git a/src/html/js/admin/editor.js b/src/html/js/admin/editor.js new file mode 100644 index 0000000..13f564a --- /dev/null +++ b/src/html/js/admin/editor.js @@ -0,0 +1,851 @@ +let activePageId; + +// Inicialización del editor en caliente protegiendo tiempos de renderizado de PHP +window.onload = function() { + if (typeof bookConfig !== 'undefined' && bookConfig.pages && bookConfig.pages.length > 0) { + activePageId = bookConfig.pages[0].page_id; + } else { + // Fallback estructural por si el entorno del iframe carga sin config + bookConfig = { + "book_id": 99, + "settings": { + "dpi": 300, + "fonts": { "main": "Mali-Bold.ttf", "secondary": "Calibri.ttf" }, + "base_font_size": 130, + "colors": { "black": "#1E293B", "white": "#FFFFFF", "title": "#0284C7", "accent": "#0D9488" }, + "variables": { "name": "Martín", "ninyo1": "assets/fotos/ninyo.png", "papa": "assets/fotos/papa.png" } + }, + "user_photo": { "width": 450, "height": 450 }, + "pages": [ + { + "page_id": 0, + "description": "Portada del Cuento", + "background": "assets/fondos/selva_portada_bg.png", + "elements": [ + { "type": "photo", "x": 830, "y": 830, "width": 450, "height": 450, "rotation": 0, "variable": "ninyo1" }, + { "type": "text", "x": 100, "y": 100, "width": 1800, "height": 300, "rotation": 0, "text": { "es": "La gran selva de {{name}}" }, "style": { "size": 150, "color": "title", "gravity": "CENTER" } } + ] + } + ] + }; + activePageId = bookConfig.pages[0].page_id; + } + + // Inicializar secciones + initGlobalForm(); + renderColors(); + renderVariables(); + renderPagesList(); + loadActivePageElements(); + renderCanvas(); +}; + +// Conversión matemática: Píxeles de Imprenta a Centímetros físicos (origen top-left 0,0) +function pxToCm(pxValue) { + const dpi = bookConfig.settings.dpi || 300; + const inches = pxValue / dpi; + const cm = inches * 2.54; + return parseFloat(cm.toFixed(2)); +} + +function cmToPx(cmValue) { + const dpi = bookConfig.settings.dpi || 300; + const inches = cmValue / 2.54; + return Math.round(inches * dpi); +} + +// Mostrar Toast emergente +function showToast(message, isError = false) { + const toast = document.getElementById('toast'); + const iconContainer = document.getElementById('toastIconContainer'); + const text = document.getElementById('toastMessage'); + text.textContent = message; + + if (isError) { + iconContainer.className = "w-6 h-6 rounded-full flex items-center justify-center text-xs bg-rose-500/10 text-rose-400 border border-rose-500/20"; + iconContainer.innerHTML = ''; + } else { + iconContainer.className = "w-6 h-6 rounded-full flex items-center justify-center text-xs bg-emerald-500/10 text-emerald-400 border border-emerald-500/20"; + iconContainer.innerHTML = ''; + } + + toast.classList.remove('opacity-0', 'translate-y-10'); + toast.classList.add('opacity-100', 'translate-y-0'); + + setTimeout(() => { + toast.classList.add('opacity-0', 'translate-y-10'); + toast.classList.remove('opacity-100', 'translate-y-0'); + }, 3000); +} + +// Inicializar Formulario global con ajustes +function initGlobalForm() { + document.getElementById('global-book-id').value = bookConfig.book_id; + document.getElementById('global-dpi').value = bookConfig.settings.dpi; + document.getElementById('global-fontsize').value = bookConfig.settings.base_font_size; + document.getElementById('global-photowidth').value = bookConfig.user_photo.width; + document.getElementById('global-photoheight').value = bookConfig.user_photo.height; + document.getElementById('global-font-main').value = bookConfig.settings.fonts.main; + document.getElementById('global-font-sec').value = bookConfig.settings.fonts.secondary; +} + +// Renderizar paleta de colores de imprenta +function renderColors() { + const container = document.getElementById('colors-list'); + if(!container) return; + container.innerHTML = ''; + Object.entries(bookConfig.settings.colors).forEach(([key, val]) => { + const row = document.createElement('div'); + row.className = "flex items-center gap-2"; + row.innerHTML = ` + ${key}: + + + `; + container.appendChild(row); + }); +} + +// Renderizar y editar variables como etiquetas fijas de solo entrada de valor (con alineación mejorada) +function renderVariables() { + const container = document.getElementById('variables-list'); + if (!container) return; + container.innerHTML = ''; + + if (!bookConfig.settings.variables) { + bookConfig.settings.variables = {}; + } + + Object.entries(bookConfig.settings.variables).forEach(([key, val]) => { + const col = document.createElement('div'); + col.className = "flex items-end gap-1.5 bg-slate-50 p-2.5 rounded-xl border border-slate-100 hover:border-slate-200 transition-all"; + col.innerHTML = ` +
+ ${key} + +
+ +
+ + +
+ `; + container.appendChild(col); + }); +} + +function updateVariableValue(key, val) { + bookConfig.settings.variables[key] = val; + renderCanvas(); +} + +function deleteVariable(key) { + delete bookConfig.settings.variables[key]; + renderVariables(); + loadActivePageElements(); // Refrescar los selectores de variables de fotos + renderCanvas(); +} + +function addNewVariable() { + if (!bookConfig.settings.variables) { + bookConfig.settings.variables = {}; + } + const keyName = prompt("Escribe el nombre identificador para la variable:"); + if (keyName && keyName.trim() !== '') { + const cleanKey = keyName.trim(); + bookConfig.settings.variables[cleanKey] = "Valor"; + renderVariables(); + loadActivePageElements(); // Refrescar los selectores de variables de fotos + renderCanvas(); + } +} + +// Actualizar un valor global de configuración +function updateGlobalSetting(key, val, section = null) { + if (section) { + bookConfig[section][key] = val; + } else { + bookConfig[key] = val; + } + renderCanvas(); + loadActivePageElements(); +} + +function updateGlobalFont(key, val) { + bookConfig.settings.fonts[key] = val; +} + +function updateGlobalColor(key, val) { + bookConfig.settings.colors[key] = val; + renderColors(); + renderCanvas(); +} + +// Cargar y mostrar lista lateral de páginas +function renderPagesList() { + const container = document.getElementById('pages-list'); + if(!container) return; + container.innerHTML = ''; + bookConfig.pages.forEach((p) => { + const btn = document.createElement('button'); + btn.className = `w-full text-left px-3 py-2.5 rounded-xl text-xs font-bold flex items-center justify-between group transition-all ${p.page_id === activePageId ? 'bg-trastoBlue/10 text-trastoBlue font-extrabold shadow-xs' : 'text-slate-600 hover:bg-slate-50'}`; + btn.innerHTML = ` +
+ ${p.page_id} + ${p.description || 'Página sin nombre'} +
+ + `; + container.appendChild(btn); + }); +} + +function setActivePage(id) { + activePageId = id; + const pageTitle = document.getElementById('active-page-title'); + if(pageTitle) pageTitle.innerText = `#${id}`; + renderPagesList(); + loadActivePageElements(); + renderCanvas(); +} + +// Cargar los campos editables del sidebar de elementos +function loadActivePageElements() { + const container = document.getElementById('elements-editor-container'); + if(!container) return; + container.innerHTML = ''; + + const page = bookConfig.pages.find(p => p.page_id === activePageId); + if (!page) return; + + // Cargar imagen de fondo a través de la pasarela PHP + const backgroundPath = page.background || ''; + const canvasEl = document.getElementById('visual-canvas'); + if (canvasEl) { + if (backgroundPath) { + const secureBackgroundUrl = `/admin/getImage?book=${bookConfig.book_id}&file=${encodeURIComponent(backgroundPath)}`; + canvasEl.style.backgroundImage = `url('${secureBackgroundUrl}')`; + canvasEl.style.backgroundSize = "cover"; + canvasEl.style.backgroundPosition = "center"; + canvasEl.style.backgroundRepeat = "no-repeat"; + } else { + canvasEl.style.backgroundImage = 'none'; + canvasEl.style.backgroundColor = '#ffffff'; + } + } + + // Título y fondo de página + const pageHeader = document.createElement('div'); + pageHeader.className = "bg-slate-50 p-4 rounded-xl border border-slate-200/60 space-y-3"; + pageHeader.innerHTML = ` +
+ + +
+
+ + +
+ `; + container.appendChild(pageHeader); + + // Campos de cada elemento de la página activa + page.elements.forEach((el, index) => { + const card = document.createElement('div'); + card.className = `p-4 rounded-xl border transition-all ${el.type === 'photo' ? 'border-emerald-100 bg-emerald-50/20' : 'border-sky-100 bg-sky-50/20'}`; + + const xCm = pxToCm(el.x); + const yCm = pxToCm(el.y); + + // Obtener o inicializar dimensiones de este elemento en píxeles + const defaultW = el.type === 'photo' ? bookConfig.user_photo.width : 600; + const defaultH = el.type === 'photo' ? bookConfig.user_photo.height : 200; + const elW = el.width || defaultW; + const elH = el.height || defaultH; + + // Guardar valores por defecto en el config para consistencia + if (!el.width) el.width = elW; + if (!el.height) el.height = elH; + if (el.rotation === undefined) el.rotation = 0; + if (el.variable === undefined) el.variable = ""; + + const wCm = pxToCm(elW); + const hCm = pxToCm(elH); + + let innerHtml = ` +
+ + ${el.type === 'photo' ? 'Zona Foto' : 'Zona Texto'} + + +
+ + +
+
+ + + ${el.x} px +
+
+ + + ${el.y} px +
+
+ + +
+
+ + + ${el.width} px +
+
+ + + ${el.height} px +
+
+ + +
+
+ + ${el.rotation || 0}° +
+
+ + +
+
+ `; + + if (el.type === 'photo') { + const vars = Object.keys(bookConfig.settings.variables || {}); + innerHtml += ` +
+ + +
+ `; + } + + if (el.type === 'text') { + innerHtml += ` +
+
+ + +
+
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+
+ `; + } + + card.innerHTML = innerHtml; + container.appendChild(card); + }); +} + +// Actualizar dimensiones físicas de un elemento (Width, Height) +function updateElementSizeCm(idx, axis, cmVal) { + const page = bookConfig.pages.find(p => p.page_id === activePageId); + if (page && page.elements[idx]) { + if (isNaN(cmVal) || cmVal < 0.1) cmVal = 0.5; + if (cmVal > 18.0) cmVal = 18.0; + + const pxVal = cmToPx(cmVal); + page.elements[idx][axis] = pxVal; + + const labelEl = document.querySelector(`span[data-el-idx="${idx}"][data-axis="${axis}-px"]`); + if (labelEl) { + labelEl.innerText = `${pxVal} px`; + } + + renderCanvas(); + } +} + +// Actualizar propiedad de rotación con sincronización bidireccional en caliente +function updateElementRotation(idx, val) { + const page = bookConfig.pages.find(p => p.page_id === activePageId); + if (page && page.elements[idx]) { + if (isNaN(val)) val = 0; + // Normalizar grados entre 0 y 359 de manera segura + val = ((val % 360) + 360) % 360; + + page.elements[idx].rotation = val; + + // Localizar y actualizar los elementos en el DOM de forma reactiva sin reconstruir el panel lateral + const rotValLabel = document.querySelector(`span[data-rot-val="${idx}"]`); + const rotRangeInput = document.querySelector(`input[data-rot-range="${idx}"]`); + const rotNumInput = document.querySelector(`input[data-rot-input="${idx}"]`); + + if (rotValLabel) rotValLabel.innerText = `${val}°`; + if (rotRangeInput && parseInt(rotRangeInput.value) !== val) rotRangeInput.value = val; + if (rotNumInput && parseInt(rotNumInput.value) !== val) rotNumInput.value = val; + + renderCanvas(); + } +} + +// Actualizar imagen de fondo de página +function updatePageBackground(val) { + const page = bookConfig.pages.find(p => p.page_id === activePageId); + if (page) { + page.background = val; + loadActivePageElements(); + renderCanvas(); + } +} + +function renamePage(pageId, name) { + const page = bookConfig.pages.find(p => p.page_id === pageId); + if (page) { + page.description = name; + renderPagesList(); + } +} + +// Actualizar coordenadas en centímetros y pasarlas a px para el JSON +function updateElementCm(idx, axis, cmVal) { + const page = bookConfig.pages.find(p => p.page_id === activePageId); + if (page && page.elements[idx]) { + if (isNaN(cmVal) || cmVal < 0) cmVal = 0; + if (cmVal > 18.0) cmVal = 18.0; + + const pxVal = cmToPx(cmVal); + page.elements[idx][axis] = pxVal; + + const labelEl = document.querySelector(`span[data-el-idx="${idx}"][data-axis="${axis}-px"]`); + if (labelEl) { + labelEl.innerText = `${pxVal} px`; + } + + renderCanvas(); + } +} + +function renderCanvas() { + const container = document.getElementById('canvas-elements'); + const canvasEl = document.getElementById('visual-canvas'); + if(!container || !canvasEl) return; + container.innerHTML = ''; + + const page = bookConfig.pages.find(p => p.page_id === activePageId); + if (!page) return; + + const nameValue = bookConfig.settings.variables?.name || 'Martín'; + const langActive = document.getElementById('sim-lang')?.value || 'es'; + + // 18x18 cm mapeado a base píxeles (Origen 0,0 en esquina superior izquierda) + const dpi = bookConfig.settings.dpi || 300; + const totalPx = Math.round((18 / 2.54) * dpi); + + // Actualizar etiqueta del lienzo dinámetramente + const resolutionLabel = document.getElementById('canvas-max-coordinates'); + if (resolutionLabel) { + resolutionLabel.innerText = `Resolución Imprenta: ${totalPx} x ${totalPx} px (18x18 cm)`; + } + + page.elements.forEach((el, index) => { + let posX = (el.x / totalPx) * 100; + let posY = (el.y / totalPx) * 100; + + // Dimensiones relativas en porcentaje respecto al lienzo + const defaultW = el.type === 'photo' ? bookConfig.user_photo.width : 600; + const defaultH = el.type === 'photo' ? bookConfig.user_photo.height : 200; + const widthPx = el.width || defaultW; + const heightPx = el.height || defaultH; + + let widthPct = (widthPx / totalPx) * 100; + let heightPct = (heightPx / totalPx) * 100; + + // Control de fugas + if (posX < 0) posX = 0; + if (posX + widthPct > 100) posX = 100 - widthPct; + if (posY < 0) posY = 0; + if (posY + heightPct > 100) posY = 100 - heightPct; + + const item = document.createElement('div'); + // Drag-and-drop basado en top-left absoluto (con transformaciones CSS rotadas) + item.className = "absolute select-none cursor-move transition-all duration-75 z-10 hover:shadow-lg rounded-xl p-0.5 bg-transparent hover:ring-2 hover:ring-trastoBlue"; + item.style.left = `${posX}%`; + item.style.top = `${posY}%`; + item.style.width = `${widthPct}%`; + item.style.height = `${heightPct}%`; + + // Aplicar la rotación del elemento respetando el render del navegador + const rotationAngle = el.rotation || 0; + item.style.transform = `rotate(${rotationAngle}deg)`; + + if (el.type === 'photo') { + const photoBox = document.createElement('div'); + // Usamos background-size: contain, background-repeat: no-repeat y background-position: center para respetar el tamaño + photoBox.className = "w-full h-full border-2 border-emerald-500 bg-emerald-100/70 rounded-xl shadow-lg flex flex-col items-center justify-center text-[10px] text-emerald-800 font-bold p-1 pointer-events-none overflow-hidden relative"; + photoBox.style.backgroundRepeat = "no-repeat"; + photoBox.style.backgroundPosition = "center"; + photoBox.style.backgroundSize = "contain"; + + const variableKey = el.variable; + const variableVal = (variableKey && bookConfig.settings.variables) ? bookConfig.settings.variables[variableKey] : null; + + if (variableVal && variableVal.trim() !== '') { + // Solicitar la imagen dinámicamente si el input de la variable tiene algo configurado + const securePhotoUrl = `/admin/getImage?book=${bookConfig.book_id}&file=${encodeURIComponent(variableVal.trim())}`; + photoBox.style.backgroundImage = `url('${securePhotoUrl}')`; + photoBox.innerHTML = ` +
${variableKey}
+ `; + } else { + // Estado por defecto + photoBox.innerHTML = ` + + FOTO (${variableKey || 'Sin variable'}) + ${widthPx}x${heightPx} px + `; + } + item.appendChild(photoBox); + } else { + let rawText = el.text[langActive] || el.text['es'] || ''; + let procesado = rawText; + + // Inyección dinámica inteligente usando el diccionario de variables del cuento + if (bookConfig.settings.variables) { + Object.entries(bookConfig.settings.variables).forEach(([vKey, vVal]) => { + const regex = new RegExp(`{{\\s*${vKey}\\s*}}`, 'gi'); + procesado = procesado.replace(regex, vVal); + }); + } + // Fallback para name de caja de texto + procesado = procesado.replace(/{{\s*name\s*}}/gi, nameValue); + + const textBox = document.createElement('div'); + // Quitamos "overflow-hidden" e inyectamos estilos para saltar de línea dinámicamente si no cabe (Word Wrapping) + // Se quita fondo blanco (bg-white/95), borde y sombra para que sea 100% transparente. + textBox.className = "w-full h-full px-3 py-2 bg-transparent flex flex-col pointer-events-none justify-center"; + + let colorKey = el.style && el.style.color ? el.style.color : 'black'; + let hexColor = bookConfig.settings.colors[colorKey] || '#1e293b'; + + textBox.style.color = hexColor; + textBox.style.fontFamily = el.style && el.style.font === 'secondary' ? 'Quicksand' : 'Fredoka'; + + let scaledSize = el.style && el.style.size ? el.style.size / 6.5 : 14; + textBox.style.fontSize = `${Math.max(scaledSize, 11)}px`; + + let alignment = "text-center"; + if (el.style && el.style.gravity === 'WEST') alignment = "text-left"; + if (el.style && el.style.gravity === 'EAST') alignment = "text-right"; + textBox.className += ` ${alignment}`; + + const xCm = pxToCm(el.x); + const yCm = pxToCm(el.y); + + // Inyectamos clases de ruptura de línea (break-words, whitespace-normal) para el wrap automático + textBox.innerHTML = ` + ${procesado} + x: ${xCm} cm, y: ${yCm} cm + `; + item.appendChild(textBox); + } + + // Acoplar gestor de arrastre físico (drag and drop) + setupDragAndDrop(item, el, index, canvasEl, totalPx); + + container.appendChild(item); + }); +} + +function setupDragAndDrop(item, el, index, canvasEl, totalPx) { + item.addEventListener('mousedown', startDrag); + item.addEventListener('touchstart', startDrag, { passive: false }); + + function startDrag(e) { + e.preventDefault(); + + item.classList.add('ring-2', 'ring-trastoPink', 'scale-[1.02]', 'z-20'); + + const clientX = e.type === 'touchstart' ? e.touches[0].clientX : e.clientX; + const clientY = e.type === 'touchstart' ? e.touches[0].clientY : e.clientY; + + const rect = canvasEl.getBoundingClientRect(); + + const startX = clientX; + const startY = clientY; + const initialX = el.x; + const initialY = el.y; + + function onDrag(moveEvent) { + const currentX = moveEvent.type === 'touchmove' ? moveEvent.touches[0].clientX : moveEvent.clientX; + const currentY = moveEvent.type === 'touchmove' ? moveEvent.touches[0].clientY : moveEvent.clientY; + + const deltaX = currentX - startX; + const deltaY = currentY - startY; + + const scale = totalPx / rect.width; + + let newX = Math.round(initialX + deltaX * scale); + let newY = Math.round(initialY + deltaY * scale); + + // Obtener el ancho y alto del elemento arrastrado + const defaultW = el.type === 'photo' ? bookConfig.user_photo.width : 600; + const defaultH = el.type === 'photo' ? bookConfig.user_photo.height : 200; + const widthPx = el.width || defaultW; + const heightPx = el.height || defaultH; + + // Restringir el arrastre dentro de los márgenes reales (Top-Left 0,0 a Max - Tamaño) + newX = Math.max(0, Math.min(totalPx - widthPx, newX)); + newY = Math.max(0, Math.min(totalPx - heightPx, newY)); + + el.x = newX; + el.y = newY; + + const pctX = (newX / totalPx) * 100; + const pctY = (newY / totalPx) * 100; + item.style.left = `${pctX}%`; + item.style.top = `${pctY}%`; + + const coordIndicator = item.querySelector('.coord-indicator'); + if (coordIndicator) { + coordIndicator.innerText = `x: ${pxToCm(newX)} cm, y: ${pxToCm(newY)} cm`; + } + + // Sincronizar inputs numéricos y leyendas en la columna derecha + const inputX = document.querySelector(`input[data-el-idx="${index}"][data-axis="x"]`); + const inputY = document.querySelector(`input[data-el-idx="${index}"][data-axis="y"]`); + const labelX = document.querySelector(`span[data-el-idx="${index}"][data-axis="x-px"]`); + const labelY = document.querySelector(`span[data-el-idx="${index}"][data-axis="y-px"]`); + + if (inputX) inputX.value = pxToCm(newX); + if (inputY) inputY.value = pxToCm(newY); + if (labelX) labelX.innerText = `${newX} px`; + if (labelY) labelY.innerText = `${newY} px`; + } + + // Finalizar el arrastre de un elemento + function endDrag() { + item.classList.remove('ring-2', 'ring-trastoPink', 'scale-[1.02]', 'z-20'); + document.removeEventListener('mousemove', onDrag); + document.removeEventListener('mouseup', endDrag); + document.removeEventListener('touchmove', onDrag); + document.removeEventListener('touchend', endDrag); + renderCanvas(); + loadActivePageElements(); // Forzar recarga de inputs por si el drag cambió de posición + } + + document.addEventListener('mousemove', onDrag); + document.addEventListener('mouseup', endDrag); + document.addEventListener('touchmove', onDrag, { passive: false }); + document.addEventListener('touchend', endDrag); + } +} + +// Funcionalidades de Páginas +function addNewPage() { + const newId = bookConfig.pages.length > 0 ? Math.max(...bookConfig.pages.map(p => p.page_id)) + 1 : 0; + const newPage = { + "page_id": newId, + "description": `Nueva Página ${newId}`, + "background": "", + "elements": [] + }; + bookConfig.pages.push(newPage); + setActivePage(newId); + showToast("Nueva página en blanco añadida"); +} + +// Eliminar página física +function deletePage(id) { + if (bookConfig.pages.length <= 1) { + showToast("El libro debe contener al menos una página", true); + return; + } + bookConfig.pages = bookConfig.pages.filter(p => p.page_id !== id); + if (activePageId === id) { + activePageId = bookConfig.pages[0].page_id; + } + setActivePage(activePageId); + showToast("Página eliminada correctamente"); +} + +function addElement(type) { + const page = bookConfig.pages.find(p => p.page_id === activePageId); + if (!page) return; + + const dpi = bookConfig.settings.dpi || 300; + const totalPx = Math.round((18 / 2.54) * dpi); + const centerPx = Math.round(totalPx / 2.5); + + let newElement = {}; + if (type === 'photo') { + newElement = { + "type": "photo", + "x": centerPx, + "y": centerPx, + "width": bookConfig.user_photo.width, + "height": bookConfig.user_photo.height, + "rotation": 0, + "variable": "" + }; + } else { + newElement = { + "type": "text", + "x": centerPx, + "y": Math.round(centerPx / 2), + "width": 600, + "height": 200, + "rotation": 0, + "text": { + "es": "¡Nuevo texto para {{name}}!", + "en": "New text for {{name}}!", + "ca": "Nou text per {{name}}!" + }, + "style": { + "size": 100, + "color": "title", + "gravity": "CENTER" + } + }; + } + + page.elements.push(newElement); + loadActivePageElements(); + renderCanvas(); + showToast("Elemento añadido correctamente"); +} + +function removeElement(idx) { + const page = bookConfig.pages.find(p => p.page_id === activePageId); + if (page) { + page.elements.splice(idx, 1); + loadActivePageElements(); + renderCanvas(); + } +} + +function updateElementProp(idx, prop, val) { + const page = bookConfig.pages.find(p => p.page_id === activePageId); + if (page && page.elements[idx]) { + page.elements[idx][prop] = val; + renderCanvas(); + } +} + +function updateElementText(idx, lang, val) { + const page = bookConfig.pages.find(p => p.page_id === activePageId); + if (page && page.elements[idx] && page.elements[idx].text) { + page.elements[idx].text[lang] = val; + renderCanvas(); + } +} + +// Actualizar alineaciones o tamaños de estilo +function updateElementStyle(idx, styleProp, val) { + const page = bookConfig.pages.find(p => p.page_id === activePageId); + if (page && page.elements[idx]) { + if (!page.elements[idx].style) { + page.elements[idx].style = {}; + } + if (val === '') { + delete page.elements[idx].style[styleProp]; + } else { + page.elements[idx].style[styleProp] = val; + } + renderCanvas(); + } +} + +// Exportar y persistir cambios +function copyToClipboard() { + const text = JSON.stringify(bookConfig, null, 4); + const el = document.createElement('textarea'); + el.value = text; + document.body.appendChild(el); + el.select(); + document.execCommand('copy'); + document.body.removeChild(el); + showToast("¡JSON copiado con éxito!"); +} + +function downloadJsonFile() { + const dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(bookConfig, null, 4)); + const downloadAnchor = document.createElement('a'); + downloadAnchor.setAttribute("href", dataStr); + downloadAnchor.setAttribute("download", `book_config_${bookConfig.book_id}.json`); + document.body.appendChild(downloadAnchor); + downloadAnchor.click(); + downloadAnchor.remove(); + showToast("Descarga de configuración iniciada"); +} + +function saveConfigToServer() { + showToast("Sincronizando cambios con el servidor..."); + fetch('/admin/guardarconfig', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(bookConfig) + }) + .then(response => { + if (!response.ok) throw new Error(); + return response.json(); + }) + .then(data => { + if (data.success) { + showToast("¡Fichero escrito físicamente en el servidor!"); + } else { + showToast(data.message, true); + } + }) + .catch(error => { + console.warn("Llamada AJAX simulada."); + setTimeout(() => { + showToast("Guardado con éxito (Simulado)", false); + }, 600); + }); +} \ No newline at end of file diff --git a/src/lib/autoload.php b/src/lib/autoload.php new file mode 100644 index 0000000..19dfddb --- /dev/null +++ b/src/lib/autoload.php @@ -0,0 +1,29 @@ +"; + //see if the file exsists + if(file_exists($classpath)) + { + //echo "Existe $classpath
"; + require_once($classpath); + //only require the class once, so quit after to save effort (if you got more, then name them something else + return; + } + } + //echo "Not found $class_name";die; +}); \ No newline at end of file diff --git a/src/lib/boot.php b/src/lib/boot.php new file mode 100644 index 0000000..964c676 --- /dev/null +++ b/src/lib/boot.php @@ -0,0 +1,144 @@ +configFile; + if(file_exists($iniFile)) + { + $this->readConfig($iniFile); + } + + $goTo = $this->processUrl(); + + // echo "--> ".$this->controller."
"; + // echo "
";
+        // print_r( get_declared_classes());
+        // echo "
"; + $cont = $this->controller."Controller"; + if (class_exists($cont)) + { + //echo "controller Exists
"; + $controller = new $cont(); + + if(strpos($this->action,"?")!==false) + $this->action = substr($this->action,0,strpos($this->action,"?")); + + $functionName = $this->action; //substr($action,0,strpos($action,"(")); <-- PAra rutas complejas + + $params = array(); //Deprecated?? + $controller->render($this->action, $this->isPublic, $params); + //echo \core\debug\debug::getLog(); die; + } + else + { + //echo "No controller exists Redirect";die; + redirect::goto("/error",301); + } + + + } + + function readConfig($path) + { + $array_ini = parse_ini_file($path, true); + + if(isset($array_ini["SESSION"])) + { + if($array_ini["SESSION"]["enabled"]==0) + { + session_destroy(); + } + else + { + if (session_status() === PHP_SESSION_NONE) + { + session_start(); + } + } + } + + if(isset($array_ini["DB"])) + { + + foreach($array_ini["DB"] as $varname => $line) + { + $aux = explode(".",$varname); + $dbname = $aux[1]; + if(!isset($_SESSION["database"][$dbname])) + { + $dbinfo = new \stdClass(); + $dbinfo->host = $array_ini["DB"]["database.$dbname.host"]; + $dbinfo->user = $array_ini["DB"]["database.$dbname.user"]; + $dbinfo->pass = $array_ini["DB"]["database.$dbname.password"]; + $dbinfo->dbname = $array_ini["DB"]["database.$dbname.databasename"]; + + $_SESSION["database"][$dbname] = $dbinfo; + + + } + + } + + + } + + } + + public function processUrl() + { + $url = $_SERVER["REQUEST_URI"]; + + if($url[0]=="/") + { + $url = substr($url,1); + } + $urlsplit = explode("/",$url); + + if(isset($urlsplit[0])) + $project = $urlsplit[0]; + else + $project = DEFAULT_CONTROLLER; //DEFAULT_CONTROLLER + + if(isset($urlsplit[1])) + $action = $urlsplit[1]; + else + $action = DEFAULT_ACTION; //DEFAULT_ACTION + + if($project=="") + { + $project = DEFAULT_CONTROLLER; + } + + if($action=="") + { + $action = DEFAULT_ACTION; + } + + $this->controller = $project; + $this->action = $action; + + //echo ("Quiero ir a $project y hacer $action
"); + if(strpos($action,"?")>0) + $actionNoParams = substr($action, 0,strpos($action,"?")); + else + $actionNoParams = $action; + $routeToCheck = "/".$project."/".$actionNoParams; + + return $routeToCheck; + } + + +} \ No newline at end of file diff --git a/src/lib/common/strings.php b/src/lib/common/strings.php new file mode 100644 index 0000000..3f262ee --- /dev/null +++ b/src/lib/common/strings.php @@ -0,0 +1,105 @@ +:"/\\\|?*]| # file system reserved https://en.wikipedia.org/wiki/Filename#Reserved_characters_and_words + [\x00-\x1F]| # control characters http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx + [\x7F\xA0\xAD]| # non-printing characters DEL, NO-BREAK SPACE, SOFT HYPHEN + [#\[\]@!$&\'()+,;=]| # URI reserved https://www.rfc-editor.org/rfc/rfc3986#section-2.2 + [{}^\~`] # URL unsafe characters https://www.ietf.org/rfc/rfc1738.txt + ~x', + '-', $string); + // avoids ".", ".." or ".hiddenFiles" + $filename = ltrim($filename, '.-'); + // optional beautification + if ($beautify) + $filename = $this->beautify_filename($filename); + // maximize filename length to 255 bytes http://serverfault.com/a/9548/44086 + //$ext = pathinfo($filename, PATHINFO_EXTENSION); + //$filename = mb_strcut(pathinfo($filename, PATHINFO_FILENAME), 0, 255 - ($ext ? strlen($ext) + 1 : 0), mb_detect_encoding($filename)) . ($ext ? '.' . $ext : ''); + + return $filename; + } + + public function beautify_filename($filename) { + // reduce consecutive characters + $filename = preg_replace(array( + // "file name.zip" becomes "file-name.zip" + '/ +/', + // "file___name.zip" becomes "file-name.zip" + '/_+/', + // "file---name.zip" becomes "file-name.zip" + '/-+/' + ), '-', $filename); + $filename = preg_replace(array( + // "file--.--.-.--name.zip" becomes "file.name.zip" + '/-*\.-*/', + // "file...name..zip" becomes "file.name.zip" + '/\.{2,}/' + ), '.', $filename); + + $utf8 = array( + '/[áàâãªä]/u' => 'a', + '/[ÁÀÂÃÄ]/u' => 'A', + '/[ÍÌÎÏ]/u' => 'I', + '/[íìîï]/u' => 'i', + '/[éèêë]/u' => 'e', + '/[ÉÈÊË]/u' => 'E', + '/[óòôõºö]/u' => 'o', + '/[ÓÒÔÕÖ]/u' => 'O', + '/[úùûü]/u' => 'u', + '/[ÚÙÛÜ]/u' => 'U', + '/ç/' => 'c', + '/Ç/' => 'C', + '/ñ/' => 'n', + '/Ñ/' => 'N', + '/–/' => '-', // UTF-8 hyphen to "normal" hyphen + '/[’‘‹›‚]/u' => '-', // Literally a single quote + '/[“”«»„]/u' => '-', // Double quote + '/ /' => '-', // nonbreaking space (equiv. to 0x160) + ); + $filename = preg_replace(array_keys($utf8), array_values($utf8), $filename); + + // lowercase for windows/unix interoperability http://support.microsoft.com/kb/100625 + $filename = strtolower($filename); + // ".file-name.-" becomes "file-name" + $filename = trim($filename, '.-'); + return $filename; + } + + /** + * Extrae las iniciales de un nombre completo (máximo 2 letras). + * Soporta tildes y caracteres especiales en UTF-8 de forma segura. + * + * @param string $nombre Nombre completo (ej: "Martín Rodríguez") + * @return string Iniciales resultantes en mayúsculas (ej: "MR") + */ + function obtenerIniciales($nombre) { + // Eliminamos espacios dobles y limpiamos extremos + $nombreLimpio = preg_replace('/\s+/', ' ', trim($nombre)); + $palabras = explode(' ', $nombreLimpio); + $iniciales = ''; + + foreach ($palabras as $palabra) { + if (!empty($palabra)) { + // Extraemos la primera letra de cada palabra de forma segura para UTF-8 (con tildes) + $iniciales .= mb_substr($palabra, 0, 1, 'UTF-8'); + } + // Limitamos a un máximo de 2 iniciales (Nombre y Primer Apellido) + if (mb_strlen($iniciales, 'UTF-8') >= 2) { + break; + } + } + + return mb_strtoupper($iniciales, 'UTF-8'); + } +} \ No newline at end of file diff --git a/src/lib/custom/security.php b/src/lib/custom/security.php new file mode 100644 index 0000000..236d608 --- /dev/null +++ b/src/lib/custom/security.php @@ -0,0 +1,51 @@ +db = new \database\mysql($dbinfo->host, $dbinfo->user, $dbinfo->pass, $dbinfo->dbname); + } + + public function check($api, $hash) + { + //Check if hash can be accessed by this api key + + //Check if api key is from admin + $sql = "Select * from users where s_apikey = '$api'"; + $admininfo = $this->db->query($sql)->fetchArray(); + if($admininfo["b_admin"]==1) + { + //echo "admin $api";die; + //User by api key is admin, let enter + return true; + } + + //Check item by book hash + $sql = "select u.s_apikey, u.b_admin, u.b_active from books b, users u where b.s_hash = '$hash' and b.id_users = u.id"; + + $userinfo = $this->db->query($sql)->fetchArray(); + + if($userinfo["b_active"]) + { + if($userinfo["s_apikey"]==$api) + { + //Book is from user + return true; + } + else + { + //Book is from another user + return false; + } + } + else + { + //Book of disabled user + return false; + } + + } +} \ No newline at end of file diff --git a/src/lib/custom/status.php b/src/lib/custom/status.php new file mode 100644 index 0000000..475c939 --- /dev/null +++ b/src/lib/custom/status.php @@ -0,0 +1,31 @@ +"Pending PDF Process", + "PDF_PROCESS"=>"Processing PDF", + "PEND_SENT_EXTRACTION"=>"Pending SENTENCE generation", + "PEND_AUDIO_GEN"=>"PDF Processed, pending audio generation", + "AUDIO_PROCESS"=>"Generating Audio cuts", + "AUDIO_PROCESSED"=>"All audios generated", + "GEN_FULLMP3"=>"Pasting Audio for full audiobook", + "FINISHED"=>"Full Mp3 Available", + "NTX"=>"Natxo Dummy Status", + "ARCHIVED"=>"Book no longed Editable" + ); + + if(isset($arrayStatus[$label])) + return $arrayStatus[$label]; + else + return "ERROR- Unknown Status"; + } +} \ No newline at end of file diff --git a/src/lib/data/mockup.php b/src/lib/data/mockup.php new file mode 100644 index 0000000..6d65969 --- /dev/null +++ b/src/lib/data/mockup.php @@ -0,0 +1,295 @@ +jsonPath = UPLOADS_DIR . 'mockup/data.json'; + $this->cargarDatos(); + } + + /** + * Carga los datos del archivo JSON en memoria. Si no existe, genera la semilla inicial. + */ + private function cargarDatos() { + if (file_exists($this->jsonPath)) { + $jsonCrudo = file_get_contents($this->jsonPath); + $this->data = json_decode($jsonCrudo, true); + + // Si el JSON estuviera corrupto o vacío, resembramos por seguridad + if (json_last_error() !== JSON_ERROR_NONE || empty($this->data)) { + $this->seedData(); + } + } else { + $this->seedData(); + } + } + + /** + * Genera y almacena el estado inicial predeterminado en data.json + */ + private function seedData() { + $this->data = [ + 'usuarios' => [ + 1 => [ + 'id' => 1, + 'nombre' => 'Martín Rodríguez', + 'email' => 'martin.cliente@trastobooks.com', + 'password' => password_hash('cliente123', PASSWORD_BCRYPT), + 'rol' => 'cliente', + 'activo' => 1, + 'fecha_registro' => '2026-01-10 10:15:30', + 'fecha_ultimo_acceso' => date('Y-m-d H:i:s'), + 'telefono' => '633763957', + 'direccion' => 'Calle del Trasto, Nº 26, 3ºB', + 'codigopostal' => '28014', + 'ciudad' => 'Madrid', + 'pais' => 'España' + ], + 2 => [ + 'id' => 2, + 'nombre' => 'Soporte Admin TrastoBooks', + 'email' => 'soporte.admin@trastobooks.com', + 'password' => password_hash('admin123', PASSWORD_BCRYPT), + 'rol' => 'admin', + 'activo' => 1, + 'fecha_registro' => '2025-12-01 08:00:00', + 'fecha_ultimo_acceso' => date('Y-m-d H:i:s'), + 'telefono' => '633763957', + 'direccion' => 'Avenida de la Imprenta, Nº 10', + 'codigopostal' => '08001', + 'ciudad' => 'Barcelona', + 'pais' => 'España' + ] + ], + 'libros' => [ + 1 => [ + 'id' => 1, + 'titulo' => '[Nombre] & Trasto quieren ser...', + 'autor' => 'Equipo Creativo TrastoBooks', + 'sinopsis' => 'Un fascinante viaje por el mundo de los oficios y los sueños donde el pequeño lector se convierte en explorador, astronauta y más.', + 'numero_paginas' => 32, + 'precio' => 2995, + 'ruta_archivo_config' => 'configs/quieren_ser_config.json', + 'ruta_portada' => 'https://trastobooks.com/131-home_default/nombre-trasto-quieren-ser.jpg', + 'activo' => 1, + 'fecha_subida' => '2026-01-15 12:00:00', + 'fecha_modificacion' => '2026-01-15 12:00:00' + ], + 2 => [ + 'id' => 2, + 'titulo' => '¡Gracias, abuelos! (Fotos)', + 'autor' => 'Equipo Creativo TrastoBooks', + 'sinopsis' => 'Un tierno homenaje ilustrado para dar las gracias a quienes nos miman, nos cuidan y nos regalan los mejores abrazos.', + 'numero_paginas' => 24, + 'precio' => 3200, + 'ruta_archivo_config' => 'configs/gracias_abuelos.json', + 'ruta_portada' => 'https://trastobooks.com/509-home_default/gracias-abuelos.jpg', + 'activo' => 1, + 'fecha_subida' => '2026-02-01 11:30:00', + 'fecha_modificacion' => '2026-02-01 11:30:00' + ] + ], + 'pedidos' => [ + 101 => [ + 'id' => 101, + 'id_pedido_tienda' => 'PED-2026-904', + 'id_usuario' => 1, + 'id_libro' => 1, + 'nombre_peque' => 'Martín', + 'genero_peque' => 'boy', + 'tipo_letra' => 'lower', + 'foto_prota_url' => 'uploads/pedidos/foto_martin_cara.jpg', + 'precio_total' => 2995, + 'estado' => 'en reparto', + 'fecha_pedido' => '2026-06-18 19:21:00' + ] + ] + ]; + $this->guardarDatos(); + } + + /** + * Guarda el estado actual de $this->data físicamente en el archivo data.json + */ + private function guardarDatos() { + file_put_contents( + $this->jsonPath, + json_encode($this->data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) + ); + } + + + public function getUsuarios() { + return $this->data['usuarios']; + } + + public function getUsuarioById($id) { + return isset($this->data['usuarios'][$id]) ? $this->data['usuarios'][$id] : null; + } + + public function getUsuarioByEmail($email) { + foreach ($this->getUsuarios() as $user) { + if (strtolower($user['email']) === strtolower(trim($email))) { + return $user; + } + } + return null; + } + + /** + * Valida las credenciales de un usuario + */ + public function login($email, $password) { + $user = $this->getUsuarioByEmail($email); + if ($user && password_verify($password, $user['password'])) { + $this->data['usuarios'][$user['id']]['fecha_ultimo_acceso'] = date('Y-m-d H:i:s'); + return $this->data['usuarios'][$user['id']]; + } + return false; + } + + + public function getLibros($soloActivos = false) { + $libros = $this->data['libros']; + if ($soloActivos) { + return array_filter($libros, function($libro) { + return $libro['activo'] == 1; + }); + } + return $libros; + } + + public function getLibroById($id) { + return isset($this->data['libros'][$id]) ? $this->data['libros'][$id] : null; + } + + /** + * Guarda o actualiza un libro y persiste los cambios en data.json + */ + public function saveLibro($datosLibro) { + if (isset($datosLibro['id']) && isset($this->data['libros'][$datosLibro['id']])) { + $id = $datosLibro['id']; + $datosLibro['fecha_modificacion'] = date('Y-m-d H:i:s'); + $this->data['libros'][$id] = array_merge($this->data['libros'][$id], $datosLibro); + } else { + $id = count($this->data['libros']) > 0 ? max(array_keys($this->data['libros'])) + 1 : 1; + $nuevoLibro = array_merge([ + 'id' => $id, + 'titulo' => 'Sin Título', + 'autor' => 'Desconocido', + 'sinopsis' => '', + 'numero_paginas' => 24, + 'precio' => 2995, + 'ruta_archivo_config'=> '', + 'ruta_portada' => 'https://placehold.co/250x250/F0FDFA/0284C7?text=Nuevo+Cuento', + 'activo' => 1, + 'fecha_subida' => date('Y-m-d H:i:s'), + 'fecha_modificacion' => date('Y-m-d H:i:s') + ], $datosLibro); + + $this->data['libros'][$id] = $nuevoLibro; + } + + // Escribimos de forma física en el JSON + $this->guardarDatos(); + return $id; + } + + public function deleteLibro($id) { + if (isset($this->data['libros'][$id])) { + unset($this->data['libros'][$id]); + $this->guardarDatos(); + return true; + } + return false; + } + + + public function getPedidos() { + return $this->data['pedidos']; + } + + public function getPedidoById($id) { + return isset($this->data['pedidos'][$id]) ? $this->data['pedidos'][$id] : null; + } + + public function getPedidosByUsuario($idUsuario) { + return array_filter($this->getPedidos(), function($pedido) use ($idUsuario) { + return $pedido['id_usuario'] == $idUsuario; + }); + } + + /** + * Guarda o actualiza los datos de un pedido + */ + public function savePedido($datosPedido) { + if (isset($datosPedido['id']) && isset($this->data['pedidos'][$datosPedido['id']])) { + $id = $datosPedido['id']; + $this->data['pedidos'][$id] = array_merge($this->data['pedidos'][$id], $datosPedido); + } else { + $id = count($this->data['pedidos']) > 0 ? max(array_keys($this->data['pedidos'])) + 1 : 101; + $nuevoPedido = array_merge([ + 'id' => $id, + 'id_pedido_tienda' => 'PED-2026-' . rand(100, 999), + 'id_usuario' => 1, + 'id_libro' => 1, + 'nombre_peque' => 'Peque', + 'genero_peque' => 'boy', + 'tipo_letra' => 'lower', + 'foto_prota_url' => '', + 'precio_total' => 2995, + 'estado' => 'diseñando', + 'fecha_pedido' => date('Y-m-d H:i:s') + ], $datosPedido); + + $this->data['pedidos'][$id] = $nuevoPedido; + } + $this->guardarDatos(); + return $id; + } + + /** + * Restablece los datos de simulación en memoria + */ + public function reset() { + $this->seedData(); + } +} + +// ========================================================================= +// EJEMPLO DE USO PRÁCTICO (Puedes descomentar para probarlo directamente) +// ========================================================================= +/* +$mock = new Mockup(); + +// 1. Listar los libros activos en el catálogo de cara al cliente +$catalogoPublico = $mock->getLibros(true); + +// 2. Simular un login +$usuarioLogueado = $mock->login('martin.cliente@trastobooks.com', 'cliente123'); +if ($usuarioLogueado) { + echo "Hola de nuevo, " . $usuarioLogueado['nombre']; +} + +// 3. Crear un nuevo libro en el catálogo (Administrador) +$idNuevo = $mock->saveLibro([ + 'titulo' => 'Aventuras en el Espacio con Trasto', + 'autor' => 'Equipo Educativo Trasto', + 'precio' => 3200 // 32.00 € +]); +*/ +?> \ No newline at end of file diff --git a/src/lib/database/db.php b/src/lib/database/db.php new file mode 100644 index 0000000..f2c937a --- /dev/null +++ b/src/lib/database/db.php @@ -0,0 +1,275 @@ +DB
"; + $databaseName = $_SESSION["projectdb"]; + if (isset($_SESSION["database"][$databaseName])) { + $dbinfo = $_SESSION["database"][$databaseName]; + parent::__construct($dbinfo->host, $dbinfo->user, $dbinfo->pass, $dbinfo->dbname); + } else { + echo "Cannot find database configuration. Aborting"; + die; + } + // if(false) { + // echo "\r\n
=Systems====\r\n
"; + // print_r($this); + // die(); + // } + } + public function getTableName() + { + if (!empty($this->database)) + return $this->database . "." . $this->tablename; + else + return $this->tablename; + } + + public function getById($id) + { + $sql = "Select * from " . $this->getTableName() . " where id = $id"; + $res = $this->query($sql)->fetchArray(); + return $res; + } + + //Llevar a DB + public function getDefinition() + { + return $this->definition; + } + + public function var_to_sql($field, $aux_data) + { + switch ($this->definition[$field]["type"]) { + + case "integer": + case "float": + case "number": + case "boolean": + return $aux_data . ","; + /** Sistema para meter el valor de FIXED */ + //Si fixed es integer vale, si fixed es string peta. Como lo diferenciamos? + case "FIXED": + case "fixed": + //return $this->definition[$field]["default"] ?? "" . ","; + return "'" . ($this->definition[$field]["default"] ?? "") . "',"; + break; + case "string": + case "json": //Presuponemos que ya viene json_encoded + default: + return "'" . addslashes($aux_data) . "',"; + } + } + + /** segunda version de insert + * @param $data array donde vienen los datos a insertar. deberia de haberlos filtrado mascado la classe padre + * @return int|false|error id del dato insertado + */ + public function insert($data) + { + if (!isset($this->definition) || empty($this->definition)) { + echo "Cannot use core insert without definition. Re-declare yours"; + die; + } + + $havingfields = array(); + $aux_json_store_array = array(); + + foreach ($this->definition as $key => $field) { + + if (isset($field["fieldname"]) && isset($data[$key])) { + $the_field = $field["fieldname"]; + + if (isset($field["store"])) { + $the_store = $field["store"]; + + $aux_json = array(); + if (isset($data[$the_store])) { + $aux_json = json_decode($data[$the_store], true); + } + $aux_json[$the_field] = $data[$key]; + unset($data[$key]); + //$data[$the_store] = json_encode($aux_json); + + $data[$the_store] = json_encode($aux_json, JSON_HEX_APOS | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_INVALID_UTF8_IGNORE); + $aux_json_store_array[$the_store] = 1; + } else { + $havingfields[$key] = $the_field; + } + } else { + if (isset($field["required"]) && $field["required"] == true) { + $error = new error(-1, $field["fieldname"] . " requiered but not present"); + echo $field["fieldname"] . " requiered but not present
"; + print_r($data); + die; + //Required field not present @@@ usar error class o el sistema de errores que habia antes. + //return $error; + } + } + } + $extradata = ""; + if (count($aux_json_store_array) > 0) { + foreach ($aux_json_store_array as $key => $value) { + $extradata .= ", " . $key; + } + } + + if (count($havingfields) > 0) { + $sql = "Insert into " . $this->getTableName() . " (" . implode(",", $havingfields) . " $extradata) values ("; + foreach ($havingfields as $key => $the_field) { + $sql .= self::var_to_sql($key, $data[$key]); + } + + if (count($aux_json_store_array) > 0) { + foreach ($aux_json_store_array as $key => $value) { + $sql .= "'" . $data[$key] . "',"; + } + } + // Borro siempre la ultima "," + $sql = substr($sql, 0, strlen($sql) - 1); + + $sql .= ")"; + + echo "--> $sql <--"; + //die; + + //Execute + $result = $this->query($sql); + + if ($result->query_error == false) { + return $result->lastInsertID(); + } else { + return false; + } + } + } + + public function update($data, $where) + { + if (!isset($this->definition) || empty($this->definition)) { + echo "Cannot use core update without definition. Re-declare yours"; + die; + } + /* @@@ Añadir que carge primero todos los extradatas y asi lo Updatee y no lo machaque. */ + $sql = "Update " . $this->getTableName() . " set "; + $aux_json_store_array = array(); + foreach ($this->definition as $key => $field) { + if (isset($field["fieldname"]) && isset($data[$key])) { + $the_field = $field["fieldname"]; + + if (isset($field["store"])) { + $the_store = $field["store"]; + + $aux_json = array(); + if (isset($data[$the_store])) { + $aux_json = json_decode($data[$the_store], true); + } + $aux_json[$the_field] = $data[$key]; + unset($data[$key]); + $data[$the_store] = json_encode($aux_json, JSON_HEX_APOS | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_INVALID_UTF8_IGNORE); + $aux_json_store_array[$the_store] = 1; + } + if (isset($data[$key])) { + $sql .= $the_field . "=" . self::var_to_sql($key, $data[$key]); + } + } + } + if (count($aux_json_store_array) > 0) { + foreach ($aux_json_store_array as $key => $value) { + $sql .= $key . "= '" . $data[$key] . "',"; + } + } + $sql = substr($sql, 0, strlen($sql) - 1); // Quitar la ultima , que no es necesaria + + + $sql .= " where $where "; + //echo "-->$sql<--"; + + $result = $this->query($sql); + + if ($result->query_error == false) { + return true; + } else { + $error = new error(-1, "ha ocurrido un erro en el Update"); + return $error; + } + } + + public function delete($where) + { + $sql = "Delete from " . $this->getTableName() . " where $where"; + + $result = $this->query($sql); + + if ($result->query_error == false) { + return true; + } else { + return false; + } + } + + + /* TESTING!!! */ + public function getAll() + { + $sql = "Select * from " . $this->getTableName(); + + $res = $this->query($sql)->fetchAll(); + + return $res; + } + + + public function tableview() + { + $items = $this->getAll(); + + $params["data"] = $items; + + $item = $items[0]; + $columns = array(); + + //@TODO: TB SE PUEDE USAR LA DEFINICION... listoqeresunlisto + $notshowcolumns = array("s_articulos"); //por si no queremos mostrar id por ejemmplo + foreach ($item as $key => $value) { + $columns[] = $key; + } + + $params["columns"] = $columns; + $params["notshowcolumns"] = $notshowcolumns; + + //User resources + $params["canedit"] = true; + $params["candelete"] = true; + + $params["definition"] = $this->definition; + + $helper = "../lib/core/helpers/table.php"; + $snipet = new snipet; + $content = $snipet->load($helper, $params); + + return $content; + } + + public function helpers($snipet, $params) + { + //$p = new db(); + switch ($snipet) { + case "tabla": + return $this->tableview(); + break; + } + } +} diff --git a/src/lib/database/mysql.php b/src/lib/database/mysql.php new file mode 100644 index 0000000..9462b32 --- /dev/null +++ b/src/lib/database/mysql.php @@ -0,0 +1,181 @@ +connection = new \mysqli($dbhost, $dbuser, $dbpass, $dbname); + if ($this->connection->connect_error) { + $this->error('Failed to connect to MySQL - ' . $this->connection->connect_error); + die(); + } + $this->connection->set_charset($charset); + } + + public function query($query) + { + $this->query_str = $query; + if (!$this->query_closed) { + $this->query->close(); + } + if ($this->query = $this->connection->prepare($query)) { + if (func_num_args() > 1) { + $x = func_get_args(); + $args = array_slice($x, 1); + $types = ''; + $args_ref = array(); + foreach ($args as $k => &$arg) { + if (is_array($args[$k])) { + foreach ($args[$k] as $j => &$a) { + $types .= $this->_gettype($args[$k][$j]); + $args_ref[] = &$a; + } + } else { + $types .= $this->_gettype($args[$k]); + $args_ref[] = &$arg; + } + } + array_unshift($args_ref, $types); + call_user_func_array(array($this->query, 'bind_param'), $args_ref); + } + $this->query->execute(); + if ($this->query->errno) { + $this->query_error = true; + $this->error('Unable to process MySQL query (check your params) - ' . $this->query->error . ' ' . $this->query_str); + } + $this->query_closed = FALSE; + $this->query_count++; + } else { + $this->query_error = true; + $this->error('Unable to prepare MySQL statement (check your syntax) - ' . $this->connection->error . "\r\n " . $this->query_str); + } + return $this; + } + + + /*public function fetchAssoc($callback = null) + { + }*/ + + public function array_helper_clone($value) { + return $value; + } + + private function array_clone($value) { + return array_map('self::array_helper_clone', $value); + } + + public function fetchAll($callback = null) + { + $params = array(); + $row = array(); + + $meta = $this->query->result_metadata(); + while ($field = $meta->fetch_field()) { + $params[] = &$row[$field->name]; + } + call_user_func_array(array($this->query, 'bind_result'), $params); + $result_array = array(); + + //@@@ ver si en vez de usar fetch , podemos usar fetch_assoc + // $row es refernaciado y no hay una funcion array_clone() + while ($this->query->fetch()) { + + //$r = self::array_clone($row); + $result = array(); + foreach ($row as $key => $val) { + $result[$key] = $val; + } + + if ($callback != null && is_callable($callback)) { + $value = call_user_func($callback, $result); + if ($value == 'break') break; + //$result_array[] = $value; + } else { + $result_array[] = $result; + } + } + $this->query->close(); + $this->query_closed = TRUE; + return $result_array; + } + + public function fetchArray() + { + $params = array(); + $row = array(); + $meta = $this->query->result_metadata(); + while ($field = $meta->fetch_field()) { + $params[] = &$row[$field->name]; + } + + call_user_func_array(array($this->query, 'bind_result'), $params); + + $result = array(); + while ($this->query->fetch()) { + foreach ($row as $key => $val) { + $result[$key] = $val; + } + } + $this->query->close(); + $this->query_closed = TRUE; + + return $result; + } + + public function close() + { + return $this->connection->close(); + } + + public function numRows() + { + $this->query->store_result(); + return $this->query->num_rows; + } + + public function affectedRows() + { + return $this->query->affected_rows; + } + + public function lastInsertID() + { + return $this->connection->insert_id; + } + + public function error($error) + { + if ($this->show_errors) { + exit($error); + } + + $this->query_msg = $error; + return false; + } + + private function _gettype($var) + { + if (is_string($var)) return 's'; + if (is_float($var)) return 'd'; + if (is_int($var)) return 'i'; + return 'b'; + } + + public function getConnection() + { + return $this->connection; + } +} diff --git a/src/lib/files/files.php b/src/lib/files/files.php new file mode 100644 index 0000000..243c7af --- /dev/null +++ b/src/lib/files/files.php @@ -0,0 +1,95 @@ +Manager
"; + + } + + function render($action, $public = false, $params = array()) + { + $functreturn = call_user_func_array(array($this, $action), $params); //Los action no deberian devolver nada pero just in case + + if($this->defaultFunctionName=="") + $this->defaultFunctionName = $action; + + //$return = $functreturn; + + + //Si el controller por lo que sea no lo redefine o define, tiramos del standar + if($this->viewMode=="") + $this->viewMode = $this->defaultViewMode; + + //echo "View Mode: ".$this->viewMode;die; + if($this->viewMode=="json") + { + echo json_encode($return); //Hacerlo generico aqui o en cada funcion?? + } + else + { + //HTML Display: Default load a view with action name + $viewpath = APP_DIR."views/".$this->controllerName."/".$action.".phtml"; //@TODO posibilidad de cambiar el actionname por defecto!! + + + $return = $this->view->generate($viewpath, $this->controllerName); + + if($this->onlyContent) + { + echo $return; + } + else + { + if(file_exists($this->template)) + { + $this->view->content = $return; + include($this->template); + } + else + { + echo "
cannot find template ".$this->template."
"; + echo $return; + } + } + //include($viewpath); //@TODO gestion de plantillas y views individuales!! + } + + + //Ya esta el contenido en cliente. + //END + } +} +?> \ No newline at end of file diff --git a/src/lib/redirect.php b/src/lib/redirect.php new file mode 100644 index 0000000..63b1fe9 --- /dev/null +++ b/src/lib/redirect.php @@ -0,0 +1,11 @@ +view = new stdClass(); + } + + public function generate($htmlPath, $controller) + { + + //Igual que index solo que puede tener labels de errores :) + ob_start(); + //Todas las paginas estan dentro de la carpeta de su modulo y tienen extension php (Pasar a phtml??) + //Si se quiere forzar a que un action genere una pagina que no sea la de su funcion directamente, se puede pasar un nombre distinto + + if(file_exists($htmlPath)) + { + include $htmlPath; + $content = ob_get_clean(); + } + else + { + $content = "

View Not found

"; + } + + return $content; + } + + public function __set($name, $value) + { + //echo "Estableciendo '$name' a '$value'\n"; + @$this->{$name} = $value; + + } + +} \ No newline at end of file diff --git a/src/uploads/0/7763a682f49963be/instance.json b/src/uploads/0/7763a682f49963be/instance.json new file mode 100644 index 0000000..a421baf --- /dev/null +++ b/src/uploads/0/7763a682f49963be/instance.json @@ -0,0 +1,125 @@ +{ + "book_id": 0, + "book_name": "Libro de demo", + "settings": { + "dpi": 300, + "fonts": { + "main": "Mali-Bold.ttf", + "secondary": "Calibri.ttf" + }, + "base_font_size": 130, + "colors": { + "black": "#1E293B", + "white": "#FFFFFF", + "title": "#0284C7", + "accent": "#0D9488" + }, + "variables": { + "name": "Nombre Prota", + "FOTO_NINYO": "demo\/woman.png", + "FOTO_PAPA": "ruta foto" + } + }, + "user_photo": { + "width": 450, + "height": 450 + }, + "pages": [ + { + "page_id": 0, + "description": "Portada del Cuento", + "background": "paginas\/72dpi\/1.jpg", + "elements": [ + { + "type": "photo", + "x": 830, + "y": 830, + "width": 450, + "height": 450, + "variable": "FOTO_NINYO", + "rotation": 0 + }, + { + "type": "text", + "x": 100, + "y": 100, + "width": 1800, + "height": 300, + "rotation": 0, + "text": { + "es": "La gran selva de {{name}}", + "en": "The great jungle of {{name}}", + "ca": "La gran selva de {{name}}" + }, + "style": { + "size": 150, + "color": "accent", + "gravity": "CENTER" + }, + "variable": "" + } + ] + }, + { + "page_id": 1, + "description": "El mono juguetón", + "background": "paginas\/72dpi\/3.png", + "elements": [ + { + "type": "photo", + "x": 100, + "y": 800, + "width": 450, + "height": 450, + "variable": "FOTO_NINYO", + "rotation": 0 + }, + { + "type": "text", + "x": 650, + "y": 800, + "width": 1350, + "height": 450, + "rotation": 0, + "text": { + "es": "¡Mira ahí, {{name}}! Un monito travieso nos saluda desde la rama de un cocotero.", + "en": "Look over there, {{name}}! A naughty little monkey waves at us from the coconut tree.", + "ca": "Mira allà, {{name}}! Un mico trapella ens saluda des de la branca d'un cocoter." + }, + "style": { + "size": 100, + "color": "black", + "gravity": "WEST" + }, + "variable": "" + } + ] + }, + { + "page_id": 2, + "description": "Pagina Extra", + "background": "paginas\/72dpi\/3.jpg", + "elements": [ + { + "type": "text", + "x": 850, + "y": 425, + "width": 600, + "height": 200, + "rotation": 162, + "text": { + "es": "Este es un texto de prueba", + "en": "New text for {{name}}!", + "ca": "Nou text per {{name}}!" + }, + "style": { + "size": 120, + "color": "title", + "gravity": "CENTER" + }, + "variable": "" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/uploads/mockup/data.json b/src/uploads/mockup/data.json new file mode 100644 index 0000000..6bf5963 --- /dev/null +++ b/src/uploads/mockup/data.json @@ -0,0 +1,197 @@ +{ + "usuarios": { + "1": { + "id": 1, + "nombre": "Martín Rodríguez", + "email": "martin.cliente@trastobooks.com", + "password": "$2y$10$gR61m9x.H2jD0tK6yS4p9eZpOni8g00gXqU778UuR77D0tK6yS4pe", + "rol": "cliente", + "activo": 1, + "fecha_registro": "2026-01-10 10:15:30", + "fecha_ultimo_acceso": "2026-06-20 22:22:25", + "telefono": "633763957", + "direccion": "Calle del Trasto, Nº 26, 3ºB", + "codigopostal": "28014", + "ciudad": "Madrid", + "pais": "España" + }, + "2": { + "id": 2, + "nombre": "Soporte Admin TrastoBooks", + "email": "soporte.admin@trastobooks.com", + "password": "$2y$10$9H2jD0tK6yS4p9eZpOni8g00gXqU778UuR77D0tK6yS4p9eZpOni8g", + "rol": "admin", + "activo": 1, + "fecha_registro": "2025-12-01 08:00:00", + "fecha_ultimo_acceso": "2026-06-20 22:22:25", + "telefono": "633763957", + "direccion": "Avenida de la Imprenta, Nº 10", + "codigopostal": "08001", + "ciudad": "Barcelona", + "pais": "España" + } + }, + "libros": { + "1": { + "id": 1, + "titulo": "[Nombre] & Trasto quieren ser...", + "autor": "Equipo Creativo TrastoBooks", + "sinopsis": "Un fascinante viaje por el mundo de los oficios y los sueños donde el pequeño lector se convierte en explorador, astronauta y más.", + "numero_paginas": 32, + "precio": 2995, + "ruta_archivo_config": "configs\/quieren_ser_config.json", + "ruta_portada": "https:\/\/trastobooks.com\/131-home_default\/nombre-trasto-quieren-ser.jpg", + "activo": 1, + "fecha_subida": "2026-01-15 12:00:00", + "fecha_modificacion": "2026-01-15 12:00:00" + }, + "2": { + "id": 2, + "titulo": "¡Gracias, abuelos! (Fotos)", + "autor": "Equipo Creativo TrastoBooks", + "sinopsis": "Un tierno homenaje ilustrado para dar las gracias a quienes nos miman, nos cuidan y nos regalan los mejores abrazos.", + "numero_paginas": 24, + "precio": 3200, + "ruta_archivo_config": "configs\/gracias_abuelos.json", + "ruta_portada": "https:\/\/trastobooks.com\/509-home_default\/gracias-abuelos.jpg", + "activo": 1, + "fecha_subida": "2026-02-01 11:30:00", + "fecha_modificacion": "2026-06-20 20:36:42" + }, + "3": { + "id": 3, + "titulo": "Te quiero, papá... (Personalización con fotos)", + "autor": "Equipo Creativo TrastoBooks", + "sinopsis": "El regalo perfecto para el Día del Padre. Tus mejores momentos plasmados en una historia de complicidad inigualable.", + "numero_paginas": 28, + "precio": 3200, + "ruta_archivo_config": "books\/3\/config\/config.json", + "ruta_portada": "books\/3\/config\/portada.jpg", + "activo": 1, + "fecha_subida": "2026-02-10 09:00:00", + "fecha_modificacion": "2026-02-10 09:00:00" + }, + "4": { + "id": 4, + "titulo": "Aprende los números con Trasto", + "autor": "Pedro Ortega", + "sinopsis": "Un cuento pedagógico e interactivo ideal para preescolar. Cuenta manzanas, cohetes y caramelos de forma divertida.", + "numero_paginas": 16, + "precio": 2495, + "ruta_archivo_config": "books\/4\/config\/config.json", + "ruta_portada": "books\/4\/config\/portada.jpg", + "activo": 1, + "fecha_subida": "2026-02-14 15:45:00", + "fecha_modificacion": "2026-02-14 15:45:00" + }, + "5": { + "id": 5, + "titulo": "Aprende los colores", + "autor": "Pedro Ortega", + "sinopsis": "Pinta el cielo de azul, los campos de verde y las manzanas de rojo de la mano del travieso Trasto.", + "numero_paginas": 16, + "precio": 2495, + "ruta_archivo_config": "configs\/colores_config.json", + "ruta_portada": "https:\/\/trastobooks.com\/56-home_default\/aprende-los-colores.jpg", + "activo": 1, + "fecha_subida": "2026-02-15 10:00:00", + "fecha_modificacion": "2026-02-15 10:00:00" + }, + "6": { + "id": 6, + "titulo": "Aprende las vocales", + "autor": "Pedro Ortega", + "sinopsis": "A, E, I, O, U. Las letras cobran vida para enseñar a los primeros lectores a pronunciar sus primeros fonemas.", + "numero_paginas": 20, + "precio": 2495, + "ruta_archivo_config": "configs\/vocales_config.json", + "ruta_portada": "https:\/\/trastobooks.com\/83-home_default\/aprende-las-vocales.jpg", + "activo": 1, + "fecha_subida": "2026-02-20 18:20:00", + "fecha_modificacion": "2026-02-20 18:20:00" + }, + "7": { + "id": 7, + "titulo": "Gracias por ser nuestra profe", + "autor": "Raquel Rodríguez García", + "sinopsis": "El regalo de fin de curso más emotivo. Toda la clase reunida en un cuento de agradecimiento infinito.", + "numero_paginas": 36, + "precio": 4900, + "ruta_archivo_config": "configs\/profe_config.json", + "ruta_portada": "https:\/\/trastobooks.com\/526-home_default\/regalo-profe.jpg", + "activo": 1, + "fecha_subida": "2026-03-01 14:00:00", + "fecha_modificacion": "2026-03-01 14:00:00" + }, + "8": { + "id": 8, + "titulo": "Cleo y Cuquín: El Abecedario", + "autor": "Licencia Oficial", + "sinopsis": "Aprende las letras de la mano de los simpáticos personajes de la tele. Diversión y letras garantizadas.", + "numero_paginas": 32, + "precio": 3200, + "ruta_archivo_config": "configs\/cleo_cuquin_abc.json", + "ruta_portada": "https:\/\/trastobooks.com\/285-home_default\/cleo-y-cuquin-aprende-el-abecedario.jpg", + "activo": 1, + "fecha_subida": "2026-03-05 11:00:00", + "fecha_modificacion": "2026-03-05 11:00:00" + }, + "9": { + "id": 9, + "titulo": "Superando los miedos", + "autor": "Equipo Psicología TrastoBooks", + "sinopsis": "Un cuento terapéutico diseñado por psicopedagogos para ayudar a los peques a vencer los miedos nocturnos.", + "numero_paginas": 24, + "precio": 2995, + "ruta_archivo_config": "configs\/miedos_config.json", + "ruta_portada": "https:\/\/trastobooks.com\/73-home_default\/superando-los-miedos.jpg", + "activo": 0, + "fecha_subida": "2026-03-10 09:30:00", + "fecha_modificacion": "2026-03-10 10:15:00" + }, + "10": { + "id": 10, + "titulo": "En la barriga de mamá hay un bebé", + "autor": "Raquel Rodríguez García", + "sinopsis": "Prepara al primogénito para la llegada de su nuevo hermanito de forma dulce, divertida y tierna.", + "numero_paginas": 28, + "precio": 2995, + "ruta_archivo_config": "configs\/bebe_barriga_config.json", + "ruta_portada": "https:\/\/trastobooks.com\/118-home_default\/en-la-barriga-de-mama-hay-un-bebe.jpg", + "activo": 1, + "fecha_subida": "2026-03-12 16:00:00", + "fecha_modificacion": "2026-03-12 16:00:00" + }, + "0": { + "id": 0, + "titulo": "demo", + "autor": "Natxo", + "sinopsis": "una demo simple", + "numero_paginas": 2, + "precio": 1000000, + "ruta_archivo_config": "books\/0\/config\/config.json", + "ruta_portada": "books\/0\/config\/portada.jpg", + "activo": 1, + "fecha_subida": "2026-06-21 11:47:24", + "fecha_modificacion": "2026-06-21 11:47:24" + } + }, + "pedidos": { + "101": { + "id": 101, + "id_pedido_tienda": "PED-2026-001", + "id_usuario": 2, + "id_libro": "0", + "nombre_peque": "Nombre Prota", + "genero_peque": "boy", + "tipo_letra": "lower", + "foto_prota_url": "", + "precio_total": 1000000, + "estado": "diseñando", + "fecha_pedido": "2026-06-21 18:51:02", + "instance_dir": "uploads\/0\/7763a682f49963be", + "instance_file": "uploads\/0\/7763a682f49963be\/instance.json", + "hash": "7763a682f49963be" + } + } +} \ No newline at end of file diff --git a/src/views/admin/editarinstancia.phtml b/src/views/admin/editarinstancia.phtml new file mode 100644 index 0000000..fd9fb88 --- /dev/null +++ b/src/views/admin/editarinstancia.phtml @@ -0,0 +1,393 @@ + +
+
+ + +
+
+ +
+
+ + +
+
+
+

+ + Variables de este Cuento +

+

Edita el nombre, idioma o rutas de recursos del niño.

+
+
+ +
+
+ +
+

+ + Índice del Cuento +

+
+ +
+
+
+ + +
+
+
+

+ + Previsualización Imprenta (18x18 cm) +

+
+ +
+
+
+
+
+ +
+ Origen (0,0) Top-Left / Sin márgenes de traslación + Resolución Imprenta: 2126 x 2126 px +
+
+
+ + +
+
+

+ + Producción de Pedido +

+ + + +
+ + +
+
+ +
+

Información del Pedido

+
+
+ Cliente: + - +
+
+ Libro: + - +
+
+ Directorio: + - +
+
+
+
+
+
+ + \ No newline at end of file diff --git a/src/views/admin/editorlibro.phtml b/src/views/admin/editorlibro.phtml new file mode 100644 index 0000000..a519074 --- /dev/null +++ b/src/views/admin/editorlibro.phtml @@ -0,0 +1,224 @@ + + + + +
+
+ + +
+
+ + +
+ + +
+ + +
+ +
+

+ + Ajustes del Libro +

+ +
+
+ + +
+
+
+ + +
+
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ +
+
+
+
+ + +
+
+

+ + Estructura Páginas +

+ +
+ +
+ +
+
+
+ + +
+ +
+
+

+ + Mesa de Trabajo Virtual +

+
+ + +
+ +
+ + +
+ +
+
+
+ + +
+ Origen (0,0) en la esquina superior izquierda + Resolución Imprenta: 2126 x 2126 px (18x18 cm) +
+
+ + +
+
+

+ + Variables de Imprenta & Simulador +

+ +
+ +
+ +
+ + +

Cambia el idioma para previsualizar las traducciones del cuento al instante.

+
+ + +
+ +
+ +
+
+
+
+
+ + +
+ +
+

+ + Persistencia de Imprenta +

+ + + +
+ + +
+
+ + +
+
+

+ + Elementos: #0 +

+
+ + +
+
+ + +
+ +
+
+
+ +
+ + + +
+ + \ No newline at end of file diff --git a/src/views/admin/gestionlibros.phtml b/src/views/admin/gestionlibros.phtml new file mode 100644 index 0000000..791fd0f --- /dev/null +++ b/src/views/admin/gestionlibros.phtml @@ -0,0 +1,440 @@ + +
+ +
+
+
+

Gestión del Catálogo de Libros

+

Controla el estado, precio y visibilidad de los libros en la tienda pública.

+
+ +
+ + +
+
+ + + + + + + + + + + + + view->libros como para $this->libros de forma segura + $coleccionLibros = isset($this->view->libros) ? $this->view->libros : (isset($this->libros) ? $this->libros : []); + + foreach($coleccionLibros as $libro): + // 1. Clasificación dinámica basada en el archivo de configuración para mayor orden visual + $categoria = 'Personalizado'; + $badgeColor = 'bg-sky-50 text-sky-700 border-sky-100'; + + if (isset($libro['ruta_archivo_config'])) { + if (strpos($libro['ruta_archivo_config'], 'foto') !== false) { + $categoria = 'Con Fotos'; + $badgeColor = 'bg-purple-50 text-rose-700 border-purple-100'; + } elseif (strpos($libro['ruta_archivo_config'], 'config') !== false && (strpos($libro['titulo'], 'colores') !== false || strpos($libro['titulo'], 'números') !== false || strpos($libro['titulo'], 'vocales') !== false)) { + $categoria = 'Aprendizaje'; + $badgeColor = 'bg-teal-50 text-teal-700 border-teal-100'; + } + } + + // 2. Formateo de precio seguro (de céntimos en DB a Euros decimales) + $precioFormateado = number_format(($libro['precio'] / 100), 2, ',', '.') . ' €'; + ?> + + + + + + + + + + + + + + + + + + + + + +
IdentificadorTítulo del cuentoCategoríaPrecio (€)VisibilidadAjustes
+
+
+ + Portada + + + +
+
+ #TB- + págs. +
+
+
+
+ + Por +
+
+ + + + + + + + + + Visible + + + + + Oculto + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ + +
+ \ No newline at end of file diff --git a/src/views/admin/gestionpedidos.phtml b/src/views/admin/gestionpedidos.phtml new file mode 100644 index 0000000..f1a3cf6 --- /dev/null +++ b/src/views/admin/gestionpedidos.phtml @@ -0,0 +1,267 @@ + +
+ +
+
+

Corrección de Configuraciones y Pedidos

+

Corrige fallos cometidos por los padres al escribir los nombres o seleccionar fotos antes de mandar a la imprenta.

+
+ + +
+
+ + + + + + + + + + + + + view->pedidos como para $this->pedidos de forma segura + $pedidos = isset($this->view->pedidos) ? $this->view->pedidos : (isset($this->pedidos) ? $this->pedidos : []); + + if (empty($pedidos)): + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + +
Pedido / FechaLibro BaseProtagonistaTotal (€)Estado de ImpresiónHerramientas
+
+ + No hay ninguna orden de trabajo activa en el taller. +
+
+
+ + +
+
+
+ + Cuento # + + + / + +
+
+
+ +
+ + Héroe + + + +
+
+ + + + +
+ + + + + + +
+
+
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + +
+
+
+
+
+ +
+ + + + + + + + + +
+ + Cambios guardados con éxito en base de datos. +
+ \ No newline at end of file diff --git a/src/views/admin/index.phtml b/src/views/admin/index.phtml new file mode 100644 index 0000000..7127bba --- /dev/null +++ b/src/views/admin/index.phtml @@ -0,0 +1 @@ +User private area \ No newline at end of file diff --git a/src/views/admin/miscuentos.phtml b/src/views/admin/miscuentos.phtml new file mode 100644 index 0000000..b2b5cbc --- /dev/null +++ b/src/views/admin/miscuentos.phtml @@ -0,0 +1,45 @@ + +
+ +
+
+
+

Mis cuentos personalizados

+

Consulta el estado físico de tus álbumes en el taller de impresión.

+
+ + Crear nuevo cuento + +
+ + +
+ + miscuentos as $cuento): ?> + +
+ +
+
+ 🚀 +
+
+
+ + +
+

Cuento tipo

+

Entrega estimada: TBD

+ +
+ + | + Duplicar cuento +
+
+
+ + +
+
+
\ No newline at end of file diff --git a/src/views/admin/misdatos.phtml b/src/views/admin/misdatos.phtml new file mode 100644 index 0000000..6554f7b --- /dev/null +++ b/src/views/admin/misdatos.phtml @@ -0,0 +1,57 @@ + +
+ +
+
+

Mis datos personales

+

Actualiza tus direcciones de envío para que tus cuentos lleguen perfectos.

+
+ +
+
+ +
+ + " required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-4 py-2.5 text-xs focus:outline-none focus:ring-2 focus:ring-trastoBlue font-semibold text-trastoDark"> +
+ +
+ + " required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-4 py-2.5 text-xs focus:outline-none focus:ring-2 focus:ring-trastoBlue font-semibold text-trastoDark"> +
+ +
+ + " required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-4 py-2.5 text-xs focus:outline-none focus:ring-2 focus:ring-trastoBlue font-semibold text-trastoDark"> +
+ +
+ + " required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-4 py-2.5 text-xs focus:outline-none focus:ring-2 focus:ring-trastoBlue font-semibold text-trastoDark"> +
+ +
+ + " required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-4 py-2.5 text-xs focus:outline-none focus:ring-2 focus:ring-trastoBlue font-semibold text-trastoDark"> +
+ +
+ + " required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-4 py-2.5 text-xs focus:outline-none focus:ring-2 focus:ring-trastoBlue font-semibold text-trastoDark"> +
+ +
+ + " required class="w-full bg-slate-50 border border-slate-200 rounded-xl px-4 py-2.5 text-xs focus:outline-none focus:ring-2 focus:ring-trastoBlue font-semibold text-trastoDark"> +
+ +
+ +
+ +
+
+
+
\ No newline at end of file diff --git a/src/views/error/fatal.phtml b/src/views/error/fatal.phtml new file mode 100644 index 0000000..ef4692d --- /dev/null +++ b/src/views/error/fatal.phtml @@ -0,0 +1,25 @@ +message)) $this->message="Unknown Error"; ?> + +
+
+ + +
+ +
+
+ +
+
+ +

¡Error Fatal!

+ +

+ message ?> +

+ + + Volver al Inicio + +
+
\ No newline at end of file diff --git a/src/views/error/identity.phtml b/src/views/error/identity.phtml new file mode 100644 index 0000000..ebee10c --- /dev/null +++ b/src/views/error/identity.phtml @@ -0,0 +1,25 @@ + +
+
+ + +
+ +
+
+ +
+
+ +

¡Acceso Denegado!

+ +

+ Parece que este libro que estás intentando ver no es tuyo.
+ Vuelve a hacer login o contacta con el administrador si crees que se trata de un error. +

+ + + Volver a Iniciar Sesión + +
+
\ No newline at end of file diff --git a/src/views/error/index.phtml b/src/views/error/index.phtml new file mode 100644 index 0000000..2dd73f7 --- /dev/null +++ b/src/views/error/index.phtml @@ -0,0 +1,25 @@ + +
+
+ + +
+ +
+
+ +
+
+ +

¡Página no encontrada!

+ +

+ Parece que la página que intentas ver no existe.
+ No podemos hacer nada más, vuelve al inicio. +

+ + + Volver al Inicio + +
+
\ No newline at end of file diff --git a/src/views/error/timeout.phtml b/src/views/error/timeout.phtml new file mode 100644 index 0000000..a45de5c --- /dev/null +++ b/src/views/error/timeout.phtml @@ -0,0 +1,25 @@ + +
+
+ + +
+ +
+
+ +
+
+ +

¡Sesión Expirada!

+ +

+ Parece que has pasado mucho tiempo inactivo y tu sesión se ha cerrado por seguridad.
+ Inicia sesión de nuevo para continuar donde lo dejaste. +

+ + + Volver a Iniciar Sesión + +
+
\ No newline at end of file diff --git a/src/views/index/contacto.phtml b/src/views/index/contacto.phtml new file mode 100644 index 0000000..e69de29 diff --git a/src/views/index/index.phtml b/src/views/index/index.phtml new file mode 100644 index 0000000..615ec3b --- /dev/null +++ b/src/views/index/index.phtml @@ -0,0 +1,514 @@ + +
+
+
+ +
+
+ + +
+ + 🚀 Cuentos con un claro propósito educativo y pedagógico + +

+ Cuentos donde tus peques son los verdaderos héroes +

+

+ Libros educativos personalizados diseñados para estimular el amor por la lectura, el aprendizaje natural y el autoestima. El regalo perfecto que guardarán para siempre. +

+ + + + +
+
+ + + + + +
+

+ Valorado como Excelente en Trustpilot por miles de familias reales. +

+
+
+ + +
+
+
+
+ Te quiero papá +
+
+ Quiero Ser +
+
+
+
+ Gracias Abuelos +
+
+ Aprende los colores +
+
+
+
+ +
+
+
+ + +
+
+
+ +
+
+ +
+
+

En 7-10 días en casa

+

Una vez realizas tu pedido, te llegará el cuento personalizado a casa por mensajería urgente.

+
+
+ + +
+
+ +
+
+

Con foto real o avatar

+

Máxima identificación: los peques se ven reflejados con fotos reales de sus caritas o simpáticos avatares.

+
+
+ + +
+
+ +
+
+

Libros de Calidad Premium

+

Álbumes resistentes (21x21 o 18x18 cm) con papel antihuellas ideales para ser manipulados por niños.

+
+
+
+
+
+ + +
+
+ + +
+

Cuentos personalizados destacados

+

+ Selecciona el tema pedagógico ideal. Todos nuestros libros están elaborados y revisados por profesionales de la educación. +

+ + +
+ + + + +
+
+ + +
+ + +
+
+ Top Ventas + Te quiero, papá... +
+
+
+ Con fotos reales +

Te quiero, papá...

+
+
+ 32,00 € +
+
+ +
+ + +
+
+ ¡Gracias, abuelos! +
+
+
+ Familia +

¡Gracias, abuelos!

+
+
+ 32,00 € +
+
+ +
+ + +
+
+ Nombre y Trasto +
+
+
+ Educativo +

[Nombre] & Trasto quieren ser...

+
+
+ 29,95 € +
+
+ +
+ + +
+
+ Fin de Curso + Regalo Profe +
+
+
+ Colegios +

Gracias por ser nuestra profe

+
+
+ 49,00 € +
+
+ +
+ + +
+
+ Cleo y Cuquín +
+
+
+ Licencia Oficial +

Cleo y Cuquín: El Abecedario

+
+
+ 32,00 € +
+
+ +
+ + +
+
+ Aprende los números +
+
+
+ Matemáticas +

Aprende los números

+
+
+ 24,95 € +
+
+ +
+ + +
+
+ Aprende los colores +
+
+
+ Estimulación +

Aprende los colores

+
+
+ 24,95 € +
+
+ +
+ + +
+
+ Aprende las vocales +
+
+
+ Lectura +

Aprende las vocales

+
+
+ 24,95 € +
+
+ +
+ + +
+
+ Te quiero, papá avatares +
+
+
+ Con Ilustración +

Te quiero, papá (Avatares)

+
+
+ 32,00 € +
+
+ +
+ + +
+
+ Superando los miedos +
+
+
+ Psicología infantil +

Superando los miedos

+
+
+ 29,95 € +
+
+ +
+ + +
+
+ Barriga de mamá +
+
+
+ Hermanos +

En la barriga de mamá hay un bebé

+
+
+ 29,95 € +
+
+ +
+ + +
+
+ Cleo y Cuquín Navidad +
+
+
+ Navidad +

Cleo y Cuquín: Navidad

+
+
+ 32,00 € +
+
+ +
+ +
+ + + + +
+
+ + +
+
+
+ + +
+
+
+
+ +
+
+
+ + +
+ Elaboración Artesanal y Pedagógica +

+ ¡Últimas Novedades de Trasto! +

+
+

+ Todos nuestros cuentos están diseñados y revisados por profesionales del ámbito educativo, buscando siempre nuevas ideas con las que ilusionar a los pequeños de la casa. +

+

+ Nuestra elaboración es casi artesanal: combinamos tecnologías para que puedas personalizar los nombres e imágenes de manera rápida, pero nuestro proceso de ilustración y desarrollo pedagógico es 100% humano y pensado con amor. +

+

+ Son el regalo perfecto para fechas señaladas, cumpleaños, el día del padre o de la madre, y para construir recuerdos imborrables que perdurarán con el paso de los años. +

+
+ +
+ +
+
+
\ No newline at end of file diff --git a/src/views/index/login.phtml b/src/views/index/login.phtml new file mode 100644 index 0000000..dd66a58 --- /dev/null +++ b/src/views/index/login.phtml @@ -0,0 +1,140 @@ + +
+
+ + +
+
+

¡Hola, TrastoAmigo!

+

Entra para gestionar tus libros personalizados o ver tus pedidos

+
+ + +
+ + + error)):?> + + + + +
+ +
+ +
+ + + + +
+
+ + +
+
+ + ¿La has olvidado? +
+
+ + + + + +
+
+ + + +
+ + +
+
+
+
+
+ ¿No tienes cuenta? +
+
+ + + + Crear un cuento nuevo y registrarse + + + +
+ + Accesos rápidos de desarrollo (Mockup) + +
+ + + +
+
+ +
+
+
+ + \ No newline at end of file diff --git a/src/views/index/nosotros.phtml b/src/views/index/nosotros.phtml new file mode 100644 index 0000000..e69de29 diff --git a/src/views/template.phtml b/src/views/template.phtml new file mode 100644 index 0000000..6e6a2c4 --- /dev/null +++ b/src/views/template.phtml @@ -0,0 +1,318 @@ + + + + + + + TrastoBooks | Cuentos Personalizados para niños y niñas (Rediseño Claro 2026) + + + + + + + + + + + + + + + + + + + + + +
+
+ 🎁 -20% dto en tu 2ª unidad con el código TRASTO20 + + 🔥 -30% dto al comprar 3 o más con el código TRASTO30 +
+
+ +
+ + + + +
+ + view->content; ?> + +
+
+ + +
+
+

Únete a nuestra comunidad

+

Recibe ofertas exclusivas, novedades editoriales y consejos educativos de manera mensual.

+
+
+
+
+ + +
+ +
+
+
+ + +
+ + +
+ TrastoBooks +

+ Creamos cuentos donde la magia y el aprendizaje se encuentran. Personaliza el cuento perfecto que recordarán para siempre. +

+
+ + + +
+
+ + + + + + + + +
+

Atención al Cliente

+

¿Dudas con el pedido? Llámanos o escríbenos directamente por WhatsApp de lunes a viernes.

+
+

Teléfono: 633763957

+

Email: info@trastobooks.com

+
+
+ +
+ + +
+

© 2026 TrastoBooks.com. Todos los derechos reservados.

+

Hecho con ❤️ en España.

+
+
+
+ + + + + Ayuda + + + + + + +
+ + Mensaje +
+ + + + + \ No newline at end of file diff --git a/src/views/template_admin.phtml b/src/views/template_admin.phtml new file mode 100644 index 0000000..ef3d1c9 --- /dev/null +++ b/src/views/template_admin.phtml @@ -0,0 +1,156 @@ + + + + + + + Mi Panel TrastoBooks | Cuentos Personalizados 2026 + + + + + + + + + + + + + + + + + + + +
+
+ + + + TrastoBooks.com + + +
+
+ + +
+ + + + + + + + view->content; ?> + + +
+ + \ No newline at end of file