@p-buddy/parkdown 0.0.9 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +1 -1
- package/dist/index.js +169 -160
- package/dist/index.umd.cjs +9 -9
- 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.10", 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,18 +1,18 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var U = (e, t, n) =>
|
|
4
|
-
import { writeFileSync as
|
|
5
|
-
import { basename as
|
|
6
|
-
import { URLSearchParams as
|
|
7
|
-
import { unified as
|
|
8
|
-
import
|
|
1
|
+
var we = Object.defineProperty;
|
|
2
|
+
var ve = (e, t, n) => t in e ? we(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n;
|
|
3
|
+
var U = (e, t, n) => ve(e, typeof t != "symbol" ? t + "" : t, n);
|
|
4
|
+
import { writeFileSync as ee, readFileSync as $e } from "node:fs";
|
|
5
|
+
import { basename as Ce, dirname as O, join as S, resolve as te } from "node:path";
|
|
6
|
+
import { URLSearchParams as ye } from "node:url";
|
|
7
|
+
import { unified as Ee } from "unified";
|
|
8
|
+
import xe from "remark-parse";
|
|
9
9
|
import { visit as Se } from "unist-util-visit";
|
|
10
10
|
import { dedent as A } from "ts-dedent";
|
|
11
11
|
const f = (e, t) => e.position.start.offset - t.position.start.offset;
|
|
12
12
|
f.reverse = (e, t) => f(t, e);
|
|
13
|
-
const j = (e) => e.position !== void 0 && e.position.start.offset !== void 0 && e.position.end.offset !== void 0,
|
|
14
|
-
md: (e) =>
|
|
15
|
-
},
|
|
13
|
+
const j = (e) => e.position !== void 0 && e.position.start.offset !== void 0 && e.position.end.offset !== void 0, be = Ee().use(xe), D = {
|
|
14
|
+
md: (e) => be.parse(e)
|
|
15
|
+
}, b = (e, t) => {
|
|
16
16
|
const n = [];
|
|
17
17
|
return Se(e, (s, o, r) => {
|
|
18
18
|
if (s.type !== "root") {
|
|
@@ -23,22 +23,24 @@ const j = (e) => e.position !== void 0 && e.position.start.offset !== void 0 &&
|
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
}), n;
|
|
26
|
-
}, Ne = (e) => e.children.length === 0,
|
|
26
|
+
}, Ne = (e) => e.children.length === 0, ne = (e, t, ...n) => {
|
|
27
27
|
if (n.length === 0) throw new Error("No nodes to replace content from");
|
|
28
28
|
n.sort(f);
|
|
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
|
+
}, ke = (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
|
+
}, x = (...e) => e.join(" "), Me = (...e) => e.join(`
|
|
35
|
+
`), _e = (e) => {
|
|
36
36
|
const t = e.split("?");
|
|
37
37
|
return t.length > 1 ? [t.slice(0, -1).join("?"), t.at(-1)] : [e, ""];
|
|
38
|
-
},
|
|
38
|
+
}, Re = (e) => _e(e)[0];
|
|
39
39
|
class v {
|
|
40
|
-
constructor() {
|
|
40
|
+
constructor(...t) {
|
|
41
41
|
U(this, "intervals", []);
|
|
42
|
+
for (const [n, s] of t)
|
|
43
|
+
this.push(n, s);
|
|
42
44
|
}
|
|
43
45
|
push(t, n) {
|
|
44
46
|
this.intervals.push([Math.min(t, n), Math.max(t, n)]);
|
|
@@ -53,8 +55,8 @@ class v {
|
|
|
53
55
|
const n = [];
|
|
54
56
|
let [s, o] = t[0];
|
|
55
57
|
for (let r = 1; r < t.length; r++) {
|
|
56
|
-
const [i,
|
|
57
|
-
i <= o ? o = Math.max(o,
|
|
58
|
+
const [i, c] = t[r];
|
|
59
|
+
i <= o ? o = Math.max(o, c) : (n.push([s, o]), s = i, o = c);
|
|
58
60
|
}
|
|
59
61
|
return n.push([s, o]), this.intervals = n;
|
|
60
62
|
}
|
|
@@ -63,20 +65,20 @@ class v {
|
|
|
63
65
|
if (!n.length || !s.length) return n;
|
|
64
66
|
let o = [...n];
|
|
65
67
|
for (const [r, i] of s) {
|
|
66
|
-
const
|
|
67
|
-
for (const [
|
|
68
|
-
if (i <=
|
|
69
|
-
|
|
68
|
+
const c = [];
|
|
69
|
+
for (const [l, a] of o) {
|
|
70
|
+
if (i <= l || r >= a) {
|
|
71
|
+
c.push([l, a]);
|
|
70
72
|
continue;
|
|
71
73
|
}
|
|
72
|
-
r >
|
|
74
|
+
r > l && c.push([l, r]), i < a && c.push([i, a]);
|
|
73
75
|
}
|
|
74
|
-
o =
|
|
76
|
+
o = c;
|
|
75
77
|
}
|
|
76
78
|
return this.intervals = o;
|
|
77
79
|
}
|
|
78
80
|
}
|
|
79
|
-
const
|
|
81
|
+
const T = /,\s*(?![^()]*\))/, Q = {
|
|
80
82
|
reserved: {
|
|
81
83
|
semi: ";",
|
|
82
84
|
slash: "/",
|
|
@@ -102,7 +104,7 @@ const O = /,\s*(?![^()]*\))/, Q = {
|
|
|
102
104
|
unsquare: "]",
|
|
103
105
|
tick: "`"
|
|
104
106
|
}
|
|
105
|
-
},
|
|
107
|
+
}, Pe = "-", G = {
|
|
106
108
|
static: [
|
|
107
109
|
["'''", '"'],
|
|
108
110
|
["''", "'"],
|
|
@@ -113,84 +115,84 @@ const O = /,\s*(?![^()]*\))/, Q = {
|
|
|
113
115
|
...Object.entries(Q.unsafe),
|
|
114
116
|
...Object.entries(Q.reserved)
|
|
115
117
|
]
|
|
116
|
-
}, H = (e, [t, n]) => e.replaceAll(t, n),
|
|
118
|
+
}, H = (e, [t, n]) => e.replaceAll(t, n), se = (e, t = Pe) => {
|
|
117
119
|
const n = G.static.reduce(H, e);
|
|
118
120
|
return G.url.map(([s, o]) => [t + s + t, o]).reduce(H, n).replaceAll(t, " ");
|
|
119
|
-
}, Te = (e) => e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), Oe = ["string", "number", "boolean"],
|
|
120
|
-
const t = e.match(
|
|
121
|
+
}, Te = (e) => e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), Oe = ["string", "number", "boolean"], Ae = (e) => Oe.includes(e), je = /^([a-zA-Z0-9_-]+)(?:\(([^)]*)\))?$/, De = (e) => {
|
|
122
|
+
const t = e.match(je);
|
|
121
123
|
if (!t) throw new Error(`Invalid invocation: ${e}`);
|
|
122
124
|
const [, n, s = ""] = t;
|
|
123
125
|
if (!s.trim()) return { name: n, parameters: [] };
|
|
124
|
-
const o =
|
|
126
|
+
const o = Le(s);
|
|
125
127
|
return { name: n, parameters: o };
|
|
126
|
-
},
|
|
128
|
+
}, Ie = (e, t) => {
|
|
127
129
|
for (let n = t + 1; n < e.length; n++)
|
|
128
130
|
if (e[n] !== void 0) return !1;
|
|
129
131
|
return !0;
|
|
130
|
-
},
|
|
132
|
+
}, Le = (e) => {
|
|
131
133
|
const t = [];
|
|
132
134
|
let n = "", s = !1;
|
|
133
135
|
for (let o = 0; o < e.length; o++) {
|
|
134
136
|
const r = e[o], i = r === "'";
|
|
135
137
|
if (i && e.at(o + 1) === "'") {
|
|
136
|
-
const
|
|
137
|
-
s = !s, n +=
|
|
138
|
+
const c = e.at(o + 2) === "'";
|
|
139
|
+
s = !s, n += c ? "'''" : "''", o += c ? 2 : 1;
|
|
138
140
|
} else i ? (s = !s, n += r) : r === "," && !s ? (t.push(n.trim()), n = "") : n += r;
|
|
139
141
|
}
|
|
140
|
-
return t.push(n.trim()), t.map((o) => o === "" ? void 0 : o ?
|
|
141
|
-
},
|
|
142
|
+
return t.push(n.trim()), t.map((o) => o === "" ? void 0 : o ? qe(o) : void 0).filter((o, r, i) => o !== void 0 || !Ie(i, r));
|
|
143
|
+
}, qe = (e) => {
|
|
142
144
|
const t = e.length >= 2 && e[0] === "'" && e.at(-1) === "'", n = t && e.length >= 4 && e[1] === "'" && e.at(-2) === "'";
|
|
143
145
|
return !t || n ? e : e.slice(1, -1);
|
|
144
|
-
},
|
|
146
|
+
}, We = (e) => {
|
|
145
147
|
const t = /^(\w+)(?:\(([^)]*)\))?/, n = e.match(t);
|
|
146
148
|
if (!n) return { name: e };
|
|
147
149
|
const [, s, o] = n;
|
|
148
150
|
if (!o) return { name: s };
|
|
149
151
|
const r = /(\w+)(\?)?:\s*([^,]+)/g, i = [];
|
|
150
|
-
let
|
|
151
|
-
for (; (
|
|
152
|
-
const [,
|
|
153
|
-
if (!
|
|
154
|
-
i.push({ name:
|
|
152
|
+
let c;
|
|
153
|
+
for (; (c = r.exec(o)) !== null; ) {
|
|
154
|
+
const [, l, a, p] = c, m = p.trim();
|
|
155
|
+
if (!Ae(m)) throw new Error(`Unsupported type: ${m}`);
|
|
156
|
+
i.push({ name: l, optional: a === "?", type: m });
|
|
155
157
|
}
|
|
156
158
|
return { name: s, parameters: i };
|
|
157
159
|
}, I = (e) => {
|
|
158
|
-
const t = e.map(
|
|
160
|
+
const t = e.map(We).reduce(
|
|
159
161
|
(n, { name: s, parameters: o }) => n.set(s, o),
|
|
160
162
|
/* @__PURE__ */ new Map()
|
|
161
163
|
);
|
|
162
164
|
return (n) => {
|
|
163
|
-
const { name: s, parameters: o } =
|
|
165
|
+
const { name: s, parameters: o } = De(n);
|
|
164
166
|
if (!t.has(s))
|
|
165
167
|
throw new Error(`Unknown method: ${s}`);
|
|
166
168
|
const r = t.get(s);
|
|
167
169
|
if (r === void 0)
|
|
168
170
|
return { name: s };
|
|
169
171
|
if (o.length > r.length) {
|
|
170
|
-
const i = r.filter(({ optional:
|
|
171
|
-
throw new Error(`Too many parameters: ${o.length} for method '${s}' (expected: ${
|
|
172
|
+
const i = r.filter(({ optional: l }) => !l).length, c = i === r.length ? i.toString() : `${i} - ${r.length}`;
|
|
173
|
+
throw new Error(`Too many parameters: ${o.length} for method '${s}' (expected: ${c})`);
|
|
172
174
|
}
|
|
173
|
-
return r.reduce((i, { name:
|
|
175
|
+
return r.reduce((i, { name: c, optional: l, type: a }, p) => {
|
|
174
176
|
const m = o[p];
|
|
175
177
|
if (m === void 0) {
|
|
176
|
-
if (
|
|
177
|
-
throw new Error(`Missing required parameter: ${
|
|
178
|
+
if (l) return i;
|
|
179
|
+
throw new Error(`Missing required parameter: ${c} for method '${s}'`);
|
|
178
180
|
}
|
|
179
181
|
switch (a) {
|
|
180
182
|
case "string":
|
|
181
|
-
i[
|
|
183
|
+
i[c] = m;
|
|
182
184
|
break;
|
|
183
185
|
case "number":
|
|
184
186
|
case "boolean":
|
|
185
|
-
i[
|
|
187
|
+
i[c] = JSON.parse(m);
|
|
186
188
|
break;
|
|
187
189
|
}
|
|
188
|
-
if (typeof i[
|
|
189
|
-
throw new Error(`Invalid type: ${
|
|
190
|
+
if (typeof i[c] !== a)
|
|
191
|
+
throw new Error(`Invalid type: ${c} must be ${a}, got ${typeof i[c]} for method '${s}'`);
|
|
190
192
|
return i;
|
|
191
193
|
}, { name: s });
|
|
192
194
|
};
|
|
193
|
-
}, z = (e) => Object.entries(e).filter(([t]) => t !== "name" && !isNaN(Number(t))).map(([t, n]) => n),
|
|
195
|
+
}, z = (e) => Object.entries(e).filter(([t]) => t !== "name" && !isNaN(Number(t))).map(([t, n]) => n), Be = [
|
|
194
196
|
/**
|
|
195
197
|
* Wraps the content in a markdown-formatted code block.
|
|
196
198
|
* @param lang The language of the code block (defaults to the file extension).
|
|
@@ -220,10 +222,10 @@ const O = /,\s*(?![^()]*\))/, Q = {
|
|
|
220
222
|
* @example [](<url>?wrap=dropdown(hello_world,,_))
|
|
221
223
|
*/
|
|
222
224
|
"dropdown(summary: string, open?: boolean, space?: string)"
|
|
223
|
-
],
|
|
225
|
+
], Fe = I(Be), w = (e, t = 1) => `
|
|
224
226
|
`.repeat(t) + e + `
|
|
225
|
-
`.repeat(t),
|
|
226
|
-
const s =
|
|
227
|
+
`.repeat(t), P = (e, t, n) => `<${t}${n ? ` ${n}` : ""}>${w(e)}</${t}>`, X = (e, t, n) => {
|
|
228
|
+
const s = Fe(t);
|
|
227
229
|
switch (s.name) {
|
|
228
230
|
case "code":
|
|
229
231
|
if (!s.lang && !s.meta && (n == null ? void 0 : n.inline) && !e.includes(`
|
|
@@ -233,52 +235,52 @@ const O = /,\s*(?![^()]*\))/, Q = {
|
|
|
233
235
|
case "quote":
|
|
234
236
|
return n != null && n.inline && !e.includes(`
|
|
235
237
|
|
|
236
|
-
`) ? `> ${e}` : w(
|
|
238
|
+
`) ? `> ${e}` : w(P(w(e), "blockquote"));
|
|
237
239
|
case "dropdown":
|
|
238
|
-
const
|
|
239
|
-
return w(
|
|
240
|
+
const c = P(se(s.summary), "summary");
|
|
241
|
+
return w(P([c, e].join(`
|
|
240
242
|
`), "details", s.open ? "open" : void 0));
|
|
241
243
|
}
|
|
242
244
|
}, L = (e) => {
|
|
243
245
|
const t = /(\/\/[^\n]*|\/\*[\s\S]*?\*\/|<!--[\s\S]*?-->)/gm, n = [];
|
|
244
246
|
let s;
|
|
245
247
|
for (; (s = t.exec(e)) !== null; ) {
|
|
246
|
-
const o = [s.index, s.index + s[0].length], r =
|
|
248
|
+
const o = [s.index, s.index + s[0].length], r = Ue(s[0]).trim();
|
|
247
249
|
n.push({ range: o, value: r });
|
|
248
250
|
}
|
|
249
251
|
return n;
|
|
250
|
-
},
|
|
252
|
+
}, Ue = (e) => e.startsWith("//") ? e.slice(2) : e.startsWith("/*") ? e.slice(2, -2) : e.startsWith("<!--") ? e.slice(4, -3) : e, oe = [
|
|
251
253
|
"p↓:",
|
|
252
254
|
"pd:",
|
|
253
255
|
"parkdown:"
|
|
254
|
-
],
|
|
256
|
+
], Qe = [
|
|
255
257
|
"splice(delete?: number, insert?: string)"
|
|
256
|
-
], V = I(
|
|
258
|
+
], V = I(Qe), d = (e, t, n) => (n ?? L(e)).filter(({ value: s }) => s.includes(t)).sort((s, o) => s.range[0] - o.range[0]), J = (e) => ({
|
|
257
259
|
isSpace: e === " ",
|
|
258
260
|
isNewline: e === `
|
|
259
261
|
` || e === void 0
|
|
260
|
-
}), Z = (e) =>
|
|
261
|
-
const r = (a, p) => t.slice(0, a) + t.slice(p), i = J(t[n - 1]),
|
|
262
|
-
return i.isNewline &&
|
|
263
|
-
}, e),
|
|
262
|
+
}), Z = (e) => oe.flatMap((t) => d(e, t)).sort((t, n) => t.range[0] - n.range[0]).reverse().reduce((t, { range: [n, s], value: o }) => {
|
|
263
|
+
const r = (a, p) => t.slice(0, a) + t.slice(p), i = J(t[n - 1]), c = J(t[s]), l = s === t.length;
|
|
264
|
+
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), re = oe.map((e) => new RegExp(`^${Te(e)}(\\?[^\\s]+)`)), Ge = (e) => re.map((t) => {
|
|
264
266
|
var n;
|
|
265
267
|
return (n = t.exec(e)) == null ? void 0 : n[1];
|
|
266
|
-
}).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 }) =>
|
|
267
|
-
var
|
|
268
|
-
const i =
|
|
269
|
-
(p, [m, u]) => p.set(m, u.split(
|
|
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)),
|
|
270
272
|
/* @__PURE__ */ new Map()
|
|
271
273
|
);
|
|
272
|
-
return n = ((
|
|
274
|
+
return n = ((l = c.get("back")) == null ? void 0 : l.reduce((p, m) => {
|
|
273
275
|
const u = V(m);
|
|
274
276
|
if (u.name === "splice")
|
|
275
277
|
return p.slice(0, o) + (u.insert ?? "") + p.slice(o + (u.delete ?? 0));
|
|
276
|
-
}, n)) ?? n, n = ((a =
|
|
278
|
+
}, n)) ?? n, n = ((a = c.get("front")) == null ? void 0 : a.reduce((p, m) => {
|
|
277
279
|
const u = V(m);
|
|
278
280
|
if (u.name === "splice")
|
|
279
281
|
return p.slice(0, s - (u.delete ?? 0)) + (u.insert ?? "") + p.slice(s);
|
|
280
282
|
}, n)) ?? n, n;
|
|
281
|
-
}, e),
|
|
283
|
+
}, e), He = [
|
|
282
284
|
/**
|
|
283
285
|
* Extract regions from the retrieved content between comments that INCLUDE the specified ids.
|
|
284
286
|
* @param id The id of the comment to extract.
|
|
@@ -304,19 +306,21 @@ const O = /,\s*(?![^()]*\))/, Q = {
|
|
|
304
306
|
* @param id The id of the comment to replace.
|
|
305
307
|
* @param with The replacement content (if ommitted, the content of the detected comment will be used).
|
|
306
308
|
* @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.
|
|
307
311
|
* @example [](<url>?region=replace(specifier))
|
|
308
312
|
* @example [](<url>?region=replace(specifier,new-content))
|
|
309
313
|
* @example [](<url>?region=replace(specifier,new_content,_)
|
|
310
314
|
*/
|
|
311
|
-
"replace(id: string, with?: string, space?: string)"
|
|
312
|
-
],
|
|
315
|
+
"replace(id: string, with?: string, space?: string, expandLeft?: number, expandRight?: number)"
|
|
316
|
+
], ze = I(He), Xe = (e, ...t) => {
|
|
313
317
|
if (t.length === 0) return e;
|
|
314
318
|
e = q(e, t);
|
|
315
|
-
const n = L(e), s = ([i,
|
|
319
|
+
const n = L(e), s = ([i, c]) => e.slice(i, c), o = new v(), r = new v();
|
|
316
320
|
for (const i of t) {
|
|
317
|
-
const
|
|
318
|
-
for (let
|
|
319
|
-
const a = l
|
|
321
|
+
const c = d(e, i, n);
|
|
322
|
+
for (let l = 0; l < c.length - 1; l += 2) {
|
|
323
|
+
const a = c[l], p = c[l + 1];
|
|
320
324
|
o.push(a.range[1], p.range[0]);
|
|
321
325
|
const [m, ...u] = s([a.range[1], p.range[0]]), $ = u[u.length - 1];
|
|
322
326
|
r.push(a.range[0], a.range[1] + (m.trim() ? 0 : 1)), r.push(p.range[0], p.range[1] + ($.trim() ? 0 : 1));
|
|
@@ -325,14 +329,14 @@ const O = /,\s*(?![^()]*\))/, Q = {
|
|
|
325
329
|
return o.collapse(), r.collapse(), A(
|
|
326
330
|
o.subtract(r).map(s).filter(Boolean).join("")
|
|
327
331
|
).trim();
|
|
328
|
-
},
|
|
332
|
+
}, Ve = (e, ...t) => {
|
|
329
333
|
if (t.length === 0) return e;
|
|
330
334
|
e = q(e, t);
|
|
331
|
-
const n = L(e), s = ([i,
|
|
335
|
+
const n = L(e), s = ([i, c]) => e.slice(i, c), o = new v();
|
|
332
336
|
for (const i of t) {
|
|
333
|
-
const
|
|
334
|
-
for (let
|
|
335
|
-
const a = l
|
|
337
|
+
const c = d(e, i, n);
|
|
338
|
+
for (let l = 0; l < c.length - 1; l += 2) {
|
|
339
|
+
const a = c[l], p = c[l + 1], m = s([p.range[1], p.range[1] + 1]).at(-1);
|
|
336
340
|
o.push(a.range[0], m === `
|
|
337
341
|
` ? p.range[1] + 1 : p.range[1]);
|
|
338
342
|
}
|
|
@@ -342,61 +346,66 @@ const O = /,\s*(?![^()]*\))/, Q = {
|
|
|
342
346
|
return r.push(0, e.length), r.subtract(o), A(
|
|
343
347
|
r.collapse().map(s).filter(Boolean).join("")
|
|
344
348
|
).trim();
|
|
345
|
-
},
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
let r = "", i = 0;
|
|
351
|
-
for (let c = 0; c < o.length - 1; c += 2) {
|
|
352
|
-
const a = o[c], p = o[c + 1];
|
|
353
|
-
r += e.slice(i, a.range[1]), r += ne(n ?? a.value, s), i = p.range[0];
|
|
354
|
-
}
|
|
355
|
-
r += e.slice(i);
|
|
356
|
-
const l = new v();
|
|
357
|
-
return l.push(0, r.length), l.subtract(
|
|
358
|
-
d(r, t).reduce((c, { range: a }) => (c.push(...a), c), new v())
|
|
359
|
-
), A(
|
|
360
|
-
l.collapse().map(([c, a]) => r.slice(c, a)).filter(Boolean).join("")
|
|
361
|
-
).trim();
|
|
349
|
+
}, K = (e, t) => {
|
|
350
|
+
const n = d(e, t), s = [];
|
|
351
|
+
for (let o = 0; o < n.length - 1; o += 2)
|
|
352
|
+
s.push([n[o], n[o + 1]]);
|
|
353
|
+
return s;
|
|
362
354
|
}, Je = (e, t, n) => {
|
|
355
|
+
const [s, o] = n;
|
|
356
|
+
return e && (s.range[0] -= e), t && (o.range[1] += t), n;
|
|
357
|
+
}, Ze = (e, t, n, s, o, r) => {
|
|
358
|
+
if (!t || (e = q(e, t), d(e, t).length < 2)) return e;
|
|
359
|
+
let c = "", l = 0;
|
|
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("")
|
|
369
|
+
).trim();
|
|
370
|
+
}, Ke = (e, t, n) => {
|
|
363
371
|
if (!t) return Z(e);
|
|
364
|
-
const s =
|
|
372
|
+
const s = ze(t);
|
|
365
373
|
switch (s.name) {
|
|
366
374
|
case "extract":
|
|
367
|
-
e =
|
|
375
|
+
e = Xe(e, s.id, ...z(s));
|
|
368
376
|
break;
|
|
369
377
|
case "remove":
|
|
370
|
-
e =
|
|
378
|
+
e = Ve(e, s.id, ...z(s));
|
|
371
379
|
break;
|
|
372
380
|
case "replace":
|
|
373
|
-
|
|
381
|
+
const { with: o, id: r, space: i, expandLeft: c, expandRight: l } = s;
|
|
382
|
+
e = Ze(e, r, o, i, c, l);
|
|
374
383
|
break;
|
|
375
384
|
}
|
|
376
385
|
return n ? Z(e) : e;
|
|
377
|
-
},
|
|
386
|
+
}, Ye = ["http", "./", "../"], et = ({ url: e }) => Ye.some((t) => e.startsWith(t)), tt = (e) => j(e) && Ne(e) && et(e), ie = ({ url: e }, t) => `[](${t ? S(t, e) : e})`, h = {
|
|
378
387
|
_open: "<!--",
|
|
379
388
|
_close: "-->",
|
|
380
389
|
_flag: "p↓",
|
|
381
390
|
get begin() {
|
|
382
|
-
return
|
|
391
|
+
return x(h._open, h._flag, "BEGIN", h._close);
|
|
383
392
|
},
|
|
384
393
|
get end() {
|
|
385
|
-
return
|
|
394
|
+
return x(h._open, h._flag, "END", h._close);
|
|
386
395
|
},
|
|
387
396
|
lengthOf(e) {
|
|
388
397
|
const t = `lines: ${e.split(`
|
|
389
398
|
`).length}`, n = `chars: ${e.length}`;
|
|
390
|
-
return
|
|
399
|
+
return x(h._open, h._flag, "length", t, n, h._close);
|
|
391
400
|
}
|
|
392
|
-
},
|
|
393
|
-
|
|
401
|
+
}, Y = (e) => (t) => j(t) && t.value === h[e], nt = ({ position: e, url: t, siblingCount: n }, s) => ({ position: e, url: t, headingDepth: s, inline: n >= 1 }), st = ({ position: { start: e }, url: t, siblingCount: n }, { position: { end: s } }, o) => ({ position: { start: e, end: s }, url: t, headingDepth: o, inline: n >= 1 }), ot = (e, t, n) => (e.inline ? x : Me)(
|
|
402
|
+
ie(e, n),
|
|
394
403
|
h.begin,
|
|
395
404
|
h.lengthOf(t),
|
|
396
405
|
t,
|
|
397
406
|
h.end
|
|
398
|
-
),
|
|
399
|
-
const t =
|
|
407
|
+
), rt = (e) => {
|
|
408
|
+
const t = b(e, "heading").reduce((n, { position: s, depth: o }) => n.set(s.start.line, o), /* @__PURE__ */ new Map());
|
|
400
409
|
return (n) => {
|
|
401
410
|
for (let s = n.position.start.line; s >= 1; s--) {
|
|
402
411
|
const o = t.get(s);
|
|
@@ -404,11 +413,11 @@ const O = /,\s*(?![^()]*\))/, Q = {
|
|
|
404
413
|
}
|
|
405
414
|
return 0;
|
|
406
415
|
};
|
|
407
|
-
},
|
|
416
|
+
}, N = {
|
|
408
417
|
openingCommentDoesNotFollowLink: ({ position: { start: e } }) => new Error(`Opening comment (@${e.line}:${e.column}) does not follow link`),
|
|
409
418
|
closingCommentNotMatchedToOpening: ({ position: { start: e } }) => new Error(`Closing comment (@${e.line}:${e.column}) does not match to opening comment`),
|
|
410
419
|
openingCommentNotClosed: ({ position: { start: e } }) => new Error(`Opening comment (@${e.line}:${e.column}) is not followed by a closing comment`)
|
|
411
|
-
},
|
|
420
|
+
}, it = (e, t) => {
|
|
412
421
|
const n = [], s = [
|
|
413
422
|
...e.map((r) => ({ node: r, type: "open" })),
|
|
414
423
|
...t.map((r) => ({ node: r, type: "close" }))
|
|
@@ -418,66 +427,66 @@ const O = /,\s*(?![^()]*\))/, Q = {
|
|
|
418
427
|
else {
|
|
419
428
|
const i = r.node;
|
|
420
429
|
if (o.length === 0)
|
|
421
|
-
throw
|
|
422
|
-
const
|
|
430
|
+
throw N.closingCommentNotMatchedToOpening(i);
|
|
431
|
+
const c = o.pop().node;
|
|
423
432
|
if (o.length > 0) continue;
|
|
424
|
-
n.push({ open:
|
|
433
|
+
n.push({ open: c, close: i });
|
|
425
434
|
}
|
|
426
435
|
if (o.length > 0)
|
|
427
|
-
throw
|
|
436
|
+
throw N.openingCommentNotClosed(o[0].node);
|
|
428
437
|
return n;
|
|
429
|
-
},
|
|
438
|
+
}, ct = (e, t, n) => {
|
|
430
439
|
const s = [...t].sort(f), o = [];
|
|
431
440
|
return [...n].sort((r, i) => f.reverse(r.open, i.open)).forEach((r) => {
|
|
432
441
|
for (; s.length > 0; ) {
|
|
433
442
|
const i = s.pop();
|
|
434
443
|
if (i.position.start.offset < r.open.position.start.offset) {
|
|
435
|
-
if (
|
|
436
|
-
throw
|
|
444
|
+
if (ke(e, i, r.open).trim() !== "")
|
|
445
|
+
throw N.openingCommentDoesNotFollowLink(r.open);
|
|
437
446
|
return o.push([i, r]);
|
|
438
447
|
}
|
|
439
448
|
o.push(i);
|
|
440
449
|
}
|
|
441
|
-
throw
|
|
450
|
+
throw N.openingCommentDoesNotFollowLink(r.open);
|
|
442
451
|
}), o.push(...s.reverse()), o.reverse();
|
|
443
|
-
},
|
|
452
|
+
}, ce = (e, t) => {
|
|
444
453
|
t ?? (t = D.md(e));
|
|
445
|
-
const n =
|
|
446
|
-
return
|
|
447
|
-
},
|
|
454
|
+
const n = rt(t), s = b(t, "link").filter(tt), o = b(t, "html").sort(f), r = o.filter(Y("begin")), i = o.filter(Y("end")), c = it(r, i);
|
|
455
|
+
return ct(e, s, c).map((a) => Array.isArray(a) ? st(a[0], a[1].close, n(a[0])) : nt(a, n(a)));
|
|
456
|
+
}, lt = (e, { url: t }) => (n) => e(S(O(t), n)), le = (...e) => {
|
|
448
457
|
const t = e.reduce((n, s) => n + s, 0);
|
|
449
458
|
return Math.min(Math.max(t, 1), 6);
|
|
450
|
-
},
|
|
459
|
+
}, at = (e, t, n) => {
|
|
451
460
|
if (t === 0) return e;
|
|
452
461
|
n ?? (n = D.md(e));
|
|
453
|
-
const s =
|
|
462
|
+
const s = b(n, "heading"), o = e.split(`
|
|
454
463
|
`);
|
|
455
464
|
for (const r of s) {
|
|
456
|
-
const { depth: i, position: { start:
|
|
457
|
-
o[
|
|
465
|
+
const { depth: i, position: { start: c, end: l } } = r, a = le(i, t), p = o[c.line - 1].slice(i, l.column), m = "#".repeat(a) + p;
|
|
466
|
+
o[c.line - 1] = m, r.depth = a;
|
|
458
467
|
}
|
|
459
468
|
return o.join(`
|
|
460
469
|
`);
|
|
461
|
-
},
|
|
470
|
+
}, ae = (e) => ce(e).reverse().sort(f.reverse).reduce((t, n) => ne(t, ie(n), n), e), pe = (e, t, n, s, o) => {
|
|
462
471
|
try {
|
|
463
|
-
e =
|
|
472
|
+
e = ae(e), e = at(e, t);
|
|
464
473
|
const r = D.md(e);
|
|
465
|
-
return
|
|
474
|
+
return ce(e, r).sort(f).reverse().map((i) => {
|
|
466
475
|
var B, F;
|
|
467
|
-
const { url:
|
|
468
|
-
if (
|
|
476
|
+
const { url: c, headingDepth: l } = i, [a, ...p] = Ce(c).split("?"), m = a.split(".").pop() ?? "", u = p.join("?"), $ = O(c), W = S($, a);
|
|
477
|
+
if (c.startsWith("./") || c.startsWith("../")) {
|
|
469
478
|
let g = n(W);
|
|
470
|
-
const C = new
|
|
479
|
+
const C = new ye(u), k = (B = C.get("region")) == null ? void 0 : B.split(T);
|
|
471
480
|
g = (k == null ? void 0 : k.reduce(
|
|
472
|
-
(y, E, R, { length:
|
|
481
|
+
(y, E, R, { length: de }) => Ke(y, E, R === de - 1),
|
|
473
482
|
g
|
|
474
483
|
)) ?? g;
|
|
475
|
-
const
|
|
484
|
+
const he = C.has("skip"), ge = C.get("heading") ?? 0, fe = C.has("inline");
|
|
476
485
|
let { inline: M } = i;
|
|
477
|
-
if (
|
|
486
|
+
if (fe && (M = !0), !he)
|
|
478
487
|
if (m === "md") {
|
|
479
|
-
const y =
|
|
480
|
-
g =
|
|
488
|
+
const y = lt(n, i), E = o ? S(o, $) : $, R = le(l, Number(ge));
|
|
489
|
+
g = pe(
|
|
481
490
|
g,
|
|
482
491
|
/** p↓: ... */
|
|
483
492
|
R,
|
|
@@ -493,24 +502,24 @@ const O = /,\s*(?![^()]*\))/, Q = {
|
|
|
493
502
|
{ extension: m, inline: M }
|
|
494
503
|
/** p↓: ... */
|
|
495
504
|
));
|
|
496
|
-
const _ = (F = C.get("wrap")) == null ? void 0 : F.split(
|
|
497
|
-
return g = (_ == null ? void 0 : _.reduce((y, E) => X(y, E, { extension: m, inline: M }), g)) ?? g, { target: i, content:
|
|
498
|
-
} else throw
|
|
499
|
-
}).reduce((i, { target:
|
|
505
|
+
const _ = (F = C.get("wrap")) == null ? void 0 : F.split(T);
|
|
506
|
+
return g = (_ == null ? void 0 : _.reduce((y, E) => X(y, E, { extension: m, inline: M }), g)) ?? g, { target: i, content: ot(i, g, o) };
|
|
507
|
+
} 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 }) => ne(i, l, c), e);
|
|
500
509
|
} catch (r) {
|
|
501
510
|
throw new Error(`Error populating inclusions in file ${s ?? "(unknown)"}: ${r}`);
|
|
502
511
|
}
|
|
503
|
-
},
|
|
504
|
-
const t =
|
|
505
|
-
return { markdown:
|
|
506
|
-
},
|
|
507
|
-
const { dir: n, path: s, markdown: o } =
|
|
508
|
-
return t &&
|
|
509
|
-
},
|
|
510
|
-
const { path: n, markdown: s } =
|
|
511
|
-
return t &&
|
|
512
|
+
}, me = (e) => $e(e, "utf-8"), ue = (e) => {
|
|
513
|
+
const t = te(e), n = O(t);
|
|
514
|
+
return { markdown: me(t), dir: n, path: t };
|
|
515
|
+
}, vt = (e, t = !0) => {
|
|
516
|
+
const { dir: n, path: s, markdown: o } = ue(e), i = pe(o, 0, (c) => me(te(n, Re(c))), s);
|
|
517
|
+
return t && ee(s, i), i;
|
|
518
|
+
}, $t = (e, t = !0) => {
|
|
519
|
+
const { path: n, markdown: s } = ue(e), o = ae(s);
|
|
520
|
+
return t && ee(n, o), o;
|
|
512
521
|
};
|
|
513
522
|
export {
|
|
514
|
-
|
|
515
|
-
|
|
523
|
+
$t as depopulateMarkdownInclusions,
|
|
524
|
+
vt as populateMarkdownInclusions
|
|
516
525
|
};
|
package/dist/index.umd.cjs
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
(function(m,
|
|
2
|
-
`)
|
|
1
|
+
(function(m,h){typeof exports=="object"&&typeof module<"u"?h(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"],h):(m=typeof globalThis<"u"?globalThis:m||self,h(m.index={},m.node_fs,m.node_path,m.node_url,m.unified,m.remarkParse,m.unistUtilVisit,m.tsDedent))})(this,function(m,h,g,me,de,he,ge,T){"use strict";var on=Object.defineProperty;var rn=(m,h,g)=>h in m?on(m,h,{enumerable:!0,configurable:!0,writable:!0,value:g}):m[h]=g;var ue=(m,h,g)=>rn(m,typeof h!="symbol"?h+"":h,g);const v=(e,n)=>e.position.start.offset-n.position.start.offset;v.reverse=(e,n)=>v(n,e);const j=e=>e.position!==void 0&&e.position.start.offset!==void 0&&e.position.end.offset!==void 0,fe=de.unified().use(he),q={md:e=>fe.parse(e)},N=(e,n)=>{const t=[];return ge.visit(e,(s,o,r)=>{if(s.type!=="root"){if(n&&s.type!==n)return;if(j(s)){const i=((r==null?void 0:r.children.length)??0)-1;t.push({...s,siblingIndex:o,siblingCount:i})}}}),t},we=e=>e.children.length===0,B=(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)},b=(...e)=>e.join(" "),$e=(...e)=>e.join(`
|
|
2
|
+
`),ye=e=>{const n=e.split("?");return n.length>1?[n.slice(0,-1).join("?"),n.at(-1)]:[e,""]},Ce=e=>ye(e)[0];class y{constructor(...n){ue(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 O=/,\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:"`"}},xe="-",U={static:[["'''",'"'],["''","'"],[/parkdown:\s+/g,""],[/p↓:\s+/g,""]],url:[...Object.entries(F.unsafe),...Object.entries(F.reserved)]},Q=(e,[n,t])=>e.replaceAll(n,t),G=(e,n=xe)=>{const t=U.static.reduce(Q,e);return U.url.map(([s,o])=>[n+s+n,o]).reduce(Q,t).replaceAll(n," ")},Ee=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Se=["string","number","boolean"],ke=e=>Se.includes(e),Ne=/^([a-zA-Z0-9_-]+)(?:\(([^)]*)\))?$/,be=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=Te(s);return{name:t,parameters:o}},Me=(e,n)=>{for(let t=n+1;t<e.length;t++)if(e[t]!==void 0)return!1;return!0},Te=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?je(o):void 0).filter((o,r,i)=>o!==void 0||!Me(i,r))},je=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)},qe=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,p]=c,u=p.trim();if(!ke(u))throw new Error(`Unsupported type: ${u}`);i.push({name:l,optional:a==="?",type:u})}return{name:s,parameters:i}},P=e=>{const n=e.map(qe).reduce((t,{name:s,parameters:o})=>t.set(s,o),new Map);return t=>{const{name:s,parameters:o}=be(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},p)=>{const u=o[p];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})}},H=e=>Object.entries(e).filter(([n])=>n!=="name"&&!isNaN(Number(n))).map(([n,t])=>t),Oe=P(["code(lang?: string, meta?: string)","quote()","dropdown(summary: string, open?: boolean, space?: string)"]),C=(e,n=1)=>`
|
|
3
3
|
`.repeat(n)+e+`
|
|
4
|
-
`.repeat(n),R=(e,n,t)=>`<${n}${t?` ${t}`:""}>${C(e)}</${n}>`,z=(e,n,t)=>{const s=
|
|
4
|
+
`.repeat(n),R=(e,n,t)=>`<${n}${t?` ${t}`:""}>${C(e)}</${n}>`,z=(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(`
|
|
5
5
|
`))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(`
|
|
6
6
|
|
|
7
7
|
`)?`> ${e}`:C(R(C(e),"blockquote"));case"dropdown":const c=R(G(s.summary),"summary");return C(R([c,e].join(`
|
|
8
|
-
`),"details",s.open?"open":void 0))}},I=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=
|
|
9
|
-
`||e===void 0}),Z=e=>V.flatMap(n=>$(e,n)).sort((n,t)=>n.range[0]-t.range[0]).reverse().reduce((n,{range:[t,s],value:o})=>{const r=(a,p)=>n.slice(0,a)+n.slice(p),i=J(n[t-1]),c=J(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),K=V.map(e=>new RegExp(`^${
|
|
10
|
-
`?p.range[1]+1:p.range[1])}}o.collapse();const r=new y;return r.push(0,e.length),r.subtract(o),T.dedent(r.collapse().map(s).filter(Boolean).join("")).trim()},
|
|
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
|
+
`),"details",s.open?"open":void 0))}},I=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=Pe(s[0]).trim();t.push({range:o,value:r})}return t},Pe=e=>e.startsWith("//")?e.slice(2):e.startsWith("/*")?e.slice(2,-2):e.startsWith("<!--")?e.slice(4,-3):e,V=["p↓:","pd:","parkdown:"],X=P(["splice(delete?: number, insert?: string)"]),$=(e,n,t)=>(t??I(e)).filter(({value:s})=>s.includes(n)).sort((s,o)=>s.range[0]-o.range[0]),J=e=>({isSpace:e===" ",isNewline:e===`
|
|
9
|
+
`||e===void 0}),Z=e=>V.flatMap(n=>$(e,n)).sort((n,t)=>n.range[0]-t.range[0]).reverse().reduce((n,{range:[t,s],value:o})=>{const r=(a,p)=>n.slice(0,a)+n.slice(p),i=J(n[t-1]),c=J(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),K=V.map(e=>new RegExp(`^${Ee(e)}(\\?[^\\s]+)`)),Re=e=>K.map(n=>{var t;return(t=n.exec(e))==null?void 0:t[1]}).filter(Boolean).map(n=>new URLSearchParams(n))[0],A=(e,n)=>(Array.isArray(n)?n.flatMap(t=>$(e,t)):$(e,n)).filter(({value:t})=>K.some(s=>s.test(t))).sort((t,s)=>t.range[0]-s.range[0]).reverse().reduce((t,{range:[s,o],value:r})=>{var l,a;const i=Re(r),c=["back","front"].map(p=>[p,i.get(p)]).filter(([p,u])=>!!u).reduce((p,[u,d])=>p.set(u,d.split(O)),new Map);return t=((l=c.get("back"))==null?void 0:l.reduce((p,u)=>{const d=X(u);if(d.name==="splice")return p.slice(0,o)+(d.insert??"")+p.slice(o+(d.delete??0))},t))??t,t=((a=c.get("front"))==null?void 0:a.reduce((p,u)=>{const d=X(u);if(d.name==="splice")return p.slice(0,s-(d.delete??0))+(d.insert??"")+p.slice(s)},t))??t,t},e),Ie=P(["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, expandLeft?: number, expandRight?: number)"]),Ae=(e,...n)=>{if(n.length===0)return e;e=A(e,n);const t=I(e),s=([i,c])=>e.slice(i,c),o=new y,r=new y;for(const i of n){const c=$(e,i,t);for(let l=0;l<c.length-1;l+=2){const a=c[l],p=c[l+1];o.push(a.range[1],p.range[0]);const[u,...d]=s([a.range[1],p.range[0]]),x=d[d.length-1];r.push(a.range[0],a.range[1]+(u.trim()?0:1)),r.push(p.range[0],p.range[1]+(x.trim()?0:1))}}return o.collapse(),r.collapse(),T.dedent(o.subtract(r).map(s).filter(Boolean).join("")).trim()},De=(e,...n)=>{if(n.length===0)return e;e=A(e,n);const t=I(e),s=([i,c])=>e.slice(i,c),o=new y;for(const i of n){const c=$(e,i,t);for(let l=0;l<c.length-1;l+=2){const a=c[l],p=c[l+1],u=s([p.range[1],p.range[1]+1]).at(-1);o.push(a.range[0],u===`
|
|
10
|
+
`?p.range[1]+1:p.range[1])}}o.collapse();const r=new y;return r.push(0,e.length),r.subtract(o),T.dedent(r.collapse().map(s).filter(Boolean).join("")).trim()},Y=(e,n)=>{const t=$(e,n),s=[];for(let o=0;o<t.length-1;o+=2)s.push([t[o],t[o+1]]);return s},Le=(e,n,t)=>{const[s,o]=t;return e&&(s.range[0]-=e),n&&(o.range[1]+=n),t},We=(e,n,t,s,o,r)=>{if(!n||(e=A(e,n),$(e,n).length<2))return e;let c="",l=0;const a=Le.bind(null,o,r);for(const[u,d]of Y(e,n).map(a))c+=e.slice(l,u.range[1]),c+=G(t??u.value,s),l=d.range[0];c+=e.slice(l);const p=new y;return p.push(0,c.length),p.subtract(new y(...Y(c,n).map(a).flatMap(([u,d])=>[u.range,d.range]))),T.dedent(p.collapse().map(([u,d])=>c.slice(u,d)).filter(Boolean).join("")).trim()},_e=(e,n,t)=>{if(!n)return Z(e);const s=Ie(n);switch(s.name){case"extract":e=Ae(e,s.id,...H(s));break;case"remove":e=De(e,s.id,...H(s));break;case"replace":const{with:o,id:r,space:i,expandLeft:c,expandRight:l}=s;e=We(e,r,o,i,c,l);break}return t?Z(e):e},Be=["http","./","../"],Fe=({url:e})=>Be.some(n=>e.startsWith(n)),Ue=e=>j(e)&&we(e)&&Fe(e),ee=({url:e},n)=>`[](${n?g.join(n,e):e})`,f={_open:"<!--",_close:"-->",_flag:"p↓",get begin(){return b(f._open,f._flag,"BEGIN",f._close)},get end(){return b(f._open,f._flag,"END",f._close)},lengthOf(e){const n=`lines: ${e.split(`
|
|
11
|
+
`).length}`,t=`chars: ${e.length}`;return b(f._open,f._flag,"length",n,t,f._close)}},ne=e=>n=>j(n)&&n.value===f[e],Qe=({position:e,url:n,siblingCount:t},s)=>({position:e,url:n,headingDepth:s,inline:t>=1}),Ge=({position:{start:e},url:n,siblingCount:t},{position:{end:s}},o)=>({position:{start:e,end:s},url:n,headingDepth:o,inline:t>=1}),He=(e,n,t)=>(e.inline?b:$e)(ee(e,t),f.begin,f.lengthOf(n),n,f.end),ze=e=>{const n=N(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}},M={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`)},Ve=(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 M.closingCommentNotMatchedToOpening(i);const c=o.pop().node;if(o.length>0)continue;t.push({open:c,close:i})}if(o.length>0)throw M.openingCommentNotClosed(o[0].node);return t},Xe=(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 M.openingCommentDoesNotFollowLink(r.open);return o.push([i,r])}o.push(i)}throw M.openingCommentDoesNotFollowLink(r.open)}),o.push(...s.reverse()),o.reverse()},te=(e,n)=>{n??(n=q.md(e));const t=ze(n),s=N(n,"link").filter(Ue),o=N(n,"html").sort(v),r=o.filter(ne("begin")),i=o.filter(ne("end")),c=Ve(r,i);return Xe(e,s,c).map(a=>Array.isArray(a)?Ge(a[0],a[1].close,t(a[0])):Qe(a,t(a)))},Je=(e,{url:n})=>t=>e(g.join(g.dirname(n),t)),se=(...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=q.md(e));const s=N(t,"heading"),o=e.split(`
|
|
12
|
+
`);for(const r of s){const{depth:i,position:{start:c,end:l}}=r,a=se(i,n),p=o[c.line-1].slice(i,l.column),u="#".repeat(a)+p;o[c.line-1]=u,r.depth=a}return o.join(`
|
|
13
|
+
`)},oe=e=>te(e).reverse().sort(v.reverse).reduce((n,t)=>B(n,ee(t),t),e),re=(e,n,t,s,o)=>{try{e=oe(e),e=Ze(e,n);const r=q.md(e);return te(e,r).sort(v).reverse().map(i=>{var ae,pe;const{url:c,headingDepth:l}=i,[a,...p]=g.basename(c).split("?"),u=a.split(".").pop()??"",d=p.join("?"),x=g.dirname(c),le=g.join(x,a);if(c.startsWith("./")||c.startsWith("../")){let w=t(le);const E=new me.URLSearchParams(d),D=(ae=E.get("region"))==null?void 0:ae.split(O);w=(D==null?void 0:D.reduce((S,k,_,{length:sn})=>_e(S,k,_===sn-1),w))??w;const en=E.has("skip"),nn=E.get("heading")??0,tn=E.has("inline");let{inline:L}=i;if(tn&&(L=!0),!en)if(u==="md"){const S=Je(t,i),k=o?g.join(o,x):x,_=se(l,Number(nn));w=re(w,_,S,le,k)}else/^(js|ts)x?|svelte$/i.test(u)&&(w=z(w,"code",{extension:u,inline:L}));const W=(pe=E.get("wrap"))==null?void 0:pe.split(O);return w=(W==null?void 0:W.reduce((S,k)=>z(S,k,{extension:u,inline:L}),w))??w,{target:i,content:He(i,w,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})=>B(i,l,c),e)}catch(r){throw new Error(`Error populating inclusions in file ${s??"(unknown)"}: ${r}`)}},ie=e=>h.readFileSync(e,"utf-8"),ce=e=>{const n=g.resolve(e),t=g.dirname(n);return{markdown:ie(n),dir:t,path:n}},Ke=(e,n=!0)=>{const{dir:t,path:s,markdown:o}=ce(e),i=re(o,0,c=>ie(g.resolve(t,Ce(c))),s);return n&&h.writeFileSync(s,i),i},Ye=(e,n=!0)=>{const{path:t,markdown:s}=ce(e),o=oe(s);return n&&h.writeFileSync(t,o),o};m.depopulateMarkdownInclusions=Ye,m.populateMarkdownInclusions=Ke,Object.defineProperty(m,Symbol.toStringTag,{value:"Module"})});
|