Viniendo del #1707, parece que el manejo correcto de Unicode es cada vez más un problema para las personas debido a los emojis. Como a todos nos encantan los emojis, esto debería arreglarse lo antes posible :smile:
Propuesta:
Cree un proveedor para diferentes versiones de Unicode, que sea capaz de ocultar los datos específicos de la versión y las implementaciones detrás de una buena API. Actualmente solo necesitamos implementaciones dependientes de la versión para wcwidth, por lo que un bosquejo aproximado podría verse así:
interface IUnicodeProvider {
supportedVersions(): string[];
getVersion(): string;
setVersion(version?: string); // version optional for fallback behavior
wcwidth(ucs: number): number;
getStringCellWidth(s: string): number;
... // more to come with support of other unicode features
}
Idealmente, el proveedor es autónomo, por lo que el terminal solo necesita lidiar con los métodos de interfaz y actualizar la versión/local cuando sea necesario. El proveedor tendría que lidiar con las cosas de bajo nivel para proporcionar los conjuntos de datos correctos para que los métodos funcionen como se esperaba para una versión compatible.
Dentro del proveedor, podemos decidir si los datos se proporcionan de forma estática en la base del código o si incluso intentamos crear los datos sobre la marcha. El primero tendrá un gran impacto en el tamaño de xterm.js, el segundo generará preguntas asíncronas (recuerde: la mayoría de las partes principales son cajeros automáticos síncronos). Todo el material de Unicode también podría incluirse en alguna función similar a un complemento para la versión XY.
A la discusión.
/cc @Tyriar , @bgw , @mofux , @dnfield
Creo que algo como esto podría ser más accesible:
interface IUnicodeProvider {
getVersion(): string;
wcwidth(ucs: number): number;
getStringCellWidth(s: string): number;
... // more to come with support of other unicode features
}
Con algo como UnicodeProviderFactory.v11
sería un poco mejor en el momento de la codificación, pero esto tiene sentido para mí de cualquier manera.
@dnfield Sí, de cualquier manera funcionará. Sin embargo, no estoy seguro de si necesitaremos la información de tipo en el nivel de versión.
Mi idea era crear una interfaz que pudiera cambiar de forma transparente la versión en tiempo de ejecución de esta manera:
// terminal ctor - create the provider
this.unicodeProvider = new UnicodeProvider();
...
// some code that knows whether to switch unicode versions
this.unicodeProvider.setVersion(xy);
...
// some unicode consumer - does not care about versions at all, just gets the right method
this.unicodeProvider.wcwidth(...)
De esta manera this.unicodeProvider
puede transportarse sin necesidad de volver a adjuntarlo después de un cambio de versión o usar una propiedad costosa en la instancia de la terminal.
Lo que obtengo de la discusión en # 1707:
¿Algún interesado en convertir eso en código TS?
Hizo una primera encarnación posible en el #1714. Copié la nueva tabla desde el n. ° 1707, espero que esté bien (@dnfield).
¡No hay problema!
https://github.com/xtermjs/xterm.js/pull/1714 es una buena referencia para esto, pero el plan es enviar varios complementos después del nuevo modelo de complemento (https://github.com/xtermjs/xterm. js/issues/1128), luego permita que el integrador elija la versión correcta.
Solucione lo antes posible, la actualización de Windows recientemente pareció romper esto para mí. Estoy intentando admitir una biblioteca Node.js que emoji'fie algunos aspectos del registro para facilitar la lectura (suena mucho más tonto de lo que es).
Nuevo intento en https://github.com/xtermjs/xterm.js/pull/2568 , con suerte podemos implementar esto con el próximo lanzamiento.
@jerch , ¿podemos llamar a esto cerrado con la fusión de #2568?
@Tyriar Yepp, ya hay un seguimiento :smile_cat: --> #2668
Comentario más útil
Nuevo intento en https://github.com/xtermjs/xterm.js/pull/2568 , con suerte podemos implementar esto con el próximo lanzamiento.