@nielspeter/eess-md 0.8.0 → 0.10.0

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 (74) hide show
  1. package/README.md +13 -1
  2. package/dist/builders/code-blocks.d.ts +37 -0
  3. package/dist/builders/code-blocks.d.ts.map +1 -0
  4. package/dist/builders/code-blocks.js +143 -0
  5. package/dist/builders/code-blocks.js.map +1 -0
  6. package/dist/builders/declaration-findings.d.ts +37 -0
  7. package/dist/builders/declaration-findings.d.ts.map +1 -0
  8. package/dist/builders/declaration-findings.js +128 -0
  9. package/dist/builders/declaration-findings.js.map +1 -0
  10. package/dist/builders/links.d.ts +60 -1
  11. package/dist/builders/links.d.ts.map +1 -1
  12. package/dist/builders/links.js +92 -1
  13. package/dist/builders/links.js.map +1 -1
  14. package/dist/conditions/linked-back.d.ts +17 -0
  15. package/dist/conditions/linked-back.d.ts.map +1 -0
  16. package/dist/conditions/linked-back.js +122 -0
  17. package/dist/conditions/linked-back.js.map +1 -0
  18. package/dist/conditions/resolve.d.ts +8 -40
  19. package/dist/conditions/resolve.d.ts.map +1 -1
  20. package/dist/conditions/resolve.js +26 -138
  21. package/dist/conditions/resolve.js.map +1 -1
  22. package/dist/corpus.d.ts +3 -0
  23. package/dist/corpus.d.ts.map +1 -1
  24. package/dist/corpus.js +7 -10
  25. package/dist/corpus.js.map +1 -1
  26. package/dist/index.d.ts +7 -1
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +7 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/model/code-block-parse.d.ts +118 -0
  31. package/dist/model/code-block-parse.d.ts.map +1 -0
  32. package/dist/model/code-block-parse.js +368 -0
  33. package/dist/model/code-block-parse.js.map +1 -0
  34. package/dist/model/document.d.ts +14 -3
  35. package/dist/model/document.d.ts.map +1 -1
  36. package/dist/model/document.js +30 -7
  37. package/dist/model/document.js.map +1 -1
  38. package/dist/model/label.d.ts +35 -0
  39. package/dist/model/label.d.ts.map +1 -0
  40. package/dist/model/label.js +68 -0
  41. package/dist/model/label.js.map +1 -0
  42. package/dist/model/links.d.ts +43 -0
  43. package/dist/model/links.d.ts.map +1 -1
  44. package/dist/model/links.js +112 -11
  45. package/dist/model/links.js.map +1 -1
  46. package/dist/model/prose.d.ts +11 -0
  47. package/dist/model/prose.d.ts.map +1 -1
  48. package/dist/model/prose.js +50 -5
  49. package/dist/model/prose.js.map +1 -1
  50. package/dist/model/query.d.ts +7 -0
  51. package/dist/model/query.d.ts.map +1 -1
  52. package/dist/model/query.js +10 -3
  53. package/dist/model/query.js.map +1 -1
  54. package/dist/model/resolve-link.d.ts +142 -0
  55. package/dist/model/resolve-link.d.ts.map +1 -0
  56. package/dist/model/resolve-link.js +194 -0
  57. package/dist/model/resolve-link.js.map +1 -0
  58. package/dist/predicates/declared-block.d.ts +29 -0
  59. package/dist/predicates/declared-block.d.ts.map +1 -0
  60. package/dist/predicates/declared-block.js +47 -0
  61. package/dist/predicates/declared-block.js.map +1 -0
  62. package/dist/predicates/live-target.d.ts +12 -0
  63. package/dist/predicates/live-target.d.ts.map +1 -0
  64. package/dist/predicates/live-target.js +17 -0
  65. package/dist/predicates/live-target.js.map +1 -0
  66. package/dist/rules/adr.d.ts +14 -5
  67. package/dist/rules/adr.d.ts.map +1 -1
  68. package/dist/rules/adr.js +5 -27
  69. package/dist/rules/adr.js.map +1 -1
  70. package/dist/rules/ledger.d.ts +10 -6
  71. package/dist/rules/ledger.d.ts.map +1 -1
  72. package/dist/rules/ledger.js +80 -24
  73. package/dist/rules/ledger.js.map +1 -1
  74. package/package.json +6 -3
@@ -0,0 +1,35 @@
1
+ /**
2
+ * The label grammar a Markdown record uses to declare something on a line —
3
+ * `**State:** Done`, `**Related to:** [a](a.md)` (plan 0405).
4
+ *
5
+ * One grammar, shared by the ledger's `State:` reader, `links().areLabelled()`,
6
+ * and the link walk's label-alone test, so `**Related to**:` cannot be a label to
7
+ * one and a misspelling to another. Every reader below is built from the same
8
+ * fragments; none restates a form by hand. Each caller decides case sensitivity
9
+ * when it compiles the pattern: the ledger reads `**state:**` as `State`,
10
+ * `areLabelled` matches the declared spelling exactly.
11
+ *
12
+ * Accepted forms, each optionally after a list marker: `**Label:**`, `**Label**:`,
13
+ * `__Label__:`, `Label:`. **The colon is required in every form.** Making it
14
+ * optional turned any line beginning with the word into a declaration: the ledger
15
+ * read `Stateless rendering is the default` as the state `less`, and `State
16
+ * machine transitions are documented` as `machine`.
17
+ *
18
+ * The link walk hands these readers a block's text from its content column, so
19
+ * an ordered-list marker, a task box or a blockquote `>` never reaches them; the
20
+ * optional bullet marker is kept for the ledger, which reads raw lines.
21
+ */
22
+ /** The regex source for a line that opens with `label`, in any accepted form. */
23
+ export declare function labelPattern(label: string): string;
24
+ /**
25
+ * The text of a **wrapped** label (`**Label:**`, `**Label**:`, `__Label__:`) that
26
+ * opens `line`, or `undefined`. The plain `Label:` form is deliberately absent:
27
+ * prose that begins "related to: …" is common, so only a wrapped label is read
28
+ * as an attempt to declare something.
29
+ */
30
+ export declare function wrappedLabelOf(line: string): string | undefined;
31
+ /** True when `line` is a label in any form and nothing else follows it. */
32
+ export declare function isLabelAlone(line: string): boolean;
33
+ /** Two label spellings that differ only in case or inner spacing. */
34
+ export declare function isNearMiss(found: string, declared: string): boolean;
35
+ //# sourceMappingURL=label.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../src/model/label.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAuBH,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGlD;AAMD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI/D;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAInE"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * The label grammar a Markdown record uses to declare something on a line —
3
+ * `**State:** Done`, `**Related to:** [a](a.md)` (plan 0405).
4
+ *
5
+ * One grammar, shared by the ledger's `State:` reader, `links().areLabelled()`,
6
+ * and the link walk's label-alone test, so `**Related to**:` cannot be a label to
7
+ * one and a misspelling to another. Every reader below is built from the same
8
+ * fragments; none restates a form by hand. Each caller decides case sensitivity
9
+ * when it compiles the pattern: the ledger reads `**state:**` as `State`,
10
+ * `areLabelled` matches the declared spelling exactly.
11
+ *
12
+ * Accepted forms, each optionally after a list marker: `**Label:**`, `**Label**:`,
13
+ * `__Label__:`, `Label:`. **The colon is required in every form.** Making it
14
+ * optional turned any line beginning with the word into a declaration: the ledger
15
+ * read `Stateless rendering is the default` as the state `less`, and `State
16
+ * machine transitions are documented` as `machine`.
17
+ *
18
+ * The link walk hands these readers a block's text from its content column, so
19
+ * an ordered-list marker, a task box or a blockquote `>` never reaches them; the
20
+ * optional bullet marker is kept for the ledger, which reads raw lines.
21
+ */
22
+ const escapeRe = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
23
+ /** Leading space and an optional bullet marker — the ledger's raw-line prefix. */
24
+ const PREFIX = String.raw `^\s*(?:[-*+]\s+)?`;
25
+ /** The three wrapped forms over a label body (a regex source). */
26
+ const wrapped = (body) => String.raw `\*\*${body}:\*\*|\*\*${body}\*\*\s*:|__${body}__\s*:`;
27
+ /** The plain form over a label body (a regex source). */
28
+ const plain = (body) => String.raw `${body}\s*:`;
29
+ /**
30
+ * Any label's body. A plain body may be anything up to a colon: it is read only
31
+ * to ask whether a line is a label alone, and a plain line that is not the
32
+ * declared label never decides a declaration (`decidingBlock`), so a loose match
33
+ * here cannot hide one.
34
+ */
35
+ const ANY_WRAPPED = String.raw `([^*_\n]+?)`;
36
+ const ANY_PLAIN = String.raw `[^\s:*_][^:\n]*?`;
37
+ /** The regex source for a line that opens with `label`, in any accepted form. */
38
+ export function labelPattern(label) {
39
+ const l = escapeRe(label);
40
+ return `${PREFIX}(?:${wrapped(l)}|${plain(l)})\\s*`;
41
+ }
42
+ const WRAPPED_LABEL = new RegExp(`${PREFIX}(?:${wrapped(ANY_WRAPPED)})`);
43
+ const OPENS_WITH_LABEL = new RegExp(`${PREFIX}(?:${wrapped(ANY_WRAPPED)}|${plain(ANY_PLAIN)})`);
44
+ const LABEL_ALONE = new RegExp(`${OPENS_WITH_LABEL.source}\\s*$`);
45
+ /**
46
+ * The text of a **wrapped** label (`**Label:**`, `**Label**:`, `__Label__:`) that
47
+ * opens `line`, or `undefined`. The plain `Label:` form is deliberately absent:
48
+ * prose that begins "related to: …" is common, so only a wrapped label is read
49
+ * as an attempt to declare something.
50
+ */
51
+ export function wrappedLabelOf(line) {
52
+ const m = WRAPPED_LABEL.exec(line);
53
+ if (m === null)
54
+ return undefined;
55
+ return m[1] ?? m[2] ?? m[3];
56
+ }
57
+ /** True when `line` is a label in any form and nothing else follows it. */
58
+ export function isLabelAlone(line) {
59
+ return LABEL_ALONE.test(line);
60
+ }
61
+ /** Two label spellings that differ only in case or inner spacing. */
62
+ export function isNearMiss(found, declared) {
63
+ if (found === declared)
64
+ return false;
65
+ const norm = (s) => s.trim().replace(/\s+/g, ' ').toLowerCase();
66
+ return norm(found) === norm(declared);
67
+ }
68
+ //# sourceMappingURL=label.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label.js","sourceRoot":"","sources":["../../src/model/label.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;AAEhF,kFAAkF;AAClF,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAA,mBAAmB,CAAA;AAE5C,kEAAkE;AAClE,MAAM,OAAO,GAAG,CAAC,IAAY,EAAU,EAAE,CACvC,MAAM,CAAC,GAAG,CAAA,OAAO,IAAI,aAAa,IAAI,cAAc,IAAI,QAAQ,CAAA;AAElE,yDAAyD;AACzD,MAAM,KAAK,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,MAAM,CAAC,GAAG,CAAA,GAAG,IAAI,MAAM,CAAA;AAE/D;;;;;GAKG;AACH,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAA,aAAa,CAAA;AAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAA,kBAAkB,CAAA;AAE9C,iFAAiF;AACjF,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACzB,OAAO,GAAG,MAAM,MAAM,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,OAAO,CAAA;AACrD,CAAC;AAED,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,GAAG,MAAM,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;AACxE,MAAM,gBAAgB,GAAG,IAAI,MAAM,CAAC,GAAG,MAAM,MAAM,OAAO,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;AAC/F,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAM,OAAO,CAAC,CAAA;AAEjE;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAClC,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,SAAS,CAAA;IAChC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;AAC7B,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC/B,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,QAAgB;IACxD,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IACpC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;IAC/E,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAA;AACvC,CAAC"}
@@ -18,7 +18,49 @@ export interface MdLinkRef {
18
18
  */
19
19
  readonly urlStart?: number;
20
20
  readonly urlEnd?: number;
21
+ /** The innermost block that holds this link (plan 0405); absent in a heading or a table cell. */
22
+ readonly block?: MdLinkBlock;
23
+ /**
24
+ * Every block enclosing this link, outermost first, ending with `block` — the
25
+ * paragraphs and list items it sits in, and a label alone on its paragraph for
26
+ * the lists directly after it (plan 0405). Mirrors `sectionPath`.
27
+ */
28
+ readonly blockPath?: readonly MdLinkBlock[];
29
+ /** The headings above this link, outermost first, as `MdTable.sectionPath` records them. */
30
+ readonly sectionPath?: readonly string[];
21
31
  }
32
+ /**
33
+ * A block that can hold a link (plan 0405): a paragraph or a list item.
34
+ *
35
+ * `line` is the block's first source line; `text` is that line from the block's
36
+ * content column, so a list marker (`-`, `1.`), a task box (`[ ]`) and a
37
+ * blockquote `>` are not part of it.
38
+ */
39
+ export interface MdLinkBlock {
40
+ readonly line: number;
41
+ readonly text: string;
42
+ }
43
+ /** A label written where no block starts — read by `areLabelled()`'s declaration scan. */
44
+ interface MdUnreadLabel {
45
+ readonly line: number;
46
+ readonly label: string;
47
+ /** `position`: not where a block starts; `format`: at a block's start, in a form the grammar does not read. */
48
+ readonly reason: 'position' | 'format';
49
+ }
50
+ /**
51
+ * Collect inline markdown links (`[text](url)`) from a document tree, each with
52
+ * the blocks that enclose it and the headings above it; plus every block, the
53
+ * enclosing blocks of each reference-style link, and every label written where
54
+ * no block starts (later in a paragraph, in a table cell, in a heading), which
55
+ * therefore declares nothing. Links inside fenced code are not parsed as `link`
56
+ * nodes by mdast, so they are naturally excluded.
57
+ */
58
+ export declare function collectLinkBlocks(root: Root, source?: string): {
59
+ links: MdLinkRef[];
60
+ references: (readonly MdLinkBlock[])[];
61
+ blocks: MdLinkBlock[];
62
+ unreadLabels: MdUnreadLabel[];
63
+ };
22
64
  /**
23
65
  * Collect inline markdown links (`[text](url)`) from a document tree. Links
24
66
  * inside fenced code are not parsed as `link` nodes by mdast, so they are
@@ -29,4 +71,5 @@ export declare function collectLinks(root: Root, source?: string): MdLinkRef[];
29
71
  export interface MdLink extends MdLinkRef {
30
72
  readonly doc: MdDocument;
31
73
  }
74
+ export {};
32
75
  //# sourceMappingURL=links.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/model/links.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAS,MAAM,OAAO,CAAA;AAExC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE/C,gFAAgF;AAChF,MAAM,WAAW,SAAS;IACxB,8EAA8E;IAC9E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,iBAAiB;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,8EAA8E;IAC9E,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAKD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAoCrE;AAED,qGAAqG;AACrG,MAAM,WAAW,MAAO,SAAQ,SAAS;IACvC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAA;CACzB"}
1
+ {"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/model/links.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAS,MAAM,OAAO,CAAA;AAIxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE/C,gFAAgF;AAChF,MAAM,WAAW,SAAS;IACxB,8EAA8E;IAC9E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,iBAAiB;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,8EAA8E;IAC9E,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,iGAAiG;IACjG,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAA;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,WAAW,EAAE,CAAA;IAC3C,4FAA4F;IAC5F,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACzC;AAKD;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,0FAA0F;AAC1F,UAAU,aAAa;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,+GAA+G;IAC/G,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAA;CACvC;AAmBD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,EACV,MAAM,CAAC,EAAE,MAAM,GACd;IACD,KAAK,EAAE,SAAS,EAAE,CAAA;IAClB,UAAU,EAAE,CAAC,SAAS,WAAW,EAAE,CAAC,EAAE,CAAA;IACtC,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,YAAY,EAAE,aAAa,EAAE,CAAA;CAC9B,CA8GA;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAErE;AAED,qGAAqG;AACrG,MAAM,WAAW,MAAO,SAAQ,SAAS;IACvC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAA;CACzB"}
@@ -1,14 +1,107 @@
1
1
  import { textOf } from './text-of.js';
2
+ import { enterHeading, headingName } from './document.js';
3
+ import { isLabelAlone, wrappedLabelOf } from './label.js';
2
4
  // A URL is external if it has a scheme (`https:`, `mailto:`) or is protocol-relative.
3
5
  const EXTERNAL_RE = /^([a-z][a-z0-9+.-]*:|\/\/)/i;
6
+ const TASK_BOX = /^\[[ xX]\]\s+/;
4
7
  /**
5
- * Collect inline markdown links (`[text](url)`) from a document tree. Links
6
- * inside fenced code are not parsed as `link` nodes by mdast, so they are
7
- * naturally excluded.
8
+ * The label a `strong` node writes, or `undefined`: `**Label:**` (the colon
9
+ * inside) or `**Label**:` (the colon in the text after it). `__Label__:` is a
10
+ * `strong` node too.
8
11
  */
9
- export function collectLinks(root, source) {
12
+ function strongLabel(node, next) {
13
+ if (node.type !== 'strong')
14
+ return undefined;
15
+ const text = textOf(node);
16
+ // `**Label:**`, and a whole line in bold (`**Label: [a](a.md)**`).
17
+ const inside = /^\s*([^:\n]+?)\s*:/.exec(text);
18
+ if (inside?.[1] !== undefined)
19
+ return inside[1];
20
+ if (next?.type === 'text' && /^\s*:/.test(next.value))
21
+ return text.trim();
22
+ return undefined;
23
+ }
24
+ /**
25
+ * Collect inline markdown links (`[text](url)`) from a document tree, each with
26
+ * the blocks that enclose it and the headings above it; plus every block, the
27
+ * enclosing blocks of each reference-style link, and every label written where
28
+ * no block starts (later in a paragraph, in a table cell, in a heading), which
29
+ * therefore declares nothing. Links inside fenced code are not parsed as `link`
30
+ * nodes by mdast, so they are naturally excluded.
31
+ */
32
+ export function collectLinkBlocks(root, source) {
10
33
  const out = [];
11
- const visit = (node) => {
34
+ const lines = source?.split('\n') ?? [];
35
+ const blocks = [];
36
+ const references = [];
37
+ const unreadLabels = [];
38
+ const headingStack = [];
39
+ // The block a node opens: its first line, read from its content column.
40
+ const blockOf = (node) => {
41
+ const first = node.type === 'listItem' ? (node.children[0] ?? node) : node;
42
+ const line = first.position?.start.line ?? 0;
43
+ const column = first.position?.start.column ?? 1;
44
+ return { line, text: (lines[line - 1] ?? '').slice(column - 1).replace(TASK_BOX, '') };
45
+ };
46
+ const enter = (path, block) => {
47
+ if (path.at(-1)?.line === block.line)
48
+ return path;
49
+ blocks.push(block);
50
+ return [...path, block];
51
+ };
52
+ const visitChildren = (parent, children, path) => {
53
+ for (let i = 0; i < children.length; i++) {
54
+ const child = children[i];
55
+ if (child === undefined)
56
+ continue;
57
+ // A label alone on its paragraph encloses the lists directly after it — every
58
+ // one, since a changed bullet starts a new list.
59
+ if (child.type === 'paragraph' && children[i + 1]?.type === 'list') {
60
+ const label = blockOf(child);
61
+ if (isLabelAlone(label.text)) {
62
+ const inner = enter(path, label);
63
+ visit(child, inner);
64
+ while (children[i + 1]?.type === 'list') {
65
+ const list = children[i + 1];
66
+ if (list !== undefined)
67
+ visit(list, inner);
68
+ i++;
69
+ }
70
+ continue;
71
+ }
72
+ }
73
+ // A label is read as a declaration only where its block starts — nothing but `*`/`_`
74
+ // before it on the block's line — and only in a form the line grammar reads. The tree
75
+ // sees every bold label, so any it finds elsewhere, or in another form, declares nothing.
76
+ const label = strongLabel(child, children[i + 1]);
77
+ if (label !== undefined) {
78
+ const line = child.position?.start.line ?? 0;
79
+ const block = path.at(-1);
80
+ const rest = (lines[line - 1] ?? '').slice((child.position?.start.column ?? 1) - 1);
81
+ const atStart = block !== undefined &&
82
+ block.line === line &&
83
+ /^[*_]*$/.test(block.text.slice(0, block.text.length - rest.length));
84
+ if (!atStart)
85
+ unreadLabels.push({ line, label, reason: 'position' });
86
+ else if (wrappedLabelOf(block.text) !== label) {
87
+ unreadLabels.push({ line, label, reason: 'format' });
88
+ }
89
+ }
90
+ visit(child, path);
91
+ }
92
+ };
93
+ const visit = (node, path) => {
94
+ if (node.type === 'heading') {
95
+ enterHeading(headingStack, node.depth, headingName(node));
96
+ visitChildren(node, node.children, []);
97
+ return;
98
+ }
99
+ if (node.type === 'listItem' || node.type === 'paragraph') {
100
+ visitChildren(node, node.children, enter(path, blockOf(node)));
101
+ return;
102
+ }
103
+ if (node.type === 'linkReference')
104
+ references.push(path);
12
105
  if (node.type === 'link') {
13
106
  // Locate the URL's exact char span in the source (for autofix). The link
14
107
  // node's raw text is `[text](url …)`; the URL is the last occurrence of
@@ -34,14 +127,22 @@ export function collectLinks(root, source) {
34
127
  external: EXTERNAL_RE.test(node.url),
35
128
  urlStart,
36
129
  urlEnd,
130
+ ...(path.length > 0 ? { block: path[path.length - 1], blockPath: path } : {}),
131
+ sectionPath: headingStack.filter((h) => h !== undefined),
37
132
  });
38
133
  }
39
- if ('children' in node) {
40
- for (const child of node.children)
41
- visit(child);
42
- }
134
+ if ('children' in node)
135
+ visitChildren(node, node.children, path);
43
136
  };
44
- visit(root);
45
- return out;
137
+ visitChildren(root, root.children, []);
138
+ return { links: out, references, blocks, unreadLabels };
139
+ }
140
+ /**
141
+ * Collect inline markdown links (`[text](url)`) from a document tree. Links
142
+ * inside fenced code are not parsed as `link` nodes by mdast, so they are
143
+ * naturally excluded.
144
+ */
145
+ export function collectLinks(root, source) {
146
+ return collectLinkBlocks(root, source).links;
46
147
  }
47
148
  //# sourceMappingURL=links.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/model/links.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAuBrC,sFAAsF;AACtF,MAAM,WAAW,GAAG,6BAA6B,CAAA;AAEjD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,IAAU,EAAE,MAAe;IACtD,MAAM,GAAG,GAAgB,EAAE,CAAA;IAC3B,MAAM,KAAK,GAAG,CAAC,IAAW,EAAQ,EAAE;QAClC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,yEAAyE;YACzE,wEAAwE;YACxE,2EAA2E;YAC3E,2EAA2E;YAC3E,2CAA2C;YAC3C,IAAI,QAA4B,CAAA;YAChC,IAAI,MAA0B,CAAA;YAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAA;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAA;YACxC,IAAI,MAAM,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC3E,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;gBAC1C,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACrC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;oBACb,QAAQ,GAAG,QAAQ,GAAG,GAAG,CAAA;oBACzB,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAA;gBACrC,CAAC;YACH,CAAC;YACD,GAAG,CAAC,IAAI,CAAC;gBACP,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;gBAClB,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC;gBACpC,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;gBACpC,QAAQ;gBACR,MAAM;aACP,CAAC,CAAA;QACJ,CAAC;QACD,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;YACvB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ;gBAAE,KAAK,CAAC,KAAK,CAAC,CAAA;QACjD,CAAC;IACH,CAAC,CAAA;IACD,KAAK,CAAC,IAAI,CAAC,CAAA;IACX,OAAO,GAAG,CAAA;AACZ,CAAC"}
1
+ {"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/model/links.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,15 @@
1
1
  import type { Root } from 'mdast';
2
+ /**
3
+ * Parse markdown — the one parser for eess-md: `corpus()` reads every document with it, and the
4
+ * readers here default to it, so the two cannot disagree about where a code block or a section is.
5
+ *
6
+ * GFM, and YAML front matter, which parses to a `yaml` node. Without it, CommonMark reads the
7
+ * closing `---` as a setext underline and the YAML above it becomes a depth-2 section (bug 0087).
8
+ * A line-1 `---` block that is not front matter by {@link isFrontMatter} is read as Markdown instead,
9
+ * so it fails closed: every reader sees what it holds. Text-line readers — `terms()`, `pointers()`,
10
+ * the ledger — see front-matter lines either way, since only code blocks are set aside.
11
+ */
12
+ export declare function parseMarkdown(text: string): Root;
2
13
  /**
3
14
  * Which code a reader sets aside (bug 0287).
4
15
  *
@@ -1 +1 @@
1
- {"version":3,"file":"prose.d.ts","sourceRoot":"","sources":["../../src/model/prose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,IAAI,EAAE,MAAM,OAAO,CAAA;AAsHxC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,eAAe,CAAA;AAEtD;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,QAAQ,EAClB,IAAI,GAAE,IAA0B,GAC/B,MAAM,CAUR;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,IAA0B,GAAG,MAAM,EAAE,CAIvF;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAMzE"}
1
+ {"version":3,"file":"prose.d.ts","sourceRoot":"","sources":["../../src/model/prose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,IAAI,EAAE,MAAM,OAAO,CAAA;AAqDxC;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAKhD;AA8FD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,eAAe,CAAA;AAEtD;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,QAAQ,EAClB,IAAI,GAAE,IAA0B,GAC/B,MAAM,CAUR;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,IAA0B,GAAG,MAAM,EAAE,CAIvF;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAMzE"}
@@ -1,6 +1,9 @@
1
1
  import { fromMarkdown } from 'mdast-util-from-markdown';
2
2
  import { gfm } from 'micromark-extension-gfm';
3
3
  import { gfmFromMarkdown } from 'mdast-util-gfm';
4
+ import { frontmatter } from 'micromark-extension-frontmatter';
5
+ import { frontmatterFromMarkdown } from 'mdast-util-frontmatter';
6
+ import { isMap, parseDocument } from 'yaml';
4
7
  /**
5
8
  * Which lines of a markdown document are prose, read with the parser the corpus is read with (bugs 0286
6
9
  * and 0287). A scan for a claim a document makes — a `State:` line, a `Deferred:` summary, a ruling, a
@@ -13,11 +16,53 @@ import { gfmFromMarkdown } from 'mdast-util-gfm';
13
16
  * well as an example of one, so setting whole HTML blocks aside silences real claims; that is bug 0293's
14
17
  * design question, not decided here.
15
18
  */
16
- const GFM = gfm();
17
- const GFM_MDAST = gfmFromMarkdown();
18
- /** Parse markdown as the corpus does. */
19
- function parseMarkdown(text) {
20
- return fromMarkdown(text, { extensions: [GFM], mdastExtensions: [GFM_MDAST] });
19
+ const GFM_ONLY = { extensions: [gfm()], mdastExtensions: [gfmFromMarkdown()] };
20
+ const WITH_FRONT_MATTER = {
21
+ extensions: [gfm(), frontmatter(['yaml'])],
22
+ mdastExtensions: [gfmFromMarkdown(), frontmatterFromMarkdown(['yaml'])],
23
+ };
24
+ // A URL with a scheme or `//` points outside the repository — the same test `MdLink.external` uses.
25
+ const EXTERNAL = /^([a-z][a-z0-9+.-]*:|\/\/)/i;
26
+ /** True when Markdown a reader checks — a task box, or a link into the repository — is in `root`. */
27
+ function holdsCheckedMarkdown(root) {
28
+ const visit = (node) => {
29
+ if (node.type === 'listItem' && typeof node.checked === 'boolean')
30
+ return true;
31
+ if (node.type === 'link' && !EXTERNAL.test(node.url))
32
+ return true;
33
+ return 'children' in node && node.children.some(visit);
34
+ };
35
+ return visit(root);
36
+ }
37
+ /**
38
+ * Whether a line-1 `---` block is front matter (bug 0087). Only if it is a YAML mapping that parses
39
+ * with no error — the yaml library hands back a mapping even beside an error, so the errors decide —
40
+ * and holds nothing a Markdown reader checks: a task box or a link into the repository, which a
41
+ * YAML value can carry on an indented continuation line and still parse. Anything else is read as
42
+ * Markdown, as it was before front matter was parsed, so no box or link is hidden by it.
43
+ */
44
+ function isFrontMatter(value) {
45
+ const doc = parseDocument(value);
46
+ if (doc.errors.length > 0 || !isMap(doc.contents) || doc.contents.items.length === 0)
47
+ return false;
48
+ return !holdsCheckedMarkdown(fromMarkdown(value, GFM_ONLY));
49
+ }
50
+ /**
51
+ * Parse markdown — the one parser for eess-md: `corpus()` reads every document with it, and the
52
+ * readers here default to it, so the two cannot disagree about where a code block or a section is.
53
+ *
54
+ * GFM, and YAML front matter, which parses to a `yaml` node. Without it, CommonMark reads the
55
+ * closing `---` as a setext underline and the YAML above it becomes a depth-2 section (bug 0087).
56
+ * A line-1 `---` block that is not front matter by {@link isFrontMatter} is read as Markdown instead,
57
+ * so it fails closed: every reader sees what it holds. Text-line readers — `terms()`, `pointers()`,
58
+ * the ledger — see front-matter lines either way, since only code blocks are set aside.
59
+ */
60
+ export function parseMarkdown(text) {
61
+ const root = fromMarkdown(text, WITH_FRONT_MATTER);
62
+ const first = root.children[0];
63
+ if (first?.type !== 'yaml' || isFrontMatter(first.value))
64
+ return root;
65
+ return fromMarkdown(text, GFM_ONLY);
21
66
  }
22
67
  /**
23
68
  * A node's last line. A position's end is exclusive, so a block its container closes ends at column 1 of
@@ -1 +1 @@
1
- {"version":3,"file":"prose.js","sourceRoot":"","sources":["../../src/model/prose.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prose.js","sourceRoot":"","sources":["../../src/model/prose.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,13 @@
1
1
  import type { MdDocument, MdTable } from './document.js';
2
2
  /** Does the document have a heading matching `name`? */
3
3
  export declare function hasSection(doc: MdDocument, name: string | RegExp): boolean;
4
+ /**
5
+ * Is the element — a table, or a link (plan 0405) — under a heading matching
6
+ * `section` (or is no section required)?
7
+ */
8
+ export declare function inSection(element: {
9
+ readonly sectionPath?: readonly string[];
10
+ }, section?: string | RegExp): boolean;
4
11
  /** Is the table under a heading matching `section` (or is no section required)? */
5
12
  export declare function tableInSection(table: MdTable, section?: string | RegExp): boolean;
6
13
  //# sourceMappingURL=query.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/model/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAOxD,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAE1E;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAGjF"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/model/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAOxD,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAE1E;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE;IAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,EACrD,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GACxB,OAAO,CAGT;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAEjF"}
@@ -6,10 +6,17 @@ function matchName(value, name) {
6
6
  export function hasSection(doc, name) {
7
7
  return doc.sections.some((s) => matchName(s.name, name));
8
8
  }
9
- /** Is the table under a heading matching `section` (or is no section required)? */
10
- export function tableInSection(table, section) {
9
+ /**
10
+ * Is the element — a table, or a link (plan 0405) — under a heading matching
11
+ * `section` (or is no section required)?
12
+ */
13
+ export function inSection(element, section) {
11
14
  if (section === undefined)
12
15
  return true;
13
- return table.sectionPath.some((h) => matchName(h, section));
16
+ return (element.sectionPath ?? []).some((h) => matchName(h, section));
17
+ }
18
+ /** Is the table under a heading matching `section` (or is no section required)? */
19
+ export function tableInSection(table, section) {
20
+ return inSection(table, section);
14
21
  }
15
22
  //# sourceMappingURL=query.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/model/query.ts"],"names":[],"mappings":"AAEA,qEAAqE;AACrE,SAAS,SAAS,CAAC,KAAa,EAAE,IAAqB;IACrD,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AACrE,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,UAAU,CAAC,GAAe,EAAE,IAAqB;IAC/D,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;AAC1D,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,cAAc,CAAC,KAAc,EAAE,OAAyB;IACtE,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IACtC,OAAO,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;AAC7D,CAAC"}
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/model/query.ts"],"names":[],"mappings":"AAEA,qEAAqE;AACrE,SAAS,SAAS,CAAC,KAAa,EAAE,IAAqB;IACrD,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AACrE,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,UAAU,CAAC,GAAe,EAAE,IAAqB;IAC/D,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;AAC1D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,OAAqD,EACrD,OAAyB;IAEzB,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IACtC,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;AACvE,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,cAAc,CAAC,KAAc,EAAE,OAAyB;IACtE,OAAO,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;AAClC,CAAC"}