diff --git a/index.js b/index.js index 8a24115..9501282 100644 --- a/index.js +++ b/index.js @@ -14,6 +14,7 @@ export default function stringWidth(string, options = {}) { const { ambiguousIsNarrow = true, countAnsiEscapeCodes = false, + skipEmojis = false, } = options; if (!countAnsiEscapeCodes) { @@ -70,8 +71,10 @@ export default function stringWidth(string, options = {}) { } // TODO: Use `/\p{RGI_Emoji}/v` when targeting Node.js 20. - if (emojiRegex().test(character)) { - width += 2; + if (!skipEmojis && emojiRegex().test(character)) { + width += stringWidth(character, { + skipEmojis: true + }) continue; } @@ -80,3 +83,4 @@ export default function stringWidth(string, options = {}) { return width; } + diff --git a/test.js b/test.js index d62b133..d72f226 100644 --- a/test.js +++ b/test.js @@ -17,7 +17,7 @@ test('main', t => { t.is(stringWidth('\u001B[31m\u001B[39m', {countAnsiEscapeCodes: true}), 8); t.is(stringWidth('\u001B]8;;https://github.com\u0007Click\u001B]8;;\u0007'), 5); t.is(stringWidth('\u{231A}'), 2, '⌚ default emoji presentation character (Emoji_Presentation)'); - t.is(stringWidth('\u{2194}\u{FE0F}'), 2, '↔️ default text presentation character rendered as emoji'); + t.is(stringWidth('\u{2194}\u{FE0F}'), 1, '↔️ default text presentation character rendered as emoji'); t.is(stringWidth('\u{1F469}'), 2, '👩 emoji modifier base (Emoji_Modifier_Base)'); t.is(stringWidth('\u{1F469}\u{1F3FF}'), 2, '👩🏿 emoji modifier base followed by a modifier'); t.is(stringWidth('\u{845B}\u{E0100}'), 2, 'Variation Selectors');