Xterm.js: xterm.js . рдореЗрдВ рдпреВрдирд┐рдХреЛрдб рд╣реИрдВрдбрд▓рд┐рдВрдЧ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 25 рд╕рд┐рддре░ 2018  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: xtermjs/xterm.js

#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

areparser typenhancement

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

https://github.com/xtermjs/xterm.js/pull/2568 рдореЗрдВ рдирдпрд╛ рдкреНрд░рдпрд╛рд╕, рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рднреА 10 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреБрдЫ рдЕрдзрд┐рдХ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

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 рдореЗрдВ рдЪрд░реНрдЪрд╛ рд╕реЗ рдореБрдЭреЗ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ:

  • рд╣рдо рдЕрднреА рдХреЗ рд▓рд┐рдП рджреЛ wcwidth рддрд╛рд▓рд┐рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдкреБрд░рд╛рдирд╛ рд╡рд╛рд▓рд╛ рдФрд░ рдирдпрд╛ @dnfield рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ред
  • рдЬреИрд╕рд╛ рдХрд┐ @gnachman рдиреЗ рдмрддрд╛рдпрд╛, рдЕрд╕реНрдкрд╖реНрдЯ рд╡рд░реНрдг рдкрд░реЗрд╢рд╛рдиреА рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдРрдкреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЖрдзреА рдЪреМрдбрд╝рд╛рдИ рдореЗрдВ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдРрд╕рд╛ рд╣реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рд░рд╛рд╕рдд рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдирдИ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред
  • рдпреВрдирд┐рдХреЛрдб рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рдПрдВред рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЗрдВрдЯреАрдЧреНрд░реЗрдЯрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
  • рдпреВрдирд┐рдХреЛрдб рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рдПрд╕реНрдХреЗрдк рдЕрдиреБрдХреНрд░рдо рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЧреИрд░ рдорд╛рдирдХ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрднреА рддрдХ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред
  • рдЕрднреА рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЬрд╛рджреБрдИ рдпреВрдирд┐рдХреЛрдб рд╕рдВрд╕реНрдХрд░рдг рдЕрдиреБрдорд╛рдирдХ рдирд╣реАрдВ рд╣реИред рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдРрд╕рд╛ рдЯреВрд▓ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╡реИрд╕реЗ рднреА xterm.js рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛрдЧрд╛ (рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ org рдореЗрдВ рд░рд╣ рд╕рдХреЗ)ред
  • рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдореЗрдВ xterm,js рдХреЗ рдкреИрдХреЗрдЬ рдХрд╛ рдЖрдХрд╛рд░ рдЫреЛрдЯрд╛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдХреЛрдб рдРрдбрдСрди рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЯреАрдПрд╕ рдХреЛрдб рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдЦрд░реАрджрд╛рд░?

#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

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

tandatle picture tandatle  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

johnpoth picture johnpoth  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

fabiospampinato picture fabiospampinato  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

LB-J picture LB-J  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

parisk picture parisk  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ