Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | 'use strict'; const defaultFG = 39; const defaultBG = 49; const colors = { black: { normal: { fg: 30, bg: 40 } }, red: { normal: { fg: 31, bg: 41 }, bright: { fg: 91, bg: 101 } }, green: { normal: { fg: 32, bg: 42 }, bright: { fg: 92, bg: 102 } }, yellow: { normal: { fg: 33, bg: 43 }, bright: { fg: 93, bg: 103 } }, blue: { normal: { fg: 34, bg: 44 }, bright: { fg: 94, bg: 104 } }, magenta: { normal: { fg: 35, bg: 45 }, bright: { fg: 95, bg: 105 } }, cyan: { normal: { fg: 36, bg: 46 }, bright: { fg: 96, bg: 106 } }, white: { normal: { fg: 37, bg: 47 }, bright: { fg: 97, bg: 107 } }, gray: { normal: { fg: 90, bg: 100 } }, grey: { normal: { fg: 90, bg: 100 } } }; function createEntry(code, resetCode) { return { open: `\x1B[${code}m`, close: `\x1B[${resetCode}m` }; } function buildColorStyles() { return Object.entries(colors).reduce((acc, [name, variants]) => { const colorName = name; const capitalized = colorName[0]?.toUpperCase() + colorName.slice(1); acc[colorName] = createEntry(variants.normal.fg, defaultFG); if ("bright" in variants) { const brightKey = `bright${capitalized}`; acc[brightKey] = createEntry(variants.bright.fg, defaultFG); } const bgKey = `bg${capitalized}`; acc[bgKey] = createEntry(variants.normal.bg, defaultBG); if ("bright" in variants) { const bgBrightKey = `bgBright${capitalized}`; acc[bgBrightKey] = createEntry(variants.bright.bg, defaultBG); } return acc; }, {}); } const styles = { // 基础样式 reset: createEntry(0, 0), bold: createEntry(1, 22), dim: createEntry(2, 22), italic: createEntry(3, 23), underline: createEntry(4, 24), blink: createEntry(5, 25), // Swap foreground and background colors inverse: createEntry(7, 27), hidden: createEntry(8, 28), strikethrough: createEntry(9, 29), doubleunderline: createEntry(21, 24), framed: createEntry(51, 54), overlined: createEntry(53, 55), // 动态生成颜色样式 ...buildColorStyles() }; const ansiRegStr = "[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-\\w/#&.:=?%@~]+)+|[a-zA-Z\\d]+(?:;[-\\w/#&.:=?%@~]*)*)?(?:\\u0007|\\u001B\\u005C|\\u009C))|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"; function ansiRegex({ onlyFirst = false } = {}) { return new RegExp(ansiRegStr, onlyFirst ? void 0 : "g"); } const regex = ansiRegex(); function stripAnsi(string) { if (typeof string !== "string") { throw new TypeError(`Expected a \`string\`, got \`${typeof string}\``); } return string.replace(regex, ""); } function styleText(format, text) { const formats = Array.isArray(format) ? format : [format]; return formats.reverse().reduce((str, style) => `${styles[style].open}${str}${styles[style].close}`, text); } exports.ansiRegStr = ansiRegStr; exports.ansiRegex = ansiRegex; exports.stripAnsi = stripAnsi; exports.styleText = styleText; exports.styles = styles; |