| 'use strict'; |
| var stripAnsi = require('strip-ansi'); |
| var codePointAt = require('code-point-at'); |
| var isFullwidthCodePoint = require('is-fullwidth-code-point'); |
| |
| // https://github.com/nodejs/io.js/blob/cff7300a578be1b10001f2d967aaedc88aee6402/lib/readline.js#L1345 |
| module.exports = function (str) { |
| if (typeof str !== 'string' || str.length === 0) { |
| return 0; |
| } |
| |
| var width = 0; |
| |
| str = stripAnsi(str); |
| |
| for (var i = 0; i < str.length; i++) { |
| var code = codePointAt(str, i); |
| |
| // ignore control characters |
| if (code <= 0x1f || (code >= 0x7f && code <= 0x9f)) { |
| continue; |
| } |
| |
| // surrogates |
| if (code >= 0x10000) { |
| i++; |
| } |
| |
| if (isFullwidthCodePoint(code)) { |
| width += 2; |
| } else { |
| width++; |
| } |
| } |
| |
| return width; |
| }; |