@agentshouse/mdmodel 0.1.0-alpha.1 → 0.1.0-alpha.10

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 (156) hide show
  1. package/README.md +220 -7
  2. package/dist/blocks.d.ts +11 -0
  3. package/dist/blocks.d.ts.map +1 -0
  4. package/dist/blocks.js +63 -0
  5. package/dist/blocks.js.map +1 -0
  6. package/dist/definition.d.ts +8 -6
  7. package/dist/definition.d.ts.map +1 -1
  8. package/dist/definition.js +44 -38
  9. package/dist/definition.js.map +1 -1
  10. package/dist/divide.d.ts +3 -0
  11. package/dist/divide.d.ts.map +1 -0
  12. package/dist/divide.js +363 -0
  13. package/dist/divide.js.map +1 -0
  14. package/dist/document.d.ts +4 -1
  15. package/dist/document.d.ts.map +1 -1
  16. package/dist/document.js +95 -4
  17. package/dist/document.js.map +1 -1
  18. package/dist/index.d.ts +4 -2
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +3 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/links.d.ts +25 -1
  23. package/dist/links.d.ts.map +1 -1
  24. package/dist/links.js +289 -48
  25. package/dist/links.js.map +1 -1
  26. package/dist/paths.d.ts +1 -0
  27. package/dist/paths.d.ts.map +1 -1
  28. package/dist/paths.js +5 -0
  29. package/dist/paths.js.map +1 -1
  30. package/dist/profile.js.map +1 -1
  31. package/dist/project.d.ts +21 -0
  32. package/dist/project.d.ts.map +1 -0
  33. package/dist/project.js +158 -0
  34. package/dist/project.js.map +1 -0
  35. package/dist/refuse.js.map +1 -1
  36. package/dist/schema.d.ts.map +1 -1
  37. package/dist/schema.js +16 -38
  38. package/dist/schema.js.map +1 -1
  39. package/dist/sections.d.ts.map +1 -1
  40. package/dist/sections.js +14 -47
  41. package/dist/sections.js.map +1 -1
  42. package/dist/types.d.ts +44 -0
  43. package/dist/types.d.ts.map +1 -1
  44. package/dist/types.js.map +1 -1
  45. package/dist/validate.d.ts +2 -2
  46. package/dist/validate.d.ts.map +1 -1
  47. package/dist/validate.js +17 -8
  48. package/dist/validate.js.map +1 -1
  49. package/dist/version.d.ts +1 -1
  50. package/dist/version.d.ts.map +1 -1
  51. package/dist/version.js +1 -1
  52. package/dist/version.js.map +1 -1
  53. package/dist/yaml.d.ts +1 -0
  54. package/dist/yaml.d.ts.map +1 -1
  55. package/dist/yaml.js +6 -4
  56. package/dist/yaml.js.map +1 -1
  57. package/fixtures/README.md +87 -27
  58. package/fixtures/cases/any-without-type/context.json +1 -0
  59. package/fixtures/cases/binary-any-reference/context.json +5 -0
  60. package/fixtures/cases/binary-any-reference/expected.json +7 -0
  61. package/fixtures/cases/binary-any-reference/library/notes/draft.md +6 -0
  62. package/fixtures/cases/binary-any-reference/library/types/note.md +5 -0
  63. package/fixtures/cases/binary-document-collision/context.json +5 -0
  64. package/fixtures/cases/binary-document-collision/expected.json +6 -0
  65. package/fixtures/cases/binary-document-collision/library/notes/draft.md +3 -0
  66. package/fixtures/cases/binary-document-collision/library/types/note.md +3 -0
  67. package/fixtures/cases/binary-link-outside-collection/context.json +6 -0
  68. package/fixtures/cases/binary-link-outside-collection/expected.json +6 -0
  69. package/fixtures/cases/binary-link-outside-collection/library/notes/draft.md +5 -0
  70. package/fixtures/cases/binary-link-outside-collection/library/types/note.md +3 -0
  71. package/fixtures/cases/binary-prototype-reference/context.json +1 -0
  72. package/fixtures/cases/binary-prototype-reference/expected.json +7 -0
  73. package/fixtures/cases/binary-prototype-reference/library/notes/draft.md +6 -0
  74. package/fixtures/cases/binary-prototype-reference/library/types/note.md +5 -0
  75. package/fixtures/cases/binary-typed-reference/context.json +5 -0
  76. package/fixtures/cases/binary-typed-reference/expected.json +7 -0
  77. package/fixtures/cases/binary-typed-reference/library/notes/draft.md +6 -0
  78. package/fixtures/cases/binary-typed-reference/library/types/note.md +5 -0
  79. package/fixtures/cases/binary-typed-reference/library/types/person.md +3 -0
  80. package/fixtures/cases/bracketed-link-definition/context.json +1 -0
  81. package/fixtures/cases/bracketed-link-definition/expected.json +1 -0
  82. package/fixtures/cases/bracketed-link-definition/library/item.md +10 -0
  83. package/fixtures/cases/bracketed-link-definition/library/types/task.md +7 -0
  84. package/fixtures/cases/declared-binary-links/context.json +6 -0
  85. package/fixtures/cases/declared-binary-links/expected.json +1 -0
  86. package/fixtures/cases/declared-binary-links/library/notes/draft.md +7 -0
  87. package/fixtures/cases/declared-binary-links/library/types/note.md +3 -0
  88. package/fixtures/cases/duplicate-link-definition/context.json +1 -0
  89. package/fixtures/cases/duplicate-link-definition/expected.json +1 -0
  90. package/fixtures/cases/duplicate-link-definition/library/item.md +11 -0
  91. package/fixtures/cases/duplicate-link-definition/library/types/task.md +7 -0
  92. package/fixtures/cases/fenced-link-definition/context.json +1 -0
  93. package/fixtures/cases/fenced-link-definition/expected.json +1 -0
  94. package/fixtures/cases/fenced-link-definition/library/item.md +12 -0
  95. package/fixtures/cases/fenced-link-definition/library/types/task.md +7 -0
  96. package/fixtures/cases/field-enum/context.json +1 -0
  97. package/fixtures/cases/interrupted-link-definition/context.json +1 -0
  98. package/fixtures/cases/interrupted-link-definition/expected.json +1 -0
  99. package/fixtures/cases/interrupted-link-definition/library/notes/draft.md +8 -0
  100. package/fixtures/cases/interrupted-link-definition/library/types/note.md +3 -0
  101. package/fixtures/cases/long-fence-link-definition/context.json +1 -0
  102. package/fixtures/cases/long-fence-link-definition/expected.json +1 -0
  103. package/fixtures/cases/long-fence-link-definition/library/notes/draft.md +9 -0
  104. package/fixtures/cases/long-fence-link-definition/library/types/note.md +3 -0
  105. package/fixtures/cases/malformed-definition/context.json +1 -0
  106. package/fixtures/cases/missing-binary-image/context.json +6 -0
  107. package/fixtures/cases/missing-binary-image/expected.json +6 -0
  108. package/fixtures/cases/missing-binary-image/library/notes/draft.md +5 -0
  109. package/fixtures/cases/missing-binary-image/library/types/note.md +3 -0
  110. package/fixtures/cases/missing-binary-link/context.json +6 -0
  111. package/fixtures/cases/missing-binary-link/expected.json +6 -0
  112. package/fixtures/cases/missing-binary-link/library/notes/draft.md +5 -0
  113. package/fixtures/cases/missing-binary-link/library/types/note.md +3 -0
  114. package/fixtures/cases/missing-required-field/context.json +1 -0
  115. package/fixtures/cases/missing-section-item-kind/context.json +1 -0
  116. package/fixtures/cases/missing-section-item-kind/expected.json +7 -0
  117. package/fixtures/cases/missing-section-item-kind/library/types/task.md +7 -0
  118. package/fixtures/cases/paragraph-link-definition/context.json +5 -0
  119. package/fixtures/cases/paragraph-link-definition/expected.json +1 -0
  120. package/fixtures/cases/paragraph-link-definition/library/notes/draft.md +10 -0
  121. package/fixtures/cases/paragraph-link-definition/library/types/note.md +3 -0
  122. package/fixtures/cases/prd-definition/context.json +1 -0
  123. package/fixtures/cases/prd-definition/library/types/task.md +2 -1
  124. package/fixtures/cases/prototype-field/context.json +1 -0
  125. package/fixtures/cases/prototype-field/expected.json +7 -0
  126. package/fixtures/cases/prototype-field/library/item.md +9 -0
  127. package/fixtures/cases/prototype-field/library/types/task.md +7 -0
  128. package/fixtures/cases/quoted-link-definition/context.json +1 -0
  129. package/fixtures/cases/quoted-link-definition/expected.json +6 -0
  130. package/fixtures/cases/quoted-link-definition/library/notes/draft.md +7 -0
  131. package/fixtures/cases/quoted-link-definition/library/types/note.md +3 -0
  132. package/fixtures/cases/referenced-missing-file/context.json +1 -0
  133. package/fixtures/cases/structured-section/context.json +1 -0
  134. package/fixtures/cases/structured-section/library/types/task.md +1 -1
  135. package/fixtures/cases/truncated-link-definition/context.json +1 -0
  136. package/fixtures/cases/truncated-link-definition/expected.json +6 -0
  137. package/fixtures/cases/truncated-link-definition/library/notes/draft.md +7 -0
  138. package/fixtures/cases/truncated-link-definition/library/notes/other.md +5 -0
  139. package/fixtures/cases/truncated-link-definition/library/types/note.md +3 -0
  140. package/fixtures/cases/unclosed-frontmatter/context.json +1 -0
  141. package/fixtures/cases/undeclared-field/context.json +1 -0
  142. package/fixtures/cases/undeclared-field/expected.json +7 -0
  143. package/fixtures/cases/undeclared-field/library/item.md +9 -0
  144. package/fixtures/cases/undeclared-field/library/types/task.md +7 -0
  145. package/fixtures/cases/unresolved-link/context.json +1 -0
  146. package/fixtures/cases/valid-typed-document/context.json +1 -0
  147. package/fixtures/cases/valid-typed-document/library/tasks/one.md +1 -0
  148. package/fixtures/cases/valid-typed-document/library/types/task.md +2 -1
  149. package/fixtures/cases/wide-item-fence-link/context.json +1 -0
  150. package/fixtures/cases/wide-item-fence-link/expected.json +1 -0
  151. package/fixtures/cases/wide-item-fence-link/library/notes/draft.md +7 -0
  152. package/fixtures/cases/wide-item-fence-link/library/types/note.md +3 -0
  153. package/fixtures/division.json +415 -0
  154. package/fixtures/preamble.json +107 -0
  155. package/fixtures/projection.json +186 -0
  156. package/package.json +4 -5
package/dist/index.js CHANGED
@@ -1,5 +1,7 @@
1
- export { apply, parse, serialize } from './document.js';
1
+ export { divide } from './divide.js';
2
+ export { apply, links, parse, serialize } from './document.js';
2
3
  export { MARKDOWN_SYNTAX_PROFILE } from './profile.js';
4
+ export { project } from './project.js';
3
5
  export { validate } from './validate.js';
4
6
  export { VERSION } from './version.js';
5
7
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/executor/code/agents.house/mdmodel/packages/mdmodel/src/index.ts"],"sourcesContent":["export { apply, parse, serialize } from './document.js';\nexport { MARKDOWN_SYNTAX_PROFILE } from './profile.js';\nexport type {\n ApplyResult,\n Change,\n Document,\n Library,\n ParseResult,\n Refusal,\n Validation,\n} from './types.js';\nexport { validate } from './validate.js';\nexport { VERSION } from './version.js';\n"],"names":["apply","parse","serialize","MARKDOWN_SYNTAX_PROFILE","validate","VERSION"],"mappings":"AAAA,SAASA,KAAK,EAAEC,KAAK,EAAEC,SAAS,QAAQ,gBAAgB;AACxD,SAASC,uBAAuB,QAAQ,eAAe;AAUvD,SAASC,QAAQ,QAAQ,gBAAgB;AACzC,SAASC,OAAO,QAAQ,eAAe"}
1
+ {"version":3,"sources":["/workspace/packages/mdmodel/src/index.ts"],"sourcesContent":["export { divide } from './divide.js';\nexport { apply, links, parse, serialize } from './document.js';\nexport { MARKDOWN_SYNTAX_PROFILE } from './profile.js';\nexport { project } from './project.js';\nexport type {\n ApplyResult,\n Change,\n Division,\n DivisionContext,\n Document,\n Library,\n Link,\n ParseResult,\n Projection,\n ProjectionContext,\n Refusal,\n Span,\n Validation,\n ValidationContext,\n} from './types.js';\nexport { validate } from './validate.js';\nexport { VERSION } from './version.js';\n"],"names":["divide","apply","links","parse","serialize","MARKDOWN_SYNTAX_PROFILE","project","validate","VERSION"],"mappings":"AAAA,SAASA,MAAM,QAAQ,cAAc;AACrC,SAASC,KAAK,EAAEC,KAAK,EAAEC,KAAK,EAAEC,SAAS,QAAQ,gBAAgB;AAC/D,SAASC,uBAAuB,QAAQ,eAAe;AACvD,SAASC,OAAO,QAAQ,eAAe;AAiBvC,SAASC,QAAQ,QAAQ,gBAAgB;AACzC,SAASC,OAAO,QAAQ,eAAe"}
package/dist/links.d.ts CHANGED
@@ -1,2 +1,26 @@
1
- export declare function extractRelativeHrefs(body: string): string[];
1
+ export type HrefOccurrence = {
2
+ readonly href: string;
3
+ readonly start: number;
4
+ readonly end: number;
5
+ readonly bracketed: boolean;
6
+ };
7
+ export type LinkUse = {
8
+ readonly start: number;
9
+ readonly end: number;
10
+ readonly labelStart: number;
11
+ readonly labelEnd: number;
12
+ readonly destination: HrefOccurrence;
13
+ };
14
+ export type DefinitionBlock = {
15
+ readonly start: number;
16
+ readonly end: number;
17
+ readonly destination: HrefOccurrence;
18
+ };
19
+ export type LinkInventory = {
20
+ readonly uses: readonly LinkUse[];
21
+ readonly blocks: readonly DefinitionBlock[];
22
+ };
23
+ export declare function fenceSpans(text: string): readonly (readonly [number, number])[];
24
+ export declare function linkInventory(body: string): LinkInventory;
25
+ export declare function hrefOccurrences(body: string): readonly HrefOccurrence[];
2
26
  //# sourceMappingURL=links.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../src/links.ts"],"names":[],"mappings":"AAoHA,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA4B3D"}
1
+ {"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../src/links.ts"],"names":[],"mappings":"AA8WA,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;CAC7C,CAAC;AAEF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAE/E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAyBzD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,cAAc,EAAE,CAIvE"}
package/dist/links.js CHANGED
@@ -1,17 +1,127 @@
1
- function atLineStart(text, index) {
2
- if (index === 0) return true;
3
- const prev = text[index - 1];
4
- return prev === '\n' || prev === '\r';
1
+ const TAB_STOP = 4;
2
+ const CLOSING_FENCE_INDENT = 3;
3
+ const HEADING = /^#{1,6}(?:[ \t]|$)/;
4
+ const BREAK = /^(?:(?:\*[ \t]*){3,}|(?:-[ \t]*){3,}|(?:_[ \t]*){3,})$/;
5
+ const SETEXT = /^(?:=+|-+)[ \t]*$/;
6
+ const LABEL = /^\[((?:[^\\\]\n]|\\.)+)\]:[ \t]*/;
7
+ const DESTINATION = /^(?:(<[^<>\n\r]*>)|([^\s<][^\s]*))/d;
8
+ const TITLE = /^(?:"[^"\n]*"|'[^'\n]*'|\([^()\n]*\))[ \t]*$/;
9
+ function endOfLine(text, from) {
10
+ const nl = text.indexOf('\n', from);
11
+ return nl === -1 ? text.length : nl;
5
12
  }
6
- function skipFence(text, index) {
13
+ function afterLine(text, end) {
14
+ return end < text.length ? end + 1 : text.length;
15
+ }
16
+ function itemMarker(text, index, end) {
7
17
  let i = index;
8
- while(i < text.length && (text[i] === ' ' || text[i] === '\t'))i += 1;
9
- const marker = text.startsWith('```', i) ? '```' : text.startsWith('~~~', i) ? '~~~' : null;
10
- if (marker === null) return index + 1;
11
- i += marker.length;
12
- const close = text.indexOf(marker, i);
13
- if (close === -1) return text.length;
14
- return close + marker.length;
18
+ const bullet = text[i];
19
+ if (bullet === '-' || bullet === '*' || bullet === '+') i += 1;
20
+ else {
21
+ let digits = 0;
22
+ while(digits < 9 && i + digits < end && text[i + digits] >= '0' && text[i + digits] <= '9')digits += 1;
23
+ const delimiter = text[i + digits];
24
+ if (digits === 0 || delimiter !== '.' && delimiter !== ')') return null;
25
+ i += digits + 1;
26
+ }
27
+ if (i >= end) return i;
28
+ if (text[i] !== ' ' && text[i] !== '\t') return null;
29
+ return i + 1;
30
+ }
31
+ function readLine(text, start, end) {
32
+ let i = start;
33
+ let depth = 0;
34
+ let item = false;
35
+ let inner = start;
36
+ for(;;){
37
+ let spaces = 0;
38
+ while(spaces < 3 && i < end && text[i] === ' '){
39
+ i += 1;
40
+ spaces += 1;
41
+ }
42
+ if (i < end && text[i] === '>') {
43
+ depth += 1;
44
+ i += 1;
45
+ if (i < end && text[i] === ' ') i += 1;
46
+ inner = i;
47
+ continue;
48
+ }
49
+ const after = i < end ? itemMarker(text, i, end) : null;
50
+ if (after === null) break;
51
+ item = true;
52
+ i = after;
53
+ }
54
+ return {
55
+ start,
56
+ end,
57
+ content: i,
58
+ depth,
59
+ item,
60
+ inner
61
+ };
62
+ }
63
+ function widthOf(text, from, to) {
64
+ let width = 0;
65
+ for(let i = from; i < to; i += 1)width += text[i] === '\t' ? TAB_STOP - width % TAB_STOP : 1;
66
+ return width;
67
+ }
68
+ function afterIndent(text, line) {
69
+ let i = line.inner;
70
+ while(i < line.end && (text[i] === ' ' || text[i] === '\t'))i += 1;
71
+ return i;
72
+ }
73
+ function indentWidth(text, line) {
74
+ return widthOf(text, line.inner, afterIndent(text, line));
75
+ }
76
+ function lineText(text, line) {
77
+ const raw = text.slice(line.content, line.end);
78
+ return raw.endsWith('\r') ? raw.slice(0, -1) : raw;
79
+ }
80
+ function fenceRun(text, at, end) {
81
+ const char = text[at];
82
+ if (char !== '`' && char !== '~') return null;
83
+ let length = 0;
84
+ while(at + length < end && text[at + length] === char)length += 1;
85
+ return length < 3 ? null : {
86
+ char,
87
+ length
88
+ };
89
+ }
90
+ function fenceAt(text, line) {
91
+ const run = fenceRun(text, line.content, line.end);
92
+ if (run === null) return null;
93
+ return {
94
+ char: run.char,
95
+ length: run.length,
96
+ depth: line.depth,
97
+ column: line.item ? widthOf(text, line.inner, line.content) : 0,
98
+ item: line.item
99
+ };
100
+ }
101
+ function closesFence(text, line, open) {
102
+ if (line.depth !== open.depth || line.item) return false;
103
+ const indent = indentWidth(text, line);
104
+ if (indent < open.column || indent > open.column + CLOSING_FENCE_INDENT) return false;
105
+ const at = afterIndent(text, line);
106
+ const run = fenceRun(text, at, line.end);
107
+ if (run === null || run.char !== open.char || run.length < open.length) return false;
108
+ return text.slice(at + run.length, line.end).trim() === '';
109
+ }
110
+ function leavesContainer(text, line, open) {
111
+ if (line.depth < open.depth) return true;
112
+ if (!open.item || lineText(text, line).trim() === '') return false;
113
+ return indentWidth(text, line) < open.column;
114
+ }
115
+ function fenceSpan(text, line, open) {
116
+ let cursor = afterLine(text, line.end);
117
+ while(cursor < text.length){
118
+ const end = endOfLine(text, cursor);
119
+ const next = readLine(text, cursor, end);
120
+ if (leavesContainer(text, next, open)) return cursor;
121
+ if (closesFence(text, next, open)) return afterLine(text, end);
122
+ cursor = afterLine(text, end);
123
+ }
124
+ return text.length;
15
125
  }
16
126
  function skipInlineCode(text, index) {
17
127
  let ticks = 0;
@@ -40,11 +150,16 @@ function skipTitle(text, start) {
40
150
  }
41
151
  function destination(text, start) {
42
152
  let i = skipLinkSpace(text, start + 1);
43
- let href;
153
+ let occurrence;
44
154
  if (text[i] === '<') {
45
155
  const close = text.indexOf('>', i + 1);
46
156
  if (close === -1) return null;
47
- href = text.slice(i + 1, close);
157
+ occurrence = {
158
+ href: text.slice(i + 1, close),
159
+ start: i,
160
+ end: close + 1,
161
+ bracketed: true
162
+ };
48
163
  i = close + 1;
49
164
  } else {
50
165
  const from = i;
@@ -59,7 +174,12 @@ function destination(text, start) {
59
174
  }
60
175
  i += 1;
61
176
  }
62
- href = text.slice(from, i);
177
+ occurrence = {
178
+ href: text.slice(from, i),
179
+ start: from,
180
+ end: i,
181
+ bracketed: false
182
+ };
63
183
  }
64
184
  i = skipLinkSpace(text, i);
65
185
  const afterTitle = skipTitle(text, i);
@@ -67,76 +187,197 @@ function destination(text, start) {
67
187
  i = skipLinkSpace(text, afterTitle);
68
188
  if (text[i] !== ')') return null;
69
189
  return {
70
- href,
190
+ occurrence,
71
191
  end: i + 1
72
192
  };
73
193
  }
74
- function takeLink(text, index, hrefs, defs) {
75
- let i = index + 1;
194
+ function labelEnd(text, start) {
195
+ let i = start;
76
196
  let depth = 1;
77
197
  while(i < text.length && depth > 0){
78
198
  const ch = text[i];
199
+ if (ch === '\\') {
200
+ i += 2;
201
+ continue;
202
+ }
79
203
  if (ch === '[') depth += 1;
80
204
  else if (ch === ']') depth -= 1;
81
- else if (ch === '\n' || ch === '\r') return index + 1;
205
+ else if (ch === '\n' || ch === '\r') return -1;
82
206
  i += 1;
83
207
  }
84
- if (depth !== 0) return index + 1;
85
- const label = text.slice(index + 1, i - 1);
208
+ return depth === 0 ? i : -1;
209
+ }
210
+ function takeLink(text, index, start, found, defs) {
211
+ const end = labelEnd(text, index + 1);
212
+ if (end === -1) return index + 1;
213
+ const label = text.slice(index + 1, end - 1);
214
+ let i = end;
86
215
  if (text[i] === '(') {
87
216
  const dest = destination(text, i);
88
217
  if (dest === null) return index + 1;
89
- hrefs.push(dest.href);
218
+ found.push({
219
+ start,
220
+ end: dest.end,
221
+ labelStart: index + 1,
222
+ labelEnd: end - 1,
223
+ destination: dest.occurrence
224
+ });
90
225
  return dest.end;
91
226
  }
92
227
  if (text[i] === '[') {
93
- const close = text.indexOf(']', i + 1);
228
+ const close = labelEnd(text, i + 1);
94
229
  if (close === -1) return index + 1;
95
- const id = (text.slice(i + 1, close) || label).trim().toLowerCase();
96
- const href = defs.get(id);
97
- if (href !== undefined) hrefs.push(href);
98
- return close + 1;
230
+ const id = (text.slice(i + 1, close - 1) || label).trim().toLowerCase();
231
+ const defined = defs.get(id);
232
+ if (defined !== undefined) {
233
+ found.push({
234
+ start,
235
+ end: close,
236
+ labelStart: index + 1,
237
+ labelEnd: end - 1,
238
+ destination: defined
239
+ });
240
+ }
241
+ return close;
99
242
  }
100
243
  return i;
101
244
  }
102
- function collectDefinitions(text) {
103
- const defs = new Map();
104
- const pattern = /^ {0,3}\[([^\]]+)\]:[ \t]+<?([^\s>]+)>?/gm;
105
- for (const match of text.matchAll(pattern)){
106
- const id = match[1]?.trim().toLowerCase();
107
- const href = match[2];
108
- if (id !== undefined && href !== undefined) defs.set(id, href);
245
+ function definitionDestination(text, from, to) {
246
+ let i = from;
247
+ while(i < to && (text[i] === ' ' || text[i] === '\t'))i += 1;
248
+ const match = DESTINATION.exec(text.slice(i, to));
249
+ if (match === null) return null;
250
+ const bracketed = match[1];
251
+ const span = match.indices?.[1] ?? match.indices?.[2];
252
+ const href = bracketed === undefined ? match[2] : bracketed.slice(1, -1);
253
+ if (href === undefined || span === undefined) return null;
254
+ return {
255
+ href,
256
+ start: i + span[0],
257
+ end: i + span[1],
258
+ bracketed: bracketed !== undefined
259
+ };
260
+ }
261
+ function definitionAt(text, line) {
262
+ const head = LABEL.exec(lineText(text, line));
263
+ if (head === null) return null;
264
+ const id = head[1]?.trim().toLowerCase();
265
+ if (id === undefined || id === '') return null;
266
+ const from = line.content + head[0].length;
267
+ let occurrence = definitionDestination(text, from, line.end);
268
+ let next = afterLine(text, line.end);
269
+ if (occurrence === null) {
270
+ if (text.slice(from, line.end).trim() !== '' || next >= text.length) return null;
271
+ const end = endOfLine(text, next);
272
+ occurrence = definitionDestination(text, readLine(text, next, end).content, end);
273
+ if (occurrence === null) return null;
274
+ next = afterLine(text, end);
275
+ }
276
+ if (next < text.length) {
277
+ const end = endOfLine(text, next);
278
+ if (TITLE.test(lineText(text, readLine(text, next, end)))) next = afterLine(text, end);
279
+ }
280
+ return {
281
+ id,
282
+ occurrence,
283
+ next
284
+ };
285
+ }
286
+ function endsBlock(content) {
287
+ return HEADING.test(content) || BREAK.test(content) || SETEXT.test(content);
288
+ }
289
+ function scanBlocks(text) {
290
+ const fences = [];
291
+ const definitions = new Map();
292
+ const blocks = [];
293
+ let paragraph = false;
294
+ let depth = 0;
295
+ let i = 0;
296
+ while(i < text.length){
297
+ const line = readLine(text, i, endOfLine(text, i));
298
+ if (line.depth !== depth || line.item) paragraph = false;
299
+ depth = line.depth;
300
+ const open = fenceAt(text, line);
301
+ if (open !== null) {
302
+ const stop = fenceSpan(text, line, open);
303
+ fences.push([
304
+ i,
305
+ stop
306
+ ]);
307
+ paragraph = false;
308
+ i = stop;
309
+ continue;
310
+ }
311
+ const content = lineText(text, line);
312
+ if (content.trim() === '') {
313
+ paragraph = false;
314
+ i = afterLine(text, line.end);
315
+ continue;
316
+ }
317
+ const definition = paragraph ? null : definitionAt(text, line);
318
+ if (definition !== null) {
319
+ if (!definitions.has(definition.id)) definitions.set(definition.id, definition.occurrence);
320
+ blocks.push({
321
+ start: line.start,
322
+ end: definition.next,
323
+ destination: definition.occurrence
324
+ });
325
+ i = definition.next;
326
+ continue;
327
+ }
328
+ paragraph = !endsBlock(content);
329
+ i = afterLine(text, line.end);
330
+ }
331
+ return {
332
+ fences,
333
+ definitions,
334
+ blocks
335
+ };
336
+ }
337
+ function fenceEndAt(spans, index) {
338
+ for (const [start, end] of spans){
339
+ if (index >= start && index < end) return end;
109
340
  }
110
- return defs;
341
+ return undefined;
342
+ }
343
+ export function fenceSpans(text) {
344
+ return scanBlocks(text).fences;
111
345
  }
112
- export function extractRelativeHrefs(body) {
113
- const defs = collectDefinitions(body);
114
- const hrefs = [];
346
+ export function linkInventory(body) {
347
+ const { fences, definitions, blocks } = scanBlocks(body);
348
+ const uses = [];
115
349
  let i = 0;
116
350
  while(i < body.length){
117
- if (atLineStart(body, i) || i > 0 && (body[i - 1] === '\n' || body[i - 1] === '\r')) {
118
- let j = i;
119
- while(body[j] === ' ' && j - i < 3)j += 1;
120
- if (body.startsWith('```', j) || body.startsWith('~~~', j)) {
121
- i = skipFence(body, i);
122
- continue;
123
- }
351
+ const fenceEnd = fenceEndAt(fences, i);
352
+ if (fenceEnd !== undefined) {
353
+ i = fenceEnd;
354
+ continue;
124
355
  }
125
356
  if (body[i] === '`') {
126
357
  i = skipInlineCode(body, i);
127
358
  continue;
128
359
  }
129
360
  if (body[i] === '!' && body[i + 1] === '[') {
130
- i = takeLink(body, i + 1, hrefs, defs);
361
+ i = takeLink(body, i + 1, i, uses, definitions);
131
362
  continue;
132
363
  }
133
364
  if (body[i] === '[') {
134
- i = takeLink(body, i, hrefs, defs);
365
+ i = takeLink(body, i, i, uses, definitions);
135
366
  continue;
136
367
  }
137
368
  i += 1;
138
369
  }
139
- return hrefs;
370
+ return {
371
+ uses,
372
+ blocks
373
+ };
374
+ }
375
+ export function hrefOccurrences(body) {
376
+ const byStart = new Map();
377
+ for (const use of linkInventory(body).uses)byStart.set(use.destination.start, use.destination);
378
+ return [
379
+ ...byStart.values()
380
+ ].sort((left, right)=>left.start - right.start);
140
381
  }
141
382
 
142
383
  //# sourceMappingURL=links.js.map
package/dist/links.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/executor/code/agents.house/mdmodel/packages/mdmodel/src/links.ts"],"sourcesContent":["function atLineStart(text: string, index: number): boolean {\n if (index === 0) return true;\n const prev = text[index - 1];\n return prev === '\\n' || prev === '\\r';\n}\n\nfunction skipFence(text: string, index: number): number {\n let i = index;\n while (i < text.length && (text[i] === ' ' || text[i] === '\\t')) i += 1;\n const marker = text.startsWith('```', i) ? '```' : text.startsWith('~~~', i) ? '~~~' : null;\n if (marker === null) return index + 1;\n i += marker.length;\n const close = text.indexOf(marker, i);\n if (close === -1) return text.length;\n return close + marker.length;\n}\n\nfunction skipInlineCode(text: string, index: number): number {\n let ticks = 0;\n while (text[index + ticks] === '`') ticks += 1;\n const close = text.indexOf('`'.repeat(ticks), index + ticks);\n if (close === -1) return text.length;\n return close + ticks;\n}\n\nfunction skipLinkSpace(text: string, start: number): number {\n let i = start;\n while (text[i] === ' ' || text[i] === '\\t') i += 1;\n return i;\n}\n\nfunction skipTitle(text: string, start: number): number | null {\n const open = text[start];\n if (open !== '\"' && open !== \"'\" && open !== '(') return start;\n const close = open === '(' ? ')' : open;\n let i = start + 1;\n while (i < text.length) {\n const ch = text[i]!;\n if (ch === close) return i + 1;\n if (ch === '\\n' || ch === '\\r') return null;\n i += 1;\n }\n return null;\n}\n\nfunction destination(text: string, start: number): { href: string; end: number } | null {\n let i = skipLinkSpace(text, start + 1);\n let href: string;\n if (text[i] === '<') {\n const close = text.indexOf('>', i + 1);\n if (close === -1) return null;\n href = text.slice(i + 1, close);\n i = close + 1;\n } else {\n const from = i;\n let depth = 0;\n while (i < text.length) {\n const ch = text[i]!;\n if (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') break;\n if (ch === '(') depth += 1;\n else if (ch === ')') {\n if (depth === 0) break;\n depth -= 1;\n }\n i += 1;\n }\n href = text.slice(from, i);\n }\n i = skipLinkSpace(text, i);\n const afterTitle = skipTitle(text, i);\n if (afterTitle === null) return null;\n i = skipLinkSpace(text, afterTitle);\n if (text[i] !== ')') return null;\n return { href, end: i + 1 };\n}\n\nfunction takeLink(text: string, index: number, hrefs: string[], defs: Map<string, string>): number {\n let i = index + 1;\n let depth = 1;\n while (i < text.length && depth > 0) {\n const ch = text[i]!;\n if (ch === '[') depth += 1;\n else if (ch === ']') depth -= 1;\n else if (ch === '\\n' || ch === '\\r') return index + 1;\n i += 1;\n }\n if (depth !== 0) return index + 1;\n const label = text.slice(index + 1, i - 1);\n if (text[i] === '(') {\n const dest = destination(text, i);\n if (dest === null) return index + 1;\n hrefs.push(dest.href);\n return dest.end;\n }\n if (text[i] === '[') {\n const close = text.indexOf(']', i + 1);\n if (close === -1) return index + 1;\n const id = (text.slice(i + 1, close) || label).trim().toLowerCase();\n const href = defs.get(id);\n if (href !== undefined) hrefs.push(href);\n return close + 1;\n }\n return i;\n}\n\nfunction collectDefinitions(text: string): Map<string, string> {\n const defs = new Map<string, string>();\n const pattern = /^ {0,3}\\[([^\\]]+)\\]:[ \\t]+<?([^\\s>]+)>?/gm;\n for (const match of text.matchAll(pattern)) {\n const id = match[1]?.trim().toLowerCase();\n const href = match[2];\n if (id !== undefined && href !== undefined) defs.set(id, href);\n }\n return defs;\n}\n\nexport function extractRelativeHrefs(body: string): string[] {\n const defs = collectDefinitions(body);\n const hrefs: string[] = [];\n let i = 0;\n while (i < body.length) {\n if (atLineStart(body, i) || (i > 0 && (body[i - 1] === '\\n' || body[i - 1] === '\\r'))) {\n let j = i;\n while (body[j] === ' ' && j - i < 3) j += 1;\n if (body.startsWith('```', j) || body.startsWith('~~~', j)) {\n i = skipFence(body, i);\n continue;\n }\n }\n if (body[i] === '`') {\n i = skipInlineCode(body, i);\n continue;\n }\n if (body[i] === '!' && body[i + 1] === '[') {\n i = takeLink(body, i + 1, hrefs, defs);\n continue;\n }\n if (body[i] === '[') {\n i = takeLink(body, i, hrefs, defs);\n continue;\n }\n i += 1;\n }\n return hrefs;\n}\n"],"names":["atLineStart","text","index","prev","skipFence","i","length","marker","startsWith","close","indexOf","skipInlineCode","ticks","repeat","skipLinkSpace","start","skipTitle","open","ch","destination","href","slice","from","depth","afterTitle","end","takeLink","hrefs","defs","label","dest","push","id","trim","toLowerCase","get","undefined","collectDefinitions","Map","pattern","match","matchAll","set","extractRelativeHrefs","body","j"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdmodel/src/links.ts"],"sourcesContent":["type Fence = {\n readonly char: string;\n readonly length: number;\n readonly depth: number;\n readonly column: number;\n readonly item: boolean;\n};\n\ntype Line = {\n readonly start: number;\n readonly end: number;\n readonly content: number;\n readonly depth: number;\n readonly item: boolean;\n readonly inner: number;\n};\n\nconst TAB_STOP = 4;\nconst CLOSING_FENCE_INDENT = 3;\n\nconst HEADING = /^#{1,6}(?:[ \\t]|$)/;\nconst BREAK = /^(?:(?:\\*[ \\t]*){3,}|(?:-[ \\t]*){3,}|(?:_[ \\t]*){3,})$/;\nconst SETEXT = /^(?:=+|-+)[ \\t]*$/;\nconst LABEL = /^\\[((?:[^\\\\\\]\\n]|\\\\.)+)\\]:[ \\t]*/;\nconst DESTINATION = /^(?:(<[^<>\\n\\r]*>)|([^\\s<][^\\s]*))/d;\nconst TITLE = /^(?:\"[^\"\\n]*\"|'[^'\\n]*'|\\([^()\\n]*\\))[ \\t]*$/;\n\nfunction endOfLine(text: string, from: number): number {\n const nl = text.indexOf('\\n', from);\n return nl === -1 ? text.length : nl;\n}\n\nfunction afterLine(text: string, end: number): number {\n return end < text.length ? end + 1 : text.length;\n}\n\nfunction itemMarker(text: string, index: number, end: number): number | null {\n let i = index;\n const bullet = text[i];\n if (bullet === '-' || bullet === '*' || bullet === '+') i += 1;\n else {\n let digits = 0;\n while (digits < 9 && i + digits < end && text[i + digits]! >= '0' && text[i + digits]! <= '9')\n digits += 1;\n const delimiter = text[i + digits];\n if (digits === 0 || (delimiter !== '.' && delimiter !== ')')) return null;\n i += digits + 1;\n }\n if (i >= end) return i;\n if (text[i] !== ' ' && text[i] !== '\\t') return null;\n return i + 1;\n}\n\nfunction readLine(text: string, start: number, end: number): Line {\n let i = start;\n let depth = 0;\n let item = false;\n let inner = start;\n for (;;) {\n let spaces = 0;\n while (spaces < 3 && i < end && text[i] === ' ') {\n i += 1;\n spaces += 1;\n }\n if (i < end && text[i] === '>') {\n depth += 1;\n i += 1;\n if (i < end && text[i] === ' ') i += 1;\n inner = i;\n continue;\n }\n const after = i < end ? itemMarker(text, i, end) : null;\n if (after === null) break;\n item = true;\n i = after;\n }\n return { start, end, content: i, depth, item, inner };\n}\n\nfunction widthOf(text: string, from: number, to: number): number {\n let width = 0;\n for (let i = from; i < to; i += 1) width += text[i] === '\\t' ? TAB_STOP - (width % TAB_STOP) : 1;\n return width;\n}\n\nfunction afterIndent(text: string, line: Line): number {\n let i = line.inner;\n while (i < line.end && (text[i] === ' ' || text[i] === '\\t')) i += 1;\n return i;\n}\n\nfunction indentWidth(text: string, line: Line): number {\n return widthOf(text, line.inner, afterIndent(text, line));\n}\n\nfunction lineText(text: string, line: Line): string {\n const raw = text.slice(line.content, line.end);\n return raw.endsWith('\\r') ? raw.slice(0, -1) : raw;\n}\n\nfunction fenceRun(\n text: string,\n at: number,\n end: number,\n): { readonly char: string; readonly length: number } | null {\n const char = text[at];\n if (char !== '`' && char !== '~') return null;\n let length = 0;\n while (at + length < end && text[at + length] === char) length += 1;\n return length < 3 ? null : { char, length };\n}\n\nfunction fenceAt(text: string, line: Line): Fence | null {\n const run = fenceRun(text, line.content, line.end);\n if (run === null) return null;\n return {\n char: run.char,\n length: run.length,\n depth: line.depth,\n column: line.item ? widthOf(text, line.inner, line.content) : 0,\n item: line.item,\n };\n}\n\nfunction closesFence(text: string, line: Line, open: Fence): boolean {\n if (line.depth !== open.depth || line.item) return false;\n const indent = indentWidth(text, line);\n if (indent < open.column || indent > open.column + CLOSING_FENCE_INDENT) return false;\n const at = afterIndent(text, line);\n const run = fenceRun(text, at, line.end);\n if (run === null || run.char !== open.char || run.length < open.length) return false;\n return text.slice(at + run.length, line.end).trim() === '';\n}\n\nfunction leavesContainer(text: string, line: Line, open: Fence): boolean {\n if (line.depth < open.depth) return true;\n if (!open.item || lineText(text, line).trim() === '') return false;\n return indentWidth(text, line) < open.column;\n}\n\nfunction fenceSpan(text: string, line: Line, open: Fence): number {\n let cursor = afterLine(text, line.end);\n while (cursor < text.length) {\n const end = endOfLine(text, cursor);\n const next = readLine(text, cursor, end);\n if (leavesContainer(text, next, open)) return cursor;\n if (closesFence(text, next, open)) return afterLine(text, end);\n cursor = afterLine(text, end);\n }\n return text.length;\n}\n\nfunction skipInlineCode(text: string, index: number): number {\n let ticks = 0;\n while (text[index + ticks] === '`') ticks += 1;\n const close = text.indexOf('`'.repeat(ticks), index + ticks);\n if (close === -1) return text.length;\n return close + ticks;\n}\n\nfunction skipLinkSpace(text: string, start: number): number {\n let i = start;\n while (text[i] === ' ' || text[i] === '\\t') i += 1;\n return i;\n}\n\nfunction skipTitle(text: string, start: number): number | null {\n const open = text[start];\n if (open !== '\"' && open !== \"'\" && open !== '(') return start;\n const close = open === '(' ? ')' : open;\n let i = start + 1;\n while (i < text.length) {\n const ch = text[i]!;\n if (ch === close) return i + 1;\n if (ch === '\\n' || ch === '\\r') return null;\n i += 1;\n }\n return null;\n}\n\nfunction destination(\n text: string,\n start: number,\n): { occurrence: HrefOccurrence; end: number } | null {\n let i = skipLinkSpace(text, start + 1);\n let occurrence: HrefOccurrence;\n if (text[i] === '<') {\n const close = text.indexOf('>', i + 1);\n if (close === -1) return null;\n occurrence = { href: text.slice(i + 1, close), start: i, end: close + 1, bracketed: true };\n i = close + 1;\n } else {\n const from = i;\n let depth = 0;\n while (i < text.length) {\n const ch = text[i]!;\n if (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') break;\n if (ch === '(') depth += 1;\n else if (ch === ')') {\n if (depth === 0) break;\n depth -= 1;\n }\n i += 1;\n }\n occurrence = { href: text.slice(from, i), start: from, end: i, bracketed: false };\n }\n i = skipLinkSpace(text, i);\n const afterTitle = skipTitle(text, i);\n if (afterTitle === null) return null;\n i = skipLinkSpace(text, afterTitle);\n if (text[i] !== ')') return null;\n return { occurrence, end: i + 1 };\n}\n\nfunction labelEnd(text: string, start: number): number {\n let i = start;\n let depth = 1;\n while (i < text.length && depth > 0) {\n const ch = text[i]!;\n if (ch === '\\\\') {\n i += 2;\n continue;\n }\n if (ch === '[') depth += 1;\n else if (ch === ']') depth -= 1;\n else if (ch === '\\n' || ch === '\\r') return -1;\n i += 1;\n }\n return depth === 0 ? i : -1;\n}\n\nfunction takeLink(\n text: string,\n index: number,\n start: number,\n found: LinkUse[],\n defs: ReadonlyMap<string, HrefOccurrence>,\n): number {\n const end = labelEnd(text, index + 1);\n if (end === -1) return index + 1;\n const label = text.slice(index + 1, end - 1);\n let i = end;\n if (text[i] === '(') {\n const dest = destination(text, i);\n if (dest === null) return index + 1;\n found.push({\n start,\n end: dest.end,\n labelStart: index + 1,\n labelEnd: end - 1,\n destination: dest.occurrence,\n });\n return dest.end;\n }\n if (text[i] === '[') {\n const close = labelEnd(text, i + 1);\n if (close === -1) return index + 1;\n const id = (text.slice(i + 1, close - 1) || label).trim().toLowerCase();\n const defined = defs.get(id);\n if (defined !== undefined) {\n found.push({\n start,\n end: close,\n labelStart: index + 1,\n labelEnd: end - 1,\n destination: defined,\n });\n }\n return close;\n }\n return i;\n}\n\nfunction definitionDestination(text: string, from: number, to: number): HrefOccurrence | null {\n let i = from;\n while (i < to && (text[i] === ' ' || text[i] === '\\t')) i += 1;\n const match = DESTINATION.exec(text.slice(i, to));\n if (match === null) return null;\n const bracketed = match[1];\n const span = match.indices?.[1] ?? match.indices?.[2];\n const href = bracketed === undefined ? match[2] : bracketed.slice(1, -1);\n if (href === undefined || span === undefined) return null;\n return { href, start: i + span[0], end: i + span[1], bracketed: bracketed !== undefined };\n}\n\nfunction definitionAt(\n text: string,\n line: Line,\n): { id: string; occurrence: HrefOccurrence; next: number } | null {\n const head = LABEL.exec(lineText(text, line));\n if (head === null) return null;\n const id = head[1]?.trim().toLowerCase();\n if (id === undefined || id === '') return null;\n const from = line.content + head[0].length;\n let occurrence = definitionDestination(text, from, line.end);\n let next = afterLine(text, line.end);\n if (occurrence === null) {\n if (text.slice(from, line.end).trim() !== '' || next >= text.length) return null;\n const end = endOfLine(text, next);\n occurrence = definitionDestination(text, readLine(text, next, end).content, end);\n if (occurrence === null) return null;\n next = afterLine(text, end);\n }\n if (next < text.length) {\n const end = endOfLine(text, next);\n if (TITLE.test(lineText(text, readLine(text, next, end)))) next = afterLine(text, end);\n }\n return { id, occurrence, next };\n}\n\nfunction endsBlock(content: string): boolean {\n return HEADING.test(content) || BREAK.test(content) || SETEXT.test(content);\n}\n\nfunction scanBlocks(text: string): {\n readonly fences: readonly (readonly [number, number])[];\n readonly definitions: ReadonlyMap<string, HrefOccurrence>;\n readonly blocks: readonly DefinitionBlock[];\n} {\n const fences: [number, number][] = [];\n const definitions = new Map<string, HrefOccurrence>();\n const blocks: DefinitionBlock[] = [];\n let paragraph = false;\n let depth = 0;\n let i = 0;\n while (i < text.length) {\n const line = readLine(text, i, endOfLine(text, i));\n if (line.depth !== depth || line.item) paragraph = false;\n depth = line.depth;\n const open = fenceAt(text, line);\n if (open !== null) {\n const stop = fenceSpan(text, line, open);\n fences.push([i, stop]);\n paragraph = false;\n i = stop;\n continue;\n }\n const content = lineText(text, line);\n if (content.trim() === '') {\n paragraph = false;\n i = afterLine(text, line.end);\n continue;\n }\n const definition = paragraph ? null : definitionAt(text, line);\n if (definition !== null) {\n if (!definitions.has(definition.id)) definitions.set(definition.id, definition.occurrence);\n blocks.push({ start: line.start, end: definition.next, destination: definition.occurrence });\n i = definition.next;\n continue;\n }\n paragraph = !endsBlock(content);\n i = afterLine(text, line.end);\n }\n return { fences, definitions, blocks };\n}\n\nfunction fenceEndAt(\n spans: readonly (readonly [number, number])[],\n index: number,\n): number | undefined {\n for (const [start, end] of spans) {\n if (index >= start && index < end) return end;\n }\n return undefined;\n}\n\nexport type HrefOccurrence = {\n readonly href: string;\n readonly start: number;\n readonly end: number;\n readonly bracketed: boolean;\n};\n\nexport type LinkUse = {\n readonly start: number;\n readonly end: number;\n readonly labelStart: number;\n readonly labelEnd: number;\n readonly destination: HrefOccurrence;\n};\n\nexport type DefinitionBlock = {\n readonly start: number;\n readonly end: number;\n readonly destination: HrefOccurrence;\n};\n\nexport type LinkInventory = {\n readonly uses: readonly LinkUse[];\n readonly blocks: readonly DefinitionBlock[];\n};\n\nexport function fenceSpans(text: string): readonly (readonly [number, number])[] {\n return scanBlocks(text).fences;\n}\n\nexport function linkInventory(body: string): LinkInventory {\n const { fences, definitions, blocks } = scanBlocks(body);\n const uses: LinkUse[] = [];\n let i = 0;\n while (i < body.length) {\n const fenceEnd = fenceEndAt(fences, i);\n if (fenceEnd !== undefined) {\n i = fenceEnd;\n continue;\n }\n if (body[i] === '`') {\n i = skipInlineCode(body, i);\n continue;\n }\n if (body[i] === '!' && body[i + 1] === '[') {\n i = takeLink(body, i + 1, i, uses, definitions);\n continue;\n }\n if (body[i] === '[') {\n i = takeLink(body, i, i, uses, definitions);\n continue;\n }\n i += 1;\n }\n return { uses, blocks };\n}\n\nexport function hrefOccurrences(body: string): readonly HrefOccurrence[] {\n const byStart = new Map<number, HrefOccurrence>();\n for (const use of linkInventory(body).uses) byStart.set(use.destination.start, use.destination);\n return [...byStart.values()].sort((left, right) => left.start - right.start);\n}\n"],"names":["TAB_STOP","CLOSING_FENCE_INDENT","HEADING","BREAK","SETEXT","LABEL","DESTINATION","TITLE","endOfLine","text","from","nl","indexOf","length","afterLine","end","itemMarker","index","i","bullet","digits","delimiter","readLine","start","depth","item","inner","spaces","after","content","widthOf","to","width","afterIndent","line","indentWidth","lineText","raw","slice","endsWith","fenceRun","at","char","fenceAt","run","column","closesFence","open","indent","trim","leavesContainer","fenceSpan","cursor","next","skipInlineCode","ticks","close","repeat","skipLinkSpace","skipTitle","ch","destination","occurrence","href","bracketed","afterTitle","labelEnd","takeLink","found","defs","label","dest","push","labelStart","id","toLowerCase","defined","get","undefined","definitionDestination","match","exec","span","indices","definitionAt","head","test","endsBlock","scanBlocks","fences","definitions","Map","blocks","paragraph","stop","definition","has","set","fenceEndAt","spans","fenceSpans","linkInventory","body","uses","fenceEnd","hrefOccurrences","byStart","use","values","sort","left","right"],"mappings":"AAiBA,MAAMA,WAAW;AACjB,MAAMC,uBAAuB;AAE7B,MAAMC,UAAU;AAChB,MAAMC,QAAQ;AACd,MAAMC,SAAS;AACf,MAAMC,QAAQ;AACd,MAAMC,cAAc;AACpB,MAAMC,QAAQ;AAEd,SAASC,UAAUC,IAAY,EAAEC,IAAY;IAC3C,MAAMC,KAAKF,KAAKG,OAAO,CAAC,MAAMF;IAC9B,OAAOC,OAAO,CAAC,IAAIF,KAAKI,MAAM,GAAGF;AACnC;AAEA,SAASG,UAAUL,IAAY,EAAEM,GAAW;IAC1C,OAAOA,MAAMN,KAAKI,MAAM,GAAGE,MAAM,IAAIN,KAAKI,MAAM;AAClD;AAEA,SAASG,WAAWP,IAAY,EAAEQ,KAAa,EAAEF,GAAW;IAC1D,IAAIG,IAAID;IACR,MAAME,SAASV,IAAI,CAACS,EAAE;IACtB,IAAIC,WAAW,OAAOA,WAAW,OAAOA,WAAW,KAAKD,KAAK;SACxD;QACH,IAAIE,SAAS;QACb,MAAOA,SAAS,KAAKF,IAAIE,SAASL,OAAON,IAAI,CAACS,IAAIE,OAAO,IAAK,OAAOX,IAAI,CAACS,IAAIE,OAAO,IAAK,IACxFA,UAAU;QACZ,MAAMC,YAAYZ,IAAI,CAACS,IAAIE,OAAO;QAClC,IAAIA,WAAW,KAAMC,cAAc,OAAOA,cAAc,KAAM,OAAO;QACrEH,KAAKE,SAAS;IAChB;IACA,IAAIF,KAAKH,KAAK,OAAOG;IACrB,IAAIT,IAAI,CAACS,EAAE,KAAK,OAAOT,IAAI,CAACS,EAAE,KAAK,MAAM,OAAO;IAChD,OAAOA,IAAI;AACb;AAEA,SAASI,SAASb,IAAY,EAAEc,KAAa,EAAER,GAAW;IACxD,IAAIG,IAAIK;IACR,IAAIC,QAAQ;IACZ,IAAIC,OAAO;IACX,IAAIC,QAAQH;IACZ,OAAS;QACP,IAAII,SAAS;QACb,MAAOA,SAAS,KAAKT,IAAIH,OAAON,IAAI,CAACS,EAAE,KAAK,IAAK;YAC/CA,KAAK;YACLS,UAAU;QACZ;QACA,IAAIT,IAAIH,OAAON,IAAI,CAACS,EAAE,KAAK,KAAK;YAC9BM,SAAS;YACTN,KAAK;YACL,IAAIA,IAAIH,OAAON,IAAI,CAACS,EAAE,KAAK,KAAKA,KAAK;YACrCQ,QAAQR;YACR;QACF;QACA,MAAMU,QAAQV,IAAIH,MAAMC,WAAWP,MAAMS,GAAGH,OAAO;QACnD,IAAIa,UAAU,MAAM;QACpBH,OAAO;QACPP,IAAIU;IACN;IACA,OAAO;QAAEL;QAAOR;QAAKc,SAASX;QAAGM;QAAOC;QAAMC;IAAM;AACtD;AAEA,SAASI,QAAQrB,IAAY,EAAEC,IAAY,EAAEqB,EAAU;IACrD,IAAIC,QAAQ;IACZ,IAAK,IAAId,IAAIR,MAAMQ,IAAIa,IAAIb,KAAK,EAAGc,SAASvB,IAAI,CAACS,EAAE,KAAK,OAAOlB,WAAYgC,QAAQhC,WAAY;IAC/F,OAAOgC;AACT;AAEA,SAASC,YAAYxB,IAAY,EAAEyB,IAAU;IAC3C,IAAIhB,IAAIgB,KAAKR,KAAK;IAClB,MAAOR,IAAIgB,KAAKnB,GAAG,IAAKN,CAAAA,IAAI,CAACS,EAAE,KAAK,OAAOT,IAAI,CAACS,EAAE,KAAK,IAAG,EAAIA,KAAK;IACnE,OAAOA;AACT;AAEA,SAASiB,YAAY1B,IAAY,EAAEyB,IAAU;IAC3C,OAAOJ,QAAQrB,MAAMyB,KAAKR,KAAK,EAAEO,YAAYxB,MAAMyB;AACrD;AAEA,SAASE,SAAS3B,IAAY,EAAEyB,IAAU;IACxC,MAAMG,MAAM5B,KAAK6B,KAAK,CAACJ,KAAKL,OAAO,EAAEK,KAAKnB,GAAG;IAC7C,OAAOsB,IAAIE,QAAQ,CAAC,QAAQF,IAAIC,KAAK,CAAC,GAAG,CAAC,KAAKD;AACjD;AAEA,SAASG,SACP/B,IAAY,EACZgC,EAAU,EACV1B,GAAW;IAEX,MAAM2B,OAAOjC,IAAI,CAACgC,GAAG;IACrB,IAAIC,SAAS,OAAOA,SAAS,KAAK,OAAO;IACzC,IAAI7B,SAAS;IACb,MAAO4B,KAAK5B,SAASE,OAAON,IAAI,CAACgC,KAAK5B,OAAO,KAAK6B,KAAM7B,UAAU;IAClE,OAAOA,SAAS,IAAI,OAAO;QAAE6B;QAAM7B;IAAO;AAC5C;AAEA,SAAS8B,QAAQlC,IAAY,EAAEyB,IAAU;IACvC,MAAMU,MAAMJ,SAAS/B,MAAMyB,KAAKL,OAAO,EAAEK,KAAKnB,GAAG;IACjD,IAAI6B,QAAQ,MAAM,OAAO;IACzB,OAAO;QACLF,MAAME,IAAIF,IAAI;QACd7B,QAAQ+B,IAAI/B,MAAM;QAClBW,OAAOU,KAAKV,KAAK;QACjBqB,QAAQX,KAAKT,IAAI,GAAGK,QAAQrB,MAAMyB,KAAKR,KAAK,EAAEQ,KAAKL,OAAO,IAAI;QAC9DJ,MAAMS,KAAKT,IAAI;IACjB;AACF;AAEA,SAASqB,YAAYrC,IAAY,EAAEyB,IAAU,EAAEa,IAAW;IACxD,IAAIb,KAAKV,KAAK,KAAKuB,KAAKvB,KAAK,IAAIU,KAAKT,IAAI,EAAE,OAAO;IACnD,MAAMuB,SAASb,YAAY1B,MAAMyB;IACjC,IAAIc,SAASD,KAAKF,MAAM,IAAIG,SAASD,KAAKF,MAAM,GAAG5C,sBAAsB,OAAO;IAChF,MAAMwC,KAAKR,YAAYxB,MAAMyB;IAC7B,MAAMU,MAAMJ,SAAS/B,MAAMgC,IAAIP,KAAKnB,GAAG;IACvC,IAAI6B,QAAQ,QAAQA,IAAIF,IAAI,KAAKK,KAAKL,IAAI,IAAIE,IAAI/B,MAAM,GAAGkC,KAAKlC,MAAM,EAAE,OAAO;IAC/E,OAAOJ,KAAK6B,KAAK,CAACG,KAAKG,IAAI/B,MAAM,EAAEqB,KAAKnB,GAAG,EAAEkC,IAAI,OAAO;AAC1D;AAEA,SAASC,gBAAgBzC,IAAY,EAAEyB,IAAU,EAAEa,IAAW;IAC5D,IAAIb,KAAKV,KAAK,GAAGuB,KAAKvB,KAAK,EAAE,OAAO;IACpC,IAAI,CAACuB,KAAKtB,IAAI,IAAIW,SAAS3B,MAAMyB,MAAMe,IAAI,OAAO,IAAI,OAAO;IAC7D,OAAOd,YAAY1B,MAAMyB,QAAQa,KAAKF,MAAM;AAC9C;AAEA,SAASM,UAAU1C,IAAY,EAAEyB,IAAU,EAAEa,IAAW;IACtD,IAAIK,SAAStC,UAAUL,MAAMyB,KAAKnB,GAAG;IACrC,MAAOqC,SAAS3C,KAAKI,MAAM,CAAE;QAC3B,MAAME,MAAMP,UAAUC,MAAM2C;QAC5B,MAAMC,OAAO/B,SAASb,MAAM2C,QAAQrC;QACpC,IAAImC,gBAAgBzC,MAAM4C,MAAMN,OAAO,OAAOK;QAC9C,IAAIN,YAAYrC,MAAM4C,MAAMN,OAAO,OAAOjC,UAAUL,MAAMM;QAC1DqC,SAAStC,UAAUL,MAAMM;IAC3B;IACA,OAAON,KAAKI,MAAM;AACpB;AAEA,SAASyC,eAAe7C,IAAY,EAAEQ,KAAa;IACjD,IAAIsC,QAAQ;IACZ,MAAO9C,IAAI,CAACQ,QAAQsC,MAAM,KAAK,IAAKA,SAAS;IAC7C,MAAMC,QAAQ/C,KAAKG,OAAO,CAAC,IAAI6C,MAAM,CAACF,QAAQtC,QAAQsC;IACtD,IAAIC,UAAU,CAAC,GAAG,OAAO/C,KAAKI,MAAM;IACpC,OAAO2C,QAAQD;AACjB;AAEA,SAASG,cAAcjD,IAAY,EAAEc,KAAa;IAChD,IAAIL,IAAIK;IACR,MAAOd,IAAI,CAACS,EAAE,KAAK,OAAOT,IAAI,CAACS,EAAE,KAAK,KAAMA,KAAK;IACjD,OAAOA;AACT;AAEA,SAASyC,UAAUlD,IAAY,EAAEc,KAAa;IAC5C,MAAMwB,OAAOtC,IAAI,CAACc,MAAM;IACxB,IAAIwB,SAAS,OAAOA,SAAS,OAAOA,SAAS,KAAK,OAAOxB;IACzD,MAAMiC,QAAQT,SAAS,MAAM,MAAMA;IACnC,IAAI7B,IAAIK,QAAQ;IAChB,MAAOL,IAAIT,KAAKI,MAAM,CAAE;QACtB,MAAM+C,KAAKnD,IAAI,CAACS,EAAE;QAClB,IAAI0C,OAAOJ,OAAO,OAAOtC,IAAI;QAC7B,IAAI0C,OAAO,QAAQA,OAAO,MAAM,OAAO;QACvC1C,KAAK;IACP;IACA,OAAO;AACT;AAEA,SAAS2C,YACPpD,IAAY,EACZc,KAAa;IAEb,IAAIL,IAAIwC,cAAcjD,MAAMc,QAAQ;IACpC,IAAIuC;IACJ,IAAIrD,IAAI,CAACS,EAAE,KAAK,KAAK;QACnB,MAAMsC,QAAQ/C,KAAKG,OAAO,CAAC,KAAKM,IAAI;QACpC,IAAIsC,UAAU,CAAC,GAAG,OAAO;QACzBM,aAAa;YAAEC,MAAMtD,KAAK6B,KAAK,CAACpB,IAAI,GAAGsC;YAAQjC,OAAOL;YAAGH,KAAKyC,QAAQ;YAAGQ,WAAW;QAAK;QACzF9C,IAAIsC,QAAQ;IACd,OAAO;QACL,MAAM9C,OAAOQ;QACb,IAAIM,QAAQ;QACZ,MAAON,IAAIT,KAAKI,MAAM,CAAE;YACtB,MAAM+C,KAAKnD,IAAI,CAACS,EAAE;YAClB,IAAI0C,OAAO,OAAOA,OAAO,QAAQA,OAAO,QAAQA,OAAO,MAAM;YAC7D,IAAIA,OAAO,KAAKpC,SAAS;iBACpB,IAAIoC,OAAO,KAAK;gBACnB,IAAIpC,UAAU,GAAG;gBACjBA,SAAS;YACX;YACAN,KAAK;QACP;QACA4C,aAAa;YAAEC,MAAMtD,KAAK6B,KAAK,CAAC5B,MAAMQ;YAAIK,OAAOb;YAAMK,KAAKG;YAAG8C,WAAW;QAAM;IAClF;IACA9C,IAAIwC,cAAcjD,MAAMS;IACxB,MAAM+C,aAAaN,UAAUlD,MAAMS;IACnC,IAAI+C,eAAe,MAAM,OAAO;IAChC/C,IAAIwC,cAAcjD,MAAMwD;IACxB,IAAIxD,IAAI,CAACS,EAAE,KAAK,KAAK,OAAO;IAC5B,OAAO;QAAE4C;QAAY/C,KAAKG,IAAI;IAAE;AAClC;AAEA,SAASgD,SAASzD,IAAY,EAAEc,KAAa;IAC3C,IAAIL,IAAIK;IACR,IAAIC,QAAQ;IACZ,MAAON,IAAIT,KAAKI,MAAM,IAAIW,QAAQ,EAAG;QACnC,MAAMoC,KAAKnD,IAAI,CAACS,EAAE;QAClB,IAAI0C,OAAO,MAAM;YACf1C,KAAK;YACL;QACF;QACA,IAAI0C,OAAO,KAAKpC,SAAS;aACpB,IAAIoC,OAAO,KAAKpC,SAAS;aACzB,IAAIoC,OAAO,QAAQA,OAAO,MAAM,OAAO,CAAC;QAC7C1C,KAAK;IACP;IACA,OAAOM,UAAU,IAAIN,IAAI,CAAC;AAC5B;AAEA,SAASiD,SACP1D,IAAY,EACZQ,KAAa,EACbM,KAAa,EACb6C,KAAgB,EAChBC,IAAyC;IAEzC,MAAMtD,MAAMmD,SAASzD,MAAMQ,QAAQ;IACnC,IAAIF,QAAQ,CAAC,GAAG,OAAOE,QAAQ;IAC/B,MAAMqD,QAAQ7D,KAAK6B,KAAK,CAACrB,QAAQ,GAAGF,MAAM;IAC1C,IAAIG,IAAIH;IACR,IAAIN,IAAI,CAACS,EAAE,KAAK,KAAK;QACnB,MAAMqD,OAAOV,YAAYpD,MAAMS;QAC/B,IAAIqD,SAAS,MAAM,OAAOtD,QAAQ;QAClCmD,MAAMI,IAAI,CAAC;YACTjD;YACAR,KAAKwD,KAAKxD,GAAG;YACb0D,YAAYxD,QAAQ;YACpBiD,UAAUnD,MAAM;YAChB8C,aAAaU,KAAKT,UAAU;QAC9B;QACA,OAAOS,KAAKxD,GAAG;IACjB;IACA,IAAIN,IAAI,CAACS,EAAE,KAAK,KAAK;QACnB,MAAMsC,QAAQU,SAASzD,MAAMS,IAAI;QACjC,IAAIsC,UAAU,CAAC,GAAG,OAAOvC,QAAQ;QACjC,MAAMyD,KAAK,AAACjE,CAAAA,KAAK6B,KAAK,CAACpB,IAAI,GAAGsC,QAAQ,MAAMc,KAAI,EAAGrB,IAAI,GAAG0B,WAAW;QACrE,MAAMC,UAAUP,KAAKQ,GAAG,CAACH;QACzB,IAAIE,YAAYE,WAAW;YACzBV,MAAMI,IAAI,CAAC;gBACTjD;gBACAR,KAAKyC;gBACLiB,YAAYxD,QAAQ;gBACpBiD,UAAUnD,MAAM;gBAChB8C,aAAae;YACf;QACF;QACA,OAAOpB;IACT;IACA,OAAOtC;AACT;AAEA,SAAS6D,sBAAsBtE,IAAY,EAAEC,IAAY,EAAEqB,EAAU;IACnE,IAAIb,IAAIR;IACR,MAAOQ,IAAIa,MAAOtB,CAAAA,IAAI,CAACS,EAAE,KAAK,OAAOT,IAAI,CAACS,EAAE,KAAK,IAAG,EAAIA,KAAK;IAC7D,MAAM8D,QAAQ1E,YAAY2E,IAAI,CAACxE,KAAK6B,KAAK,CAACpB,GAAGa;IAC7C,IAAIiD,UAAU,MAAM,OAAO;IAC3B,MAAMhB,YAAYgB,KAAK,CAAC,EAAE;IAC1B,MAAME,OAAOF,MAAMG,OAAO,EAAE,CAAC,EAAE,IAAIH,MAAMG,OAAO,EAAE,CAAC,EAAE;IACrD,MAAMpB,OAAOC,cAAcc,YAAYE,KAAK,CAAC,EAAE,GAAGhB,UAAU1B,KAAK,CAAC,GAAG,CAAC;IACtE,IAAIyB,SAASe,aAAaI,SAASJ,WAAW,OAAO;IACrD,OAAO;QAAEf;QAAMxC,OAAOL,IAAIgE,IAAI,CAAC,EAAE;QAAEnE,KAAKG,IAAIgE,IAAI,CAAC,EAAE;QAAElB,WAAWA,cAAcc;IAAU;AAC1F;AAEA,SAASM,aACP3E,IAAY,EACZyB,IAAU;IAEV,MAAMmD,OAAOhF,MAAM4E,IAAI,CAAC7C,SAAS3B,MAAMyB;IACvC,IAAImD,SAAS,MAAM,OAAO;IAC1B,MAAMX,KAAKW,IAAI,CAAC,EAAE,EAAEpC,OAAO0B;IAC3B,IAAID,OAAOI,aAAaJ,OAAO,IAAI,OAAO;IAC1C,MAAMhE,OAAOwB,KAAKL,OAAO,GAAGwD,IAAI,CAAC,EAAE,CAACxE,MAAM;IAC1C,IAAIiD,aAAaiB,sBAAsBtE,MAAMC,MAAMwB,KAAKnB,GAAG;IAC3D,IAAIsC,OAAOvC,UAAUL,MAAMyB,KAAKnB,GAAG;IACnC,IAAI+C,eAAe,MAAM;QACvB,IAAIrD,KAAK6B,KAAK,CAAC5B,MAAMwB,KAAKnB,GAAG,EAAEkC,IAAI,OAAO,MAAMI,QAAQ5C,KAAKI,MAAM,EAAE,OAAO;QAC5E,MAAME,MAAMP,UAAUC,MAAM4C;QAC5BS,aAAaiB,sBAAsBtE,MAAMa,SAASb,MAAM4C,MAAMtC,KAAKc,OAAO,EAAEd;QAC5E,IAAI+C,eAAe,MAAM,OAAO;QAChCT,OAAOvC,UAAUL,MAAMM;IACzB;IACA,IAAIsC,OAAO5C,KAAKI,MAAM,EAAE;QACtB,MAAME,MAAMP,UAAUC,MAAM4C;QAC5B,IAAI9C,MAAM+E,IAAI,CAAClD,SAAS3B,MAAMa,SAASb,MAAM4C,MAAMtC,QAAQsC,OAAOvC,UAAUL,MAAMM;IACpF;IACA,OAAO;QAAE2D;QAAIZ;QAAYT;IAAK;AAChC;AAEA,SAASkC,UAAU1D,OAAe;IAChC,OAAO3B,QAAQoF,IAAI,CAACzD,YAAY1B,MAAMmF,IAAI,CAACzD,YAAYzB,OAAOkF,IAAI,CAACzD;AACrE;AAEA,SAAS2D,WAAW/E,IAAY;IAK9B,MAAMgF,SAA6B,EAAE;IACrC,MAAMC,cAAc,IAAIC;IACxB,MAAMC,SAA4B,EAAE;IACpC,IAAIC,YAAY;IAChB,IAAIrE,QAAQ;IACZ,IAAIN,IAAI;IACR,MAAOA,IAAIT,KAAKI,MAAM,CAAE;QACtB,MAAMqB,OAAOZ,SAASb,MAAMS,GAAGV,UAAUC,MAAMS;QAC/C,IAAIgB,KAAKV,KAAK,KAAKA,SAASU,KAAKT,IAAI,EAAEoE,YAAY;QACnDrE,QAAQU,KAAKV,KAAK;QAClB,MAAMuB,OAAOJ,QAAQlC,MAAMyB;QAC3B,IAAIa,SAAS,MAAM;YACjB,MAAM+C,OAAO3C,UAAU1C,MAAMyB,MAAMa;YACnC0C,OAAOjB,IAAI,CAAC;gBAACtD;gBAAG4E;aAAK;YACrBD,YAAY;YACZ3E,IAAI4E;YACJ;QACF;QACA,MAAMjE,UAAUO,SAAS3B,MAAMyB;QAC/B,IAAIL,QAAQoB,IAAI,OAAO,IAAI;YACzB4C,YAAY;YACZ3E,IAAIJ,UAAUL,MAAMyB,KAAKnB,GAAG;YAC5B;QACF;QACA,MAAMgF,aAAaF,YAAY,OAAOT,aAAa3E,MAAMyB;QACzD,IAAI6D,eAAe,MAAM;YACvB,IAAI,CAACL,YAAYM,GAAG,CAACD,WAAWrB,EAAE,GAAGgB,YAAYO,GAAG,CAACF,WAAWrB,EAAE,EAAEqB,WAAWjC,UAAU;YACzF8B,OAAOpB,IAAI,CAAC;gBAAEjD,OAAOW,KAAKX,KAAK;gBAAER,KAAKgF,WAAW1C,IAAI;gBAAEQ,aAAakC,WAAWjC,UAAU;YAAC;YAC1F5C,IAAI6E,WAAW1C,IAAI;YACnB;QACF;QACAwC,YAAY,CAACN,UAAU1D;QACvBX,IAAIJ,UAAUL,MAAMyB,KAAKnB,GAAG;IAC9B;IACA,OAAO;QAAE0E;QAAQC;QAAaE;IAAO;AACvC;AAEA,SAASM,WACPC,KAA6C,EAC7ClF,KAAa;IAEb,KAAK,MAAM,CAACM,OAAOR,IAAI,IAAIoF,MAAO;QAChC,IAAIlF,SAASM,SAASN,QAAQF,KAAK,OAAOA;IAC5C;IACA,OAAO+D;AACT;AA4BA,OAAO,SAASsB,WAAW3F,IAAY;IACrC,OAAO+E,WAAW/E,MAAMgF,MAAM;AAChC;AAEA,OAAO,SAASY,cAAcC,IAAY;IACxC,MAAM,EAAEb,MAAM,EAAEC,WAAW,EAAEE,MAAM,EAAE,GAAGJ,WAAWc;IACnD,MAAMC,OAAkB,EAAE;IAC1B,IAAIrF,IAAI;IACR,MAAOA,IAAIoF,KAAKzF,MAAM,CAAE;QACtB,MAAM2F,WAAWN,WAAWT,QAAQvE;QACpC,IAAIsF,aAAa1B,WAAW;YAC1B5D,IAAIsF;YACJ;QACF;QACA,IAAIF,IAAI,CAACpF,EAAE,KAAK,KAAK;YACnBA,IAAIoC,eAAegD,MAAMpF;YACzB;QACF;QACA,IAAIoF,IAAI,CAACpF,EAAE,KAAK,OAAOoF,IAAI,CAACpF,IAAI,EAAE,KAAK,KAAK;YAC1CA,IAAIiD,SAASmC,MAAMpF,IAAI,GAAGA,GAAGqF,MAAMb;YACnC;QACF;QACA,IAAIY,IAAI,CAACpF,EAAE,KAAK,KAAK;YACnBA,IAAIiD,SAASmC,MAAMpF,GAAGA,GAAGqF,MAAMb;YAC/B;QACF;QACAxE,KAAK;IACP;IACA,OAAO;QAAEqF;QAAMX;IAAO;AACxB;AAEA,OAAO,SAASa,gBAAgBH,IAAY;IAC1C,MAAMI,UAAU,IAAIf;IACpB,KAAK,MAAMgB,OAAON,cAAcC,MAAMC,IAAI,CAAEG,QAAQT,GAAG,CAACU,IAAI9C,WAAW,CAACtC,KAAK,EAAEoF,IAAI9C,WAAW;IAC9F,OAAO;WAAI6C,QAAQE,MAAM;KAAG,CAACC,IAAI,CAAC,CAACC,MAAMC,QAAUD,KAAKvF,KAAK,GAAGwF,MAAMxF,KAAK;AAC7E"}
package/dist/paths.d.ts CHANGED
@@ -3,6 +3,7 @@ export declare function join(base: string, relative: string): string;
3
3
  export declare function normalize(path: string): string | null;
4
4
  export declare function isTypesPath(path: string): boolean;
5
5
  export declare function typeNameFromPath(path: string): string;
6
+ export declare function hrefSuffix(href: string): string;
6
7
  export declare function classifyHref(from: string, href: string): {
7
8
  kind: 'skip';
8
9
  } | {
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG5C;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYrD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAUzE"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG5C;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYrD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI/C;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAUzE"}
package/dist/paths.js CHANGED
@@ -26,6 +26,11 @@ export function typeNameFromPath(path) {
26
26
  const base = path.slice(path.lastIndexOf('/') + 1);
27
27
  return base.endsWith('.md') ? base.slice(0, -3) : base;
28
28
  }
29
+ export function hrefSuffix(href) {
30
+ const trimmed = href.trim();
31
+ const match = /[?#]/.exec(trimmed);
32
+ return match === null ? '' : trimmed.slice(match.index);
33
+ }
29
34
  export function classifyHref(from, href) {
30
35
  const trimmed = href.trim();
31
36
  if (trimmed === '' || trimmed.startsWith('#')) return {
package/dist/paths.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/executor/code/agents.house/mdmodel/packages/mdmodel/src/paths.ts"],"sourcesContent":["export function dirname(path: string): string {\n const index = path.lastIndexOf('/');\n return index === -1 ? '' : path.slice(0, index);\n}\n\nexport function join(base: string, relative: string): string {\n if (base === '') return relative;\n return `${base}/${relative}`;\n}\n\nexport function normalize(path: string): string | null {\n const parts: string[] = [];\n for (const part of path.split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') {\n if (parts.length === 0) return null;\n parts.pop();\n continue;\n }\n parts.push(part);\n }\n return parts.join('/');\n}\n\nexport function isTypesPath(path: string): boolean {\n return path === 'types' || path.startsWith('types/');\n}\n\nexport function typeNameFromPath(path: string): string {\n const base = path.slice(path.lastIndexOf('/') + 1);\n return base.endsWith('.md') ? base.slice(0, -3) : base;\n}\n\nexport function classifyHref(\n from: string,\n href: string,\n): { kind: 'skip' } | { kind: 'path'; path: string } | { kind: 'invalid' } {\n const trimmed = href.trim();\n if (trimmed === '' || trimmed.startsWith('#')) return { kind: 'skip' };\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(trimmed)) return { kind: 'skip' };\n if (trimmed.startsWith('/')) return { kind: 'invalid' };\n const bare = trimmed.replace(/[?#].*$/, '');\n if (bare === '') return { kind: 'skip' };\n const resolved = normalize(join(dirname(from), bare));\n if (resolved === null || resolved === '') return { kind: 'invalid' };\n return { kind: 'path', path: resolved };\n}\n"],"names":["dirname","path","index","lastIndexOf","slice","join","base","relative","normalize","parts","part","split","length","pop","push","isTypesPath","startsWith","typeNameFromPath","endsWith","classifyHref","from","href","trimmed","trim","kind","test","bare","replace","resolved"],"mappings":"AAAA,OAAO,SAASA,QAAQC,IAAY;IAClC,MAAMC,QAAQD,KAAKE,WAAW,CAAC;IAC/B,OAAOD,UAAU,CAAC,IAAI,KAAKD,KAAKG,KAAK,CAAC,GAAGF;AAC3C;AAEA,OAAO,SAASG,KAAKC,IAAY,EAAEC,QAAgB;IACjD,IAAID,SAAS,IAAI,OAAOC;IACxB,OAAO,GAAGD,KAAK,CAAC,EAAEC,UAAU;AAC9B;AAEA,OAAO,SAASC,UAAUP,IAAY;IACpC,MAAMQ,QAAkB,EAAE;IAC1B,KAAK,MAAMC,QAAQT,KAAKU,KAAK,CAAC,KAAM;QAClC,IAAID,SAAS,MAAMA,SAAS,KAAK;QACjC,IAAIA,SAAS,MAAM;YACjB,IAAID,MAAMG,MAAM,KAAK,GAAG,OAAO;YAC/BH,MAAMI,GAAG;YACT;QACF;QACAJ,MAAMK,IAAI,CAACJ;IACb;IACA,OAAOD,MAAMJ,IAAI,CAAC;AACpB;AAEA,OAAO,SAASU,YAAYd,IAAY;IACtC,OAAOA,SAAS,WAAWA,KAAKe,UAAU,CAAC;AAC7C;AAEA,OAAO,SAASC,iBAAiBhB,IAAY;IAC3C,MAAMK,OAAOL,KAAKG,KAAK,CAACH,KAAKE,WAAW,CAAC,OAAO;IAChD,OAAOG,KAAKY,QAAQ,CAAC,SAASZ,KAAKF,KAAK,CAAC,GAAG,CAAC,KAAKE;AACpD;AAEA,OAAO,SAASa,aACdC,IAAY,EACZC,IAAY;IAEZ,MAAMC,UAAUD,KAAKE,IAAI;IACzB,IAAID,YAAY,MAAMA,QAAQN,UAAU,CAAC,MAAM,OAAO;QAAEQ,MAAM;IAAO;IACrE,IAAI,4BAA4BC,IAAI,CAACH,UAAU,OAAO;QAAEE,MAAM;IAAO;IACrE,IAAIF,QAAQN,UAAU,CAAC,MAAM,OAAO;QAAEQ,MAAM;IAAU;IACtD,MAAME,OAAOJ,QAAQK,OAAO,CAAC,WAAW;IACxC,IAAID,SAAS,IAAI,OAAO;QAAEF,MAAM;IAAO;IACvC,MAAMI,WAAWpB,UAAUH,KAAKL,QAAQoB,OAAOM;IAC/C,IAAIE,aAAa,QAAQA,aAAa,IAAI,OAAO;QAAEJ,MAAM;IAAU;IACnE,OAAO;QAAEA,MAAM;QAAQvB,MAAM2B;IAAS;AACxC"}
1
+ {"version":3,"sources":["/workspace/packages/mdmodel/src/paths.ts"],"sourcesContent":["export function dirname(path: string): string {\n const index = path.lastIndexOf('/');\n return index === -1 ? '' : path.slice(0, index);\n}\n\nexport function join(base: string, relative: string): string {\n if (base === '') return relative;\n return `${base}/${relative}`;\n}\n\nexport function normalize(path: string): string | null {\n const parts: string[] = [];\n for (const part of path.split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') {\n if (parts.length === 0) return null;\n parts.pop();\n continue;\n }\n parts.push(part);\n }\n return parts.join('/');\n}\n\nexport function isTypesPath(path: string): boolean {\n return path === 'types' || path.startsWith('types/');\n}\n\nexport function typeNameFromPath(path: string): string {\n const base = path.slice(path.lastIndexOf('/') + 1);\n return base.endsWith('.md') ? base.slice(0, -3) : base;\n}\n\nexport function hrefSuffix(href: string): string {\n const trimmed = href.trim();\n const match = /[?#]/.exec(trimmed);\n return match === null ? '' : trimmed.slice(match.index);\n}\n\nexport function classifyHref(\n from: string,\n href: string,\n): { kind: 'skip' } | { kind: 'path'; path: string } | { kind: 'invalid' } {\n const trimmed = href.trim();\n if (trimmed === '' || trimmed.startsWith('#')) return { kind: 'skip' };\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(trimmed)) return { kind: 'skip' };\n if (trimmed.startsWith('/')) return { kind: 'invalid' };\n const bare = trimmed.replace(/[?#].*$/, '');\n if (bare === '') return { kind: 'skip' };\n const resolved = normalize(join(dirname(from), bare));\n if (resolved === null || resolved === '') return { kind: 'invalid' };\n return { kind: 'path', path: resolved };\n}\n"],"names":["dirname","path","index","lastIndexOf","slice","join","base","relative","normalize","parts","part","split","length","pop","push","isTypesPath","startsWith","typeNameFromPath","endsWith","hrefSuffix","href","trimmed","trim","match","exec","classifyHref","from","kind","test","bare","replace","resolved"],"mappings":"AAAA,OAAO,SAASA,QAAQC,IAAY;IAClC,MAAMC,QAAQD,KAAKE,WAAW,CAAC;IAC/B,OAAOD,UAAU,CAAC,IAAI,KAAKD,KAAKG,KAAK,CAAC,GAAGF;AAC3C;AAEA,OAAO,SAASG,KAAKC,IAAY,EAAEC,QAAgB;IACjD,IAAID,SAAS,IAAI,OAAOC;IACxB,OAAO,GAAGD,KAAK,CAAC,EAAEC,UAAU;AAC9B;AAEA,OAAO,SAASC,UAAUP,IAAY;IACpC,MAAMQ,QAAkB,EAAE;IAC1B,KAAK,MAAMC,QAAQT,KAAKU,KAAK,CAAC,KAAM;QAClC,IAAID,SAAS,MAAMA,SAAS,KAAK;QACjC,IAAIA,SAAS,MAAM;YACjB,IAAID,MAAMG,MAAM,KAAK,GAAG,OAAO;YAC/BH,MAAMI,GAAG;YACT;QACF;QACAJ,MAAMK,IAAI,CAACJ;IACb;IACA,OAAOD,MAAMJ,IAAI,CAAC;AACpB;AAEA,OAAO,SAASU,YAAYd,IAAY;IACtC,OAAOA,SAAS,WAAWA,KAAKe,UAAU,CAAC;AAC7C;AAEA,OAAO,SAASC,iBAAiBhB,IAAY;IAC3C,MAAMK,OAAOL,KAAKG,KAAK,CAACH,KAAKE,WAAW,CAAC,OAAO;IAChD,OAAOG,KAAKY,QAAQ,CAAC,SAASZ,KAAKF,KAAK,CAAC,GAAG,CAAC,KAAKE;AACpD;AAEA,OAAO,SAASa,WAAWC,IAAY;IACrC,MAAMC,UAAUD,KAAKE,IAAI;IACzB,MAAMC,QAAQ,OAAOC,IAAI,CAACH;IAC1B,OAAOE,UAAU,OAAO,KAAKF,QAAQjB,KAAK,CAACmB,MAAMrB,KAAK;AACxD;AAEA,OAAO,SAASuB,aACdC,IAAY,EACZN,IAAY;IAEZ,MAAMC,UAAUD,KAAKE,IAAI;IACzB,IAAID,YAAY,MAAMA,QAAQL,UAAU,CAAC,MAAM,OAAO;QAAEW,MAAM;IAAO;IACrE,IAAI,4BAA4BC,IAAI,CAACP,UAAU,OAAO;QAAEM,MAAM;IAAO;IACrE,IAAIN,QAAQL,UAAU,CAAC,MAAM,OAAO;QAAEW,MAAM;IAAU;IACtD,MAAME,OAAOR,QAAQS,OAAO,CAAC,WAAW;IACxC,IAAID,SAAS,IAAI,OAAO;QAAEF,MAAM;IAAO;IACvC,MAAMI,WAAWvB,UAAUH,KAAKL,QAAQ0B,OAAOG;IAC/C,IAAIE,aAAa,QAAQA,aAAa,IAAI,OAAO;QAAEJ,MAAM;IAAU;IACnE,OAAO;QAAEA,MAAM;QAAQ1B,MAAM8B;IAAS;AACxC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/executor/code/agents.house/mdmodel/packages/mdmodel/src/profile.ts"],"sourcesContent":["export const MARKDOWN_SYNTAX_PROFILE = {\n name: 'GitHub Flavored Markdown',\n spec: '0.29',\n url: 'https://github.github.com/gfm/',\n} as const;\n"],"names":["MARKDOWN_SYNTAX_PROFILE","name","spec","url"],"mappings":"AAAA,OAAO,MAAMA,0BAA0B;IACrCC,MAAM;IACNC,MAAM;IACNC,KAAK;AACP,EAAW"}
1
+ {"version":3,"sources":["/workspace/packages/mdmodel/src/profile.ts"],"sourcesContent":["export const MARKDOWN_SYNTAX_PROFILE = {\n name: 'GitHub Flavored Markdown',\n spec: '0.29',\n url: 'https://github.github.com/gfm/',\n} as const;\n"],"names":["MARKDOWN_SYNTAX_PROFILE","name","spec","url"],"mappings":"AAAA,OAAO,MAAMA,0BAA0B;IACrCC,MAAM;IACNC,MAAM;IACNC,KAAK;AACP,EAAW"}
@@ -0,0 +1,21 @@
1
+ import type { Document, Extent, Projection, ProjectionContext, Refusal } from './types.js';
2
+ export type Piece = Extent & {
3
+ readonly text: string;
4
+ };
5
+ export type Edit = Piece;
6
+ export type Input = {
7
+ readonly values: readonly Piece[];
8
+ readonly ranges: readonly Extent[];
9
+ readonly edits: readonly Edit[];
10
+ };
11
+ export type InputResult = {
12
+ readonly ok: true;
13
+ readonly input: Input;
14
+ } | {
15
+ readonly ok: false;
16
+ readonly refusal: Refusal;
17
+ };
18
+ export declare function rangeText(content: string, range: Extent, edits: readonly Edit[]): string;
19
+ export declare function projectionInput(document: Document, file: string, context: ProjectionContext): InputResult;
20
+ export declare function project(document: Document, file: string, context?: ProjectionContext): Projection;
21
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG3F,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD,MAAM,MAAM,IAAI,GAAG,KAAK,CAAC;AAEzB,MAAM,MAAM,KAAK,GAAG;IAClB,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GAC5C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AA4BtD,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,MAAM,CASxF;AA8BD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,iBAAiB,GACzB,WAAW,CA8Bb;AAED,wBAAgB,OAAO,CACrB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,iBAA2C,GACnD,UAAU,CAMZ"}