Исходя из # 1707, кажется, что правильная обработка юникода становится все более и более проблемой для людей из-за смайликов. Поскольку мы все любим смайлики, это должно быть исправлено как можно скорее :smile:
Предложение:
Создайте поставщика для разных версий Unicode, который способен скрывать данные и реализации конкретной версии за красивым API. В настоящее время нам нужны только зависящие от версии реализации для wcwidth, поэтому грубый набросок может выглядеть так:
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
}
В идеале провайдер является самодостаточным, поэтому терминалу просто нужно иметь дело с методами интерфейса и при необходимости обновлять версию/язык. Поставщику придется иметь дело с низкоуровневыми вещами, чтобы предоставить правильные наборы данных, чтобы методы работали так, как ожидалось для поддерживаемой версии.
Затем внутри поставщика мы можем решить, будут ли данные предоставляться статически в базе кода или даже пытаться создавать данные на лету. Первый сильно повлияет на размер xterm.js, второй вызовет вопросы об асинхронности (помните, что большинство основных частей являются синхронными). Весь материал Unicode также может быть объединен в какую-то надстройку, подобную функции для версии XY.
На обсуждение.
/cc @Tyriar , @bgw , @mofux , @dnfield
Я думаю, что что-то вроде этого может быть более доступным:
interface IUnicodeProvider {
getVersion(): string;
wcwidth(ucs: number): number;
getStringCellWidth(s: string): number;
... // more to come with support of other unicode features
}
С чем-то вроде UnicodeProviderFactory.v11
было бы немного лучше во время кодирования, но это имеет смысл для меня в любом случае.
@dnfield Да, в любом случае сработает. Не уверен, однако, понадобится ли нам информация о типе на уровне версии.
Моя идея состояла в том, чтобы создать интерфейс, который может прозрачно переключать версии во время выполнения, например:
// 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(...)
Таким образом, this.unicodeProvider
можно носить с собой без необходимости повторного подключения после изменения версии или использования дорогостоящего свойства в экземпляре терминала.
Что я понял из обсуждения в #1707:
Есть желающие включить это в код TS?
Сделал первое возможное воплощение в № 1714. Скопировал новую таблицу из #1707, надеюсь, все в порядке (@dnfield).
Без проблем!
https://github.com/xtermjs/xterm.js/pull/1714 — хорошая ссылка для этого, но планируется выпустить несколько дополнений после новой модели дополнений (https://github.com/xtermjs/xterm. js/issues/1128), а затем позвольте эмбеддеру выбрать правильную версию.
Пожалуйста, исправьте как можно скорее, недавнее обновление Windows, казалось, сломало это для меня. Я пытаюсь поддержать библиотеку Node.js, которая эмоджиизирует некоторые аспекты ведения журнала для облегчения чтения (это звучит гораздо глупее, чем есть на самом деле).
Новая попытка в https://github.com/xtermjs/xterm.js/pull/2568 , надеюсь, мы сможем реализовать это в следующем выпуске.
@jerch , можем ли мы назвать это закрытым с объединением # 2568?
@Tyriar Yepp, уже есть продолжение :smile_cat: --> #2668
Самый полезный комментарий
Новая попытка в https://github.com/xtermjs/xterm.js/pull/2568 , надеюсь, мы сможем реализовать это в следующем выпуске.