Vindo do # 1707, parece que o manuseio correto do unicode é cada vez mais um problema para as pessoas devido aos emojis. Como todos nós amamos emojis, isso deve ser corrigido o mais rápido possível :smile:
Proposta:
Crie um provedor para diferentes versões de unicode, que seja capaz de ocultar os dados e implementações específicos da versão por trás de uma boa API. Atualmente, só precisamos de implementações dependentes de versão para wcwidth, portanto, um esboço aproximado pode ficar assim:
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, o provedor é autocontido, portanto, o terminal precisa apenas lidar com os métodos de interface e atualizar a versão/localidade quando necessário. O provedor teria que lidar com o material de baixo nível para fornecer os conjuntos de dados corretos para que os métodos funcionassem conforme o esperado para uma versão com suporte.
Dentro do provedor, podemos decidir se os dados são fornecidos estaticamente na base de código ou até mesmo se tentamos criar os dados em tempo real. O primeiro terá um grande impacto no tamanho do xterm.js, o segundo levantará questões assíncronas (lembre-se - a maioria das partes principais são atm síncronas). Todo o material unicode também pode ser empacotado em algum complemento como recurso para a versão XY.
Pronto para discussão.
/cc @Tyriar , @bgw , @mofux , @dnfield
Acho que algo assim pode ser mais acessível:
interface IUnicodeProvider {
getVersion(): string;
wcwidth(ucs: number): number;
getStringCellWidth(s: string): number;
... // more to come with support of other unicode features
}
Com algo como UnicodeProviderFactory.v11
seria um pouco melhor na hora da codificação, mas isso faz sentido para mim de qualquer maneira.
@dnfield Sim, de qualquer maneira funcionará. Não tenho certeza se precisaremos das informações de tipo no nível da versão.
Minha ideia era criar uma interface, que pudesse fazer as trocas de versão de forma transparente em tempo de execução assim:
// 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(...)
Dessa forma this.unicodeProvider
pode ser transportado sem a necessidade de reconectar após uma alteração de versão ou usando uma propriedade cara na instância do terminal.
O que eu recebo da discussão em #1707:
Algum comprador para colocar isso no código TS?
Fez uma primeira encarnação possível em #1714. Copiei a nova tabela do #1707, espero que esteja tudo bem (@dnfield).
Sem problemas!
https://github.com/xtermjs/xterm.js/pull/1714 é uma boa referência para isso, mas o plano é enviar vários addons após o novo modelo de addon (https://github.com/xtermjs/xterm. js/issues/1128) está, então permita que o incorporador escolha a versão correta.
Por favor, corrija o mais rápido possível, atualizar o Windows recentemente pareceu quebrar isso para mim. Estou tentando oferecer suporte a uma biblioteca Node.js que emoji'fies alguns aspectos do log para facilitar a leitura (parece muito mais bobo do que é).
Nova tentativa em https://github.com/xtermjs/xterm.js/pull/2568 , espero que possamos lançar isso na próxima versão.
@jerch podemos chamar isso de fechado com #2568 sendo mesclado?
@Tyriar Yepp, também já existe um acompanhamento :smile_cat: --> #2668
Comentários muito úteis
Nova tentativa em https://github.com/xtermjs/xterm.js/pull/2568 , espero que possamos lançar isso na próxima versão.