diff options
Diffstat (limited to 'tools/node_modules/eslint/node_modules/slice-ansi/index.js')
-rwxr-xr-x | tools/node_modules/eslint/node_modules/slice-ansi/index.js | 96 |
1 files changed, 70 insertions, 26 deletions
diff --git a/tools/node_modules/eslint/node_modules/slice-ansi/index.js b/tools/node_modules/eslint/node_modules/slice-ansi/index.js index a8765e1187..72d37d9a58 100755 --- a/tools/node_modules/eslint/node_modules/slice-ansi/index.js +++ b/tools/node_modules/eslint/node_modules/slice-ansi/index.js @@ -8,49 +8,93 @@ const ESCAPES = [ '\u009B' ]; -const END_CODE = 39; - const wrapAnsi = code => `${ESCAPES[0]}[${code}m`; -module.exports = (str, begin, end) => { - const arr = [...str.normalize()]; +const checkAnsi = (ansiCodes, isEscapes, endAnsiCode) => { + let output = []; + ansiCodes = [...ansiCodes]; + + for (let ansiCode of ansiCodes) { + const ansiCodeOrigin = ansiCode; + if (ansiCode.includes(';')) { + ansiCode = ansiCode.split(';')[0][0] + '0'; + } + + const item = ansiStyles.codes.get(Number.parseInt(ansiCode, 10)); + if (item) { + const indexEscape = ansiCodes.indexOf(item.toString()); + if (indexEscape === -1) { + output.push(wrapAnsi(isEscapes ? item : ansiCodeOrigin)); + } else { + ansiCodes.splice(indexEscape, 1); + } + } else if (isEscapes) { + output.push(wrapAnsi(0)); + break; + } else { + output.push(wrapAnsi(ansiCodeOrigin)); + } + } - end = typeof end === 'number' ? end : arr.length; + if (isEscapes) { + output = output.filter((element, index) => output.indexOf(element) === index); - let insideEscape = false; - let escapeCode = null; + if (endAnsiCode !== undefined) { + const fistEscapeCode = wrapAnsi(ansiStyles.codes.get(Number.parseInt(endAnsiCode, 10))); + output = output.reduce((current, next) => next === fistEscapeCode ? [next, ...current] : [...current, next], []); + } + } + + return output.join(''); +}; + +module.exports = (string, begin, end) => { + const characters = [...string]; + const ansiCodes = []; + + let stringEnd = typeof end === 'number' ? end : characters.length; + let isInsideEscape = false; + let ansiCode; let visible = 0; let output = ''; - for (const [i, x] of arr.entries()) { + for (const [index, character] of characters.entries()) { let leftEscape = false; - if (ESCAPES.includes(x)) { - insideEscape = true; - const code = /\d[^m]*/.exec(str.slice(i, i + 18)); - escapeCode = code === END_CODE ? null : code; - } else if (insideEscape && x === 'm') { - insideEscape = false; + if (ESCAPES.includes(character)) { + const code = /\d[^m]*/.exec(string.slice(index, index + 18)); + ansiCode = code && code.length > 0 ? code[0] : undefined; + + if (visible < stringEnd) { + isInsideEscape = true; + + if (ansiCode !== undefined) { + ansiCodes.push(ansiCode); + } + } + } else if (isInsideEscape && character === 'm') { + isInsideEscape = false; leftEscape = true; } - if (!insideEscape && !leftEscape) { - ++visible; + if (!isInsideEscape && !leftEscape) { + visible++; } - if (!astralRegex({exact: true}).test(x) && isFullwidthCodePoint(x.codePointAt())) { - ++visible; - } + if (!astralRegex({exact: true}).test(character) && isFullwidthCodePoint(character.codePointAt())) { + visible++; - if (visible > begin && visible <= end) { - output += x; - } else if (visible === begin && !insideEscape && escapeCode !== null && escapeCode !== END_CODE) { - output += wrapAnsi(escapeCode); - } else if (visible >= end) { - if (escapeCode !== null) { - output += wrapAnsi(ansiStyles.codes.get(parseInt(escapeCode, 10)) || END_CODE); + if (typeof end !== 'number') { + stringEnd++; } + } + if (visible > begin && visible <= stringEnd) { + output += character; + } else if (visible === begin && !isInsideEscape && ansiCode !== undefined) { + output = checkAnsi(ansiCodes); + } else if (visible >= stringEnd) { + output += checkAnsi(ansiCodes, true, ansiCode); break; } } |