@emdash-cms/admin 0.36.0 → 0.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{LocaleDirectionProvider-BjVpQpBl.js → LocaleDirectionProvider-De5NKeoi.js} +29 -29
- package/dist/{LocaleDirectionProvider-BjVpQpBl.js.map → LocaleDirectionProvider-De5NKeoi.js.map} +1 -1
- package/dist/index.d.ts +156 -40
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25261 -16398
- package/dist/index.js.map +1 -1
- package/dist/locales/ar/messages.mjs +1 -1
- package/dist/locales/ca/messages.mjs +1 -1
- package/dist/locales/cs/messages.mjs +1 -1
- package/dist/locales/de/messages.mjs +1 -1
- package/dist/locales/en/messages.mjs +1 -1
- package/dist/locales/en-GB/messages.mjs +1 -1
- package/dist/locales/es-419/messages.mjs +1 -1
- package/dist/locales/es-ES/messages.mjs +1 -1
- package/dist/locales/eu/messages.mjs +1 -1
- package/dist/locales/fa/messages.mjs +1 -1
- package/dist/locales/fr/messages.mjs +1 -1
- package/dist/locales/hi/messages.mjs +1 -1
- package/dist/locales/hu/messages.mjs +1 -1
- package/dist/locales/id/messages.mjs +1 -1
- package/dist/locales/index.js +1 -1
- package/dist/locales/ja/messages.mjs +1 -1
- package/dist/locales/ko/messages.mjs +1 -1
- package/dist/locales/nb/messages.mjs +1 -1
- package/dist/locales/nl/messages.mjs +1 -1
- package/dist/locales/pl/messages.mjs +1 -1
- package/dist/locales/pseudo/messages.mjs +1 -1
- package/dist/locales/pt-BR/messages.mjs +1 -1
- package/dist/locales/sr-Latn/messages.mjs +1 -1
- package/dist/locales/sv/messages.mjs +1 -1
- package/dist/locales/th/messages.mjs +1 -1
- package/dist/locales/tr/messages.mjs +1 -1
- package/dist/locales/uk/messages.mjs +1 -1
- package/dist/locales/zh-CN/messages.mjs +1 -1
- package/dist/locales/zh-TW/messages.mjs +1 -1
- package/dist/messages-2iq50Mrp.js +6 -0
- package/dist/messages-2iq50Mrp.js.map +1 -0
- package/dist/messages-8X4jX-v4.js +6 -0
- package/dist/messages-8X4jX-v4.js.map +1 -0
- package/dist/messages-B6z0r_Vc.js +6 -0
- package/dist/messages-B6z0r_Vc.js.map +1 -0
- package/dist/messages-BLp0vicE.js +6 -0
- package/dist/messages-BLp0vicE.js.map +1 -0
- package/dist/messages-BNbYbVuF.js +6 -0
- package/dist/messages-BNbYbVuF.js.map +1 -0
- package/dist/messages-BOsxaIfQ.js +6 -0
- package/dist/messages-BOsxaIfQ.js.map +1 -0
- package/dist/messages-BROOLmUl.js +6 -0
- package/dist/messages-BROOLmUl.js.map +1 -0
- package/dist/messages-BTBvYuXl.js +6 -0
- package/dist/messages-BTBvYuXl.js.map +1 -0
- package/dist/messages-BpJ5WAhv.js +6 -0
- package/dist/messages-BpJ5WAhv.js.map +1 -0
- package/dist/messages-Bx7T19KJ.js +6 -0
- package/dist/messages-Bx7T19KJ.js.map +1 -0
- package/dist/messages-CAdHisFQ.js +6 -0
- package/dist/messages-CAdHisFQ.js.map +1 -0
- package/dist/messages-CI--tvvQ.js +6 -0
- package/dist/messages-CI--tvvQ.js.map +1 -0
- package/dist/messages-CUCrep4W.js +6 -0
- package/dist/messages-CUCrep4W.js.map +1 -0
- package/dist/messages-Clbzj_ak.js +6 -0
- package/dist/messages-Clbzj_ak.js.map +1 -0
- package/dist/messages-CtsxUkxq.js +6 -0
- package/dist/messages-CtsxUkxq.js.map +1 -0
- package/dist/messages-CvcfLPsp.js +6 -0
- package/dist/messages-CvcfLPsp.js.map +1 -0
- package/dist/messages-D24xrFul.js +6 -0
- package/dist/messages-D24xrFul.js.map +1 -0
- package/dist/messages-DDfRxopP.js +6 -0
- package/dist/messages-DDfRxopP.js.map +1 -0
- package/dist/messages-DGQpQLvQ.js +6 -0
- package/dist/messages-DGQpQLvQ.js.map +1 -0
- package/dist/messages-DkHuCyJ6.js +6 -0
- package/dist/messages-DkHuCyJ6.js.map +1 -0
- package/dist/messages-Do5ZNS14.js +6 -0
- package/dist/messages-Do5ZNS14.js.map +1 -0
- package/dist/messages-DrfwSeEc.js +6 -0
- package/dist/messages-DrfwSeEc.js.map +1 -0
- package/dist/messages-GWCchynJ.js +6 -0
- package/dist/messages-GWCchynJ.js.map +1 -0
- package/dist/messages-SBC5khI_.js +6 -0
- package/dist/messages-SBC5khI_.js.map +1 -0
- package/dist/messages-b4AAQXUr.js +6 -0
- package/dist/messages-b4AAQXUr.js.map +1 -0
- package/dist/messages-fKCItBhL.js +6 -0
- package/dist/messages-fKCItBhL.js.map +1 -0
- package/dist/messages-rjE5MiI-.js +6 -0
- package/dist/messages-rjE5MiI-.js.map +1 -0
- package/dist/messages-ulkf82am.js +6 -0
- package/dist/messages-ulkf82am.js.map +1 -0
- package/dist/{plugins-DJsLy2K-.js → plugins-BPVhvih_.js} +16 -1
- package/dist/plugins-BPVhvih_.js.map +1 -0
- package/dist/portable-text-table.d.ts +144 -0
- package/dist/portable-text-table.d.ts.map +1 -0
- package/dist/portable-text-table.js +506 -0
- package/dist/portable-text-table.js.map +1 -0
- package/dist/styles.css +1 -1
- package/package.json +10 -5
- package/dist/messages-3FU8zCct.js +0 -6
- package/dist/messages-3FU8zCct.js.map +0 -1
- package/dist/messages-9k1iDJF6.js +0 -6
- package/dist/messages-9k1iDJF6.js.map +0 -1
- package/dist/messages-B3Q7NUrK.js +0 -6
- package/dist/messages-B3Q7NUrK.js.map +0 -1
- package/dist/messages-BKjrWDoV.js +0 -6
- package/dist/messages-BKjrWDoV.js.map +0 -1
- package/dist/messages-BLxOqfxi.js +0 -6
- package/dist/messages-BLxOqfxi.js.map +0 -1
- package/dist/messages-BUkvBAQ_.js +0 -6
- package/dist/messages-BUkvBAQ_.js.map +0 -1
- package/dist/messages-BYPUIPvx.js +0 -6
- package/dist/messages-BYPUIPvx.js.map +0 -1
- package/dist/messages-BYaDnRZi.js +0 -6
- package/dist/messages-BYaDnRZi.js.map +0 -1
- package/dist/messages-C-omjoCi.js +0 -6
- package/dist/messages-C-omjoCi.js.map +0 -1
- package/dist/messages-CA8gfGRN.js +0 -6
- package/dist/messages-CA8gfGRN.js.map +0 -1
- package/dist/messages-CKCmO_US.js +0 -6
- package/dist/messages-CKCmO_US.js.map +0 -1
- package/dist/messages-CKtyiPlE.js +0 -6
- package/dist/messages-CKtyiPlE.js.map +0 -1
- package/dist/messages-CMlXT2mo.js +0 -6
- package/dist/messages-CMlXT2mo.js.map +0 -1
- package/dist/messages-CSzVxyoV.js +0 -6
- package/dist/messages-CSzVxyoV.js.map +0 -1
- package/dist/messages-CUVVH-l2.js +0 -6
- package/dist/messages-CUVVH-l2.js.map +0 -1
- package/dist/messages-CXBqJPo6.js +0 -6
- package/dist/messages-CXBqJPo6.js.map +0 -1
- package/dist/messages-Cb_WSNlm.js +0 -6
- package/dist/messages-Cb_WSNlm.js.map +0 -1
- package/dist/messages-CiFlbS-H.js +0 -6
- package/dist/messages-CiFlbS-H.js.map +0 -1
- package/dist/messages-CkVoAW1_.js +0 -6
- package/dist/messages-CkVoAW1_.js.map +0 -1
- package/dist/messages-DKYRxT68.js +0 -6
- package/dist/messages-DKYRxT68.js.map +0 -1
- package/dist/messages-DZiI-npH.js +0 -6
- package/dist/messages-DZiI-npH.js.map +0 -1
- package/dist/messages-DrqeFeSw.js +0 -6
- package/dist/messages-DrqeFeSw.js.map +0 -1
- package/dist/messages-UWbNAre2.js +0 -6
- package/dist/messages-UWbNAre2.js.map +0 -1
- package/dist/messages-_-gK_V4q.js +0 -6
- package/dist/messages-_-gK_V4q.js.map +0 -1
- package/dist/messages-ha2_ySOs.js +0 -6
- package/dist/messages-ha2_ySOs.js.map +0 -1
- package/dist/messages-kFHcdfMU.js +0 -6
- package/dist/messages-kFHcdfMU.js.map +0 -1
- package/dist/messages-sJpTSD2G.js +0 -6
- package/dist/messages-sJpTSD2G.js.map +0 -1
- package/dist/messages-vx3-MYVH.js +0 -6
- package/dist/messages-vx3-MYVH.js.map +0 -1
- package/dist/plugins-DJsLy2K-.js.map +0 -1
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
//#region src/portable-text-table.d.ts
|
|
2
|
+
declare const MAX_TABLE_SPAN = 100;
|
|
3
|
+
declare const MAX_TABLE_COLUMN_WIDTH = 4096;
|
|
4
|
+
declare const TABLE_CELL_MIN_WIDTH = 96;
|
|
5
|
+
declare const TABLE_COLUMN_WIDTH_STEP = 16;
|
|
6
|
+
declare const TABLE_RESIZE_HANDLE_WIDTH = 2;
|
|
7
|
+
declare const TABLE_RESIZE_TARGET_WIDTH = 24;
|
|
8
|
+
declare const MAX_TABLE_REPAIRED_SLOTS = 20000;
|
|
9
|
+
declare const MAX_TABLE_PASTE_ROWS = 100;
|
|
10
|
+
declare const MAX_TABLE_PASTE_COLUMNS = 100;
|
|
11
|
+
declare const MAX_TABLE_PASTE_CELLS = 10000;
|
|
12
|
+
declare const MAX_TABLE_PASTE_TEXT_BYTES = 1048576;
|
|
13
|
+
type PortableTextTableAlignment = "left" | "center" | "right" | "justify";
|
|
14
|
+
type PortableTextTableSpan = {
|
|
15
|
+
_type: "span";
|
|
16
|
+
_key: string;
|
|
17
|
+
text: string;
|
|
18
|
+
marks?: string[];
|
|
19
|
+
};
|
|
20
|
+
type PortableTextTableMarkDef = {
|
|
21
|
+
_type: string;
|
|
22
|
+
_key: string;
|
|
23
|
+
[key: string]: unknown;
|
|
24
|
+
};
|
|
25
|
+
interface PortableTextTableCell {
|
|
26
|
+
_type: "tableCell";
|
|
27
|
+
_key: string;
|
|
28
|
+
content: PortableTextTableSpan[];
|
|
29
|
+
markDefs?: PortableTextTableMarkDef[];
|
|
30
|
+
isHeader?: boolean;
|
|
31
|
+
colspan?: number;
|
|
32
|
+
rowspan?: number;
|
|
33
|
+
colwidth?: number[];
|
|
34
|
+
textAlign?: PortableTextTableAlignment;
|
|
35
|
+
[key: string]: unknown;
|
|
36
|
+
}
|
|
37
|
+
interface PortableTextTableRow {
|
|
38
|
+
_type: "tableRow";
|
|
39
|
+
_key: string;
|
|
40
|
+
cells: PortableTextTableCell[];
|
|
41
|
+
[key: string]: unknown;
|
|
42
|
+
}
|
|
43
|
+
interface PortableTextTableBlock {
|
|
44
|
+
_type: "table";
|
|
45
|
+
_key: string;
|
|
46
|
+
rows: PortableTextTableRow[];
|
|
47
|
+
hasHeaderRow?: boolean;
|
|
48
|
+
markDefs?: PortableTextTableMarkDef[];
|
|
49
|
+
[key: string]: unknown;
|
|
50
|
+
}
|
|
51
|
+
interface PortableTextTableProseMirrorNode {
|
|
52
|
+
type: string;
|
|
53
|
+
attrs?: Record<string, unknown>;
|
|
54
|
+
content?: PortableTextTableProseMirrorNode[];
|
|
55
|
+
marks?: Array<{
|
|
56
|
+
type: string;
|
|
57
|
+
attrs?: Record<string, unknown>;
|
|
58
|
+
}>;
|
|
59
|
+
text?: string;
|
|
60
|
+
}
|
|
61
|
+
type UnsafePortableTextTableReason = "INVALID_TABLE" | "TABLE_TOO_LARGE" | "UNSUPPORTED_CELL_CONTENT" | "UNSUPPORTED_MARK_DEFINITION";
|
|
62
|
+
type PortableTextTableContext = {
|
|
63
|
+
path: string;
|
|
64
|
+
createKey: () => string;
|
|
65
|
+
};
|
|
66
|
+
interface PortableTextTableToProseMirrorContext extends PortableTextTableContext {
|
|
67
|
+
spansToInline: (content: PortableTextTableSpan[], markDefs: PortableTextTableMarkDef[]) => PortableTextTableProseMirrorNode[];
|
|
68
|
+
}
|
|
69
|
+
interface ProseMirrorTableToPortableTextContext extends PortableTextTableContext {
|
|
70
|
+
inlineToSpans: (content: PortableTextTableProseMirrorNode[]) => {
|
|
71
|
+
content: PortableTextTableSpan[];
|
|
72
|
+
markDefs?: PortableTextTableMarkDef[];
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
type UnknownRecord = Record<string, unknown>;
|
|
76
|
+
declare class UnsafePortableTextTableError extends Error {
|
|
77
|
+
readonly reason: UnsafePortableTextTableReason;
|
|
78
|
+
readonly raw: unknown;
|
|
79
|
+
readonly renderFallback?: PortableTextTableBlock | undefined;
|
|
80
|
+
readonly code = "UNSAFE_PORTABLE_TEXT_TABLE";
|
|
81
|
+
constructor(reason: UnsafePortableTextTableReason, raw: unknown, renderFallback?: PortableTextTableBlock | undefined);
|
|
82
|
+
}
|
|
83
|
+
declare function isPortableTextTableInput(value: unknown): value is UnknownRecord & {
|
|
84
|
+
_type: "table";
|
|
85
|
+
};
|
|
86
|
+
declare function normalizePortableTextTable(value: unknown, context: PortableTextTableContext): {
|
|
87
|
+
ok: true;
|
|
88
|
+
table: PortableTextTableBlock;
|
|
89
|
+
width: number;
|
|
90
|
+
height: number;
|
|
91
|
+
} | {
|
|
92
|
+
renderFallback?: PortableTextTableBlock | undefined;
|
|
93
|
+
ok: false;
|
|
94
|
+
reason: UnsafePortableTextTableReason;
|
|
95
|
+
raw: unknown;
|
|
96
|
+
};
|
|
97
|
+
declare function portableTextTableToProseMirror(value: unknown, context: PortableTextTableToProseMirrorContext): {
|
|
98
|
+
renderFallback?: PortableTextTableBlock | undefined;
|
|
99
|
+
ok: false;
|
|
100
|
+
reason: UnsafePortableTextTableReason;
|
|
101
|
+
raw: unknown;
|
|
102
|
+
} | {
|
|
103
|
+
ok: true;
|
|
104
|
+
width: number;
|
|
105
|
+
height: number;
|
|
106
|
+
node: {
|
|
107
|
+
type: string;
|
|
108
|
+
attrs: UnknownRecord;
|
|
109
|
+
content: {
|
|
110
|
+
type: string;
|
|
111
|
+
attrs: UnknownRecord;
|
|
112
|
+
content: {
|
|
113
|
+
type: string;
|
|
114
|
+
attrs: {
|
|
115
|
+
colspan: number;
|
|
116
|
+
rowspan: number;
|
|
117
|
+
colwidth: number[] | null;
|
|
118
|
+
textAlign: PortableTextTableAlignment | null;
|
|
119
|
+
};
|
|
120
|
+
content: {
|
|
121
|
+
type: string;
|
|
122
|
+
content: PortableTextTableProseMirrorNode[];
|
|
123
|
+
}[];
|
|
124
|
+
}[];
|
|
125
|
+
}[];
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
declare function proseMirrorTableToPortableText(value: unknown, context: ProseMirrorTableToPortableTextContext): {
|
|
129
|
+
ok: true;
|
|
130
|
+
table: PortableTextTableBlock;
|
|
131
|
+
width: number;
|
|
132
|
+
height: number;
|
|
133
|
+
} | {
|
|
134
|
+
renderFallback?: PortableTextTableBlock | undefined;
|
|
135
|
+
ok: false;
|
|
136
|
+
reason: UnsafePortableTextTableReason;
|
|
137
|
+
raw: unknown;
|
|
138
|
+
};
|
|
139
|
+
declare function getPortableTextTableCellMarkDefs(table: PortableTextTableBlock, cell: PortableTextTableCell): PortableTextTableMarkDef[];
|
|
140
|
+
declare function createPortableTextTableCellMarkResolver(table: PortableTextTableBlock): (cell: PortableTextTableCell) => PortableTextTableMarkDef[];
|
|
141
|
+
declare function getPortableTextTableColumnWidths(table: PortableTextTableBlock): number[] | undefined;
|
|
142
|
+
//#endregion
|
|
143
|
+
export { MAX_TABLE_COLUMN_WIDTH, MAX_TABLE_PASTE_CELLS, MAX_TABLE_PASTE_COLUMNS, MAX_TABLE_PASTE_ROWS, MAX_TABLE_PASTE_TEXT_BYTES, MAX_TABLE_REPAIRED_SLOTS, MAX_TABLE_SPAN, PortableTextTableAlignment, PortableTextTableBlock, PortableTextTableCell, PortableTextTableMarkDef, PortableTextTableProseMirrorNode, PortableTextTableRow, PortableTextTableSpan, TABLE_CELL_MIN_WIDTH, TABLE_COLUMN_WIDTH_STEP, TABLE_RESIZE_HANDLE_WIDTH, TABLE_RESIZE_TARGET_WIDTH, UnsafePortableTextTableError, UnsafePortableTextTableReason, createPortableTextTableCellMarkResolver, getPortableTextTableCellMarkDefs, getPortableTextTableColumnWidths, isPortableTextTableInput, normalizePortableTextTable, portableTextTableToProseMirror, proseMirrorTableToPortableText };
|
|
144
|
+
//# sourceMappingURL=portable-text-table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-text-table.d.ts","names":[],"sources":["../src/portable-text-table.ts"],"mappings":";cAAa,cAAA;AAAA,cACA,sBAAA;AAAA,cACA,oBAAA;AAAA,cACA,uBAAA;AAAA,cACA,yBAAA;AAAA,cACA,yBAAA;AAAA,cACA,wBAAA;AAAA,cACA,oBAAA;AAAA,cACA,uBAAA;AAAA,cACA,qBAAA;AAAA,cACA,0BAAA;AAAA,KAGD,0BAAA;AAAA,KAEA,qBAAA;EAA0B,KAAA;EAAe,IAAA;EAAc,IAAA;EAAc,KAAA;AAAA;AAAA,KAErE,wBAAA;EAA6B,KAAA;EAAe,IAAA;EAAA,CAAe,GAAA;AAAA;AAAA,UAEtD,qBAAA;EAChB,KAAA;EACA,IAAA;EACA,OAAA,EAAS,qBAAA;EACT,QAAA,GAAW,wBAAA;EACX,QAAA;EACA,OAAA;EACA,OAAA;EACA,QAAA;EACA,SAAA,GAAY,0BAAA;EAAA,CACX,GAAA;AAAA;AAAA,UAGe,oBAAA;EAChB,KAAA;EACA,IAAA;EACA,KAAA,EAAO,qBAAA;EAAA,CACN,GAAA;AAAA;AAAA,UAGe,sBAAA;EAChB,KAAA;EACA,IAAA;EACA,IAAA,EAAM,oBAAA;EACN,YAAA;EACA,QAAA,GAAW,wBAAA;EAAA,CACV,GAAA;AAAA;AAAA,UAGe,gCAAA;EAChB,IAAA;EACA,KAAA,GAAQ,MAAA;EACR,OAAA,GAAU,gCAAA;EACV,KAAA,GAAQ,KAAA;IAAQ,IAAA;IAAc,KAAA,GAAQ,MAAA;EAAA;EACtC,IAAA;AAAA;AAAA,KAGW,6BAAA;AAAA,KAMP,wBAAA;EAA6B,IAAA;EAAc,SAAA;AAAA;AAAA,UAEtC,qCAAA,SAA8C,wBAAA;EACvD,aAAA,GACC,OAAA,EAAS,qBAAA,IACT,QAAA,EAAU,wBAAA,OACN,gCAAA;AAAA;AAAA,UAGI,qCAAA,SAA8C,wBAAA;EACvD,aAAA,GAAgB,OAAA,EAAS,gCAAA;IACxB,OAAA,EAAS,qBAAA;IACT,QAAA,GAAW,wBAAA;EAAA;AAAA;AAAA,KAIR,aAAA,GAAgB,MAAA;AAAA,cA4BR,4BAAA,SAAqC,KAAA;EAAA,SAIvC,MAAA,EAAQ,6BAAA;EAAA,SACR,GAAA;EAAA,SACA,cAAA,GAAiB,sBAAA;EAAA,SALlB,IAAA;cAGC,MAAA,EAAQ,6BAAA,EACR,GAAA,WACA,cAAA,GAAiB,sBAAA;AAAA;AAAA,iBAOZ,wBAAA,CACf,KAAA,YACE,KAAA,IAAS,aAAA;EAAkB,KAAA;AAAA;AAAA,iBAId,0BAAA,CAA2B,KAAA,WAAgB,OAAA,EAAS,wBAAA;;;;;;;;;;;iBAiJpD,8BAAA,CACf,KAAA,WACA,OAAA,EAAS,qCAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqCM,8BAAA,CACf,KAAA,WACA,OAAA,EAAS,qCAAA;;;;;;;;;;;iBA6FM,gCAAA,CACf,KAAA,EAAO,sBAAA,EACP,IAAA,EAAM,qBAAA,GACJ,wBAAA;AAAA,iBAIa,uCAAA,CAAwC,KAAA,EAAO,sBAAA,IAEtD,IAAA,EAAM,qBAAA,KAAwB,wBAAA;AAAA,iBAavB,gCAAA,CACf,KAAA,EAAO,sBAAA"}
|
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
//#region src/portable-text-table.ts
|
|
2
|
+
const MAX_TABLE_SPAN = 100;
|
|
3
|
+
const MAX_TABLE_COLUMN_WIDTH = 4096;
|
|
4
|
+
const TABLE_CELL_MIN_WIDTH = 96;
|
|
5
|
+
const TABLE_COLUMN_WIDTH_STEP = 16;
|
|
6
|
+
const TABLE_RESIZE_HANDLE_WIDTH = 2;
|
|
7
|
+
const TABLE_RESIZE_TARGET_WIDTH = 24;
|
|
8
|
+
const MAX_TABLE_REPAIRED_SLOTS = 2e4;
|
|
9
|
+
const MAX_TABLE_PASTE_ROWS = 100;
|
|
10
|
+
const MAX_TABLE_PASTE_COLUMNS = 100;
|
|
11
|
+
const MAX_TABLE_PASTE_CELLS = 1e4;
|
|
12
|
+
const MAX_TABLE_PASTE_TEXT_BYTES = 1048576;
|
|
13
|
+
const MAX_TABLE_SOURCE_ENTRIES = MAX_TABLE_REPAIRED_SLOTS * 4;
|
|
14
|
+
var NormalizationFailure = class extends Error {
|
|
15
|
+
constructor(reason) {
|
|
16
|
+
super();
|
|
17
|
+
this.reason = reason;
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
const fail = (reason) => {
|
|
21
|
+
throw new NormalizationFailure(reason);
|
|
22
|
+
};
|
|
23
|
+
const DECORATOR_MARKS = new Set("strong em underline strike-through subscript superscript code".split(" "));
|
|
24
|
+
const TABLE_FIELDS = new Set("_type _key rows hasHeaderRow markDefs".split(" "));
|
|
25
|
+
const ROW_FIELDS = new Set("_type _key cells".split(" "));
|
|
26
|
+
const CELL_FIELDS = new Set("_type _key content markDefs isHeader colspan rowspan colwidth textAlign".split(" "));
|
|
27
|
+
const DOM_FIELD = /^(?:aria-|data-|class(?:name)?$|id$|role$|style$|on(?:animation(?:end|iteration|start)|beforeinput|blur|change|click|contextmenu|copy|cut|drag|drop|error|focus|input|key(?:down|press|up)|load|mouse(?:down|move|up)|paste|pointer(?:down|move|up)|scroll|submit|touch(?:end|move|start)|transition(?:cancel|end|run|start)|wheel)$)/i;
|
|
28
|
+
var UnsafePortableTextTableError = class extends Error {
|
|
29
|
+
code = "UNSAFE_PORTABLE_TEXT_TABLE";
|
|
30
|
+
constructor(reason, raw, renderFallback) {
|
|
31
|
+
super(`Unsafe Portable Text table: ${reason}`);
|
|
32
|
+
this.reason = reason;
|
|
33
|
+
this.raw = raw;
|
|
34
|
+
this.renderFallback = renderFallback;
|
|
35
|
+
this.name = "UnsafePortableTextTableError";
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
function isPortableTextTableInput(value) {
|
|
39
|
+
return isRecord(value) && value._type === "table";
|
|
40
|
+
}
|
|
41
|
+
function normalizePortableTextTable(value, context) {
|
|
42
|
+
return catchFailure(value, context, () => normalizeTable(value, context));
|
|
43
|
+
}
|
|
44
|
+
function normalizeTable(value, context) {
|
|
45
|
+
if (!isPortableTextTableInput(value) || value.rows !== void 0 && !Array.isArray(value.rows)) return fail("INVALID_TABLE");
|
|
46
|
+
const rawRows = Array.isArray(value.rows) ? value.rows : [];
|
|
47
|
+
let sourceCells = 0;
|
|
48
|
+
let sourceEntries = rawRows.length + (Array.isArray(value.markDefs) ? value.markDefs.length : 0);
|
|
49
|
+
for (const row of rawRows) {
|
|
50
|
+
if (!isRecord(row) || !Array.isArray(row.cells)) continue;
|
|
51
|
+
sourceCells += row.cells.length;
|
|
52
|
+
sourceEntries += row.cells.length;
|
|
53
|
+
for (const cell of row.cells) {
|
|
54
|
+
if (!isRecord(cell)) continue;
|
|
55
|
+
if (Array.isArray(cell.content)) sourceEntries += cell.content.length;
|
|
56
|
+
if (Array.isArray(cell.markDefs)) sourceEntries += cell.markDefs.length;
|
|
57
|
+
}
|
|
58
|
+
if (sourceCells > MAX_TABLE_REPAIRED_SLOTS || sourceEntries > MAX_TABLE_SOURCE_ENTRIES) return fail("TABLE_TOO_LARGE");
|
|
59
|
+
}
|
|
60
|
+
if (sourceEntries > MAX_TABLE_SOURCE_ENTRIES) return fail("TABLE_TOO_LARGE");
|
|
61
|
+
const seen = /* @__PURE__ */ new Set();
|
|
62
|
+
const tableKey = reserveKey(readKey(value._key) ?? legacyKey(`${context.path}:table`), seen);
|
|
63
|
+
const tableMarkDefs = normalizeMarkDefs(value.markDefs);
|
|
64
|
+
const tableMarks = indexMarkDefs(tableMarkDefs);
|
|
65
|
+
const firstContentRow = rawRows.findIndex((row) => isRecord(row) && Array.isArray(row.cells) && row.cells.length > 0);
|
|
66
|
+
const firstCells = firstContentRow >= 0 && isRecord(rawRows[firstContentRow]) ? rawRows[firstContentRow].cells : void 0;
|
|
67
|
+
const promoteHeader = value.hasHeaderRow === true && Array.isArray(firstCells) && !firstCells.some((cell) => isRecord(cell) && hasOwn(cell, "isHeader"));
|
|
68
|
+
const sourceRows = rawRows.map((rawRow, rowIndex) => {
|
|
69
|
+
const record = asRecord(rawRow);
|
|
70
|
+
const rowKey = reserveKey(readKey(record._key) ?? legacyKey(`${tableKey}:row:${rowIndex}`), seen);
|
|
71
|
+
const rawCells = Array.isArray(record.cells) ? record.cells : [];
|
|
72
|
+
return {
|
|
73
|
+
row: {
|
|
74
|
+
...safeFields(record, ROW_FIELDS),
|
|
75
|
+
_type: "tableRow",
|
|
76
|
+
_key: rowKey
|
|
77
|
+
},
|
|
78
|
+
cells: rawCells.map((cell, cellIndex) => normalizeCell(cell, {
|
|
79
|
+
path: `${rowKey}:cell:${cellIndex}`,
|
|
80
|
+
remainingRows: rawRows.length - rowIndex,
|
|
81
|
+
promoteHeader: promoteHeader && rowIndex === firstContentRow,
|
|
82
|
+
seen,
|
|
83
|
+
tableMarks
|
|
84
|
+
}))
|
|
85
|
+
};
|
|
86
|
+
});
|
|
87
|
+
if (!sourceRows.some((row) => row.cells.length > 0)) return {
|
|
88
|
+
ok: true,
|
|
89
|
+
table: tableFrom(value, tableKey, tableMarkDefs, [{
|
|
90
|
+
_type: "tableRow",
|
|
91
|
+
_key: reserveKey(legacyKey(`${tableKey}:repair-row:0`), seen),
|
|
92
|
+
cells: [emptyCell(reserveKey(legacyKey(`${tableKey}:repair-cell:0:0`), seen))]
|
|
93
|
+
}]),
|
|
94
|
+
width: 1,
|
|
95
|
+
height: 1
|
|
96
|
+
};
|
|
97
|
+
const height = sourceRows.length;
|
|
98
|
+
const occupied = Array.from({ length: height }, () => /* @__PURE__ */ new Set());
|
|
99
|
+
const placed = Array.from({ length: height }, () => []);
|
|
100
|
+
let width = 0;
|
|
101
|
+
for (let row = 0; row < height; row++) {
|
|
102
|
+
let cursor = 0;
|
|
103
|
+
for (const cell of sourceRows[row].cells) {
|
|
104
|
+
const colspan = cell.colspan ?? 1;
|
|
105
|
+
const rowspan = cell.rowspan ?? 1;
|
|
106
|
+
while (!rectangleFree(occupied, row, cursor, rowspan, colspan)) assertGridBound(++cursor + colspan, height);
|
|
107
|
+
assertGridBound(Math.max(width, cursor + colspan), height);
|
|
108
|
+
occupy(occupied, row, cursor, rowspan, colspan);
|
|
109
|
+
placed[row].push({
|
|
110
|
+
cell,
|
|
111
|
+
column: cursor
|
|
112
|
+
});
|
|
113
|
+
cursor += colspan;
|
|
114
|
+
width = Math.max(width, cursor);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const columnWidths = Array.from({ length: width });
|
|
118
|
+
for (const row of placed) for (const { cell, column } of row) for (let offset = 0; offset < (cell.colspan ?? 1); offset++) {
|
|
119
|
+
const candidate = cell.colwidth?.[offset];
|
|
120
|
+
if (candidate && columnWidths[column + offset] === void 0) columnWidths[column + offset] = candidate;
|
|
121
|
+
}
|
|
122
|
+
const hasWidths = columnWidths.some((entry) => entry !== void 0);
|
|
123
|
+
if (hasWidths) for (let column = 0; column < width; column++) columnWidths[column] ??= TABLE_CELL_MIN_WIDTH;
|
|
124
|
+
const rows = sourceRows.map((source, rowIndex) => {
|
|
125
|
+
const anchors = new Map(placed[rowIndex].map(({ cell, column }) => [column, cell]));
|
|
126
|
+
const headers = source.cells.length > 0 && source.cells.every((cell) => cell.isHeader === true);
|
|
127
|
+
const cells = [];
|
|
128
|
+
for (let column = 0; column < width;) {
|
|
129
|
+
const anchored = anchors.get(column);
|
|
130
|
+
if (anchored) {
|
|
131
|
+
const span = anchored.colspan ?? 1;
|
|
132
|
+
cells.push(withWidths(anchored, column, span, columnWidths, hasWidths));
|
|
133
|
+
column += span;
|
|
134
|
+
} else if (occupied[rowIndex].has(column)) column++;
|
|
135
|
+
else {
|
|
136
|
+
const key = reserveKey(legacyKey(`${tableKey}:repair-cell:${rowIndex}:${column}`), seen);
|
|
137
|
+
cells.push(withWidths(emptyCell(key, headers), column++, 1, columnWidths, hasWidths));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
...source.row,
|
|
142
|
+
cells
|
|
143
|
+
};
|
|
144
|
+
});
|
|
145
|
+
return {
|
|
146
|
+
ok: true,
|
|
147
|
+
table: tableFrom(value, tableKey, tableMarkDefs, rows, sourceRows[0].cells.length > 0 && rows[0].cells.every((cell) => cell.isHeader === true && (cell.rowspan ?? 1) === 1)),
|
|
148
|
+
width,
|
|
149
|
+
height
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function portableTextTableToProseMirror(value, context) {
|
|
153
|
+
const normalized = normalizePortableTextTable(value, context);
|
|
154
|
+
if (!normalized.ok) return normalized;
|
|
155
|
+
const { table } = normalized;
|
|
156
|
+
const resolveCellMarkDefs = createPortableTextTableCellMarkResolver(table);
|
|
157
|
+
return {
|
|
158
|
+
ok: true,
|
|
159
|
+
width: normalized.width,
|
|
160
|
+
height: normalized.height,
|
|
161
|
+
node: {
|
|
162
|
+
type: "table",
|
|
163
|
+
attrs: pmAttrs(table, TABLE_FIELDS),
|
|
164
|
+
content: table.rows.map((row) => ({
|
|
165
|
+
type: "tableRow",
|
|
166
|
+
attrs: pmAttrs(row, ROW_FIELDS),
|
|
167
|
+
content: row.cells.map((cell) => ({
|
|
168
|
+
type: cell.isHeader ? "tableHeader" : "tableCell",
|
|
169
|
+
attrs: {
|
|
170
|
+
colspan: cell.colspan ?? 1,
|
|
171
|
+
rowspan: cell.rowspan ?? 1,
|
|
172
|
+
colwidth: cell.colwidth ?? null,
|
|
173
|
+
textAlign: cell.textAlign ?? null,
|
|
174
|
+
...pmAttrs(cell, CELL_FIELDS)
|
|
175
|
+
},
|
|
176
|
+
content: [{
|
|
177
|
+
type: "paragraph",
|
|
178
|
+
content: context.spansToInline(cell.content, resolveCellMarkDefs(cell))
|
|
179
|
+
}]
|
|
180
|
+
}))
|
|
181
|
+
}))
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
function proseMirrorTableToPortableText(value, context) {
|
|
186
|
+
return catchFailure(value, context, () => {
|
|
187
|
+
if (!isRecord(value) || value.type !== "table" || !Array.isArray(value.content)) return fail("INVALID_TABLE");
|
|
188
|
+
let sourceCells = 0;
|
|
189
|
+
let sourceEntries = value.content.length;
|
|
190
|
+
for (const row of value.content) {
|
|
191
|
+
if (!isRecord(row) || !Array.isArray(row.content)) continue;
|
|
192
|
+
sourceCells += row.content.length;
|
|
193
|
+
sourceEntries += row.content.length;
|
|
194
|
+
for (const cell of row.content) {
|
|
195
|
+
if (!isRecord(cell) || !Array.isArray(cell.content)) continue;
|
|
196
|
+
sourceEntries += cell.content.length;
|
|
197
|
+
for (const paragraph of cell.content) if (isRecord(paragraph) && Array.isArray(paragraph.content)) sourceEntries += paragraph.content.length;
|
|
198
|
+
}
|
|
199
|
+
if (sourceCells > MAX_TABLE_REPAIRED_SLOTS || sourceEntries > MAX_TABLE_SOURCE_ENTRIES) return fail("TABLE_TOO_LARGE");
|
|
200
|
+
}
|
|
201
|
+
const tableAttrs = asRecord(value.attrs);
|
|
202
|
+
const rows = value.content.map((row) => {
|
|
203
|
+
if (!isRecord(row) || row.type !== "tableRow" || !Array.isArray(row.content)) return fail("INVALID_TABLE");
|
|
204
|
+
const attrs = asRecord(row.attrs);
|
|
205
|
+
return {
|
|
206
|
+
...safeFields(attrs.emdashData),
|
|
207
|
+
_type: "tableRow",
|
|
208
|
+
_key: readKey(attrs.emdashKey) ?? context.createKey(),
|
|
209
|
+
cells: row.content.map((cell) => pmCell(cell, context))
|
|
210
|
+
};
|
|
211
|
+
});
|
|
212
|
+
return normalizeTable({
|
|
213
|
+
...safeFields(tableAttrs.emdashData),
|
|
214
|
+
_type: "table",
|
|
215
|
+
_key: readKey(tableAttrs.emdashKey) ?? context.createKey(),
|
|
216
|
+
rows
|
|
217
|
+
}, context);
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
function pmCell(value, context) {
|
|
221
|
+
if (!isRecord(value) || value.type !== "tableCell" && value.type !== "tableHeader" || !Array.isArray(value.content)) return fail("UNSUPPORTED_CELL_CONTENT");
|
|
222
|
+
const attrs = asRecord(value.attrs);
|
|
223
|
+
const content = [];
|
|
224
|
+
const markDefs = [];
|
|
225
|
+
for (let index = 0; index < value.content.length; index++) {
|
|
226
|
+
const paragraph = value.content[index];
|
|
227
|
+
if (!isRecord(paragraph) || paragraph.type !== "paragraph") return fail("UNSUPPORTED_CELL_CONTENT");
|
|
228
|
+
const inline = Array.isArray(paragraph.content) ? paragraph.content : [];
|
|
229
|
+
if (!inline.every((node) => isProseMirrorNode(node) && (node.type === "text" || node.type === "hardBreak"))) return fail("UNSUPPORTED_CELL_CONTENT");
|
|
230
|
+
const converted = context.inlineToSpans(inline);
|
|
231
|
+
if (index > 0) content.push({
|
|
232
|
+
_type: "span",
|
|
233
|
+
_key: context.createKey(),
|
|
234
|
+
text: "\n"
|
|
235
|
+
});
|
|
236
|
+
content.push(...converted.content);
|
|
237
|
+
markDefs.push(...converted.markDefs ?? []);
|
|
238
|
+
}
|
|
239
|
+
return {
|
|
240
|
+
...safeFields(attrs.emdashData),
|
|
241
|
+
_type: "tableCell",
|
|
242
|
+
_key: readKey(attrs.emdashKey) ?? context.createKey(),
|
|
243
|
+
content,
|
|
244
|
+
...markDefs.length > 0 ? { markDefs } : {},
|
|
245
|
+
isHeader: value.type === "tableHeader",
|
|
246
|
+
colspan: attrs.colspan,
|
|
247
|
+
rowspan: attrs.rowspan,
|
|
248
|
+
colwidth: attrs.colwidth,
|
|
249
|
+
textAlign: attrs.textAlign
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
function getPortableTextTableCellMarkDefs(table, cell) {
|
|
253
|
+
return getMarkDefs(table.markDefs ?? [], cell.markDefs ?? []);
|
|
254
|
+
}
|
|
255
|
+
function createPortableTextTableCellMarkResolver(table) {
|
|
256
|
+
const shared = indexMarkDefs(table.markDefs ?? []);
|
|
257
|
+
return (cell) => {
|
|
258
|
+
const local = indexMarkDefs(cell.markDefs ?? []);
|
|
259
|
+
const referenced = /* @__PURE__ */ new Map();
|
|
260
|
+
for (const span of cell.content) for (const key of span.marks ?? []) {
|
|
261
|
+
const definition = local.get(key) ?? shared.get(key);
|
|
262
|
+
if (definition) referenced.set(key, definition);
|
|
263
|
+
}
|
|
264
|
+
return [...referenced.values()];
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
function getPortableTextTableColumnWidths(table) {
|
|
268
|
+
const occupied = Array.from({ length: table.rows.length }, () => /* @__PURE__ */ new Set());
|
|
269
|
+
const widths = [];
|
|
270
|
+
for (let row = 0; row < table.rows.length; row++) {
|
|
271
|
+
let column = 0;
|
|
272
|
+
for (const cell of table.rows[row].cells) {
|
|
273
|
+
while (occupied[row].has(column)) column++;
|
|
274
|
+
const colspan = cell.colspan ?? 1;
|
|
275
|
+
for (let offset = 0; offset < colspan; offset++) {
|
|
276
|
+
const value = cell.colwidth?.[offset];
|
|
277
|
+
if (value && widths[column + offset] === void 0) widths[column + offset] = Math.max(TABLE_CELL_MIN_WIDTH, value);
|
|
278
|
+
}
|
|
279
|
+
occupy(occupied, row, column, cell.rowspan ?? 1, colspan);
|
|
280
|
+
column += colspan;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return widths.some(Boolean) ? widths.map((width) => width ?? TABLE_CELL_MIN_WIDTH) : void 0;
|
|
284
|
+
}
|
|
285
|
+
function normalizeCell(value, context) {
|
|
286
|
+
if (typeof value !== "string" && !isRecord(value)) return fail("UNSUPPORTED_CELL_CONTENT");
|
|
287
|
+
const record = asRecord(value);
|
|
288
|
+
const key = reserveKey(readKey(record._key) ?? legacyKey(context.path), context.seen);
|
|
289
|
+
const markDefs = normalizeMarkDefs(record.markDefs);
|
|
290
|
+
const localMarks = indexMarkDefs(markDefs);
|
|
291
|
+
const colspan = normalizeSpan(record.colspan);
|
|
292
|
+
const rowspan = Math.min(normalizeSpan(record.rowspan), Math.max(1, context.remainingRows));
|
|
293
|
+
const colwidth = normalizeColwidth(record.colwidth, colspan);
|
|
294
|
+
const textAlign = normalizeAlignment(record.textAlign);
|
|
295
|
+
const explicitHeader = hasOwn(record, "isHeader");
|
|
296
|
+
const isHeader = context.promoteHeader || record.isHeader === true ? true : explicitHeader && record.isHeader === false ? false : void 0;
|
|
297
|
+
const cell = {
|
|
298
|
+
...safeFields(record, CELL_FIELDS),
|
|
299
|
+
_type: "tableCell",
|
|
300
|
+
_key: key,
|
|
301
|
+
content: normalizeContent(value, record.content, key, (mark) => localMarks.get(mark) ?? context.tableMarks.get(mark))
|
|
302
|
+
};
|
|
303
|
+
if (markDefs.length > 0) cell.markDefs = markDefs;
|
|
304
|
+
if (isHeader !== void 0) cell.isHeader = isHeader;
|
|
305
|
+
if (colspan > 1) cell.colspan = colspan;
|
|
306
|
+
if (rowspan > 1) cell.rowspan = rowspan;
|
|
307
|
+
if (colwidth) cell.colwidth = colwidth;
|
|
308
|
+
if (textAlign) cell.textAlign = textAlign;
|
|
309
|
+
return cell;
|
|
310
|
+
}
|
|
311
|
+
function normalizeContent(rawCell, rawContent, cellKey, resolveMark) {
|
|
312
|
+
const fallbackSpan = (text) => ({
|
|
313
|
+
_type: "span",
|
|
314
|
+
_key: legacyKey(`${cellKey}:span:0`),
|
|
315
|
+
text
|
|
316
|
+
});
|
|
317
|
+
const values = typeof rawCell === "string" ? [fallbackSpan(rawCell)] : typeof rawContent === "string" ? [fallbackSpan(rawContent)] : rawContent === void 0 ? [] : rawContent;
|
|
318
|
+
if (!Array.isArray(values)) return fail("UNSUPPORTED_CELL_CONTENT");
|
|
319
|
+
const content = values.map((value, index) => {
|
|
320
|
+
if (!isRecord(value) || value._type !== "span" || typeof value.text !== "string") return fail("UNSUPPORTED_CELL_CONTENT");
|
|
321
|
+
const marks = value.marks ?? [];
|
|
322
|
+
if (!Array.isArray(marks)) return fail("UNSUPPORTED_MARK_DEFINITION");
|
|
323
|
+
const normalizedMarks = [];
|
|
324
|
+
for (const mark of marks) {
|
|
325
|
+
if (typeof mark !== "string" || !DECORATOR_MARKS.has(mark) && resolveMark(mark)?._type !== "link") return fail("UNSUPPORTED_MARK_DEFINITION");
|
|
326
|
+
normalizedMarks.push(mark);
|
|
327
|
+
}
|
|
328
|
+
return {
|
|
329
|
+
_type: "span",
|
|
330
|
+
_key: readKey(value._key) ?? legacyKey(`${cellKey}:span:${index}`),
|
|
331
|
+
text: value.text,
|
|
332
|
+
...normalizedMarks.length > 0 ? { marks: normalizedMarks } : {}
|
|
333
|
+
};
|
|
334
|
+
});
|
|
335
|
+
return content.length > 0 ? content : [emptySpan(cellKey)];
|
|
336
|
+
}
|
|
337
|
+
function normalizeMarkDefs(value) {
|
|
338
|
+
if (value === void 0) return [];
|
|
339
|
+
if (!Array.isArray(value)) return fail("UNSUPPORTED_MARK_DEFINITION");
|
|
340
|
+
return value.map((mark) => {
|
|
341
|
+
const key = isRecord(mark) ? readKey(mark._key) : void 0;
|
|
342
|
+
if (!isRecord(mark) || mark._type !== "link" || !key || typeof mark.href !== "string") return fail("UNSUPPORTED_MARK_DEFINITION");
|
|
343
|
+
return {
|
|
344
|
+
...safeFields(mark),
|
|
345
|
+
_type: "link",
|
|
346
|
+
_key: key
|
|
347
|
+
};
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
const normalizeSpan = (value) => typeof value === "number" && Number.isInteger(value) && value > 0 && value <= MAX_TABLE_SPAN ? value : 1;
|
|
351
|
+
function normalizeAlignment(value) {
|
|
352
|
+
return value === "left" || value === "center" || value === "right" || value === "justify" ? value : void 0;
|
|
353
|
+
}
|
|
354
|
+
function normalizeColwidth(value, colspan) {
|
|
355
|
+
if (!Array.isArray(value) || value.length !== colspan || !value.every(validWidth)) return void 0;
|
|
356
|
+
return value;
|
|
357
|
+
}
|
|
358
|
+
const validWidth = (value) => typeof value === "number" && Number.isInteger(value) && value >= 0 && value <= MAX_TABLE_COLUMN_WIDTH;
|
|
359
|
+
function assertGridBound(width, height) {
|
|
360
|
+
if (width * height > MAX_TABLE_REPAIRED_SLOTS) return fail("TABLE_TOO_LARGE");
|
|
361
|
+
}
|
|
362
|
+
function rectangleFree(occupied, row, column, rowspan, colspan) {
|
|
363
|
+
for (let y = row; y < row + rowspan; y++) for (let x = column; x < column + colspan; x++) if (occupied[y].has(x)) return false;
|
|
364
|
+
return true;
|
|
365
|
+
}
|
|
366
|
+
function occupy(occupied, row, column, rowspan, colspan) {
|
|
367
|
+
for (let y = row; y < row + rowspan; y++) for (let x = column; x < column + colspan; x++) occupied[y]?.add(x);
|
|
368
|
+
}
|
|
369
|
+
function withWidths(cell, column, colspan, widths, hasWidths) {
|
|
370
|
+
const { colwidth: _colwidth, ...rest } = cell;
|
|
371
|
+
if (!hasWidths) return rest;
|
|
372
|
+
return {
|
|
373
|
+
...rest,
|
|
374
|
+
colwidth: widths.slice(column, column + colspan).map((width) => width ?? TABLE_CELL_MIN_WIDTH)
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
function tableFrom(raw, key, markDefs, rows, hasHeaderRow = false) {
|
|
378
|
+
return {
|
|
379
|
+
...safeFields(raw, TABLE_FIELDS),
|
|
380
|
+
_type: "table",
|
|
381
|
+
_key: key,
|
|
382
|
+
rows,
|
|
383
|
+
...hasHeaderRow ? { hasHeaderRow: true } : {},
|
|
384
|
+
...markDefs.length > 0 ? { markDefs } : {}
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
const emptySpan = (key) => ({
|
|
388
|
+
_type: "span",
|
|
389
|
+
_key: legacyKey(`${key}:span:0`),
|
|
390
|
+
text: ""
|
|
391
|
+
});
|
|
392
|
+
function emptyCell(key, isHeader = false) {
|
|
393
|
+
return {
|
|
394
|
+
_type: "tableCell",
|
|
395
|
+
_key: key,
|
|
396
|
+
content: [emptySpan(key)],
|
|
397
|
+
...isHeader ? { isHeader: true } : {}
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
function catchFailure(raw, context, operation) {
|
|
401
|
+
try {
|
|
402
|
+
return operation();
|
|
403
|
+
} catch (error) {
|
|
404
|
+
if (error instanceof NormalizationFailure) return unsafeResult(error.reason, raw, context.path);
|
|
405
|
+
throw error;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
function unsafeResult(reason, raw, path) {
|
|
409
|
+
return {
|
|
410
|
+
ok: false,
|
|
411
|
+
reason,
|
|
412
|
+
raw,
|
|
413
|
+
...reason === "TABLE_TOO_LARGE" ? {} : { renderFallback: makeRenderFallback(raw, path) }
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
function makeRenderFallback(raw, path) {
|
|
417
|
+
const record = asRecord(raw);
|
|
418
|
+
const seen = /* @__PURE__ */ new Set();
|
|
419
|
+
const tableKey = reserveKey(readKey(record._key) ?? legacyKey(`${path}:fallback-table`), seen);
|
|
420
|
+
let remaining = MAX_TABLE_REPAIRED_SLOTS;
|
|
421
|
+
const rows = [];
|
|
422
|
+
for (const [rowIndex, rawRow] of (Array.isArray(record.rows) ? record.rows : []).entries()) {
|
|
423
|
+
const row = asRecord(rawRow);
|
|
424
|
+
const rawCells = Array.isArray(row.cells) ? row.cells : [];
|
|
425
|
+
if (Math.max(rawCells.length, 1) > remaining) return void 0;
|
|
426
|
+
const rowKey = reserveKey(readKey(row._key) ?? legacyKey(`${tableKey}:fallback-row:${rowIndex}`), seen);
|
|
427
|
+
const cells = rawCells.map((rawCell, cellIndex) => {
|
|
428
|
+
return fallbackCell(rawCell, reserveKey(readKey(asRecord(rawCell)._key) ?? legacyKey(`${rowKey}:fallback-cell:${cellIndex}`), seen));
|
|
429
|
+
});
|
|
430
|
+
if (cells.length === 0) cells.push(emptyCell(reserveKey(legacyKey(`${rowKey}:empty`), seen)));
|
|
431
|
+
remaining -= cells.length;
|
|
432
|
+
rows.push({
|
|
433
|
+
_type: "tableRow",
|
|
434
|
+
_key: rowKey,
|
|
435
|
+
cells
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
if (rows.length > 0) return {
|
|
439
|
+
_type: "table",
|
|
440
|
+
_key: tableKey,
|
|
441
|
+
rows
|
|
442
|
+
};
|
|
443
|
+
return {
|
|
444
|
+
_type: "table",
|
|
445
|
+
_key: tableKey,
|
|
446
|
+
rows: [{
|
|
447
|
+
_type: "tableRow",
|
|
448
|
+
_key: reserveKey(legacyKey(`${tableKey}:empty-row`), seen),
|
|
449
|
+
cells: [emptyCell(reserveKey(legacyKey(`${tableKey}:empty-cell`), seen))]
|
|
450
|
+
}]
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
const fallbackCell = (raw, key) => ({
|
|
454
|
+
_type: "tableCell",
|
|
455
|
+
_key: key,
|
|
456
|
+
content: [{
|
|
457
|
+
...emptySpan(key),
|
|
458
|
+
text: recoverText(raw)
|
|
459
|
+
}]
|
|
460
|
+
});
|
|
461
|
+
function recoverText(value, depth = 0) {
|
|
462
|
+
if (depth > 32) return "";
|
|
463
|
+
if (typeof value === "string") return value;
|
|
464
|
+
if (Array.isArray(value)) return value.map((entry) => recoverText(entry, depth + 1)).join("");
|
|
465
|
+
const record = asRecord(value);
|
|
466
|
+
if (typeof record.text === "string") return record.text;
|
|
467
|
+
if (typeof record.content === "string") return record.content;
|
|
468
|
+
return recoverText(Array.isArray(record.content) ? record.content : Array.isArray(record.children) ? record.children : [], depth + 1);
|
|
469
|
+
}
|
|
470
|
+
const indexMarkDefs = (marks) => new Map(marks.map((mark) => [mark._key, mark]));
|
|
471
|
+
function getMarkDefs(table, cell) {
|
|
472
|
+
const byKey = indexMarkDefs(table);
|
|
473
|
+
for (const mark of cell) byKey.set(mark._key, mark);
|
|
474
|
+
return [...byKey.values()];
|
|
475
|
+
}
|
|
476
|
+
function legacyKey(value) {
|
|
477
|
+
let hash = 2166136261;
|
|
478
|
+
for (let index = 0; index < value.length; index++) {
|
|
479
|
+
hash ^= value.charCodeAt(index);
|
|
480
|
+
hash = Math.imul(hash, 16777619);
|
|
481
|
+
}
|
|
482
|
+
return `legacy-table-${(hash >>> 0).toString(36)}`;
|
|
483
|
+
}
|
|
484
|
+
function reserveKey(base, seen) {
|
|
485
|
+
let candidate = base;
|
|
486
|
+
for (let suffix = 1; seen.has(candidate); suffix++) candidate = `${base}-${suffix}`;
|
|
487
|
+
seen.add(candidate);
|
|
488
|
+
return candidate;
|
|
489
|
+
}
|
|
490
|
+
const pmAttrs = (record, fields) => ({
|
|
491
|
+
emdashKey: record._key,
|
|
492
|
+
emdashData: safeFields(record, fields)
|
|
493
|
+
});
|
|
494
|
+
function safeFields(value, excluded = /* @__PURE__ */ new Set()) {
|
|
495
|
+
if (!isRecord(value)) return {};
|
|
496
|
+
return Object.fromEntries(Object.entries(value).filter(([key]) => !excluded.has(key) && key !== "__proto__" && key !== "prototype" && key !== "constructor" && !DOM_FIELD.test(key)));
|
|
497
|
+
}
|
|
498
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
499
|
+
const asRecord = (value) => isRecord(value) ? value : {};
|
|
500
|
+
const readKey = (value) => typeof value === "string" && value.length > 0 ? value : void 0;
|
|
501
|
+
const hasOwn = (record, key) => Object.hasOwn(record, key);
|
|
502
|
+
const isProseMirrorNode = (value) => isRecord(value) && typeof value.type === "string";
|
|
503
|
+
|
|
504
|
+
//#endregion
|
|
505
|
+
export { MAX_TABLE_COLUMN_WIDTH, MAX_TABLE_PASTE_CELLS, MAX_TABLE_PASTE_COLUMNS, MAX_TABLE_PASTE_ROWS, MAX_TABLE_PASTE_TEXT_BYTES, MAX_TABLE_REPAIRED_SLOTS, MAX_TABLE_SPAN, TABLE_CELL_MIN_WIDTH, TABLE_COLUMN_WIDTH_STEP, TABLE_RESIZE_HANDLE_WIDTH, TABLE_RESIZE_TARGET_WIDTH, UnsafePortableTextTableError, createPortableTextTableCellMarkResolver, getPortableTextTableCellMarkDefs, getPortableTextTableColumnWidths, isPortableTextTableInput, normalizePortableTextTable, portableTextTableToProseMirror, proseMirrorTableToPortableText };
|
|
506
|
+
//# sourceMappingURL=portable-text-table.js.map
|