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.
31 lines
858 B
31 lines
858 B
'use strict' |
|
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 |
|
}
|
|
|