@markup-carve/carve-lsp 0.1.2 → 0.1.4
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 +61 -14
- package/dist/analyze.d.ts +15 -1
- package/dist/analyze.js +214 -16
- package/dist/analyze.js.map +1 -1
- package/dist/analyze.test.js +29 -1
- package/dist/analyze.test.js.map +1 -1
- package/dist/captions.d.ts +49 -0
- package/dist/captions.js +124 -0
- package/dist/captions.js.map +1 -0
- package/dist/codelens.js +12 -0
- package/dist/codelens.js.map +1 -1
- package/dist/codelens.test.js +5 -0
- package/dist/codelens.test.js.map +1 -1
- package/dist/colon-fence-kinds.test.d.ts +1 -0
- package/dist/colon-fence-kinds.test.js +128 -0
- package/dist/colon-fence-kinds.test.js.map +1 -0
- package/dist/colon-fences.d.ts +24 -0
- package/dist/colon-fences.js +174 -0
- package/dist/colon-fences.js.map +1 -0
- package/dist/colon-fences.test.d.ts +1 -0
- package/dist/colon-fences.test.js +23 -0
- package/dist/colon-fences.test.js.map +1 -0
- package/dist/completion.d.ts +6 -2
- package/dist/completion.js +84 -8
- package/dist/completion.js.map +1 -1
- package/dist/completion.test.js +7 -0
- package/dist/completion.test.js.map +1 -1
- package/dist/composite-figure-crossref.test.d.ts +1 -0
- package/dist/composite-figure-crossref.test.js +265 -0
- package/dist/composite-figure-crossref.test.js.map +1 -0
- package/dist/composite-figure.test.d.ts +1 -0
- package/dist/composite-figure.test.js +76 -0
- package/dist/composite-figure.test.js.map +1 -0
- package/dist/definition.d.ts +4 -2
- package/dist/definition.js +28 -5
- package/dist/definition.js.map +1 -1
- package/dist/dependencies.d.ts +15 -0
- package/dist/dependencies.js +59 -0
- package/dist/dependencies.js.map +1 -0
- package/dist/diagnostic-scheduler.d.ts +58 -0
- package/dist/diagnostic-scheduler.js +70 -0
- package/dist/diagnostic-scheduler.js.map +1 -0
- package/dist/diagnostic-scheduler.test.d.ts +1 -0
- package/dist/diagnostic-scheduler.test.js +75 -0
- package/dist/diagnostic-scheduler.test.js.map +1 -0
- package/dist/document-highlights.d.ts +2 -0
- package/dist/document-highlights.js +21 -0
- package/dist/document-highlights.js.map +1 -0
- package/dist/document-highlights.test.d.ts +1 -0
- package/dist/document-highlights.test.js +13 -0
- package/dist/document-highlights.test.js.map +1 -0
- package/dist/document-links.d.ts +3 -0
- package/dist/document-links.js +36 -0
- package/dist/document-links.js.map +1 -0
- package/dist/document-links.test.d.ts +1 -0
- package/dist/document-links.test.js +12 -0
- package/dist/document-links.test.js.map +1 -0
- package/dist/folding.d.ts +1 -0
- package/dist/folding.js +36 -1
- package/dist/folding.js.map +1 -1
- package/dist/folding.test.js +6 -1
- package/dist/folding.test.js.map +1 -1
- package/dist/format-corpus.test.d.ts +1 -0
- package/dist/format-corpus.test.js +16 -0
- package/dist/format-corpus.test.js.map +1 -0
- package/dist/format.d.ts +3 -0
- package/dist/format.js +38 -74
- package/dist/format.js.map +1 -1
- package/dist/format.test.js +27 -32
- package/dist/format.test.js.map +1 -1
- package/dist/hover.js +78 -19
- package/dist/hover.js.map +1 -1
- package/dist/include-cache.d.ts +26 -0
- package/dist/include-cache.js +74 -0
- package/dist/include-cache.js.map +1 -0
- package/dist/include-completion.d.ts +3 -0
- package/dist/include-completion.js +68 -0
- package/dist/include-completion.js.map +1 -0
- package/dist/include-completion.test.d.ts +1 -0
- package/dist/include-completion.test.js +15 -0
- package/dist/include-completion.test.js.map +1 -0
- package/dist/include-definition-denial.test.d.ts +1 -0
- package/dist/include-definition-denial.test.js +86 -0
- package/dist/include-definition-denial.test.js.map +1 -0
- package/dist/include-definition.d.ts +3 -0
- package/dist/include-definition.js +37 -0
- package/dist/include-definition.js.map +1 -0
- package/dist/include-features.test.d.ts +1 -0
- package/dist/include-features.test.js +133 -0
- package/dist/include-features.test.js.map +1 -0
- package/dist/include-path.d.ts +6 -0
- package/dist/include-path.js +31 -2
- package/dist/include-path.js.map +1 -1
- package/dist/include-settings.d.ts +2 -0
- package/dist/include-settings.js +1 -0
- package/dist/include-settings.js.map +1 -1
- package/dist/includes.d.ts +8 -0
- package/dist/includes.js +28 -7
- package/dist/includes.js.map +1 -1
- package/dist/inlay-hints.d.ts +3 -0
- package/dist/inlay-hints.js +43 -0
- package/dist/inlay-hints.js.map +1 -0
- package/dist/inlay-hints.test.d.ts +1 -0
- package/dist/inlay-hints.test.js +10 -0
- package/dist/inlay-hints.test.js.map +1 -0
- package/dist/lint-actions.d.ts +3 -0
- package/dist/lint-actions.js +90 -0
- package/dist/lint-actions.js.map +1 -0
- package/dist/lint-actions.test.d.ts +1 -0
- package/dist/lint-actions.test.js +31 -0
- package/dist/lint-actions.test.js.map +1 -0
- package/dist/no-git-dependencies.test.d.ts +1 -0
- package/dist/no-git-dependencies.test.js +243 -0
- package/dist/no-git-dependencies.test.js.map +1 -0
- package/dist/packaging.test.d.ts +1 -0
- package/dist/packaging.test.js +69 -0
- package/dist/packaging.test.js.map +1 -0
- package/dist/references.d.ts +2 -0
- package/dist/references.js +113 -21
- package/dist/references.js.map +1 -1
- package/dist/selection.d.ts +2 -0
- package/dist/selection.js +36 -0
- package/dist/selection.js.map +1 -0
- package/dist/selection.test.d.ts +1 -0
- package/dist/selection.test.js +10 -0
- package/dist/selection.test.js.map +1 -0
- package/dist/semantic.d.ts +5 -3
- package/dist/semantic.js +45 -4
- package/dist/semantic.js.map +1 -1
- package/dist/semantic.test.js +11 -0
- package/dist/semantic.test.js.map +1 -1
- package/dist/server-capabilities.test.d.ts +1 -0
- package/dist/server-capabilities.test.js +84 -0
- package/dist/server-capabilities.test.js.map +1 -0
- package/dist/server.js +353 -24
- package/dist/server.js.map +1 -1
- package/dist/settings.d.ts +11 -0
- package/dist/settings.js +50 -0
- package/dist/settings.js.map +1 -0
- package/dist/settings.test.d.ts +1 -0
- package/dist/settings.test.js +22 -0
- package/dist/settings.test.js.map +1 -0
- package/dist/spec-0-1-4-constructs.test.d.ts +1 -0
- package/dist/spec-0-1-4-constructs.test.js +101 -0
- package/dist/spec-0-1-4-constructs.test.js.map +1 -0
- package/dist/table-diagnostics.d.ts +3 -0
- package/dist/table-diagnostics.js +60 -0
- package/dist/table-diagnostics.js.map +1 -0
- package/dist/table-diagnostics.test.d.ts +1 -0
- package/dist/table-diagnostics.test.js +12 -0
- package/dist/table-diagnostics.test.js.map +1 -0
- package/dist/versioned-cache.d.ts +8 -0
- package/dist/versioned-cache.js +17 -0
- package/dist/versioned-cache.js.map +1 -0
- package/dist/versioned-cache.test.d.ts +1 -0
- package/dist/versioned-cache.test.js +13 -0
- package/dist/versioned-cache.test.js.map +1 -0
- package/dist/workspace-graph.d.ts +25 -0
- package/dist/workspace-graph.js +94 -0
- package/dist/workspace-graph.js.map +1 -0
- package/dist/workspace-graph.test.d.ts +1 -0
- package/dist/workspace-graph.test.js +31 -0
- package/dist/workspace-graph.test.js.map +1 -0
- package/dist/workspace-index.d.ts +40 -0
- package/dist/workspace-index.js +254 -0
- package/dist/workspace-index.js.map +1 -0
- package/dist/workspace-index.test.d.ts +1 -0
- package/dist/workspace-index.test.js +65 -0
- package/dist/workspace-index.test.js.map +1 -0
- package/dist/workspace-loader.d.ts +11 -0
- package/dist/workspace-loader.js +50 -0
- package/dist/workspace-loader.js.map +1 -0
- package/dist/workspace-loader.test.d.ts +1 -0
- package/dist/workspace-loader.test.js +19 -0
- package/dist/workspace-loader.test.js.map +1 -0
- package/package.json +4 -3
package/dist/folding.test.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import assert from 'node:assert/strict';
|
|
2
2
|
import test from 'node:test';
|
|
3
|
-
import { foldingRanges } from './folding.js';
|
|
3
|
+
import { foldingRanges, lexicalFolds } from './folding.js';
|
|
4
4
|
const src = '# A\n\ntext\n\n## B\n\nmore\n\n```js\none\ntwo\n```\n';
|
|
5
5
|
test('folds the section under a top-level heading', () => {
|
|
6
6
|
const ranges = foldingRanges(src);
|
|
@@ -17,4 +17,9 @@ test('folds a multi-line fenced code block', () => {
|
|
|
17
17
|
test('returns nothing for an empty document', () => {
|
|
18
18
|
assert.deepEqual(foldingRanges(''), []);
|
|
19
19
|
});
|
|
20
|
+
test('lexical fallback preserves section and fence folds after analysis failure', () => {
|
|
21
|
+
const ranges = lexicalFolds('# One\n\n::: note\nbody\n:::\n\n## Two\ntext\n');
|
|
22
|
+
assert.ok(ranges.some((range) => range.startLine === 0 && range.endLine >= 7));
|
|
23
|
+
assert.ok(ranges.some((range) => range.startLine === 2 && range.endLine === 4));
|
|
24
|
+
});
|
|
20
25
|
//# sourceMappingURL=folding.test.js.map
|
package/dist/folding.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"folding.test.js","sourceRoot":"","sources":["../src/folding.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"folding.test.js","sourceRoot":"","sources":["../src/folding.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE1D,MAAM,GAAG,GAAG,uDAAuD,CAAA;AAEnE,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;IACvD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;IACjC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAA;AACxF,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACrC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;IACjC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAA;AACrE,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;IAChD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;IACjC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAA;AACzF,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACjD,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;AACzC,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,2EAA2E,EAAE,GAAG,EAAE;IACrF,MAAM,MAAM,GAAG,YAAY,CAAC,gDAAgD,CAAC,CAAA;IAC7E,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAA;IAC9E,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAA;AACjF,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { readdirSync, readFileSync } from 'node:fs';
|
|
3
|
+
import test from 'node:test';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { carveToHtml } from '@markup-carve/carve';
|
|
6
|
+
import { formatDocument } from './format.js';
|
|
7
|
+
const corpusDir = fileURLToPath(new URL('../tests/spec/tests/corpus/', import.meta.url));
|
|
8
|
+
test('formatting preserves rendered HTML for every corpus document', () => {
|
|
9
|
+
const documents = readdirSync(corpusDir).filter((name) => name.endsWith('.crv')).sort();
|
|
10
|
+
assert.ok(documents.length > 0, 'the formatter gate found no corpus documents');
|
|
11
|
+
for (const name of documents) {
|
|
12
|
+
const source = readFileSync(`${corpusDir}/${name}`, 'utf8');
|
|
13
|
+
assert.equal(carveToHtml(formatDocument(source)), carveToHtml(source), name);
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=format-corpus.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-corpus.test.js","sourceRoot":"","sources":["../src/format-corpus.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACnD,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,6BAA6B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAExF,IAAI,CAAC,8DAA8D,EAAE,GAAG,EAAE;IACxE,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACvF,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,8CAA8C,CAAC,CAAA;IAE/E,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,SAAS,IAAI,IAAI,EAAE,EAAE,MAAM,CAAC,CAAA;QAC3D,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAA;IAC9E,CAAC;AACH,CAAC,CAAC,CAAA"}
|
package/dist/format.d.ts
CHANGED
|
@@ -1 +1,4 @@
|
|
|
1
1
|
export declare function formatDocument(source: string): string;
|
|
2
|
+
export declare function formatRange(source: string, startLine: number, endLine: number): string;
|
|
3
|
+
/** Prefix inserted after Enter for container-shaped lines. */
|
|
4
|
+
export declare function continuationPrefix(source: string, line: number): string;
|
package/dist/format.js
CHANGED
|
@@ -1,83 +1,47 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* Conservative Carve formatter.
|
|
3
3
|
*
|
|
4
|
-
* Carve
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* - trim leading/trailing blank lines
|
|
10
|
-
* - end the file with exactly one newline
|
|
11
|
-
*
|
|
12
|
-
* Verbatim block interiors are emitted byte-for-byte (only the file-final
|
|
13
|
-
* newline is enforced), so code, raw HTML, and comments are never altered.
|
|
4
|
+
* Carve source does not have a canonical serializer, and whitespace that looks
|
|
5
|
+
* cosmetic can be structural: a second blank line detaches captions, trailing
|
|
6
|
+
* blank lines can belong to an unclosed fence, and trailing spaces are content
|
|
7
|
+
* in line blocks. Preserve every source byte except for adding a missing final
|
|
8
|
+
* line ending, which is render-equivalent and keeps the formatter idempotent.
|
|
14
9
|
*/
|
|
15
10
|
export function formatDocument(source) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
let openFence = null;
|
|
20
|
-
let blankRun = 0;
|
|
21
|
-
for (const raw of lines) {
|
|
22
|
-
if (openFence !== null) {
|
|
23
|
-
out.push(raw);
|
|
24
|
-
if (closesFence(raw, openFence))
|
|
25
|
-
openFence = null;
|
|
26
|
-
blankRun = 0;
|
|
27
|
-
continue;
|
|
28
|
-
}
|
|
29
|
-
const opener = fenceOpener(raw);
|
|
30
|
-
if (opener) {
|
|
31
|
-
openFence = opener;
|
|
32
|
-
out.push(raw.replace(/[ \t]+$/, ''));
|
|
33
|
-
blankRun = 0;
|
|
34
|
-
continue;
|
|
35
|
-
}
|
|
36
|
-
const trimmed = raw.replace(/[ \t]+$/, '');
|
|
37
|
-
if (trimmed === '') {
|
|
38
|
-
blankRun++;
|
|
39
|
-
if (blankRun === 1)
|
|
40
|
-
out.push('');
|
|
41
|
-
continue;
|
|
42
|
-
}
|
|
43
|
-
blankRun = 0;
|
|
44
|
-
out.push(trimmed);
|
|
45
|
-
}
|
|
46
|
-
while (out.length && out[0] === '')
|
|
47
|
-
out.shift();
|
|
48
|
-
while (out.length && out[out.length - 1] === '')
|
|
49
|
-
out.pop();
|
|
50
|
-
return out.length ? out.join(eol) + eol : '';
|
|
11
|
+
if (source === '' || source.endsWith('\n'))
|
|
12
|
+
return source;
|
|
13
|
+
return source + (source.includes('\r\n') ? '\r\n' : '\n');
|
|
51
14
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
* fence (`%%%`) must stand alone (no info), matching the parser.
|
|
56
|
-
*/
|
|
57
|
-
function fenceOpener(line) {
|
|
58
|
-
const match = /^( {0,3})(`{3,}|~{3,}|%{3,})(.*)$/.exec(line);
|
|
59
|
-
if (!match)
|
|
60
|
-
return null;
|
|
61
|
-
const marker = match[2];
|
|
62
|
-
const info = match[3];
|
|
63
|
-
if (marker[0] === '`' && info.includes('`'))
|
|
64
|
-
return null;
|
|
65
|
-
if (marker[0] === '%' && info.trim() !== '')
|
|
66
|
-
return null;
|
|
67
|
-
return marker;
|
|
15
|
+
export function formatRange(source, startLine, endLine) {
|
|
16
|
+
const eol = source.includes('\r\n') ? '\r\n' : '\n';
|
|
17
|
+
return source.split(/\r?\n/).slice(startLine, endLine + 1).join(eol);
|
|
68
18
|
}
|
|
69
|
-
/**
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
const
|
|
76
|
-
if (
|
|
77
|
-
return
|
|
78
|
-
const
|
|
79
|
-
if (
|
|
80
|
-
return
|
|
81
|
-
|
|
19
|
+
/** Prefix inserted after Enter for container-shaped lines. */
|
|
20
|
+
export function continuationPrefix(source, line) {
|
|
21
|
+
const previous = source.split(/\r?\n/)[line - 1] ?? '';
|
|
22
|
+
const container = /^(\s*)(:{3,}) [^\s].*$/.exec(previous);
|
|
23
|
+
if (container)
|
|
24
|
+
return `\n${container[1]}${container[2]}`;
|
|
25
|
+
const quote = /^(\s*(?:> )+)/.exec(previous);
|
|
26
|
+
if (quote)
|
|
27
|
+
return quote[1];
|
|
28
|
+
const table = /^(\s*)\|/.exec(previous);
|
|
29
|
+
if (table)
|
|
30
|
+
return `${table[1]}| `;
|
|
31
|
+
// A description marker is a colon, a run of SPACES, then something. PART 2
|
|
32
|
+
// (MARKER REQUIRES CONTENT, carve#1830, corpus 439) makes a colon followed by
|
|
33
|
+
// only whitespace a paragraph, so there is no description to continue - and a
|
|
34
|
+
// tab separator is not a marker either. The separator run sets the body's
|
|
35
|
+
// content column (corpus 424), so the continuation is as wide as it is rather
|
|
36
|
+
// than always two.
|
|
37
|
+
//
|
|
38
|
+
// The lookahead asks whether the REST OF THE LINE is blank, not whether the
|
|
39
|
+
// next character is non-blank, on purpose: `: ` followed by a tab is the case
|
|
40
|
+
// carve#1836 rules and every engine is still wrong about, so this decides it
|
|
41
|
+
// neither way and keeps the answer it already gave.
|
|
42
|
+
const definition = /^([ \t]*)(: +)(?![ \t]*$)/.exec(previous);
|
|
43
|
+
if (definition)
|
|
44
|
+
return definition[1] + ' '.repeat(definition[2].length);
|
|
45
|
+
return '';
|
|
82
46
|
}
|
|
83
47
|
//# sourceMappingURL=format.js.map
|
package/dist/format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,IAAI,MAAM,KAAK,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAA;IACzD,OAAO,MAAM,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AAC3D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,SAAiB,EAAE,OAAe;IAC5E,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;IACnD,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACtE,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,IAAY;IAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;IACtD,MAAM,SAAS,GAAG,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACzD,IAAI,SAAS;QAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAA;IACxD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC5C,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,CAAE,CAAA;IAC3B,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACvC,IAAI,KAAK;QAAE,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;IACjC,2EAA2E;IAC3E,8EAA8E;IAC9E,8EAA8E;IAC9E,0EAA0E;IAC1E,8EAA8E;IAC9E,mBAAmB;IACnB,EAAE;IACF,4EAA4E;IAC5E,8EAA8E;IAC9E,6EAA6E;IAC7E,oDAAoD;IACpD,MAAM,UAAU,GAAG,2BAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC7D,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC,CAAC,CAAE,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,CAAA;IACzE,OAAO,EAAE,CAAA;AACX,CAAC"}
|
package/dist/format.test.js
CHANGED
|
@@ -1,46 +1,41 @@
|
|
|
1
1
|
import assert from 'node:assert/strict';
|
|
2
2
|
import test from 'node:test';
|
|
3
|
-
import { formatDocument } from './format.js';
|
|
4
|
-
test('
|
|
5
|
-
assert.equal(formatDocument('# Title
|
|
3
|
+
import { continuationPrefix, formatDocument, formatRange } from './format.js';
|
|
4
|
+
test('adds a missing final line ending', () => {
|
|
5
|
+
assert.equal(formatDocument('# Title'), '# Title\n');
|
|
6
|
+
assert.equal(formatDocument('# Title\r\nbody'), '# Title\r\nbody\r\n');
|
|
6
7
|
});
|
|
7
|
-
test('
|
|
8
|
-
assert.equal(formatDocument('
|
|
8
|
+
test('preserves an empty document and existing final line endings', () => {
|
|
9
|
+
assert.equal(formatDocument(''), '');
|
|
10
|
+
assert.equal(formatDocument('# Title\n'), '# Title\n');
|
|
11
|
+
assert.equal(formatDocument('# Title\r\n'), '# Title\r\n');
|
|
9
12
|
});
|
|
10
|
-
test('
|
|
11
|
-
|
|
13
|
+
test('preserves a blank-line run that detaches a caption', () => {
|
|
14
|
+
const source = '|= City |= People |\n| Oslo | 700k |\n\n\n^ Table: city sizes\n';
|
|
15
|
+
assert.equal(formatDocument(source), source);
|
|
12
16
|
});
|
|
13
|
-
test('preserves
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
assert.equal(formatDocument(src), src);
|
|
17
|
+
test('preserves a trailing blank line inside an unclosed fence', () => {
|
|
18
|
+
const source = '```\nx\n\n';
|
|
19
|
+
assert.equal(formatDocument(source), source);
|
|
17
20
|
});
|
|
18
|
-
test('
|
|
19
|
-
const
|
|
20
|
-
assert.equal(formatDocument(
|
|
21
|
+
test('preserves trailing spaces in a line block', () => {
|
|
22
|
+
const source = '::: |\nabc \ndef \n:::\n';
|
|
23
|
+
assert.equal(formatDocument(source), source);
|
|
21
24
|
});
|
|
22
|
-
test('
|
|
23
|
-
|
|
24
|
-
assert.equal(formatDocument(src), src);
|
|
25
|
+
test('range formatting preserves structural whitespace', () => {
|
|
26
|
+
assert.equal(formatRange('a \n\n\nb \n', 0, 3), 'a \n\n\nb ');
|
|
25
27
|
});
|
|
26
|
-
test('
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
// prose after the block is normalized.
|
|
30
|
-
assert.equal(formatDocument(src), '```\ncode\n ```\n```\n\ntail\n');
|
|
28
|
+
test('continues structural prefixes', () => {
|
|
29
|
+
assert.equal(continuationPrefix('> q\n', 1), '> ');
|
|
30
|
+
assert.equal(continuationPrefix('| a |\n', 1), '| ');
|
|
31
31
|
});
|
|
32
|
-
test('
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
assert.equal(
|
|
36
|
-
});
|
|
37
|
-
test('a backtick line with inline backticks is not a fence', () => {
|
|
38
|
-
// Not a real opener, so trailing whitespace after it is still trimmed.
|
|
39
|
-
const src = '``` not `a` fence \nbody \n';
|
|
40
|
-
assert.equal(formatDocument(src), '``` not `a` fence\nbody\n');
|
|
32
|
+
test('inserts an exact closer after a typed colon-fence opener', () => {
|
|
33
|
+
assert.equal(continuationPrefix(':::: warning\n', 1), '\n::::');
|
|
34
|
+
assert.equal(continuationPrefix(' ::: note\n', 1), '\n :::');
|
|
35
|
+
assert.equal(continuationPrefix(':::\n', 1), '');
|
|
41
36
|
});
|
|
42
37
|
test('is idempotent', () => {
|
|
43
|
-
const once = formatDocument('# T
|
|
38
|
+
const once = formatDocument('# T');
|
|
44
39
|
assert.equal(formatDocument(once), once);
|
|
45
40
|
});
|
|
46
41
|
//# sourceMappingURL=format.test.js.map
|
package/dist/format.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.test.js","sourceRoot":"","sources":["../src/format.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"format.test.js","sourceRoot":"","sources":["../src/format.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE7E,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAC5C,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAA;IACpD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,qBAAqB,CAAC,CAAA;AACxE,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,6DAA6D,EAAE,GAAG,EAAE;IACvE,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IACpC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAA;IACtD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC,CAAA;AAC5D,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAC9D,MAAM,MAAM,GAAG,oEAAoE,CAAA;IACnF,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAA;AAC9C,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;IACpE,MAAM,MAAM,GAAG,YAAY,CAAA;IAC3B,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAA;AAC9C,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACrD,MAAM,MAAM,GAAG,2BAA2B,CAAA;IAC1C,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAA;AAC9C,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAC5D,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;AACjE,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE;IACzC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IAClD,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;AACtD,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;IACpE,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IAC/D,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;IAC9D,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AAClD,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE;IACzB,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;IAClC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;AAC1C,CAAC,CAAC,CAAA"}
|
package/dist/hover.js
CHANGED
|
@@ -1,7 +1,25 @@
|
|
|
1
1
|
import { MarkupKind } from 'vscode-languageserver/node.js';
|
|
2
2
|
import { parse, resolve, } from '@markup-carve/carve';
|
|
3
3
|
import { astColumnToCharacter, characterToAstColumn, sourceLines } from './position.js';
|
|
4
|
+
import { captionTargetById } from './captions.js';
|
|
5
|
+
import { colonFenceHover } from './colon-fences.js';
|
|
4
6
|
const rules = [
|
|
7
|
+
{
|
|
8
|
+
pattern: /\|=?\s*[<>~^v]{1,2}(?=\{| )/g,
|
|
9
|
+
contents: '**Table alignment**\n\nA one- or two-character run sets horizontal and/or vertical cell alignment. Two-axis runs normalize to horizontal then vertical.',
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
pattern: /\b(?:aligns|valigns|widths|header-rows|header-cols|footer-rows)=/g,
|
|
13
|
+
contents: '**Table metadata**\n\nA positional table/ListTable field. Empty list entries leave that column unset; cell-local values win.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
pattern: /\[@[^\]\n]+\]/g,
|
|
17
|
+
contents: '**Citation**\n\nCitation groups reference `[@key]: ...` bibliography entries when the Citations extension is enabled.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
pattern: /\{\{[^}\n]+\}\}/g,
|
|
21
|
+
contents: '**Include**\n\nProcessor-level file inclusion. The language server resolves it only in a trusted, explicitly enabled workspace.',
|
|
22
|
+
},
|
|
5
23
|
{
|
|
6
24
|
pattern: /#{1,6}/g,
|
|
7
25
|
contents: '**Heading**\n\n`#` through `######` create section headings.',
|
|
@@ -40,6 +58,9 @@ const rules = [
|
|
|
40
58
|
},
|
|
41
59
|
];
|
|
42
60
|
export function hoverAt(source, position) {
|
|
61
|
+
const fence = colonFenceHover(source, position);
|
|
62
|
+
if (fence)
|
|
63
|
+
return fence;
|
|
43
64
|
const lines = sourceLines(source);
|
|
44
65
|
try {
|
|
45
66
|
const hover = astHoverAt(resolve(parse(source)), position, lines);
|
|
@@ -82,8 +103,12 @@ function astHoverAt(doc, position, lines) {
|
|
|
82
103
|
character: characterToAstColumn(lines[position.line] ?? '', position.character) - 1,
|
|
83
104
|
};
|
|
84
105
|
const matches = [];
|
|
106
|
+
// A crossref's help depends on what the id NAMES, so the whole document is in
|
|
107
|
+
// scope for it while every other rule reads one node. It is looked up through
|
|
108
|
+
// this resolver rather than from inside the inline walk.
|
|
109
|
+
const resolveRef = (id) => captionTargetById(doc, id);
|
|
85
110
|
for (const node of doc.children)
|
|
86
|
-
collectBlock(matches, node, cursor);
|
|
111
|
+
collectBlock(matches, node, cursor, resolveRef);
|
|
87
112
|
matches.sort((a, b) => spanSize(a.pos) - spanSize(b.pos));
|
|
88
113
|
const match = matches[0];
|
|
89
114
|
if (!match)
|
|
@@ -96,53 +121,58 @@ function astHoverAt(doc, position, lines) {
|
|
|
96
121
|
range: toRange(match.pos, lines),
|
|
97
122
|
};
|
|
98
123
|
}
|
|
99
|
-
function collectBlock(matches, node, position) {
|
|
124
|
+
function collectBlock(matches, node, position, resolveRef) {
|
|
100
125
|
addMatch(matches, node.pos, position, blockContents(node));
|
|
101
126
|
switch (node.type) {
|
|
102
127
|
case 'heading':
|
|
103
|
-
collectInline(matches, node.children, position);
|
|
128
|
+
collectInline(matches, node.children, position, resolveRef);
|
|
104
129
|
break;
|
|
105
130
|
case 'paragraph':
|
|
106
|
-
collectInline(matches, node.children, position);
|
|
131
|
+
collectInline(matches, node.children, position, resolveRef);
|
|
107
132
|
break;
|
|
108
133
|
case 'block_quote':
|
|
109
|
-
node.children.forEach((child) => collectBlock(matches, child, position));
|
|
134
|
+
node.children.forEach((child) => collectBlock(matches, child, position, resolveRef));
|
|
110
135
|
break;
|
|
111
136
|
case 'list':
|
|
112
|
-
node.items.forEach((item) => item.children.forEach((child) => collectBlock(matches, child, position)));
|
|
137
|
+
node.items.forEach((item) => item.children.forEach((child) => collectBlock(matches, child, position, resolveRef)));
|
|
113
138
|
break;
|
|
114
139
|
case 'admonition':
|
|
115
140
|
case 'div':
|
|
116
|
-
node.children.forEach((child) => collectBlock(matches, child, position));
|
|
141
|
+
node.children.forEach((child) => collectBlock(matches, child, position, resolveRef));
|
|
117
142
|
if (node.type === 'admonition' && node.title)
|
|
118
|
-
collectInline(matches, node.title, position);
|
|
143
|
+
collectInline(matches, node.title, position, resolveRef);
|
|
119
144
|
break;
|
|
120
145
|
case 'definition_list':
|
|
121
146
|
node.items.forEach((item) => {
|
|
122
|
-
item.terms.forEach((term) => collectInline(matches, term, position));
|
|
123
|
-
item.definitions.forEach((definition) => definition.forEach((child) => collectBlock(matches, child, position)));
|
|
147
|
+
item.terms.forEach((term) => collectInline(matches, term, position, resolveRef));
|
|
148
|
+
item.definitions.forEach((definition) => definition.forEach((child) => collectBlock(matches, child, position, resolveRef)));
|
|
124
149
|
});
|
|
125
150
|
break;
|
|
126
151
|
case 'figure':
|
|
127
|
-
collectBlock(matches, node.target, position);
|
|
128
|
-
collectInline(matches, node.caption, position);
|
|
152
|
+
collectBlock(matches, node.target, position, resolveRef);
|
|
153
|
+
collectInline(matches, node.caption, position, resolveRef);
|
|
154
|
+
break;
|
|
155
|
+
case 'figure_group':
|
|
156
|
+
node.children.forEach((child) => collectBlock(matches, child, position, resolveRef));
|
|
157
|
+
if (node.caption)
|
|
158
|
+
collectInline(matches, node.caption, position, resolveRef);
|
|
129
159
|
break;
|
|
130
160
|
case 'table':
|
|
131
161
|
if (node.caption)
|
|
132
|
-
collectInline(matches, node.caption, position);
|
|
133
|
-
node.rows.forEach((row) => row.cells.forEach((cell) => collectInline(matches, cell.children, position)));
|
|
162
|
+
collectInline(matches, node.caption, position, resolveRef);
|
|
163
|
+
node.rows.forEach((row) => row.cells.forEach((cell) => collectInline(matches, cell.children, position, resolveRef)));
|
|
134
164
|
break;
|
|
135
165
|
}
|
|
136
166
|
}
|
|
137
|
-
function collectInline(matches, nodes, position) {
|
|
167
|
+
function collectInline(matches, nodes, position, resolveRef) {
|
|
138
168
|
for (const node of nodes) {
|
|
139
|
-
addMatch(matches, node.pos, position, inlineContents(node));
|
|
169
|
+
addMatch(matches, node.pos, position, inlineContents(node, resolveRef));
|
|
140
170
|
const children = node.children;
|
|
141
171
|
if (Array.isArray(children))
|
|
142
|
-
collectInline(matches, children, position);
|
|
172
|
+
collectInline(matches, children, position, resolveRef);
|
|
143
173
|
const content = node.content;
|
|
144
174
|
if (Array.isArray(content))
|
|
145
|
-
collectInline(matches, content, position);
|
|
175
|
+
collectInline(matches, content, position, resolveRef);
|
|
146
176
|
}
|
|
147
177
|
}
|
|
148
178
|
function addMatch(matches, pos, position, contents) {
|
|
@@ -168,11 +198,15 @@ function blockContents(node) {
|
|
|
168
198
|
return '**Admonition**\n\nTyped `:::` fences create admonition blocks.';
|
|
169
199
|
case 'div':
|
|
170
200
|
return '**Div**\n\nBare `:::` fences create generic container blocks.';
|
|
201
|
+
case 'figure_group':
|
|
202
|
+
return ('**Composite Figure**\n\nA bare `::: figure` fence is one figure of ordered panels. ' +
|
|
203
|
+
'The `^ ` line after the closing fence captions the whole group. ' +
|
|
204
|
+
'An opener carrying a title or a `[label]` stays a generic container instead.');
|
|
171
205
|
default:
|
|
172
206
|
return null;
|
|
173
207
|
}
|
|
174
208
|
}
|
|
175
|
-
function inlineContents(node) {
|
|
209
|
+
function inlineContents(node, resolveRef) {
|
|
176
210
|
switch (node.type) {
|
|
177
211
|
case 'strong':
|
|
178
212
|
return '**Bold**\n\nCarve uses single asterisks for bold text: `*bold*`.';
|
|
@@ -202,10 +236,35 @@ function inlineContents(node) {
|
|
|
202
236
|
return '**Tag**\n\nTags use `#name`.';
|
|
203
237
|
case 'span':
|
|
204
238
|
return '**Span**\n\nInline spans use `[text]{attrs}`.';
|
|
239
|
+
case 'heading_ref':
|
|
240
|
+
return crossrefContents(node, resolveRef);
|
|
205
241
|
default:
|
|
206
242
|
return null;
|
|
207
243
|
}
|
|
208
244
|
}
|
|
245
|
+
/**
|
|
246
|
+
* A `</#id>` used to fall through this switch entirely, so the LEXICAL rules
|
|
247
|
+
* above took it and reported the `#` inside the reference as a heading marker.
|
|
248
|
+
* It now says what the reference resolves to, which for a composite figure's
|
|
249
|
+
* panel is the group's number plus its letter (PART 9 §4c).
|
|
250
|
+
*
|
|
251
|
+
* A heading target keeps the generic wording: the heading's own text is what
|
|
252
|
+
* the reference renders, and it is already on screen.
|
|
253
|
+
*/
|
|
254
|
+
function crossrefContents(node, resolveRef) {
|
|
255
|
+
const generic = '**Cross-reference**\n\nA `</#id>` reference links to the heading or captioned host carrying that id.';
|
|
256
|
+
const id = node.target;
|
|
257
|
+
if (typeof id !== 'string')
|
|
258
|
+
return generic;
|
|
259
|
+
const target = resolveRef(id);
|
|
260
|
+
if (!target)
|
|
261
|
+
return generic;
|
|
262
|
+
if (target.text === null) {
|
|
263
|
+
return ('**Cross-reference**\n\nAn unnumbered ' + target.kind + '. It is an anchor, but it drew no ' +
|
|
264
|
+
'number, so this reference has no caption text to render.');
|
|
265
|
+
}
|
|
266
|
+
return '**Cross-reference**\n\nResolves to **' + target.text + '** (' + target.kind + ').';
|
|
267
|
+
}
|
|
209
268
|
function contains(pos, position) {
|
|
210
269
|
if (pos.startColumn === undefined ||
|
|
211
270
|
pos.endColumn === undefined ||
|
package/dist/hover.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hover.js","sourceRoot":"","sources":["../src/hover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA6B,MAAM,+BAA+B,CAAA;AACrF,OAAO,EACL,KAAK,EACL,OAAO,GAKR,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"hover.js","sourceRoot":"","sources":["../src/hover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface CachedInclude {
|
|
2
|
+
source: string;
|
|
3
|
+
bytes: number;
|
|
4
|
+
}
|
|
5
|
+
/** Bounded LRU cache for include source, validated by file metadata. */
|
|
6
|
+
export declare class IncludeSourceCache {
|
|
7
|
+
#private;
|
|
8
|
+
readonly maxEntries: number;
|
|
9
|
+
constructor(maxEntries?: number);
|
|
10
|
+
get(id: string, mtimeMs: number, size: number): CachedInclude | undefined;
|
|
11
|
+
set(id: string, mtimeMs: number, size: number, value: CachedInclude): void;
|
|
12
|
+
invalidate(id: string): void;
|
|
13
|
+
clear(): void;
|
|
14
|
+
get size(): number;
|
|
15
|
+
}
|
|
16
|
+
/** Bounded LRU cache for parsed child documents. */
|
|
17
|
+
export declare class IncludeParseCache {
|
|
18
|
+
#private;
|
|
19
|
+
readonly maxEntries: number;
|
|
20
|
+
constructor(maxEntries?: number);
|
|
21
|
+
get(id: string, version: string): Document | undefined;
|
|
22
|
+
set(id: string, version: string, document: Document): void;
|
|
23
|
+
invalidate(id: string): void;
|
|
24
|
+
clear(): void;
|
|
25
|
+
}
|
|
26
|
+
import type { Document } from '@markup-carve/carve';
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/** Bounded LRU cache for include source, validated by file metadata. */
|
|
2
|
+
export class IncludeSourceCache {
|
|
3
|
+
maxEntries;
|
|
4
|
+
#entries = new Map();
|
|
5
|
+
constructor(maxEntries = 128) {
|
|
6
|
+
this.maxEntries = maxEntries;
|
|
7
|
+
}
|
|
8
|
+
get(id, mtimeMs, size) {
|
|
9
|
+
const entry = this.#entries.get(id);
|
|
10
|
+
if (!entry || entry.mtimeMs !== mtimeMs || entry.size !== size) {
|
|
11
|
+
if (entry)
|
|
12
|
+
this.#entries.delete(id);
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
this.#entries.delete(id);
|
|
16
|
+
this.#entries.set(id, entry);
|
|
17
|
+
return { source: entry.source, bytes: entry.bytes };
|
|
18
|
+
}
|
|
19
|
+
set(id, mtimeMs, size, value) {
|
|
20
|
+
this.#entries.delete(id);
|
|
21
|
+
this.#entries.set(id, { ...value, mtimeMs, size });
|
|
22
|
+
while (this.#entries.size > this.maxEntries) {
|
|
23
|
+
const oldest = this.#entries.keys().next().value;
|
|
24
|
+
if (oldest === undefined)
|
|
25
|
+
break;
|
|
26
|
+
this.#entries.delete(oldest);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
invalidate(id) {
|
|
30
|
+
this.#entries.delete(id);
|
|
31
|
+
}
|
|
32
|
+
clear() {
|
|
33
|
+
this.#entries.clear();
|
|
34
|
+
}
|
|
35
|
+
get size() {
|
|
36
|
+
return this.#entries.size;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** Bounded LRU cache for parsed child documents. */
|
|
40
|
+
export class IncludeParseCache {
|
|
41
|
+
maxEntries;
|
|
42
|
+
#entries = new Map();
|
|
43
|
+
constructor(maxEntries = 128) {
|
|
44
|
+
this.maxEntries = maxEntries;
|
|
45
|
+
}
|
|
46
|
+
get(id, version) {
|
|
47
|
+
const entry = this.#entries.get(id);
|
|
48
|
+
if (!entry || entry.version !== version) {
|
|
49
|
+
if (entry)
|
|
50
|
+
this.#entries.delete(id);
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
this.#entries.delete(id);
|
|
54
|
+
this.#entries.set(id, entry);
|
|
55
|
+
return entry.document;
|
|
56
|
+
}
|
|
57
|
+
set(id, version, document) {
|
|
58
|
+
this.#entries.delete(id);
|
|
59
|
+
this.#entries.set(id, { version, document });
|
|
60
|
+
while (this.#entries.size > this.maxEntries) {
|
|
61
|
+
const oldest = this.#entries.keys().next().value;
|
|
62
|
+
if (oldest === undefined)
|
|
63
|
+
break;
|
|
64
|
+
this.#entries.delete(oldest);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
invalidate(id) {
|
|
68
|
+
this.#entries.delete(id);
|
|
69
|
+
}
|
|
70
|
+
clear() {
|
|
71
|
+
this.#entries.clear();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=include-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"include-cache.js","sourceRoot":"","sources":["../src/include-cache.ts"],"names":[],"mappings":"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"}
|