来自 #1707 似乎由于表情符号,正确的 unicode 处理对人们来说越来越成为一个问题。 由于我们都喜欢表情符号,因此应该尽快修复: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 的大小产生相当大的影响,其次会引发异步问题(请记住 - 大多数核心部分都是同步 atm)。 整个 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 库,该库 emoji'fies 记录的某些方面以便于阅读(这听起来比它更愚蠢)。
https://github.com/xtermjs/xterm.js/pull/2568中的新尝试,希望我们可以在下一个版本中推出它。
@jerch我们可以在合并#2568 的情况下将此称为关闭吗?
@Tyriar Yepp,已经有后续跟进了 :smile_cat: --> #2668
最有用的评论
https://github.com/xtermjs/xterm.js/pull/2568中的新尝试,希望我们可以在下一个版本中推出它。