Utodev / ngPAWS

ngPAWS interactive fiction (text adventure game) authoring system. Genarates HTML/javascript games runable in any browser.
http://www.ngpaws.com
31 stars 17 forks source link

[10beta] Parser recognition of ' " « #18

Closed cibersheep closed 6 years ago

cibersheep commented 7 years ago

¿Qué haces en domingo? ^_^

Para esto, ¿me podrías indicar dónde mirar? Porque puede ser de un ámbito más amplio al del puramente estético.

Para «hablar» con los PNJ (algo que en todas las aventuras clásicas que he probado es un follón) veo que en ngPAWS es bastante más flexible. DECIR "Lo que sea" me gusta pero he encontrado que no se reconoce DECIR «Lo que sea» (con comillas francesas) y sí con apóstrofos: DECIR 'Lo que sea'

¿Qué pasa? Si puedo echar un vistazo (y si puedo entender) como se reconoce, a parte de homogeneizar el uso de las comillas francesas, podría ver cómo hacer que el apóstrofo no se reconozca como comillas (útil porque tengo casi todo ngPAWS traducido al catalán pero me reconoce las palabras apostrofadas como dos sentencias ^_^).

Utodev commented 7 years ago

Doy por supuesto que algo de javascript sabes, porque si no es así lo que te digo te va a sonar a chino. Antes de nada no obstante que sepas que la forma correcta de hablar a personajes en ngPAWS es como la de inform: Decir a Pepe, hola.

Dicho esto, toda la función de parseado está en el fichero runtime.js, mas o menos por donde pone "the parser", pero NO tienes que modificar ese fichero para hacer una versión en catalán, luego te cuento como, pero antes mirémoslo:

Hay una función llamada "normalize" que lo que hace es convertir una palabra, frase o incluso signo de puntuación en algo normalizado, lo cual viene a ser quitar los acentos por ejemplo, o, importante, convertir los signos de punto, dos puntos, comillas dobles y comillas simples en una coma. Así da igual poner "decir a pepe, hola" que "decir a pepe. hola" que "decir a pepe ' hola".

Esta función es llamada por la función toParserBuffer que recibe lo que ha tecleado el jugador y lo mete en un buffer antes de tratarlo. Al meterlo en un buffer va palabra por palabra y si alguna palabra resulta ser una conjunción, también la convierte en una coma. Así da igual "saltar y comer" que "saltar, comer", porque en el buffer acaba "saltar,comer".

El problema del apóstrofe es que en catalán es usado como artículo, si no me equivoco en cosas como l'horari, l'esperança, etc. y claro, te separa frases. Una solución sencilla sería hacer que en catalán el apostrofe no pudiera separar frases, y otra es que solo lo hiciera cuando se usa como comilla simple, y no cuando lo hace como apóstrofe en si. Esto ya es decisión tuya, pero lo primer sería tan fácil como quitar el apóstrofe o comilla simple de la linea que pone:

if ((ch=='.') || (ch==',') || (ch==';') || (ch=='"') || (ch=='\'')) output = output + ' , '; else output = output + player_order.charAt(i); dejandolo en

if ((ch=='.') || (ch==',') || (ch==';') || (ch=='"')) output = output + ' , '; else output = output + player_order.charAt(i);

Utodev commented 7 years ago

Una solución más adecuada sería modificar esa función para que comprobara si dicho apostrofe es tal, porque lleva una L delante, o si es una comilla simple, en cuyo caso podrías hacer que si es comilla se sustituya por una coma, y si no lo es se sustituya por "la " de modo que l'esperança se convierta en la esperança, y como al final el parser va a ignorar los artículos ese "la" no hace nada. Quien dice "la" dice cualquier cosa que te parezca adecuada. Incluso se podría hacer que modificara esa variable output para que borre la L anterior y así l'esperaça se convierta simplemente en esperança.

Esto respecto al problema del acento, sigo en otro post con más cosas sobre la traducción.

Utodev commented 7 years ago

Además de esto, para hacer la traducción correctamente conviene que los tags de secuencia OREF y OBJECT funcionen bien, porque estos toman el nombre del objeto y le anteponen el artículo definido en español, es decir, que si tienes un objeto llamado "un pez" en español, cuando lo coges {OREF} escribe "el pez" de modo que la frase sea "Coges el pez." en luga de "Coges un pez.". Si la sustitución se hace en castellano en una aventura en catalán la liamos.

Utodev commented 7 years ago

En definitiva tienes que hacer una librería en catalan como esta en gallego:

https://github.com/Utodev/ngPAWS/blob/master/extra_langs/gl/lang_GL.jsp

La cual para que funcione solo tienes que meter en la carpeta "jsl" de ngPAWS (si quieres que aplique a todos los juegos, poco recomendable) o en una carpeta "jsl" que crees al mismo nivel que la carpeta "dat", si quieres que afecte solo al juego en el que la pongas.

En esa librería se usan los hooks para meterse "por delante" del código que hace funcionar OREF y devolver una versión personalizada. Usar los hooks es recomendable, pero no siempre posible. Por suerte javascript es redefinible, y eso permite que si hace falta funciones como la de normalize o toParserBuffer se puedan reescribir (y por eso digo que no modifiques el runtime.js, que luego es un lio mantenerlo y te toca tener dos instalacions de ngpaws, una por idioma)

Utodev commented 7 years ago

Si a esa librería ya modificada para el asunto de OREF le añadimos al final este código:


normalize = function() {
.....
}

y dentro de esa función hacemos nuestro propio "normalize" tocando lo que he explicado antes, el normalize original de runtime.js no se ejecuta, y se ejecuta el nuestro. Lo mismo con toParserBuffer.

Así la idea es tener un fichero lang_CAT.jsp que podamos poner en cualquier aventura y así ngPAWS se adapta al catalán (aparte de usar una start.database en catalán claro) y dejar el runtime.js como está.

Utodev commented 7 years ago

Finalmente las comillas francesas las puedes poner en normalize también si quieres usarlas, aunque no tengo claro que la comilla del final no produzca una frase vacía tras ella, porque al final la frase

decir a pepe «Lo que sea»

quedaría como:

decir a pepe,lo que sea,

y no estoy muy seguro de qué hace el parser con esa última coma (quiza la ignore, quizá considere que hay una frase vacía detrás y acabe produciendo un "no puedes hacer eso". Si así fuera, probablemente se pueda arreglar en toParserBuffer, comprobando si el último caracter del buffer es una coma, y si lo es quitarla antes de archivarlo.

Utodev commented 7 years ago

Estaría muy bien que le pudieras dar soporte de catalán, y si no fuera por mi poco tiempo casi te diría que si me explicaras lo haría yo, pero no es el caso así que no puedo más que indicarte un poco. Si no supieras javascript podemos verlo a plazo más largo.

cibersheep commented 7 years ago

Muchísimas gracias por tomarte el tiempo para explicarme todo esto. Ahora me puedo poner delante del ordenador y hacer un par de pruebas. -Soy más de la opinión de añadir opciones. Así que creo que es más conveniente no cambiar cómo se detecta ahora el apóstrofo si no añadir la detección de l', d', etc. -También creo que es mejor añadir el idioma a un proyecto y no a todo ngPAWS y no modificar el runtime.js para poder mantener un solo proyecto con complementos. -Pienso que el cambio de «l'esperança» por «la esperança» es muy inteligente. A efectos de semántica es lo que es.

Bien. Me queda hacer la librería, mirar el OREF y cómo se comporta la detección de las comillas francesas. Gracias de nuevo

cibersheep commented 7 years ago

Nota para mí (así no me olvido): Cosas a probar:

cibersheep commented 7 years ago

Voy paso a paso. Primero, reconocer las comillas francesas: Pull Request