@refinex-md/model 0.1.0-canary.0

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/index.js ADDED
@@ -0,0 +1,1046 @@
1
+ import { Schema as z, Node as F, Fragment as M } from "prosemirror-model";
2
+ import { PluginKey as U, Plugin as K } from "prosemirror-state";
3
+ import { tableNodes as j } from "prosemirror-tables";
4
+ const b = {
5
+ blockId: { default: null },
6
+ metadata: { default: null },
7
+ permissions: { default: null }
8
+ }, H = ["doc:read", "doc:write"];
9
+ function g(e, t, r = {}) {
10
+ const a = r.blockId ?? "forbidden";
11
+ return {
12
+ kind: "node",
13
+ name: e,
14
+ version: "1.0.0",
15
+ spec: { ...t, refinexBlockId: a },
16
+ blockId: a,
17
+ capabilities: H,
18
+ fallback: r.fallback ?? "paragraph",
19
+ markdown: r.markdown ? { format: r.markdown } : void 0
20
+ };
21
+ }
22
+ const it = [
23
+ "image_block",
24
+ "callout",
25
+ "task_list",
26
+ "task_item",
27
+ "toggle_list",
28
+ "toggle_item",
29
+ "embed_block",
30
+ "divider",
31
+ "table",
32
+ "table_row",
33
+ "table_cell",
34
+ "table_header",
35
+ "math_inline",
36
+ "math_block"
37
+ ];
38
+ function J() {
39
+ const e = j({
40
+ tableGroup: "block",
41
+ cellContent: "block+",
42
+ cellAttributes: {
43
+ align: {
44
+ default: null,
45
+ getFromDOM(t) {
46
+ const r = t.getAttribute("data-align") ?? t.style.textAlign;
47
+ return r === "left" || r === "center" || r === "right" ? r : null;
48
+ },
49
+ setDOMAttr(t, r) {
50
+ t && (r["data-align"] = t, r.style = `${String(r.style ?? "")} text-align: ${String(t)};`.trim());
51
+ }
52
+ },
53
+ background: {
54
+ default: null,
55
+ getFromDOM(t) {
56
+ return t.getAttribute("data-background") ?? t.style.backgroundColor ?? null;
57
+ },
58
+ setDOMAttr(t, r) {
59
+ t && (r["data-background"] = t, r.style = `${String(r.style ?? "")} background-color: ${String(t)};`.trim());
60
+ }
61
+ },
62
+ metadata: {
63
+ default: null,
64
+ getFromDOM() {
65
+ return null;
66
+ },
67
+ setDOMAttr() {
68
+ }
69
+ },
70
+ colwidth: {
71
+ default: null,
72
+ getFromDOM(t) {
73
+ const r = t.getAttribute("data-colwidth"), a = r ? Number.parseInt(r, 10) : Number.NaN;
74
+ return Number.isFinite(a) && a > 0 ? [a] : null;
75
+ },
76
+ setDOMAttr(t, r) {
77
+ if (!Array.isArray(t)) return;
78
+ const a = Number(t[0]);
79
+ !Number.isFinite(a) || a <= 0 || (r["data-colwidth"] = String(a), r.style = `${String(r.style ?? "")} width: ${String(a)}px; min-width: ${String(a)}px;`.trim());
80
+ }
81
+ }
82
+ }
83
+ });
84
+ return [
85
+ g(
86
+ "image_block",
87
+ {
88
+ group: "block",
89
+ content: "inline*",
90
+ attrs: {
91
+ src: {},
92
+ alt: { default: null },
93
+ title: { default: null },
94
+ align: { default: "center" },
95
+ widthPercent: { default: 100 },
96
+ aspectRatio: { default: null },
97
+ status: { default: "ready" },
98
+ ...b
99
+ },
100
+ selectable: !0,
101
+ draggable: !0,
102
+ defining: !0,
103
+ isolating: !0,
104
+ parseDOM: [
105
+ {
106
+ tag: "figure[data-rmd-image-block]",
107
+ getAttrs(t) {
108
+ const r = t, a = r.querySelector("img");
109
+ return {
110
+ src: (a == null ? void 0 : a.getAttribute("src")) ?? "",
111
+ alt: a == null ? void 0 : a.getAttribute("alt"),
112
+ title: a == null ? void 0 : a.getAttribute("title"),
113
+ align: _(r.getAttribute("data-align")),
114
+ widthPercent: N(r.getAttribute("data-width")),
115
+ aspectRatio: r.getAttribute("data-aspect-ratio"),
116
+ status: x(r.getAttribute("data-status"))
117
+ };
118
+ }
119
+ }
120
+ ],
121
+ toDOM(t) {
122
+ const r = N(t.attrs.widthPercent);
123
+ return [
124
+ "figure",
125
+ {
126
+ "data-rmd-image-block": "true",
127
+ "data-align": _(t.attrs.align),
128
+ "data-width": String(r),
129
+ "data-status": x(t.attrs.status),
130
+ class: "rmd-image-block"
131
+ },
132
+ [
133
+ "img",
134
+ {
135
+ src: t.attrs.src,
136
+ alt: t.attrs.alt ?? "",
137
+ title: t.attrs.title,
138
+ style: `width: ${String(r)}%;`
139
+ }
140
+ ],
141
+ ["figcaption", 0]
142
+ ];
143
+ }
144
+ },
145
+ { blockId: "required", fallback: "paragraph", markdown: "rich-image-block" }
146
+ ),
147
+ g(
148
+ "callout",
149
+ {
150
+ group: "block",
151
+ content: "block+",
152
+ attrs: {
153
+ kind: { default: "note" },
154
+ title: { default: null },
155
+ icon: { default: null },
156
+ collapsed: { default: !1 },
157
+ ...b
158
+ },
159
+ selectable: !0,
160
+ draggable: !0,
161
+ defining: !0,
162
+ parseDOM: [
163
+ {
164
+ tag: "aside[data-rmd-callout]",
165
+ getAttrs(t) {
166
+ const r = t;
167
+ return {
168
+ kind: D(r.getAttribute("data-kind")),
169
+ title: r.getAttribute("data-title"),
170
+ icon: r.getAttribute("data-icon"),
171
+ collapsed: r.getAttribute("data-collapsed") === "true"
172
+ };
173
+ }
174
+ }
175
+ ],
176
+ toDOM(t) {
177
+ return [
178
+ "aside",
179
+ {
180
+ "data-rmd-callout": "true",
181
+ "data-kind": D(t.attrs.kind),
182
+ "data-title": t.attrs.title,
183
+ "data-icon": t.attrs.icon,
184
+ "data-collapsed": String(!!t.attrs.collapsed),
185
+ class: `rmd-callout rmd-callout-${D(t.attrs.kind)}`
186
+ },
187
+ 0
188
+ ];
189
+ }
190
+ },
191
+ { blockId: "required", fallback: "paragraph", markdown: "gfm-alert" }
192
+ ),
193
+ g(
194
+ "task_list",
195
+ {
196
+ group: "block",
197
+ content: "task_item+",
198
+ attrs: { metadata: { default: null } },
199
+ parseDOM: [{ tag: "ul[data-rmd-task-list]" }],
200
+ toDOM() {
201
+ return ["ul", { "data-rmd-task-list": "true", class: "rmd-task-list" }, 0];
202
+ }
203
+ },
204
+ { fallback: "paragraph", markdown: "gfm-task-list" }
205
+ ),
206
+ g(
207
+ "task_item",
208
+ {
209
+ content: "paragraph block*",
210
+ attrs: {
211
+ checked: { default: !1 },
212
+ ...b
213
+ },
214
+ defining: !0,
215
+ parseDOM: [
216
+ {
217
+ tag: "li[data-rmd-task-item]",
218
+ getAttrs(t) {
219
+ return { checked: t.getAttribute("data-checked") === "true" };
220
+ }
221
+ }
222
+ ],
223
+ toDOM(t) {
224
+ return [
225
+ "li",
226
+ {
227
+ "data-rmd-task-item": "true",
228
+ "data-checked": String(!!t.attrs.checked),
229
+ class: "rmd-task-item"
230
+ },
231
+ 0
232
+ ];
233
+ }
234
+ },
235
+ { blockId: "required", fallback: "paragraph", markdown: "gfm-task-list" }
236
+ ),
237
+ g(
238
+ "toggle_list",
239
+ {
240
+ group: "block",
241
+ content: "toggle_item+",
242
+ attrs: { metadata: { default: null } },
243
+ parseDOM: [{ tag: "ul[data-rmd-toggle-list]" }],
244
+ toDOM() {
245
+ return ["ul", { "data-rmd-toggle-list": "true", class: "rmd-toggle-list" }, 0];
246
+ }
247
+ },
248
+ { fallback: "paragraph", markdown: "refinex-toggle-list" }
249
+ ),
250
+ g(
251
+ "toggle_item",
252
+ {
253
+ content: "paragraph block*",
254
+ attrs: {
255
+ collapsed: { default: !1 },
256
+ ...b
257
+ },
258
+ selectable: !0,
259
+ draggable: !0,
260
+ defining: !0,
261
+ parseDOM: [
262
+ {
263
+ tag: "li[data-rmd-toggle-item]",
264
+ getAttrs(t) {
265
+ return {
266
+ collapsed: v(
267
+ t.getAttribute("data-collapsed")
268
+ )
269
+ };
270
+ }
271
+ }
272
+ ],
273
+ toDOM(t) {
274
+ const r = v(t.attrs.collapsed);
275
+ return [
276
+ "li",
277
+ {
278
+ "data-rmd-toggle-item": "true",
279
+ "data-collapsed": String(r),
280
+ class: "rmd-toggle-item"
281
+ },
282
+ 0
283
+ ];
284
+ }
285
+ },
286
+ { blockId: "required", fallback: "paragraph", markdown: "refinex-toggle-list" }
287
+ ),
288
+ g(
289
+ "embed_block",
290
+ {
291
+ group: "block",
292
+ atom: !0,
293
+ isolating: !0,
294
+ selectable: !0,
295
+ draggable: !0,
296
+ attrs: {
297
+ url: {},
298
+ provider: { default: null },
299
+ embedType: { default: "bookmark" },
300
+ title: { default: null },
301
+ description: { default: null },
302
+ thumbnail: { default: null },
303
+ html: { default: null },
304
+ aspectRatio: { default: null },
305
+ status: { default: "unresolved" },
306
+ error: { default: null },
307
+ ...b
308
+ },
309
+ parseDOM: [
310
+ {
311
+ tag: "a[data-rmd-embed-block]",
312
+ getAttrs(t) {
313
+ const r = t;
314
+ return {
315
+ url: r.getAttribute("href") ?? "",
316
+ title: r.getAttribute("data-title") ?? r.textContent,
317
+ provider: r.getAttribute("data-provider"),
318
+ embedType: S(r.getAttribute("data-embed-type")),
319
+ status: $(r.getAttribute("data-status"))
320
+ };
321
+ }
322
+ }
323
+ ],
324
+ toDOM(t) {
325
+ return [
326
+ "a",
327
+ {
328
+ "data-rmd-embed-block": "true",
329
+ href: t.attrs.url,
330
+ "data-provider": t.attrs.provider,
331
+ "data-embed-type": S(t.attrs.embedType),
332
+ "data-status": $(t.attrs.status),
333
+ class: "rmd-embed-block"
334
+ },
335
+ t.attrs.title ?? t.attrs.url
336
+ ];
337
+ }
338
+ },
339
+ { blockId: "required", fallback: "paragraph", markdown: "refinex-block" }
340
+ ),
341
+ g(
342
+ "divider",
343
+ {
344
+ group: "block",
345
+ attrs: {
346
+ variant: { default: "solid" },
347
+ ...b
348
+ },
349
+ selectable: !0,
350
+ draggable: !0,
351
+ parseDOM: [
352
+ {
353
+ tag: "hr[data-rmd-divider]",
354
+ getAttrs(t) {
355
+ return {
356
+ variant: O(t.getAttribute("data-variant"))
357
+ };
358
+ }
359
+ }
360
+ ],
361
+ toDOM(t) {
362
+ return [
363
+ "hr",
364
+ {
365
+ "data-rmd-divider": "true",
366
+ "data-variant": O(t.attrs.variant),
367
+ class: `rmd-divider rmd-divider-${O(t.attrs.variant)}`
368
+ }
369
+ ];
370
+ }
371
+ },
372
+ { blockId: "required", fallback: "paragraph", markdown: "thematic-break" }
373
+ ),
374
+ g(
375
+ "table",
376
+ {
377
+ ...e.table,
378
+ attrs: {
379
+ ...e.table.attrs ?? {},
380
+ columnWidths: { default: null },
381
+ layout: { default: "auto" },
382
+ caption: { default: null },
383
+ ...b
384
+ },
385
+ isolating: !0,
386
+ selectable: !0,
387
+ draggable: !0
388
+ },
389
+ { blockId: "required", fallback: "code_block", markdown: "gfm-table" }
390
+ ),
391
+ g("table_row", e.table_row, { fallback: "drop", markdown: "gfm-table" }),
392
+ g("table_cell", e.table_cell, { fallback: "paragraph", markdown: "gfm-table" }),
393
+ g("table_header", e.table_header, {
394
+ fallback: "paragraph",
395
+ markdown: "gfm-table"
396
+ }),
397
+ g(
398
+ "math_inline",
399
+ {
400
+ inline: !0,
401
+ group: "inline",
402
+ atom: !0,
403
+ selectable: !0,
404
+ attrs: {
405
+ tex: {},
406
+ metadata: { default: null }
407
+ },
408
+ parseDOM: [
409
+ {
410
+ tag: "span[data-rmd-math-inline]",
411
+ getAttrs(t) {
412
+ return { tex: t.getAttribute("data-tex") ?? "" };
413
+ }
414
+ }
415
+ ],
416
+ toDOM(t) {
417
+ return [
418
+ "span",
419
+ {
420
+ "data-rmd-math-inline": "true",
421
+ "data-tex": t.attrs.tex,
422
+ class: "rmd-math-inline"
423
+ },
424
+ t.attrs.tex
425
+ ];
426
+ }
427
+ },
428
+ { fallback: "paragraph", markdown: "remark-math" }
429
+ ),
430
+ g(
431
+ "math_block",
432
+ {
433
+ group: "block",
434
+ atom: !0,
435
+ isolating: !0,
436
+ selectable: !0,
437
+ draggable: !0,
438
+ attrs: {
439
+ tex: {},
440
+ numbered: { default: !1 },
441
+ label: { default: null },
442
+ align: { default: "center" },
443
+ ...b
444
+ },
445
+ parseDOM: [
446
+ {
447
+ tag: "div[data-rmd-math-block]",
448
+ getAttrs(t) {
449
+ const r = t;
450
+ return {
451
+ tex: r.getAttribute("data-tex") ?? r.textContent ?? "",
452
+ numbered: r.getAttribute("data-numbered") === "true",
453
+ label: r.getAttribute("data-label"),
454
+ align: r.getAttribute("data-align") === "left" ? "left" : "center"
455
+ };
456
+ }
457
+ }
458
+ ],
459
+ toDOM(t) {
460
+ return [
461
+ "div",
462
+ {
463
+ "data-rmd-math-block": "true",
464
+ "data-tex": t.attrs.tex,
465
+ "data-numbered": String(!!t.attrs.numbered),
466
+ "data-label": t.attrs.label,
467
+ "data-align": t.attrs.align === "left" ? "left" : "center",
468
+ class: "rmd-math-block"
469
+ },
470
+ t.attrs.tex
471
+ ];
472
+ }
473
+ },
474
+ { blockId: "required", fallback: "code_block", markdown: "remark-math" }
475
+ )
476
+ ];
477
+ }
478
+ const ut = J();
479
+ function _(e) {
480
+ return e === "left" || e === "right" ? e : "center";
481
+ }
482
+ function N(e) {
483
+ const t = Number(e ?? 100);
484
+ return Number.isFinite(t) ? Math.max(10, Math.min(100, Math.round(t))) : 100;
485
+ }
486
+ function x(e) {
487
+ return e === "empty" || e === "uploading" || e === "error" ? e : "ready";
488
+ }
489
+ function D(e) {
490
+ return e === "tip" || e === "important" || e === "warning" || e === "caution" ? e : e === "error" ? "caution" : "note";
491
+ }
492
+ function S(e) {
493
+ return e === "iframe" || e === "oembed" ? e : "bookmark";
494
+ }
495
+ function $(e) {
496
+ return e === "loading" || e === "ready" || e === "error" ? e : "unresolved";
497
+ }
498
+ function O(e) {
499
+ return e === "dashed" || e === "dotted" ? e : "solid";
500
+ }
501
+ function v(e) {
502
+ return e === !0 || e === "true";
503
+ }
504
+ const C = "1.0.0", W = "@refinex-md/base", B = "1.0.0", h = {
505
+ blockId: { default: null },
506
+ metadata: { default: null },
507
+ permissions: { default: null }
508
+ }, E = /* @__PURE__ */ new Set([
509
+ "paragraph",
510
+ "heading",
511
+ "blockquote",
512
+ "list_item",
513
+ "code_block",
514
+ "horizontal_rule"
515
+ ]), X = {
516
+ doc: { content: "block+" },
517
+ paragraph: {
518
+ attrs: h,
519
+ content: "inline*",
520
+ group: "block",
521
+ refinexBlockId: "required",
522
+ parseDOM: [{ tag: "p" }],
523
+ toDOM() {
524
+ return ["p", 0];
525
+ }
526
+ },
527
+ heading: {
528
+ attrs: { level: { default: 1 }, ...h },
529
+ content: "inline*",
530
+ group: "block",
531
+ defining: !0,
532
+ refinexBlockId: "required",
533
+ parseDOM: [
534
+ { tag: "h1", attrs: { level: 1 } },
535
+ { tag: "h2", attrs: { level: 2 } },
536
+ { tag: "h3", attrs: { level: 3 } },
537
+ { tag: "h4", attrs: { level: 4 } },
538
+ { tag: "h5", attrs: { level: 5 } },
539
+ { tag: "h6", attrs: { level: 6 } }
540
+ ],
541
+ toDOM(e) {
542
+ return [`h${String(e.attrs.level)}`, 0];
543
+ }
544
+ },
545
+ blockquote: {
546
+ attrs: h,
547
+ content: "block+",
548
+ group: "block",
549
+ defining: !0,
550
+ refinexBlockId: "required",
551
+ parseDOM: [{ tag: "blockquote" }],
552
+ toDOM() {
553
+ return ["blockquote", 0];
554
+ }
555
+ },
556
+ bullet_list: {
557
+ attrs: { metadata: { default: null } },
558
+ content: "list_item+",
559
+ group: "block",
560
+ parseDOM: [{ tag: "ul" }],
561
+ toDOM() {
562
+ return ["ul", 0];
563
+ }
564
+ },
565
+ ordered_list: {
566
+ attrs: { order: { default: 1 }, metadata: { default: null } },
567
+ content: "list_item+",
568
+ group: "block",
569
+ parseDOM: [{
570
+ tag: "ol",
571
+ getAttrs(e) {
572
+ const t = e;
573
+ return { order: t.hasAttribute("start") ? Number(t.getAttribute("start")) : 1 };
574
+ }
575
+ }],
576
+ toDOM(e) {
577
+ return e.attrs.order === 1 ? ["ol", 0] : ["ol", { start: e.attrs.order }, 0];
578
+ }
579
+ },
580
+ list_item: {
581
+ attrs: h,
582
+ content: "paragraph block*",
583
+ defining: !0,
584
+ refinexBlockId: "required",
585
+ parseDOM: [{ tag: "li" }],
586
+ toDOM() {
587
+ return ["li", 0];
588
+ }
589
+ },
590
+ code_block: {
591
+ attrs: {
592
+ language: { default: null },
593
+ lineNumbers: { default: !1 },
594
+ startLine: { default: 1 },
595
+ highlightLines: { default: null },
596
+ displayMode: { default: "source" },
597
+ wrap: { default: !1 },
598
+ ...h
599
+ },
600
+ content: "text*",
601
+ marks: "",
602
+ group: "block",
603
+ code: !0,
604
+ defining: !0,
605
+ refinexBlockId: "required",
606
+ parseDOM: [{ tag: "pre", preserveWhitespace: "full" }],
607
+ toDOM() {
608
+ return ["pre", ["code", 0]];
609
+ }
610
+ },
611
+ horizontal_rule: {
612
+ attrs: h,
613
+ group: "block",
614
+ refinexBlockId: "required",
615
+ parseDOM: [{ tag: "hr" }],
616
+ toDOM() {
617
+ return ["hr"];
618
+ }
619
+ },
620
+ image: {
621
+ attrs: {
622
+ src: {},
623
+ alt: { default: null },
624
+ title: { default: null },
625
+ metadata: { default: null },
626
+ permissions: { default: null }
627
+ },
628
+ inline: !0,
629
+ group: "inline",
630
+ draggable: !0,
631
+ parseDOM: [{
632
+ tag: "img[src]",
633
+ getAttrs(e) {
634
+ const t = e;
635
+ return {
636
+ src: t.getAttribute("src"),
637
+ alt: t.getAttribute("alt"),
638
+ title: t.getAttribute("title")
639
+ };
640
+ }
641
+ }],
642
+ toDOM(e) {
643
+ return ["img", e.attrs];
644
+ }
645
+ },
646
+ upload_placeholder: {
647
+ attrs: {
648
+ uploadId: {},
649
+ fileName: { default: null },
650
+ mimeType: { default: null },
651
+ previewSrc: { default: null },
652
+ progress: { default: 0 },
653
+ status: { default: "uploading" },
654
+ error: { default: null }
655
+ },
656
+ inline: !0,
657
+ group: "inline",
658
+ atom: !0,
659
+ selectable: !0,
660
+ parseDOM: [{
661
+ tag: "span[data-rmd-upload-placeholder]",
662
+ getAttrs(e) {
663
+ const t = e;
664
+ return {
665
+ uploadId: t.getAttribute("data-upload-id"),
666
+ fileName: t.getAttribute("data-file-name"),
667
+ mimeType: t.getAttribute("data-mime-type"),
668
+ previewSrc: t.getAttribute("data-preview-src"),
669
+ progress: Number(t.getAttribute("data-progress") ?? "0"),
670
+ status: t.getAttribute("data-status") ?? "uploading",
671
+ error: t.getAttribute("data-error")
672
+ };
673
+ }
674
+ }],
675
+ toDOM(e) {
676
+ const t = e.attrs, r = Math.max(0, Math.min(100, Number(t.progress ?? 0))), a = typeof t.previewSrc == "string" && t.previewSrc ? t.previewSrc : null, l = typeof t.fileName == "string" && t.fileName ? t.fileName : "文件", i = typeof t.status == "string" ? t.status : "uploading", o = typeof t.error == "string" && t.error ? t.error : "上传失败";
677
+ return [
678
+ "span",
679
+ {
680
+ "data-rmd-upload-placeholder": "true",
681
+ "data-upload-id": t.uploadId,
682
+ "data-file-name": l,
683
+ "data-mime-type": t.mimeType,
684
+ "data-preview-src": a,
685
+ "data-progress": String(r),
686
+ "data-status": i,
687
+ "data-error": i === "error" ? o : null,
688
+ class: "rmd-upload-placeholder"
689
+ },
690
+ ["span", { class: "rmd-upload-preview" }, a ? ["img", { src: a, alt: l }] : ""],
691
+ [
692
+ "span",
693
+ { class: "rmd-upload-body" },
694
+ ["span", { class: "rmd-upload-name" }, l],
695
+ [
696
+ "span",
697
+ { class: "rmd-upload-progress", role: "progressbar", "aria-valuemin": "0", "aria-valuemax": "100", "aria-valuenow": String(r) },
698
+ ["span", { class: "rmd-upload-progress-fill", style: `width: ${String(r)}%;` }]
699
+ ],
700
+ ["span", { class: "rmd-upload-error" }, o]
701
+ ],
702
+ ["button", { type: "button", "data-upload-action": "retry", class: "rmd-upload-action" }, "重试"],
703
+ ["button", { type: "button", "data-upload-action": "remove", class: "rmd-upload-action" }, "移除"]
704
+ ];
705
+ }
706
+ },
707
+ hard_break: {
708
+ inline: !0,
709
+ group: "inline",
710
+ selectable: !1,
711
+ parseDOM: [{ tag: "br" }],
712
+ toDOM() {
713
+ return ["br"];
714
+ }
715
+ },
716
+ text: {
717
+ group: "inline"
718
+ }
719
+ }, G = {
720
+ bold: {
721
+ parseDOM: [{ tag: "strong" }, { tag: "b" }, { style: "font-weight=bold" }],
722
+ toDOM() {
723
+ return ["strong", 0];
724
+ }
725
+ },
726
+ italic: {
727
+ parseDOM: [{ tag: "em" }, { tag: "i" }, { style: "font-style=italic" }],
728
+ toDOM() {
729
+ return ["em", 0];
730
+ }
731
+ },
732
+ code: {
733
+ parseDOM: [{ tag: "code" }],
734
+ toDOM() {
735
+ return ["code", 0];
736
+ }
737
+ },
738
+ link: {
739
+ attrs: {
740
+ href: {},
741
+ title: { default: null },
742
+ target: { default: null },
743
+ rel: { default: "noopener noreferrer" }
744
+ },
745
+ inclusive: !1,
746
+ parseDOM: [{
747
+ tag: "a[href]",
748
+ getAttrs(e) {
749
+ const t = e;
750
+ return {
751
+ href: t.getAttribute("href"),
752
+ title: t.getAttribute("title"),
753
+ target: t.getAttribute("target"),
754
+ rel: t.getAttribute("rel") || "noopener noreferrer"
755
+ };
756
+ }
757
+ }],
758
+ toDOM(e) {
759
+ return ["a", e.attrs, 0];
760
+ }
761
+ },
762
+ strikethrough: {
763
+ parseDOM: [{ tag: "s" }, { tag: "del" }],
764
+ toDOM() {
765
+ return ["s", 0];
766
+ }
767
+ },
768
+ underline: {
769
+ parseDOM: [{ tag: "u" }, { style: "text-decoration=underline" }],
770
+ toDOM() {
771
+ return ["u", 0];
772
+ }
773
+ },
774
+ text_color: {
775
+ attrs: {
776
+ color: { default: null }
777
+ },
778
+ parseDOM: [{
779
+ style: "color",
780
+ getAttrs(e) {
781
+ return typeof e != "string" || !e.trim() ? !1 : { color: e.trim() };
782
+ }
783
+ }],
784
+ toDOM(e) {
785
+ const t = e.attrs.color;
786
+ return typeof t != "string" || !t.trim() ? ["span", 0] : ["span", { style: `color: ${t}` }, 0];
787
+ }
788
+ },
789
+ text_background_color: {
790
+ attrs: {
791
+ backgroundColor: { default: null }
792
+ },
793
+ parseDOM: [{
794
+ style: "background-color",
795
+ getAttrs(e) {
796
+ return typeof e != "string" || !e.trim() ? !1 : { backgroundColor: e.trim() };
797
+ }
798
+ }],
799
+ toDOM(e) {
800
+ const t = e.attrs.backgroundColor;
801
+ return typeof t != "string" || !t.trim() ? ["span", 0] : ["span", { style: `background-color: ${t}` }, 0];
802
+ }
803
+ }
804
+ };
805
+ function dt(e, t, r = {}) {
806
+ return {
807
+ kind: "node",
808
+ name: e,
809
+ version: r.version ?? "1.0.0",
810
+ spec: { ...t, refinexBlockId: r.blockId },
811
+ placement: r.placement,
812
+ blockId: r.blockId ?? "forbidden",
813
+ capabilities: [...r.capabilities ?? []],
814
+ fallback: r.fallback ?? "paragraph",
815
+ markdown: r.markdown,
816
+ migration: r.migration
817
+ };
818
+ }
819
+ function ct(e, t, r = {}) {
820
+ return {
821
+ kind: "mark",
822
+ name: e,
823
+ version: r.version ?? "1.0.0",
824
+ spec: t,
825
+ placement: r.placement,
826
+ capabilities: [...r.capabilities ?? []],
827
+ fallback: r.fallback ?? "drop",
828
+ markdown: r.markdown,
829
+ migration: r.migration
830
+ };
831
+ }
832
+ function q(e = {}) {
833
+ const t = { ...X }, r = { ...G }, a = /* @__PURE__ */ new Set([...Object.keys(t), ...Object.keys(r)]);
834
+ for (const l of e.extensions ?? []) {
835
+ if (tt(l.name), a.has(l.name))
836
+ throw new Error(`Extension name "${l.name}" is reserved or already registered.`);
837
+ a.add(l.name), l.kind === "node" ? (et(l), t[l.name] = { ...l.spec, refinexBlockId: l.blockId }) : r[l.name] = l.spec;
838
+ }
839
+ return new z({ nodes: t, marks: r });
840
+ }
841
+ const Z = q(), gt = Z;
842
+ function T() {
843
+ var r;
844
+ const e = new Uint8Array(12);
845
+ return (r = globalThis.crypto) == null || r.getRandomValues(e), `blk_${Array.from(e, (a) => a.toString(36).padStart(2, "0")).join("").slice(0, 24)}`;
846
+ }
847
+ function R(e) {
848
+ return "spec" in e ? e.spec.refinexBlockId === "required" || E.has(e.name) : E.has(e.type);
849
+ }
850
+ function Q(e, t, r = {}) {
851
+ const a = r.createId ?? T, l = /* @__PURE__ */ new Set(), i = [];
852
+ let o = !1;
853
+ function c(n, m) {
854
+ if (n.isText) return n;
855
+ let s = n.attrs;
856
+ if (R(n.type)) {
857
+ const u = s.blockId;
858
+ typeof u != "string" || u.length === 0 ? (s = { ...s, blockId: a() }, o = !0, i.push(d("BLOCK_ID_MISSING", "warn", `${m}.attrs.blockId`, "Missing blockId was generated."))) : L(u) ? l.has(u) && (s = { ...s, blockId: a() }, o = !0, i.push(d("BLOCK_ID_DUPLICATE", "warn", `${m}.attrs.blockId`, "Duplicate blockId was replaced."))) : (s = { ...s, blockId: a() }, o = !0, i.push(d("BLOCK_ID_INVALID", "warn", `${m}.attrs.blockId`, "Invalid blockId was replaced."))), l.add(s.blockId);
859
+ } else if ("blockId" in s) {
860
+ const { blockId: u, ...I } = s;
861
+ s = I, o = !0, i.push(d("BLOCK_ID_FORBIDDEN", "warn", `${m}.attrs.blockId`, "Forbidden blockId was removed."));
862
+ }
863
+ const p = [];
864
+ n.forEach((u, I, V) => {
865
+ p.push(c(u, `${m}.content[${V}]`));
866
+ });
867
+ const f = p.length > 0 ? M.fromArray(p) : M.empty, k = p.length === n.childCount && p.every((u, I) => u.eq(n.child(I)));
868
+ return s === n.attrs && k ? n : n.type.create(s, f, n.marks);
869
+ }
870
+ return { doc: c(e, "$"), changed: o, issues: i };
871
+ }
872
+ const A = new U("refinexBlockId");
873
+ function mt(e = {}) {
874
+ return new K({
875
+ key: A,
876
+ appendTransaction(t, r, a) {
877
+ if (t.some((n) => n.getMeta(A)) || !t.some((n) => n.docChanged)) return null;
878
+ const l = e.createId ?? T, i = /* @__PURE__ */ new Set(), o = [];
879
+ if (a.doc.descendants((n, m) => {
880
+ if (!R(n.type)) return !0;
881
+ const s = n.attrs.blockId;
882
+ return typeof s != "string" || !L(s) || i.has(s) ? (o.push({ pos: m, attrs: { ...n.attrs, blockId: l() } }), !0) : (i.add(s), !0);
883
+ }), o.length === 0) return null;
884
+ const c = a.tr;
885
+ for (const n of o)
886
+ c.setNodeMarkup(n.pos, void 0, n.attrs);
887
+ return c.setMeta(A, !0), c;
888
+ }
889
+ });
890
+ }
891
+ function Y(e, t = {}) {
892
+ var a, l, i, o, c;
893
+ const r = e instanceof F ? e.toJSON() : e;
894
+ return {
895
+ refinexDocVersion: C,
896
+ schema: {
897
+ id: W,
898
+ version: ((a = t.schema) == null ? void 0 : a.version) ?? B,
899
+ extensions: ((l = t.schema) == null ? void 0 : l.extensions) ?? []
900
+ },
901
+ metadata: t.metadata ?? {},
902
+ permissions: {
903
+ policyVersion: "1.0",
904
+ defaultAccess: ((i = t.permissions) == null ? void 0 : i.defaultAccess) ?? "read-write",
905
+ blockOverrides: (o = t.permissions) == null ? void 0 : o.blockOverrides,
906
+ custom: (c = t.permissions) == null ? void 0 : c.custom
907
+ },
908
+ content: r
909
+ };
910
+ }
911
+ function ft(e, t) {
912
+ const r = [];
913
+ if (!y(e))
914
+ return {
915
+ ok: !1,
916
+ issues: [d("CONTENT_INVALID", "error", "$", "RefinexDoc must be an object.")]
917
+ };
918
+ const a = e;
919
+ if (a.refinexDocVersion !== C && r.push(d("DOC_VERSION_UNSUPPORTED", "error", "$.refinexDocVersion", "Unsupported RefinexDoc version.")), (!y(a.schema) || a.schema.version !== B) && r.push(d("SCHEMA_VERSION_UNSUPPORTED", "error", "$.schema.version", "Unsupported schema version.")), (!y(a.content) || a.content.type !== "doc") && r.push(d("CONTENT_INVALID", "error", "$.content", "Content must be a ProseMirror doc JSON object.")), r.some((s) => s.severity === "error"))
920
+ return { ok: !1, issues: r };
921
+ const l = q({ extensions: t.extensions }), i = rt(a, t.extensions ?? []);
922
+ r.push(...i);
923
+ const o = P(a.content, l, "$.content", t.mode);
924
+ if (r.push(...o.issues), t.mode === "strict" && r.some((s) => s.severity === "error"))
925
+ return { ok: !1, issues: r };
926
+ let c;
927
+ try {
928
+ c = l.nodeFromJSON(o.node), c.check();
929
+ } catch (s) {
930
+ return {
931
+ ok: !1,
932
+ issues: [
933
+ ...r,
934
+ d("CONTENT_INVALID", "error", "$.content", s instanceof Error ? s.message : "Invalid content.")
935
+ ]
936
+ };
937
+ }
938
+ const n = Q(c, l, { createId: t.createId });
939
+ if (r.push(...n.issues), t.mode === "strict" && n.issues.length > 0)
940
+ return { ok: !1, issues: r };
941
+ const m = Y(n.doc, {
942
+ schema: a.schema,
943
+ metadata: a.metadata,
944
+ permissions: a.permissions
945
+ });
946
+ return t.mode === "repair" && (o.changed || n.changed) ? { ok: !0, normalized: m, issues: r } : { ok: r.every((s) => s.severity !== "error"), doc: m, issues: r };
947
+ }
948
+ function tt(e) {
949
+ if (!/^[a-z][a-z0-9_]*$/.test(e))
950
+ throw new Error(`Extension name "${e}" must use snake_case.`);
951
+ }
952
+ function et(e) {
953
+ var r, a;
954
+ if ((e.spec.inline === !0 || e.spec.group === "inline") && e.blockId === "required")
955
+ throw new Error(`Inline node "${e.name}" cannot require blockId.`);
956
+ if (e.blockId !== "required" && ((r = e.spec.attrs) != null && r.blockId))
957
+ throw new Error(`Node "${e.name}" declares blockId attr but does not require blockId.`);
958
+ if (e.blockId === "required" && !((a = e.spec.attrs) != null && a.blockId))
959
+ throw new Error(`Node "${e.name}" requires a blockId attr.`);
960
+ }
961
+ function L(e) {
962
+ return /^blk_[A-Za-z0-9_-]{8,36}$/.test(e);
963
+ }
964
+ function d(e, t, r, a) {
965
+ return { code: e, severity: t, path: r, message: a };
966
+ }
967
+ function y(e) {
968
+ return typeof e == "object" && e !== null && !Array.isArray(e);
969
+ }
970
+ function rt(e, t) {
971
+ const r = new Set(t.map((a) => a.name));
972
+ return e.schema.extensions.filter((a) => !r.has(a.name)).map((a, l) => d(
973
+ "EXTENSION_MISSING",
974
+ "error",
975
+ `$.schema.extensions[${l}]`,
976
+ `Missing schema extension "${a.name}".`
977
+ ));
978
+ }
979
+ function P(e, t, r, a) {
980
+ var s, p;
981
+ const l = [];
982
+ let i = !1;
983
+ if (!t.nodes[e.type])
984
+ return l.push(d("NODE_UNKNOWN", a === "repair" ? "warn" : "error", r, `Unknown node "${e.type}".`)), a === "repair" ? (l.push(d("FALLBACK_APPLIED", "info", r, `Unknown node "${e.type}" converted to paragraph.`)), {
985
+ node: {
986
+ type: "paragraph",
987
+ attrs: { blockId: null },
988
+ content: w(e).length > 0 ? [{ type: "text", text: w(e) }] : void 0
989
+ },
990
+ issues: l,
991
+ changed: !0
992
+ }) : { node: e, issues: l, changed: !1 };
993
+ const o = { ...e.attrs ?? {} };
994
+ e.type === "heading" && !at(o.level) && (l.push(d("ATTR_INVALID", a === "repair" ? "warn" : "error", `${r}.attrs.level`, "Heading level must be 1-6.")), a === "repair" && (o.level = 1, i = !0));
995
+ const c = (s = e.content) == null ? void 0 : s.map((f, k) => {
996
+ const u = P(f, t, `${r}.content[${k}]`, a);
997
+ return l.push(...u.issues), u.changed && (i = !0), u.node;
998
+ }), n = (p = e.marks) == null ? void 0 : p.flatMap((f, k) => {
999
+ var u;
1000
+ return !t.marks[f.type] && (l.push(d("MARK_UNKNOWN", a === "repair" ? "warn" : "error", `${r}.marks[${k}]`, `Unknown mark "${f.type}".`)), a === "repair") ? (l.push(d("FALLBACK_APPLIED", "info", `${r}.marks[${k}]`, `Unknown mark "${f.type}" dropped.`)), i = !0, []) : f.type === "link" && !lt((u = f.attrs) == null ? void 0 : u.href) && (l.push(d("ATTR_INVALID", a === "repair" ? "warn" : "error", `${r}.marks[${k}].attrs.href`, "Unsafe link href.")), a === "repair") ? (i = !0, []) : [f];
1001
+ });
1002
+ return { node: {
1003
+ ...e,
1004
+ attrs: Object.keys(o).length > 0 ? o : void 0,
1005
+ content: c,
1006
+ marks: n && n.length > 0 ? n : void 0
1007
+ }, issues: l, changed: i };
1008
+ }
1009
+ function at(e) {
1010
+ return Number.isInteger(e) && typeof e == "number" && e >= 1 && e <= 6;
1011
+ }
1012
+ function lt(e) {
1013
+ if (typeof e != "string") return !1;
1014
+ try {
1015
+ const t = new URL(e, "https://refinex.local");
1016
+ return ["http:", "https:", "mailto:"].includes(t.protocol);
1017
+ } catch {
1018
+ return !1;
1019
+ }
1020
+ }
1021
+ function w(e) {
1022
+ var t;
1023
+ return typeof e.text == "string" ? e.text : ((t = e.content) == null ? void 0 : t.map((r) => w(r)).join("")) ?? "";
1024
+ }
1025
+ export {
1026
+ C as REFINEX_DOC_VERSION,
1027
+ W as REFINEX_SCHEMA_ID,
1028
+ B as REFINEX_SCHEMA_VERSION,
1029
+ G as baseMarks,
1030
+ X as baseNodes,
1031
+ T as createBlockId,
1032
+ mt as createBlockIdPlugin,
1033
+ Y as createRefinexDoc,
1034
+ q as createRefinexSchema,
1035
+ J as createRichBlockSchemaExtensions,
1036
+ Z as defaultSchema,
1037
+ R as isBlockIdNode,
1038
+ Q as normalizeDocIds,
1039
+ ct as registerMarkSpec,
1040
+ dt as registerNodeSpec,
1041
+ it as richBlockExtensionNames,
1042
+ ut as richBlockSchemaExtensions,
1043
+ gt as schema,
1044
+ ft as validateDoc
1045
+ };
1046
+ //# sourceMappingURL=index.js.map