1 | "use strict";
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 | Object.defineProperty(exports, "__esModule", { value: true });
|
16 | function underlineCode(sourceRange, parsedDocument, colorizer = (s) => s, maxLines) {
|
17 | const relativeRange = parsedDocument.absoluteToRelativeSourceRange(sourceRange);
|
18 | const code = _getRelavantSourceCode(relativeRange, parsedDocument);
|
19 | if (!code) {
|
20 | return undefined;
|
21 | }
|
22 | const outputLines = [];
|
23 | const lines = code.split('\n', maxLines);
|
24 | let lineNum = relativeRange.start.line;
|
25 | for (const line of lines) {
|
26 | outputLines.push(line);
|
27 | outputLines.push(colorizer(getSquiggleUnderline(line, lineNum, relativeRange)));
|
28 | lineNum++;
|
29 | }
|
30 | return outputLines.join('\n');
|
31 | }
|
32 | exports.underlineCode = underlineCode;
|
33 | function _getRelavantSourceCode(relativeRange, parsedDocument) {
|
34 | if (parsedDocument === null) {
|
35 | return;
|
36 | }
|
37 | const startOffset = parsedDocument.sourcePositionToOffset({ column: 0, line: relativeRange.start.line });
|
38 | let endOffset;
|
39 | if (parsedDocument.newlineIndexes.length === relativeRange.end.line) {
|
40 | endOffset = parsedDocument.sourcePositionToOffset({ column: 0, line: relativeRange.end.line + 1 });
|
41 | }
|
42 | else {
|
43 | endOffset = parsedDocument.sourcePositionToOffset({ column: -1, line: relativeRange.end.line + 1 });
|
44 | }
|
45 | return parsedDocument.contents.slice(startOffset, endOffset);
|
46 | }
|
47 | function getSquiggleUnderline(lineText, lineNum, sourceRange) {
|
48 |
|
49 | if (lineNum !== sourceRange.start.line && lineNum !== sourceRange.end.line) {
|
50 | return '~'.repeat(lineText.length);
|
51 | }
|
52 |
|
53 |
|
54 | if (lineNum === sourceRange.start.line) {
|
55 | const startColumn = sourceRange.start.column;
|
56 | const endColumn = sourceRange.end.line === sourceRange.start.line ?
|
57 | sourceRange.end.column :
|
58 | lineText.length;
|
59 | const prefix = lineText.slice(0, startColumn).replace(/[^\t]/g, ' ');
|
60 | if (startColumn === endColumn) {
|
61 | return prefix + '~';
|
62 | }
|
63 | return prefix + '~'.repeat(endColumn - startColumn);
|
64 | }
|
65 |
|
66 |
|
67 | return '~'.repeat(sourceRange.end.column);
|
68 | }
|
69 |
|
\ | No newline at end of file |