UNPKG

3.83 kBJavaScriptView Raw
1"use strict";
2
3exports.__esModule = true;
4
5exports.default = function (rawLines, lineNumber, colNumber) {
6 var opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
7
8 colNumber = Math.max(colNumber, 0);
9
10 var highlighted = opts.highlightCode && _chalk2.default.supportsColor || opts.forceColor;
11 var chalk = _chalk2.default;
12 if (opts.forceColor) {
13 chalk = new _chalk2.default.constructor({ enabled: true });
14 }
15 var maybeHighlight = function maybeHighlight(chalkFn, string) {
16 return highlighted ? chalkFn(string) : string;
17 };
18 var defs = getDefs(chalk);
19 if (highlighted) rawLines = highlight(defs, rawLines);
20
21 var linesAbove = opts.linesAbove || 2;
22 var linesBelow = opts.linesBelow || 3;
23
24 var lines = rawLines.split(NEWLINE);
25 var start = Math.max(lineNumber - (linesAbove + 1), 0);
26 var end = Math.min(lines.length, lineNumber + linesBelow);
27
28 if (!lineNumber && !colNumber) {
29 start = 0;
30 end = lines.length;
31 }
32
33 var numberMaxWidth = String(end).length;
34
35 var frame = lines.slice(start, end).map(function (line, index) {
36 var number = start + 1 + index;
37 var paddedNumber = (" " + number).slice(-numberMaxWidth);
38 var gutter = " " + paddedNumber + " | ";
39 if (number === lineNumber) {
40 var markerLine = "";
41 if (colNumber) {
42 var markerSpacing = line.slice(0, colNumber - 1).replace(/[^\t]/g, " ");
43 markerLine = ["\n ", maybeHighlight(defs.gutter, gutter.replace(/\d/g, " ")), markerSpacing, maybeHighlight(defs.marker, "^")].join("");
44 }
45 return [maybeHighlight(defs.marker, ">"), maybeHighlight(defs.gutter, gutter), line, markerLine].join("");
46 } else {
47 return " " + maybeHighlight(defs.gutter, gutter) + line;
48 }
49 }).join("\n");
50
51 if (highlighted) {
52 return chalk.reset(frame);
53 } else {
54 return frame;
55 }
56};
57
58var _jsTokens = require("js-tokens");
59
60var _jsTokens2 = _interopRequireDefault(_jsTokens);
61
62var _esutils = require("esutils");
63
64var _esutils2 = _interopRequireDefault(_esutils);
65
66var _chalk = require("chalk");
67
68var _chalk2 = _interopRequireDefault(_chalk);
69
70function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
71
72function getDefs(chalk) {
73 return {
74 keyword: chalk.cyan,
75 capitalized: chalk.yellow,
76 jsx_tag: chalk.yellow,
77 punctuator: chalk.yellow,
78
79 number: chalk.magenta,
80 string: chalk.green,
81 regex: chalk.magenta,
82 comment: chalk.grey,
83 invalid: chalk.white.bgRed.bold,
84 gutter: chalk.grey,
85 marker: chalk.red.bold
86 };
87}
88
89var NEWLINE = /\r\n|[\n\r\u2028\u2029]/;
90
91var JSX_TAG = /^[a-z][\w-]*$/i;
92
93var BRACKET = /^[()\[\]{}]$/;
94
95function getTokenType(match) {
96 var _match$slice = match.slice(-2),
97 offset = _match$slice[0],
98 text = _match$slice[1];
99
100 var token = (0, _jsTokens.matchToToken)(match);
101
102 if (token.type === "name") {
103 if (_esutils2.default.keyword.isReservedWordES6(token.value)) {
104 return "keyword";
105 }
106
107 if (JSX_TAG.test(token.value) && (text[offset - 1] === "<" || text.substr(offset - 2, 2) == "</")) {
108 return "jsx_tag";
109 }
110
111 if (token.value[0] !== token.value[0].toLowerCase()) {
112 return "capitalized";
113 }
114 }
115
116 if (token.type === "punctuator" && BRACKET.test(token.value)) {
117 return "bracket";
118 }
119
120 return token.type;
121}
122
123function highlight(defs, text) {
124 return text.replace(_jsTokens2.default, function () {
125 for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
126 args[_key] = arguments[_key];
127 }
128
129 var type = getTokenType(args);
130 var colorize = defs[type];
131 if (colorize) {
132 return args[0].split(NEWLINE).map(function (str) {
133 return colorize(str);
134 }).join("\n");
135 } else {
136 return args[0];
137 }
138 });
139}
140
141module.exports = exports["default"];
\No newline at end of file