@p-buddy/parkdown 0.0.6 → 0.0.8
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 +3 -1
- package/dist/cli.js +8 -8
- package/dist/index.js +221 -217
- package/dist/index.umd.cjs +10 -10
- package/package.json +1 -4
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:
|
|
47
|
+
<!-- p↓ length lines: 574 chars: 17955 -->
|
|
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`).
|
|
@@ -55,6 +55,8 @@ These links can be rendered either [inline](#inline) or [block](#block), dependi
|
|
|
55
55
|
|
|
56
56
|
Inline inclusions occur when your _text-less_ link has 1 or more siblings (meaning it's **not** the only node in a [paragraph](https://www.markdownguide.org/basic-syntax/#paragraphs-1)).
|
|
57
57
|
|
|
58
|
+
> **CAUTION:** [parkdown](https://www.npmjs.com/package/@p-buddy/parkdown) will not protect you from authoring inline inclusions that should actually be [block](#block) inclusions to be valid markdown.
|
|
59
|
+
|
|
58
60
|
There are two equivalent ways to author inline inclusions, [single-line](#single-line) or [multi-line](#multi-line), and which you choose depends solely on how you want your raw markdown to look (it will **not** affect the rendered output).
|
|
59
61
|
|
|
60
62
|
#### Single-line
|
package/dist/cli.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Command as t } from "@commander-js/extra-typings";
|
|
3
|
-
import { populateMarkdownInclusions as
|
|
4
|
-
const
|
|
3
|
+
import { populateMarkdownInclusions as l, depopulateMarkdownInclusions as r } from "@p-buddy/parkdown";
|
|
4
|
+
const f = "0.0.8", 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
|
-
const
|
|
7
|
-
[
|
|
8
|
-
[
|
|
6
|
+
const a = [
|
|
7
|
+
[l, !c],
|
|
8
|
+
[r, u]
|
|
9
9
|
];
|
|
10
|
-
for (const [
|
|
10
|
+
for (const [s] of a.filter(([o, e]) => e))
|
|
11
11
|
for (const o of n) {
|
|
12
|
-
const
|
|
13
|
-
i && console.log(
|
|
12
|
+
const e = s(o, !i);
|
|
13
|
+
i && console.log(e);
|
|
14
14
|
}
|
package/dist/index.js
CHANGED
|
@@ -1,43 +1,41 @@
|
|
|
1
1
|
var ue = Object.defineProperty;
|
|
2
|
-
var
|
|
3
|
-
var q = (e, t, n) =>
|
|
4
|
-
import { writeFileSync as J, readFileSync as
|
|
5
|
-
import { basename as fe, dirname as
|
|
6
|
-
import { URLSearchParams as
|
|
7
|
-
import { unified as
|
|
2
|
+
var he = (e, t, n) => t in e ? ue(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n;
|
|
3
|
+
var q = (e, t, n) => he(e, typeof t != "symbol" ? t + "" : t, n);
|
|
4
|
+
import { writeFileSync as J, readFileSync as ge } from "node:fs";
|
|
5
|
+
import { basename as fe, dirname as j, join as S, resolve as Z } from "node:path";
|
|
6
|
+
import { URLSearchParams as de } from "node:url";
|
|
7
|
+
import { unified as we } from "unified";
|
|
8
8
|
import ve from "remark-parse";
|
|
9
|
-
import { visit as
|
|
10
|
-
import $e from "stable-hash";
|
|
9
|
+
import { visit as $e } from "unist-util-visit";
|
|
11
10
|
import { dedent as D } from "ts-dedent";
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}, S = (e, t) => {
|
|
11
|
+
const g = (e, t) => e.position.start.offset - t.position.start.offset;
|
|
12
|
+
g.reverse = (e, t) => g(t, e);
|
|
13
|
+
const I = (e) => e.position !== void 0 && e.position.start.offset !== void 0 && e.position.end.offset !== void 0, Ce = we().use(ve), R = {
|
|
14
|
+
md: (e) => Ce.parse(e)
|
|
15
|
+
}, N = (e, t) => {
|
|
18
16
|
const n = [];
|
|
19
|
-
return
|
|
20
|
-
if (
|
|
21
|
-
if (t &&
|
|
22
|
-
if (I(
|
|
23
|
-
const i =
|
|
24
|
-
n.push({ ...
|
|
17
|
+
return $e(e, (s, o, r) => {
|
|
18
|
+
if (s.type !== "root") {
|
|
19
|
+
if (t && s.type !== t) return;
|
|
20
|
+
if (I(s)) {
|
|
21
|
+
const i = ((r == null ? void 0 : r.children.length) ?? 0) - 1;
|
|
22
|
+
n.push({ ...s, siblingIndex: o, siblingCount: i });
|
|
25
23
|
}
|
|
26
24
|
}
|
|
27
25
|
}), n;
|
|
28
|
-
},
|
|
26
|
+
}, ye = (e) => e.children.length === 0, K = (e, t, ...n) => {
|
|
29
27
|
if (n.length === 0) throw new Error("No nodes to replace content from");
|
|
30
|
-
n.sort(
|
|
31
|
-
const
|
|
32
|
-
return e.slice(0,
|
|
33
|
-
},
|
|
34
|
-
const
|
|
35
|
-
return e.slice(
|
|
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
|
+
}, Ee = (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);
|
|
33
|
+
return e.slice(s, o);
|
|
36
34
|
}, E = (...e) => e.join(" "), Se = (...e) => e.join(`
|
|
37
|
-
`),
|
|
35
|
+
`), Ne = (e) => {
|
|
38
36
|
const t = e.split("?");
|
|
39
37
|
return t.length > 1 ? [t.slice(0, -1).join("?"), t.at(-1)] : [e, ""];
|
|
40
|
-
},
|
|
38
|
+
}, xe = (e) => Ne(e)[0];
|
|
41
39
|
class d {
|
|
42
40
|
constructor() {
|
|
43
41
|
q(this, "intervals", []);
|
|
@@ -53,32 +51,32 @@ class d {
|
|
|
53
51
|
if (!t.length) return this.intervals = [];
|
|
54
52
|
t.sort((r, i) => r[0] - i[0]);
|
|
55
53
|
const n = [];
|
|
56
|
-
let [
|
|
54
|
+
let [s, o] = t[0];
|
|
57
55
|
for (let r = 1; r < t.length; r++) {
|
|
58
56
|
const [i, c] = t[r];
|
|
59
|
-
i <=
|
|
57
|
+
i <= o ? o = Math.max(o, c) : (n.push([s, o]), s = i, o = c);
|
|
60
58
|
}
|
|
61
|
-
return n.push([
|
|
59
|
+
return n.push([s, o]), this.intervals = n;
|
|
62
60
|
}
|
|
63
61
|
subtract(t) {
|
|
64
|
-
const { intervals: n } = this, { intervals:
|
|
65
|
-
if (!n.length || !
|
|
66
|
-
let
|
|
67
|
-
for (const [r, i] of
|
|
62
|
+
const { intervals: n } = this, { intervals: s } = t;
|
|
63
|
+
if (!n.length || !s.length) return n;
|
|
64
|
+
let o = [...n];
|
|
65
|
+
for (const [r, i] of s) {
|
|
68
66
|
const c = [];
|
|
69
|
-
for (const [l, a] of
|
|
67
|
+
for (const [l, a] of o) {
|
|
70
68
|
if (i <= l || r >= a) {
|
|
71
69
|
c.push([l, a]);
|
|
72
70
|
continue;
|
|
73
71
|
}
|
|
74
72
|
r > l && c.push([l, r]), i < a && c.push([i, a]);
|
|
75
73
|
}
|
|
76
|
-
|
|
74
|
+
o = c;
|
|
77
75
|
}
|
|
78
|
-
return this.intervals =
|
|
76
|
+
return this.intervals = o;
|
|
79
77
|
}
|
|
80
78
|
}
|
|
81
|
-
const
|
|
79
|
+
const B = /,\s*(?![^()]*\))/, F = {
|
|
82
80
|
reserved: {
|
|
83
81
|
semi: ";",
|
|
84
82
|
slash: "/",
|
|
@@ -104,7 +102,7 @@ const W = /,\s*(?![^()]*\))/, B = {
|
|
|
104
102
|
unsquare: "]",
|
|
105
103
|
tick: "`"
|
|
106
104
|
}
|
|
107
|
-
},
|
|
105
|
+
}, ke = "-", U = {
|
|
108
106
|
static: [
|
|
109
107
|
["'''", '"'],
|
|
110
108
|
["''", "'"],
|
|
@@ -112,87 +110,87 @@ const W = /,\s*(?![^()]*\))/, B = {
|
|
|
112
110
|
[/p↓:\s+/g, ""]
|
|
113
111
|
],
|
|
114
112
|
url: [
|
|
115
|
-
...Object.entries(
|
|
116
|
-
...Object.entries(
|
|
113
|
+
...Object.entries(F.unsafe),
|
|
114
|
+
...Object.entries(F.reserved)
|
|
117
115
|
]
|
|
118
|
-
},
|
|
119
|
-
const n =
|
|
120
|
-
return
|
|
121
|
-
},
|
|
116
|
+
}, G = (e, [t, n]) => e.replaceAll(t, n), Y = (e, t = ke) => {
|
|
117
|
+
const n = U.static.reduce(G, e);
|
|
118
|
+
return U.url.map(([s, o]) => [t + s + t, o]).reduce(G, n).replaceAll(t, " ");
|
|
119
|
+
}, be = ["string", "number", "boolean"], _e = (e) => be.includes(e), Te = /^([a-zA-Z0-9_-]+)(?:\(([^)]*)\))?$/, Oe = (e) => {
|
|
122
120
|
const t = e.match(Te);
|
|
123
121
|
if (!t) throw new Error(`Invalid invocation: ${e}`);
|
|
124
|
-
const [, n,
|
|
125
|
-
if (!
|
|
126
|
-
const
|
|
127
|
-
return { name: n, parameters:
|
|
128
|
-
},
|
|
122
|
+
const [, n, s = ""] = t;
|
|
123
|
+
if (!s.trim()) return { name: n, parameters: [] };
|
|
124
|
+
const o = je(s);
|
|
125
|
+
return { name: n, parameters: o };
|
|
126
|
+
}, Me = (e, t) => {
|
|
129
127
|
for (let n = t + 1; n < e.length; n++)
|
|
130
128
|
if (e[n] !== void 0) return !1;
|
|
131
129
|
return !0;
|
|
132
|
-
},
|
|
130
|
+
}, je = (e) => {
|
|
133
131
|
const t = [];
|
|
134
|
-
let n = "",
|
|
135
|
-
for (let
|
|
136
|
-
const r = e[
|
|
137
|
-
if (i && e.at(
|
|
138
|
-
const c = e.at(
|
|
139
|
-
|
|
140
|
-
} else i ? (
|
|
132
|
+
let n = "", s = !1;
|
|
133
|
+
for (let o = 0; o < e.length; o++) {
|
|
134
|
+
const r = e[o], i = r === "'";
|
|
135
|
+
if (i && e.at(o + 1) === "'") {
|
|
136
|
+
const c = e.at(o + 2) === "'";
|
|
137
|
+
s = !s, n += c ? "'''" : "''", o += c ? 2 : 1;
|
|
138
|
+
} else i ? (s = !s, n += r) : r === "," && !s ? (t.push(n.trim()), n = "") : n += r;
|
|
141
139
|
}
|
|
142
|
-
return t.push(n.trim()), t.map((
|
|
143
|
-
},
|
|
140
|
+
return t.push(n.trim()), t.map((o) => o === "" ? void 0 : o ? De(o) : void 0).filter((o, r, i) => o !== void 0 || !Me(i, r));
|
|
141
|
+
}, De = (e) => {
|
|
144
142
|
const t = e.length >= 2 && e[0] === "'" && e.at(-1) === "'", n = t && e.length >= 4 && e[1] === "'" && e.at(-2) === "'";
|
|
145
143
|
return !t || n ? e : e.slice(1, -1);
|
|
146
|
-
},
|
|
144
|
+
}, Ie = (e) => {
|
|
147
145
|
const t = /^(\w+)(?:\(([^)]*)\))?/, n = e.match(t);
|
|
148
146
|
if (!n) return { name: e };
|
|
149
|
-
const [,
|
|
150
|
-
if (!
|
|
147
|
+
const [, s, o] = n;
|
|
148
|
+
if (!o) return { name: s };
|
|
151
149
|
const r = /(\w+)(\?)?:\s*([^,]+)/g, i = [];
|
|
152
150
|
let c;
|
|
153
|
-
for (; (c = r.exec(
|
|
154
|
-
const [, l, a, p] = c,
|
|
155
|
-
if (!_e(
|
|
156
|
-
i.push({ name: l, optional: a === "?", type:
|
|
151
|
+
for (; (c = r.exec(o)) !== null; ) {
|
|
152
|
+
const [, l, a, p] = c, m = p.trim();
|
|
153
|
+
if (!_e(m)) throw new Error(`Unsupported type: ${m}`);
|
|
154
|
+
i.push({ name: l, optional: a === "?", type: m });
|
|
157
155
|
}
|
|
158
|
-
return { name:
|
|
159
|
-
},
|
|
160
|
-
const t = e.map(
|
|
161
|
-
(n, { name:
|
|
156
|
+
return { name: s, parameters: i };
|
|
157
|
+
}, ee = (e) => {
|
|
158
|
+
const t = e.map(Ie).reduce(
|
|
159
|
+
(n, { name: s, parameters: o }) => n.set(s, o),
|
|
162
160
|
/* @__PURE__ */ new Map()
|
|
163
161
|
);
|
|
164
162
|
return (n) => {
|
|
165
|
-
const { name:
|
|
166
|
-
if (!t.has(
|
|
167
|
-
throw new Error(`Unknown method: ${
|
|
168
|
-
const r = t.get(
|
|
163
|
+
const { name: s, parameters: o } = Oe(n);
|
|
164
|
+
if (!t.has(s))
|
|
165
|
+
throw new Error(`Unknown method: ${s}`);
|
|
166
|
+
const r = t.get(s);
|
|
169
167
|
if (r === void 0)
|
|
170
|
-
return { name:
|
|
171
|
-
if (
|
|
168
|
+
return { name: s };
|
|
169
|
+
if (o.length > r.length) {
|
|
172
170
|
const i = r.filter(({ optional: l }) => !l).length, c = i === r.length ? i.toString() : `${i} - ${r.length}`;
|
|
173
|
-
throw new Error(`Too many parameters: ${
|
|
171
|
+
throw new Error(`Too many parameters: ${o.length} for method '${s}' (expected: ${c})`);
|
|
174
172
|
}
|
|
175
173
|
return r.reduce((i, { name: c, optional: l, type: a }, p) => {
|
|
176
|
-
const
|
|
177
|
-
if (
|
|
174
|
+
const m = o[p];
|
|
175
|
+
if (m === void 0) {
|
|
178
176
|
if (l) return i;
|
|
179
|
-
throw new Error(`Missing required parameter: ${c} for method '${
|
|
177
|
+
throw new Error(`Missing required parameter: ${c} for method '${s}'`);
|
|
180
178
|
}
|
|
181
179
|
switch (a) {
|
|
182
180
|
case "string":
|
|
183
|
-
i[c] =
|
|
181
|
+
i[c] = m;
|
|
184
182
|
break;
|
|
185
183
|
case "number":
|
|
186
184
|
case "boolean":
|
|
187
|
-
i[c] = JSON.parse(
|
|
185
|
+
i[c] = JSON.parse(m);
|
|
188
186
|
break;
|
|
189
187
|
}
|
|
190
188
|
if (typeof i[c] !== a)
|
|
191
|
-
throw new Error(`Invalid type: ${c} must be ${a}, got ${typeof i[c]} for method '${
|
|
189
|
+
throw new Error(`Invalid type: ${c} must be ${a}, got ${typeof i[c]} for method '${s}'`);
|
|
192
190
|
return i;
|
|
193
|
-
}, { name:
|
|
191
|
+
}, { name: s });
|
|
194
192
|
};
|
|
195
|
-
},
|
|
193
|
+
}, H = (e) => Object.entries(e).filter(([t]) => t !== "name" && !isNaN(Number(t))).map(([t, n]) => n), Re = [
|
|
196
194
|
/**
|
|
197
195
|
* Wraps the content in a markdown-formatted code block.
|
|
198
196
|
* @param lang The language of the code block (defaults to the file extension).
|
|
@@ -222,26 +220,34 @@ const W = /,\s*(?![^()]*\))/, B = {
|
|
|
222
220
|
* @example [](<url>?wrap=dropdown(hello_world,,_))
|
|
223
221
|
*/
|
|
224
222
|
"dropdown(summary: string, open?: boolean, space?: string)"
|
|
225
|
-
],
|
|
223
|
+
], Ae = ee(Re), f = (e, t = 1) => `
|
|
226
224
|
`.repeat(t) + e + `
|
|
227
|
-
`.repeat(t),
|
|
228
|
-
const
|
|
229
|
-
switch (
|
|
225
|
+
`.repeat(t), M = (e, t, n) => `<${t}${n ? ` ${n}` : ""}>${f(e)}</${t}>`, Q = (e, t, n) => {
|
|
226
|
+
const s = Ae(t);
|
|
227
|
+
switch (s.name) {
|
|
230
228
|
case "code":
|
|
231
|
-
if (!
|
|
229
|
+
if (!s.lang && !s.meta && (n == null ? void 0 : n.inline) && !e.includes(`
|
|
232
230
|
`)) return `\`${e}\``;
|
|
233
|
-
const r =
|
|
234
|
-
return
|
|
231
|
+
const r = s.lang ?? (n == null ? void 0 : n.extension) ?? "", i = s.meta ? ` ${s.meta}` : "";
|
|
232
|
+
return f(`\`\`\`${r}${i}${f(e)}\`\`\``);
|
|
235
233
|
case "quote":
|
|
236
234
|
return n != null && n.inline && !e.includes(`
|
|
237
235
|
|
|
238
|
-
`) ? `> ${e}` :
|
|
236
|
+
`) ? `> ${e}` : f(M(f(e), "blockquote"));
|
|
239
237
|
case "dropdown":
|
|
240
|
-
const c =
|
|
241
|
-
return
|
|
242
|
-
`), "details",
|
|
238
|
+
const c = M(Y(s.summary), "summary");
|
|
239
|
+
return f(M([c, e].join(`
|
|
240
|
+
`), "details", s.open ? "open" : void 0));
|
|
243
241
|
}
|
|
244
|
-
},
|
|
242
|
+
}, A = (e) => {
|
|
243
|
+
const t = /(\/\/[^\n]*|\/\*[\s\S]*?\*\/|<!--[\s\S]*?-->)/gm, n = [];
|
|
244
|
+
let s;
|
|
245
|
+
for (; (s = t.exec(e)) !== null; ) {
|
|
246
|
+
const o = [s.index, s.index + s[0].length], r = Pe(s[0]).trim();
|
|
247
|
+
n.push({ range: o, value: r });
|
|
248
|
+
}
|
|
249
|
+
return n;
|
|
250
|
+
}, Pe = (e) => e.startsWith("//") ? e.slice(2) : e.startsWith("/*") ? e.slice(2, -2) : e.startsWith("<!--") ? e.slice(4, -3) : e, We = [
|
|
245
251
|
/**
|
|
246
252
|
* Extract regions from the retrieved content between comments that INCLUDE the specified ids.
|
|
247
253
|
* @param id The id of the comment to extract.
|
|
@@ -272,107 +278,102 @@ const W = /,\s*(?![^()]*\))/, B = {
|
|
|
272
278
|
* @example [](<url>?region=replace(specifier,new_content,_)
|
|
273
279
|
*/
|
|
274
280
|
"replace(id: string, with?: string, space?: string)"
|
|
275
|
-
],
|
|
281
|
+
], Le = ee(We), x = (e, t) => A(e).filter(({ value: n }) => n.includes(t)).sort((n, s) => n.range[0] - s.range[0]), qe = (e, ...t) => {
|
|
276
282
|
if (t.length === 0) return e;
|
|
277
|
-
const n = ([i, c]) => e.slice(i, c),
|
|
283
|
+
const n = ([i, c]) => e.slice(i, c), s = A(e), o = new d(), r = new d();
|
|
278
284
|
for (const i of t) {
|
|
279
|
-
const c =
|
|
285
|
+
const c = s.filter(({ value: l }) => l.includes(i)).sort((l, a) => l.range[0] - a.range[0]);
|
|
280
286
|
for (let l = 0; l < c.length - 1; l += 2) {
|
|
281
287
|
const a = c[l], p = c[l + 1];
|
|
282
|
-
|
|
283
|
-
const [
|
|
284
|
-
r.push(a.range[0], a.range[1] + (
|
|
288
|
+
o.push(a.range[1], p.range[0]);
|
|
289
|
+
const [m, ...y] = n([a.range[1], p.range[0]]), w = y[y.length - 1];
|
|
290
|
+
r.push(a.range[0], a.range[1] + (m.trim() ? 0 : 1)), r.push(p.range[0], p.range[1] + (w.trim() ? 0 : 1));
|
|
285
291
|
}
|
|
286
292
|
}
|
|
287
|
-
return
|
|
288
|
-
|
|
293
|
+
return o.collapse(), r.collapse(), D(
|
|
294
|
+
o.subtract(r).map(n).filter(Boolean).join("")
|
|
289
295
|
).trim();
|
|
290
296
|
}, Be = (e, ...t) => {
|
|
291
297
|
if (t.length === 0) return e;
|
|
292
|
-
const n = ([i, c]) => e.slice(i, c),
|
|
298
|
+
const n = ([i, c]) => e.slice(i, c), s = A(e), o = new d();
|
|
293
299
|
for (const i of t) {
|
|
294
|
-
const c =
|
|
300
|
+
const c = s.filter(({ value: l }) => l.includes(i)).sort((l, a) => l.range[0] - a.range[0]);
|
|
295
301
|
for (let l = 0; l < c.length - 1; l += 2) {
|
|
296
|
-
const a = c[l], p = c[l + 1],
|
|
297
|
-
|
|
302
|
+
const a = c[l], p = c[l + 1], m = n([p.range[1], p.range[1] + 1]).at(-1);
|
|
303
|
+
o.push(a.range[0], m === `
|
|
298
304
|
` ? p.range[1] + 1 : p.range[1]);
|
|
299
305
|
}
|
|
300
306
|
}
|
|
301
|
-
|
|
307
|
+
o.collapse();
|
|
302
308
|
const r = new d();
|
|
303
|
-
return r.push(0, e.length), r.subtract(
|
|
309
|
+
return r.push(0, e.length), r.subtract(o), D(
|
|
304
310
|
r.collapse().map(n).filter(Boolean).join("")
|
|
305
311
|
).trim();
|
|
306
|
-
}, Fe = (e, t, n,
|
|
312
|
+
}, Fe = (e, t, n, s) => {
|
|
307
313
|
if (!t) return e;
|
|
308
|
-
const
|
|
309
|
-
if (
|
|
314
|
+
const o = x(e, t);
|
|
315
|
+
if (o.length < 2) return e;
|
|
310
316
|
let r = "", i = 0;
|
|
311
|
-
for (let l = 0; l <
|
|
312
|
-
const a =
|
|
313
|
-
r += e.slice(i, a.range[1]), r +=
|
|
317
|
+
for (let l = 0; l < o.length - 1; l += 2) {
|
|
318
|
+
const a = o[l], p = o[l + 1];
|
|
319
|
+
r += e.slice(i, a.range[1]), r += Y(n ?? a.value, s), i = p.range[0];
|
|
314
320
|
}
|
|
315
321
|
r += e.slice(i);
|
|
316
322
|
const c = new d();
|
|
317
323
|
return c.push(0, r.length), c.subtract(
|
|
318
|
-
|
|
324
|
+
x(r, t).reduce((l, { range: a }) => (l.push(...a), l), new d())
|
|
319
325
|
), D(
|
|
320
326
|
c.collapse().map(([l, a]) => r.slice(l, a)).filter(Boolean).join("")
|
|
321
327
|
).trim();
|
|
322
|
-
},
|
|
323
|
-
` }),
|
|
324
|
-
...
|
|
325
|
-
...
|
|
326
|
-
].sort((t, n) => t.range[0] - n.range[0]).reverse().reduce((t, { range: [n,
|
|
327
|
-
const r = (
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
return i.startLine && (i.next.newline || i.final) ? r(n - (i.final ? 1 : 0), o + 1) : i.startLine ? r(n, o + (i.next.space ? 1 : 0)) : r(n - (i.prev.space ? 1 : 0), o);
|
|
334
|
-
}, e), Ue = (e, t) => {
|
|
335
|
-
if (!t) return z(e);
|
|
336
|
-
const n = qe(t);
|
|
337
|
-
switch (n.name) {
|
|
328
|
+
}, z = (e) => ({ isSpace: e === " ", isNewline: e === `
|
|
329
|
+
` || e === void 0 }), X = (e) => [
|
|
330
|
+
...x(e, "p↓:"),
|
|
331
|
+
...x(e, "parkdown:")
|
|
332
|
+
].sort((t, n) => t.range[0] - n.range[0]).reverse().reduce((t, { range: [n, s], value: o }) => {
|
|
333
|
+
const r = (a, p) => t.slice(0, a) + t.slice(p), i = z(t[n - 1]), c = z(t[s]), l = s === t.length;
|
|
334
|
+
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);
|
|
335
|
+
}, e), Ue = (e, t, n) => {
|
|
336
|
+
if (!t) return X(e);
|
|
337
|
+
const s = Le(t);
|
|
338
|
+
switch (s.name) {
|
|
338
339
|
case "extract":
|
|
339
|
-
e =
|
|
340
|
+
e = qe(e, s.id, ...H(s));
|
|
340
341
|
break;
|
|
341
342
|
case "remove":
|
|
342
|
-
e = Be(e,
|
|
343
|
+
e = Be(e, s.id, ...H(s));
|
|
343
344
|
break;
|
|
344
345
|
case "replace":
|
|
345
|
-
e = Fe(e,
|
|
346
|
+
e = Fe(e, s.id, s.with, s.space);
|
|
346
347
|
break;
|
|
347
348
|
}
|
|
348
|
-
return
|
|
349
|
-
}, Ge = ["http", "./", "../"], He = ({ url: e }) => Ge.some((t) => e.startsWith(t)), Qe = (e) => I(e) &&
|
|
349
|
+
return n ? X(e) : e;
|
|
350
|
+
}, Ge = ["http", "./", "../"], He = ({ url: e }) => Ge.some((t) => e.startsWith(t)), Qe = (e) => I(e) && ye(e) && He(e), te = ({ url: e }, t) => `[](${t ? S(t, e) : e})`, u = {
|
|
350
351
|
_open: "<!--",
|
|
351
352
|
_close: "-->",
|
|
352
353
|
_flag: "p↓",
|
|
353
354
|
get begin() {
|
|
354
|
-
return E(
|
|
355
|
+
return E(u._open, u._flag, "BEGIN", u._close);
|
|
355
356
|
},
|
|
356
357
|
get end() {
|
|
357
|
-
return E(
|
|
358
|
+
return E(u._open, u._flag, "END", u._close);
|
|
358
359
|
},
|
|
359
360
|
lengthOf(e) {
|
|
360
361
|
const t = `lines: ${e.split(`
|
|
361
362
|
`).length}`, n = `chars: ${e.length}`;
|
|
362
|
-
return E(
|
|
363
|
+
return E(u._open, u._flag, "length", t, n, u._close);
|
|
363
364
|
}
|
|
364
|
-
},
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
365
|
+
}, V = (e) => (t) => I(t) && t.value === u[e], ze = ({ position: e, url: t, siblingCount: n }, s) => ({ position: e, url: t, headingDepth: s, inline: n >= 1 }), Xe = ({ position: { start: e }, url: t, siblingCount: n }, { position: { end: s } }, o) => ({ position: { start: e, end: s }, url: t, headingDepth: o, inline: n >= 1 }), Ve = (e, t, n) => (e.inline ? E : Se)(
|
|
366
|
+
te(e, n),
|
|
367
|
+
u.begin,
|
|
368
|
+
u.lengthOf(t),
|
|
368
369
|
t,
|
|
369
|
-
|
|
370
|
-
),
|
|
371
|
-
const t =
|
|
370
|
+
u.end
|
|
371
|
+
), Je = (e) => {
|
|
372
|
+
const t = N(e, "heading").reduce((n, { position: s, depth: o }) => n.set(s.start.line, o), /* @__PURE__ */ new Map());
|
|
372
373
|
return (n) => {
|
|
373
|
-
for (let
|
|
374
|
-
const
|
|
375
|
-
if (
|
|
374
|
+
for (let s = n.position.start.line; s >= 1; s--) {
|
|
375
|
+
const o = t.get(s);
|
|
376
|
+
if (o) return o;
|
|
376
377
|
}
|
|
377
378
|
return 0;
|
|
378
379
|
};
|
|
@@ -381,105 +382,108 @@ const W = /,\s*(?![^()]*\))/, B = {
|
|
|
381
382
|
closingCommentNotMatchedToOpening: ({ position: { start: e } }) => new Error(`Closing comment (@${e.line}:${e.column}) does not match to opening comment`),
|
|
382
383
|
openingCommentNotClosed: ({ position: { start: e } }) => new Error(`Opening comment (@${e.line}:${e.column}) is not followed by a closing comment`)
|
|
383
384
|
}, Ze = (e, t) => {
|
|
384
|
-
const n = [],
|
|
385
|
+
const n = [], s = [
|
|
385
386
|
...e.map((r) => ({ node: r, type: "open" })),
|
|
386
387
|
...t.map((r) => ({ node: r, type: "close" }))
|
|
387
|
-
].sort((r, i) =>
|
|
388
|
-
for (const r of
|
|
389
|
-
if (r.type === "open")
|
|
388
|
+
].sort((r, i) => g(r.node, i.node)), o = [];
|
|
389
|
+
for (const r of s)
|
|
390
|
+
if (r.type === "open") o.push(r);
|
|
390
391
|
else {
|
|
391
392
|
const i = r.node;
|
|
392
|
-
if (
|
|
393
|
+
if (o.length === 0)
|
|
393
394
|
throw k.closingCommentNotMatchedToOpening(i);
|
|
394
|
-
const c =
|
|
395
|
-
if (
|
|
395
|
+
const c = o.pop().node;
|
|
396
|
+
if (o.length > 0) continue;
|
|
396
397
|
n.push({ open: c, close: i });
|
|
397
398
|
}
|
|
398
|
-
if (
|
|
399
|
-
throw k.openingCommentNotClosed(
|
|
399
|
+
if (o.length > 0)
|
|
400
|
+
throw k.openingCommentNotClosed(o[0].node);
|
|
400
401
|
return n;
|
|
401
402
|
}, Ke = (e, t, n) => {
|
|
402
|
-
const
|
|
403
|
-
return [...n].sort((r, i) =>
|
|
404
|
-
for (;
|
|
405
|
-
const i =
|
|
403
|
+
const s = [...t].sort(g), o = [];
|
|
404
|
+
return [...n].sort((r, i) => g.reverse(r.open, i.open)).forEach((r) => {
|
|
405
|
+
for (; s.length > 0; ) {
|
|
406
|
+
const i = s.pop();
|
|
406
407
|
if (i.position.start.offset < r.open.position.start.offset) {
|
|
407
|
-
if (
|
|
408
|
+
if (Ee(e, i, r.open).trim() !== "")
|
|
408
409
|
throw k.openingCommentDoesNotFollowLink(r.open);
|
|
409
|
-
return
|
|
410
|
+
return o.push([i, r]);
|
|
410
411
|
}
|
|
411
|
-
|
|
412
|
+
o.push(i);
|
|
412
413
|
}
|
|
413
414
|
throw k.openingCommentDoesNotFollowLink(r.open);
|
|
414
|
-
}),
|
|
415
|
-
},
|
|
416
|
-
t ?? (t =
|
|
417
|
-
const n =
|
|
418
|
-
return Ke(e,
|
|
419
|
-
}, Ye = (e, { url: t }) => (n) => e(
|
|
420
|
-
const t = e.reduce((n,
|
|
415
|
+
}), o.push(...s.reverse()), o.reverse();
|
|
416
|
+
}, ne = (e, t) => {
|
|
417
|
+
t ?? (t = R.md(e));
|
|
418
|
+
const n = Je(t), s = N(t, "link").filter(Qe), o = N(t, "html").sort(g), r = o.filter(V("begin")), i = o.filter(V("end")), c = Ze(r, i);
|
|
419
|
+
return Ke(e, s, c).map((a) => Array.isArray(a) ? Xe(a[0], a[1].close, n(a[0])) : ze(a, n(a)));
|
|
420
|
+
}, Ye = (e, { url: t }) => (n) => e(S(j(t), n)), se = (...e) => {
|
|
421
|
+
const t = e.reduce((n, s) => n + s, 0);
|
|
421
422
|
return Math.min(Math.max(t, 1), 6);
|
|
422
423
|
}, et = (e, t, n) => {
|
|
423
424
|
if (t === 0) return e;
|
|
424
|
-
n ?? (n =
|
|
425
|
-
const
|
|
425
|
+
n ?? (n = R.md(e));
|
|
426
|
+
const s = N(n, "heading"), o = e.split(`
|
|
426
427
|
`);
|
|
427
|
-
for (const r of
|
|
428
|
-
const { depth: i, position: { start: c, end: l } } = r, a =
|
|
429
|
-
|
|
428
|
+
for (const r of s) {
|
|
429
|
+
const { depth: i, position: { start: c, end: l } } = r, a = se(i, t), p = o[c.line - 1].slice(i, l.column), m = "#".repeat(a) + p;
|
|
430
|
+
o[c.line - 1] = m, r.depth = a;
|
|
430
431
|
}
|
|
431
|
-
return
|
|
432
|
+
return o.join(`
|
|
432
433
|
`);
|
|
433
|
-
}, oe = (e) =>
|
|
434
|
+
}, oe = (e) => ne(e).reverse().sort(g.reverse).reduce((t, n) => K(t, te(n), n), e), re = (e, t, n, s, o) => {
|
|
434
435
|
try {
|
|
435
436
|
e = oe(e), e = et(e, t);
|
|
436
|
-
const r =
|
|
437
|
-
return
|
|
438
|
-
var
|
|
439
|
-
const { url: c, headingDepth: l } = i, [a, ...p] = fe(c).split("?"),
|
|
437
|
+
const r = R.md(e);
|
|
438
|
+
return ne(e, r).sort(g).reverse().map((i) => {
|
|
439
|
+
var W, L;
|
|
440
|
+
const { url: c, headingDepth: l } = i, [a, ...p] = fe(c).split("?"), m = a.split(".").pop() ?? "", y = p.join("?"), w = j(c), P = S(w, a);
|
|
440
441
|
if (c.startsWith("./") || c.startsWith("../")) {
|
|
441
|
-
let h = n(
|
|
442
|
-
const
|
|
443
|
-
h = (
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
442
|
+
let h = n(P);
|
|
443
|
+
const v = new de(y), b = (W = v.get("region")) == null ? void 0 : W.split(B);
|
|
444
|
+
h = (b == null ? void 0 : b.reduce(
|
|
445
|
+
($, C, O, { length: me }) => Ue($, C, O === me - 1),
|
|
446
|
+
h
|
|
447
|
+
)) ?? h;
|
|
448
|
+
const le = v.has("skip"), ae = v.get("heading") ?? 0, pe = v.has("inline");
|
|
449
|
+
let { inline: _ } = i;
|
|
450
|
+
if (pe && (_ = !0), !le)
|
|
451
|
+
if (m === "md") {
|
|
452
|
+
const $ = Ye(n, i), C = o ? S(o, w) : w, O = se(l, Number(ae));
|
|
453
|
+
h = re(
|
|
450
454
|
h,
|
|
451
455
|
/** p↓: ... */
|
|
452
|
-
|
|
456
|
+
O,
|
|
453
457
|
$,
|
|
454
|
-
|
|
458
|
+
P,
|
|
455
459
|
C
|
|
456
460
|
/** p↓: ... */
|
|
457
461
|
);
|
|
458
|
-
} else /^(js|ts)x?|svelte$/i.test(
|
|
462
|
+
} else /^(js|ts)x?|svelte$/i.test(m) && (h = Q(
|
|
459
463
|
h,
|
|
460
464
|
"code",
|
|
461
465
|
/** p↓: ... */
|
|
462
|
-
{ extension:
|
|
466
|
+
{ extension: m, inline: _ }
|
|
463
467
|
/** p↓: ... */
|
|
464
468
|
));
|
|
465
|
-
const
|
|
466
|
-
return h = (
|
|
469
|
+
const T = (L = v.get("wrap")) == null ? void 0 : L.split(B);
|
|
470
|
+
return h = (T == null ? void 0 : T.reduce(($, C) => Q($, C, { extension: m, inline: _ }), h)) ?? h, { target: i, content: Ve(i, h, o) };
|
|
467
471
|
} else throw c.startsWith("http") ? new Error("External web links are not implemented yet") : new Error(`Unsupported link type: ${c}`);
|
|
468
|
-
}).reduce((i, { target: c, content: l }) =>
|
|
472
|
+
}).reduce((i, { target: c, content: l }) => K(i, l, c), e);
|
|
469
473
|
} catch (r) {
|
|
470
|
-
throw new Error(`Error populating inclusions in file ${
|
|
474
|
+
throw new Error(`Error populating inclusions in file ${s ?? "(unknown)"}: ${r}`);
|
|
471
475
|
}
|
|
472
|
-
},
|
|
473
|
-
const t =
|
|
474
|
-
return { markdown:
|
|
475
|
-
},
|
|
476
|
-
const { dir: n, path:
|
|
477
|
-
return t && J(
|
|
478
|
-
},
|
|
479
|
-
const { path: n, markdown:
|
|
480
|
-
return t && J(n,
|
|
476
|
+
}, ie = (e) => ge(e, "utf-8"), ce = (e) => {
|
|
477
|
+
const t = Z(e), n = j(t);
|
|
478
|
+
return { markdown: ie(t), dir: n, path: t };
|
|
479
|
+
}, at = (e, t = !0) => {
|
|
480
|
+
const { dir: n, path: s, markdown: o } = ce(e), i = re(o, 0, (c) => ie(Z(n, xe(c))), s);
|
|
481
|
+
return t && J(s, i), i;
|
|
482
|
+
}, pt = (e, t = !0) => {
|
|
483
|
+
const { path: n, markdown: s } = ce(e), o = oe(s);
|
|
484
|
+
return t && J(n, o), o;
|
|
481
485
|
};
|
|
482
486
|
export {
|
|
483
|
-
|
|
484
|
-
|
|
487
|
+
pt as depopulateMarkdownInclusions,
|
|
488
|
+
at as populateMarkdownInclusions
|
|
485
489
|
};
|
package/dist/index.umd.cjs
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
(function(
|
|
2
|
-
`),
|
|
1
|
+
(function(u,d){typeof exports=="object"&&typeof module<"u"?d(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"],d):(u=typeof globalThis<"u"?globalThis:u||self,d(u.index={},u.node_fs,u.node_path,u.node_url,u.unified,u.remarkParse,u.unistUtilVisit,u.tsDedent))})(this,function(u,d,h,ce,le,ae,pe,j){"use strict";var Je=Object.defineProperty;var Ze=(u,d,h)=>d in u?Je(u,d,{enumerable:!0,configurable:!0,writable:!0,value:h}):u[d]=h;var ie=(u,d,h)=>Ze(u,typeof d!="symbol"?d+"":d,h);const v=(e,n)=>e.position.start.offset-n.position.start.offset;v.reverse=(e,n)=>v(n,e);const M=e=>e.position!==void 0&&e.position.start.offset!==void 0&&e.position.end.offset!==void 0,ue=le.unified().use(ae),O={md:e=>ue.parse(e)},k=(e,n)=>{const t=[];return pe.visit(e,(s,o,r)=>{if(s.type!=="root"){if(n&&s.type!==n)return;if(M(s)){const i=((r==null?void 0:r.children.length)??0)-1;t.push({...s,siblingIndex:o,siblingCount:i})}}}),t},me=e=>e.children.length===0,W=(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)},de=(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(" "),he=(...e)=>e.join(`
|
|
2
|
+
`),fe=e=>{const n=e.split("?");return n.length>1?[n.slice(0,-1).join("?"),n.at(-1)]:[e,""]},ge=e=>fe(e)[0];class w{constructor(){ie(this,"intervals",[])}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 _=/,\s*(?![^()]*\))/,L={reserved:{semi:";",slash:"/",question:"?",colon:":",at:"@",equal:"=",and:"&"},unsafe:{quote:'"',angle:"<",unangle:">",hash:"#",percent:"%",curly:"{",uncurly:"}",pipe:"|",back:"\\",carrot:"^",tilde:"~",square:"[",unsquare:"]",tick:"`"}},ve="-",B={static:[["'''",'"'],["''","'"],[/parkdown:\s+/g,""],[/p↓:\s+/g,""]],url:[...Object.entries(L.unsafe),...Object.entries(L.reserved)]},F=(e,[n,t])=>e.replaceAll(n,t),U=(e,n=ve)=>{const t=B.static.reduce(F,e);return B.url.map(([s,o])=>[n+s+n,o]).reduce(F,t).replaceAll(n," ")},we=["string","number","boolean"],$e=e=>we.includes(e),Ce=/^([a-zA-Z0-9_-]+)(?:\(([^)]*)\))?$/,ye=e=>{const n=e.match(Ce);if(!n)throw new Error(`Invalid invocation: ${e}`);const[,t,s=""]=n;if(!s.trim())return{name:t,parameters:[]};const o=Ee(s);return{name:t,parameters:o}},Se=(e,n)=>{for(let t=n+1;t<e.length;t++)if(e[t]!==void 0)return!1;return!0},Ee=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?ke(o):void 0).filter((o,r,i)=>o!==void 0||!Se(i,r))},ke=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)},Ne=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,m=p.trim();if(!$e(m))throw new Error(`Unsupported type: ${m}`);i.push({name:l,optional:a==="?",type:m})}return{name:s,parameters:i}},G=e=>{const n=e.map(Ne).reduce((t,{name:s,parameters:o})=>t.set(s,o),new Map);return t=>{const{name:s,parameters:o}=ye(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 m=o[p];if(m===void 0){if(l)return i;throw new Error(`Missing required parameter: ${c} for method '${s}'`)}switch(a){case"string":i[c]=m;break;case"number":case"boolean":i[c]=JSON.parse(m);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),xe=G(["code(lang?: string, meta?: string)","quote()","dropdown(summary: string, open?: boolean, space?: string)"]),$=(e,n=1)=>`
|
|
3
3
|
`.repeat(n)+e+`
|
|
4
|
-
`.repeat(n),
|
|
4
|
+
`.repeat(n),q=(e,n,t)=>`<${n}${t?` ${t}`:""}>${$(e)}</${n}>`,Q=(e,n,t)=>{const s=xe(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 $(`\`\`\`${r}${i}${$(e)}\`\`\``);case"quote":return t!=null&&t.inline&&!e.includes(`
|
|
6
6
|
|
|
7
|
-
`)?`> ${e}`:$(
|
|
8
|
-
`),"details",s.open?"open":void 0))}},Te=
|
|
9
|
-
`?
|
|
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
|
-
`)},
|
|
7
|
+
`)?`> ${e}`:$(q($(e),"blockquote"));case"dropdown":const c=q(U(s.summary),"summary");return $(q([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=Te(s[0]).trim();t.push({range:o,value:r})}return t},Te=e=>e.startsWith("//")?e.slice(2):e.startsWith("/*")?e.slice(2,-2):e.startsWith("<!--")?e.slice(4,-3):e,be=G(["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)"]),x=(e,n)=>I(e).filter(({value:t})=>t.includes(n)).sort((t,s)=>t.range[0]-s.range[0]),je=(e,...n)=>{if(n.length===0)return e;const t=([i,c])=>e.slice(i,c),s=I(e),o=new w,r=new w;for(const i of n){const c=s.filter(({value:l})=>l.includes(i)).sort((l,a)=>l.range[0]-a.range[0]);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[m,...b]=t([a.range[1],p.range[0]]),C=b[b.length-1];r.push(a.range[0],a.range[1]+(m.trim()?0:1)),r.push(p.range[0],p.range[1]+(C.trim()?0:1))}}return o.collapse(),r.collapse(),j.dedent(o.subtract(r).map(t).filter(Boolean).join("")).trim()},Me=(e,...n)=>{if(n.length===0)return e;const t=([i,c])=>e.slice(i,c),s=I(e),o=new w;for(const i of n){const c=s.filter(({value:l})=>l.includes(i)).sort((l,a)=>l.range[0]-a.range[0]);for(let l=0;l<c.length-1;l+=2){const a=c[l],p=c[l+1],m=t([p.range[1],p.range[1]+1]).at(-1);o.push(a.range[0],m===`
|
|
9
|
+
`?p.range[1]+1:p.range[1])}}o.collapse();const r=new w;return r.push(0,e.length),r.subtract(o),j.dedent(r.collapse().map(t).filter(Boolean).join("")).trim()},Oe=(e,n,t,s)=>{if(!n)return e;const o=x(e,n);if(o.length<2)return e;let r="",i=0;for(let l=0;l<o.length-1;l+=2){const a=o[l],p=o[l+1];r+=e.slice(i,a.range[1]),r+=U(t??a.value,s),i=p.range[0]}r+=e.slice(i);const c=new w;return c.push(0,r.length),c.subtract(x(r,n).reduce((l,{range:a})=>(l.push(...a),l),new w)),j.dedent(c.collapse().map(([l,a])=>r.slice(l,a)).filter(Boolean).join("")).trim()},z=e=>({isSpace:e===" ",isNewline:e===`
|
|
10
|
+
`||e===void 0}),V=e=>[...x(e,"p↓:"),...x(e,"parkdown:")].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=z(n[t-1]),c=z(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),qe=(e,n,t)=>{if(!n)return V(e);const s=be(n);switch(s.name){case"extract":e=je(e,s.id,...H(s));break;case"remove":e=Me(e,s.id,...H(s));break;case"replace":e=Oe(e,s.id,s.with,s.space);break}return t?V(e):e},Ie=["http","./","../"],Pe=({url:e})=>Ie.some(n=>e.startsWith(n)),Re=e=>M(e)&&me(e)&&Pe(e),X=({url:e},n)=>`[](${n?h.join(n,e):e})`,f={_open:"<!--",_close:"-->",_flag:"p↓",get begin(){return N(f._open,f._flag,"BEGIN",f._close)},get end(){return N(f._open,f._flag,"END",f._close)},lengthOf(e){const n=`lines: ${e.split(`
|
|
11
|
+
`).length}`,t=`chars: ${e.length}`;return N(f._open,f._flag,"length",n,t,f._close)}},J=e=>n=>M(n)&&n.value===f[e],Ae=({position:e,url:n,siblingCount:t},s)=>({position:e,url:n,headingDepth:s,inline:t>=1}),De=({position:{start:e},url:n,siblingCount:t},{position:{end:s}},o)=>({position:{start:e,end:s},url:n,headingDepth:o,inline:t>=1}),We=(e,n,t)=>(e.inline?N:he)(X(e,t),f.begin,f.lengthOf(n),n,f.end),_e=e=>{const n=k(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}},T={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`)},Le=(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 T.closingCommentNotMatchedToOpening(i);const c=o.pop().node;if(o.length>0)continue;t.push({open:c,close:i})}if(o.length>0)throw T.openingCommentNotClosed(o[0].node);return t},Be=(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(de(e,i,r.open).trim()!=="")throw T.openingCommentDoesNotFollowLink(r.open);return o.push([i,r])}o.push(i)}throw T.openingCommentDoesNotFollowLink(r.open)}),o.push(...s.reverse()),o.reverse()},Z=(e,n)=>{n??(n=O.md(e));const t=_e(n),s=k(n,"link").filter(Re),o=k(n,"html").sort(v),r=o.filter(J("begin")),i=o.filter(J("end")),c=Le(r,i);return Be(e,s,c).map(a=>Array.isArray(a)?De(a[0],a[1].close,t(a[0])):Ae(a,t(a)))},Fe=(e,{url:n})=>t=>e(h.join(h.dirname(n),t)),K=(...e)=>{const n=e.reduce((t,s)=>t+s,0);return Math.min(Math.max(n,1),6)},Ue=(e,n,t)=>{if(n===0)return e;t??(t=O.md(e));const s=k(t,"heading"),o=e.split(`
|
|
12
|
+
`);for(const r of s){const{depth:i,position:{start:c,end:l}}=r,a=K(i,n),p=o[c.line-1].slice(i,l.column),m="#".repeat(a)+p;o[c.line-1]=m,r.depth=a}return o.join(`
|
|
13
|
+
`)},Y=e=>Z(e).reverse().sort(v.reverse).reduce((n,t)=>W(n,X(t),t),e),ee=(e,n,t,s,o)=>{try{e=Y(e),e=Ue(e,n);const r=O.md(e);return Z(e,r).sort(v).reverse().map(i=>{var oe,re;const{url:c,headingDepth:l}=i,[a,...p]=h.basename(c).split("?"),m=a.split(".").pop()??"",b=p.join("?"),C=h.dirname(c),se=h.join(C,a);if(c.startsWith("./")||c.startsWith("../")){let g=t(se);const y=new ce.URLSearchParams(b),P=(oe=y.get("region"))==null?void 0:oe.split(_);g=(P==null?void 0:P.reduce((S,E,D,{length:Xe})=>qe(S,E,D===Xe-1),g))??g;const Qe=y.has("skip"),ze=y.get("heading")??0,Ve=y.has("inline");let{inline:R}=i;if(Ve&&(R=!0),!Qe)if(m==="md"){const S=Fe(t,i),E=o?h.join(o,C):C,D=K(l,Number(ze));g=ee(g,D,S,se,E)}else/^(js|ts)x?|svelte$/i.test(m)&&(g=Q(g,"code",{extension:m,inline:R}));const A=(re=y.get("wrap"))==null?void 0:re.split(_);return g=(A==null?void 0:A.reduce((S,E)=>Q(S,E,{extension:m,inline:R}),g))??g,{target:i,content:We(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})=>W(i,l,c),e)}catch(r){throw new Error(`Error populating inclusions in file ${s??"(unknown)"}: ${r}`)}},ne=e=>d.readFileSync(e,"utf-8"),te=e=>{const n=h.resolve(e),t=h.dirname(n);return{markdown:ne(n),dir:t,path:n}},Ge=(e,n=!0)=>{const{dir:t,path:s,markdown:o}=te(e),i=ee(o,0,c=>ne(h.resolve(t,ge(c))),s);return n&&d.writeFileSync(s,i),i},He=(e,n=!0)=>{const{path:t,markdown:s}=te(e),o=Y(s);return n&&d.writeFileSync(t,o),o};u.depopulateMarkdownInclusions=He,u.populateMarkdownInclusions=Ge,Object.defineProperty(u,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.
|
|
5
|
+
"version": "0.0.8",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"bin": "./dist/cli.js",
|
|
8
8
|
"files": [
|
|
@@ -24,10 +24,7 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@commander-js/extra-typings": "^13.1.0",
|
|
27
|
-
"@flex-development/import-regex": "^3.0.0",
|
|
28
|
-
"extract-comments": "^1.1.0",
|
|
29
27
|
"remark-parse": "^11.0.0",
|
|
30
|
-
"stable-hash": "^0.0.4",
|
|
31
28
|
"ts-dedent": "^2.2.0",
|
|
32
29
|
"unified": "^11.0.5",
|
|
33
30
|
"unist-util-visit": "^5.0.0"
|