@vielzeug/scribe 0.0.0-stage → 26.11.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +38 -2
  3. package/dist/_dev.cjs +2 -0
  4. package/dist/_dev.cjs.map +1 -0
  5. package/dist/_dev.d.ts +2 -0
  6. package/dist/_dev.d.ts.map +1 -0
  7. package/dist/_dev.js +5 -0
  8. package/dist/_dev.js.map +1 -0
  9. package/dist/_policy.cjs +2 -0
  10. package/dist/_policy.cjs.map +1 -0
  11. package/dist/_policy.d.ts +25 -0
  12. package/dist/_policy.d.ts.map +1 -0
  13. package/dist/_policy.js +42 -0
  14. package/dist/_policy.js.map +1 -0
  15. package/dist/_text.cjs +2 -0
  16. package/dist/_text.cjs.map +1 -0
  17. package/dist/_text.d.ts +20 -0
  18. package/dist/_text.d.ts.map +1 -0
  19. package/dist/_text.js +52 -0
  20. package/dist/_text.js.map +1 -0
  21. package/dist/errors.cjs +2 -0
  22. package/dist/errors.cjs.map +1 -0
  23. package/dist/errors.d.ts +8 -0
  24. package/dist/errors.d.ts.map +1 -0
  25. package/dist/errors.js +9 -0
  26. package/dist/errors.js.map +1 -0
  27. package/dist/index.cjs +1 -0
  28. package/dist/index.d.ts +5 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +4 -0
  31. package/dist/parse.cjs +10 -0
  32. package/dist/parse.cjs.map +1 -0
  33. package/dist/parse.d.ts +23 -0
  34. package/dist/parse.d.ts.map +1 -0
  35. package/dist/parse.js +420 -0
  36. package/dist/parse.js.map +1 -0
  37. package/dist/render.cjs +16 -0
  38. package/dist/render.cjs.map +1 -0
  39. package/dist/render.d.ts +29 -0
  40. package/dist/render.d.ts.map +1 -0
  41. package/dist/render.js +199 -0
  42. package/dist/render.js.map +1 -0
  43. package/dist/scribe.cjs +24 -0
  44. package/dist/scribe.cjs.map +1 -0
  45. package/dist/scribe.iife.js +24 -0
  46. package/dist/scribe.iife.js.map +1 -0
  47. package/dist/scribe.js +702 -0
  48. package/dist/scribe.js.map +1 -0
  49. package/dist/types.d.ts +147 -0
  50. package/dist/types.d.ts.map +1 -0
  51. package/package.json +46 -4
package/dist/scribe.js ADDED
@@ -0,0 +1,702 @@
1
+ // src/errors.ts
2
+ var ScribeError = class extends Error {
3
+ constructor(e, t) {
4
+ super(e, t), this.name = new.target.name;
5
+ }
6
+ }, ScribeLimitError = class extends ScribeError {}, e = {
7
+ "'": "'",
8
+ "\"": """,
9
+ "&": "&",
10
+ "<": "&lt;",
11
+ ">": "&gt;"
12
+ };
13
+ function escapeHtml(t) {
14
+ return t.replace(/[&<>"']/g, (t) => e[t]);
15
+ }
16
+ function stripControls(e) {
17
+ let t = "";
18
+ for (let n of e) {
19
+ let e = n.codePointAt(0) ?? 0;
20
+ e <= 32 || e === 127 || (t += n);
21
+ }
22
+ return t;
23
+ }
24
+ function normalizeDestination(e) {
25
+ let t = stripControls(e);
26
+ for (let e = 0; e < 3; e += 1) {
27
+ let e = stripControls(t.replace(/&#(\d+|x[0-9a-fA-F]+);/g, (e, t) => {
28
+ let n = t.startsWith("x") || t.startsWith("X") ? Number.parseInt(t.slice(1), 16) : Number.parseInt(t, 10);
29
+ return Number.isFinite(n) && n >= 0 && n <= 1114111 ? String.fromCodePoint(n) : e;
30
+ }));
31
+ if (e === t) break;
32
+ t = e;
33
+ }
34
+ return t;
35
+ }
36
+ function sanitizeDestination(e, t) {
37
+ let n = normalizeDestination(e);
38
+ if (n === "") return null;
39
+ let r = n.search(/[/?#]/), i = n.indexOf(":");
40
+ if (i === -1 || r !== -1 && r < i) return n;
41
+ let a = n.slice(0, i).toLowerCase();
42
+ return a === "data" ? null : t.has(a) ? n : null;
43
+ }
44
+ // src/_text.ts
45
+ function createSlugger() {
46
+ let e = /* @__PURE__ */ new Map();
47
+ return { slug(t) {
48
+ let n = t.toLowerCase().normalize("NFKC").replace(/[^\p{L}\p{N}]+/gu, "-").replace(/^-+|-+$/g, "") || "section", r = e.get(n);
49
+ return r === void 0 ? (e.set(n, 1), n) : (e.set(n, r + 1), `${n}-${r + 1}`);
50
+ } };
51
+ }
52
+ function collectOutline(e, t, n) {
53
+ let r = [], walk = (e) => {
54
+ for (let i of e) switch (i.type) {
55
+ case "heading": {
56
+ let e = inlineText(i.children), a = t.slug(e);
57
+ i.level <= n && r.push({
58
+ id: a,
59
+ level: i.level,
60
+ text: e
61
+ });
62
+ break;
63
+ }
64
+ case "blockquote":
65
+ walk(i.children);
66
+ break;
67
+ case "list": for (let e of i.items) walk(e.children);
68
+ }
69
+ };
70
+ return walk(e), r;
71
+ }
72
+ function inlineText(e) {
73
+ let t = "";
74
+ for (let n of e) switch (n.type) {
75
+ case "text":
76
+ case "codeSpan":
77
+ t += n.text;
78
+ break;
79
+ case "softBreak":
80
+ case "hardBreak":
81
+ t += " ";
82
+ break;
83
+ case "image":
84
+ t += n.alt;
85
+ break;
86
+ case "strong":
87
+ case "emphasis":
88
+ case "strikethrough":
89
+ case "link": t += inlineText(n.children);
90
+ }
91
+ return t;
92
+ }
93
+ // src/parse.ts
94
+ var t = 2e5, n = 32, r = [
95
+ "http",
96
+ "https",
97
+ "mailto"
98
+ ], i = /^[ \t]*$/, a = /^ {0,3}(`{3,}|~{3,})(.*)$/, o = /^ {0,3}(#{1,6})(?:[ \t]+(.*?))?(?:[ \t]+#+)?[ \t]*$/, s = /^(?: {0,3}(?:\*[ \t]*){3,}| {0,3}(?:-[ \t]*){3,}| {0,3}(?:_[ \t]*){3,})$/, c = /^ {0,3}>[ \t]?(.*)$/, l = /^( {0,3})([-+*])([ \t]+)(.*)$/, u = /^( {0,3})(\d{1,9})([.)])([ \t]+)(.*)$/, d = /^[ \t]*\|?[ \t]*:?-+:?[ \t]*(?:\|[ \t]*:?-+:?[ \t]*)*\|?[ \t]*$/, f = /^[\p{L}\p{N}_-]+/u;
99
+ function indentOf(e) {
100
+ let t = 0;
101
+ for (let n of e) if (n === " ") t += 1;
102
+ else if (n === " ") t += 4;
103
+ else break;
104
+ return t;
105
+ }
106
+ function isTableStart(e, t) {
107
+ return e[t].includes("|") && e[t + 1] !== void 0 && d.test(e[t + 1]);
108
+ }
109
+ function splitCells(e) {
110
+ let t = e.trim();
111
+ t.startsWith("|") && (t = t.slice(1)), t.endsWith("|") && !t.endsWith("\\|") && (t = t.slice(0, -1));
112
+ let n = [], r = "";
113
+ for (let e = 0; e < t.length; e += 1) {
114
+ let i = t[e];
115
+ i === "\\" && t[e + 1] === "|" ? (r += "|", e += 1) : i === "|" ? (n.push(r.trim()), r = "") : r += i;
116
+ }
117
+ return n.push(r.trim()), n;
118
+ }
119
+ function parseDelimAlignments(e) {
120
+ return splitCells(e).map((e) => e.startsWith(":") && e.endsWith(":") ? "center" : e.endsWith(":") ? "right" : "left");
121
+ }
122
+ function parseBlocks(e, t) {
123
+ if (t.depth += 1, t.depth > n) throw new ScribeLimitError(`block nesting exceeds the ${n}-level limit`);
124
+ let r = [], l = [], u = 0, flushParagraph = () => {
125
+ if (l.length === 0) return;
126
+ let e = {
127
+ children: parseInline(l.join("\n"), t),
128
+ type: "paragraph"
129
+ };
130
+ r.push(e), l = [];
131
+ };
132
+ for (; u < e.length;) {
133
+ let n = e[u];
134
+ if (i.test(n)) {
135
+ flushParagraph(), u += 1;
136
+ continue;
137
+ }
138
+ let d = a.exec(n);
139
+ if (d) {
140
+ flushParagraph();
141
+ let t = d[1], n = d[0].indexOf(t[0]), i = f.exec(d[2].trim())?.[0], a = RegExp(`^ {0,3}\\${t[0]}{${t.length},}[ \\t]*$`), o = [];
142
+ for (u += 1; u < e.length && !a.test(e[u]);) o.push(e[u].slice(Math.min(indentOf(e[u]), n))), u += 1;
143
+ u += 1, r.push(i === void 0 ? {
144
+ text: o.join("\n"),
145
+ type: "codeBlock"
146
+ } : {
147
+ language: i,
148
+ text: o.join("\n"),
149
+ type: "codeBlock"
150
+ });
151
+ continue;
152
+ }
153
+ let p = o.exec(n);
154
+ if (p) {
155
+ flushParagraph(), r.push({
156
+ children: parseInline(p[2] ?? "", t),
157
+ level: p[1].length,
158
+ type: "heading"
159
+ }), u += 1;
160
+ continue;
161
+ }
162
+ if (s.test(n)) {
163
+ flushParagraph(), r.push({ type: "thematicBreak" }), u += 1;
164
+ continue;
165
+ }
166
+ if (c.test(n)) {
167
+ flushParagraph();
168
+ let n = [];
169
+ for (; u < e.length;) {
170
+ let t = c.exec(e[u]);
171
+ if (t === null) break;
172
+ n.push(t[1]), u += 1;
173
+ }
174
+ r.push({
175
+ children: parseBlocks(n, t),
176
+ type: "blockquote"
177
+ });
178
+ continue;
179
+ }
180
+ let m = matchListMarker(n);
181
+ if (m !== null && (!m.ordered || m.start === 1 || l.length === 0)) {
182
+ flushParagraph();
183
+ let n = parseList(e, u, t, m);
184
+ r.push(n.block), u = n.next;
185
+ } else if (l.length === 0 && indentOf(n) >= 4) {
186
+ let t = [];
187
+ for (; u < e.length && (i.test(e[u]) || indentOf(e[u]) >= 4) && (!i.test(e[u]) || u + 1 < e.length && indentOf(e[u + 1]) >= 4);) t.push(e[u].slice(4)), u += 1;
188
+ r.push({
189
+ text: t.join("\n"),
190
+ type: "codeBlock"
191
+ });
192
+ } else if (l.length === 0 && isTableStart(e, u)) {
193
+ let n = splitCells(e[u]), a = parseDelimAlignments(e[u + 1]);
194
+ u += 2;
195
+ let o = [];
196
+ for (; u < e.length && !i.test(e[u]) && e[u].includes("|");) {
197
+ let n = splitCells(e[u]);
198
+ for (; n.length < a.length;) n.push("");
199
+ o.push(n.slice(0, a.length).map((e) => [...parseInline(e, t)])), u += 1;
200
+ }
201
+ r.push({
202
+ alignments: a,
203
+ header: n.slice(0, a.length).map((e) => [...parseInline(e, t)]),
204
+ rows: o,
205
+ type: "table"
206
+ });
207
+ } else l.push(n), u += 1;
208
+ }
209
+ return flushParagraph(), --t.depth, r;
210
+ }
211
+ function matchListMarker(e) {
212
+ let t = l.exec(e);
213
+ if (t !== null) return {
214
+ indent: t[1].length,
215
+ kind: t[2],
216
+ ordered: !1,
217
+ spaces: t[3].length,
218
+ start: 1,
219
+ width: 1
220
+ };
221
+ let n = u.exec(e);
222
+ return n === null ? null : {
223
+ indent: n[1].length,
224
+ kind: n[3],
225
+ ordered: !0,
226
+ spaces: n[4].length,
227
+ start: Number(n[2]),
228
+ width: n[2].length + 1
229
+ };
230
+ }
231
+ function sameMarker(e, t) {
232
+ return e.ordered === t.ordered && e.kind === t.kind;
233
+ }
234
+ function parseList(e, t, n, r) {
235
+ let a = r.indent + r.width + (r.spaces >= 5 ? 1 : r.spaces), o = [], s = !1, c = 0, l = null, u = t;
236
+ for (; u < e.length;) {
237
+ let d = e[u];
238
+ if (i.test(d)) {
239
+ l !== null && (c += 1), u += 1;
240
+ continue;
241
+ }
242
+ let f = indentOf(d) < a ? matchListMarker(d) : null, p = f !== null && sameMarker(f, r) && (l === null || u > t);
243
+ if (p && l !== null && (c > 0 && (s = !0), o.push({
244
+ children: parseBlocks(l, n),
245
+ type: "listItem"
246
+ }), l = null), p) l = [d.slice(a)], c = 0, u += 1;
247
+ else if (l !== null && indentOf(d) >= a) c > 0 && (s = !0), c = 0, l.push(d.slice(a)), u += 1;
248
+ else break;
249
+ }
250
+ return l !== null && o.push({
251
+ children: parseBlocks(l, n),
252
+ type: "listItem"
253
+ }), {
254
+ block: {
255
+ items: o,
256
+ ordered: r.ordered,
257
+ start: r.start,
258
+ tight: !s,
259
+ type: "list"
260
+ },
261
+ next: u
262
+ };
263
+ }
264
+ var isDelim = (e) => "kind" in e, p = /[\p{P}\p{S}]/u;
265
+ function parseInline(e, t) {
266
+ if (t.depth += 1, t.depth > n) throw new ScribeLimitError(`inline nesting exceeds the ${n}-level limit`);
267
+ let r = [], i = "", flush = () => {
268
+ i !== "" && (r.push({
269
+ text: i,
270
+ type: "text"
271
+ }), i = "");
272
+ }, linkLike = (t) => {
273
+ if (e[t] !== "[") return null;
274
+ let n = 0, r = -1;
275
+ for (let i = t; i < e.length; i += 1) if (e[i] === "\\") i += 1;
276
+ else if (e[i] === "[") n += 1;
277
+ else if (e[i] === "]" && (--n, n === 0)) {
278
+ r = i;
279
+ break;
280
+ }
281
+ if (r === -1 || e[r + 1] !== "(") return null;
282
+ let i = r + 2, a = "", o;
283
+ if (e[i] === "<") {
284
+ let t = e.indexOf(">", i + 1);
285
+ if (t === -1) return null;
286
+ a = e.slice(i + 1, t), i = t + 1;
287
+ } else {
288
+ let t = 0;
289
+ for (; i < e.length && !/\s/.test(e[i]) && (e[i] !== ")" || t !== 0);) e[i] === "(" ? t += 1 : e[i] === ")" && --t, a += e[i], i += 1;
290
+ }
291
+ let s = /^\s+(['"])(.*?)\1\s*\)/.exec(e.slice(i));
292
+ if (s !== null) o = s[2], i += s[0].length;
293
+ else {
294
+ let t = /^\s*\)/.exec(e.slice(i));
295
+ if (t === null) return null;
296
+ i += t[0].length;
297
+ }
298
+ return {
299
+ dest: a,
300
+ end: i,
301
+ label: e.slice(t + 1, r),
302
+ title: o
303
+ };
304
+ }, a = 0;
305
+ for (; a < e.length;) {
306
+ let n = e[a];
307
+ if (n === "\\" && p.test(e[a + 1] ?? "")) i += e[a + 1], a += 2;
308
+ else if (n === "\\" && e[a + 1] === "\n") flush(), r.push({ type: "hardBreak" }), a += 2;
309
+ else if (n === "`") {
310
+ let t = 0;
311
+ for (; e[a + t] === "`";) t += 1;
312
+ let n = e.slice(a + t), o = RegExp(`(?<!\`)\`{${t}}(?!\`)`).exec(n);
313
+ if (o !== null) {
314
+ let e = n.slice(0, o.index);
315
+ e.length >= 2 && e.startsWith(" ") && e.endsWith(" ") && !/^ +$/.test(e) && (e = e.slice(1, -1)), flush(), r.push({
316
+ text: e,
317
+ type: "codeSpan"
318
+ }), a += t + o.index + t;
319
+ continue;
320
+ }
321
+ i += "`".repeat(t), a += t;
322
+ } else if (n === "<") {
323
+ let n = /^<([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,})>/.exec(e.slice(a));
324
+ if (n !== null) {
325
+ let e = `mailto:${n[1]}`;
326
+ if (sanitizeDestination(e, t.protocols) !== null) {
327
+ flush(), r.push({
328
+ children: [{
329
+ text: n[1],
330
+ type: "text"
331
+ }],
332
+ href: e,
333
+ type: "link"
334
+ }), a += n[0].length;
335
+ continue;
336
+ }
337
+ `${e}`;
338
+ }
339
+ let o = /^<([A-Za-z][A-Za-z0-9+.-]*:[^<>\n]*)>/.exec(e.slice(a));
340
+ if (o !== null) {
341
+ let e = sanitizeDestination(o[1], t.protocols);
342
+ if (e !== null) {
343
+ flush(), r.push({
344
+ children: [{
345
+ text: o[1],
346
+ type: "text"
347
+ }],
348
+ href: e,
349
+ type: "link"
350
+ }), a += o[0].length;
351
+ continue;
352
+ }
353
+ `${o[1]}`, i += "<", a += 1;
354
+ continue;
355
+ }
356
+ i += "<", a += 1;
357
+ } else if (n === "!" && e[a + 1] === "[" || n === "[") {
358
+ let e = linkLike(n === "!" ? a + 1 : a);
359
+ if (e !== null) {
360
+ let i = sanitizeDestination(e.dest, t.protocols);
361
+ if (flush(), i !== null) {
362
+ if (n === "!") {
363
+ let n = {
364
+ alt: inlineText(parseInline(e.label, t)),
365
+ src: i,
366
+ type: "image"
367
+ };
368
+ r.push(e.title === void 0 ? n : {
369
+ ...n,
370
+ title: e.title
371
+ });
372
+ } else {
373
+ let n = {
374
+ children: parseInline(e.label, t),
375
+ href: i,
376
+ type: "link"
377
+ };
378
+ r.push(e.title === void 0 ? n : {
379
+ ...n,
380
+ title: e.title
381
+ });
382
+ }
383
+ } else `${e.dest}`, n === "!" ? r.push({
384
+ text: inlineText(parseInline(e.label, t)),
385
+ type: "text"
386
+ }) : r.push(...parseInline(e.label, t));
387
+ a = e.end;
388
+ continue;
389
+ }
390
+ i += n, a += 1;
391
+ } else if (n === "*" || n === "_" || n === "~") {
392
+ let t = 0;
393
+ for (; e[a + t] === n;) t += 1;
394
+ if (n !== "~" || t === 2) {
395
+ let i = a === 0 ? " " : e[a - 1], o = e[a + t] ?? " ", s = !/\s/.test(o) && (!p.test(o) || /\s/.test(i) || p.test(i)), c = !/\s/.test(i) && (!p.test(i) || /\s/.test(o) || p.test(o)), l = n === "_" ? s && (!c || p.test(i)) : s, u = n === "_" ? c && (!s || p.test(o)) : c;
396
+ if (l || u) {
397
+ flush(), r.push({
398
+ canClose: u,
399
+ canOpen: l,
400
+ char: n,
401
+ count: t,
402
+ kind: "delim"
403
+ }), a += t;
404
+ continue;
405
+ }
406
+ }
407
+ i += n.repeat(t), a += t;
408
+ } else {
409
+ if ((n === "h" || n === "H") && (a === 0 || /[\s_([{]/.test(e[a - 1]))) {
410
+ let n = /^https?:\/\/\S+/.exec(e.slice(a));
411
+ if (n !== null) {
412
+ let e = n[0].replace(/[.,;:!?]+$/, "");
413
+ e.endsWith(")") && !e.includes("(") && (e = e.slice(0, -1));
414
+ let i = sanitizeDestination(e, t.protocols);
415
+ if (i !== null) {
416
+ flush(), r.push({
417
+ children: [{
418
+ text: e,
419
+ type: "text"
420
+ }],
421
+ href: i,
422
+ type: "link"
423
+ }), a += e.length;
424
+ continue;
425
+ }
426
+ }
427
+ }
428
+ if (n === "\n") {
429
+ let e = /[ \t]*$/.exec(i)?.[0] ?? "";
430
+ e !== "" && (i = i.slice(0, -e.length)), flush(), r.push(e.length >= 2 ? { type: "hardBreak" } : { type: "softBreak" }), a += 1;
431
+ } else i += n, a += 1;
432
+ }
433
+ }
434
+ flush();
435
+ let o = resolveEmphasis(r);
436
+ return --t.depth, mergeText(o);
437
+ }
438
+ function resolveEmphasis(e) {
439
+ for (let t = 0; t < e.length; t += 1) {
440
+ let n = e[t];
441
+ if (isDelim(n) && n.canClose && n.count !== 0) for (let r = t - 1; r >= 0; --r) {
442
+ let i = e[r];
443
+ if (!isDelim(i) || !i.canOpen || i.count === 0 || i.char !== n.char || n.char === "~" && (i.count !== 2 || n.count !== 2)) continue;
444
+ let a = n.char !== "~" && i.count >= 2 && n.count >= 2, o = n.char === "~" || a ? 2 : 1, s = resolveRemainder(e.slice(r + 1, t)), c = a ? {
445
+ children: s,
446
+ type: "strong"
447
+ } : n.char === "~" ? {
448
+ children: s,
449
+ type: "strikethrough"
450
+ } : {
451
+ children: s,
452
+ type: "emphasis"
453
+ }, l = [];
454
+ i.count > o && l.push({
455
+ canClose: !1,
456
+ canOpen: !0,
457
+ char: i.char,
458
+ count: i.count - o,
459
+ kind: "delim"
460
+ }), l.push(c), n.count > o && l.push({
461
+ canClose: !0,
462
+ canOpen: !1,
463
+ char: n.char,
464
+ count: n.count - o,
465
+ kind: "delim"
466
+ }), e.splice(r, t - r + 1, ...l), t = r - 1;
467
+ break;
468
+ }
469
+ }
470
+ return resolveRemainder(e);
471
+ }
472
+ function resolveRemainder(e) {
473
+ let t = [];
474
+ for (let n of e) isDelim(n) ? n.count > 0 && t.push({
475
+ text: n.char.repeat(n.count),
476
+ type: "text"
477
+ }) : t.push(n);
478
+ return mergeText(t);
479
+ }
480
+ function mergeText(e) {
481
+ let t = [];
482
+ for (let n of e) {
483
+ let e = t[t.length - 1];
484
+ n.type === "text" && e !== void 0 && e.type === "text" ? t[t.length - 1] = {
485
+ text: e.text + n.text,
486
+ type: "text"
487
+ } : t.push(n);
488
+ }
489
+ return t;
490
+ }
491
+ function deepFreeze(e) {
492
+ if (typeof e == "object" && e) {
493
+ for (let t of Object.values(e)) deepFreeze(t);
494
+ Object.freeze(e);
495
+ }
496
+ return e;
497
+ }
498
+ function parseProse(e, n = {}) {
499
+ if (e.length > t) throw new ScribeLimitError(`input exceeds the ${t}-character limit`);
500
+ let i = {
501
+ depth: 0,
502
+ protocols: new Set((n.linkProtocols ?? r).map((e) => e.toLowerCase()))
503
+ };
504
+ return deepFreeze({ blocks: parseBlocks(e.replace(/\r\n?/g, "\n").replaceAll(" ", " ").split("\n"), i) });
505
+ }
506
+ // src/render.ts
507
+ function titleAttr(e) {
508
+ return e === void 0 ? "" : ` title="${escapeHtml(e)}"`;
509
+ }
510
+ function inlineHtml(e) {
511
+ let t = "";
512
+ for (let n of e) switch (n.type) {
513
+ case "text":
514
+ t += escapeHtml(n.text);
515
+ break;
516
+ case "codeSpan":
517
+ t += `<code>${escapeHtml(n.text)}</code>`;
518
+ break;
519
+ case "strong":
520
+ t += `<strong>${inlineHtml(n.children)}</strong>`;
521
+ break;
522
+ case "emphasis":
523
+ t += `<em>${inlineHtml(n.children)}</em>`;
524
+ break;
525
+ case "strikethrough":
526
+ t += `<del>${inlineHtml(n.children)}</del>`;
527
+ break;
528
+ case "link":
529
+ t += `<a href="${escapeHtml(n.href)}"${titleAttr(n.title)}>${inlineHtml(n.children)}</a>`;
530
+ break;
531
+ case "image":
532
+ t += `<img src="${escapeHtml(n.src)}" alt="${escapeHtml(n.alt)}"${titleAttr(n.title)}>`;
533
+ break;
534
+ case "softBreak":
535
+ t += "\n";
536
+ break;
537
+ case "hardBreak": t += "<br />\n";
538
+ }
539
+ return t;
540
+ }
541
+ function headingAttrs(e, t, n) {
542
+ return n ? ` id="${t.slug(inlineText(e))}"` : "";
543
+ }
544
+ function blocksHtml(e, t, n, r) {
545
+ let i = [];
546
+ for (let a of e) switch (a.type) {
547
+ case "paragraph": {
548
+ let e = inlineHtml(a.children);
549
+ i.push(r ? e : `<p>${e}</p>`);
550
+ break;
551
+ }
552
+ case "heading": {
553
+ let e = a.level;
554
+ i.push(`<h${e}${headingAttrs(a.children, t, n)}>${inlineHtml(a.children)}</h${e}>`);
555
+ break;
556
+ }
557
+ case "codeBlock": {
558
+ let e = a.language === void 0 ? "" : ` class="language-${escapeHtml(a.language)}"`;
559
+ i.push(`<pre><code${e}>${escapeHtml(a.text)}\n</code></pre>`);
560
+ break;
561
+ }
562
+ case "blockquote":
563
+ i.push(`<blockquote>\n${blocksHtml(a.children, t, n, !1)}\n</blockquote>`);
564
+ break;
565
+ case "list": {
566
+ let e = a.ordered ? "ol" : "ul", r = a.ordered && a.start !== 1 ? ` start="${a.start}"` : "", o = a.items.map((e) => `<li>${blocksHtml(e.children, t, n, a.tight)}</li>`).join("\n");
567
+ i.push(`<${e}${r}>\n${o}\n</${e}>`);
568
+ break;
569
+ }
570
+ case "thematicBreak":
571
+ i.push("<hr />");
572
+ break;
573
+ case "table": {
574
+ let cellAttrs = (e) => {
575
+ let t = a.alignments[e];
576
+ return t === void 0 || t === "left" ? "" : ` align="${t}"`;
577
+ }, e = `<tr>${a.header.map((e, t) => `<th${cellAttrs(t)}>${inlineHtml(e)}</th>`).join("")}</tr>`, t = a.rows.map((e) => `<tr>${e.map((e, t) => `<td${cellAttrs(t)}>${inlineHtml(e)}</td>`).join("")}</tr>`).join("\n");
578
+ i.push(`<table>\n<thead>\n${e}\n</thead>\n<tbody>\n${t.length === 0 ? "" : `${t}\n`}</tbody>\n</table>`);
579
+ break;
580
+ }
581
+ }
582
+ return i.join("\n");
583
+ }
584
+ function renderProseHtml(e, t = {}) {
585
+ return blocksHtml(e.blocks, createSlugger(), t.headingIds === !0, !1);
586
+ }
587
+ function inlineDom(e, t) {
588
+ let n = [];
589
+ for (let r of t) switch (r.type) {
590
+ case "text":
591
+ n.push(e.createTextNode(r.text));
592
+ break;
593
+ case "codeSpan": {
594
+ let t = e.createElement("code");
595
+ t.append(e.createTextNode(r.text)), n.push(t);
596
+ break;
597
+ }
598
+ case "strong":
599
+ case "emphasis":
600
+ case "strikethrough": {
601
+ let t = e.createElement(r.type === "strikethrough" ? "del" : r.type === "strong" ? "strong" : "em");
602
+ t.append(...inlineDom(e, r.children)), n.push(t);
603
+ break;
604
+ }
605
+ case "link": {
606
+ let t = e.createElement("a");
607
+ t.setAttribute("href", r.href), r.title !== void 0 && t.setAttribute("title", r.title), t.append(...inlineDom(e, r.children)), n.push(t);
608
+ break;
609
+ }
610
+ case "image": {
611
+ let t = e.createElement("img");
612
+ t.setAttribute("src", r.src), t.setAttribute("alt", r.alt), r.title !== void 0 && t.setAttribute("title", r.title), n.push(t);
613
+ break;
614
+ }
615
+ case "softBreak":
616
+ n.push(e.createTextNode("\n"));
617
+ break;
618
+ case "hardBreak": n.push(e.createElement("br"));
619
+ }
620
+ return n;
621
+ }
622
+ function blocksDom(e, t, n, r, i) {
623
+ let a = e.createDocumentFragment();
624
+ for (let o of t) switch (o.type) {
625
+ case "paragraph":
626
+ if (i) a.append(...inlineDom(e, o.children));
627
+ else {
628
+ let t = e.createElement("p");
629
+ t.append(...inlineDom(e, o.children)), a.append(t);
630
+ }
631
+ break;
632
+ case "heading": {
633
+ let t = e.createElement(`h${o.level}`);
634
+ r && t.setAttribute("id", n.slug(inlineText(o.children))), t.append(...inlineDom(e, o.children)), a.append(t);
635
+ break;
636
+ }
637
+ case "codeBlock": {
638
+ let t = e.createElement("pre"), n = e.createElement("code");
639
+ o.language !== void 0 && n.classList.add(`language-${o.language}`), n.append(e.createTextNode(o.text)), t.append(n), a.append(t);
640
+ break;
641
+ }
642
+ case "blockquote": {
643
+ let t = e.createElement("blockquote");
644
+ t.append(blocksDom(e, o.children, n, r, !1)), a.append(t);
645
+ break;
646
+ }
647
+ case "list": {
648
+ let t = e.createElement(o.ordered ? "ol" : "ul");
649
+ o.ordered && o.start !== 1 && t.setAttribute("start", String(o.start));
650
+ for (let i of o.items) {
651
+ let a = e.createElement("li");
652
+ a.append(blocksDom(e, i.children, n, r, o.tight)), t.append(a);
653
+ }
654
+ a.append(t);
655
+ break;
656
+ }
657
+ case "thematicBreak":
658
+ a.append(e.createElement("hr"));
659
+ break;
660
+ case "table": {
661
+ let t = e.createElement("table"), n = e.createElement("thead"), r = e.createElement("tr");
662
+ o.header.forEach((t, n) => {
663
+ let i = e.createElement("th"), a = o.alignments[n];
664
+ a !== void 0 && a !== "left" && i.setAttribute("align", a), i.append(...inlineDom(e, t)), r.append(i);
665
+ }), n.append(r);
666
+ let i = e.createElement("tbody");
667
+ for (let t of o.rows) {
668
+ let n = e.createElement("tr");
669
+ t.forEach((t, r) => {
670
+ let i = e.createElement("td"), a = o.alignments[r];
671
+ a !== void 0 && a !== "left" && i.setAttribute("align", a), i.append(...inlineDom(e, t)), n.append(i);
672
+ }), i.append(n);
673
+ }
674
+ t.append(n, i), a.append(t);
675
+ break;
676
+ }
677
+ }
678
+ return a;
679
+ }
680
+ function renderProseDom(e, t = {}) {
681
+ return blocksDom(document, e.blocks, createSlugger(), t.headingIds === !0, !1);
682
+ }
683
+ function blockText(e) {
684
+ switch (e.type) {
685
+ case "paragraph": return inlineText(e.children);
686
+ case "heading": return inlineText(e.children);
687
+ case "codeBlock": return e.text;
688
+ case "blockquote": return e.children.map(blockText).join("\n\n");
689
+ case "list": return e.items.map((t, n) => (e.ordered ? `${e.start + n}. ` : "- ") + t.children.map(blockText).join("\n\n")).join("\n");
690
+ case "thematicBreak": return "";
691
+ case "table": return [e.header, ...e.rows].map((e) => e.map((e) => inlineText(e)).join(" | ")).join("\n");
692
+ }
693
+ }
694
+ function proseToText(e) {
695
+ return e.blocks.map(blockText).filter((e) => e !== "").join("\n\n");
696
+ }
697
+ function proseOutline(e, t = {}) {
698
+ return collectOutline(e.blocks, createSlugger(), t.maxLevel ?? 6);
699
+ }
700
+ export { ScribeError, ScribeLimitError, parseProse, proseOutline, proseToText, renderProseDom, renderProseHtml };
701
+
702
+ //# sourceMappingURL=scribe.js.map