From 0fb63561fbc374d7d52f685d133bb3c9c3998970 Mon Sep 17 00:00:00 2001 From: mmis1000 Date: Thu, 3 Sep 2020 13:23:01 +0800 Subject: [PATCH] Fix cjk handling in SerializeAddon --- .../src/SerializeAddon.api.ts | 29 +++++++++++++++++++ .../src/SerializeAddon.ts | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/addons/xterm-addon-serialize/src/SerializeAddon.api.ts b/addons/xterm-addon-serialize/src/SerializeAddon.api.ts index 9e79de3f..526dbe35 100644 --- a/addons/xterm-addon-serialize/src/SerializeAddon.api.ts +++ b/addons/xterm-addon-serialize/src/SerializeAddon.api.ts @@ -270,6 +270,35 @@ describe('SerializeAddon', () => { await writeSync(page, lines.join('\\r\\n')); assert.equal(await page.evaluate(`serializeAddon.serialize();`), expected.join('\r\n')); }); + + it('serialize CJK correctly', async () => { + const lines = [ + '中文中文', + '12中文', + '中文12', + '1中文中文中' // this line is going to be wrapped at last character because it has line length of 11 (1+2*5) + ]; + const expected = [ + '中文中文', + '12中文', + '中文12', + '1中文中文', + '中' + ]; + await writeSync(page, lines.join('\\r\\n')); + assert.equal(await page.evaluate(`serializeAddon.serialize();`), expected.join('\r\n')); + }); + + it('serialize CJK Mixed with tab correctly', async () => { + const lines = [ + '中文\t12' // CJK mixed with tab + ]; + const expected = [ + '中文\x1b[4C12' + ]; + await writeSync(page, lines.join('\\r\\n')); + assert.equal(await page.evaluate(`serializeAddon.serialize();`), expected.join('\r\n')); + }); }); function newArray(initial: T | ((index: number) => T), count: number): T[] { diff --git a/addons/xterm-addon-serialize/src/SerializeAddon.ts b/addons/xterm-addon-serialize/src/SerializeAddon.ts index d8917742..dad6aa4f 100644 --- a/addons/xterm-addon-serialize/src/SerializeAddon.ts +++ b/addons/xterm-addon-serialize/src/SerializeAddon.ts @@ -138,7 +138,7 @@ class StringSerializeHandler extends BaseSerializeHandler { // Count number of null cells encountered after the last non-null cell and move the cursor // if a non-null cell is found (eg. \t or cursor move) if (cell.getChars() === '') { - this._nullCellCount++; + this._nullCellCount += cell.getWidth(); } else if (this._nullCellCount > 0) { this._currentRow += `\x1b[${this._nullCellCount}C`; this._nullCellCount = 0;