summaryrefslogtreecommitdiff
path: root/tools/node_modules/eslint/node_modules/slice-ansi/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'tools/node_modules/eslint/node_modules/slice-ansi/index.js')
-rwxr-xr-xtools/node_modules/eslint/node_modules/slice-ansi/index.js96
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;
}
}