@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.
Files changed (176) hide show
  1. package/README.md +61 -14
  2. package/dist/analyze.d.ts +15 -1
  3. package/dist/analyze.js +214 -16
  4. package/dist/analyze.js.map +1 -1
  5. package/dist/analyze.test.js +29 -1
  6. package/dist/analyze.test.js.map +1 -1
  7. package/dist/captions.d.ts +49 -0
  8. package/dist/captions.js +124 -0
  9. package/dist/captions.js.map +1 -0
  10. package/dist/codelens.js +12 -0
  11. package/dist/codelens.js.map +1 -1
  12. package/dist/codelens.test.js +5 -0
  13. package/dist/codelens.test.js.map +1 -1
  14. package/dist/colon-fence-kinds.test.d.ts +1 -0
  15. package/dist/colon-fence-kinds.test.js +128 -0
  16. package/dist/colon-fence-kinds.test.js.map +1 -0
  17. package/dist/colon-fences.d.ts +24 -0
  18. package/dist/colon-fences.js +174 -0
  19. package/dist/colon-fences.js.map +1 -0
  20. package/dist/colon-fences.test.d.ts +1 -0
  21. package/dist/colon-fences.test.js +23 -0
  22. package/dist/colon-fences.test.js.map +1 -0
  23. package/dist/completion.d.ts +6 -2
  24. package/dist/completion.js +84 -8
  25. package/dist/completion.js.map +1 -1
  26. package/dist/completion.test.js +7 -0
  27. package/dist/completion.test.js.map +1 -1
  28. package/dist/composite-figure-crossref.test.d.ts +1 -0
  29. package/dist/composite-figure-crossref.test.js +265 -0
  30. package/dist/composite-figure-crossref.test.js.map +1 -0
  31. package/dist/composite-figure.test.d.ts +1 -0
  32. package/dist/composite-figure.test.js +76 -0
  33. package/dist/composite-figure.test.js.map +1 -0
  34. package/dist/definition.d.ts +4 -2
  35. package/dist/definition.js +28 -5
  36. package/dist/definition.js.map +1 -1
  37. package/dist/dependencies.d.ts +15 -0
  38. package/dist/dependencies.js +59 -0
  39. package/dist/dependencies.js.map +1 -0
  40. package/dist/diagnostic-scheduler.d.ts +58 -0
  41. package/dist/diagnostic-scheduler.js +70 -0
  42. package/dist/diagnostic-scheduler.js.map +1 -0
  43. package/dist/diagnostic-scheduler.test.d.ts +1 -0
  44. package/dist/diagnostic-scheduler.test.js +75 -0
  45. package/dist/diagnostic-scheduler.test.js.map +1 -0
  46. package/dist/document-highlights.d.ts +2 -0
  47. package/dist/document-highlights.js +21 -0
  48. package/dist/document-highlights.js.map +1 -0
  49. package/dist/document-highlights.test.d.ts +1 -0
  50. package/dist/document-highlights.test.js +13 -0
  51. package/dist/document-highlights.test.js.map +1 -0
  52. package/dist/document-links.d.ts +3 -0
  53. package/dist/document-links.js +36 -0
  54. package/dist/document-links.js.map +1 -0
  55. package/dist/document-links.test.d.ts +1 -0
  56. package/dist/document-links.test.js +12 -0
  57. package/dist/document-links.test.js.map +1 -0
  58. package/dist/folding.d.ts +1 -0
  59. package/dist/folding.js +36 -1
  60. package/dist/folding.js.map +1 -1
  61. package/dist/folding.test.js +6 -1
  62. package/dist/folding.test.js.map +1 -1
  63. package/dist/format-corpus.test.d.ts +1 -0
  64. package/dist/format-corpus.test.js +16 -0
  65. package/dist/format-corpus.test.js.map +1 -0
  66. package/dist/format.d.ts +3 -0
  67. package/dist/format.js +38 -74
  68. package/dist/format.js.map +1 -1
  69. package/dist/format.test.js +27 -32
  70. package/dist/format.test.js.map +1 -1
  71. package/dist/hover.js +78 -19
  72. package/dist/hover.js.map +1 -1
  73. package/dist/include-cache.d.ts +26 -0
  74. package/dist/include-cache.js +74 -0
  75. package/dist/include-cache.js.map +1 -0
  76. package/dist/include-completion.d.ts +3 -0
  77. package/dist/include-completion.js +68 -0
  78. package/dist/include-completion.js.map +1 -0
  79. package/dist/include-completion.test.d.ts +1 -0
  80. package/dist/include-completion.test.js +15 -0
  81. package/dist/include-completion.test.js.map +1 -0
  82. package/dist/include-definition-denial.test.d.ts +1 -0
  83. package/dist/include-definition-denial.test.js +86 -0
  84. package/dist/include-definition-denial.test.js.map +1 -0
  85. package/dist/include-definition.d.ts +3 -0
  86. package/dist/include-definition.js +37 -0
  87. package/dist/include-definition.js.map +1 -0
  88. package/dist/include-features.test.d.ts +1 -0
  89. package/dist/include-features.test.js +133 -0
  90. package/dist/include-features.test.js.map +1 -0
  91. package/dist/include-path.d.ts +6 -0
  92. package/dist/include-path.js +31 -2
  93. package/dist/include-path.js.map +1 -1
  94. package/dist/include-settings.d.ts +2 -0
  95. package/dist/include-settings.js +1 -0
  96. package/dist/include-settings.js.map +1 -1
  97. package/dist/includes.d.ts +8 -0
  98. package/dist/includes.js +28 -7
  99. package/dist/includes.js.map +1 -1
  100. package/dist/inlay-hints.d.ts +3 -0
  101. package/dist/inlay-hints.js +43 -0
  102. package/dist/inlay-hints.js.map +1 -0
  103. package/dist/inlay-hints.test.d.ts +1 -0
  104. package/dist/inlay-hints.test.js +10 -0
  105. package/dist/inlay-hints.test.js.map +1 -0
  106. package/dist/lint-actions.d.ts +3 -0
  107. package/dist/lint-actions.js +90 -0
  108. package/dist/lint-actions.js.map +1 -0
  109. package/dist/lint-actions.test.d.ts +1 -0
  110. package/dist/lint-actions.test.js +31 -0
  111. package/dist/lint-actions.test.js.map +1 -0
  112. package/dist/no-git-dependencies.test.d.ts +1 -0
  113. package/dist/no-git-dependencies.test.js +243 -0
  114. package/dist/no-git-dependencies.test.js.map +1 -0
  115. package/dist/packaging.test.d.ts +1 -0
  116. package/dist/packaging.test.js +69 -0
  117. package/dist/packaging.test.js.map +1 -0
  118. package/dist/references.d.ts +2 -0
  119. package/dist/references.js +113 -21
  120. package/dist/references.js.map +1 -1
  121. package/dist/selection.d.ts +2 -0
  122. package/dist/selection.js +36 -0
  123. package/dist/selection.js.map +1 -0
  124. package/dist/selection.test.d.ts +1 -0
  125. package/dist/selection.test.js +10 -0
  126. package/dist/selection.test.js.map +1 -0
  127. package/dist/semantic.d.ts +5 -3
  128. package/dist/semantic.js +45 -4
  129. package/dist/semantic.js.map +1 -1
  130. package/dist/semantic.test.js +11 -0
  131. package/dist/semantic.test.js.map +1 -1
  132. package/dist/server-capabilities.test.d.ts +1 -0
  133. package/dist/server-capabilities.test.js +84 -0
  134. package/dist/server-capabilities.test.js.map +1 -0
  135. package/dist/server.js +353 -24
  136. package/dist/server.js.map +1 -1
  137. package/dist/settings.d.ts +11 -0
  138. package/dist/settings.js +50 -0
  139. package/dist/settings.js.map +1 -0
  140. package/dist/settings.test.d.ts +1 -0
  141. package/dist/settings.test.js +22 -0
  142. package/dist/settings.test.js.map +1 -0
  143. package/dist/spec-0-1-4-constructs.test.d.ts +1 -0
  144. package/dist/spec-0-1-4-constructs.test.js +101 -0
  145. package/dist/spec-0-1-4-constructs.test.js.map +1 -0
  146. package/dist/table-diagnostics.d.ts +3 -0
  147. package/dist/table-diagnostics.js +60 -0
  148. package/dist/table-diagnostics.js.map +1 -0
  149. package/dist/table-diagnostics.test.d.ts +1 -0
  150. package/dist/table-diagnostics.test.js +12 -0
  151. package/dist/table-diagnostics.test.js.map +1 -0
  152. package/dist/versioned-cache.d.ts +8 -0
  153. package/dist/versioned-cache.js +17 -0
  154. package/dist/versioned-cache.js.map +1 -0
  155. package/dist/versioned-cache.test.d.ts +1 -0
  156. package/dist/versioned-cache.test.js +13 -0
  157. package/dist/versioned-cache.test.js.map +1 -0
  158. package/dist/workspace-graph.d.ts +25 -0
  159. package/dist/workspace-graph.js +94 -0
  160. package/dist/workspace-graph.js.map +1 -0
  161. package/dist/workspace-graph.test.d.ts +1 -0
  162. package/dist/workspace-graph.test.js +31 -0
  163. package/dist/workspace-graph.test.js.map +1 -0
  164. package/dist/workspace-index.d.ts +40 -0
  165. package/dist/workspace-index.js +254 -0
  166. package/dist/workspace-index.js.map +1 -0
  167. package/dist/workspace-index.test.d.ts +1 -0
  168. package/dist/workspace-index.test.js +65 -0
  169. package/dist/workspace-index.test.js.map +1 -0
  170. package/dist/workspace-loader.d.ts +11 -0
  171. package/dist/workspace-loader.js +50 -0
  172. package/dist/workspace-loader.js.map +1 -0
  173. package/dist/workspace-loader.test.d.ts +1 -0
  174. package/dist/workspace-loader.test.js +19 -0
  175. package/dist/workspace-loader.test.js.map +1 -0
  176. package/package.json +4 -3
@@ -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
@@ -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;AAE5C,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"}
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 has no canonical source serializer, so this does not reflow content.
5
- * It only applies safe, idempotent normalizations OUTSIDE verbatim blocks
6
- * (fenced code, raw blocks, comment blocks):
7
- * - strip trailing whitespace
8
- * - collapse runs of 2+ blank lines to a single blank line
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
- const eol = source.includes('\r\n') ? '\r\n' : '\n';
17
- const lines = source.split(/\r?\n/);
18
- const out = [];
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
- * A verbatim block opener: a fence marker indented at most three spaces.
54
- * Backtick fences cannot carry a backtick in the info string, and a comment
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
- * A verbatim block closes on a lone fence (indent <= 3) of the same char.
71
- * Comment blocks close only on an exact-length marker; code/raw fences close
72
- * on a marker at least as long as the opener (CommonMark rule).
73
- */
74
- function closesFence(line, openFence) {
75
- const match = /^ {0,3}(`{3,}|~{3,}|%{3,})[ \t]*$/.exec(line);
76
- if (!match)
77
- return false;
78
- const close = match[1];
79
- if (close[0] !== openFence[0])
80
- return false;
81
- return openFence[0] === '%' ? close.length === openFence.length : close.length >= openFence.length;
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
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
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"}
@@ -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('strips trailing whitespace and enforces a final newline', () => {
5
- assert.equal(formatDocument('# Title \n\npara\t'), '# Title\n\npara\n');
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('collapses runs of blank lines to a single blank line', () => {
8
- assert.equal(formatDocument('a\n\n\n\nb'), 'a\n\nb\n');
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('trims leading and trailing blank lines', () => {
11
- assert.equal(formatDocument('\n\n# Title\n\n\n'), '# Title\n');
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 verbatim interiors of fenced code blocks', () => {
14
- const src = '```js\ncode \n\n\n more\n```\n';
15
- // Trailing spaces and blank runs inside the fence are untouched.
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('still normalizes outside a closed fence', () => {
19
- const src = '```\nx\n```\n\n\n\ntail \n';
20
- assert.equal(formatDocument(src), '```\nx\n```\n\ntail\n');
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('handles nested longer fences without closing early', () => {
23
- const src = '````md\n```\ninner \n```\n````\n';
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('a 4-space-indented fence does not close a code block', () => {
27
- const src = '```\ncode\n ```\n```\n\n\n\ntail \n';
28
- // The indented ``` stays inside the block; the flush ``` closes it; only the
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('comment block closes only on an exact-length marker', () => {
33
- const src = '%%%\nhidden \n%%%%\nstill \n%%%\n';
34
- // %%%% (len 4) does not close %%% (len 3); the block runs to the matching %%%.
35
- assert.equal(formatDocument(src), src);
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 \n\n\n\nbody \n');
38
+ const once = formatDocument('# T');
44
39
  assert.equal(formatDocument(once), once);
45
40
  });
46
41
  //# sourceMappingURL=format.test.js.map
@@ -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;AAE5C,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;IACnE,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,sBAAsB,CAAC,EAAE,mBAAmB,CAAC,CAAA;AAC3E,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;IAChE,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,CAAA;AACxD,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;IAClD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,mBAAmB,CAAC,EAAE,WAAW,CAAC,CAAA;AAChE,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAC9D,MAAM,GAAG,GAAG,mCAAmC,CAAA;IAC/C,iEAAiE;IACjE,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;AACxC,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACnD,MAAM,GAAG,GAAG,8BAA8B,CAAA;IAC1C,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,uBAAuB,CAAC,CAAA;AAC5D,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAC9D,MAAM,GAAG,GAAG,oCAAoC,CAAA;IAChD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;AACxC,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;IAChE,MAAM,GAAG,GAAG,0CAA0C,CAAA;IACtD,6EAA6E;IAC7E,uCAAuC;IACvC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,mCAAmC,CAAC,CAAA;AACxE,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;IAC/D,MAAM,GAAG,GAAG,uCAAuC,CAAA;IACnD,+EAA+E;IAC/E,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;AACxC,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;IAChE,uEAAuE;IACvE,MAAM,GAAG,GAAG,iCAAiC,CAAA;IAC7C,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,2BAA2B,CAAC,CAAA;AAChE,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE;IACzB,MAAM,IAAI,GAAG,cAAc,CAAC,uBAAuB,CAAC,CAAA;IACpD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;AAC1C,CAAC,CAAC,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":"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"}
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;AACvF,OAAO,EAAE,iBAAiB,EAAsB,MAAM,eAAe,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAOnD,MAAM,KAAK,GAAgB;IACzB;QACE,OAAO,EAAE,8BAA8B;QACvC,QAAQ,EAAE,yJAAyJ;KACpK;IACD;QACE,OAAO,EAAE,mEAAmE;QAC5E,QAAQ,EAAE,8HAA8H;KACzI;IACD;QACE,OAAO,EAAE,gBAAgB;QACzB,QAAQ,EAAE,uHAAuH;KAClI;IACD;QACE,OAAO,EAAE,kBAAkB;QAC3B,QAAQ,EAAE,iIAAiI;KAC5I;IACD;QACE,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,8DAA8D;KACzE;IACD;QACE,OAAO,EAAE,cAAc;QACvB,QAAQ,EAAE,kEAAkE;KAC7E;IACD;QACE,OAAO,EAAE,cAAc;QACvB,QAAQ,EAAE,+DAA+D;KAC1E;IACD;QACE,OAAO,EAAE,YAAY;QACrB,QAAQ,EAAE,wEAAwE;KACnF;IACD;QACE,OAAO,EAAE,YAAY;QACrB,QAAQ,EAAE,wEAAwE;KACnF;IACD;QACE,OAAO,EAAE,cAAc;QACvB,QAAQ,EAAE,2FAA2F;KACtG;IACD;QACE,OAAO,EAAE,yCAAyC;QAClD,QAAQ,EAAE,8CAA8C;KACzD;IACD;QACE,OAAO,EAAE,0CAA0C;QACnD,QAAQ,EAAE,wEAAwE;KACnF;IACD;QACE,OAAO,EAAE,YAAY;QACrB,QAAQ,EAAE,sDAAsD;KACjE;CACF,CAAA;AAED,MAAM,UAAU,OAAO,CAAC,MAAc,EAAE,QAAkB;IACxD,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC/C,IAAI,KAAK;QAAE,OAAO,KAAK,CAAA;IACvB,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;IAEjC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;QACjE,IAAI,KAAK;YAAE,OAAO,KAAK,CAAA;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;IACrE,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACjC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IAEnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAA;QAC1B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAChD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CAAA;YAC9B,MAAM,GAAG,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;YACnC,IAAI,QAAQ,CAAC,SAAS,GAAG,KAAK,IAAI,QAAQ,CAAC,SAAS,GAAG,GAAG;gBAAE,SAAQ;YACpE,OAAO;gBACL,QAAQ,EAAE;oBACR,IAAI,EAAE,UAAU,CAAC,QAAQ;oBACzB,KAAK,EAAE,IAAI,CAAC,QAAQ;iBACrB;gBACD,KAAK,EAAE;oBACL,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;oBAChD,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;iBAC7C;aACF,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,UAAU,CAAC,GAAa,EAAE,QAAkB,EAAE,KAAe;IACpE,4EAA4E;IAC5E,wEAAwE;IACxE,yDAAyD;IACzD,MAAM,MAAM,GAAa;QACvB,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,SAAS,EAAE,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC;KACpF,CAAA;IACD,MAAM,OAAO,GAAqD,EAAE,CAAA;IACpE,8EAA8E;IAC9E,8EAA8E;IAC9E,yDAAyD;IACzD,MAAM,UAAU,GAAgB,CAAC,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IAClE,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,QAAQ;QAAE,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;IAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACzD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IACxB,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IACvB,OAAO;QACL,QAAQ,EAAE;YACR,IAAI,EAAE,UAAU,CAAC,QAAQ;YACzB,KAAK,EAAE,KAAK,CAAC,QAAQ;SACtB;QACD,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC;KACjC,CAAA;AACH,CAAC;AAED,SAAS,YAAY,CACnB,OAAyD,EACzD,IAAe,EACf,QAAkB,EAClB,UAAuB;IAEvB,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAA;IAC1D,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,SAAS;YACZ,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;YAC3D,MAAK;QACP,KAAK,WAAW;YACd,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;YAC3D,MAAK;QACP,KAAK,aAAa;YAChB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAA;YACpF,MAAK;QACP,KAAK,MAAM;YACT,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;YAClH,MAAK;QACP,KAAK,YAAY,CAAC;QAClB,KAAK,KAAK;YACR,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAA;YACpF,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,KAAK;gBAAE,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;YACtG,MAAK;QACP,KAAK,iBAAiB;YACpB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC1B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAA;gBAChF,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE,CACtC,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAClF,CAAA;YACH,CAAC,CAAC,CAAA;YACF,MAAK;QACP,KAAK,QAAQ;YACX,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;YACxD,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;YAC1D,MAAK;QACP,KAAK,cAAc;YACjB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAA;YACpF,IAAI,IAAI,CAAC,OAAO;gBAAE,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;YAC5E,MAAK;QACP,KAAK,OAAO;YACV,IAAI,IAAI,CAAC,OAAO;gBAAE,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;YAC5E,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;YACpH,MAAK;IACT,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CACpB,OAAyD,EACzD,KAAmB,EACnB,QAAkB,EAClB,UAAuB;IAEvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAA;QACvE,MAAM,QAAQ,GAAI,IAAoC,CAAC,QAAQ,CAAA;QAC/D,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;QACnF,MAAM,OAAO,GAAI,IAAmC,CAAC,OAAO,CAAA;QAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;IACnF,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CACf,OAAyD,EACzD,GAA+B,EAC/B,QAAkB,EAClB,QAAuB;IAEvB,IAAI,CAAC,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;QAAE,OAAM;IACzD,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAA;AACjC,CAAC;AAED,SAAS,aAAa,CAAC,IAAe;IACpC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,8DAA8D,CAAA;QACvE,KAAK,YAAY;YACf,OAAO,gFAAgF,CAAA;QACzF,KAAK,WAAW;YACd,OAAO,kFAAkF,CAAA;QAC3F,KAAK,aAAa;YAChB,OAAO,mEAAmE,CAAA;QAC5E,KAAK,MAAM;YACT,OAAO,sEAAsE,CAAA;QAC/E,KAAK,OAAO;YACV,OAAO,iDAAiD,CAAA;QAC1D,KAAK,YAAY;YACf,OAAO,gEAAgE,CAAA;QACzE,KAAK,KAAK;YACR,OAAO,+DAA+D,CAAA;QACxE,KAAK,cAAc;YACjB,OAAO,CACL,qFAAqF;gBACrF,kEAAkE;gBAClE,8EAA8E,CAC/E,CAAA;QACH;YACE,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAgB,EAAE,UAAuB;IAC/D,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,kEAAkE,CAAA;QAC3E,KAAK,UAAU;YACb,OAAO,+DAA+D,CAAA;QACxE,KAAK,WAAW;YACd,OAAO,wEAAwE,CAAA;QACjF,KAAK,QAAQ;YACX,OAAO,wEAAwE,CAAA;QACjF,KAAK,WAAW;YACd,OAAO,iHAAiH,CAAA;QAC1H,KAAK,aAAa;YAChB,OAAO,uHAAuH,CAAA;QAChI,KAAK,WAAW;YACd,OAAO,+GAA+G,CAAA;QACxH,KAAK,MAAM;YACT,OAAO,sDAAsD,CAAA;QAC/D,KAAK,gBAAgB;YACnB,OAAO,kKAAkK,CAAA;QAC3K,KAAK,MAAM;YACT,OAAO,uEAAuE,CAAA;QAChF,KAAK,OAAO;YACV,OAAO,wEAAwE,CAAA;QACjF,KAAK,SAAS;YACZ,OAAO,sCAAsC,CAAA;QAC/C,KAAK,KAAK;YACR,OAAO,8BAA8B,CAAA;QACvC,KAAK,MAAM;YACT,OAAO,+CAA+C,CAAA;QACxD,KAAK,aAAa;YAChB,OAAO,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;QAC3C;YACE,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC;AAID;;;;;;;;GAQG;AACH,SAAS,gBAAgB,CAAC,IAAgB,EAAE,UAAuB;IACjE,MAAM,OAAO,GACX,sGAAsG,CAAA;IACxG,MAAM,EAAE,GAAI,IAA6B,CAAC,MAAM,CAAA;IAChD,IAAI,OAAO,EAAE,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAA;IAC1C,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,CAAC,CAAA;IAC7B,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,CAAA;IAC3B,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACzB,OAAO,CACL,uCAAuC,GAAG,MAAM,CAAC,IAAI,GAAG,oCAAoC;YAC5F,0DAA0D,CAC3D,CAAA;IACH,CAAC;IACD,OAAO,uCAAuC,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC,IAAI,GAAG,IAAI,CAAA;AAC5F,CAAC;AAED,SAAS,QAAQ,CAAC,GAAmB,EAAE,QAAkB;IACvD,IACE,GAAG,CAAC,WAAW,KAAK,SAAS;QAC7B,GAAG,CAAC,SAAS,KAAK,SAAS;QAC3B,QAAQ,CAAC,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,SAAS;QACjC,QAAQ,CAAC,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,EAC/B,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,GAAG,CAAC,GAAG,GAAG,CAAC,WAAW;QAAE,OAAO,KAAK,CAAA;IACjG,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC,SAAS,GAAG,CAAC,GAAG,GAAG,CAAC,SAAS;QAAE,OAAO,KAAK,CAAA;IAC7F,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,OAAO,CAAC,GAAmB,EAAE,KAAe;IACnD,OAAO;QACL,KAAK,EAAE;YACL,IAAI,EAAE,GAAG,CAAC,SAAS,GAAG,CAAC;YACvB,SAAS,EAAE,oBAAoB,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC;SACtF;QACD,GAAG,EAAE;YACH,IAAI,EAAE,GAAG,CAAC,OAAO,GAAG,CAAC;YACrB,SAAS,EAAE,oBAAoB,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC;SAClF;KACF,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,GAAmB;IACnC,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,WAAW,CAAA;IACxG,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,CAAA;AAC/F,CAAC"}
@@ -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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"}
@@ -0,0 +1,3 @@
1
+ import { type CompletionItem, type Position } from 'vscode-languageserver/node.js';
2
+ import type { IncludeOptions } from './includes.js';
3
+ export declare function includeCompletions(source: string, position: Position, options?: IncludeOptions): CompletionItem[];