Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / slice-ansi / index.js
1 'use strict';
2 const isFullwidthCodePoint = require('is-fullwidth-code-point');
3 const astralRegex = require('astral-regex');
4 const ansiStyles = require('ansi-styles');
5
6 const ESCAPES = [
7         '\u001B',
8         '\u009B'
9 ];
10
11 const END_CODE = 39;
12
13 const wrapAnsi = code => `${ESCAPES[0]}[${code}m`;
14
15 module.exports = (str, begin, end) => {
16         const arr = [...str.normalize()];
17
18         end = typeof end === 'number' ? end : arr.length;
19
20         let insideEscape = false;
21         let escapeCode = null;
22         let visible = 0;
23         let output = '';
24
25         for (const [i, x] of arr.entries()) {
26                 let leftEscape = false;
27
28                 if (ESCAPES.includes(x)) {
29                         insideEscape = true;
30                         const code = /\d[^m]*/.exec(str.slice(i, i + 18));
31                         escapeCode = code === END_CODE ? null : code;
32                 } else if (insideEscape && x === 'm') {
33                         insideEscape = false;
34                         leftEscape = true;
35                 }
36
37                 if (!insideEscape && !leftEscape) {
38                         ++visible;
39                 }
40
41                 if (!astralRegex({exact: true}).test(x) && isFullwidthCodePoint(x.codePointAt())) {
42                         ++visible;
43                 }
44
45                 if (visible > begin && visible <= end) {
46                         output += x;
47                 } else if (visible === begin && !insideEscape && escapeCode !== null && escapeCode !== END_CODE) {
48                         output += wrapAnsi(escapeCode);
49                 } else if (visible >= end) {
50                         if (escapeCode !== null) {
51                                 output += wrapAnsi(ansiStyles.codes.get(parseInt(escapeCode, 10)) || END_CODE);
52                         }
53
54                         break;
55                 }
56         }
57
58         return output;
59 };