#1707 рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрдореЛрдЬреА рдХреЗ рдХрд╛рд░рдг рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдпреВрдирд┐рдХреЛрдб рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдо рд╕рднреА рдЗрдореЛрдЬреА рд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: рдореБрд╕реНрдХрд╛рди:
рдкреНрд░рд╕реНрддрд╛рд╡:
рд╡рд┐рднрд┐рдиреНрди рдпреВрдирд┐рдХреЛрдб рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рджрд╛рддрд╛ рдмрдирд╛рдПрдВ, рдЬреЛ рдПрдХ рдЕрдЪреНрдЫреЗ рдПрдкреАрдЖрдИ рдХреЗ рдкреАрдЫреЗ рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЗрдЯрд╛ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдореЗрдВ рдХреЗрд╡рд▓ 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 рдХреЗ рдЖрдХрд╛рд░ рдкрд░ рдХрд╛рдлреА рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓реЗрдЧрд╛, рджреВрд╕рд░рд╛ async рдкреНрд░рд╢реНрди рдЙрдард╛рдПрдЧрд╛ (рдпрд╛рдж рд░рдЦреЗрдВ - рдЕрдзрд┐рдХрд╛рдВрд╢ рдореБрдЦреНрдп рднрд╛рдЧ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдПрдЯреАрдПрдо рд╣реИрдВ)ред рдкреВрд░реЗ рдпреВрдирд┐рдХреЛрдб рд╕рд╛рдорд╛рди рдХреЛ рд╕рдВрд╕реНрдХрд░рдг 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 рдореЗрдВ рдЪрд░реНрдЪрд╛ рд╕реЗ рдореБрдЭреЗ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ:
рдЯреАрдПрд╕ рдХреЛрдб рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдЦрд░реАрджрд╛рд░?
#1714 рдореЗрдВ рдкрд╣рд▓рд╛ рд╕рдВрднрд╡ рдЕрд╡рддрд╛рд░ рд▓рд┐рдпрд╛ред #1707 рд╕реЗ рдирдИ рддрд╛рд▓рд┐рдХрд╛ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ, рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдареАрдХ рд╣реИ (@dnfield)ред
рдХреЛрдИ рджрд┐рдХреНрдХрдд рдирд╣реАрдВ рд╣реИ!
рдЗрд╕рдХреЗ рд▓рд┐рдП https://github.com/xtermjs/xterm.js/pull/1714 рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдВрджрд░реНрдн рд╣реИ, рд▓реЗрдХрд┐рди рдирдП рдПрдбрдСрди рдореЙрдбрд▓ (https://github.com/xtermjs/xterm. js/issues/1128) рдореЗрдВ рд╣реИ, рддреЛ рдПрдореНрдмреЗрдбрд░ рдХреЛ рд╕рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдЪреБрдирдиреЗ рджреЗрдВред
рдХреГрдкрдпрд╛ ASAP рдХреЛ рдареАрдХ рдХрд░реЗрдВ, рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕реЗ рддреЛрдбрд╝рдирд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдореИрдВ рдПрдХ 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 рдореЗрдВ рдирдпрд╛ рдкреНрд░рдпрд╛рд╕, рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред