@p-buddy/parkdown 0.0.10 → 0.0.11
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/dist/cli.js +1 -1
- package/dist/index.js +217 -205
- package/dist/index.umd.cjs +12 -11
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Command as t } from "@commander-js/extra-typings";
|
|
3
3
|
import { populateMarkdownInclusions as l, depopulateMarkdownInclusions as r } from "@p-buddy/parkdown";
|
|
4
|
-
const f = "0.0.
|
|
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
5
|
n.length === 0 && n.push("README.md");
|
|
6
6
|
const a = [
|
|
7
7
|
[l, !c],
|
package/dist/index.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
import { writeFileSync as
|
|
5
|
-
import { basename as
|
|
6
|
-
import { URLSearchParams as
|
|
7
|
-
import { unified as
|
|
8
|
-
import
|
|
9
|
-
import { visit as
|
|
10
|
-
import { dedent as
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
const j = (e) => e.position !== void 0 && e.position.start.offset !== void 0 && e.position.end.offset !== void 0,
|
|
14
|
-
md: (e) =>
|
|
15
|
-
},
|
|
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";
|
|
8
|
+
import Ee from "remark-parse";
|
|
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 = {
|
|
14
|
+
md: (e) => Se.parse(e)
|
|
15
|
+
}, S = (e, t) => {
|
|
16
16
|
const n = [];
|
|
17
|
-
return
|
|
17
|
+
return ye(e, (s, o, r) => {
|
|
18
18
|
if (s.type !== "root") {
|
|
19
19
|
if (t && s.type !== t) return;
|
|
20
20
|
if (j(s)) {
|
|
@@ -23,22 +23,22 @@ const j = (e) => e.position !== void 0 && e.position.start.offset !== void 0 &&
|
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
}), n;
|
|
26
|
-
},
|
|
26
|
+
}, xe = (e) => e.children.length === 0, Y = (e, t, ...n) => {
|
|
27
27
|
if (n.length === 0) throw new Error("No nodes to replace content from");
|
|
28
|
-
n.sort(
|
|
28
|
+
n.sort(g);
|
|
29
29
|
const s = n.at(0), o = n.at(-1);
|
|
30
30
|
return e.slice(0, s.position.start.offset) + t + e.slice(o.position.end.offset);
|
|
31
|
-
},
|
|
31
|
+
}, Ne = (e, t, n) => {
|
|
32
32
|
const s = Math.min(t.position.end.offset, n.position.end.offset), o = Math.max(t.position.start.offset, n.position.start.offset);
|
|
33
33
|
return e.slice(s, o);
|
|
34
|
-
},
|
|
35
|
-
`),
|
|
34
|
+
}, E = (...e) => e.join(" "), be = (...e) => e.join(`
|
|
35
|
+
`), ke = (e) => {
|
|
36
36
|
const t = e.split("?");
|
|
37
37
|
return t.length > 1 ? [t.slice(0, -1).join("?"), t.at(-1)] : [e, ""];
|
|
38
|
-
},
|
|
39
|
-
class
|
|
38
|
+
}, Me = (e) => ke(e)[0];
|
|
39
|
+
class d {
|
|
40
40
|
constructor(...t) {
|
|
41
|
-
|
|
41
|
+
B(this, "intervals", []);
|
|
42
42
|
for (const [n, s] of t)
|
|
43
43
|
this.push(n, s);
|
|
44
44
|
}
|
|
@@ -78,7 +78,7 @@ class v {
|
|
|
78
78
|
return this.intervals = o;
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
|
-
const
|
|
81
|
+
const F = /,\s*(?![^()]*\))/, U = {
|
|
82
82
|
reserved: {
|
|
83
83
|
semi: ";",
|
|
84
84
|
slash: "/",
|
|
@@ -102,9 +102,11 @@ const T = /,\s*(?![^()]*\))/, Q = {
|
|
|
102
102
|
tilde: "~",
|
|
103
103
|
square: "[",
|
|
104
104
|
unsquare: "]",
|
|
105
|
-
tick: "`"
|
|
105
|
+
tick: "`",
|
|
106
|
+
line: `
|
|
107
|
+
`
|
|
106
108
|
}
|
|
107
|
-
},
|
|
109
|
+
}, _e = "-", G = {
|
|
108
110
|
static: [
|
|
109
111
|
["'''", '"'],
|
|
110
112
|
["''", "'"],
|
|
@@ -112,24 +114,24 @@ const T = /,\s*(?![^()]*\))/, Q = {
|
|
|
112
114
|
[/p↓:\s+/g, ""]
|
|
113
115
|
],
|
|
114
116
|
url: [
|
|
115
|
-
...Object.entries(
|
|
116
|
-
...Object.entries(
|
|
117
|
+
...Object.entries(U.unsafe),
|
|
118
|
+
...Object.entries(U.reserved)
|
|
117
119
|
]
|
|
118
|
-
}, H = (e, [t, n]) => e.replaceAll(t, n),
|
|
120
|
+
}, H = (e, [t, n]) => e.replaceAll(t, n), D = (e, t = _e) => {
|
|
119
121
|
const n = G.static.reduce(H, e);
|
|
120
122
|
return G.url.map(([s, o]) => [t + s + t, o]).reduce(H, n).replaceAll(t, " ");
|
|
121
|
-
}, Te = (e) => e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), Oe = ["string", "number", "boolean"],
|
|
123
|
+
}, Te = (e) => e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), Oe = ["string", "number", "boolean"], Re = (e) => Oe.includes(e), je = /^([a-zA-Z0-9_-]+)(?:\(([^)]*)\))?$/, Ae = (e) => {
|
|
122
124
|
const t = e.match(je);
|
|
123
125
|
if (!t) throw new Error(`Invalid invocation: ${e}`);
|
|
124
126
|
const [, n, s = ""] = t;
|
|
125
127
|
if (!s.trim()) return { name: n, parameters: [] };
|
|
126
|
-
const o =
|
|
128
|
+
const o = Ie(s);
|
|
127
129
|
return { name: n, parameters: o };
|
|
128
|
-
},
|
|
130
|
+
}, De = (e, t) => {
|
|
129
131
|
for (let n = t + 1; n < e.length; n++)
|
|
130
132
|
if (e[n] !== void 0) return !1;
|
|
131
133
|
return !0;
|
|
132
|
-
},
|
|
134
|
+
}, Ie = (e) => {
|
|
133
135
|
const t = [];
|
|
134
136
|
let n = "", s = !1;
|
|
135
137
|
for (let o = 0; o < e.length; o++) {
|
|
@@ -139,8 +141,8 @@ const T = /,\s*(?![^()]*\))/, Q = {
|
|
|
139
141
|
s = !s, n += c ? "'''" : "''", o += c ? 2 : 1;
|
|
140
142
|
} else i ? (s = !s, n += r) : r === "," && !s ? (t.push(n.trim()), n = "") : n += r;
|
|
141
143
|
}
|
|
142
|
-
return t.push(n.trim()), t.map((o) => o === "" ? void 0 : o ?
|
|
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));
|
|
145
|
+
}, Pe = (e) => {
|
|
144
146
|
const t = e.length >= 2 && e[0] === "'" && e.at(-1) === "'", n = t && e.length >= 4 && e[1] === "'" && e.at(-2) === "'";
|
|
145
147
|
return !t || n ? e : e.slice(1, -1);
|
|
146
148
|
}, We = (e) => {
|
|
@@ -151,9 +153,9 @@ const T = /,\s*(?![^()]*\))/, Q = {
|
|
|
151
153
|
const r = /(\w+)(\?)?:\s*([^,]+)/g, i = [];
|
|
152
154
|
let c;
|
|
153
155
|
for (; (c = r.exec(o)) !== null; ) {
|
|
154
|
-
const [, l, a,
|
|
155
|
-
if (!
|
|
156
|
-
i.push({ name: l, optional: a === "?", type:
|
|
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 });
|
|
157
159
|
}
|
|
158
160
|
return { name: s, parameters: i };
|
|
159
161
|
}, I = (e) => {
|
|
@@ -162,7 +164,7 @@ const T = /,\s*(?![^()]*\))/, Q = {
|
|
|
162
164
|
/* @__PURE__ */ new Map()
|
|
163
165
|
);
|
|
164
166
|
return (n) => {
|
|
165
|
-
const { name: s, parameters: o } =
|
|
167
|
+
const { name: s, parameters: o } = Ae(n);
|
|
166
168
|
if (!t.has(s))
|
|
167
169
|
throw new Error(`Unknown method: ${s}`);
|
|
168
170
|
const r = t.get(s);
|
|
@@ -172,19 +174,19 @@ const T = /,\s*(?![^()]*\))/, Q = {
|
|
|
172
174
|
const i = r.filter(({ optional: l }) => !l).length, c = i === r.length ? i.toString() : `${i} - ${r.length}`;
|
|
173
175
|
throw new Error(`Too many parameters: ${o.length} for method '${s}' (expected: ${c})`);
|
|
174
176
|
}
|
|
175
|
-
return r.reduce((i, { name: c, optional: l, type: a },
|
|
176
|
-
const
|
|
177
|
-
if (
|
|
177
|
+
return r.reduce((i, { name: c, optional: l, type: a }, u) => {
|
|
178
|
+
const p = o[u];
|
|
179
|
+
if (p === void 0) {
|
|
178
180
|
if (l) return i;
|
|
179
181
|
throw new Error(`Missing required parameter: ${c} for method '${s}'`);
|
|
180
182
|
}
|
|
181
183
|
switch (a) {
|
|
182
184
|
case "string":
|
|
183
|
-
i[c] =
|
|
185
|
+
i[c] = p;
|
|
184
186
|
break;
|
|
185
187
|
case "number":
|
|
186
188
|
case "boolean":
|
|
187
|
-
i[c] = JSON.parse(
|
|
189
|
+
i[c] = JSON.parse(p);
|
|
188
190
|
break;
|
|
189
191
|
}
|
|
190
192
|
if (typeof i[c] !== a)
|
|
@@ -192,7 +194,7 @@ const T = /,\s*(?![^()]*\))/, Q = {
|
|
|
192
194
|
return i;
|
|
193
195
|
}, { name: s });
|
|
194
196
|
};
|
|
195
|
-
},
|
|
197
|
+
}, Q = (e) => Object.entries(e).filter(([t]) => t !== "name" && !isNaN(Number(t))).map(([t, n]) => n), Le = [
|
|
196
198
|
/**
|
|
197
199
|
* Wraps the content in a markdown-formatted code block.
|
|
198
200
|
* @param lang The language of the code block (defaults to the file extension).
|
|
@@ -222,65 +224,51 @@ const T = /,\s*(?![^()]*\))/, Q = {
|
|
|
222
224
|
* @example [](<url>?wrap=dropdown(hello_world,,_))
|
|
223
225
|
*/
|
|
224
226
|
"dropdown(summary: string, open?: boolean, space?: string)"
|
|
225
|
-
],
|
|
227
|
+
], qe = I(Le), f = (e, t = 1) => `
|
|
226
228
|
`.repeat(t) + e + `
|
|
227
|
-
`.repeat(t),
|
|
228
|
-
const s =
|
|
229
|
+
`.repeat(t), T = (e, t, n) => `<${t}${n ? ` ${n}` : ""}>${f(e)}</${t}>`, z = (e, t, n) => {
|
|
230
|
+
const s = qe(t);
|
|
229
231
|
switch (s.name) {
|
|
230
232
|
case "code":
|
|
231
233
|
if (!s.lang && !s.meta && (n == null ? void 0 : n.inline) && !e.includes(`
|
|
232
234
|
`)) return `\`${e}\``;
|
|
233
235
|
const r = s.lang ?? (n == null ? void 0 : n.extension) ?? "", i = s.meta ? ` ${s.meta}` : "";
|
|
234
|
-
return
|
|
236
|
+
return f(`\`\`\`${r}${i}${f(e)}\`\`\``);
|
|
235
237
|
case "quote":
|
|
236
238
|
return n != null && n.inline && !e.includes(`
|
|
237
239
|
|
|
238
|
-
`) ? `> ${e}` :
|
|
240
|
+
`) ? `> ${e}` : f(T(f(e), "blockquote"));
|
|
239
241
|
case "dropdown":
|
|
240
|
-
const c =
|
|
241
|
-
return
|
|
242
|
+
const c = T(D(s.summary), "summary");
|
|
243
|
+
return f(T([c, e].join(`
|
|
242
244
|
`), "details", s.open ? "open" : void 0));
|
|
243
245
|
}
|
|
244
|
-
},
|
|
246
|
+
}, P = (e) => {
|
|
245
247
|
const t = /(\/\/[^\n]*|\/\*[\s\S]*?\*\/|<!--[\s\S]*?-->)/gm, n = [];
|
|
246
248
|
let s;
|
|
247
249
|
for (; (s = t.exec(e)) !== null; ) {
|
|
248
|
-
const o = [s.index, s.index + s[0].length], r =
|
|
250
|
+
const o = [s.index, s.index + s[0].length], r = Be(s[0]).trim();
|
|
249
251
|
n.push({ range: o, value: r });
|
|
250
252
|
}
|
|
251
253
|
return n;
|
|
252
|
-
},
|
|
254
|
+
}, Be = (e) => e.startsWith("//") ? e.slice(2) : e.startsWith("/*") ? e.slice(2, -2) : e.startsWith("<!--") ? e.slice(4, -3) : e, ee = [
|
|
253
255
|
"p↓:",
|
|
254
256
|
"pd:",
|
|
255
257
|
"parkdown:"
|
|
256
|
-
],
|
|
258
|
+
], Fe = [
|
|
257
259
|
"splice(delete?: number, insert?: string)"
|
|
258
|
-
]
|
|
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) => ({
|
|
259
263
|
isSpace: e === " ",
|
|
260
264
|
isNewline: e === `
|
|
261
265
|
` || e === void 0
|
|
262
|
-
}),
|
|
263
|
-
const r = (a,
|
|
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;
|
|
264
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);
|
|
265
|
-
}, e)
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
}).filter(Boolean).map((t) => new URLSearchParams(t))[0], q = (e, t) => (Array.isArray(t) ? t.flatMap((n) => d(e, n)) : d(e, t)).filter(({ value: n }) => re.some((s) => s.test(n))).sort((n, s) => n.range[0] - s.range[0]).reverse().reduce((n, { range: [s, o], value: r }) => {
|
|
269
|
-
var l, a;
|
|
270
|
-
const i = Ge(r), c = ["back", "front"].map((p) => [p, i.get(p)]).filter(([p, m]) => !!m).reduce(
|
|
271
|
-
(p, [m, u]) => p.set(m, u.split(T)),
|
|
272
|
-
/* @__PURE__ */ new Map()
|
|
273
|
-
);
|
|
274
|
-
return n = ((l = c.get("back")) == null ? void 0 : l.reduce((p, m) => {
|
|
275
|
-
const u = V(m);
|
|
276
|
-
if (u.name === "splice")
|
|
277
|
-
return p.slice(0, o) + (u.insert ?? "") + p.slice(o + (u.delete ?? 0));
|
|
278
|
-
}, n)) ?? n, n = ((a = c.get("front")) == null ? void 0 : a.reduce((p, m) => {
|
|
279
|
-
const u = V(m);
|
|
280
|
-
if (u.name === "splice")
|
|
281
|
-
return p.slice(0, s - (u.delete ?? 0)) + (u.insert ?? "") + p.slice(s);
|
|
282
|
-
}, n)) ?? n, n;
|
|
283
|
-
}, e), He = [
|
|
269
|
+
}, e);
|
|
270
|
+
ee.map((e) => new RegExp(`^${Te(e)}(\\?[^\\s]+)`));
|
|
271
|
+
const Ue = [
|
|
284
272
|
/**
|
|
285
273
|
* Extract regions from the retrieved content between comments that INCLUDE the specified ids.
|
|
286
274
|
* @param id The id of the comment to extract.
|
|
@@ -306,106 +294,130 @@ const T = /,\s*(?![^()]*\))/, Q = {
|
|
|
306
294
|
* @param id The id of the comment to replace.
|
|
307
295
|
* @param with The replacement content (if ommitted, the content of the detected comment will be used).
|
|
308
296
|
* @param space The space character to use between words in the replacement content (defaults to `-`).
|
|
309
|
-
* @param expandLeft ADVANCED: The number of characters to expand the left side of the comment.
|
|
310
|
-
* @param expandRight ADVANCED: The number of characters to expand the right side of the comment.
|
|
311
297
|
* @example [](<url>?region=replace(specifier))
|
|
312
298
|
* @example [](<url>?region=replace(specifier,new-content))
|
|
313
299
|
* @example [](<url>?region=replace(specifier,new_content,_)
|
|
314
300
|
*/
|
|
315
|
-
"replace(id: string, with?: string, space?: string
|
|
316
|
-
|
|
301
|
+
"replace(id: string, with?: string, space?: string)",
|
|
302
|
+
/**
|
|
303
|
+
* Splice the retrieved content at the boundary of a comment region (which must INCLUDE the specified id).
|
|
304
|
+
*
|
|
305
|
+
* **NOTE:** Unlike `extract`, `remove`, and `replace`, `splice` does remove the comment from the content after processing.
|
|
306
|
+
* @param id The id of the comment regions to act on.
|
|
307
|
+
* @param deleteCount The number of characters to delete at either the beginning or end of the comment region.
|
|
308
|
+
* Specifying a number greater than or equal to 0 indicates the action should be taken at the end of the comment region.
|
|
309
|
+
* Specifying undefined or a number less than 0 indicates the action should be taken at the beginning of the comment region.
|
|
310
|
+
* @param insert The content to insert.
|
|
311
|
+
* @param space The space character to use between words in the content to insert (defaults to `-`).
|
|
312
|
+
* @example [](<url>?region=splice(specifier,-1)) // Delete one character at the beginning of the comment region.
|
|
313
|
+
* @example [](<url>?region=splice(specifier,undefined,new-content)) // Insert at the beginning of the comment region.
|
|
314
|
+
* @example [](<url>?region=splice(specifier,0,new-content)) // Insert at the end of the comment region.
|
|
315
|
+
* @example [](<url>?region=splice(specifier,1,new-content)) // Delete one character at the end of the comment region and insert.
|
|
316
|
+
*/
|
|
317
|
+
"splice(id: string, deleteCount?: number, insert?: string, space?: string)",
|
|
318
|
+
/**
|
|
319
|
+
* Remap the content within a comment region (which must INCLUDE the specified id).
|
|
320
|
+
*
|
|
321
|
+
* **NOTE:** Unlike `extract`, `remove`, and `replace`, `remap` does not remove the comment from the content after processing.
|
|
322
|
+
* @param id The id of the comment regions to act on.
|
|
323
|
+
* @param from The content to replace.
|
|
324
|
+
* @param to The content to replace with.
|
|
325
|
+
* @param space The space character to use between words in the content to replace (defaults to `-`).
|
|
326
|
+
* @example [](<url>?region=remap(specifier,hello-world,hello-universe))
|
|
327
|
+
* @example [](<url>?region=remap(specifier,hello_world,hello_universe,_)
|
|
328
|
+
*/
|
|
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 = [];
|
|
332
|
+
for (let r = 0; r < s.length - 1; r += 2)
|
|
333
|
+
o.push([s[r], s[r + 1]]);
|
|
334
|
+
return o;
|
|
335
|
+
}, He = (e, ...t) => {
|
|
317
336
|
if (t.length === 0) return e;
|
|
318
|
-
e =
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
o.push(a.range[1], p.range[0]);
|
|
325
|
-
const [m, ...u] = s([a.range[1], p.range[0]]), $ = u[u.length - 1];
|
|
326
|
-
r.push(a.range[0], a.range[1] + (m.trim() ? 0 : 1)), r.push(p.range[0], p.range[1] + ($.trim() ? 0 : 1));
|
|
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));
|
|
327
343
|
}
|
|
328
|
-
|
|
329
|
-
return o.collapse(), r.collapse(), A(
|
|
344
|
+
return o.collapse(), r.collapse(), R(
|
|
330
345
|
o.subtract(r).map(s).filter(Boolean).join("")
|
|
331
346
|
).trim();
|
|
332
|
-
},
|
|
347
|
+
}, Qe = (e, ...t) => {
|
|
333
348
|
if (t.length === 0) return e;
|
|
334
|
-
e =
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
o.push(a.range[0], m === `
|
|
341
|
-
` ? p.range[1] + 1 : p.range[1]);
|
|
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]);
|
|
342
355
|
}
|
|
343
|
-
}
|
|
344
356
|
o.collapse();
|
|
345
|
-
const r = new
|
|
346
|
-
return r.
|
|
357
|
+
const r = new d([0, e.length]);
|
|
358
|
+
return r.subtract(o), R(
|
|
347
359
|
r.collapse().map(s).filter(Boolean).join("")
|
|
348
360
|
).trim();
|
|
349
|
-
},
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
const [
|
|
356
|
-
return
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
const a = Je.bind(null, o, r);
|
|
361
|
-
for (const [m, u] of K(e, t).map(a))
|
|
362
|
-
c += e.slice(l, m.range[1]), c += se(n ?? m.value, s), l = u.range[0];
|
|
363
|
-
c += e.slice(l);
|
|
364
|
-
const p = new v();
|
|
365
|
-
return p.push(0, c.length), p.subtract(new v(
|
|
366
|
-
...K(c, t).map(a).flatMap(([m, u]) => [m.range, u.range])
|
|
367
|
-
)), A(
|
|
368
|
-
p.collapse().map(([m, u]) => c.slice(m, u)).filter(Boolean).join("")
|
|
361
|
+
}, ze = (e, t, n, s) => {
|
|
362
|
+
if (!t) return e;
|
|
363
|
+
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];
|
|
366
|
+
o += e.slice(r);
|
|
367
|
+
const i = new d([0, o.length]);
|
|
368
|
+
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("")
|
|
369
372
|
).trim();
|
|
370
|
-
},
|
|
371
|
-
if (!t) return
|
|
372
|
-
const
|
|
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]),
|
|
378
|
+
e
|
|
379
|
+
);
|
|
380
|
+
}, Ve = (e, t, n) => {
|
|
381
|
+
if (!t) return V(e);
|
|
382
|
+
const s = Ge(t);
|
|
373
383
|
switch (s.name) {
|
|
374
384
|
case "extract":
|
|
375
|
-
e =
|
|
385
|
+
e = He(e, s.id, ...Q(s));
|
|
376
386
|
break;
|
|
377
387
|
case "remove":
|
|
378
|
-
e =
|
|
388
|
+
e = Qe(e, s.id, ...Q(s));
|
|
379
389
|
break;
|
|
380
390
|
case "replace":
|
|
381
|
-
|
|
382
|
-
|
|
391
|
+
e = ze(e, s.id, s.with, s.space);
|
|
392
|
+
break;
|
|
393
|
+
case "splice":
|
|
394
|
+
e = Xe(e, s.id, s.deleteCount, s.insert, s.space);
|
|
383
395
|
break;
|
|
384
396
|
}
|
|
385
|
-
return n ?
|
|
386
|
-
},
|
|
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 = {
|
|
387
399
|
_open: "<!--",
|
|
388
400
|
_close: "-->",
|
|
389
401
|
_flag: "p↓",
|
|
390
402
|
get begin() {
|
|
391
|
-
return
|
|
403
|
+
return E(m._open, m._flag, "BEGIN", m._close);
|
|
392
404
|
},
|
|
393
405
|
get end() {
|
|
394
|
-
return
|
|
406
|
+
return E(m._open, m._flag, "END", m._close);
|
|
395
407
|
},
|
|
396
408
|
lengthOf(e) {
|
|
397
409
|
const t = `lines: ${e.split(`
|
|
398
410
|
`).length}`, n = `chars: ${e.length}`;
|
|
399
|
-
return
|
|
411
|
+
return E(m._open, m._flag, "length", t, n, m._close);
|
|
400
412
|
}
|
|
401
|
-
},
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
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),
|
|
415
|
+
m.begin,
|
|
416
|
+
m.lengthOf(t),
|
|
405
417
|
t,
|
|
406
|
-
|
|
407
|
-
),
|
|
408
|
-
const t =
|
|
418
|
+
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());
|
|
409
421
|
return (n) => {
|
|
410
422
|
for (let s = n.position.start.line; s >= 1; s--) {
|
|
411
423
|
const o = t.get(s);
|
|
@@ -413,113 +425,113 @@ const T = /,\s*(?![^()]*\))/, Q = {
|
|
|
413
425
|
}
|
|
414
426
|
return 0;
|
|
415
427
|
};
|
|
416
|
-
},
|
|
428
|
+
}, x = {
|
|
417
429
|
openingCommentDoesNotFollowLink: ({ position: { start: e } }) => new Error(`Opening comment (@${e.line}:${e.column}) does not follow link`),
|
|
418
430
|
closingCommentNotMatchedToOpening: ({ position: { start: e } }) => new Error(`Closing comment (@${e.line}:${e.column}) does not match to opening comment`),
|
|
419
431
|
openingCommentNotClosed: ({ position: { start: e } }) => new Error(`Opening comment (@${e.line}:${e.column}) is not followed by a closing comment`)
|
|
420
|
-
},
|
|
432
|
+
}, st = (e, t) => {
|
|
421
433
|
const n = [], s = [
|
|
422
434
|
...e.map((r) => ({ node: r, type: "open" })),
|
|
423
435
|
...t.map((r) => ({ node: r, type: "close" }))
|
|
424
|
-
].sort((r, i) =>
|
|
436
|
+
].sort((r, i) => g(r.node, i.node)), o = [];
|
|
425
437
|
for (const r of s)
|
|
426
438
|
if (r.type === "open") o.push(r);
|
|
427
439
|
else {
|
|
428
440
|
const i = r.node;
|
|
429
441
|
if (o.length === 0)
|
|
430
|
-
throw
|
|
442
|
+
throw x.closingCommentNotMatchedToOpening(i);
|
|
431
443
|
const c = o.pop().node;
|
|
432
444
|
if (o.length > 0) continue;
|
|
433
445
|
n.push({ open: c, close: i });
|
|
434
446
|
}
|
|
435
447
|
if (o.length > 0)
|
|
436
|
-
throw
|
|
448
|
+
throw x.openingCommentNotClosed(o[0].node);
|
|
437
449
|
return n;
|
|
438
|
-
},
|
|
439
|
-
const s = [...t].sort(
|
|
440
|
-
return [...n].sort((r, i) =>
|
|
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) => {
|
|
441
453
|
for (; s.length > 0; ) {
|
|
442
454
|
const i = s.pop();
|
|
443
455
|
if (i.position.start.offset < r.open.position.start.offset) {
|
|
444
|
-
if (
|
|
445
|
-
throw
|
|
456
|
+
if (Ne(e, i, r.open).trim() !== "")
|
|
457
|
+
throw x.openingCommentDoesNotFollowLink(r.open);
|
|
446
458
|
return o.push([i, r]);
|
|
447
459
|
}
|
|
448
460
|
o.push(i);
|
|
449
461
|
}
|
|
450
|
-
throw
|
|
462
|
+
throw x.openingCommentDoesNotFollowLink(r.open);
|
|
451
463
|
}), o.push(...s.reverse()), o.reverse();
|
|
452
|
-
},
|
|
453
|
-
t ?? (t =
|
|
454
|
-
const n =
|
|
455
|
-
return
|
|
456
|
-
},
|
|
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) => {
|
|
457
469
|
const t = e.reduce((n, s) => n + s, 0);
|
|
458
470
|
return Math.min(Math.max(t, 1), 6);
|
|
459
|
-
},
|
|
471
|
+
}, it = (e, t, n) => {
|
|
460
472
|
if (t === 0) return e;
|
|
461
|
-
n ?? (n =
|
|
462
|
-
const s =
|
|
473
|
+
n ?? (n = A.md(e));
|
|
474
|
+
const s = S(n, "heading"), o = e.split(`
|
|
463
475
|
`);
|
|
464
476
|
for (const r of s) {
|
|
465
|
-
const { depth: i, position: { start: c, end: l } } = r, a =
|
|
466
|
-
o[c.line - 1] =
|
|
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;
|
|
467
479
|
}
|
|
468
480
|
return o.join(`
|
|
469
481
|
`);
|
|
470
|
-
},
|
|
482
|
+
}, ie = (e) => oe(e).reverse().sort(g.reverse).reduce((t, n) => Y(t, se(n), n), e), ce = (e, t, n, s, o) => {
|
|
471
483
|
try {
|
|
472
|
-
e =
|
|
473
|
-
const r =
|
|
474
|
-
return
|
|
475
|
-
var
|
|
476
|
-
const { url: c, headingDepth: l } = i, [a, ...
|
|
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);
|
|
477
489
|
if (c.startsWith("./") || c.startsWith("../")) {
|
|
478
|
-
let
|
|
479
|
-
const
|
|
480
|
-
|
|
481
|
-
(
|
|
482
|
-
|
|
483
|
-
)) ??
|
|
484
|
-
const
|
|
485
|
-
let { inline:
|
|
486
|
-
if (
|
|
487
|
-
if (
|
|
488
|
-
const
|
|
489
|
-
|
|
490
|
-
|
|
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
|
+
if (p === "md") {
|
|
500
|
+
const w = rt(n, i), $ = o ? y(o, N) : N, _ = re(l, Number(ue));
|
|
501
|
+
h = ce(
|
|
502
|
+
h,
|
|
491
503
|
/** p↓: ... */
|
|
492
|
-
|
|
493
|
-
|
|
504
|
+
_,
|
|
505
|
+
w,
|
|
494
506
|
W,
|
|
495
|
-
|
|
507
|
+
$
|
|
496
508
|
/** p↓: ... */
|
|
497
509
|
);
|
|
498
|
-
} else /^(js|ts)x?|svelte$/i.test(
|
|
499
|
-
|
|
510
|
+
} else /^(js|ts)x?|svelte$/i.test(p) && (h = z(
|
|
511
|
+
h,
|
|
500
512
|
"code",
|
|
501
513
|
/** p↓: ... */
|
|
502
|
-
{ extension:
|
|
514
|
+
{ extension: p, inline: k }
|
|
503
515
|
/** p↓: ... */
|
|
504
516
|
));
|
|
505
|
-
const
|
|
506
|
-
return
|
|
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) };
|
|
507
519
|
} else throw c.startsWith("http") ? new Error("External web links are not implemented yet") : new Error(`Unsupported link type: ${c}`);
|
|
508
|
-
}).reduce((i, { target: c, content: l }) =>
|
|
520
|
+
}).reduce((i, { target: c, content: l }) => Y(i, l, c), e);
|
|
509
521
|
} catch (r) {
|
|
510
522
|
throw new Error(`Error populating inclusions in file ${s ?? "(unknown)"}: ${r}`);
|
|
511
523
|
}
|
|
512
|
-
},
|
|
513
|
-
const t =
|
|
514
|
-
return { markdown:
|
|
515
|
-
},
|
|
516
|
-
const { dir: n, path: s, markdown: o } =
|
|
517
|
-
return t &&
|
|
518
|
-
},
|
|
519
|
-
const { path: n, markdown: s } =
|
|
520
|
-
return t &&
|
|
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;
|
|
521
533
|
};
|
|
522
534
|
export {
|
|
523
|
-
|
|
524
|
-
|
|
535
|
+
dt as depopulateMarkdownInclusions,
|
|
536
|
+
ft as populateMarkdownInclusions
|
|
525
537
|
};
|
package/dist/index.umd.cjs
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
(function(m
|
|
2
|
-
`),
|
|
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)=>`
|
|
3
4
|
`.repeat(n)+e+`
|
|
4
|
-
`.repeat(n),
|
|
5
|
-
`))return`\`${e}\``;const r=s.lang??(t==null?void 0:t.extension)??"",i=s.meta?` ${s.meta}`:"";return
|
|
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(`
|
|
6
7
|
|
|
7
|
-
`)?`> ${e}
|
|
8
|
-
`),"details",s.open?"open":void 0))}},
|
|
9
|
-
`||e===void 0}),
|
|
10
|
-
`?
|
|
11
|
-
`).length}`,t=`chars: ${e.length}`;return
|
|
12
|
-
`);for(const r of s){const{depth:i,position:{start:c,end:l}}=r,a=
|
|
13
|
-
`)},
|
|
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"})});
|