@p-buddy/parkdown 0.0.11 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -44,7 +44,7 @@ populateMarkdownInclusions(file, writeFile);
44
44
 
45
45
  [](./.assets/authoring.md)
46
46
  <!-- p↓ BEGIN -->
47
- <!-- p↓ length lines: 574 chars: 17955 -->
47
+ <!-- p↓ length lines: 601 chars: 19975 -->
48
48
  ## Authoring
49
49
 
50
50
  You author inclusions in your markdown files using a link with no text i.e. `[](<url>)`, where `<url>` points to some local or remote text resource (e.g.`./other.md`, `https://example.com/remote.md`).
@@ -256,7 +256,7 @@ Before...
256
256
 
257
257
  [](.assets/query.md?heading=-1)
258
258
  <!-- p↓ BEGIN -->
259
- <!-- p↓ length lines: 361 chars: 13249 -->
259
+ <!-- p↓ length lines: 388 chars: 15269 -->
260
260
  ### Query parameters
261
261
 
262
262
  You can pass query parameters to your inclusion links to control how their content is processed and included within your markdown.
@@ -290,6 +290,8 @@ Specifiers will be searched for within the file's comments, and are expected to
290
290
  /** some-specifier */
291
291
  ```
292
292
 
293
+ Identifiers will be searched for within the text of a comment split by spaces (i.e. `some-specifier` is a single identifier, but `some specifier` represents two separate identifiers).
294
+
293
295
  Below is the currently supported API for the `region` query parameter, where each defined method signature can be _invoked_ as a value for the `region` parameter, for example:
294
296
 
295
297
  - `[](<url>?region=extract(some-specifier))`
@@ -314,7 +316,7 @@ Please see the [full explanation](#query-parameters-with-function-like-apis) to
314
316
 
315
317
  [](src/region.ts?region=extract(definition))
316
318
  <!-- p↓ BEGIN -->
317
- <!-- p↓ length lines: 36 chars: 1651 -->
319
+ <!-- p↓ length lines: 64 chars: 3718 -->
318
320
 
319
321
  ```ts
320
322
  const definitions = [
@@ -348,6 +350,34 @@ const definitions = [
348
350
  * @example [](<url>?region=replace(specifier,new_content,_)
349
351
  */
350
352
  "replace(id: string, with?: string, space?: string)",
353
+ /**
354
+ * Splice the retrieved content at the boundary of a comment region (which must INCLUDE the specified id).
355
+ *
356
+ * **NOTE:** Unlike `extract`, `remove`, and `replace`, `splice` does remove the comment from the content after processing.
357
+ * @param id The id of the comment regions to act on.
358
+ * @param deleteCount The number of characters to delete at either the beginning or end of the comment region.
359
+ * Specifying a number greater than or equal to 0 indicates the action should be taken at the end of the comment region.
360
+ * Specifying undefined or a number less than 0 indicates the action should be taken at the beginning of the comment region.
361
+ * @param insert The content to insert.
362
+ * @param space The space character to use between words in the content to insert (defaults to `-`).
363
+ * @example [](<url>?region=splice(specifier,-1)) // Delete one character at the beginning of the comment region.
364
+ * @example [](<url>?region=splice(specifier,undefined,new-content)) // Insert at the beginning of the comment region.
365
+ * @example [](<url>?region=splice(specifier,0,new-content)) // Insert at the end of the comment region.
366
+ * @example [](<url>?region=splice(specifier,1,new-content)) // Delete one character at the end of the comment region and insert.
367
+ */
368
+ "splice(id: string, deleteCount?: number, insert?: string, space?: string)",
369
+ /**
370
+ * Remap the content within a comment region (which must INCLUDE the specified id).
371
+ *
372
+ * **NOTE:** Unlike `extract`, `remove`, and `replace`, `remap` does not remove the comment from the content after processing.
373
+ * @param id The id of the comment regions to act on.
374
+ * @param from The content to replace.
375
+ * @param to The content to replace with.
376
+ * @param space The space character to use between words in the content to replace (defaults to `-`).
377
+ * @example [](<url>?region=remap(specifier,hello-world,hello-universe))
378
+ * @example [](<url>?region=remap(specifier,hello_world,hello_universe,_)
379
+ */
380
+ "remap(id: string, from: string, to?: string, space?: string)",
351
381
  ]
352
382
  ```
353
383
 
@@ -359,7 +389,7 @@ Skip the default processing behavior for the given type of file.
359
389
 
360
390
  [](src/include.ts?wrap=dropdown(See-default-processing-behavior.)&region=extract(Default-Behavior),replace(...))
361
391
  <!-- p↓ BEGIN -->
362
- <!-- p↓ length lines: 21 chars: 525 -->
392
+ <!-- p↓ length lines: 17 chars: 273 -->
363
393
 
364
394
  <details>
365
395
  <summary>
@@ -368,15 +398,11 @@ See default processing behavior.
368
398
 
369
399
  ```ts
370
400
  if (extension === "md") {
371
-
372
- const getContent = extendGetRelativePathContent(getRelativePathContent, target);
373
- const relative = basePath ? join(basePath, dir) : dir;
374
- const depth = clampHeadingSum(headingDepth, Number(headingModfiier));
375
-
376
- content = recursivelyPopulateInclusions(content, depth, getContent, path, relative);
401
+ * ...
402
+ content = recursivelyPopulateInclusions(content, * ...);
377
403
  }
378
404
  else if (/^(js|ts)x?|svelte$/i.test(extension))
379
- content = wrap(content, "code", { extension, inline });
405
+ content = wrap(content, "code", * ...);
380
406
  ```
381
407
 
382
408
  </details>
@@ -512,7 +538,7 @@ const definitions = [
512
538
 
513
539
  [](.assets/api.md?heading=-1)
514
540
  <!-- p↓ BEGIN -->
515
- <!-- p↓ length lines: 104 chars: 4973 -->
541
+ <!-- p↓ length lines: 105 chars: 4993 -->
516
542
  #### Query Parameters with Function-like APIs
517
543
 
518
544
  Some query parameters have more complex APIs, which are defined by a collection of typescript function singatures (limited to only `string`, `boolean`, and `number` arguments), like:
@@ -543,7 +569,7 @@ Please note the following:
543
569
 
544
570
  [](src/utils.ts?region=extract(url))
545
571
  <!-- p↓ BEGIN -->
546
- <!-- p↓ length lines: 31 chars: 498 -->
572
+ <!-- p↓ length lines: 32 chars: 518 -->
547
573
 
548
574
  ```ts
549
575
  const urlCharacters = {
@@ -571,6 +597,7 @@ const urlCharacters = {
571
597
  ["square"]: "[",
572
598
  ["unsquare"]: "]",
573
599
  ["tick"]: "`",
600
+ ["line"]: "\n",
574
601
  }
575
602
  }
576
603
  ```
package/dist/cli.js CHANGED
@@ -1,14 +1,15 @@
1
1
  #!/usr/bin/env node
2
- import { Command as t } from "@commander-js/extra-typings";
3
- import { populateMarkdownInclusions as l, depopulateMarkdownInclusions as r } from "@p-buddy/parkdown";
4
- const f = "0.0.11", p = new t().version(f).option("--nw, --no-write", "Do NOT write result to file (defaults to false)", !1).option("--ni, --no-inclusions", "Do NOT process file inclusions (defaults to false)", !1).option("-d, --depopulate", "Remove populated inclusions from the file", !1).option("-f, --file <flag>", "The file(s) to process", (s, o) => (o.push(s), o), new Array()).parse(), { inclusions: c, depopulate: u, file: n, write: i } = p.opts();
5
- n.length === 0 && n.push("README.md");
6
- const a = [
7
- [l, !c],
8
- [r, u]
2
+ import { Command as r } from "@commander-js/extra-typings";
3
+ import { populateMarkdownInclusions as l, depopulateMarkdownInclusions as a } from "@p-buddy/parkdown";
4
+ import f from "chokidar";
5
+ const c = "0.0.13", p = new r().version(c).option("--nw, --no-write", "Do NOT write result to file (defaults to false)", !1).option("--ni, --no-inclusions", "Do NOT process file inclusions (defaults to false)", !1).option("-d, --depopulate", "Remove populated inclusions from the file", !1).option("-f, --file <flag>", "The file(s) to process", (e, o) => (o.push(e), o), new Array()).option("-w, --watch", "Watch the file(s) for changes and update automatically", !1).parse(), { inclusions: u, depopulate: d, file: t, write: n, watch: h } = p.opts();
6
+ t.length === 0 && t.push("README.md");
7
+ const m = [
8
+ [l, !u],
9
+ [a, d]
9
10
  ];
10
- for (const [s] of a.filter(([o, e]) => e))
11
- for (const o of n) {
12
- const e = s(o, !i);
13
- i && console.log(e);
11
+ for (const [e] of m.filter(([o, s]) => s))
12
+ for (const o of t) {
13
+ const s = h ? f.watch([], { persistent: !0, awaitWriteFinish: !0, atomic: !0 }) : void 0, i = e(o, !n, s);
14
+ n && console.log(i);
14
15
  }
package/dist/index.d.ts CHANGED
@@ -1,5 +1,9 @@
1
- export declare const depopulateMarkdownInclusions: (file: string, writeFile?: boolean) => string;
1
+ import { default as default_2 } from 'chokidar';
2
2
 
3
- export declare const populateMarkdownInclusions: (file: string, writeFile?: boolean) => string;
3
+ export declare const depopulateMarkdownInclusions: (file: string, writeFile?: boolean, watcher?: Watcher) => string;
4
+
5
+ export declare const populateMarkdownInclusions: (file: string, writeFile?: boolean, watcher?: Watcher) => string;
6
+
7
+ declare type Watcher = ReturnType<typeof default_2.watch>;
4
8
 
5
9
  export { }
package/dist/index.js CHANGED
@@ -1,84 +1,84 @@
1
- var fe = Object.defineProperty;
2
- var de = (e, t, n) => t in e ? fe(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n;
3
- var B = (e, t, n) => de(e, typeof t != "symbol" ? t + "" : t, n);
4
- import { writeFileSync as Z, readFileSync as ve } from "node:fs";
5
- import { basename as we, dirname as O, join as y, resolve as K } from "node:path";
6
- import { URLSearchParams as $e } from "node:url";
7
- import { unified as Ce } from "unified";
1
+ var he = Object.defineProperty;
2
+ var de = (e, n, t) => n in e ? he(e, n, { enumerable: !0, configurable: !0, writable: !0, value: t }) : e[n] = t;
3
+ var F = (e, n, t) => de(e, typeof n != "symbol" ? n + "" : n, t);
4
+ import { writeFileSync as K, readFileSync as ve } from "node:fs";
5
+ import { basename as $e, dirname as A, join as y, resolve as Y } from "node:path";
6
+ import { URLSearchParams as Ce } from "node:url";
7
+ import { unified as we } from "unified";
8
8
  import Ee from "remark-parse";
9
9
  import { visit as ye } from "unist-util-visit";
10
- import { dedent as R } from "ts-dedent";
11
- const g = (e, t) => e.position.start.offset - t.position.start.offset;
12
- g.reverse = (e, t) => g(t, e);
13
- const j = (e) => e.position !== void 0 && e.position.start.offset !== void 0 && e.position.end.offset !== void 0, Se = Ce().use(Ee), A = {
10
+ import { dedent as j } from "ts-dedent";
11
+ const f = (e, n) => e.position.start.offset - n.position.start.offset;
12
+ f.reverse = (e, n) => f(n, e);
13
+ const D = (e) => e.position !== void 0 && e.position.start.offset !== void 0 && e.position.end.offset !== void 0, Se = we().use(Ee), I = {
14
14
  md: (e) => Se.parse(e)
15
- }, S = (e, t) => {
16
- const n = [];
15
+ }, S = (e, n) => {
16
+ const t = [];
17
17
  return ye(e, (s, o, r) => {
18
18
  if (s.type !== "root") {
19
- if (t && s.type !== t) return;
20
- if (j(s)) {
19
+ if (n && s.type !== n) return;
20
+ if (D(s)) {
21
21
  const i = ((r == null ? void 0 : r.children.length) ?? 0) - 1;
22
- n.push({ ...s, siblingIndex: o, siblingCount: i });
22
+ t.push({ ...s, siblingIndex: o, siblingCount: i });
23
23
  }
24
24
  }
25
- }), n;
26
- }, xe = (e) => e.children.length === 0, Y = (e, t, ...n) => {
27
- if (n.length === 0) throw new Error("No nodes to replace content from");
28
- n.sort(g);
29
- const s = n.at(0), o = n.at(-1);
30
- return e.slice(0, s.position.start.offset) + t + e.slice(o.position.end.offset);
31
- }, Ne = (e, t, n) => {
32
- const s = Math.min(t.position.end.offset, n.position.end.offset), o = Math.max(t.position.start.offset, n.position.start.offset);
25
+ }), t;
26
+ }, xe = (e) => e.children.length === 0, ee = (e, n, ...t) => {
27
+ if (t.length === 0) throw new Error("No nodes to replace content from");
28
+ t.sort(f);
29
+ const s = t.at(0), o = t.at(-1);
30
+ return e.slice(0, s.position.start.offset) + n + e.slice(o.position.end.offset);
31
+ }, Ne = (e, n, t) => {
32
+ const s = Math.min(n.position.end.offset, t.position.end.offset), o = Math.max(n.position.start.offset, t.position.start.offset);
33
33
  return e.slice(s, o);
34
34
  }, E = (...e) => e.join(" "), be = (...e) => e.join(`
35
35
  `), ke = (e) => {
36
- const t = e.split("?");
37
- return t.length > 1 ? [t.slice(0, -1).join("?"), t.at(-1)] : [e, ""];
36
+ const n = e.split("?");
37
+ return n.length > 1 ? [n.slice(0, -1).join("?"), n.at(-1)] : [e, ""];
38
38
  }, Me = (e) => ke(e)[0];
39
39
  class d {
40
- constructor(...t) {
41
- B(this, "intervals", []);
42
- for (const [n, s] of t)
43
- this.push(n, s);
40
+ constructor(...n) {
41
+ F(this, "intervals", []);
42
+ for (const [t, s] of n)
43
+ this.push(t, s);
44
44
  }
45
- push(t, n) {
46
- this.intervals.push([Math.min(t, n), Math.max(t, n)]);
45
+ push(n, t) {
46
+ this.intervals.push([Math.min(n, t), Math.max(n, t)]);
47
47
  }
48
- combine(t) {
49
- this.intervals.push(...t.intervals);
48
+ combine(n) {
49
+ this.intervals.push(...n.intervals);
50
50
  }
51
51
  collapse() {
52
- const { intervals: t } = this;
53
- if (!t.length) return this.intervals = [];
54
- t.sort((r, i) => r[0] - i[0]);
55
- const n = [];
56
- let [s, o] = t[0];
57
- for (let r = 1; r < t.length; r++) {
58
- const [i, c] = t[r];
59
- i <= o ? o = Math.max(o, c) : (n.push([s, o]), s = i, o = c);
52
+ const { intervals: n } = this;
53
+ if (!n.length) return this.intervals = [];
54
+ n.sort((r, i) => r[0] - i[0]);
55
+ const t = [];
56
+ let [s, o] = n[0];
57
+ for (let r = 1; r < n.length; r++) {
58
+ const [i, l] = n[r];
59
+ i <= o ? o = Math.max(o, l) : (t.push([s, o]), s = i, o = l);
60
60
  }
61
- return n.push([s, o]), this.intervals = n;
61
+ return t.push([s, o]), this.intervals = t;
62
62
  }
63
- subtract(t) {
64
- const { intervals: n } = this, { intervals: s } = t;
65
- if (!n.length || !s.length) return n;
66
- let o = [...n];
63
+ subtract(n) {
64
+ const { intervals: t } = this, { intervals: s } = n;
65
+ if (!t.length || !s.length) return t;
66
+ let o = [...t];
67
67
  for (const [r, i] of s) {
68
- const c = [];
69
- for (const [l, a] of o) {
70
- if (i <= l || r >= a) {
71
- c.push([l, a]);
68
+ const l = [];
69
+ for (const [c, a] of o) {
70
+ if (i <= c || r >= a) {
71
+ l.push([c, a]);
72
72
  continue;
73
73
  }
74
- r > l && c.push([l, r]), i < a && c.push([i, a]);
74
+ r > c && l.push([c, r]), i < a && l.push([i, a]);
75
75
  }
76
- o = c;
76
+ o = l;
77
77
  }
78
78
  return this.intervals = o;
79
79
  }
80
80
  }
81
- const F = /,\s*(?![^()]*\))/, U = {
81
+ const U = /,\s*(?![^()]*\))/, H = {
82
82
  reserved: {
83
83
  semi: ";",
84
84
  slash: "/",
@@ -114,87 +114,87 @@ const F = /,\s*(?![^()]*\))/, U = {
114
114
  [/p↓:\s+/g, ""]
115
115
  ],
116
116
  url: [
117
- ...Object.entries(U.unsafe),
118
- ...Object.entries(U.reserved)
117
+ ...Object.entries(H.unsafe),
118
+ ...Object.entries(H.reserved)
119
119
  ]
120
- }, H = (e, [t, n]) => e.replaceAll(t, n), D = (e, t = _e) => {
121
- const n = G.static.reduce(H, e);
122
- return G.url.map(([s, o]) => [t + s + t, o]).reduce(H, n).replaceAll(t, " ");
123
- }, Te = (e) => e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), Oe = ["string", "number", "boolean"], Re = (e) => Oe.includes(e), je = /^([a-zA-Z0-9_-]+)(?:\(([^)]*)\))?$/, Ae = (e) => {
124
- const t = e.match(je);
125
- if (!t) throw new Error(`Invalid invocation: ${e}`);
126
- const [, n, s = ""] = t;
127
- if (!s.trim()) return { name: n, parameters: [] };
120
+ }, Q = (e, [n, t]) => e.replaceAll(n, t), N = (e, n = _e) => {
121
+ const t = G.static.reduce(Q, e);
122
+ return G.url.map(([s, o]) => [n + s + n, o]).reduce(Q, t).replaceAll(n, " ");
123
+ }, Re = (e) => e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), Oe = ["string", "number", "boolean"], Te = (e) => Oe.includes(e), Ae = /^([a-zA-Z0-9_-]+)(?:\(([^)]*)\))?$/, je = (e) => {
124
+ const n = e.match(Ae);
125
+ if (!n) throw new Error(`Invalid invocation: ${e}`);
126
+ const [, t, s = ""] = n;
127
+ if (!s.trim()) return { name: t, parameters: [] };
128
128
  const o = Ie(s);
129
- return { name: n, parameters: o };
130
- }, De = (e, t) => {
131
- for (let n = t + 1; n < e.length; n++)
132
- if (e[n] !== void 0) return !1;
129
+ return { name: t, parameters: o };
130
+ }, De = (e, n) => {
131
+ for (let t = n + 1; t < e.length; t++)
132
+ if (e[t] !== void 0) return !1;
133
133
  return !0;
134
134
  }, Ie = (e) => {
135
- const t = [];
136
- let n = "", s = !1;
135
+ const n = [];
136
+ let t = "", s = !1;
137
137
  for (let o = 0; o < e.length; o++) {
138
138
  const r = e[o], i = r === "'";
139
139
  if (i && e.at(o + 1) === "'") {
140
- const c = e.at(o + 2) === "'";
141
- s = !s, n += c ? "'''" : "''", o += c ? 2 : 1;
142
- } else i ? (s = !s, n += r) : r === "," && !s ? (t.push(n.trim()), n = "") : n += r;
140
+ const l = e.at(o + 2) === "'";
141
+ s = !s, t += l ? "'''" : "''", o += l ? 2 : 1;
142
+ } else i ? (s = !s, t += r) : r === "," && !s ? (n.push(t.trim()), t = "") : t += r;
143
143
  }
144
- return t.push(n.trim()), t.map((o) => o === "" ? void 0 : o ? Pe(o) : void 0).filter((o, r, i) => o !== void 0 || !De(i, r));
144
+ return n.push(t.trim()), n.map((o) => o === "" ? void 0 : o ? Pe(o) : void 0).filter((o, r, i) => o !== void 0 || !De(i, r));
145
145
  }, Pe = (e) => {
146
- const t = e.length >= 2 && e[0] === "'" && e.at(-1) === "'", n = t && e.length >= 4 && e[1] === "'" && e.at(-2) === "'";
147
- return !t || n ? e : e.slice(1, -1);
146
+ const n = e.length >= 2 && e[0] === "'" && e.at(-1) === "'", t = n && e.length >= 4 && e[1] === "'" && e.at(-2) === "'";
147
+ return !n || t ? e : e.slice(1, -1);
148
148
  }, We = (e) => {
149
- const t = /^(\w+)(?:\(([^)]*)\))?/, n = e.match(t);
150
- if (!n) return { name: e };
151
- const [, s, o] = n;
149
+ const n = /^(\w+)(?:\(([^)]*)\))?/, t = e.match(n);
150
+ if (!t) return { name: e };
151
+ const [, s, o] = t;
152
152
  if (!o) return { name: s };
153
153
  const r = /(\w+)(\?)?:\s*([^,]+)/g, i = [];
154
- let c;
155
- for (; (c = r.exec(o)) !== null; ) {
156
- const [, l, a, u] = c, p = u.trim();
157
- if (!Re(p)) throw new Error(`Unsupported type: ${p}`);
158
- i.push({ name: l, optional: a === "?", type: p });
154
+ let l;
155
+ for (; (l = r.exec(o)) !== null; ) {
156
+ const [, c, a, u] = l, p = u.trim();
157
+ if (!Te(p)) throw new Error(`Unsupported type: ${p}`);
158
+ i.push({ name: c, optional: a === "?", type: p });
159
159
  }
160
160
  return { name: s, parameters: i };
161
- }, I = (e) => {
162
- const t = e.map(We).reduce(
163
- (n, { name: s, parameters: o }) => n.set(s, o),
161
+ }, P = (e) => {
162
+ const n = e.map(We).reduce(
163
+ (t, { name: s, parameters: o }) => t.set(s, o),
164
164
  /* @__PURE__ */ new Map()
165
165
  );
166
- return (n) => {
167
- const { name: s, parameters: o } = Ae(n);
168
- if (!t.has(s))
166
+ return (t) => {
167
+ const { name: s, parameters: o } = je(t);
168
+ if (!n.has(s))
169
169
  throw new Error(`Unknown method: ${s}`);
170
- const r = t.get(s);
170
+ const r = n.get(s);
171
171
  if (r === void 0)
172
172
  return { name: s };
173
173
  if (o.length > r.length) {
174
- const i = r.filter(({ optional: l }) => !l).length, c = i === r.length ? i.toString() : `${i} - ${r.length}`;
175
- throw new Error(`Too many parameters: ${o.length} for method '${s}' (expected: ${c})`);
174
+ const i = r.filter(({ optional: c }) => !c).length, l = i === r.length ? i.toString() : `${i} - ${r.length}`;
175
+ throw new Error(`Too many parameters: ${o.length} for method '${s}' (expected: ${l})`);
176
176
  }
177
- return r.reduce((i, { name: c, optional: l, type: a }, u) => {
177
+ return r.reduce((i, { name: l, optional: c, type: a }, u) => {
178
178
  const p = o[u];
179
179
  if (p === void 0) {
180
- if (l) return i;
181
- throw new Error(`Missing required parameter: ${c} for method '${s}'`);
180
+ if (c) return i;
181
+ throw new Error(`Missing required parameter: ${l} for method '${s}'`);
182
182
  }
183
183
  switch (a) {
184
184
  case "string":
185
- i[c] = p;
185
+ i[l] = p;
186
186
  break;
187
187
  case "number":
188
188
  case "boolean":
189
- i[c] = JSON.parse(p);
189
+ i[l] = JSON.parse(p);
190
190
  break;
191
191
  }
192
- if (typeof i[c] !== a)
193
- throw new Error(`Invalid type: ${c} must be ${a}, got ${typeof i[c]} for method '${s}'`);
192
+ if (typeof i[l] !== a)
193
+ throw new Error(`Invalid type: ${l} must be ${a}, got ${typeof i[l]} for method '${s}'`);
194
194
  return i;
195
195
  }, { name: s });
196
196
  };
197
- }, Q = (e) => Object.entries(e).filter(([t]) => t !== "name" && !isNaN(Number(t))).map(([t, n]) => n), Le = [
197
+ }, z = (e) => Object.entries(e).filter(([n]) => n !== "name" && !isNaN(Number(n))).map(([n, t]) => t), Le = [
198
198
  /**
199
199
  * Wraps the content in a markdown-formatted code block.
200
200
  * @param lang The language of the code block (defaults to the file extension).
@@ -224,50 +224,54 @@ const F = /,\s*(?![^()]*\))/, U = {
224
224
  * @example [](<url>?wrap=dropdown(hello_world,,_))
225
225
  */
226
226
  "dropdown(summary: string, open?: boolean, space?: string)"
227
- ], qe = I(Le), f = (e, t = 1) => `
228
- `.repeat(t) + e + `
229
- `.repeat(t), T = (e, t, n) => `<${t}${n ? ` ${n}` : ""}>${f(e)}</${t}>`, z = (e, t, n) => {
230
- const s = qe(t);
227
+ ], qe = P(Le), h = (e, n = 1) => `
228
+ `.repeat(n) + e + `
229
+ `.repeat(n), T = (e, n, t) => `<${n}${t ? ` ${t}` : ""}>${h(e)}</${n}>`, X = (e, n, t) => {
230
+ const s = qe(n);
231
231
  switch (s.name) {
232
232
  case "code":
233
- if (!s.lang && !s.meta && (n == null ? void 0 : n.inline) && !e.includes(`
233
+ if (!s.lang && !s.meta && (t == null ? void 0 : t.inline) && !e.includes(`
234
234
  `)) return `\`${e}\``;
235
- const r = s.lang ?? (n == null ? void 0 : n.extension) ?? "", i = s.meta ? ` ${s.meta}` : "";
236
- return f(`\`\`\`${r}${i}${f(e)}\`\`\``);
235
+ const r = s.lang ?? (t == null ? void 0 : t.extension) ?? "", i = s.meta ? ` ${s.meta}` : "";
236
+ return h(`\`\`\`${r}${i}${h(e)}\`\`\``);
237
237
  case "quote":
238
- return n != null && n.inline && !e.includes(`
238
+ return t != null && t.inline && !e.includes(`
239
239
 
240
- `) ? `> ${e}` : f(T(f(e), "blockquote"));
240
+ `) ? `> ${e}` : h(T(h(e), "blockquote"));
241
241
  case "dropdown":
242
- const c = T(D(s.summary), "summary");
243
- return f(T([c, e].join(`
242
+ const l = T(N(s.summary), "summary");
243
+ return h(T([l, e].join(`
244
244
  `), "details", s.open ? "open" : void 0));
245
245
  }
246
- }, P = (e) => {
247
- const t = /(\/\/[^\n]*|\/\*[\s\S]*?\*\/|<!--[\s\S]*?-->)/gm, n = [];
246
+ }, W = (e) => {
247
+ const n = /(\/\/[^\n]*|\/\*[\s\S]*?\*\/|<!--[\s\S]*?-->)/gm, t = [];
248
248
  let s;
249
- for (; (s = t.exec(e)) !== null; ) {
249
+ for (; (s = n.exec(e)) !== null; ) {
250
250
  const o = [s.index, s.index + s[0].length], r = Be(s[0]).trim();
251
- n.push({ range: o, value: r });
251
+ t.push({ range: o, value: r });
252
252
  }
253
- return n;
254
- }, Be = (e) => e.startsWith("//") ? e.slice(2) : e.startsWith("/*") ? e.slice(2, -2) : e.startsWith("<!--") ? e.slice(4, -3) : e, ee = [
253
+ return t;
254
+ }, Be = (e) => e.startsWith("//") ? e.slice(2) : e.startsWith("/*") ? e.slice(2, -2) : e.startsWith("<!--") ? e.slice(4, -3) : e, ne = [
255
255
  "p↓:",
256
256
  "pd:",
257
257
  "parkdown:"
258
258
  ], Fe = [
259
259
  "splice(delete?: number, insert?: string)"
260
260
  ];
261
- I(Fe);
262
- const te = (e, t) => e.range[0] - t.range[0], ne = (e, t, n) => (n ?? P(e)).filter(({ value: s }) => s.includes(t)).sort(te), X = (e) => ({
261
+ P(Fe);
262
+ const te = (e, n) => e.range[0] - n.range[0], se = (e, n, t) => (t ?? W(e)).filter(({ value: s }) => s.split(" ").includes(n)).sort(te), V = (e) => ({
263
263
  isSpace: e === " ",
264
264
  isNewline: e === `
265
265
  ` || e === void 0
266
- }), V = (e) => ee.flatMap((t) => ne(e, t)).sort((t, n) => t.range[0] - n.range[0]).reverse().reduce((t, { range: [n, s], value: o }) => {
267
- const r = (a, u) => t.slice(0, a) + t.slice(u), i = X(t[n - 1]), c = X(t[s]), l = s === t.length;
268
- return i.isNewline && c.isNewline ? r(n - (l ? 1 : 0), s + 1) : i.isNewline ? r(n, s + (c.isSpace ? 1 : 0)) : r(n - (i.isSpace ? 1 : 0), s);
266
+ }), J = (e) => ne.flatMap((n) => se(e, n)).sort((n, t) => n.range[0] - t.range[0]).reverse().reduce((n, { range: [t, s], value: o }) => {
267
+ const r = (p, b) => n.slice(0, p) + n.slice(b), i = V(n[t - 1]), l = V(n[s]), c = s === n.length;
268
+ let a = t;
269
+ for (; a > 0 && n[a - 1] !== `
270
+ `; ) a--;
271
+ const u = n.slice(a, t).trim() === "";
272
+ return i.isNewline && l.isNewline ? r(t - (c ? 1 : 0), s + 1) : i.isNewline || u ? r(a, s + (l.isSpace || l.isNewline ? 1 : 0)) : r(t - (i.isSpace ? 1 : 0), s);
269
273
  }, e);
270
- ee.map((e) => new RegExp(`^${Te(e)}(\\?[^\\s]+)`));
274
+ ne.map((e) => new RegExp(`^${Re(e)}(\\?[^\\s]+)`));
271
275
  const Ue = [
272
276
  /**
273
277
  * Extract regions from the retrieved content between comments that INCLUDE the specified ids.
@@ -326,66 +330,74 @@ const Ue = [
326
330
  * @example [](<url>?region=remap(specifier,hello-world,hello-universe))
327
331
  * @example [](<url>?region=remap(specifier,hello_world,hello_universe,_)
328
332
  */
329
- "remap(id: string, from: string, to: string, space?: string)"
330
- ], Ge = I(Ue), C = (e, t, n) => {
331
- const s = ne(e, t, n), o = [];
333
+ "remap(id: string, from: string, to?: string, space?: string)"
334
+ ], He = P(Ue), v = (e, n, t) => {
335
+ const s = se(e, n, t), o = [];
332
336
  for (let r = 0; r < s.length - 1; r += 2)
333
337
  o.push([s[r], s[r + 1]]);
334
338
  return o;
335
- }, He = (e, ...t) => {
336
- if (t.length === 0) return e;
337
- const n = P(e), s = ([i, c]) => e.slice(i, c), o = new d(), r = new d();
338
- for (const i of t)
339
- for (const [c, l] of C(e, i, n)) {
340
- o.push(c.range[1], l.range[0]);
341
- const [a, ...u] = s([c.range[1], l.range[0]]), p = u[u.length - 1];
342
- r.push(c.range[0], c.range[1] + (a.trim() ? 0 : 1)), r.push(l.range[0], l.range[1] + (p.trim() ? 0 : 1));
339
+ }, Ge = (e, ...n) => {
340
+ if (n.length === 0) return e;
341
+ const t = W(e), s = ([i, l]) => e.slice(i, l), o = new d(), r = new d();
342
+ for (const i of n)
343
+ for (const [l, c] of v(e, i, t)) {
344
+ o.push(l.range[1], c.range[0]);
345
+ const [a, ...u] = s([l.range[1], c.range[0]]), p = u[u.length - 1];
346
+ r.push(l.range[0], l.range[1] + (a.trim() ? 0 : 1)), r.push(c.range[0], c.range[1] + (p.trim() ? 0 : 1));
343
347
  }
344
- return o.collapse(), r.collapse(), R(
348
+ return o.collapse(), r.collapse(), j(
345
349
  o.subtract(r).map(s).filter(Boolean).join("")
346
350
  ).trim();
347
- }, Qe = (e, ...t) => {
348
- if (t.length === 0) return e;
349
- const n = P(e), s = ([i, c]) => e.slice(i, c), o = new d();
350
- for (const i of t)
351
- for (const [c, l] of C(e, i, n)) {
352
- const a = s([l.range[1], l.range[1] + 1]).at(-1);
353
- o.push(c.range[0], a === `
354
- ` ? l.range[1] + 1 : l.range[1]);
351
+ }, Qe = (e, ...n) => {
352
+ if (n.length === 0) return e;
353
+ const t = W(e), s = ([i, l]) => e.slice(i, l), o = new d();
354
+ for (const i of n)
355
+ for (const [l, c] of v(e, i, t)) {
356
+ const a = s([c.range[1], c.range[1] + 1]).at(-1);
357
+ o.push(l.range[0], a === `
358
+ ` ? c.range[1] + 1 : c.range[1]);
355
359
  }
356
360
  o.collapse();
357
361
  const r = new d([0, e.length]);
358
- return r.subtract(o), R(
362
+ return r.subtract(o), j(
359
363
  r.collapse().map(s).filter(Boolean).join("")
360
364
  ).trim();
361
- }, ze = (e, t, n, s) => {
362
- if (!t) return e;
365
+ }, ze = (e, n, t, s) => {
366
+ if (!n) return e;
363
367
  let o = "", r = 0;
364
- for (const [c, l] of C(e, t))
365
- o += e.slice(r, c.range[1]), o += D(n ?? c.value, s), r = l.range[0];
368
+ for (const [l, c] of v(e, n))
369
+ o += e.slice(r, l.range[1]), o += N(t ?? l.value, s), r = c.range[0];
366
370
  o += e.slice(r);
367
371
  const i = new d([0, o.length]);
368
372
  return i.subtract(new d(
369
- ...C(o, t).flatMap(([c, l]) => [c.range, l.range])
370
- )), R(
371
- i.collapse().map(([c, l]) => o.slice(c, l)).filter(Boolean).join("")
373
+ ...v(o, n).flatMap(([l, c]) => [l.range, c.range])
374
+ )), j(
375
+ i.collapse().map(([l, c]) => o.slice(l, c)).filter(Boolean).join("")
372
376
  ).trim();
373
- }, Xe = (e, t, n, s, o) => {
374
- if (!t) return e;
375
- const r = n === void 0 ? !1 : n >= 0, i = s ? D(s, o) : "", c = n ?? 0;
376
- return C(e, t).map((l) => l[r ? 1 : 0]).sort(te).reverse().reduce(
377
- (l, { range: a }) => r ? l.slice(0, a[1]) + i + l.slice(Math.min(a[1] + c, l.length)) : l.slice(0, Math.max(a[0] + c, 0)) + i + l.slice(a[0]),
377
+ }, Xe = (e, n, t, s, o) => {
378
+ if (!n) return e;
379
+ const r = t === void 0 ? !1 : t >= 0, i = s ? N(s, o) : "", l = t ?? 0;
380
+ return v(e, n).map((c) => c[r ? 1 : 0]).sort(te).reverse().reduce(
381
+ (c, { range: a }) => r ? c.slice(0, a[1]) + i + c.slice(Math.min(a[1] + l, c.length)) : c.slice(0, Math.max(a[0] + l, 0)) + i + c.slice(a[0]),
378
382
  e
379
383
  );
380
- }, Ve = (e, t, n) => {
381
- if (!t) return V(e);
382
- const s = Ge(t);
384
+ }, Ve = (e, n, t, s, o) => {
385
+ if (!n) return e;
386
+ let r = "", i = 0;
387
+ const l = [t, s ?? ""].map((c) => N(c, o));
388
+ console.log(l);
389
+ for (const [c, a] of v(e, n))
390
+ r += e.slice(i, c.range[1]), r += e.slice(c.range[1], a.range[0]).replaceAll(l[0], l[1]), i = a.range[0];
391
+ return r += e.slice(i), r;
392
+ }, Je = (e, n, t) => {
393
+ if (!n) return J(e);
394
+ const s = He(n);
383
395
  switch (s.name) {
384
396
  case "extract":
385
- e = He(e, s.id, ...Q(s));
397
+ e = Ge(e, s.id, ...z(s));
386
398
  break;
387
399
  case "remove":
388
- e = Qe(e, s.id, ...Q(s));
400
+ e = Qe(e, s.id, ...z(s));
389
401
  break;
390
402
  case "replace":
391
403
  e = ze(e, s.id, s.with, s.space);
@@ -393,9 +405,12 @@ const Ue = [
393
405
  case "splice":
394
406
  e = Xe(e, s.id, s.deleteCount, s.insert, s.space);
395
407
  break;
408
+ case "remap":
409
+ e = Ve(e, s.id, s.from, s.to, s.space);
410
+ break;
396
411
  }
397
- return n ? V(e) : e;
398
- }, Je = ["http", "./", "../"], Ze = ({ url: e }) => Je.some((t) => e.startsWith(t)), Ke = (e) => j(e) && xe(e) && Ze(e), se = ({ url: e }, t) => `[](${t ? y(t, e) : e})`, m = {
412
+ return t ? J(e) : e;
413
+ }, Ze = ["http", "./", "../"], Ke = ({ url: e }) => Ze.some((n) => e.startsWith(n)), Ye = (e) => D(e) && xe(e) && Ke(e), oe = ({ url: e }, n) => `[](${n ? y(n, e) : e})`, m = {
399
414
  _open: "<!--",
400
415
  _close: "-->",
401
416
  _flag: "p↓",
@@ -406,21 +421,21 @@ const Ue = [
406
421
  return E(m._open, m._flag, "END", m._close);
407
422
  },
408
423
  lengthOf(e) {
409
- const t = `lines: ${e.split(`
410
- `).length}`, n = `chars: ${e.length}`;
411
- return E(m._open, m._flag, "length", t, n, m._close);
424
+ const n = `lines: ${e.split(`
425
+ `).length}`, t = `chars: ${e.length}`;
426
+ return E(m._open, m._flag, "length", n, t, m._close);
412
427
  }
413
- }, J = (e) => (t) => j(t) && t.value === m[e], Ye = ({ position: e, url: t, siblingCount: n }, s) => ({ position: e, url: t, headingDepth: s, inline: n >= 1 }), et = ({ position: { start: e }, url: t, siblingCount: n }, { position: { end: s } }, o) => ({ position: { start: e, end: s }, url: t, headingDepth: o, inline: n >= 1 }), tt = (e, t, n) => (e.inline ? E : be)(
414
- se(e, n),
428
+ }, Z = (e) => (n) => D(n) && n.value === m[e], en = ({ position: e, url: n, siblingCount: t }, s) => ({ position: e, url: n, headingDepth: s, inline: t >= 1 }), nn = ({ position: { start: e }, url: n, siblingCount: t }, { position: { end: s } }, o) => ({ position: { start: e, end: s }, url: n, headingDepth: o, inline: t >= 1 }), tn = (e, n, t) => (e.inline ? E : be)(
429
+ oe(e, t),
415
430
  m.begin,
416
- m.lengthOf(t),
417
- t,
431
+ m.lengthOf(n),
432
+ n,
418
433
  m.end
419
- ), nt = (e) => {
420
- const t = S(e, "heading").reduce((n, { position: s, depth: o }) => n.set(s.start.line, o), /* @__PURE__ */ new Map());
421
- return (n) => {
422
- for (let s = n.position.start.line; s >= 1; s--) {
423
- const o = t.get(s);
434
+ ), sn = (e) => {
435
+ const n = S(e, "heading").reduce((t, { position: s, depth: o }) => t.set(s.start.line, o), /* @__PURE__ */ new Map());
436
+ return (t) => {
437
+ for (let s = t.position.start.line; s >= 1; s--) {
438
+ const o = n.get(s);
424
439
  if (o) return o;
425
440
  }
426
441
  return 0;
@@ -429,27 +444,27 @@ const Ue = [
429
444
  openingCommentDoesNotFollowLink: ({ position: { start: e } }) => new Error(`Opening comment (@${e.line}:${e.column}) does not follow link`),
430
445
  closingCommentNotMatchedToOpening: ({ position: { start: e } }) => new Error(`Closing comment (@${e.line}:${e.column}) does not match to opening comment`),
431
446
  openingCommentNotClosed: ({ position: { start: e } }) => new Error(`Opening comment (@${e.line}:${e.column}) is not followed by a closing comment`)
432
- }, st = (e, t) => {
433
- const n = [], s = [
447
+ }, on = (e, n) => {
448
+ const t = [], s = [
434
449
  ...e.map((r) => ({ node: r, type: "open" })),
435
- ...t.map((r) => ({ node: r, type: "close" }))
436
- ].sort((r, i) => g(r.node, i.node)), o = [];
450
+ ...n.map((r) => ({ node: r, type: "close" }))
451
+ ].sort((r, i) => f(r.node, i.node)), o = [];
437
452
  for (const r of s)
438
453
  if (r.type === "open") o.push(r);
439
454
  else {
440
455
  const i = r.node;
441
456
  if (o.length === 0)
442
457
  throw x.closingCommentNotMatchedToOpening(i);
443
- const c = o.pop().node;
458
+ const l = o.pop().node;
444
459
  if (o.length > 0) continue;
445
- n.push({ open: c, close: i });
460
+ t.push({ open: l, close: i });
446
461
  }
447
462
  if (o.length > 0)
448
463
  throw x.openingCommentNotClosed(o[0].node);
449
- return n;
450
- }, ot = (e, t, n) => {
451
- const s = [...t].sort(g), o = [];
452
- return [...n].sort((r, i) => g.reverse(r.open, i.open)).forEach((r) => {
464
+ return t;
465
+ }, rn = (e, n, t) => {
466
+ const s = [...n].sort(f), o = [];
467
+ return [...t].sort((r, i) => f.reverse(r.open, i.open)).forEach((r) => {
453
468
  for (; s.length > 0; ) {
454
469
  const i = s.pop();
455
470
  if (i.position.start.offset < r.open.position.start.offset) {
@@ -461,77 +476,84 @@ const Ue = [
461
476
  }
462
477
  throw x.openingCommentDoesNotFollowLink(r.open);
463
478
  }), o.push(...s.reverse()), o.reverse();
464
- }, oe = (e, t) => {
465
- t ?? (t = A.md(e));
466
- const n = nt(t), s = S(t, "link").filter(Ke), o = S(t, "html").sort(g), r = o.filter(J("begin")), i = o.filter(J("end")), c = st(r, i);
467
- return ot(e, s, c).map((a) => Array.isArray(a) ? et(a[0], a[1].close, n(a[0])) : Ye(a, n(a)));
468
- }, rt = (e, { url: t }) => (n) => e(y(O(t), n)), re = (...e) => {
469
- const t = e.reduce((n, s) => n + s, 0);
470
- return Math.min(Math.max(t, 1), 6);
471
- }, it = (e, t, n) => {
472
- if (t === 0) return e;
473
- n ?? (n = A.md(e));
474
- const s = S(n, "heading"), o = e.split(`
479
+ }, re = (e, n) => {
480
+ n ?? (n = I.md(e));
481
+ const t = sn(n), s = S(n, "link").filter(Ye), o = S(n, "html").sort(f), r = o.filter(Z("begin")), i = o.filter(Z("end")), l = on(r, i);
482
+ return rn(e, s, l).map((a) => Array.isArray(a) ? nn(a[0], a[1].close, t(a[0])) : en(a, t(a)));
483
+ }, ln = (e, { url: n }) => (t) => e(y(A(n), t)), ie = (...e) => {
484
+ const n = e.reduce((t, s) => t + s, 0);
485
+ return Math.min(Math.max(n, 1), 6);
486
+ }, cn = (e, n, t) => {
487
+ if (n === 0) return e;
488
+ t ?? (t = I.md(e));
489
+ const s = S(t, "heading"), o = e.split(`
475
490
  `);
476
491
  for (const r of s) {
477
- const { depth: i, position: { start: c, end: l } } = r, a = re(i, t), u = o[c.line - 1].slice(i, l.column), p = "#".repeat(a) + u;
478
- o[c.line - 1] = p, r.depth = a;
492
+ const { depth: i, position: { start: l, end: c } } = r, a = ie(i, n), u = o[l.line - 1].slice(i, c.column), p = "#".repeat(a) + u;
493
+ o[l.line - 1] = p, r.depth = a;
479
494
  }
480
495
  return o.join(`
481
496
  `);
482
- }, ie = (e) => oe(e).reverse().sort(g.reverse).reduce((t, n) => Y(t, se(n), n), e), ce = (e, t, n, s, o) => {
497
+ }, le = (e) => re(e).reverse().sort(f.reverse).reduce((n, t) => ee(n, oe(t), t), e), ce = (e, n, t, s, o) => {
483
498
  try {
484
- e = ie(e), e = it(e, t);
485
- const r = A.md(e);
486
- return oe(e, r).sort(g).reverse().map((i) => {
487
- var L, q;
488
- const { url: c, headingDepth: l } = i, [a, ...u] = we(c).split("?"), p = a.split(".").pop() ?? "", pe = u.join("?"), N = O(c), W = y(N, a);
489
- if (c.startsWith("./") || c.startsWith("../")) {
490
- let h = n(W);
491
- const v = new $e(pe), b = (L = v.get("region")) == null ? void 0 : L.split(F);
492
- h = (b == null ? void 0 : b.reduce(
493
- (w, $, _, { length: ge }) => Ve(w, $, _ === ge - 1),
494
- h
495
- )) ?? h;
496
- const me = v.has("skip"), ue = v.get("heading") ?? 0, he = v.has("inline");
497
- let { inline: k } = i;
498
- if (he && (k = !0), !me)
499
+ e = le(e), e = cn(e, n);
500
+ const r = I.md(e);
501
+ return re(e, r).sort(f).reverse().map((i) => {
502
+ var q, B;
503
+ const { url: l, headingDepth: c } = i, [a, ...u] = $e(l).split("?"), p = a.split(".").pop() ?? "", b = u.join("?"), k = A(l), L = y(k, a);
504
+ if (l.startsWith("./") || l.startsWith("../")) {
505
+ let g = t(L);
506
+ const $ = new Ce(b), M = (q = $.get("region")) == null ? void 0 : q.split(U);
507
+ g = (M == null ? void 0 : M.reduce(
508
+ (C, w, O, { length: fe }) => Je(C, w, O === fe - 1),
509
+ g
510
+ )) ?? g;
511
+ const me = $.has("skip"), ue = $.get("heading") ?? 0, ge = $.has("inline");
512
+ let { inline: _ } = i;
513
+ if (ge && (_ = !0), !me)
499
514
  if (p === "md") {
500
- const w = rt(n, i), $ = o ? y(o, N) : N, _ = re(l, Number(ue));
501
- h = ce(
502
- h,
515
+ const C = ln(t, i), w = o ? y(o, k) : k, O = ie(c, Number(ue));
516
+ g = ce(
517
+ g,
503
518
  /** p↓: ... */
504
- _,
505
- w,
506
- W,
507
- $
519
+ O,
520
+ C,
521
+ L,
522
+ w
508
523
  /** p↓: ... */
509
524
  );
510
- } else /^(js|ts)x?|svelte$/i.test(p) && (h = z(
511
- h,
525
+ } else /^(js|ts)x?|svelte$/i.test(p) && (g = X(
526
+ g,
512
527
  "code",
513
528
  /** p↓: ... */
514
- { extension: p, inline: k }
529
+ { extension: p, inline: _ }
515
530
  /** p↓: ... */
516
531
  ));
517
- const M = (q = v.get("wrap")) == null ? void 0 : q.split(F);
518
- return h = (M == null ? void 0 : M.reduce((w, $) => z(w, $, { extension: p, inline: k }), h)) ?? h, { target: i, content: tt(i, h, o) };
519
- } else throw c.startsWith("http") ? new Error("External web links are not implemented yet") : new Error(`Unsupported link type: ${c}`);
520
- }).reduce((i, { target: c, content: l }) => Y(i, l, c), e);
532
+ const R = (B = $.get("wrap")) == null ? void 0 : B.split(U);
533
+ return g = (R == null ? void 0 : R.reduce((C, w) => X(C, w, { extension: p, inline: _ }), g)) ?? g, { target: i, content: tn(i, g, o) };
534
+ } else throw l.startsWith("http") ? new Error("External web links are not implemented yet") : new Error(`Unsupported link type: ${l}`);
535
+ }).reduce((i, { target: l, content: c }) => ee(i, c, l), e);
521
536
  } catch (r) {
522
537
  throw new Error(`Error populating inclusions in file ${s ?? "(unknown)"}: ${r}`);
523
538
  }
524
- }, le = (e) => ve(e, "utf-8"), ae = (e) => {
525
- const t = K(e), n = O(t);
526
- return { markdown: le(t), dir: n, path: t };
527
- }, ft = (e, t = !0) => {
528
- const { dir: n, path: s, markdown: o } = ae(e), i = ce(o, 0, (c) => le(K(n, Me(c))), s);
529
- return t && Z(s, i), i;
530
- }, dt = (e, t = !0) => {
531
- const { path: n, markdown: s } = ae(e), o = ie(s);
532
- return t && Z(n, o), o;
539
+ }, ae = (e) => ve(e, "utf-8"), pe = (e) => {
540
+ const n = Y(e), t = A(n);
541
+ return { content: ae(n), dir: t, path: n };
542
+ }, an = (e, n = !0, t) => {
543
+ const { dir: s, path: o, content: r } = pe(e);
544
+ t == null || t.unwatch(o), t == null || t.once("change", (c, a) => {
545
+ console.log(`Change detected in "${c}". Regenerating "${o}"...`), an(e, n, t);
546
+ });
547
+ const l = ce(r, 0, (c) => {
548
+ const a = Y(s, Me(c));
549
+ return t == null || t.add(a), ae(a);
550
+ }, o);
551
+ return n && K(o, l), t == null || t.add(o), l;
552
+ }, $n = (e, n = !0, t) => {
553
+ const { path: s, content: o } = pe(e), r = le(o);
554
+ return n && K(s, r), r;
533
555
  };
534
556
  export {
535
- dt as depopulateMarkdownInclusions,
536
- ft as populateMarkdownInclusions
557
+ $n as depopulateMarkdownInclusions,
558
+ an as populateMarkdownInclusions
537
559
  };
@@ -1,14 +1,15 @@
1
- (function(p,m){typeof exports=="object"&&typeof module<"u"?m(exports,require("node:fs"),require("node:path"),require("node:url"),require("unified"),require("remark-parse"),require("unist-util-visit"),require("ts-dedent")):typeof define=="function"&&define.amd?define(["exports","node:fs","node:path","node:url","unified","remark-parse","unist-util-visit","ts-dedent"],m):(p=typeof globalThis<"u"?globalThis:p||self,m(p.index={},p.node_fs,p.node_path,p.node_url,p.unified,p.remarkParse,p.unistUtilVisit,p.tsDedent))})(this,function(p,m,d,ae,pe,ue,me,M){"use strict";var nn=Object.defineProperty;var tn=(p,m,d)=>m in p?nn(p,m,{enumerable:!0,configurable:!0,writable:!0,value:d}):p[m]=d;var le=(p,m,d)=>tn(p,typeof m!="symbol"?m+"":m,d);const v=(e,n)=>e.position.start.offset-n.position.start.offset;v.reverse=(e,n)=>v(n,e);const b=e=>e.position!==void 0&&e.position.start.offset!==void 0&&e.position.end.offset!==void 0,de=pe.unified().use(ue),T={md:e=>de.parse(e)},x=(e,n)=>{const t=[];return me.visit(e,(s,o,r)=>{if(s.type!=="root"){if(n&&s.type!==n)return;if(b(s)){const i=((r==null?void 0:r.children.length)??0)-1;t.push({...s,siblingIndex:o,siblingCount:i})}}}),t},fe=e=>e.children.length===0,_=(e,n,...t)=>{if(t.length===0)throw new Error("No nodes to replace content from");t.sort(v);const s=t.at(0),o=t.at(-1);return e.slice(0,s.position.start.offset)+n+e.slice(o.position.end.offset)},he=(e,n,t)=>{const s=Math.min(n.position.end.offset,t.position.end.offset),o=Math.max(n.position.start.offset,t.position.start.offset);return e.slice(s,o)},k=(...e)=>e.join(" "),ge=(...e)=>e.join(`
2
- `),ve=e=>{const n=e.split("?");return n.length>1?[n.slice(0,-1).join("?"),n.at(-1)]:[e,""]},we=e=>ve(e)[0];class w{constructor(...n){le(this,"intervals",[]);for(const[t,s]of n)this.push(t,s)}push(n,t){this.intervals.push([Math.min(n,t),Math.max(n,t)])}combine(n){this.intervals.push(...n.intervals)}collapse(){const{intervals:n}=this;if(!n.length)return this.intervals=[];n.sort((r,i)=>r[0]-i[0]);const t=[];let[s,o]=n[0];for(let r=1;r<n.length;r++){const[i,c]=n[r];i<=o?o=Math.max(o,c):(t.push([s,o]),s=i,o=c)}return t.push([s,o]),this.intervals=t}subtract(n){const{intervals:t}=this,{intervals:s}=n;if(!t.length||!s.length)return t;let o=[...t];for(const[r,i]of s){const c=[];for(const[l,a]of o){if(i<=l||r>=a){c.push([l,a]);continue}r>l&&c.push([l,r]),i<a&&c.push([i,a])}o=c}return this.intervals=o}}const L=/,\s*(?![^()]*\))/,F={reserved:{semi:";",slash:"/",question:"?",colon:":",at:"@",equal:"=",and:"&"},unsafe:{quote:'"',angle:"<",unangle:">",hash:"#",percent:"%",curly:"{",uncurly:"}",pipe:"|",back:"\\",carrot:"^",tilde:"~",square:"[",unsquare:"]",tick:"`",line:`
3
- `}},$e="-",B={static:[["'''",'"'],["''","'"],[/parkdown:\s+/g,""],[/p↓:\s+/g,""]],url:[...Object.entries(F.unsafe),...Object.entries(F.reserved)]},U=(e,[n,t])=>e.replaceAll(n,t),j=(e,n=$e)=>{const t=B.static.reduce(U,e);return B.url.map(([s,o])=>[n+s+n,o]).reduce(U,t).replaceAll(n," ")},Ce=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),ye=["string","number","boolean"],Ee=e=>ye.includes(e),Se=/^([a-zA-Z0-9_-]+)(?:\(([^)]*)\))?$/,xe=e=>{const n=e.match(Se);if(!n)throw new Error(`Invalid invocation: ${e}`);const[,t,s=""]=n;if(!s.trim())return{name:t,parameters:[]};const o=Ne(s);return{name:t,parameters:o}},ke=(e,n)=>{for(let t=n+1;t<e.length;t++)if(e[t]!==void 0)return!1;return!0},Ne=e=>{const n=[];let t="",s=!1;for(let o=0;o<e.length;o++){const r=e[o],i=r==="'";if(i&&e.at(o+1)==="'"){const c=e.at(o+2)==="'";s=!s,t+=c?"'''":"''",o+=c?2:1}else i?(s=!s,t+=r):r===","&&!s?(n.push(t.trim()),t=""):t+=r}return n.push(t.trim()),n.map(o=>o===""?void 0:o?Me(o):void 0).filter((o,r,i)=>o!==void 0||!ke(i,r))},Me=e=>{const n=e.length>=2&&e[0]==="'"&&e.at(-1)==="'",t=n&&e.length>=4&&e[1]==="'"&&e.at(-2)==="'";return!n||t?e:e.slice(1,-1)},be=e=>{const n=/^(\w+)(?:\(([^)]*)\))?/,t=e.match(n);if(!t)return{name:e};const[,s,o]=t;if(!o)return{name:s};const r=/(\w+)(\?)?:\s*([^,]+)/g,i=[];let c;for(;(c=r.exec(o))!==null;){const[,l,a,h]=c,u=h.trim();if(!Ee(u))throw new Error(`Unsupported type: ${u}`);i.push({name:l,optional:a==="?",type:u})}return{name:s,parameters:i}},O=e=>{const n=e.map(be).reduce((t,{name:s,parameters:o})=>t.set(s,o),new Map);return t=>{const{name:s,parameters:o}=xe(t);if(!n.has(s))throw new Error(`Unknown method: ${s}`);const r=n.get(s);if(r===void 0)return{name:s};if(o.length>r.length){const i=r.filter(({optional:l})=>!l).length,c=i===r.length?i.toString():`${i} - ${r.length}`;throw new Error(`Too many parameters: ${o.length} for method '${s}' (expected: ${c})`)}return r.reduce((i,{name:c,optional:l,type:a},h)=>{const u=o[h];if(u===void 0){if(l)return i;throw new Error(`Missing required parameter: ${c} for method '${s}'`)}switch(a){case"string":i[c]=u;break;case"number":case"boolean":i[c]=JSON.parse(u);break}if(typeof i[c]!==a)throw new Error(`Invalid type: ${c} must be ${a}, got ${typeof i[c]} for method '${s}'`);return i},{name:s})}},G=e=>Object.entries(e).filter(([n])=>n!=="name"&&!isNaN(Number(n))).map(([n,t])=>t),Te=O(["code(lang?: string, meta?: string)","quote()","dropdown(summary: string, open?: boolean, space?: string)"]),$=(e,n=1)=>`
1
+ (function(p,m){typeof exports=="object"&&typeof module<"u"?m(exports,require("node:fs"),require("node:path"),require("node:url"),require("unified"),require("remark-parse"),require("unist-util-visit"),require("ts-dedent")):typeof define=="function"&&define.amd?define(["exports","node:fs","node:path","node:url","unified","remark-parse","unist-util-visit","ts-dedent"],m):(p=typeof globalThis<"u"?globalThis:p||self,m(p.index={},p.node_fs,p.node_path,p.node_url,p.unified,p.remarkParse,p.unistUtilVisit,p.tsDedent))})(this,function(p,m,d,ue,me,de,ge,M){"use strict";var tn=Object.defineProperty;var sn=(p,m,d)=>m in p?tn(p,m,{enumerable:!0,configurable:!0,writable:!0,value:d}):p[m]=d;var pe=(p,m,d)=>sn(p,typeof m!="symbol"?m+"":m,d);const v=(e,n)=>e.position.start.offset-n.position.start.offset;v.reverse=(e,n)=>v(n,e);const T=e=>e.position!==void 0&&e.position.start.offset!==void 0&&e.position.end.offset!==void 0,fe=me.unified().use(de),j={md:e=>fe.parse(e)},x=(e,n)=>{const t=[];return ge.visit(e,(s,o,r)=>{if(s.type!=="root"){if(n&&s.type!==n)return;if(T(s)){const i=((r==null?void 0:r.children.length)??0)-1;t.push({...s,siblingIndex:o,siblingCount:i})}}}),t},he=e=>e.children.length===0,L=(e,n,...t)=>{if(t.length===0)throw new Error("No nodes to replace content from");t.sort(v);const s=t.at(0),o=t.at(-1);return e.slice(0,s.position.start.offset)+n+e.slice(o.position.end.offset)},ve=(e,n,t)=>{const s=Math.min(n.position.end.offset,t.position.end.offset),o=Math.max(n.position.start.offset,t.position.start.offset);return e.slice(s,o)},N=(...e)=>e.join(" "),$e=(...e)=>e.join(`
2
+ `),Ce=e=>{const n=e.split("?");return n.length>1?[n.slice(0,-1).join("?"),n.at(-1)]:[e,""]},we=e=>Ce(e)[0];class ${constructor(...n){pe(this,"intervals",[]);for(const[t,s]of n)this.push(t,s)}push(n,t){this.intervals.push([Math.min(n,t),Math.max(n,t)])}combine(n){this.intervals.push(...n.intervals)}collapse(){const{intervals:n}=this;if(!n.length)return this.intervals=[];n.sort((r,i)=>r[0]-i[0]);const t=[];let[s,o]=n[0];for(let r=1;r<n.length;r++){const[i,l]=n[r];i<=o?o=Math.max(o,l):(t.push([s,o]),s=i,o=l)}return t.push([s,o]),this.intervals=t}subtract(n){const{intervals:t}=this,{intervals:s}=n;if(!t.length||!s.length)return t;let o=[...t];for(const[r,i]of s){const l=[];for(const[c,a]of o){if(i<=c||r>=a){l.push([c,a]);continue}r>c&&l.push([c,r]),i<a&&l.push([i,a])}o=l}return this.intervals=o}}const B=/,\s*(?![^()]*\))/,F={reserved:{semi:";",slash:"/",question:"?",colon:":",at:"@",equal:"=",and:"&"},unsafe:{quote:'"',angle:"<",unangle:">",hash:"#",percent:"%",curly:"{",uncurly:"}",pipe:"|",back:"\\",carrot:"^",tilde:"~",square:"[",unsquare:"]",tick:"`",line:`
3
+ `}},ye="-",U={static:[["'''",'"'],["''","'"],[/parkdown:\s+/g,""],[/p↓:\s+/g,""]],url:[...Object.entries(F.unsafe),...Object.entries(F.reserved)]},H=(e,[n,t])=>e.replaceAll(n,t),k=(e,n=ye)=>{const t=U.static.reduce(H,e);return U.url.map(([s,o])=>[n+s+n,o]).reduce(H,t).replaceAll(n," ")},Se=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Ee=["string","number","boolean"],xe=e=>Ee.includes(e),Ne=/^([a-zA-Z0-9_-]+)(?:\(([^)]*)\))?$/,ke=e=>{const n=e.match(Ne);if(!n)throw new Error(`Invalid invocation: ${e}`);const[,t,s=""]=n;if(!s.trim())return{name:t,parameters:[]};const o=Me(s);return{name:t,parameters:o}},be=(e,n)=>{for(let t=n+1;t<e.length;t++)if(e[t]!==void 0)return!1;return!0},Me=e=>{const n=[];let t="",s=!1;for(let o=0;o<e.length;o++){const r=e[o],i=r==="'";if(i&&e.at(o+1)==="'"){const l=e.at(o+2)==="'";s=!s,t+=l?"'''":"''",o+=l?2:1}else i?(s=!s,t+=r):r===","&&!s?(n.push(t.trim()),t=""):t+=r}return n.push(t.trim()),n.map(o=>o===""?void 0:o?Te(o):void 0).filter((o,r,i)=>o!==void 0||!be(i,r))},Te=e=>{const n=e.length>=2&&e[0]==="'"&&e.at(-1)==="'",t=n&&e.length>=4&&e[1]==="'"&&e.at(-2)==="'";return!n||t?e:e.slice(1,-1)},je=e=>{const n=/^(\w+)(?:\(([^)]*)\))?/,t=e.match(n);if(!t)return{name:e};const[,s,o]=t;if(!o)return{name:s};const r=/(\w+)(\?)?:\s*([^,]+)/g,i=[];let l;for(;(l=r.exec(o))!==null;){const[,c,a,f]=l,u=f.trim();if(!xe(u))throw new Error(`Unsupported type: ${u}`);i.push({name:c,optional:a==="?",type:u})}return{name:s,parameters:i}},O=e=>{const n=e.map(je).reduce((t,{name:s,parameters:o})=>t.set(s,o),new Map);return t=>{const{name:s,parameters:o}=ke(t);if(!n.has(s))throw new Error(`Unknown method: ${s}`);const r=n.get(s);if(r===void 0)return{name:s};if(o.length>r.length){const i=r.filter(({optional:c})=>!c).length,l=i===r.length?i.toString():`${i} - ${r.length}`;throw new Error(`Too many parameters: ${o.length} for method '${s}' (expected: ${l})`)}return r.reduce((i,{name:l,optional:c,type:a},f)=>{const u=o[f];if(u===void 0){if(c)return i;throw new Error(`Missing required parameter: ${l} for method '${s}'`)}switch(a){case"string":i[l]=u;break;case"number":case"boolean":i[l]=JSON.parse(u);break}if(typeof i[l]!==a)throw new Error(`Invalid type: ${l} must be ${a}, got ${typeof i[l]} for method '${s}'`);return i},{name:s})}},G=e=>Object.entries(e).filter(([n])=>n!=="name"&&!isNaN(Number(n))).map(([n,t])=>t),Oe=O(["code(lang?: string, meta?: string)","quote()","dropdown(summary: string, open?: boolean, space?: string)"]),C=(e,n=1)=>`
4
4
  `.repeat(n)+e+`
5
- `.repeat(n),q=(e,n,t)=>`<${n}${t?` ${t}`:""}>${$(e)}</${n}>`,H=(e,n,t)=>{const s=Te(n);switch(s.name){case"code":if(!s.lang&&!s.meta&&(t==null?void 0:t.inline)&&!e.includes(`
6
- `))return`\`${e}\``;const r=s.lang??(t==null?void 0:t.extension)??"",i=s.meta?` ${s.meta}`:"";return $(`\`\`\`${r}${i}${$(e)}\`\`\``);case"quote":return t!=null&&t.inline&&!e.includes(`
5
+ `.repeat(n),R=(e,n,t)=>`<${n}${t?` ${t}`:""}>${C(e)}</${n}>`,Q=(e,n,t)=>{const s=Oe(n);switch(s.name){case"code":if(!s.lang&&!s.meta&&(t==null?void 0:t.inline)&&!e.includes(`
6
+ `))return`\`${e}\``;const r=s.lang??(t==null?void 0:t.extension)??"",i=s.meta?` ${s.meta}`:"";return C(`\`\`\`${r}${i}${C(e)}\`\`\``);case"quote":return t!=null&&t.inline&&!e.includes(`
7
7
 
8
- `)?`> ${e}`:$(q($(e),"blockquote"));case"dropdown":const c=q(j(s.summary),"summary");return $(q([c,e].join(`
9
- `),"details",s.open?"open":void 0))}},R=e=>{const n=/(\/\/[^\n]*|\/\*[\s\S]*?\*\/|<!--[\s\S]*?-->)/gm,t=[];let s;for(;(s=n.exec(e))!==null;){const o=[s.index,s.index+s[0].length],r=je(s[0]).trim();t.push({range:o,value:r})}return t},je=e=>e.startsWith("//")?e.slice(2):e.startsWith("/*")?e.slice(2,-2):e.startsWith("<!--")?e.slice(4,-3):e,Q=["p↓:","pd:","parkdown:"];O(["splice(delete?: number, insert?: string)"]);const z=(e,n)=>e.range[0]-n.range[0],V=(e,n,t)=>(t??R(e)).filter(({value:s})=>s.includes(n)).sort(z),X=e=>({isSpace:e===" ",isNewline:e===`
10
- `||e===void 0}),J=e=>Q.flatMap(n=>V(e,n)).sort((n,t)=>n.range[0]-t.range[0]).reverse().reduce((n,{range:[t,s],value:o})=>{const r=(a,h)=>n.slice(0,a)+n.slice(h),i=X(n[t-1]),c=X(n[s]),l=s===n.length;return i.isNewline&&c.isNewline?r(t-(l?1:0),s+1):i.isNewline?r(t,s+(c.isSpace?1:0)):r(t-(i.isSpace?1:0),s)},e);Q.map(e=>new RegExp(`^${Ce(e)}(\\?[^\\s]+)`));const Oe=O(["extract(id: string, 0?: string, 1?: string, 2?: string)","remove(id: string, 0?: string, 1?: string, 2?: string)","replace(id: string, with?: string, space?: string)","splice(id: string, deleteCount?: number, insert?: string, space?: string)","remap(id: string, from: string, to: string, space?: string)"]),C=(e,n,t)=>{const s=V(e,n,t),o=[];for(let r=0;r<s.length-1;r+=2)o.push([s[r],s[r+1]]);return o},qe=(e,...n)=>{if(n.length===0)return e;const t=R(e),s=([i,c])=>e.slice(i,c),o=new w,r=new w;for(const i of n)for(const[c,l]of C(e,i,t)){o.push(c.range[1],l.range[0]);const[a,...h]=s([c.range[1],l.range[0]]),u=h[h.length-1];r.push(c.range[0],c.range[1]+(a.trim()?0:1)),r.push(l.range[0],l.range[1]+(u.trim()?0:1))}return o.collapse(),r.collapse(),M.dedent(o.subtract(r).map(s).filter(Boolean).join("")).trim()},Re=(e,...n)=>{if(n.length===0)return e;const t=R(e),s=([i,c])=>e.slice(i,c),o=new w;for(const i of n)for(const[c,l]of C(e,i,t)){const a=s([l.range[1],l.range[1]+1]).at(-1);o.push(c.range[0],a===`
11
- `?l.range[1]+1:l.range[1])}o.collapse();const r=new w([0,e.length]);return r.subtract(o),M.dedent(r.collapse().map(s).filter(Boolean).join("")).trim()},Ie=(e,n,t,s)=>{if(!n)return e;let o="",r=0;for(const[c,l]of C(e,n))o+=e.slice(r,c.range[1]),o+=j(t??c.value,s),r=l.range[0];o+=e.slice(r);const i=new w([0,o.length]);return i.subtract(new w(...C(o,n).flatMap(([c,l])=>[c.range,l.range]))),M.dedent(i.collapse().map(([c,l])=>o.slice(c,l)).filter(Boolean).join("")).trim()},Pe=(e,n,t,s,o)=>{if(!n)return e;const r=t===void 0?!1:t>=0,i=s?j(s,o):"",c=t??0;return C(e,n).map(l=>l[r?1:0]).sort(z).reverse().reduce((l,{range:a})=>r?l.slice(0,a[1])+i+l.slice(Math.min(a[1]+c,l.length)):l.slice(0,Math.max(a[0]+c,0))+i+l.slice(a[0]),e)},Ae=(e,n,t)=>{if(!n)return J(e);const s=Oe(n);switch(s.name){case"extract":e=qe(e,s.id,...G(s));break;case"remove":e=Re(e,s.id,...G(s));break;case"replace":e=Ie(e,s.id,s.with,s.space);break;case"splice":e=Pe(e,s.id,s.deleteCount,s.insert,s.space);break}return t?J(e):e},De=["http","./","../"],We=({url:e})=>De.some(n=>e.startsWith(n)),_e=e=>b(e)&&fe(e)&&We(e),Z=({url:e},n)=>`[](${n?d.join(n,e):e})`,f={_open:"<!--",_close:"-->",_flag:"p↓",get begin(){return k(f._open,f._flag,"BEGIN",f._close)},get end(){return k(f._open,f._flag,"END",f._close)},lengthOf(e){const n=`lines: ${e.split(`
12
- `).length}`,t=`chars: ${e.length}`;return k(f._open,f._flag,"length",n,t,f._close)}},K=e=>n=>b(n)&&n.value===f[e],Le=({position:e,url:n,siblingCount:t},s)=>({position:e,url:n,headingDepth:s,inline:t>=1}),Fe=({position:{start:e},url:n,siblingCount:t},{position:{end:s}},o)=>({position:{start:e,end:s},url:n,headingDepth:o,inline:t>=1}),Be=(e,n,t)=>(e.inline?k:ge)(Z(e,t),f.begin,f.lengthOf(n),n,f.end),Ue=e=>{const n=x(e,"heading").reduce((t,{position:s,depth:o})=>t.set(s.start.line,o),new Map);return t=>{for(let s=t.position.start.line;s>=1;s--){const o=n.get(s);if(o)return o}return 0}},N={openingCommentDoesNotFollowLink:({position:{start:e}})=>new Error(`Opening comment (@${e.line}:${e.column}) does not follow link`),closingCommentNotMatchedToOpening:({position:{start:e}})=>new Error(`Closing comment (@${e.line}:${e.column}) does not match to opening comment`),openingCommentNotClosed:({position:{start:e}})=>new Error(`Opening comment (@${e.line}:${e.column}) is not followed by a closing comment`)},Ge=(e,n)=>{const t=[],s=[...e.map(r=>({node:r,type:"open"})),...n.map(r=>({node:r,type:"close"}))].sort((r,i)=>v(r.node,i.node)),o=[];for(const r of s)if(r.type==="open")o.push(r);else{const i=r.node;if(o.length===0)throw N.closingCommentNotMatchedToOpening(i);const c=o.pop().node;if(o.length>0)continue;t.push({open:c,close:i})}if(o.length>0)throw N.openingCommentNotClosed(o[0].node);return t},He=(e,n,t)=>{const s=[...n].sort(v),o=[];return[...t].sort((r,i)=>v.reverse(r.open,i.open)).forEach(r=>{for(;s.length>0;){const i=s.pop();if(i.position.start.offset<r.open.position.start.offset){if(he(e,i,r.open).trim()!=="")throw N.openingCommentDoesNotFollowLink(r.open);return o.push([i,r])}o.push(i)}throw N.openingCommentDoesNotFollowLink(r.open)}),o.push(...s.reverse()),o.reverse()},Y=(e,n)=>{n??(n=T.md(e));const t=Ue(n),s=x(n,"link").filter(_e),o=x(n,"html").sort(v),r=o.filter(K("begin")),i=o.filter(K("end")),c=Ge(r,i);return He(e,s,c).map(a=>Array.isArray(a)?Fe(a[0],a[1].close,t(a[0])):Le(a,t(a)))},Qe=(e,{url:n})=>t=>e(d.join(d.dirname(n),t)),ee=(...e)=>{const n=e.reduce((t,s)=>t+s,0);return Math.min(Math.max(n,1),6)},ze=(e,n,t)=>{if(n===0)return e;t??(t=T.md(e));const s=x(t,"heading"),o=e.split(`
13
- `);for(const r of s){const{depth:i,position:{start:c,end:l}}=r,a=ee(i,n),h=o[c.line-1].slice(i,l.column),u="#".repeat(a)+h;o[c.line-1]=u,r.depth=a}return o.join(`
14
- `)},ne=e=>Y(e).reverse().sort(v.reverse).reduce((n,t)=>_(n,Z(t),t),e),te=(e,n,t,s,o)=>{try{e=ne(e),e=ze(e,n);const r=T.md(e);return Y(e,r).sort(v).reverse().map(i=>{var ie,ce;const{url:c,headingDepth:l}=i,[a,...h]=d.basename(c).split("?"),u=a.split(".").pop()??"",Je=h.join("?"),I=d.dirname(c),re=d.join(I,a);if(c.startsWith("./")||c.startsWith("../")){let g=t(re);const y=new ae.URLSearchParams(Je),P=(ie=y.get("region"))==null?void 0:ie.split(L);g=(P==null?void 0:P.reduce((E,S,W,{length:en})=>Ae(E,S,W===en-1),g))??g;const Ze=y.has("skip"),Ke=y.get("heading")??0,Ye=y.has("inline");let{inline:A}=i;if(Ye&&(A=!0),!Ze)if(u==="md"){const E=Qe(t,i),S=o?d.join(o,I):I,W=ee(l,Number(Ke));g=te(g,W,E,re,S)}else/^(js|ts)x?|svelte$/i.test(u)&&(g=H(g,"code",{extension:u,inline:A}));const D=(ce=y.get("wrap"))==null?void 0:ce.split(L);return g=(D==null?void 0:D.reduce((E,S)=>H(E,S,{extension:u,inline:A}),g))??g,{target:i,content:Be(i,g,o)}}else throw c.startsWith("http")?new Error("External web links are not implemented yet"):new Error(`Unsupported link type: ${c}`)}).reduce((i,{target:c,content:l})=>_(i,l,c),e)}catch(r){throw new Error(`Error populating inclusions in file ${s??"(unknown)"}: ${r}`)}},se=e=>m.readFileSync(e,"utf-8"),oe=e=>{const n=d.resolve(e),t=d.dirname(n);return{markdown:se(n),dir:t,path:n}},Ve=(e,n=!0)=>{const{dir:t,path:s,markdown:o}=oe(e),i=te(o,0,c=>se(d.resolve(t,we(c))),s);return n&&m.writeFileSync(s,i),i},Xe=(e,n=!0)=>{const{path:t,markdown:s}=oe(e),o=ne(s);return n&&m.writeFileSync(t,o),o};p.depopulateMarkdownInclusions=Xe,p.populateMarkdownInclusions=Ve,Object.defineProperty(p,Symbol.toStringTag,{value:"Module"})});
8
+ `)?`> ${e}`:C(R(C(e),"blockquote"));case"dropdown":const l=R(k(s.summary),"summary");return C(R([l,e].join(`
9
+ `),"details",s.open?"open":void 0))}},q=e=>{const n=/(\/\/[^\n]*|\/\*[\s\S]*?\*\/|<!--[\s\S]*?-->)/gm,t=[];let s;for(;(s=n.exec(e))!==null;){const o=[s.index,s.index+s[0].length],r=Re(s[0]).trim();t.push({range:o,value:r})}return t},Re=e=>e.startsWith("//")?e.slice(2):e.startsWith("/*")?e.slice(2,-2):e.startsWith("<!--")?e.slice(4,-3):e,z=["p↓:","pd:","parkdown:"];O(["splice(delete?: number, insert?: string)"]);const V=(e,n)=>e.range[0]-n.range[0],X=(e,n,t)=>(t??q(e)).filter(({value:s})=>s.split(" ").includes(n)).sort(V),J=e=>({isSpace:e===" ",isNewline:e===`
10
+ `||e===void 0}),Z=e=>z.flatMap(n=>X(e,n)).sort((n,t)=>n.range[0]-t.range[0]).reverse().reduce((n,{range:[t,s],value:o})=>{const r=(u,I)=>n.slice(0,u)+n.slice(I),i=J(n[t-1]),l=J(n[s]),c=s===n.length;let a=t;for(;a>0&&n[a-1]!==`
11
+ `;)a--;const f=n.slice(a,t).trim()==="";return i.isNewline&&l.isNewline?r(t-(c?1:0),s+1):i.isNewline||f?r(a,s+(l.isSpace||l.isNewline?1:0)):r(t-(i.isSpace?1:0),s)},e);z.map(e=>new RegExp(`^${Se(e)}(\\?[^\\s]+)`));const qe=O(["extract(id: string, 0?: string, 1?: string, 2?: string)","remove(id: string, 0?: string, 1?: string, 2?: string)","replace(id: string, with?: string, space?: string)","splice(id: string, deleteCount?: number, insert?: string, space?: string)","remap(id: string, from: string, to?: string, space?: string)"]),w=(e,n,t)=>{const s=X(e,n,t),o=[];for(let r=0;r<s.length-1;r+=2)o.push([s[r],s[r+1]]);return o},Ie=(e,...n)=>{if(n.length===0)return e;const t=q(e),s=([i,l])=>e.slice(i,l),o=new $,r=new $;for(const i of n)for(const[l,c]of w(e,i,t)){o.push(l.range[1],c.range[0]);const[a,...f]=s([l.range[1],c.range[0]]),u=f[f.length-1];r.push(l.range[0],l.range[1]+(a.trim()?0:1)),r.push(c.range[0],c.range[1]+(u.trim()?0:1))}return o.collapse(),r.collapse(),M.dedent(o.subtract(r).map(s).filter(Boolean).join("")).trim()},Ae=(e,...n)=>{if(n.length===0)return e;const t=q(e),s=([i,l])=>e.slice(i,l),o=new $;for(const i of n)for(const[l,c]of w(e,i,t)){const a=s([c.range[1],c.range[1]+1]).at(-1);o.push(l.range[0],a===`
12
+ `?c.range[1]+1:c.range[1])}o.collapse();const r=new $([0,e.length]);return r.subtract(o),M.dedent(r.collapse().map(s).filter(Boolean).join("")).trim()},Pe=(e,n,t,s)=>{if(!n)return e;let o="",r=0;for(const[l,c]of w(e,n))o+=e.slice(r,l.range[1]),o+=k(t??l.value,s),r=c.range[0];o+=e.slice(r);const i=new $([0,o.length]);return i.subtract(new $(...w(o,n).flatMap(([l,c])=>[l.range,c.range]))),M.dedent(i.collapse().map(([l,c])=>o.slice(l,c)).filter(Boolean).join("")).trim()},De=(e,n,t,s,o)=>{if(!n)return e;const r=t===void 0?!1:t>=0,i=s?k(s,o):"",l=t??0;return w(e,n).map(c=>c[r?1:0]).sort(V).reverse().reduce((c,{range:a})=>r?c.slice(0,a[1])+i+c.slice(Math.min(a[1]+l,c.length)):c.slice(0,Math.max(a[0]+l,0))+i+c.slice(a[0]),e)},We=(e,n,t,s,o)=>{if(!n)return e;let r="",i=0;const l=[t,s??""].map(c=>k(c,o));console.log(l);for(const[c,a]of w(e,n))r+=e.slice(i,c.range[1]),r+=e.slice(c.range[1],a.range[0]).replaceAll(l[0],l[1]),i=a.range[0];return r+=e.slice(i),r},_e=(e,n,t)=>{if(!n)return Z(e);const s=qe(n);switch(s.name){case"extract":e=Ie(e,s.id,...G(s));break;case"remove":e=Ae(e,s.id,...G(s));break;case"replace":e=Pe(e,s.id,s.with,s.space);break;case"splice":e=De(e,s.id,s.deleteCount,s.insert,s.space);break;case"remap":e=We(e,s.id,s.from,s.to,s.space);break}return t?Z(e):e},Le=["http","./","../"],Be=({url:e})=>Le.some(n=>e.startsWith(n)),Fe=e=>T(e)&&he(e)&&Be(e),K=({url:e},n)=>`[](${n?d.join(n,e):e})`,g={_open:"<!--",_close:"-->",_flag:"p↓",get begin(){return N(g._open,g._flag,"BEGIN",g._close)},get end(){return N(g._open,g._flag,"END",g._close)},lengthOf(e){const n=`lines: ${e.split(`
13
+ `).length}`,t=`chars: ${e.length}`;return N(g._open,g._flag,"length",n,t,g._close)}},Y=e=>n=>T(n)&&n.value===g[e],Ue=({position:e,url:n,siblingCount:t},s)=>({position:e,url:n,headingDepth:s,inline:t>=1}),He=({position:{start:e},url:n,siblingCount:t},{position:{end:s}},o)=>({position:{start:e,end:s},url:n,headingDepth:o,inline:t>=1}),Ge=(e,n,t)=>(e.inline?N:$e)(K(e,t),g.begin,g.lengthOf(n),n,g.end),Qe=e=>{const n=x(e,"heading").reduce((t,{position:s,depth:o})=>t.set(s.start.line,o),new Map);return t=>{for(let s=t.position.start.line;s>=1;s--){const o=n.get(s);if(o)return o}return 0}},b={openingCommentDoesNotFollowLink:({position:{start:e}})=>new Error(`Opening comment (@${e.line}:${e.column}) does not follow link`),closingCommentNotMatchedToOpening:({position:{start:e}})=>new Error(`Closing comment (@${e.line}:${e.column}) does not match to opening comment`),openingCommentNotClosed:({position:{start:e}})=>new Error(`Opening comment (@${e.line}:${e.column}) is not followed by a closing comment`)},ze=(e,n)=>{const t=[],s=[...e.map(r=>({node:r,type:"open"})),...n.map(r=>({node:r,type:"close"}))].sort((r,i)=>v(r.node,i.node)),o=[];for(const r of s)if(r.type==="open")o.push(r);else{const i=r.node;if(o.length===0)throw b.closingCommentNotMatchedToOpening(i);const l=o.pop().node;if(o.length>0)continue;t.push({open:l,close:i})}if(o.length>0)throw b.openingCommentNotClosed(o[0].node);return t},Ve=(e,n,t)=>{const s=[...n].sort(v),o=[];return[...t].sort((r,i)=>v.reverse(r.open,i.open)).forEach(r=>{for(;s.length>0;){const i=s.pop();if(i.position.start.offset<r.open.position.start.offset){if(ve(e,i,r.open).trim()!=="")throw b.openingCommentDoesNotFollowLink(r.open);return o.push([i,r])}o.push(i)}throw b.openingCommentDoesNotFollowLink(r.open)}),o.push(...s.reverse()),o.reverse()},ee=(e,n)=>{n??(n=j.md(e));const t=Qe(n),s=x(n,"link").filter(Fe),o=x(n,"html").sort(v),r=o.filter(Y("begin")),i=o.filter(Y("end")),l=ze(r,i);return Ve(e,s,l).map(a=>Array.isArray(a)?He(a[0],a[1].close,t(a[0])):Ue(a,t(a)))},Xe=(e,{url:n})=>t=>e(d.join(d.dirname(n),t)),ne=(...e)=>{const n=e.reduce((t,s)=>t+s,0);return Math.min(Math.max(n,1),6)},Je=(e,n,t)=>{if(n===0)return e;t??(t=j.md(e));const s=x(t,"heading"),o=e.split(`
14
+ `);for(const r of s){const{depth:i,position:{start:l,end:c}}=r,a=ne(i,n),f=o[l.line-1].slice(i,c.column),u="#".repeat(a)+f;o[l.line-1]=u,r.depth=a}return o.join(`
15
+ `)},te=e=>ee(e).reverse().sort(v.reverse).reduce((n,t)=>L(n,K(t),t),e),se=(e,n,t,s,o)=>{try{e=te(e),e=Je(e,n);const r=j.md(e);return ee(e,r).sort(v).reverse().map(i=>{var ce,ae;const{url:l,headingDepth:c}=i,[a,...f]=d.basename(l).split("?"),u=a.split(".").pop()??"",I=f.join("?"),A=d.dirname(l),le=d.join(A,a);if(l.startsWith("./")||l.startsWith("../")){let h=t(le);const y=new ue.URLSearchParams(I),P=(ce=y.get("region"))==null?void 0:ce.split(B);h=(P==null?void 0:P.reduce((S,E,_,{length:nn})=>_e(S,E,_===nn-1),h))??h;const Ke=y.has("skip"),Ye=y.get("heading")??0,en=y.has("inline");let{inline:D}=i;if(en&&(D=!0),!Ke)if(u==="md"){const S=Xe(t,i),E=o?d.join(o,A):A,_=ne(c,Number(Ye));h=se(h,_,S,le,E)}else/^(js|ts)x?|svelte$/i.test(u)&&(h=Q(h,"code",{extension:u,inline:D}));const W=(ae=y.get("wrap"))==null?void 0:ae.split(B);return h=(W==null?void 0:W.reduce((S,E)=>Q(S,E,{extension:u,inline:D}),h))??h,{target:i,content:Ge(i,h,o)}}else throw l.startsWith("http")?new Error("External web links are not implemented yet"):new Error(`Unsupported link type: ${l}`)}).reduce((i,{target:l,content:c})=>L(i,c,l),e)}catch(r){throw new Error(`Error populating inclusions in file ${s??"(unknown)"}: ${r}`)}},oe=e=>m.readFileSync(e,"utf-8"),re=e=>{const n=d.resolve(e),t=d.dirname(n);return{content:oe(n),dir:t,path:n}},ie=(e,n=!0,t)=>{const{dir:s,path:o,content:r}=re(e);t==null||t.unwatch(o),t==null||t.once("change",(c,a)=>{console.log(`Change detected in "${c}". Regenerating "${o}"...`),ie(e,n,t)});const l=se(r,0,c=>{const a=d.resolve(s,we(c));return t==null||t.add(a),oe(a)},o);return n&&m.writeFileSync(o,l),t==null||t.add(o),l},Ze=(e,n=!0,t)=>{const{path:s,content:o}=re(e),r=te(o);return n&&m.writeFileSync(s,r),r};p.depopulateMarkdownInclusions=Ze,p.populateMarkdownInclusions=ie,Object.defineProperty(p,Symbol.toStringTag,{value:"Module"})});
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@p-buddy/parkdown",
3
3
  "type": "module",
4
4
  "private": false,
5
- "version": "0.0.11",
5
+ "version": "0.0.13",
6
6
  "main": "./dist/index.js",
7
7
  "bin": "./dist/cli.js",
8
8
  "files": [
@@ -24,6 +24,7 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@commander-js/extra-typings": "^13.1.0",
27
+ "chokidar": "^4.0.3",
27
28
  "remark-parse": "^11.0.0",
28
29
  "ts-dedent": "^2.2.0",
29
30
  "unified": "^11.0.5",