You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
923 B
47 lines
923 B
'use strict'; |
|
const stripAnsi = require('strip-ansi'); |
|
const isFullwidthCodePoint = require('is-fullwidth-code-point'); |
|
const emojiRegex = require('emoji-regex'); |
|
|
|
const stringWidth = string => { |
|
if (typeof string !== 'string' || string.length === 0) { |
|
return 0; |
|
} |
|
|
|
string = stripAnsi(string); |
|
|
|
if (string.length === 0) { |
|
return 0; |
|
} |
|
|
|
string = string.replace(emojiRegex(), ' '); |
|
|
|
let width = 0; |
|
|
|
for (let i = 0; i < string.length; i++) { |
|
const code = string.codePointAt(i); |
|
|
|
// Ignore control characters |
|
if (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) { |
|
continue; |
|
} |
|
|
|
// Ignore combining characters |
|
if (code >= 0x300 && code <= 0x36F) { |
|
continue; |
|
} |
|
|
|
// Surrogates |
|
if (code > 0xFFFF) { |
|
i++; |
|
} |
|
|
|
width += isFullwidthCodePoint(code) ? 2 : 1; |
|
} |
|
|
|
return width; |
|
}; |
|
|
|
module.exports = stringWidth; |
|
// TODO: remove this in the next major version |
|
module.exports.default = stringWidth;
|
|
|