You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
senzapaura_es/scripts/db/escansion.spec.mjs

87 lines
2.8 KiB

Ejemplos de versos en la ficha, y dónde escuchar cada obra La ficha decía que el bolero va en octosílabo y endecasílabo alternados sin enseñar nunca uno. Un taller que describe la métrica y no la muestra está pidiendo que se la imaginen. `verso` es la estrofa y no el verso suelto —la rima y la alternancia de medidas no se ven en menos de dos versos— y `verso_linea` lleva cada uno con su escansión: `silabas` es la métrica y no la del diccionario, así que la sinalefa mete dos palabras en una casilla —«za⁀a»—, que es justo lo que en un texto corrido no se ve. `medida` va aparte porque un verso agudo suma una sílaba y uno esdrújulo resta una: «yo respondo con el son» tiene siete casillas y es un octosílabo. Los diez ejemplos son originales, escritos para enseñar, y entran marcados con `fuente = 'ejemplo'`. Ninguno es cita: para eso está `obra_referencia.cita`, y dos CHECK lo sostienen —un verso «cita» sin obra, o uno «propio» sin canción, no entran—. La escansión se comprueba antes de cargarla, contra la ley del acento final, y el sembrador aborta si algo no cuadra. Un ejemplo mal contado enseña a contar mal y eso no lo detecta ningún tipo ni ningún lint: por eso la comprobación está en su propio módulo, con nueve pruebas. `obra_referencia_enlace` sustituye a la columna `enlace`, que era texto suelto y solo daba sitio para uno; una obra está en Spotify **y** en YouTube. Comparte el vocabulario `PLATAFORMAS` con los enlaces de las canciones. De momento son búsquedas y no grabaciones concretas: una URL inventada manda a un 404 con pinta de dato bueno, y los enlaces exactos llegarán en el JSON de la ficha. De paso, dos cosas que se vieron al montarlo: - El orden de la ficha cambia. Primero lo que se usa para escribir —ejemplos, rasgos, temática— y después lo que sitúa el género. Es un taller: quien abre la página viene a escribir una letra. - `repeat(auto-fit, minmax(24rem, 1fr))` desbordaba ochenta píxeles en un móvil de 320, porque la rejilla pone la columna aunque no quepa. Ahora es `min(24rem, 100%)`, en los tres sitios donde estaba. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 month ago
import fs from 'node:fs';
import { describe, expect, it } from 'vitest';
import { fallosDeEscansion, revisarSemilla } from './escansion.mjs';
/**
* Lo que se prueba aquí no es código: es que los ejemplos que el taller enseña
* estén bien contados. Un octosílabo mal escandido en una ficha enseña a contar
* mal, y eso no lo detecta ningún tipo ni ningún lint.
*/
const llano = {
texto: 'Dejaste la taza a medias',
silabas: 'De jas te la ta za_a me dias'.split(' '),
tonicas: [2, 5, 7],
medida: 8
};
describe('fallosDeEscansion', () => {
it('acepta un octosílabo llano: la cuenta es la que se ve', () => {
expect(fallosDeEscansion(llano)).toBeNull();
});
it('acepta un octosílabo agudo: siete casillas y ocho sílabas', () => {
// La ley del acento final. Es la regla que más cuesta automatizar al
// escribir, y por eso hay un ejemplo de ella en la ficha del son.
expect(
fallosDeEscansion({
texto: 'yo respondo con el son',
silabas: 'yo res pon do con el son'.split(' '),
tonicas: [1, 3, 7],
medida: 8
})
).toBeNull();
});
it('acepta un verso esdrújulo: una sílaba menos', () => {
expect(
fallosDeEscansion({
texto: 'la casa que se vuelve música',
silabas: 'la ca sa que se vuel ve mú si ca'.split(' '),
tonicas: [2, 6, 8],
medida: 9
})
).toBeNull();
});
it('rechaza una cuenta que no sale del acento', () => {
expect(fallosDeEscansion({ ...llano, medida: 9 })).toMatch(/miden 8, no 9/);
});
it('rechaza una tónica fuera del verso', () => {
expect(fallosDeEscansion({ ...llano, tonicas: [2, 5, 12] })).toMatch(/fuera de las 8/);
});
it('rechaza las tónicas desordenadas, que suelen ser un error de tecleo', () => {
expect(fallosDeEscansion({ ...llano, tonicas: [7, 2, 5] })).toMatch(/en orden/);
});
it('rechaza un verso sin acento: no existe', () => {
expect(fallosDeEscansion({ ...llano, tonicas: [] })).toMatch(/tónica/);
});
});
describe('la semilla que se publica', () => {
it('está bien escandida, verso por verso', () => {
const semilla = JSON.parse(fs.readFileSync('scripts/db/semilla-versos.json', 'utf8'));
expect(revisarSemilla(semilla)).toEqual([]);
});
it('trae ejemplos para todos los géneros que tienen ficha', () => {
const semilla = JSON.parse(fs.readFileSync('scripts/db/semilla-versos.json', 'utf8'));
const generos = Object.keys(semilla.generos);
// Los ocho con capítulo publicado. El bolero-son no tiene ficha todavía.
expect(generos).toHaveLength(8);
for (const ejemplos of Object.values(semilla.generos)) {
expect(ejemplos.length).toBeGreaterThan(0);
for (const ejemplo of ejemplos) {
// Un ejemplo sin análisis es decoración: el verso no dice solo qué
// hay que mirar en él.
expect(ejemplo.analisis).toBeTruthy();
expect(ejemplo.lineas.length).toBeGreaterThan(1);
}
}
});
});

Powered by TurnKey Linux.