-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
152 lines (138 loc) · 4.46 KB
/
script.js
File metadata and controls
152 lines (138 loc) · 4.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
// === script.js extendido ===
// Cargar Tracery dinámicamente
const traceryScript = document.createElement('script');
traceryScript.src = "https://cdn.jsdelivr.net/npm/tracery-grammar@2.7.3/tracery.js";
document.head.appendChild(traceryScript);
traceryScript.onload = () => {
// === Gramática base ===
const grammarObj = {
"verb": [
"se compromete a",
"jura solemnemente que",
"cree en",
"va a trabajar por",
"impulsará",
"fortalecerá",
"apostará por",
"implementará",
"quiere construir",
"invocará el poder de",
"anuncia sin anestesia",
"declama entre aplausos y bostezos",
"promete bajo juramento dudoso"
],
"absurdismo": [
"el sol que no paga impuestos",
"la patria del absurdo",
"el progreso con sabor a empanada fría",
"la transparencia de los espejos rotos",
"la economía del desencanto",
"la reforma tributaria del alma",
"la educación sentimental del votante promedio",
"la poesía como política de Estado",
"un país donde los relojes votan",
"la igualdad de las oportunidades imposibles"
],
"final": [
"perfectamente bien.",
"yo no respondo por las molestias causadas.",
"el cielo se está cayendo a pedazos.",
"no sé si hablo conmigo o con el enchufe.",
"y sin embargo, seguimos votando."
]
};
// === Diccionario temático por candidato ===
const candidateThemes = {
"Eduardo Artés": [
"el pueblo organizado",
"la justicia social",
"el trabajo digno",
"la educación gratuita",
"el fin del neoliberalismo"
],
"Franco Parisi": [
"la economía digital",
"el emprendimiento",
"los impuestos justos",
"la libertad financiera",
"el chileno promedio endeudado"
],
"Johannes Kaiser": [
"la libertad de expresión",
"el orden perdido",
"la familia tradicional",
"la batalla cultural",
"el miedo al caos"
],
"Harold Mayne-Nicholls": [
"el deporte como salvación",
"la cancha pareja",
"el fair play social",
"los niños primero en la fila",
"el país que entrena todos los días"
],
"Jeannette Jara": [
"la seguridad social",
"la dignidad laboral",
"el Estado presente",
"las pensiones decentes",
"la igualdad de género"
],
"Evelyn Matthei": [
"el orden y el progreso",
"la eficiencia administrativa",
"el combate al delito",
"la gestión sin poesía",
"la experiencia de la realidad"
],
"José Antonio Kast": [
"la patria sin fronteras abiertas",
"la autoridad y el orden",
"la familia como trinchera",
"la expulsión inmediata",
"la fe en los valores eternos"
],
"Marco Enríquez-Ominami": [
"la innovación social",
"la modernidad líquida",
"la transparencia de las promesas",
"la reinvención del progresismo",
"el cine político que nunca se filmó"
]
};
// Crear gramática de Tracery
const grammar = tracery.createGrammar(grammarObj);
// === FUNCIÓN PRINCIPAL ===
window.generateVerse = function(candidate) {
const themes = candidateThemes[candidate] || ["las promesas vacías"];
const verb = grammar.flatten("#verb#");
const absurd = grammar.flatten("#absurdismo#");
const theme = themes[Math.floor(Math.random() * themes.length)];
const ending = grammar.flatten("#final#");
// Componer antiverso parriano
const verse = `${candidate} ${verb} ${theme}, pero termina hablando de ${absurd}. ${ending}`;
// Mostrar en pantalla
const responseEl = document.getElementById("chatResponse");
if (!responseEl) return console.warn("No existe el elemento #chatResponse en el DOM");
responseEl.classList.remove("visible");
void responseEl.offsetWidth; // Reiniciar animación
responseEl.innerHTML = `<p>${escapeHtml(verse)}</p>`;
responseEl.classList.add("visible");
};
// === Utilidad para escapar HTML ===
function escapeHtml(str) {
return String(str)
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
};
document.addEventListener("DOMContentLoaded", () => {
const toggle = document.querySelector(".nav-toggle");
const nav = document.querySelector(".main-nav");
toggle.addEventListener("click", () => {
nav.classList.toggle("open");
});
});