@refinex-md/model 0.1.0-canary.0 → 0.1.0-canary.2
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 +6 -0
- package/dist/index.js +147 -114
- package/dist/index.js.map +1 -1
- package/dist/rich-blocks.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,11 +1,31 @@
|
|
|
1
|
-
import { Schema as
|
|
2
|
-
import { PluginKey as
|
|
3
|
-
import { tableNodes as
|
|
4
|
-
const
|
|
1
|
+
import { Schema as F, Node as U, Fragment as M } from "prosemirror-model";
|
|
2
|
+
import { PluginKey as K, Plugin as j } from "prosemirror-state";
|
|
3
|
+
import { tableNodes as H } from "prosemirror-tables";
|
|
4
|
+
const X = {
|
|
5
|
+
gray: "#7c7c78",
|
|
6
|
+
brown: "#9f6b53",
|
|
7
|
+
orange: "#d9730d",
|
|
8
|
+
yellow: "#cb912f",
|
|
9
|
+
green: "#448361",
|
|
10
|
+
blue: "#337ea9",
|
|
11
|
+
purple: "#9065b0",
|
|
12
|
+
pink: "#c14c8a",
|
|
13
|
+
red: "#d44c47"
|
|
14
|
+
}, G = {
|
|
15
|
+
gray: "#f1f1ef",
|
|
16
|
+
brown: "#f4eeee",
|
|
17
|
+
orange: "#faebdd",
|
|
18
|
+
yellow: "#fbf3db",
|
|
19
|
+
green: "#edf3ec",
|
|
20
|
+
blue: "#e7f3f8",
|
|
21
|
+
purple: "#f6f3f9",
|
|
22
|
+
pink: "#f9f2f5",
|
|
23
|
+
red: "#fdebec"
|
|
24
|
+
}, p = {
|
|
5
25
|
blockId: { default: null },
|
|
6
26
|
metadata: { default: null },
|
|
7
27
|
permissions: { default: null }
|
|
8
|
-
},
|
|
28
|
+
}, J = ["doc:read", "doc:write"];
|
|
9
29
|
function g(e, t, r = {}) {
|
|
10
30
|
const a = r.blockId ?? "forbidden";
|
|
11
31
|
return {
|
|
@@ -14,12 +34,12 @@ function g(e, t, r = {}) {
|
|
|
14
34
|
version: "1.0.0",
|
|
15
35
|
spec: { ...t, refinexBlockId: a },
|
|
16
36
|
blockId: a,
|
|
17
|
-
capabilities:
|
|
37
|
+
capabilities: J,
|
|
18
38
|
fallback: r.fallback ?? "paragraph",
|
|
19
39
|
markdown: r.markdown ? { format: r.markdown } : void 0
|
|
20
40
|
};
|
|
21
41
|
}
|
|
22
|
-
const
|
|
42
|
+
const ct = [
|
|
23
43
|
"image_block",
|
|
24
44
|
"callout",
|
|
25
45
|
"task_list",
|
|
@@ -35,8 +55,8 @@ const it = [
|
|
|
35
55
|
"math_inline",
|
|
36
56
|
"math_block"
|
|
37
57
|
];
|
|
38
|
-
function
|
|
39
|
-
const e =
|
|
58
|
+
function W() {
|
|
59
|
+
const e = H({
|
|
40
60
|
tableGroup: "block",
|
|
41
61
|
cellContent: "block+",
|
|
42
62
|
cellAttributes: {
|
|
@@ -56,7 +76,16 @@ function J() {
|
|
|
56
76
|
return t.getAttribute("data-background") ?? t.style.backgroundColor ?? null;
|
|
57
77
|
},
|
|
58
78
|
setDOMAttr(t, r) {
|
|
59
|
-
t && (r["data-background"] = t, r.style = `${String(r.style ?? "")} background-color: ${
|
|
79
|
+
t && (r["data-background"] = t, r.style = `${String(r.style ?? "")} background-color: ${E(t, G)};`.trim());
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
textColor: {
|
|
83
|
+
default: null,
|
|
84
|
+
getFromDOM(t) {
|
|
85
|
+
return t.getAttribute("data-text-color") ?? t.style.color ?? null;
|
|
86
|
+
},
|
|
87
|
+
setDOMAttr(t, r) {
|
|
88
|
+
t && (r["data-text-color"] = t, r.style = `${String(r.style ?? "")} color: ${E(t, X)};`.trim());
|
|
60
89
|
}
|
|
61
90
|
},
|
|
62
91
|
metadata: {
|
|
@@ -95,7 +124,7 @@ function J() {
|
|
|
95
124
|
widthPercent: { default: 100 },
|
|
96
125
|
aspectRatio: { default: null },
|
|
97
126
|
status: { default: "ready" },
|
|
98
|
-
...
|
|
127
|
+
...p
|
|
99
128
|
},
|
|
100
129
|
selectable: !0,
|
|
101
130
|
draggable: !0,
|
|
@@ -154,7 +183,7 @@ function J() {
|
|
|
154
183
|
title: { default: null },
|
|
155
184
|
icon: { default: null },
|
|
156
185
|
collapsed: { default: !1 },
|
|
157
|
-
...
|
|
186
|
+
...p
|
|
158
187
|
},
|
|
159
188
|
selectable: !0,
|
|
160
189
|
draggable: !0,
|
|
@@ -165,7 +194,7 @@ function J() {
|
|
|
165
194
|
getAttrs(t) {
|
|
166
195
|
const r = t;
|
|
167
196
|
return {
|
|
168
|
-
kind:
|
|
197
|
+
kind: O(r.getAttribute("data-kind")),
|
|
169
198
|
title: r.getAttribute("data-title"),
|
|
170
199
|
icon: r.getAttribute("data-icon"),
|
|
171
200
|
collapsed: r.getAttribute("data-collapsed") === "true"
|
|
@@ -178,11 +207,11 @@ function J() {
|
|
|
178
207
|
"aside",
|
|
179
208
|
{
|
|
180
209
|
"data-rmd-callout": "true",
|
|
181
|
-
"data-kind":
|
|
210
|
+
"data-kind": O(t.attrs.kind),
|
|
182
211
|
"data-title": t.attrs.title,
|
|
183
212
|
"data-icon": t.attrs.icon,
|
|
184
213
|
"data-collapsed": String(!!t.attrs.collapsed),
|
|
185
|
-
class: `rmd-callout rmd-callout-${
|
|
214
|
+
class: `rmd-callout rmd-callout-${O(t.attrs.kind)}`
|
|
186
215
|
},
|
|
187
216
|
0
|
|
188
217
|
];
|
|
@@ -209,7 +238,7 @@ function J() {
|
|
|
209
238
|
content: "paragraph block*",
|
|
210
239
|
attrs: {
|
|
211
240
|
checked: { default: !1 },
|
|
212
|
-
...
|
|
241
|
+
...p
|
|
213
242
|
},
|
|
214
243
|
defining: !0,
|
|
215
244
|
parseDOM: [
|
|
@@ -253,7 +282,7 @@ function J() {
|
|
|
253
282
|
content: "paragraph block*",
|
|
254
283
|
attrs: {
|
|
255
284
|
collapsed: { default: !1 },
|
|
256
|
-
...
|
|
285
|
+
...p
|
|
257
286
|
},
|
|
258
287
|
selectable: !0,
|
|
259
288
|
draggable: !0,
|
|
@@ -304,7 +333,7 @@ function J() {
|
|
|
304
333
|
aspectRatio: { default: null },
|
|
305
334
|
status: { default: "unresolved" },
|
|
306
335
|
error: { default: null },
|
|
307
|
-
...
|
|
336
|
+
...p
|
|
308
337
|
},
|
|
309
338
|
parseDOM: [
|
|
310
339
|
{
|
|
@@ -344,7 +373,7 @@ function J() {
|
|
|
344
373
|
group: "block",
|
|
345
374
|
attrs: {
|
|
346
375
|
variant: { default: "solid" },
|
|
347
|
-
...
|
|
376
|
+
...p
|
|
348
377
|
},
|
|
349
378
|
selectable: !0,
|
|
350
379
|
draggable: !0,
|
|
@@ -353,7 +382,7 @@ function J() {
|
|
|
353
382
|
tag: "hr[data-rmd-divider]",
|
|
354
383
|
getAttrs(t) {
|
|
355
384
|
return {
|
|
356
|
-
variant:
|
|
385
|
+
variant: D(t.getAttribute("data-variant"))
|
|
357
386
|
};
|
|
358
387
|
}
|
|
359
388
|
}
|
|
@@ -363,8 +392,8 @@ function J() {
|
|
|
363
392
|
"hr",
|
|
364
393
|
{
|
|
365
394
|
"data-rmd-divider": "true",
|
|
366
|
-
"data-variant":
|
|
367
|
-
class: `rmd-divider rmd-divider-${
|
|
395
|
+
"data-variant": D(t.attrs.variant),
|
|
396
|
+
class: `rmd-divider rmd-divider-${D(t.attrs.variant)}`
|
|
368
397
|
}
|
|
369
398
|
];
|
|
370
399
|
}
|
|
@@ -380,7 +409,7 @@ function J() {
|
|
|
380
409
|
columnWidths: { default: null },
|
|
381
410
|
layout: { default: "auto" },
|
|
382
411
|
caption: { default: null },
|
|
383
|
-
...
|
|
412
|
+
...p
|
|
384
413
|
},
|
|
385
414
|
isolating: !0,
|
|
386
415
|
selectable: !0,
|
|
@@ -440,7 +469,7 @@ function J() {
|
|
|
440
469
|
numbered: { default: !1 },
|
|
441
470
|
label: { default: null },
|
|
442
471
|
align: { default: "center" },
|
|
443
|
-
...
|
|
472
|
+
...p
|
|
444
473
|
},
|
|
445
474
|
parseDOM: [
|
|
446
475
|
{
|
|
@@ -475,7 +504,7 @@ function J() {
|
|
|
475
504
|
)
|
|
476
505
|
];
|
|
477
506
|
}
|
|
478
|
-
const
|
|
507
|
+
const gt = W();
|
|
479
508
|
function _(e) {
|
|
480
509
|
return e === "left" || e === "right" ? e : "center";
|
|
481
510
|
}
|
|
@@ -486,7 +515,7 @@ function N(e) {
|
|
|
486
515
|
function x(e) {
|
|
487
516
|
return e === "empty" || e === "uploading" || e === "error" ? e : "ready";
|
|
488
517
|
}
|
|
489
|
-
function
|
|
518
|
+
function O(e) {
|
|
490
519
|
return e === "tip" || e === "important" || e === "warning" || e === "caution" ? e : e === "error" ? "caution" : "note";
|
|
491
520
|
}
|
|
492
521
|
function S(e) {
|
|
@@ -495,24 +524,28 @@ function S(e) {
|
|
|
495
524
|
function $(e) {
|
|
496
525
|
return e === "loading" || e === "ready" || e === "error" ? e : "unresolved";
|
|
497
526
|
}
|
|
498
|
-
function
|
|
527
|
+
function D(e) {
|
|
499
528
|
return e === "dashed" || e === "dotted" ? e : "solid";
|
|
500
529
|
}
|
|
501
530
|
function v(e) {
|
|
502
531
|
return e === !0 || e === "true";
|
|
503
532
|
}
|
|
504
|
-
|
|
533
|
+
function E(e, t) {
|
|
534
|
+
const r = String(e);
|
|
535
|
+
return t[r] ?? r;
|
|
536
|
+
}
|
|
537
|
+
const B = "1.0.0", Z = "@refinex-md/base", T = "1.0.0", h = {
|
|
505
538
|
blockId: { default: null },
|
|
506
539
|
metadata: { default: null },
|
|
507
540
|
permissions: { default: null }
|
|
508
|
-
},
|
|
541
|
+
}, C = /* @__PURE__ */ new Set([
|
|
509
542
|
"paragraph",
|
|
510
543
|
"heading",
|
|
511
544
|
"blockquote",
|
|
512
545
|
"list_item",
|
|
513
546
|
"code_block",
|
|
514
547
|
"horizontal_rule"
|
|
515
|
-
]),
|
|
548
|
+
]), Q = {
|
|
516
549
|
doc: { content: "block+" },
|
|
517
550
|
paragraph: {
|
|
518
551
|
attrs: h,
|
|
@@ -716,7 +749,7 @@ const C = "1.0.0", W = "@refinex-md/base", B = "1.0.0", h = {
|
|
|
716
749
|
text: {
|
|
717
750
|
group: "inline"
|
|
718
751
|
}
|
|
719
|
-
},
|
|
752
|
+
}, Y = {
|
|
720
753
|
bold: {
|
|
721
754
|
parseDOM: [{ tag: "strong" }, { tag: "b" }, { style: "font-weight=bold" }],
|
|
722
755
|
toDOM() {
|
|
@@ -802,7 +835,7 @@ const C = "1.0.0", W = "@refinex-md/base", B = "1.0.0", h = {
|
|
|
802
835
|
}
|
|
803
836
|
}
|
|
804
837
|
};
|
|
805
|
-
function
|
|
838
|
+
function ft(e, t, r = {}) {
|
|
806
839
|
return {
|
|
807
840
|
kind: "node",
|
|
808
841
|
name: e,
|
|
@@ -816,7 +849,7 @@ function dt(e, t, r = {}) {
|
|
|
816
849
|
migration: r.migration
|
|
817
850
|
};
|
|
818
851
|
}
|
|
819
|
-
function
|
|
852
|
+
function mt(e, t, r = {}) {
|
|
820
853
|
return {
|
|
821
854
|
kind: "mark",
|
|
822
855
|
name: e,
|
|
@@ -830,72 +863,72 @@ function ct(e, t, r = {}) {
|
|
|
830
863
|
};
|
|
831
864
|
}
|
|
832
865
|
function q(e = {}) {
|
|
833
|
-
const t = { ...
|
|
866
|
+
const t = { ...Q }, r = { ...Y }, a = /* @__PURE__ */ new Set([...Object.keys(t), ...Object.keys(r)]);
|
|
834
867
|
for (const l of e.extensions ?? []) {
|
|
835
|
-
if (
|
|
868
|
+
if (at(l.name), a.has(l.name))
|
|
836
869
|
throw new Error(`Extension name "${l.name}" is reserved or already registered.`);
|
|
837
|
-
a.add(l.name), l.kind === "node" ? (
|
|
870
|
+
a.add(l.name), l.kind === "node" ? (lt(l), t[l.name] = { ...l.spec, refinexBlockId: l.blockId }) : r[l.name] = l.spec;
|
|
838
871
|
}
|
|
839
|
-
return new
|
|
872
|
+
return new F({ nodes: t, marks: r });
|
|
840
873
|
}
|
|
841
|
-
const
|
|
842
|
-
function
|
|
874
|
+
const tt = q(), bt = tt;
|
|
875
|
+
function R() {
|
|
843
876
|
var r;
|
|
844
877
|
const e = new Uint8Array(12);
|
|
845
878
|
return (r = globalThis.crypto) == null || r.getRandomValues(e), `blk_${Array.from(e, (a) => a.toString(36).padStart(2, "0")).join("").slice(0, 24)}`;
|
|
846
879
|
}
|
|
847
|
-
function
|
|
848
|
-
return "spec" in e ? e.spec.refinexBlockId === "required" ||
|
|
880
|
+
function L(e) {
|
|
881
|
+
return "spec" in e ? e.spec.refinexBlockId === "required" || C.has(e.name) : C.has(e.type);
|
|
849
882
|
}
|
|
850
|
-
function
|
|
851
|
-
const a = r.createId ??
|
|
883
|
+
function et(e, t, r = {}) {
|
|
884
|
+
const a = r.createId ?? R, l = /* @__PURE__ */ new Set(), i = [];
|
|
852
885
|
let o = !1;
|
|
853
|
-
function c(n,
|
|
886
|
+
function c(n, f) {
|
|
854
887
|
if (n.isText) return n;
|
|
855
888
|
let s = n.attrs;
|
|
856
|
-
if (
|
|
857
|
-
const
|
|
858
|
-
typeof
|
|
889
|
+
if (L(n.type)) {
|
|
890
|
+
const d = s.blockId;
|
|
891
|
+
typeof d != "string" || d.length === 0 ? (s = { ...s, blockId: a() }, o = !0, i.push(u("BLOCK_ID_MISSING", "warn", `${f}.attrs.blockId`, "Missing blockId was generated."))) : V(d) ? l.has(d) && (s = { ...s, blockId: a() }, o = !0, i.push(u("BLOCK_ID_DUPLICATE", "warn", `${f}.attrs.blockId`, "Duplicate blockId was replaced."))) : (s = { ...s, blockId: a() }, o = !0, i.push(u("BLOCK_ID_INVALID", "warn", `${f}.attrs.blockId`, "Invalid blockId was replaced."))), l.add(s.blockId);
|
|
859
892
|
} else if ("blockId" in s) {
|
|
860
|
-
const { blockId:
|
|
861
|
-
s = I, o = !0, i.push(
|
|
893
|
+
const { blockId: d, ...I } = s;
|
|
894
|
+
s = I, o = !0, i.push(u("BLOCK_ID_FORBIDDEN", "warn", `${f}.attrs.blockId`, "Forbidden blockId was removed."));
|
|
862
895
|
}
|
|
863
|
-
const
|
|
864
|
-
n.forEach((
|
|
865
|
-
|
|
896
|
+
const b = [];
|
|
897
|
+
n.forEach((d, I, z) => {
|
|
898
|
+
b.push(c(d, `${f}.content[${z}]`));
|
|
866
899
|
});
|
|
867
|
-
const
|
|
868
|
-
return s === n.attrs && k ? n : n.type.create(s,
|
|
900
|
+
const m = b.length > 0 ? M.fromArray(b) : M.empty, k = b.length === n.childCount && b.every((d, I) => d.eq(n.child(I)));
|
|
901
|
+
return s === n.attrs && k ? n : n.type.create(s, m, n.marks);
|
|
869
902
|
}
|
|
870
903
|
return { doc: c(e, "$"), changed: o, issues: i };
|
|
871
904
|
}
|
|
872
|
-
const
|
|
873
|
-
function
|
|
874
|
-
return new
|
|
875
|
-
key:
|
|
905
|
+
const y = new K("refinexBlockId");
|
|
906
|
+
function pt(e = {}) {
|
|
907
|
+
return new j({
|
|
908
|
+
key: y,
|
|
876
909
|
appendTransaction(t, r, a) {
|
|
877
|
-
if (t.some((n) => n.getMeta(
|
|
878
|
-
const l = e.createId ??
|
|
879
|
-
if (a.doc.descendants((n,
|
|
880
|
-
if (!
|
|
910
|
+
if (t.some((n) => n.getMeta(y)) || !t.some((n) => n.docChanged)) return null;
|
|
911
|
+
const l = e.createId ?? R, i = /* @__PURE__ */ new Set(), o = [];
|
|
912
|
+
if (a.doc.descendants((n, f) => {
|
|
913
|
+
if (!L(n.type)) return !0;
|
|
881
914
|
const s = n.attrs.blockId;
|
|
882
|
-
return typeof s != "string" || !
|
|
915
|
+
return typeof s != "string" || !V(s) || i.has(s) ? (o.push({ pos: f, attrs: { ...n.attrs, blockId: l() } }), !0) : (i.add(s), !0);
|
|
883
916
|
}), o.length === 0) return null;
|
|
884
917
|
const c = a.tr;
|
|
885
918
|
for (const n of o)
|
|
886
919
|
c.setNodeMarkup(n.pos, void 0, n.attrs);
|
|
887
|
-
return c.setMeta(
|
|
920
|
+
return c.setMeta(y, !0), c;
|
|
888
921
|
}
|
|
889
922
|
});
|
|
890
923
|
}
|
|
891
|
-
function
|
|
924
|
+
function rt(e, t = {}) {
|
|
892
925
|
var a, l, i, o, c;
|
|
893
|
-
const r = e instanceof
|
|
926
|
+
const r = e instanceof U ? e.toJSON() : e;
|
|
894
927
|
return {
|
|
895
|
-
refinexDocVersion:
|
|
928
|
+
refinexDocVersion: B,
|
|
896
929
|
schema: {
|
|
897
|
-
id:
|
|
898
|
-
version: ((a = t.schema) == null ? void 0 : a.version) ??
|
|
930
|
+
id: Z,
|
|
931
|
+
version: ((a = t.schema) == null ? void 0 : a.version) ?? T,
|
|
899
932
|
extensions: ((l = t.schema) == null ? void 0 : l.extensions) ?? []
|
|
900
933
|
},
|
|
901
934
|
metadata: t.metadata ?? {},
|
|
@@ -908,17 +941,17 @@ function Y(e, t = {}) {
|
|
|
908
941
|
content: r
|
|
909
942
|
};
|
|
910
943
|
}
|
|
911
|
-
function
|
|
944
|
+
function kt(e, t) {
|
|
912
945
|
const r = [];
|
|
913
|
-
if (!
|
|
946
|
+
if (!A(e))
|
|
914
947
|
return {
|
|
915
948
|
ok: !1,
|
|
916
|
-
issues: [
|
|
949
|
+
issues: [u("CONTENT_INVALID", "error", "$", "RefinexDoc must be an object.")]
|
|
917
950
|
};
|
|
918
951
|
const a = e;
|
|
919
|
-
if (a.refinexDocVersion !==
|
|
952
|
+
if (a.refinexDocVersion !== B && r.push(u("DOC_VERSION_UNSUPPORTED", "error", "$.refinexDocVersion", "Unsupported RefinexDoc version.")), (!A(a.schema) || a.schema.version !== T) && r.push(u("SCHEMA_VERSION_UNSUPPORTED", "error", "$.schema.version", "Unsupported schema version.")), (!A(a.content) || a.content.type !== "doc") && r.push(u("CONTENT_INVALID", "error", "$.content", "Content must be a ProseMirror doc JSON object.")), r.some((s) => s.severity === "error"))
|
|
920
953
|
return { ok: !1, issues: r };
|
|
921
|
-
const l = q({ extensions: t.extensions }), i =
|
|
954
|
+
const l = q({ extensions: t.extensions }), i = nt(a, t.extensions ?? []);
|
|
922
955
|
r.push(...i);
|
|
923
956
|
const o = P(a.content, l, "$.content", t.mode);
|
|
924
957
|
if (r.push(...o.issues), t.mode === "strict" && r.some((s) => s.severity === "error"))
|
|
@@ -931,25 +964,25 @@ function ft(e, t) {
|
|
|
931
964
|
ok: !1,
|
|
932
965
|
issues: [
|
|
933
966
|
...r,
|
|
934
|
-
|
|
967
|
+
u("CONTENT_INVALID", "error", "$.content", s instanceof Error ? s.message : "Invalid content.")
|
|
935
968
|
]
|
|
936
969
|
};
|
|
937
970
|
}
|
|
938
|
-
const n =
|
|
971
|
+
const n = et(c, l, { createId: t.createId });
|
|
939
972
|
if (r.push(...n.issues), t.mode === "strict" && n.issues.length > 0)
|
|
940
973
|
return { ok: !1, issues: r };
|
|
941
|
-
const
|
|
974
|
+
const f = rt(n.doc, {
|
|
942
975
|
schema: a.schema,
|
|
943
976
|
metadata: a.metadata,
|
|
944
977
|
permissions: a.permissions
|
|
945
978
|
});
|
|
946
|
-
return t.mode === "repair" && (o.changed || n.changed) ? { ok: !0, normalized:
|
|
979
|
+
return t.mode === "repair" && (o.changed || n.changed) ? { ok: !0, normalized: f, issues: r } : { ok: r.every((s) => s.severity !== "error"), doc: f, issues: r };
|
|
947
980
|
}
|
|
948
|
-
function
|
|
981
|
+
function at(e) {
|
|
949
982
|
if (!/^[a-z][a-z0-9_]*$/.test(e))
|
|
950
983
|
throw new Error(`Extension name "${e}" must use snake_case.`);
|
|
951
984
|
}
|
|
952
|
-
function
|
|
985
|
+
function lt(e) {
|
|
953
986
|
var r, a;
|
|
954
987
|
if ((e.spec.inline === !0 || e.spec.group === "inline") && e.blockId === "required")
|
|
955
988
|
throw new Error(`Inline node "${e.name}" cannot require blockId.`);
|
|
@@ -958,18 +991,18 @@ function et(e) {
|
|
|
958
991
|
if (e.blockId === "required" && !((a = e.spec.attrs) != null && a.blockId))
|
|
959
992
|
throw new Error(`Node "${e.name}" requires a blockId attr.`);
|
|
960
993
|
}
|
|
961
|
-
function
|
|
994
|
+
function V(e) {
|
|
962
995
|
return /^blk_[A-Za-z0-9_-]{8,36}$/.test(e);
|
|
963
996
|
}
|
|
964
|
-
function
|
|
997
|
+
function u(e, t, r, a) {
|
|
965
998
|
return { code: e, severity: t, path: r, message: a };
|
|
966
999
|
}
|
|
967
|
-
function
|
|
1000
|
+
function A(e) {
|
|
968
1001
|
return typeof e == "object" && e !== null && !Array.isArray(e);
|
|
969
1002
|
}
|
|
970
|
-
function
|
|
1003
|
+
function nt(e, t) {
|
|
971
1004
|
const r = new Set(t.map((a) => a.name));
|
|
972
|
-
return e.schema.extensions.filter((a) => !r.has(a.name)).map((a, l) =>
|
|
1005
|
+
return e.schema.extensions.filter((a) => !r.has(a.name)).map((a, l) => u(
|
|
973
1006
|
"EXTENSION_MISSING",
|
|
974
1007
|
"error",
|
|
975
1008
|
`$.schema.extensions[${l}]`,
|
|
@@ -977,11 +1010,11 @@ function rt(e, t) {
|
|
|
977
1010
|
));
|
|
978
1011
|
}
|
|
979
1012
|
function P(e, t, r, a) {
|
|
980
|
-
var s,
|
|
1013
|
+
var s, b;
|
|
981
1014
|
const l = [];
|
|
982
1015
|
let i = !1;
|
|
983
1016
|
if (!t.nodes[e.type])
|
|
984
|
-
return l.push(
|
|
1017
|
+
return l.push(u("NODE_UNKNOWN", a === "repair" ? "warn" : "error", r, `Unknown node "${e.type}".`)), a === "repair" ? (l.push(u("FALLBACK_APPLIED", "info", r, `Unknown node "${e.type}" converted to paragraph.`)), {
|
|
985
1018
|
node: {
|
|
986
1019
|
type: "paragraph",
|
|
987
1020
|
attrs: { blockId: null },
|
|
@@ -991,13 +1024,13 @@ function P(e, t, r, a) {
|
|
|
991
1024
|
changed: !0
|
|
992
1025
|
}) : { node: e, issues: l, changed: !1 };
|
|
993
1026
|
const o = { ...e.attrs ?? {} };
|
|
994
|
-
e.type === "heading" && !
|
|
995
|
-
const c = (s = e.content) == null ? void 0 : s.map((
|
|
996
|
-
const
|
|
997
|
-
return l.push(...
|
|
998
|
-
}), n = (
|
|
999
|
-
var
|
|
1000
|
-
return !t.marks[
|
|
1027
|
+
e.type === "heading" && !st(o.level) && (l.push(u("ATTR_INVALID", a === "repair" ? "warn" : "error", `${r}.attrs.level`, "Heading level must be 1-6.")), a === "repair" && (o.level = 1, i = !0));
|
|
1028
|
+
const c = (s = e.content) == null ? void 0 : s.map((m, k) => {
|
|
1029
|
+
const d = P(m, t, `${r}.content[${k}]`, a);
|
|
1030
|
+
return l.push(...d.issues), d.changed && (i = !0), d.node;
|
|
1031
|
+
}), n = (b = e.marks) == null ? void 0 : b.flatMap((m, k) => {
|
|
1032
|
+
var d;
|
|
1033
|
+
return !t.marks[m.type] && (l.push(u("MARK_UNKNOWN", a === "repair" ? "warn" : "error", `${r}.marks[${k}]`, `Unknown mark "${m.type}".`)), a === "repair") ? (l.push(u("FALLBACK_APPLIED", "info", `${r}.marks[${k}]`, `Unknown mark "${m.type}" dropped.`)), i = !0, []) : m.type === "link" && !ot((d = m.attrs) == null ? void 0 : d.href) && (l.push(u("ATTR_INVALID", a === "repair" ? "warn" : "error", `${r}.marks[${k}].attrs.href`, "Unsafe link href.")), a === "repair") ? (i = !0, []) : [m];
|
|
1001
1034
|
});
|
|
1002
1035
|
return { node: {
|
|
1003
1036
|
...e,
|
|
@@ -1006,10 +1039,10 @@ function P(e, t, r, a) {
|
|
|
1006
1039
|
marks: n && n.length > 0 ? n : void 0
|
|
1007
1040
|
}, issues: l, changed: i };
|
|
1008
1041
|
}
|
|
1009
|
-
function
|
|
1042
|
+
function st(e) {
|
|
1010
1043
|
return Number.isInteger(e) && typeof e == "number" && e >= 1 && e <= 6;
|
|
1011
1044
|
}
|
|
1012
|
-
function
|
|
1045
|
+
function ot(e) {
|
|
1013
1046
|
if (typeof e != "string") return !1;
|
|
1014
1047
|
try {
|
|
1015
1048
|
const t = new URL(e, "https://refinex.local");
|
|
@@ -1023,24 +1056,24 @@ function w(e) {
|
|
|
1023
1056
|
return typeof e.text == "string" ? e.text : ((t = e.content) == null ? void 0 : t.map((r) => w(r)).join("")) ?? "";
|
|
1024
1057
|
}
|
|
1025
1058
|
export {
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1059
|
+
B as REFINEX_DOC_VERSION,
|
|
1060
|
+
Z as REFINEX_SCHEMA_ID,
|
|
1061
|
+
T as REFINEX_SCHEMA_VERSION,
|
|
1062
|
+
Y as baseMarks,
|
|
1063
|
+
Q as baseNodes,
|
|
1064
|
+
R as createBlockId,
|
|
1065
|
+
pt as createBlockIdPlugin,
|
|
1066
|
+
rt as createRefinexDoc,
|
|
1034
1067
|
q as createRefinexSchema,
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1068
|
+
W as createRichBlockSchemaExtensions,
|
|
1069
|
+
tt as defaultSchema,
|
|
1070
|
+
L as isBlockIdNode,
|
|
1071
|
+
et as normalizeDocIds,
|
|
1072
|
+
mt as registerMarkSpec,
|
|
1073
|
+
ft as registerNodeSpec,
|
|
1074
|
+
ct as richBlockExtensionNames,
|
|
1075
|
+
gt as richBlockSchemaExtensions,
|
|
1076
|
+
bt as schema,
|
|
1077
|
+
kt as validateDoc
|
|
1045
1078
|
};
|
|
1046
1079
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/rich-blocks.ts","../src/index.ts"],"sourcesContent":["import { tableNodes } from 'prosemirror-tables';\nimport type { NodeSpec } from 'prosemirror-model';\n\nimport type { RefinexNodeExtension, RefinexSchemaExtension } from './index';\n\nconst richBlockAttrs = {\n blockId: { default: null },\n metadata: { default: null },\n permissions: { default: null },\n};\n\nconst richCapabilities = ['doc:read', 'doc:write'];\n\nfunction defineNode(\n name: string,\n spec: NodeSpec,\n options: {\n readonly blockId?: 'required' | 'forbidden';\n readonly fallback?: RefinexNodeExtension['fallback'];\n readonly markdown?: string;\n } = {},\n): RefinexNodeExtension {\n const blockId = options.blockId ?? 'forbidden';\n return {\n kind: 'node',\n name,\n version: '1.0.0',\n spec: { ...spec, refinexBlockId: blockId },\n blockId,\n capabilities: richCapabilities,\n fallback: options.fallback ?? 'paragraph',\n markdown: options.markdown ? { format: options.markdown } : undefined,\n };\n}\n\nexport type ImageBlockAlign = 'left' | 'center' | 'right';\nexport type ImageBlockStatus = 'empty' | 'ready' | 'uploading' | 'error';\nexport type CalloutKind = 'note' | 'tip' | 'important' | 'warning' | 'caution';\nexport type EmbedType = 'bookmark' | 'iframe' | 'oembed';\nexport type EmbedStatus = 'unresolved' | 'loading' | 'ready' | 'error';\nexport type DividerVariant = 'solid' | 'dashed' | 'dotted';\nexport type TableLayout = 'auto' | 'fixed';\nexport type MathBlockAlign = 'center' | 'left';\nexport interface ToggleItemAttrs {\n readonly collapsed: boolean;\n readonly blockId: string | null;\n readonly metadata: Record<string, unknown> | null;\n readonly permissions: Record<string, unknown> | null;\n}\n\nexport const richBlockExtensionNames = [\n 'image_block',\n 'callout',\n 'task_list',\n 'task_item',\n 'toggle_list',\n 'toggle_item',\n 'embed_block',\n 'divider',\n 'table',\n 'table_row',\n 'table_cell',\n 'table_header',\n 'math_inline',\n 'math_block',\n] as const;\n\nexport type RichBlockExtensionName = (typeof richBlockExtensionNames)[number];\n\nexport function createRichBlockSchemaExtensions(): RefinexSchemaExtension[] {\n const specs = tableNodes({\n tableGroup: 'block',\n cellContent: 'block+',\n cellAttributes: {\n align: {\n default: null,\n getFromDOM(dom) {\n const align = dom.getAttribute('data-align') ?? dom.style.textAlign;\n return align === 'left' || align === 'center' || align === 'right' ? align : null;\n },\n setDOMAttr(value, attrs) {\n if (value) {\n attrs['data-align'] = value as string;\n attrs.style = `${String(attrs.style ?? '')} text-align: ${String(value)};`.trim();\n }\n },\n },\n background: {\n default: null,\n getFromDOM(dom) {\n return dom.getAttribute('data-background') ?? dom.style.backgroundColor ?? null;\n },\n setDOMAttr(value, attrs) {\n if (value) {\n attrs['data-background'] = value as string;\n attrs.style = `${String(attrs.style ?? '')} background-color: ${String(value)};`.trim();\n }\n },\n },\n metadata: {\n default: null,\n getFromDOM() {\n return null;\n },\n setDOMAttr() {\n return undefined;\n },\n },\n colwidth: {\n default: null,\n getFromDOM(dom) {\n const value = dom.getAttribute('data-colwidth');\n const width = value ? Number.parseInt(value, 10) : Number.NaN;\n return Number.isFinite(width) && width > 0 ? [width] : null;\n },\n setDOMAttr(value, attrs) {\n if (!Array.isArray(value)) return;\n const width = Number(value[0]);\n if (!Number.isFinite(width) || width <= 0) return;\n attrs['data-colwidth'] = String(width);\n attrs.style =\n `${String(attrs.style ?? '')} width: ${String(width)}px; min-width: ${String(width)}px;`.trim();\n },\n },\n },\n }) as Record<'table' | 'table_row' | 'table_cell' | 'table_header', NodeSpec>;\n\n return [\n defineNode(\n 'image_block',\n {\n group: 'block',\n content: 'inline*',\n attrs: {\n src: {},\n alt: { default: null },\n title: { default: null },\n align: { default: 'center' satisfies ImageBlockAlign },\n widthPercent: { default: 100 },\n aspectRatio: { default: null },\n status: { default: 'ready' satisfies ImageBlockStatus },\n ...richBlockAttrs,\n },\n selectable: true,\n draggable: true,\n defining: true,\n isolating: true,\n parseDOM: [\n {\n tag: 'figure[data-rmd-image-block]',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n const image = el.querySelector('img');\n return {\n src: image?.getAttribute('src') ?? '',\n alt: image?.getAttribute('alt'),\n title: image?.getAttribute('title'),\n align: normalizeAlign(el.getAttribute('data-align')),\n widthPercent: normalizePercent(el.getAttribute('data-width')),\n aspectRatio: el.getAttribute('data-aspect-ratio'),\n status: normalizeImageStatus(el.getAttribute('data-status')),\n };\n },\n },\n ],\n toDOM(node) {\n const width = normalizePercent(node.attrs.widthPercent);\n return [\n 'figure',\n {\n 'data-rmd-image-block': 'true',\n 'data-align': normalizeAlign(node.attrs.align),\n 'data-width': String(width),\n 'data-status': normalizeImageStatus(node.attrs.status),\n class: 'rmd-image-block',\n },\n [\n 'img',\n {\n src: node.attrs.src as string,\n alt: (node.attrs.alt as string | null) ?? '',\n title: node.attrs.title as string | null,\n style: `width: ${String(width)}%;`,\n },\n ],\n ['figcaption', 0],\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'rich-image-block' },\n ),\n\n defineNode(\n 'callout',\n {\n group: 'block',\n content: 'block+',\n attrs: {\n kind: { default: 'note' satisfies CalloutKind },\n title: { default: null },\n icon: { default: null },\n collapsed: { default: false },\n ...richBlockAttrs,\n },\n selectable: true,\n draggable: true,\n defining: true,\n parseDOM: [\n {\n tag: 'aside[data-rmd-callout]',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n return {\n kind: normalizeCalloutKind(el.getAttribute('data-kind')),\n title: el.getAttribute('data-title'),\n icon: el.getAttribute('data-icon'),\n collapsed: el.getAttribute('data-collapsed') === 'true',\n };\n },\n },\n ],\n toDOM(node) {\n return [\n 'aside',\n {\n 'data-rmd-callout': 'true',\n 'data-kind': normalizeCalloutKind(node.attrs.kind),\n 'data-title': node.attrs.title as string | null,\n 'data-icon': node.attrs.icon as string | null,\n 'data-collapsed': String(Boolean(node.attrs.collapsed)),\n class: `rmd-callout rmd-callout-${normalizeCalloutKind(node.attrs.kind)}`,\n },\n 0,\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'gfm-alert' },\n ),\n\n defineNode(\n 'task_list',\n {\n group: 'block',\n content: 'task_item+',\n attrs: { metadata: { default: null } },\n parseDOM: [{ tag: 'ul[data-rmd-task-list]' }],\n toDOM() {\n return ['ul', { 'data-rmd-task-list': 'true', class: 'rmd-task-list' }, 0];\n },\n },\n { fallback: 'paragraph', markdown: 'gfm-task-list' },\n ),\n\n defineNode(\n 'task_item',\n {\n content: 'paragraph block*',\n attrs: {\n checked: { default: false },\n ...richBlockAttrs,\n },\n defining: true,\n parseDOM: [\n {\n tag: 'li[data-rmd-task-item]',\n getAttrs(dom) {\n return { checked: (dom as HTMLElement).getAttribute('data-checked') === 'true' };\n },\n },\n ],\n toDOM(node) {\n return [\n 'li',\n {\n 'data-rmd-task-item': 'true',\n 'data-checked': String(Boolean(node.attrs.checked)),\n class: 'rmd-task-item',\n },\n 0,\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'gfm-task-list' },\n ),\n\n defineNode(\n 'toggle_list',\n {\n group: 'block',\n content: 'toggle_item+',\n attrs: { metadata: { default: null } },\n parseDOM: [{ tag: 'ul[data-rmd-toggle-list]' }],\n toDOM() {\n return ['ul', { 'data-rmd-toggle-list': 'true', class: 'rmd-toggle-list' }, 0];\n },\n },\n { fallback: 'paragraph', markdown: 'refinex-toggle-list' },\n ),\n\n defineNode(\n 'toggle_item',\n {\n content: 'paragraph block*',\n attrs: {\n collapsed: { default: false },\n ...richBlockAttrs,\n },\n selectable: true,\n draggable: true,\n defining: true,\n parseDOM: [\n {\n tag: 'li[data-rmd-toggle-item]',\n getAttrs(dom) {\n return {\n collapsed: normalizeToggleCollapsed(\n (dom as HTMLElement).getAttribute('data-collapsed'),\n ),\n };\n },\n },\n ],\n toDOM(node) {\n const collapsed = normalizeToggleCollapsed(node.attrs.collapsed);\n return [\n 'li',\n {\n 'data-rmd-toggle-item': 'true',\n 'data-collapsed': String(collapsed),\n class: 'rmd-toggle-item',\n },\n 0,\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'refinex-toggle-list' },\n ),\n\n defineNode(\n 'embed_block',\n {\n group: 'block',\n atom: true,\n isolating: true,\n selectable: true,\n draggable: true,\n attrs: {\n url: {},\n provider: { default: null },\n embedType: { default: 'bookmark' satisfies EmbedType },\n title: { default: null },\n description: { default: null },\n thumbnail: { default: null },\n html: { default: null },\n aspectRatio: { default: null },\n status: { default: 'unresolved' satisfies EmbedStatus },\n error: { default: null },\n ...richBlockAttrs,\n },\n parseDOM: [\n {\n tag: 'a[data-rmd-embed-block]',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n return {\n url: el.getAttribute('href') ?? '',\n title: el.getAttribute('data-title') ?? el.textContent,\n provider: el.getAttribute('data-provider'),\n embedType: normalizeEmbedType(el.getAttribute('data-embed-type')),\n status: normalizeEmbedStatus(el.getAttribute('data-status')),\n };\n },\n },\n ],\n toDOM(node) {\n return [\n 'a',\n {\n 'data-rmd-embed-block': 'true',\n href: node.attrs.url as string,\n 'data-provider': node.attrs.provider as string | null,\n 'data-embed-type': normalizeEmbedType(node.attrs.embedType),\n 'data-status': normalizeEmbedStatus(node.attrs.status),\n class: 'rmd-embed-block',\n },\n (node.attrs.title as string | null) ?? (node.attrs.url as string),\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'refinex-block' },\n ),\n\n defineNode(\n 'divider',\n {\n group: 'block',\n attrs: {\n variant: { default: 'solid' satisfies DividerVariant },\n ...richBlockAttrs,\n },\n selectable: true,\n draggable: true,\n parseDOM: [\n {\n tag: 'hr[data-rmd-divider]',\n getAttrs(dom) {\n return {\n variant: normalizeDividerVariant((dom as HTMLElement).getAttribute('data-variant')),\n };\n },\n },\n ],\n toDOM(node) {\n return [\n 'hr',\n {\n 'data-rmd-divider': 'true',\n 'data-variant': normalizeDividerVariant(node.attrs.variant),\n class: `rmd-divider rmd-divider-${normalizeDividerVariant(node.attrs.variant)}`,\n },\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'thematic-break' },\n ),\n\n defineNode(\n 'table',\n {\n ...specs.table,\n attrs: {\n ...(specs.table.attrs ?? {}),\n columnWidths: { default: null },\n layout: { default: 'auto' satisfies TableLayout },\n caption: { default: null },\n ...richBlockAttrs,\n },\n isolating: true,\n selectable: true,\n draggable: true,\n },\n { blockId: 'required', fallback: 'code_block', markdown: 'gfm-table' },\n ),\n defineNode('table_row', specs.table_row, { fallback: 'drop', markdown: 'gfm-table' }),\n defineNode('table_cell', specs.table_cell, { fallback: 'paragraph', markdown: 'gfm-table' }),\n defineNode('table_header', specs.table_header, {\n fallback: 'paragraph',\n markdown: 'gfm-table',\n }),\n\n defineNode(\n 'math_inline',\n {\n inline: true,\n group: 'inline',\n atom: true,\n selectable: true,\n attrs: {\n tex: {},\n metadata: { default: null },\n },\n parseDOM: [\n {\n tag: 'span[data-rmd-math-inline]',\n getAttrs(dom) {\n return { tex: (dom as HTMLElement).getAttribute('data-tex') ?? '' };\n },\n },\n ],\n toDOM(node) {\n return [\n 'span',\n {\n 'data-rmd-math-inline': 'true',\n 'data-tex': node.attrs.tex as string,\n class: 'rmd-math-inline',\n },\n node.attrs.tex as string,\n ];\n },\n },\n { fallback: 'paragraph', markdown: 'remark-math' },\n ),\n\n defineNode(\n 'math_block',\n {\n group: 'block',\n atom: true,\n isolating: true,\n selectable: true,\n draggable: true,\n attrs: {\n tex: {},\n numbered: { default: false },\n label: { default: null },\n align: { default: 'center' satisfies MathBlockAlign },\n ...richBlockAttrs,\n },\n parseDOM: [\n {\n tag: 'div[data-rmd-math-block]',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n return {\n tex: el.getAttribute('data-tex') ?? el.textContent ?? '',\n numbered: el.getAttribute('data-numbered') === 'true',\n label: el.getAttribute('data-label'),\n align: el.getAttribute('data-align') === 'left' ? 'left' : 'center',\n };\n },\n },\n ],\n toDOM(node) {\n return [\n 'div',\n {\n 'data-rmd-math-block': 'true',\n 'data-tex': node.attrs.tex as string,\n 'data-numbered': String(Boolean(node.attrs.numbered)),\n 'data-label': node.attrs.label as string | null,\n 'data-align': node.attrs.align === 'left' ? 'left' : 'center',\n class: 'rmd-math-block',\n },\n node.attrs.tex as string,\n ];\n },\n },\n { blockId: 'required', fallback: 'code_block', markdown: 'remark-math' },\n ),\n ];\n}\n\nexport const richBlockSchemaExtensions = createRichBlockSchemaExtensions();\n\nfunction normalizeAlign(value: unknown): ImageBlockAlign {\n return value === 'left' || value === 'right' ? value : 'center';\n}\n\nfunction normalizePercent(value: unknown): number {\n const numeric = Number(value ?? 100);\n if (!Number.isFinite(numeric)) return 100;\n return Math.max(10, Math.min(100, Math.round(numeric)));\n}\n\nfunction normalizeImageStatus(value: unknown): ImageBlockStatus {\n return value === 'empty' || value === 'uploading' || value === 'error' ? value : 'ready';\n}\n\nfunction normalizeCalloutKind(value: unknown): CalloutKind {\n if (value === 'tip' || value === 'important' || value === 'warning' || value === 'caution')\n return value;\n if (value === 'error') return 'caution';\n return 'note';\n}\n\nfunction normalizeEmbedType(value: unknown): EmbedType {\n return value === 'iframe' || value === 'oembed' ? value : 'bookmark';\n}\n\nfunction normalizeEmbedStatus(value: unknown): EmbedStatus {\n return value === 'loading' || value === 'ready' || value === 'error' ? value : 'unresolved';\n}\n\nfunction normalizeDividerVariant(value: unknown): DividerVariant {\n return value === 'dashed' || value === 'dotted' ? value : 'solid';\n}\n\nfunction normalizeToggleCollapsed(value: unknown): boolean {\n return value === true || value === 'true';\n}\n","import { Fragment, Node as ProseMirrorNode, Schema } from 'prosemirror-model'\nimport type { MarkSpec, NodeSpec, NodeType } from 'prosemirror-model'\nimport { Plugin, PluginKey } from 'prosemirror-state'\n\nexport const REFINEX_DOC_VERSION = '1.0.0'\nexport const REFINEX_SCHEMA_ID = '@refinex-md/base'\nexport const REFINEX_SCHEMA_VERSION = '1.0.0'\n\nexport type BlockIdMode = 'required' | 'forbidden' | 'optional'\nexport type RefinexCapabilityToken = 'doc:read' | 'doc:write' | 'network:none' | string\nexport type RefinexSchemaPlacement = 'append' | 'prepend'\nexport type RefinexNodeFallback = 'unwrap' | 'paragraph' | 'code_block' | 'drop'\nexport type RefinexMarkFallback = 'drop' | 'code' | 'link'\n\nexport interface RefinexMarkdownDeclaration {\n readonly format: string\n}\n\nexport interface RefinexMigrationDeclaration {\n readonly from: string\n readonly to: string\n}\n\ntype RefinexNodeSpec = NodeSpec & { refinexBlockId?: BlockIdMode }\n\nexport interface RefinexNodeExtension {\n readonly kind: 'node'\n readonly name: string\n readonly version: string\n readonly spec: RefinexNodeSpec\n readonly placement?: RefinexSchemaPlacement\n readonly blockId?: BlockIdMode\n readonly capabilities: RefinexCapabilityToken[]\n readonly fallback: RefinexNodeFallback\n readonly markdown?: RefinexMarkdownDeclaration\n readonly migration?: RefinexMigrationDeclaration\n}\n\nexport interface RefinexMarkExtension {\n readonly kind: 'mark'\n readonly name: string\n readonly version: string\n readonly spec: MarkSpec\n readonly placement?: RefinexSchemaPlacement\n readonly capabilities: RefinexCapabilityToken[]\n readonly fallback: RefinexMarkFallback\n readonly markdown?: RefinexMarkdownDeclaration\n readonly migration?: RefinexMigrationDeclaration\n}\n\nexport type RefinexSchemaExtension = RefinexNodeExtension | RefinexMarkExtension\n\nexport interface CreateRefinexSchemaOptions {\n readonly extensions?: readonly RefinexSchemaExtension[]\n}\n\nexport interface RegisterNodeSpecOptions {\n readonly version?: string\n readonly placement?: RefinexSchemaPlacement\n readonly blockId?: BlockIdMode\n readonly capabilities?: readonly RefinexCapabilityToken[]\n readonly fallback?: RefinexNodeFallback\n readonly markdown?: RefinexMarkdownDeclaration\n readonly migration?: RefinexMigrationDeclaration\n}\n\nexport interface RegisterMarkSpecOptions {\n readonly version?: string\n readonly placement?: RefinexSchemaPlacement\n readonly capabilities?: readonly RefinexCapabilityToken[]\n readonly fallback?: RefinexMarkFallback\n readonly markdown?: RefinexMarkdownDeclaration\n readonly migration?: RefinexMigrationDeclaration\n}\n\nexport interface ProseMirrorMarkJSON {\n readonly type: string\n readonly attrs?: Record<string, unknown>\n}\n\nexport interface ProseMirrorNodeJSON {\n readonly type: string\n readonly attrs?: Record<string, unknown>\n readonly content?: ProseMirrorNodeJSON[]\n readonly text?: string\n readonly marks?: ProseMirrorMarkJSON[]\n}\n\nexport type ProseMirrorDocJSON = ProseMirrorNodeJSON & { readonly type: 'doc' }\n\nexport interface RefinexExtensionRef {\n readonly name: string\n readonly version: string\n}\n\nexport interface RefinexSchemaRef {\n readonly id: typeof REFINEX_SCHEMA_ID\n readonly version: string\n readonly extensions: RefinexExtensionRef[]\n}\n\nexport interface RefinexBlockPermission {\n readonly access: 'read-write' | 'read-only' | 'comment-only' | 'locked'\n readonly reason?: string\n}\n\nexport interface RefinexDocMetadata {\n readonly docId?: string\n readonly title?: string\n readonly createdAt?: string\n readonly updatedAt?: string\n readonly createdBy?: string\n readonly updatedBy?: string\n readonly source?: 'api' | 'markdown-import' | 'html-import' | 'collab' | 'unknown'\n readonly custom?: Record<string, unknown>\n}\n\nexport interface RefinexDocPermissions {\n readonly policyVersion: '1.0'\n readonly defaultAccess: 'read-write' | 'read-only' | 'comment-only' | 'locked'\n readonly blockOverrides?: Record<string, RefinexBlockPermission>\n readonly custom?: Record<string, unknown>\n}\n\nexport interface RefinexDoc {\n readonly refinexDocVersion: string\n readonly schema: RefinexSchemaRef\n readonly metadata: RefinexDocMetadata\n readonly permissions: RefinexDocPermissions\n readonly content: ProseMirrorDocJSON\n}\n\nexport type RefinexIssueCode =\n | 'DOC_VERSION_UNSUPPORTED'\n | 'SCHEMA_VERSION_UNSUPPORTED'\n | 'EXTENSION_MISSING'\n | 'NODE_UNKNOWN'\n | 'MARK_UNKNOWN'\n | 'CONTENT_INVALID'\n | 'ATTR_INVALID'\n | 'BLOCK_ID_MISSING'\n | 'BLOCK_ID_INVALID'\n | 'BLOCK_ID_DUPLICATE'\n | 'BLOCK_ID_FORBIDDEN'\n | 'FALLBACK_APPLIED'\n\nexport type RefinexIssueSeverity = 'error' | 'warn' | 'info'\n\nexport interface RefinexDocIssue {\n readonly code: RefinexIssueCode\n readonly severity: RefinexIssueSeverity\n readonly path: string\n readonly message: string\n}\n\nexport interface NormalizeDocIdsOptions {\n readonly createId?: () => string\n}\n\nexport interface NormalizeDocIdsResult {\n readonly doc: ProseMirrorNode\n readonly changed: boolean\n readonly issues: RefinexDocIssue[]\n}\n\nexport interface CreateRefinexDocOptions {\n readonly schema?: Partial<RefinexSchemaRef>\n readonly metadata?: RefinexDocMetadata\n readonly permissions?: Partial<RefinexDocPermissions>\n}\n\nexport interface ValidateDocOptions extends NormalizeDocIdsOptions {\n readonly mode: 'strict' | 'repair'\n readonly extensions?: readonly RefinexSchemaExtension[]\n readonly allowUnknownExtensions?: boolean\n readonly preserveTrustedBlockIds?: boolean\n}\n\nexport interface ValidateDocResult {\n readonly ok: boolean\n readonly doc?: RefinexDoc\n readonly normalized?: RefinexDoc\n readonly issues: RefinexDocIssue[]\n}\n\nconst blockAttrs = {\n blockId: { default: null },\n metadata: { default: null },\n permissions: { default: null },\n}\n\nconst baseBlockIdNodeNames = new Set([\n 'paragraph',\n 'heading',\n 'blockquote',\n 'list_item',\n 'code_block',\n 'horizontal_rule',\n])\n\nexport const baseNodes: Record<string, RefinexNodeSpec> = {\n doc: { content: 'block+' },\n\n paragraph: {\n attrs: blockAttrs,\n content: 'inline*',\n group: 'block',\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'p' }],\n toDOM() {\n return ['p', 0]\n },\n },\n\n heading: {\n attrs: { level: { default: 1 }, ...blockAttrs },\n content: 'inline*',\n group: 'block',\n defining: true,\n refinexBlockId: 'required',\n parseDOM: [\n { tag: 'h1', attrs: { level: 1 } },\n { tag: 'h2', attrs: { level: 2 } },\n { tag: 'h3', attrs: { level: 3 } },\n { tag: 'h4', attrs: { level: 4 } },\n { tag: 'h5', attrs: { level: 5 } },\n { tag: 'h6', attrs: { level: 6 } },\n ],\n toDOM(node) {\n return [`h${String(node.attrs.level)}`, 0]\n },\n },\n\n blockquote: {\n attrs: blockAttrs,\n content: 'block+',\n group: 'block',\n defining: true,\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'blockquote' }],\n toDOM() {\n return ['blockquote', 0]\n },\n },\n\n bullet_list: {\n attrs: { metadata: { default: null } },\n content: 'list_item+',\n group: 'block',\n parseDOM: [{ tag: 'ul' }],\n toDOM() {\n return ['ul', 0]\n },\n },\n\n ordered_list: {\n attrs: { order: { default: 1 }, metadata: { default: null } },\n content: 'list_item+',\n group: 'block',\n parseDOM: [{\n tag: 'ol',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return { order: el.hasAttribute('start') ? Number(el.getAttribute('start')) : 1 }\n },\n }],\n toDOM(node) {\n return node.attrs.order === 1 ? ['ol', 0] : ['ol', { start: node.attrs.order as number }, 0]\n },\n },\n\n list_item: {\n attrs: blockAttrs,\n content: 'paragraph block*',\n defining: true,\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'li' }],\n toDOM() {\n return ['li', 0]\n },\n },\n\n code_block: {\n attrs: {\n language: { default: null },\n lineNumbers: { default: false },\n startLine: { default: 1 },\n highlightLines: { default: null },\n displayMode: { default: 'source' },\n wrap: { default: false },\n ...blockAttrs,\n },\n content: 'text*',\n marks: '',\n group: 'block',\n code: true,\n defining: true,\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'pre', preserveWhitespace: 'full' }],\n toDOM() {\n return ['pre', ['code', 0]]\n },\n },\n\n horizontal_rule: {\n attrs: blockAttrs,\n group: 'block',\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'hr' }],\n toDOM() {\n return ['hr']\n },\n },\n\n image: {\n attrs: {\n src: {},\n alt: { default: null },\n title: { default: null },\n metadata: { default: null },\n permissions: { default: null },\n },\n inline: true,\n group: 'inline',\n draggable: true,\n parseDOM: [{\n tag: 'img[src]',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return {\n src: el.getAttribute('src'),\n alt: el.getAttribute('alt'),\n title: el.getAttribute('title'),\n }\n },\n }],\n toDOM(node) {\n return ['img', node.attrs]\n },\n },\n\n upload_placeholder: {\n attrs: {\n uploadId: {},\n fileName: { default: null },\n mimeType: { default: null },\n previewSrc: { default: null },\n progress: { default: 0 },\n status: { default: 'uploading' },\n error: { default: null },\n },\n inline: true,\n group: 'inline',\n atom: true,\n selectable: true,\n parseDOM: [{\n tag: 'span[data-rmd-upload-placeholder]',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return {\n uploadId: el.getAttribute('data-upload-id'),\n fileName: el.getAttribute('data-file-name'),\n mimeType: el.getAttribute('data-mime-type'),\n previewSrc: el.getAttribute('data-preview-src'),\n progress: Number(el.getAttribute('data-progress') ?? '0'),\n status: el.getAttribute('data-status') ?? 'uploading',\n error: el.getAttribute('data-error'),\n }\n },\n }],\n toDOM(node) {\n const attrs = node.attrs\n const progress = Math.max(0, Math.min(100, Number(attrs.progress ?? 0)))\n const previewSrc = typeof attrs.previewSrc === 'string' && attrs.previewSrc ? attrs.previewSrc : null\n const fileName = typeof attrs.fileName === 'string' && attrs.fileName ? attrs.fileName : '文件'\n const status = typeof attrs.status === 'string' ? attrs.status : 'uploading'\n const error = typeof attrs.error === 'string' && attrs.error ? attrs.error : '上传失败'\n return [\n 'span',\n {\n 'data-rmd-upload-placeholder': 'true',\n 'data-upload-id': attrs.uploadId as string,\n 'data-file-name': fileName,\n 'data-mime-type': attrs.mimeType as string | null,\n 'data-preview-src': previewSrc,\n 'data-progress': String(progress),\n 'data-status': status,\n 'data-error': status === 'error' ? error : null,\n class: 'rmd-upload-placeholder',\n },\n ['span', { class: 'rmd-upload-preview' }, previewSrc ? ['img', { src: previewSrc, alt: fileName }] : ''],\n ['span', { class: 'rmd-upload-body' },\n ['span', { class: 'rmd-upload-name' }, fileName],\n ['span', { class: 'rmd-upload-progress', role: 'progressbar', 'aria-valuemin': '0', 'aria-valuemax': '100', 'aria-valuenow': String(progress) },\n ['span', { class: 'rmd-upload-progress-fill', style: `width: ${String(progress)}%;` }],\n ],\n ['span', { class: 'rmd-upload-error' }, error],\n ],\n ['button', { type: 'button', 'data-upload-action': 'retry', class: 'rmd-upload-action' }, '重试'],\n ['button', { type: 'button', 'data-upload-action': 'remove', class: 'rmd-upload-action' }, '移除'],\n ]\n },\n },\n\n hard_break: {\n inline: true,\n group: 'inline',\n selectable: false,\n parseDOM: [{ tag: 'br' }],\n toDOM() {\n return ['br']\n },\n },\n\n text: {\n group: 'inline',\n },\n}\n\nexport const baseMarks: Record<string, MarkSpec> = {\n bold: {\n parseDOM: [{ tag: 'strong' }, { tag: 'b' }, { style: 'font-weight=bold' }],\n toDOM() {\n return ['strong', 0]\n },\n },\n\n italic: {\n parseDOM: [{ tag: 'em' }, { tag: 'i' }, { style: 'font-style=italic' }],\n toDOM() {\n return ['em', 0]\n },\n },\n\n code: {\n parseDOM: [{ tag: 'code' }],\n toDOM() {\n return ['code', 0]\n },\n },\n\n link: {\n attrs: {\n href: {},\n title: { default: null },\n target: { default: null },\n rel: { default: 'noopener noreferrer' },\n },\n inclusive: false,\n parseDOM: [{\n tag: 'a[href]',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return {\n href: el.getAttribute('href'),\n title: el.getAttribute('title'),\n target: el.getAttribute('target'),\n rel: el.getAttribute('rel') || 'noopener noreferrer',\n }\n },\n }],\n toDOM(mark) {\n return ['a', mark.attrs, 0]\n },\n },\n\n strikethrough: {\n parseDOM: [{ tag: 's' }, { tag: 'del' }],\n toDOM() {\n return ['s', 0]\n },\n },\n\n underline: {\n parseDOM: [{ tag: 'u' }, { style: 'text-decoration=underline' }],\n toDOM() {\n return ['u', 0]\n },\n },\n\n text_color: {\n attrs: {\n color: { default: null },\n },\n parseDOM: [{\n style: 'color',\n getAttrs(value) {\n if (typeof value !== 'string' || !value.trim()) return false\n return { color: value.trim() }\n },\n }],\n toDOM(mark) {\n const color = mark.attrs.color\n if (typeof color !== 'string' || !color.trim()) return ['span', 0]\n return ['span', { style: `color: ${color}` }, 0]\n },\n },\n\n text_background_color: {\n attrs: {\n backgroundColor: { default: null },\n },\n parseDOM: [{\n style: 'background-color',\n getAttrs(value) {\n if (typeof value !== 'string' || !value.trim()) return false\n return { backgroundColor: value.trim() }\n },\n }],\n toDOM(mark) {\n const backgroundColor = mark.attrs.backgroundColor\n if (typeof backgroundColor !== 'string' || !backgroundColor.trim()) return ['span', 0]\n return ['span', { style: `background-color: ${backgroundColor}` }, 0]\n },\n },\n}\n\nexport function registerNodeSpec(\n name: string,\n spec: NodeSpec,\n options: RegisterNodeSpecOptions = {},\n): RefinexNodeExtension {\n return {\n kind: 'node',\n name,\n version: options.version ?? '1.0.0',\n spec: { ...spec, refinexBlockId: options.blockId },\n placement: options.placement,\n blockId: options.blockId ?? 'forbidden',\n capabilities: [...(options.capabilities ?? [])],\n fallback: options.fallback ?? 'paragraph',\n markdown: options.markdown,\n migration: options.migration,\n }\n}\n\nexport function registerMarkSpec(\n name: string,\n spec: MarkSpec,\n options: RegisterMarkSpecOptions = {},\n): RefinexMarkExtension {\n return {\n kind: 'mark',\n name,\n version: options.version ?? '1.0.0',\n spec,\n placement: options.placement,\n capabilities: [...(options.capabilities ?? [])],\n fallback: options.fallback ?? 'drop',\n markdown: options.markdown,\n migration: options.migration,\n }\n}\n\nexport function createRefinexSchema(options: CreateRefinexSchemaOptions = {}): Schema {\n const nodes: Record<string, RefinexNodeSpec> = { ...baseNodes }\n const marks: Record<string, MarkSpec> = { ...baseMarks }\n const names = new Set([...Object.keys(nodes), ...Object.keys(marks)])\n\n for (const extension of options.extensions ?? []) {\n assertExtensionName(extension.name)\n if (names.has(extension.name)) {\n throw new Error(`Extension name \"${extension.name}\" is reserved or already registered.`)\n }\n names.add(extension.name)\n\n if (extension.kind === 'node') {\n validateNodeExtension(extension)\n nodes[extension.name] = { ...extension.spec, refinexBlockId: extension.blockId }\n } else {\n marks[extension.name] = extension.spec\n }\n }\n\n return new Schema({ nodes, marks })\n}\n\nexport const defaultSchema = createRefinexSchema()\nexport const schema = defaultSchema\n\nexport function createBlockId(): string {\n const bytes = new Uint8Array(12)\n globalThis.crypto?.getRandomValues(bytes)\n const suffix = Array.from(bytes, (byte) => byte.toString(36).padStart(2, '0')).join('').slice(0, 24)\n return `blk_${suffix}`\n}\n\nexport function isBlockIdNode(node: NodeType | ProseMirrorNodeJSON): boolean {\n if ('spec' in node) {\n return (node.spec as RefinexNodeSpec).refinexBlockId === 'required' || baseBlockIdNodeNames.has(node.name)\n }\n return baseBlockIdNodeNames.has(node.type)\n}\n\nexport function normalizeDocIds(\n doc: ProseMirrorNode,\n _schema: Schema,\n options: NormalizeDocIdsOptions = {},\n): NormalizeDocIdsResult {\n const createId = options.createId ?? createBlockId\n const seen = new Set<string>()\n const issues: RefinexDocIssue[] = []\n let changed = false\n\n function normalizeNode(node: ProseMirrorNode, path: string): ProseMirrorNode {\n if (node.isText) return node\n\n let attrs = node.attrs\n if (isBlockIdNode(node.type)) {\n const blockId = attrs.blockId\n if (typeof blockId !== 'string' || blockId.length === 0) {\n attrs = { ...attrs, blockId: createId() }\n changed = true\n issues.push(issue('BLOCK_ID_MISSING', 'warn', `${path}.attrs.blockId`, 'Missing blockId was generated.'))\n } else if (!isValidBlockId(blockId)) {\n attrs = { ...attrs, blockId: createId() }\n changed = true\n issues.push(issue('BLOCK_ID_INVALID', 'warn', `${path}.attrs.blockId`, 'Invalid blockId was replaced.'))\n } else if (seen.has(blockId)) {\n attrs = { ...attrs, blockId: createId() }\n changed = true\n issues.push(issue('BLOCK_ID_DUPLICATE', 'warn', `${path}.attrs.blockId`, 'Duplicate blockId was replaced.'))\n }\n seen.add(attrs.blockId as string)\n } else if ('blockId' in attrs) {\n const { blockId: _blockId, ...rest } = attrs\n attrs = rest\n changed = true\n issues.push(issue('BLOCK_ID_FORBIDDEN', 'warn', `${path}.attrs.blockId`, 'Forbidden blockId was removed.'))\n }\n\n const children: ProseMirrorNode[] = []\n node.forEach((child, _offset, index) => {\n children.push(normalizeNode(child, `${path}.content[${index}]`))\n })\n\n const content = children.length > 0 ? Fragment.fromArray(children) : Fragment.empty\n const sameContent = children.length === node.childCount && children.every((child, index) => child.eq(node.child(index)))\n return attrs === node.attrs && sameContent ? node : node.type.create(attrs, content, node.marks)\n }\n\n return { doc: normalizeNode(doc, '$'), changed, issues }\n}\n\nconst blockIdPluginKey = new PluginKey('refinexBlockId')\n\nexport function createBlockIdPlugin(options: NormalizeDocIdsOptions = {}): Plugin {\n return new Plugin({\n key: blockIdPluginKey,\n appendTransaction(transactions, _oldState, newState) {\n if (transactions.some((transaction) => transaction.getMeta(blockIdPluginKey))) return null\n if (!transactions.some((transaction) => transaction.docChanged)) return null\n\n const createId = options.createId ?? createBlockId\n const seen = new Set<string>()\n const updates: Array<{ pos: number; attrs: Record<string, unknown> }> = []\n\n newState.doc.descendants((node, pos) => {\n if (!isBlockIdNode(node.type)) return true\n const blockId = node.attrs.blockId\n if (typeof blockId !== 'string' || !isValidBlockId(blockId) || seen.has(blockId)) {\n updates.push({ pos, attrs: { ...node.attrs, blockId: createId() } })\n return true\n }\n seen.add(blockId)\n return true\n })\n\n if (updates.length === 0) return null\n const tr = newState.tr\n for (const update of updates) {\n tr.setNodeMarkup(update.pos, undefined, update.attrs)\n }\n tr.setMeta(blockIdPluginKey, true)\n return tr\n },\n })\n}\n\nexport function createRefinexDoc(\n content: ProseMirrorNode | ProseMirrorDocJSON,\n options: CreateRefinexDocOptions = {},\n): RefinexDoc {\n const contentJSON = content instanceof ProseMirrorNode ? content.toJSON() as ProseMirrorDocJSON : content\n return {\n refinexDocVersion: REFINEX_DOC_VERSION,\n schema: {\n id: REFINEX_SCHEMA_ID,\n version: options.schema?.version ?? REFINEX_SCHEMA_VERSION,\n extensions: options.schema?.extensions ?? [],\n },\n metadata: options.metadata ?? {},\n permissions: {\n policyVersion: '1.0',\n defaultAccess: options.permissions?.defaultAccess ?? 'read-write',\n blockOverrides: options.permissions?.blockOverrides,\n custom: options.permissions?.custom,\n },\n content: contentJSON,\n }\n}\n\nexport function validateDoc(input: unknown, options: ValidateDocOptions): ValidateDocResult {\n const issues: RefinexDocIssue[] = []\n if (!isRecord(input)) {\n return {\n ok: false,\n issues: [issue('CONTENT_INVALID', 'error', '$', 'RefinexDoc must be an object.')],\n }\n }\n\n const refinexDoc = input as unknown as RefinexDoc\n if (refinexDoc.refinexDocVersion !== REFINEX_DOC_VERSION) {\n issues.push(issue('DOC_VERSION_UNSUPPORTED', 'error', '$.refinexDocVersion', 'Unsupported RefinexDoc version.'))\n }\n if (!isRecord(refinexDoc.schema) || refinexDoc.schema.version !== REFINEX_SCHEMA_VERSION) {\n issues.push(issue('SCHEMA_VERSION_UNSUPPORTED', 'error', '$.schema.version', 'Unsupported schema version.'))\n }\n if (!isRecord(refinexDoc.content) || refinexDoc.content.type !== 'doc') {\n issues.push(issue('CONTENT_INVALID', 'error', '$.content', 'Content must be a ProseMirror doc JSON object.'))\n }\n if (issues.some((entry) => entry.severity === 'error')) {\n return { ok: false, issues }\n }\n\n const schema = createRefinexSchema({ extensions: options.extensions })\n const extensionIssues = findMissingExtensions(refinexDoc, options.extensions ?? [])\n issues.push(...extensionIssues)\n\n const preflight = preflightNode(refinexDoc.content, schema, '$.content', options.mode)\n issues.push(...preflight.issues)\n if (options.mode === 'strict' && issues.some((entry) => entry.severity === 'error')) {\n return { ok: false, issues }\n }\n\n let parsed: ProseMirrorNode\n try {\n parsed = schema.nodeFromJSON(preflight.node)\n parsed.check()\n } catch (error) {\n return {\n ok: false,\n issues: [\n ...issues,\n issue('CONTENT_INVALID', 'error', '$.content', error instanceof Error ? error.message : 'Invalid content.'),\n ],\n }\n }\n\n const normalized = normalizeDocIds(parsed, schema, { createId: options.createId })\n issues.push(...normalized.issues)\n\n if (options.mode === 'strict' && normalized.issues.length > 0) {\n return { ok: false, issues }\n }\n\n const nextDoc = createRefinexDoc(normalized.doc, {\n schema: refinexDoc.schema,\n metadata: refinexDoc.metadata,\n permissions: refinexDoc.permissions,\n })\n\n return options.mode === 'repair' && (preflight.changed || normalized.changed)\n ? { ok: true, normalized: nextDoc, issues }\n : { ok: issues.every((entry) => entry.severity !== 'error'), doc: nextDoc, issues }\n}\n\nfunction assertExtensionName(name: string): void {\n if (!/^[a-z][a-z0-9_]*$/.test(name)) {\n throw new Error(`Extension name \"${name}\" must use snake_case.`)\n }\n}\n\nfunction validateNodeExtension(extension: RefinexNodeExtension): void {\n const inline = extension.spec.inline === true || extension.spec.group === 'inline'\n if (inline && extension.blockId === 'required') {\n throw new Error(`Inline node \"${extension.name}\" cannot require blockId.`)\n }\n if (extension.blockId !== 'required' && extension.spec.attrs?.blockId) {\n throw new Error(`Node \"${extension.name}\" declares blockId attr but does not require blockId.`)\n }\n if (extension.blockId === 'required' && !extension.spec.attrs?.blockId) {\n throw new Error(`Node \"${extension.name}\" requires a blockId attr.`)\n }\n}\n\nfunction isValidBlockId(value: string): boolean {\n return /^blk_[A-Za-z0-9_-]{8,36}$/.test(value)\n}\n\nfunction issue(\n code: RefinexIssueCode,\n severity: RefinexIssueSeverity,\n path: string,\n message: string,\n): RefinexDocIssue {\n return { code, severity, path, message }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction findMissingExtensions(\n refinexDoc: RefinexDoc,\n extensions: readonly RefinexSchemaExtension[],\n): RefinexDocIssue[] {\n const registered = new Set(extensions.map((extension) => extension.name))\n return refinexDoc.schema.extensions\n .filter((extension) => !registered.has(extension.name))\n .map((extension, index) => issue(\n 'EXTENSION_MISSING',\n 'error',\n `$.schema.extensions[${index}]`,\n `Missing schema extension \"${extension.name}\".`,\n ))\n}\n\ninterface PreflightResult {\n readonly node: ProseMirrorNodeJSON\n readonly issues: RefinexDocIssue[]\n readonly changed: boolean\n}\n\nfunction preflightNode(\n node: ProseMirrorNodeJSON,\n schema: Schema,\n path: string,\n mode: 'strict' | 'repair',\n): PreflightResult {\n const issues: RefinexDocIssue[] = []\n let changed = false\n\n if (!schema.nodes[node.type]) {\n issues.push(issue('NODE_UNKNOWN', mode === 'repair' ? 'warn' : 'error', path, `Unknown node \"${node.type}\".`))\n if (mode === 'repair') {\n issues.push(issue('FALLBACK_APPLIED', 'info', path, `Unknown node \"${node.type}\" converted to paragraph.`))\n return {\n node: {\n type: 'paragraph',\n attrs: { blockId: null },\n content: textContentOf(node).length > 0 ? [{ type: 'text', text: textContentOf(node) }] : undefined,\n },\n issues,\n changed: true,\n }\n }\n return { node, issues, changed: false }\n }\n\n const attrs = { ...(node.attrs ?? {}) }\n if (node.type === 'heading' && !isValidHeadingLevel(attrs.level)) {\n issues.push(issue('ATTR_INVALID', mode === 'repair' ? 'warn' : 'error', `${path}.attrs.level`, 'Heading level must be 1-6.'))\n if (mode === 'repair') {\n attrs.level = 1\n changed = true\n }\n }\n\n const content = node.content?.map((child, index) => {\n const result = preflightNode(child, schema, `${path}.content[${index}]`, mode)\n issues.push(...result.issues)\n if (result.changed) changed = true\n return result.node\n })\n\n const marks = node.marks?.flatMap((mark, index) => {\n if (!schema.marks[mark.type]) {\n issues.push(issue('MARK_UNKNOWN', mode === 'repair' ? 'warn' : 'error', `${path}.marks[${index}]`, `Unknown mark \"${mark.type}\".`))\n if (mode === 'repair') {\n issues.push(issue('FALLBACK_APPLIED', 'info', `${path}.marks[${index}]`, `Unknown mark \"${mark.type}\" dropped.`))\n changed = true\n return []\n }\n }\n if (mark.type === 'link' && !isSafeHref(mark.attrs?.href)) {\n issues.push(issue('ATTR_INVALID', mode === 'repair' ? 'warn' : 'error', `${path}.marks[${index}].attrs.href`, 'Unsafe link href.'))\n if (mode === 'repair') {\n changed = true\n return []\n }\n }\n return [mark]\n })\n\n const nextNode: ProseMirrorNodeJSON = {\n ...node,\n attrs: Object.keys(attrs).length > 0 ? attrs : undefined,\n content,\n marks: marks && marks.length > 0 ? marks : undefined,\n }\n return { node: nextNode, issues, changed }\n}\n\nfunction isValidHeadingLevel(value: unknown): boolean {\n return Number.isInteger(value) && typeof value === 'number' && value >= 1 && value <= 6\n}\n\nfunction isSafeHref(value: unknown): boolean {\n if (typeof value !== 'string') return false\n try {\n const url = new URL(value, 'https://refinex.local')\n return ['http:', 'https:', 'mailto:'].includes(url.protocol)\n } catch {\n return false\n }\n}\n\nfunction textContentOf(node: ProseMirrorNodeJSON): string {\n if (typeof node.text === 'string') return node.text\n return node.content?.map((child) => textContentOf(child)).join('') ?? ''\n}\n\nexport * from './rich-blocks'\n"],"names":["richBlockAttrs","richCapabilities","defineNode","name","spec","options","blockId","richBlockExtensionNames","createRichBlockSchemaExtensions","specs","tableNodes","dom","align","value","attrs","width","el","image","normalizeAlign","normalizePercent","normalizeImageStatus","node","normalizeCalloutKind","normalizeToggleCollapsed","collapsed","normalizeEmbedType","normalizeEmbedStatus","normalizeDividerVariant","richBlockSchemaExtensions","numeric","REFINEX_DOC_VERSION","REFINEX_SCHEMA_ID","REFINEX_SCHEMA_VERSION","blockAttrs","baseBlockIdNodeNames","baseNodes","progress","previewSrc","fileName","status","error","baseMarks","mark","color","backgroundColor","registerNodeSpec","registerMarkSpec","createRefinexSchema","nodes","marks","names","extension","assertExtensionName","validateNodeExtension","Schema","defaultSchema","schema","createBlockId","bytes","_a","byte","isBlockIdNode","normalizeDocIds","doc","_schema","createId","seen","issues","changed","normalizeNode","path","issue","isValidBlockId","_blockId","rest","children","child","_offset","index","content","Fragment","sameContent","blockIdPluginKey","PluginKey","createBlockIdPlugin","Plugin","transactions","_oldState","newState","transaction","updates","pos","tr","update","createRefinexDoc","contentJSON","ProseMirrorNode","_b","_c","_d","_e","validateDoc","input","isRecord","refinexDoc","entry","extensionIssues","findMissingExtensions","preflight","preflightNode","parsed","normalized","nextDoc","code","severity","message","extensions","registered","mode","textContentOf","isValidHeadingLevel","result","isSafeHref","url"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/rich-blocks.ts","../src/index.ts"],"sourcesContent":["import { tableNodes } from 'prosemirror-tables';\nimport type { NodeSpec } from 'prosemirror-model';\n\nimport type { RefinexNodeExtension, RefinexSchemaExtension } from './index';\n\nconst TABLE_TEXT_COLORS = {\n gray: '#7c7c78',\n brown: '#9f6b53',\n orange: '#d9730d',\n yellow: '#cb912f',\n green: '#448361',\n blue: '#337ea9',\n purple: '#9065b0',\n pink: '#c14c8a',\n red: '#d44c47',\n} as const;\n\nconst TABLE_BACKGROUND_COLORS = {\n gray: '#f1f1ef',\n brown: '#f4eeee',\n orange: '#faebdd',\n yellow: '#fbf3db',\n green: '#edf3ec',\n blue: '#e7f3f8',\n purple: '#f6f3f9',\n pink: '#f9f2f5',\n red: '#fdebec',\n} as const;\n\nconst richBlockAttrs = {\n blockId: { default: null },\n metadata: { default: null },\n permissions: { default: null },\n};\n\nconst richCapabilities = ['doc:read', 'doc:write'];\n\nfunction defineNode(\n name: string,\n spec: NodeSpec,\n options: {\n readonly blockId?: 'required' | 'forbidden';\n readonly fallback?: RefinexNodeExtension['fallback'];\n readonly markdown?: string;\n } = {},\n): RefinexNodeExtension {\n const blockId = options.blockId ?? 'forbidden';\n return {\n kind: 'node',\n name,\n version: '1.0.0',\n spec: { ...spec, refinexBlockId: blockId },\n blockId,\n capabilities: richCapabilities,\n fallback: options.fallback ?? 'paragraph',\n markdown: options.markdown ? { format: options.markdown } : undefined,\n };\n}\n\nexport type ImageBlockAlign = 'left' | 'center' | 'right';\nexport type ImageBlockStatus = 'empty' | 'ready' | 'uploading' | 'error';\nexport type CalloutKind = 'note' | 'tip' | 'important' | 'warning' | 'caution';\nexport type EmbedType = 'bookmark' | 'iframe' | 'oembed';\nexport type EmbedStatus = 'unresolved' | 'loading' | 'ready' | 'error';\nexport type DividerVariant = 'solid' | 'dashed' | 'dotted';\nexport type TableLayout = 'auto' | 'fixed';\nexport type MathBlockAlign = 'center' | 'left';\nexport interface ToggleItemAttrs {\n readonly collapsed: boolean;\n readonly blockId: string | null;\n readonly metadata: Record<string, unknown> | null;\n readonly permissions: Record<string, unknown> | null;\n}\n\nexport const richBlockExtensionNames = [\n 'image_block',\n 'callout',\n 'task_list',\n 'task_item',\n 'toggle_list',\n 'toggle_item',\n 'embed_block',\n 'divider',\n 'table',\n 'table_row',\n 'table_cell',\n 'table_header',\n 'math_inline',\n 'math_block',\n] as const;\n\nexport type RichBlockExtensionName = (typeof richBlockExtensionNames)[number];\n\nexport function createRichBlockSchemaExtensions(): RefinexSchemaExtension[] {\n const specs = tableNodes({\n tableGroup: 'block',\n cellContent: 'block+',\n cellAttributes: {\n align: {\n default: null,\n getFromDOM(dom) {\n const align = dom.getAttribute('data-align') ?? dom.style.textAlign;\n return align === 'left' || align === 'center' || align === 'right' ? align : null;\n },\n setDOMAttr(value, attrs) {\n if (value) {\n attrs['data-align'] = value as string;\n attrs.style = `${String(attrs.style ?? '')} text-align: ${String(value)};`.trim();\n }\n },\n },\n background: {\n default: null,\n getFromDOM(dom) {\n return dom.getAttribute('data-background') ?? dom.style.backgroundColor ?? null;\n },\n setDOMAttr(value, attrs) {\n if (value) {\n attrs['data-background'] = value as string;\n attrs.style =\n `${String(attrs.style ?? '')} background-color: ${tableColorValue(value, TABLE_BACKGROUND_COLORS)};`.trim();\n }\n },\n },\n textColor: {\n default: null,\n getFromDOM(dom) {\n return dom.getAttribute('data-text-color') ?? dom.style.color ?? null;\n },\n setDOMAttr(value, attrs) {\n if (value) {\n attrs['data-text-color'] = value as string;\n attrs.style =\n `${String(attrs.style ?? '')} color: ${tableColorValue(value, TABLE_TEXT_COLORS)};`.trim();\n }\n },\n },\n metadata: {\n default: null,\n getFromDOM() {\n return null;\n },\n setDOMAttr() {\n return undefined;\n },\n },\n colwidth: {\n default: null,\n getFromDOM(dom) {\n const value = dom.getAttribute('data-colwidth');\n const width = value ? Number.parseInt(value, 10) : Number.NaN;\n return Number.isFinite(width) && width > 0 ? [width] : null;\n },\n setDOMAttr(value, attrs) {\n if (!Array.isArray(value)) return;\n const width = Number(value[0]);\n if (!Number.isFinite(width) || width <= 0) return;\n attrs['data-colwidth'] = String(width);\n attrs.style =\n `${String(attrs.style ?? '')} width: ${String(width)}px; min-width: ${String(width)}px;`.trim();\n },\n },\n },\n }) as Record<'table' | 'table_row' | 'table_cell' | 'table_header', NodeSpec>;\n\n return [\n defineNode(\n 'image_block',\n {\n group: 'block',\n content: 'inline*',\n attrs: {\n src: {},\n alt: { default: null },\n title: { default: null },\n align: { default: 'center' satisfies ImageBlockAlign },\n widthPercent: { default: 100 },\n aspectRatio: { default: null },\n status: { default: 'ready' satisfies ImageBlockStatus },\n ...richBlockAttrs,\n },\n selectable: true,\n draggable: true,\n defining: true,\n isolating: true,\n parseDOM: [\n {\n tag: 'figure[data-rmd-image-block]',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n const image = el.querySelector('img');\n return {\n src: image?.getAttribute('src') ?? '',\n alt: image?.getAttribute('alt'),\n title: image?.getAttribute('title'),\n align: normalizeAlign(el.getAttribute('data-align')),\n widthPercent: normalizePercent(el.getAttribute('data-width')),\n aspectRatio: el.getAttribute('data-aspect-ratio'),\n status: normalizeImageStatus(el.getAttribute('data-status')),\n };\n },\n },\n ],\n toDOM(node) {\n const width = normalizePercent(node.attrs.widthPercent);\n return [\n 'figure',\n {\n 'data-rmd-image-block': 'true',\n 'data-align': normalizeAlign(node.attrs.align),\n 'data-width': String(width),\n 'data-status': normalizeImageStatus(node.attrs.status),\n class: 'rmd-image-block',\n },\n [\n 'img',\n {\n src: node.attrs.src as string,\n alt: (node.attrs.alt as string | null) ?? '',\n title: node.attrs.title as string | null,\n style: `width: ${String(width)}%;`,\n },\n ],\n ['figcaption', 0],\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'rich-image-block' },\n ),\n\n defineNode(\n 'callout',\n {\n group: 'block',\n content: 'block+',\n attrs: {\n kind: { default: 'note' satisfies CalloutKind },\n title: { default: null },\n icon: { default: null },\n collapsed: { default: false },\n ...richBlockAttrs,\n },\n selectable: true,\n draggable: true,\n defining: true,\n parseDOM: [\n {\n tag: 'aside[data-rmd-callout]',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n return {\n kind: normalizeCalloutKind(el.getAttribute('data-kind')),\n title: el.getAttribute('data-title'),\n icon: el.getAttribute('data-icon'),\n collapsed: el.getAttribute('data-collapsed') === 'true',\n };\n },\n },\n ],\n toDOM(node) {\n return [\n 'aside',\n {\n 'data-rmd-callout': 'true',\n 'data-kind': normalizeCalloutKind(node.attrs.kind),\n 'data-title': node.attrs.title as string | null,\n 'data-icon': node.attrs.icon as string | null,\n 'data-collapsed': String(Boolean(node.attrs.collapsed)),\n class: `rmd-callout rmd-callout-${normalizeCalloutKind(node.attrs.kind)}`,\n },\n 0,\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'gfm-alert' },\n ),\n\n defineNode(\n 'task_list',\n {\n group: 'block',\n content: 'task_item+',\n attrs: { metadata: { default: null } },\n parseDOM: [{ tag: 'ul[data-rmd-task-list]' }],\n toDOM() {\n return ['ul', { 'data-rmd-task-list': 'true', class: 'rmd-task-list' }, 0];\n },\n },\n { fallback: 'paragraph', markdown: 'gfm-task-list' },\n ),\n\n defineNode(\n 'task_item',\n {\n content: 'paragraph block*',\n attrs: {\n checked: { default: false },\n ...richBlockAttrs,\n },\n defining: true,\n parseDOM: [\n {\n tag: 'li[data-rmd-task-item]',\n getAttrs(dom) {\n return { checked: (dom as HTMLElement).getAttribute('data-checked') === 'true' };\n },\n },\n ],\n toDOM(node) {\n return [\n 'li',\n {\n 'data-rmd-task-item': 'true',\n 'data-checked': String(Boolean(node.attrs.checked)),\n class: 'rmd-task-item',\n },\n 0,\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'gfm-task-list' },\n ),\n\n defineNode(\n 'toggle_list',\n {\n group: 'block',\n content: 'toggle_item+',\n attrs: { metadata: { default: null } },\n parseDOM: [{ tag: 'ul[data-rmd-toggle-list]' }],\n toDOM() {\n return ['ul', { 'data-rmd-toggle-list': 'true', class: 'rmd-toggle-list' }, 0];\n },\n },\n { fallback: 'paragraph', markdown: 'refinex-toggle-list' },\n ),\n\n defineNode(\n 'toggle_item',\n {\n content: 'paragraph block*',\n attrs: {\n collapsed: { default: false },\n ...richBlockAttrs,\n },\n selectable: true,\n draggable: true,\n defining: true,\n parseDOM: [\n {\n tag: 'li[data-rmd-toggle-item]',\n getAttrs(dom) {\n return {\n collapsed: normalizeToggleCollapsed(\n (dom as HTMLElement).getAttribute('data-collapsed'),\n ),\n };\n },\n },\n ],\n toDOM(node) {\n const collapsed = normalizeToggleCollapsed(node.attrs.collapsed);\n return [\n 'li',\n {\n 'data-rmd-toggle-item': 'true',\n 'data-collapsed': String(collapsed),\n class: 'rmd-toggle-item',\n },\n 0,\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'refinex-toggle-list' },\n ),\n\n defineNode(\n 'embed_block',\n {\n group: 'block',\n atom: true,\n isolating: true,\n selectable: true,\n draggable: true,\n attrs: {\n url: {},\n provider: { default: null },\n embedType: { default: 'bookmark' satisfies EmbedType },\n title: { default: null },\n description: { default: null },\n thumbnail: { default: null },\n html: { default: null },\n aspectRatio: { default: null },\n status: { default: 'unresolved' satisfies EmbedStatus },\n error: { default: null },\n ...richBlockAttrs,\n },\n parseDOM: [\n {\n tag: 'a[data-rmd-embed-block]',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n return {\n url: el.getAttribute('href') ?? '',\n title: el.getAttribute('data-title') ?? el.textContent,\n provider: el.getAttribute('data-provider'),\n embedType: normalizeEmbedType(el.getAttribute('data-embed-type')),\n status: normalizeEmbedStatus(el.getAttribute('data-status')),\n };\n },\n },\n ],\n toDOM(node) {\n return [\n 'a',\n {\n 'data-rmd-embed-block': 'true',\n href: node.attrs.url as string,\n 'data-provider': node.attrs.provider as string | null,\n 'data-embed-type': normalizeEmbedType(node.attrs.embedType),\n 'data-status': normalizeEmbedStatus(node.attrs.status),\n class: 'rmd-embed-block',\n },\n (node.attrs.title as string | null) ?? (node.attrs.url as string),\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'refinex-block' },\n ),\n\n defineNode(\n 'divider',\n {\n group: 'block',\n attrs: {\n variant: { default: 'solid' satisfies DividerVariant },\n ...richBlockAttrs,\n },\n selectable: true,\n draggable: true,\n parseDOM: [\n {\n tag: 'hr[data-rmd-divider]',\n getAttrs(dom) {\n return {\n variant: normalizeDividerVariant((dom as HTMLElement).getAttribute('data-variant')),\n };\n },\n },\n ],\n toDOM(node) {\n return [\n 'hr',\n {\n 'data-rmd-divider': 'true',\n 'data-variant': normalizeDividerVariant(node.attrs.variant),\n class: `rmd-divider rmd-divider-${normalizeDividerVariant(node.attrs.variant)}`,\n },\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'thematic-break' },\n ),\n\n defineNode(\n 'table',\n {\n ...specs.table,\n attrs: {\n ...(specs.table.attrs ?? {}),\n columnWidths: { default: null },\n layout: { default: 'auto' satisfies TableLayout },\n caption: { default: null },\n ...richBlockAttrs,\n },\n isolating: true,\n selectable: true,\n draggable: true,\n },\n { blockId: 'required', fallback: 'code_block', markdown: 'gfm-table' },\n ),\n defineNode('table_row', specs.table_row, { fallback: 'drop', markdown: 'gfm-table' }),\n defineNode('table_cell', specs.table_cell, { fallback: 'paragraph', markdown: 'gfm-table' }),\n defineNode('table_header', specs.table_header, {\n fallback: 'paragraph',\n markdown: 'gfm-table',\n }),\n\n defineNode(\n 'math_inline',\n {\n inline: true,\n group: 'inline',\n atom: true,\n selectable: true,\n attrs: {\n tex: {},\n metadata: { default: null },\n },\n parseDOM: [\n {\n tag: 'span[data-rmd-math-inline]',\n getAttrs(dom) {\n return { tex: (dom as HTMLElement).getAttribute('data-tex') ?? '' };\n },\n },\n ],\n toDOM(node) {\n return [\n 'span',\n {\n 'data-rmd-math-inline': 'true',\n 'data-tex': node.attrs.tex as string,\n class: 'rmd-math-inline',\n },\n node.attrs.tex as string,\n ];\n },\n },\n { fallback: 'paragraph', markdown: 'remark-math' },\n ),\n\n defineNode(\n 'math_block',\n {\n group: 'block',\n atom: true,\n isolating: true,\n selectable: true,\n draggable: true,\n attrs: {\n tex: {},\n numbered: { default: false },\n label: { default: null },\n align: { default: 'center' satisfies MathBlockAlign },\n ...richBlockAttrs,\n },\n parseDOM: [\n {\n tag: 'div[data-rmd-math-block]',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n return {\n tex: el.getAttribute('data-tex') ?? el.textContent ?? '',\n numbered: el.getAttribute('data-numbered') === 'true',\n label: el.getAttribute('data-label'),\n align: el.getAttribute('data-align') === 'left' ? 'left' : 'center',\n };\n },\n },\n ],\n toDOM(node) {\n return [\n 'div',\n {\n 'data-rmd-math-block': 'true',\n 'data-tex': node.attrs.tex as string,\n 'data-numbered': String(Boolean(node.attrs.numbered)),\n 'data-label': node.attrs.label as string | null,\n 'data-align': node.attrs.align === 'left' ? 'left' : 'center',\n class: 'rmd-math-block',\n },\n node.attrs.tex as string,\n ];\n },\n },\n { blockId: 'required', fallback: 'code_block', markdown: 'remark-math' },\n ),\n ];\n}\n\nexport const richBlockSchemaExtensions = createRichBlockSchemaExtensions();\n\nfunction normalizeAlign(value: unknown): ImageBlockAlign {\n return value === 'left' || value === 'right' ? value : 'center';\n}\n\nfunction normalizePercent(value: unknown): number {\n const numeric = Number(value ?? 100);\n if (!Number.isFinite(numeric)) return 100;\n return Math.max(10, Math.min(100, Math.round(numeric)));\n}\n\nfunction normalizeImageStatus(value: unknown): ImageBlockStatus {\n return value === 'empty' || value === 'uploading' || value === 'error' ? value : 'ready';\n}\n\nfunction normalizeCalloutKind(value: unknown): CalloutKind {\n if (value === 'tip' || value === 'important' || value === 'warning' || value === 'caution')\n return value;\n if (value === 'error') return 'caution';\n return 'note';\n}\n\nfunction normalizeEmbedType(value: unknown): EmbedType {\n return value === 'iframe' || value === 'oembed' ? value : 'bookmark';\n}\n\nfunction normalizeEmbedStatus(value: unknown): EmbedStatus {\n return value === 'loading' || value === 'ready' || value === 'error' ? value : 'unresolved';\n}\n\nfunction normalizeDividerVariant(value: unknown): DividerVariant {\n return value === 'dashed' || value === 'dotted' ? value : 'solid';\n}\n\nfunction normalizeToggleCollapsed(value: unknown): boolean {\n return value === true || value === 'true';\n}\n\nfunction tableColorValue(\n value: unknown,\n palette: Readonly<Record<string, string>>,\n): string {\n const color = String(value);\n return palette[color] ?? color;\n}\n","import { Fragment, Node as ProseMirrorNode, Schema } from 'prosemirror-model'\nimport type { MarkSpec, NodeSpec, NodeType } from 'prosemirror-model'\nimport { Plugin, PluginKey } from 'prosemirror-state'\n\nexport const REFINEX_DOC_VERSION = '1.0.0'\nexport const REFINEX_SCHEMA_ID = '@refinex-md/base'\nexport const REFINEX_SCHEMA_VERSION = '1.0.0'\n\nexport type BlockIdMode = 'required' | 'forbidden' | 'optional'\nexport type RefinexCapabilityToken = 'doc:read' | 'doc:write' | 'network:none' | string\nexport type RefinexSchemaPlacement = 'append' | 'prepend'\nexport type RefinexNodeFallback = 'unwrap' | 'paragraph' | 'code_block' | 'drop'\nexport type RefinexMarkFallback = 'drop' | 'code' | 'link'\n\nexport interface RefinexMarkdownDeclaration {\n readonly format: string\n}\n\nexport interface RefinexMigrationDeclaration {\n readonly from: string\n readonly to: string\n}\n\ntype RefinexNodeSpec = NodeSpec & { refinexBlockId?: BlockIdMode }\n\nexport interface RefinexNodeExtension {\n readonly kind: 'node'\n readonly name: string\n readonly version: string\n readonly spec: RefinexNodeSpec\n readonly placement?: RefinexSchemaPlacement\n readonly blockId?: BlockIdMode\n readonly capabilities: RefinexCapabilityToken[]\n readonly fallback: RefinexNodeFallback\n readonly markdown?: RefinexMarkdownDeclaration\n readonly migration?: RefinexMigrationDeclaration\n}\n\nexport interface RefinexMarkExtension {\n readonly kind: 'mark'\n readonly name: string\n readonly version: string\n readonly spec: MarkSpec\n readonly placement?: RefinexSchemaPlacement\n readonly capabilities: RefinexCapabilityToken[]\n readonly fallback: RefinexMarkFallback\n readonly markdown?: RefinexMarkdownDeclaration\n readonly migration?: RefinexMigrationDeclaration\n}\n\nexport type RefinexSchemaExtension = RefinexNodeExtension | RefinexMarkExtension\n\nexport interface CreateRefinexSchemaOptions {\n readonly extensions?: readonly RefinexSchemaExtension[]\n}\n\nexport interface RegisterNodeSpecOptions {\n readonly version?: string\n readonly placement?: RefinexSchemaPlacement\n readonly blockId?: BlockIdMode\n readonly capabilities?: readonly RefinexCapabilityToken[]\n readonly fallback?: RefinexNodeFallback\n readonly markdown?: RefinexMarkdownDeclaration\n readonly migration?: RefinexMigrationDeclaration\n}\n\nexport interface RegisterMarkSpecOptions {\n readonly version?: string\n readonly placement?: RefinexSchemaPlacement\n readonly capabilities?: readonly RefinexCapabilityToken[]\n readonly fallback?: RefinexMarkFallback\n readonly markdown?: RefinexMarkdownDeclaration\n readonly migration?: RefinexMigrationDeclaration\n}\n\nexport interface ProseMirrorMarkJSON {\n readonly type: string\n readonly attrs?: Record<string, unknown>\n}\n\nexport interface ProseMirrorNodeJSON {\n readonly type: string\n readonly attrs?: Record<string, unknown>\n readonly content?: ProseMirrorNodeJSON[]\n readonly text?: string\n readonly marks?: ProseMirrorMarkJSON[]\n}\n\nexport type ProseMirrorDocJSON = ProseMirrorNodeJSON & { readonly type: 'doc' }\n\nexport interface RefinexExtensionRef {\n readonly name: string\n readonly version: string\n}\n\nexport interface RefinexSchemaRef {\n readonly id: typeof REFINEX_SCHEMA_ID\n readonly version: string\n readonly extensions: RefinexExtensionRef[]\n}\n\nexport interface RefinexBlockPermission {\n readonly access: 'read-write' | 'read-only' | 'comment-only' | 'locked'\n readonly reason?: string\n}\n\nexport interface RefinexDocMetadata {\n readonly docId?: string\n readonly title?: string\n readonly createdAt?: string\n readonly updatedAt?: string\n readonly createdBy?: string\n readonly updatedBy?: string\n readonly source?: 'api' | 'markdown-import' | 'html-import' | 'collab' | 'unknown'\n readonly custom?: Record<string, unknown>\n}\n\nexport interface RefinexDocPermissions {\n readonly policyVersion: '1.0'\n readonly defaultAccess: 'read-write' | 'read-only' | 'comment-only' | 'locked'\n readonly blockOverrides?: Record<string, RefinexBlockPermission>\n readonly custom?: Record<string, unknown>\n}\n\nexport interface RefinexDoc {\n readonly refinexDocVersion: string\n readonly schema: RefinexSchemaRef\n readonly metadata: RefinexDocMetadata\n readonly permissions: RefinexDocPermissions\n readonly content: ProseMirrorDocJSON\n}\n\nexport type RefinexIssueCode =\n | 'DOC_VERSION_UNSUPPORTED'\n | 'SCHEMA_VERSION_UNSUPPORTED'\n | 'EXTENSION_MISSING'\n | 'NODE_UNKNOWN'\n | 'MARK_UNKNOWN'\n | 'CONTENT_INVALID'\n | 'ATTR_INVALID'\n | 'BLOCK_ID_MISSING'\n | 'BLOCK_ID_INVALID'\n | 'BLOCK_ID_DUPLICATE'\n | 'BLOCK_ID_FORBIDDEN'\n | 'FALLBACK_APPLIED'\n\nexport type RefinexIssueSeverity = 'error' | 'warn' | 'info'\n\nexport interface RefinexDocIssue {\n readonly code: RefinexIssueCode\n readonly severity: RefinexIssueSeverity\n readonly path: string\n readonly message: string\n}\n\nexport interface NormalizeDocIdsOptions {\n readonly createId?: () => string\n}\n\nexport interface NormalizeDocIdsResult {\n readonly doc: ProseMirrorNode\n readonly changed: boolean\n readonly issues: RefinexDocIssue[]\n}\n\nexport interface CreateRefinexDocOptions {\n readonly schema?: Partial<RefinexSchemaRef>\n readonly metadata?: RefinexDocMetadata\n readonly permissions?: Partial<RefinexDocPermissions>\n}\n\nexport interface ValidateDocOptions extends NormalizeDocIdsOptions {\n readonly mode: 'strict' | 'repair'\n readonly extensions?: readonly RefinexSchemaExtension[]\n readonly allowUnknownExtensions?: boolean\n readonly preserveTrustedBlockIds?: boolean\n}\n\nexport interface ValidateDocResult {\n readonly ok: boolean\n readonly doc?: RefinexDoc\n readonly normalized?: RefinexDoc\n readonly issues: RefinexDocIssue[]\n}\n\nconst blockAttrs = {\n blockId: { default: null },\n metadata: { default: null },\n permissions: { default: null },\n}\n\nconst baseBlockIdNodeNames = new Set([\n 'paragraph',\n 'heading',\n 'blockquote',\n 'list_item',\n 'code_block',\n 'horizontal_rule',\n])\n\nexport const baseNodes: Record<string, RefinexNodeSpec> = {\n doc: { content: 'block+' },\n\n paragraph: {\n attrs: blockAttrs,\n content: 'inline*',\n group: 'block',\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'p' }],\n toDOM() {\n return ['p', 0]\n },\n },\n\n heading: {\n attrs: { level: { default: 1 }, ...blockAttrs },\n content: 'inline*',\n group: 'block',\n defining: true,\n refinexBlockId: 'required',\n parseDOM: [\n { tag: 'h1', attrs: { level: 1 } },\n { tag: 'h2', attrs: { level: 2 } },\n { tag: 'h3', attrs: { level: 3 } },\n { tag: 'h4', attrs: { level: 4 } },\n { tag: 'h5', attrs: { level: 5 } },\n { tag: 'h6', attrs: { level: 6 } },\n ],\n toDOM(node) {\n return [`h${String(node.attrs.level)}`, 0]\n },\n },\n\n blockquote: {\n attrs: blockAttrs,\n content: 'block+',\n group: 'block',\n defining: true,\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'blockquote' }],\n toDOM() {\n return ['blockquote', 0]\n },\n },\n\n bullet_list: {\n attrs: { metadata: { default: null } },\n content: 'list_item+',\n group: 'block',\n parseDOM: [{ tag: 'ul' }],\n toDOM() {\n return ['ul', 0]\n },\n },\n\n ordered_list: {\n attrs: { order: { default: 1 }, metadata: { default: null } },\n content: 'list_item+',\n group: 'block',\n parseDOM: [{\n tag: 'ol',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return { order: el.hasAttribute('start') ? Number(el.getAttribute('start')) : 1 }\n },\n }],\n toDOM(node) {\n return node.attrs.order === 1 ? ['ol', 0] : ['ol', { start: node.attrs.order as number }, 0]\n },\n },\n\n list_item: {\n attrs: blockAttrs,\n content: 'paragraph block*',\n defining: true,\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'li' }],\n toDOM() {\n return ['li', 0]\n },\n },\n\n code_block: {\n attrs: {\n language: { default: null },\n lineNumbers: { default: false },\n startLine: { default: 1 },\n highlightLines: { default: null },\n displayMode: { default: 'source' },\n wrap: { default: false },\n ...blockAttrs,\n },\n content: 'text*',\n marks: '',\n group: 'block',\n code: true,\n defining: true,\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'pre', preserveWhitespace: 'full' }],\n toDOM() {\n return ['pre', ['code', 0]]\n },\n },\n\n horizontal_rule: {\n attrs: blockAttrs,\n group: 'block',\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'hr' }],\n toDOM() {\n return ['hr']\n },\n },\n\n image: {\n attrs: {\n src: {},\n alt: { default: null },\n title: { default: null },\n metadata: { default: null },\n permissions: { default: null },\n },\n inline: true,\n group: 'inline',\n draggable: true,\n parseDOM: [{\n tag: 'img[src]',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return {\n src: el.getAttribute('src'),\n alt: el.getAttribute('alt'),\n title: el.getAttribute('title'),\n }\n },\n }],\n toDOM(node) {\n return ['img', node.attrs]\n },\n },\n\n upload_placeholder: {\n attrs: {\n uploadId: {},\n fileName: { default: null },\n mimeType: { default: null },\n previewSrc: { default: null },\n progress: { default: 0 },\n status: { default: 'uploading' },\n error: { default: null },\n },\n inline: true,\n group: 'inline',\n atom: true,\n selectable: true,\n parseDOM: [{\n tag: 'span[data-rmd-upload-placeholder]',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return {\n uploadId: el.getAttribute('data-upload-id'),\n fileName: el.getAttribute('data-file-name'),\n mimeType: el.getAttribute('data-mime-type'),\n previewSrc: el.getAttribute('data-preview-src'),\n progress: Number(el.getAttribute('data-progress') ?? '0'),\n status: el.getAttribute('data-status') ?? 'uploading',\n error: el.getAttribute('data-error'),\n }\n },\n }],\n toDOM(node) {\n const attrs = node.attrs\n const progress = Math.max(0, Math.min(100, Number(attrs.progress ?? 0)))\n const previewSrc = typeof attrs.previewSrc === 'string' && attrs.previewSrc ? attrs.previewSrc : null\n const fileName = typeof attrs.fileName === 'string' && attrs.fileName ? attrs.fileName : '文件'\n const status = typeof attrs.status === 'string' ? attrs.status : 'uploading'\n const error = typeof attrs.error === 'string' && attrs.error ? attrs.error : '上传失败'\n return [\n 'span',\n {\n 'data-rmd-upload-placeholder': 'true',\n 'data-upload-id': attrs.uploadId as string,\n 'data-file-name': fileName,\n 'data-mime-type': attrs.mimeType as string | null,\n 'data-preview-src': previewSrc,\n 'data-progress': String(progress),\n 'data-status': status,\n 'data-error': status === 'error' ? error : null,\n class: 'rmd-upload-placeholder',\n },\n ['span', { class: 'rmd-upload-preview' }, previewSrc ? ['img', { src: previewSrc, alt: fileName }] : ''],\n ['span', { class: 'rmd-upload-body' },\n ['span', { class: 'rmd-upload-name' }, fileName],\n ['span', { class: 'rmd-upload-progress', role: 'progressbar', 'aria-valuemin': '0', 'aria-valuemax': '100', 'aria-valuenow': String(progress) },\n ['span', { class: 'rmd-upload-progress-fill', style: `width: ${String(progress)}%;` }],\n ],\n ['span', { class: 'rmd-upload-error' }, error],\n ],\n ['button', { type: 'button', 'data-upload-action': 'retry', class: 'rmd-upload-action' }, '重试'],\n ['button', { type: 'button', 'data-upload-action': 'remove', class: 'rmd-upload-action' }, '移除'],\n ]\n },\n },\n\n hard_break: {\n inline: true,\n group: 'inline',\n selectable: false,\n parseDOM: [{ tag: 'br' }],\n toDOM() {\n return ['br']\n },\n },\n\n text: {\n group: 'inline',\n },\n}\n\nexport const baseMarks: Record<string, MarkSpec> = {\n bold: {\n parseDOM: [{ tag: 'strong' }, { tag: 'b' }, { style: 'font-weight=bold' }],\n toDOM() {\n return ['strong', 0]\n },\n },\n\n italic: {\n parseDOM: [{ tag: 'em' }, { tag: 'i' }, { style: 'font-style=italic' }],\n toDOM() {\n return ['em', 0]\n },\n },\n\n code: {\n parseDOM: [{ tag: 'code' }],\n toDOM() {\n return ['code', 0]\n },\n },\n\n link: {\n attrs: {\n href: {},\n title: { default: null },\n target: { default: null },\n rel: { default: 'noopener noreferrer' },\n },\n inclusive: false,\n parseDOM: [{\n tag: 'a[href]',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return {\n href: el.getAttribute('href'),\n title: el.getAttribute('title'),\n target: el.getAttribute('target'),\n rel: el.getAttribute('rel') || 'noopener noreferrer',\n }\n },\n }],\n toDOM(mark) {\n return ['a', mark.attrs, 0]\n },\n },\n\n strikethrough: {\n parseDOM: [{ tag: 's' }, { tag: 'del' }],\n toDOM() {\n return ['s', 0]\n },\n },\n\n underline: {\n parseDOM: [{ tag: 'u' }, { style: 'text-decoration=underline' }],\n toDOM() {\n return ['u', 0]\n },\n },\n\n text_color: {\n attrs: {\n color: { default: null },\n },\n parseDOM: [{\n style: 'color',\n getAttrs(value) {\n if (typeof value !== 'string' || !value.trim()) return false\n return { color: value.trim() }\n },\n }],\n toDOM(mark) {\n const color = mark.attrs.color\n if (typeof color !== 'string' || !color.trim()) return ['span', 0]\n return ['span', { style: `color: ${color}` }, 0]\n },\n },\n\n text_background_color: {\n attrs: {\n backgroundColor: { default: null },\n },\n parseDOM: [{\n style: 'background-color',\n getAttrs(value) {\n if (typeof value !== 'string' || !value.trim()) return false\n return { backgroundColor: value.trim() }\n },\n }],\n toDOM(mark) {\n const backgroundColor = mark.attrs.backgroundColor\n if (typeof backgroundColor !== 'string' || !backgroundColor.trim()) return ['span', 0]\n return ['span', { style: `background-color: ${backgroundColor}` }, 0]\n },\n },\n}\n\nexport function registerNodeSpec(\n name: string,\n spec: NodeSpec,\n options: RegisterNodeSpecOptions = {},\n): RefinexNodeExtension {\n return {\n kind: 'node',\n name,\n version: options.version ?? '1.0.0',\n spec: { ...spec, refinexBlockId: options.blockId },\n placement: options.placement,\n blockId: options.blockId ?? 'forbidden',\n capabilities: [...(options.capabilities ?? [])],\n fallback: options.fallback ?? 'paragraph',\n markdown: options.markdown,\n migration: options.migration,\n }\n}\n\nexport function registerMarkSpec(\n name: string,\n spec: MarkSpec,\n options: RegisterMarkSpecOptions = {},\n): RefinexMarkExtension {\n return {\n kind: 'mark',\n name,\n version: options.version ?? '1.0.0',\n spec,\n placement: options.placement,\n capabilities: [...(options.capabilities ?? [])],\n fallback: options.fallback ?? 'drop',\n markdown: options.markdown,\n migration: options.migration,\n }\n}\n\nexport function createRefinexSchema(options: CreateRefinexSchemaOptions = {}): Schema {\n const nodes: Record<string, RefinexNodeSpec> = { ...baseNodes }\n const marks: Record<string, MarkSpec> = { ...baseMarks }\n const names = new Set([...Object.keys(nodes), ...Object.keys(marks)])\n\n for (const extension of options.extensions ?? []) {\n assertExtensionName(extension.name)\n if (names.has(extension.name)) {\n throw new Error(`Extension name \"${extension.name}\" is reserved or already registered.`)\n }\n names.add(extension.name)\n\n if (extension.kind === 'node') {\n validateNodeExtension(extension)\n nodes[extension.name] = { ...extension.spec, refinexBlockId: extension.blockId }\n } else {\n marks[extension.name] = extension.spec\n }\n }\n\n return new Schema({ nodes, marks })\n}\n\nexport const defaultSchema = createRefinexSchema()\nexport const schema = defaultSchema\n\nexport function createBlockId(): string {\n const bytes = new Uint8Array(12)\n globalThis.crypto?.getRandomValues(bytes)\n const suffix = Array.from(bytes, (byte) => byte.toString(36).padStart(2, '0')).join('').slice(0, 24)\n return `blk_${suffix}`\n}\n\nexport function isBlockIdNode(node: NodeType | ProseMirrorNodeJSON): boolean {\n if ('spec' in node) {\n return (node.spec as RefinexNodeSpec).refinexBlockId === 'required' || baseBlockIdNodeNames.has(node.name)\n }\n return baseBlockIdNodeNames.has(node.type)\n}\n\nexport function normalizeDocIds(\n doc: ProseMirrorNode,\n _schema: Schema,\n options: NormalizeDocIdsOptions = {},\n): NormalizeDocIdsResult {\n const createId = options.createId ?? createBlockId\n const seen = new Set<string>()\n const issues: RefinexDocIssue[] = []\n let changed = false\n\n function normalizeNode(node: ProseMirrorNode, path: string): ProseMirrorNode {\n if (node.isText) return node\n\n let attrs = node.attrs\n if (isBlockIdNode(node.type)) {\n const blockId = attrs.blockId\n if (typeof blockId !== 'string' || blockId.length === 0) {\n attrs = { ...attrs, blockId: createId() }\n changed = true\n issues.push(issue('BLOCK_ID_MISSING', 'warn', `${path}.attrs.blockId`, 'Missing blockId was generated.'))\n } else if (!isValidBlockId(blockId)) {\n attrs = { ...attrs, blockId: createId() }\n changed = true\n issues.push(issue('BLOCK_ID_INVALID', 'warn', `${path}.attrs.blockId`, 'Invalid blockId was replaced.'))\n } else if (seen.has(blockId)) {\n attrs = { ...attrs, blockId: createId() }\n changed = true\n issues.push(issue('BLOCK_ID_DUPLICATE', 'warn', `${path}.attrs.blockId`, 'Duplicate blockId was replaced.'))\n }\n seen.add(attrs.blockId as string)\n } else if ('blockId' in attrs) {\n const { blockId: _blockId, ...rest } = attrs\n attrs = rest\n changed = true\n issues.push(issue('BLOCK_ID_FORBIDDEN', 'warn', `${path}.attrs.blockId`, 'Forbidden blockId was removed.'))\n }\n\n const children: ProseMirrorNode[] = []\n node.forEach((child, _offset, index) => {\n children.push(normalizeNode(child, `${path}.content[${index}]`))\n })\n\n const content = children.length > 0 ? Fragment.fromArray(children) : Fragment.empty\n const sameContent = children.length === node.childCount && children.every((child, index) => child.eq(node.child(index)))\n return attrs === node.attrs && sameContent ? node : node.type.create(attrs, content, node.marks)\n }\n\n return { doc: normalizeNode(doc, '$'), changed, issues }\n}\n\nconst blockIdPluginKey = new PluginKey('refinexBlockId')\n\nexport function createBlockIdPlugin(options: NormalizeDocIdsOptions = {}): Plugin {\n return new Plugin({\n key: blockIdPluginKey,\n appendTransaction(transactions, _oldState, newState) {\n if (transactions.some((transaction) => transaction.getMeta(blockIdPluginKey))) return null\n if (!transactions.some((transaction) => transaction.docChanged)) return null\n\n const createId = options.createId ?? createBlockId\n const seen = new Set<string>()\n const updates: Array<{ pos: number; attrs: Record<string, unknown> }> = []\n\n newState.doc.descendants((node, pos) => {\n if (!isBlockIdNode(node.type)) return true\n const blockId = node.attrs.blockId\n if (typeof blockId !== 'string' || !isValidBlockId(blockId) || seen.has(blockId)) {\n updates.push({ pos, attrs: { ...node.attrs, blockId: createId() } })\n return true\n }\n seen.add(blockId)\n return true\n })\n\n if (updates.length === 0) return null\n const tr = newState.tr\n for (const update of updates) {\n tr.setNodeMarkup(update.pos, undefined, update.attrs)\n }\n tr.setMeta(blockIdPluginKey, true)\n return tr\n },\n })\n}\n\nexport function createRefinexDoc(\n content: ProseMirrorNode | ProseMirrorDocJSON,\n options: CreateRefinexDocOptions = {},\n): RefinexDoc {\n const contentJSON = content instanceof ProseMirrorNode ? content.toJSON() as ProseMirrorDocJSON : content\n return {\n refinexDocVersion: REFINEX_DOC_VERSION,\n schema: {\n id: REFINEX_SCHEMA_ID,\n version: options.schema?.version ?? REFINEX_SCHEMA_VERSION,\n extensions: options.schema?.extensions ?? [],\n },\n metadata: options.metadata ?? {},\n permissions: {\n policyVersion: '1.0',\n defaultAccess: options.permissions?.defaultAccess ?? 'read-write',\n blockOverrides: options.permissions?.blockOverrides,\n custom: options.permissions?.custom,\n },\n content: contentJSON,\n }\n}\n\nexport function validateDoc(input: unknown, options: ValidateDocOptions): ValidateDocResult {\n const issues: RefinexDocIssue[] = []\n if (!isRecord(input)) {\n return {\n ok: false,\n issues: [issue('CONTENT_INVALID', 'error', '$', 'RefinexDoc must be an object.')],\n }\n }\n\n const refinexDoc = input as unknown as RefinexDoc\n if (refinexDoc.refinexDocVersion !== REFINEX_DOC_VERSION) {\n issues.push(issue('DOC_VERSION_UNSUPPORTED', 'error', '$.refinexDocVersion', 'Unsupported RefinexDoc version.'))\n }\n if (!isRecord(refinexDoc.schema) || refinexDoc.schema.version !== REFINEX_SCHEMA_VERSION) {\n issues.push(issue('SCHEMA_VERSION_UNSUPPORTED', 'error', '$.schema.version', 'Unsupported schema version.'))\n }\n if (!isRecord(refinexDoc.content) || refinexDoc.content.type !== 'doc') {\n issues.push(issue('CONTENT_INVALID', 'error', '$.content', 'Content must be a ProseMirror doc JSON object.'))\n }\n if (issues.some((entry) => entry.severity === 'error')) {\n return { ok: false, issues }\n }\n\n const schema = createRefinexSchema({ extensions: options.extensions })\n const extensionIssues = findMissingExtensions(refinexDoc, options.extensions ?? [])\n issues.push(...extensionIssues)\n\n const preflight = preflightNode(refinexDoc.content, schema, '$.content', options.mode)\n issues.push(...preflight.issues)\n if (options.mode === 'strict' && issues.some((entry) => entry.severity === 'error')) {\n return { ok: false, issues }\n }\n\n let parsed: ProseMirrorNode\n try {\n parsed = schema.nodeFromJSON(preflight.node)\n parsed.check()\n } catch (error) {\n return {\n ok: false,\n issues: [\n ...issues,\n issue('CONTENT_INVALID', 'error', '$.content', error instanceof Error ? error.message : 'Invalid content.'),\n ],\n }\n }\n\n const normalized = normalizeDocIds(parsed, schema, { createId: options.createId })\n issues.push(...normalized.issues)\n\n if (options.mode === 'strict' && normalized.issues.length > 0) {\n return { ok: false, issues }\n }\n\n const nextDoc = createRefinexDoc(normalized.doc, {\n schema: refinexDoc.schema,\n metadata: refinexDoc.metadata,\n permissions: refinexDoc.permissions,\n })\n\n return options.mode === 'repair' && (preflight.changed || normalized.changed)\n ? { ok: true, normalized: nextDoc, issues }\n : { ok: issues.every((entry) => entry.severity !== 'error'), doc: nextDoc, issues }\n}\n\nfunction assertExtensionName(name: string): void {\n if (!/^[a-z][a-z0-9_]*$/.test(name)) {\n throw new Error(`Extension name \"${name}\" must use snake_case.`)\n }\n}\n\nfunction validateNodeExtension(extension: RefinexNodeExtension): void {\n const inline = extension.spec.inline === true || extension.spec.group === 'inline'\n if (inline && extension.blockId === 'required') {\n throw new Error(`Inline node \"${extension.name}\" cannot require blockId.`)\n }\n if (extension.blockId !== 'required' && extension.spec.attrs?.blockId) {\n throw new Error(`Node \"${extension.name}\" declares blockId attr but does not require blockId.`)\n }\n if (extension.blockId === 'required' && !extension.spec.attrs?.blockId) {\n throw new Error(`Node \"${extension.name}\" requires a blockId attr.`)\n }\n}\n\nfunction isValidBlockId(value: string): boolean {\n return /^blk_[A-Za-z0-9_-]{8,36}$/.test(value)\n}\n\nfunction issue(\n code: RefinexIssueCode,\n severity: RefinexIssueSeverity,\n path: string,\n message: string,\n): RefinexDocIssue {\n return { code, severity, path, message }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction findMissingExtensions(\n refinexDoc: RefinexDoc,\n extensions: readonly RefinexSchemaExtension[],\n): RefinexDocIssue[] {\n const registered = new Set(extensions.map((extension) => extension.name))\n return refinexDoc.schema.extensions\n .filter((extension) => !registered.has(extension.name))\n .map((extension, index) => issue(\n 'EXTENSION_MISSING',\n 'error',\n `$.schema.extensions[${index}]`,\n `Missing schema extension \"${extension.name}\".`,\n ))\n}\n\ninterface PreflightResult {\n readonly node: ProseMirrorNodeJSON\n readonly issues: RefinexDocIssue[]\n readonly changed: boolean\n}\n\nfunction preflightNode(\n node: ProseMirrorNodeJSON,\n schema: Schema,\n path: string,\n mode: 'strict' | 'repair',\n): PreflightResult {\n const issues: RefinexDocIssue[] = []\n let changed = false\n\n if (!schema.nodes[node.type]) {\n issues.push(issue('NODE_UNKNOWN', mode === 'repair' ? 'warn' : 'error', path, `Unknown node \"${node.type}\".`))\n if (mode === 'repair') {\n issues.push(issue('FALLBACK_APPLIED', 'info', path, `Unknown node \"${node.type}\" converted to paragraph.`))\n return {\n node: {\n type: 'paragraph',\n attrs: { blockId: null },\n content: textContentOf(node).length > 0 ? [{ type: 'text', text: textContentOf(node) }] : undefined,\n },\n issues,\n changed: true,\n }\n }\n return { node, issues, changed: false }\n }\n\n const attrs = { ...(node.attrs ?? {}) }\n if (node.type === 'heading' && !isValidHeadingLevel(attrs.level)) {\n issues.push(issue('ATTR_INVALID', mode === 'repair' ? 'warn' : 'error', `${path}.attrs.level`, 'Heading level must be 1-6.'))\n if (mode === 'repair') {\n attrs.level = 1\n changed = true\n }\n }\n\n const content = node.content?.map((child, index) => {\n const result = preflightNode(child, schema, `${path}.content[${index}]`, mode)\n issues.push(...result.issues)\n if (result.changed) changed = true\n return result.node\n })\n\n const marks = node.marks?.flatMap((mark, index) => {\n if (!schema.marks[mark.type]) {\n issues.push(issue('MARK_UNKNOWN', mode === 'repair' ? 'warn' : 'error', `${path}.marks[${index}]`, `Unknown mark \"${mark.type}\".`))\n if (mode === 'repair') {\n issues.push(issue('FALLBACK_APPLIED', 'info', `${path}.marks[${index}]`, `Unknown mark \"${mark.type}\" dropped.`))\n changed = true\n return []\n }\n }\n if (mark.type === 'link' && !isSafeHref(mark.attrs?.href)) {\n issues.push(issue('ATTR_INVALID', mode === 'repair' ? 'warn' : 'error', `${path}.marks[${index}].attrs.href`, 'Unsafe link href.'))\n if (mode === 'repair') {\n changed = true\n return []\n }\n }\n return [mark]\n })\n\n const nextNode: ProseMirrorNodeJSON = {\n ...node,\n attrs: Object.keys(attrs).length > 0 ? attrs : undefined,\n content,\n marks: marks && marks.length > 0 ? marks : undefined,\n }\n return { node: nextNode, issues, changed }\n}\n\nfunction isValidHeadingLevel(value: unknown): boolean {\n return Number.isInteger(value) && typeof value === 'number' && value >= 1 && value <= 6\n}\n\nfunction isSafeHref(value: unknown): boolean {\n if (typeof value !== 'string') return false\n try {\n const url = new URL(value, 'https://refinex.local')\n return ['http:', 'https:', 'mailto:'].includes(url.protocol)\n } catch {\n return false\n }\n}\n\nfunction textContentOf(node: ProseMirrorNodeJSON): string {\n if (typeof node.text === 'string') return node.text\n return node.content?.map((child) => textContentOf(child)).join('') ?? ''\n}\n\nexport * from './rich-blocks'\n"],"names":["TABLE_TEXT_COLORS","TABLE_BACKGROUND_COLORS","richBlockAttrs","richCapabilities","defineNode","name","spec","options","blockId","richBlockExtensionNames","createRichBlockSchemaExtensions","specs","tableNodes","dom","align","value","attrs","tableColorValue","width","el","image","normalizeAlign","normalizePercent","normalizeImageStatus","node","normalizeCalloutKind","normalizeToggleCollapsed","collapsed","normalizeEmbedType","normalizeEmbedStatus","normalizeDividerVariant","richBlockSchemaExtensions","numeric","palette","color","REFINEX_DOC_VERSION","REFINEX_SCHEMA_ID","REFINEX_SCHEMA_VERSION","blockAttrs","baseBlockIdNodeNames","baseNodes","progress","previewSrc","fileName","status","error","baseMarks","mark","backgroundColor","registerNodeSpec","registerMarkSpec","createRefinexSchema","nodes","marks","names","extension","assertExtensionName","validateNodeExtension","Schema","defaultSchema","schema","createBlockId","bytes","_a","byte","isBlockIdNode","normalizeDocIds","doc","_schema","createId","seen","issues","changed","normalizeNode","path","issue","isValidBlockId","_blockId","rest","children","child","_offset","index","content","Fragment","sameContent","blockIdPluginKey","PluginKey","createBlockIdPlugin","Plugin","transactions","_oldState","newState","transaction","updates","pos","tr","update","createRefinexDoc","contentJSON","ProseMirrorNode","_b","_c","_d","_e","validateDoc","input","isRecord","refinexDoc","entry","extensionIssues","findMissingExtensions","preflight","preflightNode","parsed","normalized","nextDoc","code","severity","message","extensions","registered","mode","textContentOf","isValidHeadingLevel","result","isSafeHref","url"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rich-blocks.d.ts","sourceRoot":"","sources":["../src/rich-blocks.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAwB,sBAAsB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"rich-blocks.d.ts","sourceRoot":"","sources":["../src/rich-blocks.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAwB,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAwD5E,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC1D,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,OAAO,GAAG,WAAW,GAAG,OAAO,CAAC;AACzE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAC/E,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AACzD,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AACvE,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC3D,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;AAC3C,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC/C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACtD;AAED,eAAO,MAAM,uBAAuB,wMAe1B,CAAC;AAEX,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9E,wBAAgB,+BAA+B,IAAI,sBAAsB,EAAE,CA4d1E;AAED,eAAO,MAAM,yBAAyB,0BAAoC,CAAC"}
|