var stringWidth = require('string-width') | |
var stripAnsi = require('strip-ansi') | |
module.exports = wideTruncate | |
function wideTruncate (str, target) { | |
if (stringWidth(str) === 0) return str | |
if (target <= 0) return '' | |
if (stringWidth(str) <= target) return str | |
// We compute the number of bytes of ansi sequences here and add | |
// that to our initial truncation to ensure that we don't slice one | |
// that we want to keep in half. | |
var noAnsi = stripAnsi(str) | |
var ansiSize = str.length + noAnsi.length | |
var truncated = str.slice(0, target + ansiSize) | |
// we have to shrink the result to account for our ansi sequence buffer | |
// (if an ansi sequence was truncated) and double width characters. | |
while (stringWidth(truncated) > target) { | |
truncated = truncated.slice(0, -1) | |
} | |
return truncated | |
} | |