; | |
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; | |