@markup-carve/carve-lsp 0.1.6 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -22
- package/dist/analyze.js +46 -8
- package/dist/analyze.js.map +1 -1
- package/dist/analyze.test.js +8 -7
- package/dist/analyze.test.js.map +1 -1
- package/dist/definition.d.ts +1 -1
- package/dist/definition.js +76 -0
- package/dist/definition.js.map +1 -1
- package/dist/export-actions.d.ts +48 -0
- package/dist/export-actions.js +80 -0
- package/dist/export-actions.js.map +1 -0
- package/dist/export-actions.test.d.ts +1 -0
- package/dist/export-actions.test.js +77 -0
- package/dist/export-actions.test.js.map +1 -0
- package/dist/hover.js +3 -1
- package/dist/hover.js.map +1 -1
- package/dist/include-completion.js +226 -30
- package/dist/include-completion.js.map +1 -1
- package/dist/include-completion.test.js +266 -7
- package/dist/include-completion.test.js.map +1 -1
- package/dist/include-definition.js +31 -4
- package/dist/include-definition.js.map +1 -1
- package/dist/include-denial.d.ts +33 -0
- package/dist/include-denial.js +41 -0
- package/dist/include-denial.js.map +1 -0
- package/dist/include-denial.test.d.ts +1 -0
- package/dist/include-denial.test.js +126 -0
- package/dist/include-denial.test.js.map +1 -0
- package/dist/include-directive.js +118 -11
- package/dist/include-directive.js.map +1 -1
- package/dist/include-directive.test.js +42 -0
- package/dist/include-directive.test.js.map +1 -1
- package/dist/include-merge-diagnostics.test.d.ts +1 -0
- package/dist/include-merge-diagnostics.test.js +220 -0
- package/dist/include-merge-diagnostics.test.js.map +1 -0
- package/dist/include-path.d.ts +11 -6
- package/dist/include-path.js +10 -1
- package/dist/include-path.js.map +1 -1
- package/dist/include-path.test.js +23 -0
- package/dist/include-path.test.js.map +1 -1
- package/dist/include-resolver-guards.test.d.ts +1 -0
- package/dist/include-resolver-guards.test.js +227 -0
- package/dist/include-resolver-guards.test.js.map +1 -0
- package/dist/include-root-containment.test.d.ts +1 -0
- package/dist/include-root-containment.test.js +169 -0
- package/dist/include-root-containment.test.js.map +1 -0
- package/dist/include-seam-mapping.test.d.ts +1 -0
- package/dist/include-seam-mapping.test.js +181 -0
- package/dist/include-seam-mapping.test.js.map +1 -0
- package/dist/include-seam-navigation.test.d.ts +1 -0
- package/dist/include-seam-navigation.test.js +141 -0
- package/dist/include-seam-navigation.test.js.map +1 -0
- package/dist/include-security-conformance.test.js +281 -35
- package/dist/include-security-conformance.test.js.map +1 -1
- package/dist/include-selection-diagnostics.test.d.ts +1 -0
- package/dist/include-selection-diagnostics.test.js +120 -0
- package/dist/include-selection-diagnostics.test.js.map +1 -0
- package/dist/include-selection-navigation.test.d.ts +1 -0
- package/dist/include-selection-navigation.test.js +75 -0
- package/dist/include-selection-navigation.test.js.map +1 -0
- package/dist/include-selection.d.ts +14 -0
- package/dist/include-selection.js +67 -0
- package/dist/include-selection.js.map +1 -0
- package/dist/include-settings.d.ts +47 -2
- package/dist/include-settings.js +69 -6
- package/dist/include-settings.js.map +1 -1
- package/dist/include-settings.test.js +118 -0
- package/dist/include-settings.test.js.map +1 -1
- package/dist/includes.d.ts +112 -6
- package/dist/includes.js +375 -134
- package/dist/includes.js.map +1 -1
- package/dist/lsp-stdio-client.d.ts +33 -0
- package/dist/lsp-stdio-client.js +92 -0
- package/dist/lsp-stdio-client.js.map +1 -0
- package/dist/position-encoding.test.js +97 -1
- package/dist/position-encoding.test.js.map +1 -1
- package/dist/position.d.ts +11 -0
- package/dist/position.js +23 -0
- package/dist/position.js.map +1 -1
- package/dist/preview-includes.test.d.ts +1 -0
- package/dist/preview-includes.test.js +141 -0
- package/dist/preview-includes.test.js.map +1 -0
- package/dist/preview.d.ts +9 -0
- package/dist/preview.js +21 -0
- package/dist/preview.js.map +1 -0
- package/dist/semantic.js +58 -5
- package/dist/semantic.js.map +1 -1
- package/dist/semantic.test.js +32 -0
- package/dist/semantic.test.js.map +1 -1
- package/dist/server-capabilities.test.js +3 -56
- package/dist/server-capabilities.test.js.map +1 -1
- package/dist/server.js +50 -9
- package/dist/server.js.map +1 -1
- package/dist/settings.d.ts +1 -0
- package/dist/settings.js +2 -0
- package/dist/settings.js.map +1 -1
- package/dist/settings.test.js +2 -2
- package/dist/settings.test.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { CodeActionKind, CreateFile, Position, Range, TextDocumentEdit, TextEdit, } from 'vscode-languageserver/node.js';
|
|
2
|
+
export const EXPORT_KIND = `${CodeActionKind.Source}.export`;
|
|
3
|
+
const FORMATS = {
|
|
4
|
+
markdown: { title: 'Export as Markdown', extension: '.md' },
|
|
5
|
+
html: { title: 'Export as HTML', extension: '.html' },
|
|
6
|
+
};
|
|
7
|
+
export function exportSupport(capabilities) {
|
|
8
|
+
const workspaceEdit = capabilities.workspace?.workspaceEdit;
|
|
9
|
+
return {
|
|
10
|
+
createFile: (workspaceEdit?.resourceOperations ?? []).includes('create'),
|
|
11
|
+
resolveEdit: (capabilities.textDocument?.codeAction?.resolveSupport?.properties ?? []).includes('edit'),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/** The sibling file an export writes: `notes.crv` becomes `notes.md`. */
|
|
15
|
+
export function exportTarget(uri, format) {
|
|
16
|
+
if (!uri.startsWith('file:'))
|
|
17
|
+
return null;
|
|
18
|
+
const { extension } = FORMATS[format];
|
|
19
|
+
return /\.crv$/i.test(uri) ? uri.replace(/\.crv$/i, extension) : `${uri}${extension}`;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Source actions that write the rendered document next to the source. With
|
|
23
|
+
* resolve support the action carries only `data` and the render happens in
|
|
24
|
+
* `resolveExportAction`, so a cursor move never pays for a full render.
|
|
25
|
+
*/
|
|
26
|
+
export function exportCodeActions(uri, support, only, render, existing) {
|
|
27
|
+
if (!support.createFile)
|
|
28
|
+
return [];
|
|
29
|
+
if (only && !only.some((kind) => EXPORT_KIND === kind || EXPORT_KIND.startsWith(`${kind}.`)))
|
|
30
|
+
return [];
|
|
31
|
+
const actions = [];
|
|
32
|
+
for (const format of Object.keys(FORMATS)) {
|
|
33
|
+
if (!exportTarget(uri, format))
|
|
34
|
+
continue;
|
|
35
|
+
const action = { title: FORMATS[format].title, kind: EXPORT_KIND };
|
|
36
|
+
if (support.resolveEdit) {
|
|
37
|
+
action.data = { carveExport: format, uri };
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
action.edit = exportEdit(uri, format, render(format), existing) ?? undefined;
|
|
41
|
+
}
|
|
42
|
+
actions.push(action);
|
|
43
|
+
}
|
|
44
|
+
return actions;
|
|
45
|
+
}
|
|
46
|
+
export function isExportAction(data) {
|
|
47
|
+
const candidate = data;
|
|
48
|
+
return typeof candidate?.uri === 'string'
|
|
49
|
+
&& (candidate.carveExport === 'markdown' || candidate.carveExport === 'html');
|
|
50
|
+
}
|
|
51
|
+
export function resolveExportAction(action, render, existing) {
|
|
52
|
+
if (!isExportAction(action.data))
|
|
53
|
+
return action;
|
|
54
|
+
const { uri, carveExport } = action.data;
|
|
55
|
+
const content = render(uri, carveExport);
|
|
56
|
+
if (content === null)
|
|
57
|
+
return action;
|
|
58
|
+
const edit = exportEdit(uri, carveExport, content, existing);
|
|
59
|
+
return edit ? { ...action, edit } : action;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Replace an existing target wholesale; create a missing one. `overwrite` on
|
|
63
|
+
* `CreateFile` is not enough: Zed keeps the old content and the insert lands
|
|
64
|
+
* in front of it.
|
|
65
|
+
*/
|
|
66
|
+
export function exportEdit(uri, format, content, existing) {
|
|
67
|
+
const target = exportTarget(uri, format);
|
|
68
|
+
if (!target)
|
|
69
|
+
return null;
|
|
70
|
+
const current = existing(target);
|
|
71
|
+
const fill = TextDocumentEdit.create({ uri: target, version: null }, [
|
|
72
|
+
TextEdit.replace(Range.create(Position.create(0, 0), endOf(current ?? '')), content),
|
|
73
|
+
]);
|
|
74
|
+
return { documentChanges: current === null ? [CreateFile.create(target), fill] : [fill] };
|
|
75
|
+
}
|
|
76
|
+
function endOf(text) {
|
|
77
|
+
const lines = text.split(/\r\n|\r|\n/);
|
|
78
|
+
return Position.create(lines.length - 1, lines[lines.length - 1].length);
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=export-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-actions.js","sourceRoot":"","sources":["../src/export-actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import test from 'node:test';
|
|
3
|
+
import { EXPORT_KIND, exportCodeActions, exportSupport, exportTarget, resolveExportAction, } from './export-actions.js';
|
|
4
|
+
const full = { createFile: true, resolveEdit: true };
|
|
5
|
+
const render = (format) => `rendered ${format}`;
|
|
6
|
+
const missing = () => null;
|
|
7
|
+
test('derives the sibling target from the source uri', () => {
|
|
8
|
+
assert.equal(exportTarget('file:///docs/notes.crv', 'markdown'), 'file:///docs/notes.md');
|
|
9
|
+
assert.equal(exportTarget('file:///docs/NOTES.CRV', 'html'), 'file:///docs/NOTES.html');
|
|
10
|
+
assert.equal(exportTarget('file:///docs/notes', 'markdown'), 'file:///docs/notes.md');
|
|
11
|
+
assert.equal(exportTarget('untitled:Untitled-1', 'markdown'), null);
|
|
12
|
+
});
|
|
13
|
+
test('reads create and resolve support from client capabilities', () => {
|
|
14
|
+
assert.deepEqual(exportSupport({}), { createFile: false, resolveEdit: false });
|
|
15
|
+
assert.deepEqual(exportSupport({
|
|
16
|
+
workspace: { workspaceEdit: { documentChanges: true, resourceOperations: ['create', 'rename'] } },
|
|
17
|
+
textDocument: { codeAction: { resolveSupport: { properties: ['edit'] } } },
|
|
18
|
+
}), { createFile: true, resolveEdit: true });
|
|
19
|
+
// Neovim's declaration: create without documentChanges.
|
|
20
|
+
assert.equal(exportSupport({ workspace: { workspaceEdit: { resourceOperations: ['rename', 'create', 'delete'] } } }).createFile, true);
|
|
21
|
+
assert.equal(exportSupport({ workspace: { workspaceEdit: { documentChanges: true } } }).createFile, false);
|
|
22
|
+
});
|
|
23
|
+
test('offers nothing when the client cannot create files', () => {
|
|
24
|
+
assert.deepEqual(exportCodeActions('file:///a.crv', { createFile: false, resolveEdit: true }, undefined, render, missing), []);
|
|
25
|
+
});
|
|
26
|
+
test('defers rendering to resolve when the client supports it', () => {
|
|
27
|
+
let renders = 0;
|
|
28
|
+
const actions = exportCodeActions('file:///a.crv', full, undefined, (format) => {
|
|
29
|
+
renders++;
|
|
30
|
+
return render(format);
|
|
31
|
+
}, missing);
|
|
32
|
+
assert.equal(renders, 0);
|
|
33
|
+
assert.deepEqual(actions.map((action) => [action.title, action.kind, action.edit]), [
|
|
34
|
+
['Export as Markdown', EXPORT_KIND, undefined],
|
|
35
|
+
['Export as HTML', EXPORT_KIND, undefined],
|
|
36
|
+
]);
|
|
37
|
+
const resolved = resolveExportAction(actions[0], (uri, format) => `${uri} as ${format}`, missing);
|
|
38
|
+
assert.deepEqual(resolved.edit, {
|
|
39
|
+
documentChanges: [
|
|
40
|
+
{ kind: 'create', uri: 'file:///a.md' },
|
|
41
|
+
{
|
|
42
|
+
textDocument: { uri: 'file:///a.md', version: null },
|
|
43
|
+
edits: [{ range: { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } }, newText: 'file:///a.crv as markdown' }],
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
test('renders eagerly without resolve support', () => {
|
|
49
|
+
const [markdown] = exportCodeActions('file:///a.crv', { createFile: true, resolveEdit: false }, undefined, render, missing);
|
|
50
|
+
const fill = markdown?.edit?.documentChanges?.[1];
|
|
51
|
+
assert.ok(fill && 'edits' in fill);
|
|
52
|
+
assert.equal(fill.edits[0]?.newText, 'rendered markdown');
|
|
53
|
+
});
|
|
54
|
+
test('honors the requested kinds filter', () => {
|
|
55
|
+
assert.equal(exportCodeActions('file:///a.crv', full, ['quickfix'], render, missing).length, 0);
|
|
56
|
+
assert.equal(exportCodeActions('file:///a.crv', full, ['source'], render, missing).length, 2);
|
|
57
|
+
assert.equal(exportCodeActions('file:///a.crv', full, [EXPORT_KIND], render, missing).length, 2);
|
|
58
|
+
});
|
|
59
|
+
test('leaves foreign actions and vanished documents untouched', () => {
|
|
60
|
+
const foreign = { title: 'other', data: { something: 1 } };
|
|
61
|
+
assert.equal(resolveExportAction(foreign, () => 'x', missing), foreign);
|
|
62
|
+
const [action] = exportCodeActions('file:///a.crv', full, undefined, render, missing);
|
|
63
|
+
assert.equal(resolveExportAction(action, () => null, missing).edit, undefined);
|
|
64
|
+
});
|
|
65
|
+
test('replaces an existing target instead of creating it again', () => {
|
|
66
|
+
const [action] = exportCodeActions('file:///a.crv', full, undefined, render, missing);
|
|
67
|
+
const resolved = resolveExportAction(action, () => 'new', () => 'old line\nsecond line\n');
|
|
68
|
+
assert.deepEqual(resolved.edit, {
|
|
69
|
+
documentChanges: [
|
|
70
|
+
{
|
|
71
|
+
textDocument: { uri: 'file:///a.md', version: null },
|
|
72
|
+
edits: [{ range: { start: { line: 0, character: 0 }, end: { line: 2, character: 0 } }, newText: 'new' }],
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=export-actions.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-actions.test.js","sourceRoot":"","sources":["../src/export-actions.test.ts"],"names":[],"mappings":"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"}
|
package/dist/hover.js
CHANGED
|
@@ -160,7 +160,9 @@ function collectBlock(matches, node, position, resolveRef) {
|
|
|
160
160
|
case 'table':
|
|
161
161
|
if (node.caption)
|
|
162
162
|
collectInline(matches, node.caption, position, resolveRef);
|
|
163
|
-
|
|
163
|
+
// A cell carries EITHER inline children or imported `blocks` (carve-js#1980), never both.
|
|
164
|
+
// Carve source always yields the inline half, and this server only ever parses source.
|
|
165
|
+
node.rows.forEach((row) => row.cells.forEach((cell) => collectInline(matches, cell.children ?? [], position, resolveRef)));
|
|
164
166
|
break;
|
|
165
167
|
}
|
|
166
168
|
}
|
package/dist/hover.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hover.js","sourceRoot":"","sources":["../src/hover.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"hover.js","sourceRoot":"","sources":["../src/hover.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,41 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Completion inside a `{{ … }}` include directive: the path, the `#section`
|
|
3
|
+
* it selects, and the option names and value shapes.
|
|
4
|
+
*
|
|
5
|
+
* Every slot is recognized against the SAME grammar the scanner enforces
|
|
6
|
+
* (`./include-directive.js`). A completion that inserts a spelling the scanner
|
|
7
|
+
* rejects is worse than no completion at all: the directive silently stops
|
|
8
|
+
* being a directive, with no include and no diagnostic - the exact failure
|
|
9
|
+
* this feature exists to prevent.
|
|
10
|
+
*/
|
|
1
11
|
import { readdirSync, readFileSync, realpathSync } from 'node:fs';
|
|
2
12
|
import path from 'node:path';
|
|
3
|
-
import { CompletionItemKind } from 'vscode-languageserver/node.js';
|
|
4
|
-
import {
|
|
13
|
+
import { CompletionItemKind, } from 'vscode-languageserver/node.js';
|
|
14
|
+
import { lineCount, sections } from './include-selection.js';
|
|
15
|
+
/**
|
|
16
|
+
* The option names §19 defines, with the value shapes worth offering. The
|
|
17
|
+
* line range has no fixed values, so its shape is completed from the child's
|
|
18
|
+
* own length; the shift offset does, and `auto` is the one authors do not
|
|
19
|
+
* discover on their own.
|
|
20
|
+
*/
|
|
21
|
+
const OPTION_NAMES = [
|
|
22
|
+
{ name: 'lines', detail: 'Select a line range, N-M' },
|
|
23
|
+
{ name: 'shift', detail: 'Shift heading levels by N, or auto' },
|
|
24
|
+
];
|
|
25
|
+
/** Text between the innermost unclosed `{{` and the cursor, or null. */
|
|
26
|
+
function directiveInner(prefix) {
|
|
27
|
+
const open = prefix.lastIndexOf('{{');
|
|
28
|
+
if (open < 0)
|
|
29
|
+
return null;
|
|
30
|
+
const inner = prefix.slice(open + 2);
|
|
31
|
+
return inner.includes('}}') ? null : inner;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* A complete path token, in every spelling the scanner accepts: bare, straight
|
|
35
|
+
* quoted, or curly quoted. A quoted path is the only way to name a file whose
|
|
36
|
+
* name contains a space, so a pattern that only matched the bare form would
|
|
37
|
+
* drop completion on exactly the directives that need the quotes.
|
|
38
|
+
*/
|
|
39
|
+
const PATH_TOKEN = '(?:"(?:\\\\.|[^"\\\\])*"|\u201c[^\u201d]*\u201d|[^\\s#@}"\u201c]+)';
|
|
40
|
+
/** `{{ <path>` with nothing selected yet. */
|
|
41
|
+
const PATH_RE = /^(\s*)([^\s#@}"\u201c]*)$/;
|
|
42
|
+
/**
|
|
43
|
+
* `{{ "<path>` mid-typing, before the closing quote exists. The opening
|
|
44
|
+
* delimiter is captured because the two quote styles do not close each other:
|
|
45
|
+
* a curly-opened path closed with a straight quote is not a directive.
|
|
46
|
+
*/
|
|
47
|
+
const QUOTED_PATH_RE = /^\s*(["\u201c])([^"\u201d]*)$/;
|
|
48
|
+
const CLOSING_QUOTE = { '"': '"', '\u201c': '\u201d' };
|
|
49
|
+
/** `{{ <path> #<fragment>`, and the ungrammatical `{{ <path>#<fragment>`. */
|
|
50
|
+
const FRAGMENT_RE = new RegExp(`^\\s*(${PATH_TOKEN})(\\s*)#([A-Za-z_][\\w-]*)?$`);
|
|
51
|
+
/** The leading path of a directive, however it is spelled. */
|
|
52
|
+
const LEADING_PATH_RE = new RegExp(`^\\s*(${PATH_TOKEN})`);
|
|
53
|
+
/**
|
|
54
|
+
* Everything that may legally precede an option: a path, an optional section,
|
|
55
|
+
* and options that are themselves complete. Without this an option would be
|
|
56
|
+
* offered after arbitrary text (`{{ ch1.crv nonsense @`), and taking it would
|
|
57
|
+
* leave a token the scanner refuses - the directive silently becoming prose,
|
|
58
|
+
* which is the one outcome this module exists to avoid.
|
|
59
|
+
*/
|
|
60
|
+
const OPTION_PREFIX_RE = new RegExp(`^\\s*${PATH_TOKEN}(?:\\s+#[A-Za-z_][\\w-]*)?(?:\\s+@[A-Za-z_][\\w-]*:[^\\s#@}]+)*\\s*$`);
|
|
61
|
+
/** `{{ <path> … @<name>`, with whatever separator precedes the sigil. */
|
|
62
|
+
const OPTION_NAME_RE = /(\s*)@([A-Za-z_][\w-]*)?$/;
|
|
63
|
+
/** `{{ <path> … @<name>:<value>` */
|
|
64
|
+
const OPTION_VALUE_RE = /@([A-Za-z_][\w-]*):([^\s#@}]*)$/;
|
|
65
|
+
/** A path token as the scanner reads it: quotes stripped, escapes undone. */
|
|
66
|
+
function decodePath(token) {
|
|
67
|
+
if (token.startsWith('"')) {
|
|
68
|
+
return token.slice(1, token.endsWith('"') ? -1 : undefined).replace(/\\(["\\])/g, '$1');
|
|
69
|
+
}
|
|
70
|
+
if (token.startsWith('\u201c'))
|
|
71
|
+
return token.slice(1, token.endsWith('\u201d') ? -1 : undefined);
|
|
72
|
+
return token;
|
|
73
|
+
}
|
|
5
74
|
export function includeCompletions(source, position, options) {
|
|
6
75
|
if (!options?.sourcePath || !options.includeRoot)
|
|
7
76
|
return [];
|
|
8
77
|
const line = source.replace(/\r\n?/g, '\n').split('\n')[position.line] ?? '';
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
if (!match)
|
|
78
|
+
const inner = directiveInner(line.slice(0, position.character));
|
|
79
|
+
if (inner === null)
|
|
12
80
|
return [];
|
|
13
|
-
const authored = match[1];
|
|
14
|
-
const [filePart, fragment] = authored.split('#', 2);
|
|
15
81
|
const root = realpathSafe(options.includeRoot);
|
|
16
82
|
if (!root)
|
|
17
83
|
return [];
|
|
18
|
-
const
|
|
84
|
+
const value = OPTION_VALUE_RE.exec(inner);
|
|
85
|
+
if (value) {
|
|
86
|
+
return OPTION_PREFIX_RE.test(inner.slice(0, value.index))
|
|
87
|
+
? optionValues(inner, value, position, options, root)
|
|
88
|
+
: [];
|
|
89
|
+
}
|
|
90
|
+
const name = OPTION_NAME_RE.exec(inner);
|
|
91
|
+
if (name) {
|
|
92
|
+
return OPTION_PREFIX_RE.test(inner.slice(0, name.index))
|
|
93
|
+
? optionNames(inner, name, position)
|
|
94
|
+
: [];
|
|
95
|
+
}
|
|
96
|
+
const fragment = FRAGMENT_RE.exec(inner);
|
|
97
|
+
if (fragment)
|
|
98
|
+
return fragments(fragment, position, options, root);
|
|
99
|
+
const quoted = QUOTED_PATH_RE.exec(inner);
|
|
100
|
+
if (quoted)
|
|
101
|
+
return paths(quoted[2], position, options, root, CLOSING_QUOTE[quoted[1]]);
|
|
102
|
+
const asPath = PATH_RE.exec(inner);
|
|
103
|
+
return asPath ? paths(asPath[2], position, options, root, undefined) : [];
|
|
104
|
+
}
|
|
105
|
+
/** A path the bare token cannot spell, so the directive has to quote it. */
|
|
106
|
+
function needsQuoting(value) {
|
|
107
|
+
return /["\u201c\u201d#@}\s]/.test(value);
|
|
108
|
+
}
|
|
109
|
+
function escapeQuoted(value) {
|
|
110
|
+
return value.replace(/(["\\])/g, '\\$1');
|
|
111
|
+
}
|
|
112
|
+
function quote(value) {
|
|
113
|
+
return `"${escapeQuoted(value)}"`;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Files and directories under the containment root, filtered to `.crv`.
|
|
117
|
+
*
|
|
118
|
+
* `closer` is set when the author already opened a quoted path: the edit then
|
|
119
|
+
* stays inside the quotes and closes them with the delimiter that MATCHES the
|
|
120
|
+
* opening one, once a FILE is chosen. A name that cannot be spelled bare is
|
|
121
|
+
* quoted on the author's behalf instead, whole path and all - quoting is a
|
|
122
|
+
* property of the token, not of its last segment.
|
|
123
|
+
*/
|
|
124
|
+
function paths(filePart, position, options, root, closer) {
|
|
125
|
+
// Split on the last separator rather than through `path.dirname`, which maps
|
|
126
|
+
// a trailing "sub/" to "." and would list the PARENT of the directory the
|
|
127
|
+
// author just opened. The backslash counts only where the platform treats it
|
|
128
|
+
// as a separator; on POSIX it is a legal character in a file name.
|
|
129
|
+
const slash = Math.max(filePart.lastIndexOf('/'), path.sep === '\\' ? filePart.lastIndexOf('\\') : -1);
|
|
130
|
+
const prefix = slash < 0 ? '' : filePart.slice(0, slash + 1);
|
|
131
|
+
const partial = slash < 0 ? filePart : filePart.slice(slash + 1);
|
|
132
|
+
const base = path.resolve(path.dirname(options.sourcePath), prefix || '.');
|
|
19
133
|
const contained = realpathSafe(base);
|
|
20
134
|
if (!contained || !isInside(root, contained))
|
|
21
135
|
return [];
|
|
22
|
-
const replaceStart = position.character - (fragment === undefined ? path.basename(filePart) : fragment).length;
|
|
23
|
-
if (fragment !== undefined) {
|
|
24
|
-
const target = realpathSafe(path.resolve(path.dirname(options.sourcePath), filePart));
|
|
25
|
-
if (!target || !isInside(root, target))
|
|
26
|
-
return [];
|
|
27
|
-
let targetSource;
|
|
28
|
-
try {
|
|
29
|
-
targetSource = readFileSync(target, 'utf8');
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
return [];
|
|
33
|
-
}
|
|
34
|
-
return scanDocument(target, targetSource)
|
|
35
|
-
.filter((token) => token.kind === 'heading' && token.declaration)
|
|
36
|
-
.map((token) => item(token.key, CompletionItemKind.Reference, position, replaceStart, 'Section in included file'));
|
|
37
|
-
}
|
|
38
|
-
const partial = path.basename(filePart);
|
|
39
136
|
let entries;
|
|
40
137
|
try {
|
|
41
138
|
entries = readdirSync(contained, { withFileTypes: true });
|
|
@@ -45,13 +142,112 @@ export function includeCompletions(source, position, options) {
|
|
|
45
142
|
}
|
|
46
143
|
return entries
|
|
47
144
|
.filter((entry) => entry.name.startsWith(partial) && (entry.isDirectory() || entry.name.endsWith('.crv')))
|
|
48
|
-
.map((entry) =>
|
|
145
|
+
.map((entry) => {
|
|
146
|
+
const directory = entry.isDirectory();
|
|
147
|
+
const label = entry.name + (directory ? '/' : '');
|
|
148
|
+
const full = prefix + label;
|
|
149
|
+
let start = position.character - partial.length;
|
|
150
|
+
let newText = label;
|
|
151
|
+
if (closer !== undefined) {
|
|
152
|
+
// Stay inside the quotes the author opened, and close them only once a
|
|
153
|
+
// FILE is chosen - a directory is a step on the way, not a whole path.
|
|
154
|
+
start = position.character - filePart.length;
|
|
155
|
+
newText = directory ? full : `${full}${closer}`;
|
|
156
|
+
}
|
|
157
|
+
else if (needsQuoting(full)) {
|
|
158
|
+
start = position.character - filePart.length;
|
|
159
|
+
newText = directory ? `"${escapeQuoted(full)}` : quote(full);
|
|
160
|
+
}
|
|
161
|
+
return item(label, directory ? CompletionItemKind.Folder : CompletionItemKind.File, position, start, 'Contained include path', newText);
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Heading ids in the file the directive already names.
|
|
166
|
+
*
|
|
167
|
+
* The inserted text always carries the separating space, whether or not the
|
|
168
|
+
* author typed one. `{{ ch1.crv#intro }}` is NOT a directive - the scanner's
|
|
169
|
+
* path token stops at `#` and the remainder parses as a bad option - so
|
|
170
|
+
* completing into that spelling would hand back literal text. Detecting it and
|
|
171
|
+
* repairing it turns the trigger character into a fix rather than a trap.
|
|
172
|
+
*/
|
|
173
|
+
function fragments(match, position, options, root) {
|
|
174
|
+
const filePart = decodePath(match[1]);
|
|
175
|
+
const tail = match[2].length + 1 + (match[3] ?? '').length;
|
|
176
|
+
const target = realpathSafe(path.resolve(path.dirname(options.sourcePath), filePart));
|
|
177
|
+
if (!target || !isInside(root, target))
|
|
178
|
+
return [];
|
|
179
|
+
const source = readSafe(target);
|
|
180
|
+
if (source === null)
|
|
181
|
+
return [];
|
|
182
|
+
const start = position.character - tail;
|
|
183
|
+
return sections(source).map((section) => item(`#${section.id}`, CompletionItemKind.Reference, position, start, 'Section in included file', ` #${section.id}`));
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Option names §19 defines, minus any the directive already carries.
|
|
187
|
+
*
|
|
188
|
+
* Options are whitespace-separated, so the inserted text carries the separator
|
|
189
|
+
* whether or not the author typed one - `{{ ch1.crv @shift:1@lines:2-3 }}` is
|
|
190
|
+
* one unparsable option token, not two, and completing into it would hand back
|
|
191
|
+
* literal text for the same reason the unspaced fragment does.
|
|
192
|
+
*/
|
|
193
|
+
function optionNames(inner, match, position) {
|
|
194
|
+
const separator = match[1];
|
|
195
|
+
const typed = match[2] ?? '';
|
|
196
|
+
const tail = separator.length + 1 + typed.length;
|
|
197
|
+
const before = inner.slice(0, inner.length - tail);
|
|
198
|
+
const start = position.character - tail;
|
|
199
|
+
return OPTION_NAMES.filter((option) => !new RegExp(`@${option.name}:`).test(before)).map((option) => item(`@${option.name}:`, CompletionItemKind.Property, position, start, option.detail, ` @${option.name}:`));
|
|
200
|
+
}
|
|
201
|
+
/** Value shapes for the option being typed. */
|
|
202
|
+
function optionValues(inner, match, position, options, root) {
|
|
203
|
+
const name = match[1];
|
|
204
|
+
const start = position.character - match[2].length;
|
|
205
|
+
if (name === 'shift') {
|
|
206
|
+
return [
|
|
207
|
+
item('auto', CompletionItemKind.Value, position, start, 'Fit heading levels to the include site'),
|
|
208
|
+
item('+1', CompletionItemKind.Value, position, start, 'Shift headings one level deeper'),
|
|
209
|
+
item('-1', CompletionItemKind.Value, position, start, 'Shift headings one level shallower'),
|
|
210
|
+
];
|
|
211
|
+
}
|
|
212
|
+
if (name !== 'lines')
|
|
213
|
+
return [];
|
|
214
|
+
// The only range worth guessing is the whole file, and it is only worth
|
|
215
|
+
// offering because it also tells the author how long the child actually is.
|
|
216
|
+
const token = LEADING_PATH_RE.exec(inner)?.[1];
|
|
217
|
+
if (!token)
|
|
218
|
+
return [];
|
|
219
|
+
const filePart = decodePath(token);
|
|
220
|
+
const target = realpathSafe(path.resolve(path.dirname(options.sourcePath), filePart));
|
|
221
|
+
if (!target || !isInside(root, target))
|
|
222
|
+
return [];
|
|
223
|
+
const source = readSafe(target);
|
|
224
|
+
if (source === null)
|
|
225
|
+
return [];
|
|
226
|
+
const total = lineCount(source);
|
|
227
|
+
// An empty target has no line to select, and `1-0` is not a range the
|
|
228
|
+
// scanner accepts, so there is nothing honest to offer.
|
|
229
|
+
if (total === 0)
|
|
230
|
+
return [];
|
|
231
|
+
return [item(`1-${total}`, CompletionItemKind.Value, position, start, `Whole file (${total} lines)`)];
|
|
49
232
|
}
|
|
50
|
-
function item(label, kind, position, start, detail) {
|
|
51
|
-
return {
|
|
233
|
+
function item(label, kind, position, start, detail, newText = label) {
|
|
234
|
+
return {
|
|
235
|
+
label,
|
|
236
|
+
kind,
|
|
237
|
+
detail,
|
|
238
|
+
textEdit: {
|
|
52
239
|
range: { start: { line: position.line, character: start }, end: position },
|
|
53
|
-
newText
|
|
54
|
-
}
|
|
240
|
+
newText,
|
|
241
|
+
},
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
function readSafe(target) {
|
|
245
|
+
try {
|
|
246
|
+
return readFileSync(target, 'utf8');
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
55
251
|
}
|
|
56
252
|
function realpathSafe(value) {
|
|
57
253
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"include-completion.js","sourceRoot":"","sources":["../src/include-completion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACjE,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,
|
|
1
|
+
{"version":3,"file":"include-completion.js","sourceRoot":"","sources":["../src/include-completion.ts"],"names":[],"mappings":"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"}
|