Búsqueda de sitios web

typescript - ¿Usando getWordUnderCursor para obtener palabras que contienen apóstrofes?


Estoy usando monaco-editor en una aplicación Electron donde los usuarios escribirán poesía. El lenguaje configurado para el editor es plaintext.

Me estoy encontrando con un problema donde, si un usuario ha escrito una palabra con un ' (apóstrofo) en ella, getWordAtPosition no devolverá la palabra completa. Dependiendo de la posición del cursor (que es lo que paso a getWordAtPosition), devolverá lo que está antes del apóstrofo o lo que está después.

Por ejemplo, usando un | (barra vertical) para representar la ubicación del cursor, si el usuario ha escrito:

couldn't|

getWordAtPosition devolverá t

Para |couldn't, devolverá couldn.

Lo que quiero es que, independientemente de la posición del cursor, devuelva couldn't.

Lo que he intentado hasta ahora es proporcionar wordSeparators en las opciones al crear el editor que no incluya el apóstrofo (pero que por lo demás sea el predeterminado), pero eso no ha ayudado.

Bloque de creación del editor:

editorInstance = monaco.editor.create(document.getElementById('editor'), {
            language: 'plaintext',
            wordSeparators: '`~!@#$%^&*()-=+[{]}\\|;:",.<>/?'
        });

Bloquear usando el getWordAtPosition:

fromEventPattern((handler: NodeEventHandler) => editorInstance.onDidChangeCursorPosition(handler))
            .pipe(
                map(() => {
                    const cursorPosition: IPosition = editorInstance.getPosition();

                    return editorInstance.getModel()
                        .getWordAtPosition(cursorPosition)
                        ?.word;
                }),
                filter((value: string) => !!value)
            );

¡Cualquier ayuda sería muy apreciada! ¡Gracias de antemano!

Respuesta #1

Puedes configurar un idioma (ya sea para un idioma nuevo o uno existente) y proporcionar una expresión regular wordPattern que se usará para coincidir con las palabras.

monaco.languages.setLanguageConfiguration('plaintext', {
    wordPattern: /'?\w[\w'-.]*[?!,;:"]*/
});


monaco.editor.create(document.getElementById("container"), {
    language: 'plaintext',
});

Aunque plaintext ya existe como un lenguaje, esto todavía funciona. No estoy seguro de si setLanguageConfiguration realiza alguna fusión (¿supongo que no?), así que tenlo en cuenta.

La expresión regular en mi fragmento de código no es perfecta, pero coincide con palabras como:

  • No pudo
  • 'porque
  • ¿tú?
  • Hola

lo cual era importante para mi caso de uso. ¡Tenlo en cuenta si eres un futuro buscador mirando esta respuesta!