y-mxgraph 0.8.2 → 0.8.3
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/binding/patch.d.ts +2 -0
- package/binding/patch.d.ts.map +1 -1
- package/{index-BtfQrQYT.js → index-BhW4J2Zt.js} +21 -10
- package/index-BhW4J2Zt.js.map +1 -0
- package/{index-CaG-EdEK.cjs → index-D3Hk2QcW.cjs} +18 -7
- package/index-D3Hk2QcW.cjs.map +1 -0
- package/models/diagram.d.ts +1 -1
- package/models/mxGraphModel.d.ts +4 -1
- package/models/mxGraphModel.d.ts.map +1 -1
- package/models/view.d.ts +12 -0
- package/models/view.d.ts.map +1 -0
- package/package.json +1 -1
- package/transform.cjs +1 -1
- package/transform.js +1 -1
- package/y-mxgraph.cjs +140 -27
- package/y-mxgraph.cjs.map +1 -1
- package/y-mxgraph.js +140 -27
- package/y-mxgraph.js.map +1 -1
- package/index-BtfQrQYT.js.map +0 -1
- package/index-CaG-EdEK.cjs.map +0 -1
package/binding/patch.d.ts
CHANGED
|
@@ -16,6 +16,8 @@ export interface FilePatch {
|
|
|
16
16
|
[key: string]: {
|
|
17
17
|
name?: string;
|
|
18
18
|
previous?: string;
|
|
19
|
+
/** draw.io page viewState(如 background),与 diffPages 格式一致 */
|
|
20
|
+
view?: Record<string, string>;
|
|
19
21
|
cells?: {
|
|
20
22
|
[DIFF_REMOVE]?: string[];
|
|
21
23
|
[DIFF_INSERT]?: Record<string, string>[];
|
package/binding/patch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../../src/binding/patch.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,KAAK,OAAO,EAEb,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../../src/binding/patch.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,KAAK,OAAO,EAEb,MAAM,kBAAkB,CAAC;AAa1B,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,QAAA,MAAM,WAAW,MAAM,CAAC;AACxB,QAAA,MAAM,WAAW,MAAM,CAAC;AACxB,QAAA,MAAM,WAAW,MAAM,CAAC;AAiDxB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,CAAC,WAAW,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;IAChC,CAAC,WAAW,CAAC,CAAC,EAAE;QACd,CAAC,GAAG,EAAE,MAAM,GAAG;YACb,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,4DAA4D;YAC5D,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC9B,KAAK,CAAC,EAAE;gBACN,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;gBACzB,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;gBACzC,CAAC,WAAW,CAAC,CAAC,EAAE;oBACd,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;iBACvC,CAAC;aACH,CAAC;SACH,CAAC;KACH,CAAC;CACH;AAmCD,wBAAgB,cAAc,CAC5B,GAAG,EAAE,CAAC,CAAC,GAAG,EACV,KAAK,EAAE,SAAS,EAChB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,QAkS/B;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,aAAa,UAAQ,QA2DhE;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,CACd,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,QAAQ,CAC1E,EAAE,EACH,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,GAClB,SAAS,CAwUX"}
|
|
@@ -122,12 +122,14 @@ function serialize$2(xmlElement) {
|
|
|
122
122
|
}
|
|
123
123
|
const key$2 = "mxGraphModel";
|
|
124
124
|
const mxCellOrderKey = key$3 + "Order";
|
|
125
|
+
const backgroundKey = "background";
|
|
125
126
|
function parse$2(object, doc) {
|
|
127
|
+
var _a;
|
|
126
128
|
const mxCells = (object.root[key$3] || []).map((cell) => {
|
|
127
|
-
var
|
|
129
|
+
var _a2;
|
|
128
130
|
return {
|
|
129
131
|
value: parse$3(cell),
|
|
130
|
-
id: ((
|
|
132
|
+
id: ((_a2 = cell._attributes) == null ? void 0 : _a2.id) || ""
|
|
131
133
|
};
|
|
132
134
|
});
|
|
133
135
|
const mxGraphElement = (doc == null ? void 0 : doc.getMap(key$2)) || new Y.Map();
|
|
@@ -139,13 +141,20 @@ function parse$2(object, doc) {
|
|
|
139
141
|
cellsOrder.push(mxCells.map((cell) => cell.id));
|
|
140
142
|
mxGraphElement.set(key$3, cells);
|
|
141
143
|
mxGraphElement.set(mxCellOrderKey, cellsOrder);
|
|
144
|
+
const bg = (_a = object._attributes) == null ? void 0 : _a.background;
|
|
145
|
+
if (bg != null && bg !== "") {
|
|
146
|
+
mxGraphElement.set(backgroundKey, String(bg));
|
|
147
|
+
}
|
|
142
148
|
return mxGraphElement;
|
|
143
149
|
}
|
|
144
150
|
function serialize$1(map) {
|
|
145
151
|
const cells = getMap(map, key$3);
|
|
146
152
|
const cellsOrder = getArray(map, mxCellOrderKey);
|
|
153
|
+
const bg = map.get(backgroundKey);
|
|
154
|
+
const _attributes = {};
|
|
155
|
+
if (bg) _attributes.background = bg;
|
|
147
156
|
return {
|
|
148
|
-
_attributes
|
|
157
|
+
_attributes,
|
|
149
158
|
root: {
|
|
150
159
|
[key$3]: cellsOrder.toArray().map((id) => serialize$2(cells.get(id)))
|
|
151
160
|
}
|
|
@@ -247,17 +256,19 @@ function ydoc2xml(doc, spaces = 0) {
|
|
|
247
256
|
return "";
|
|
248
257
|
}
|
|
249
258
|
export {
|
|
250
|
-
key
|
|
251
|
-
|
|
252
|
-
key$
|
|
259
|
+
key as a,
|
|
260
|
+
backgroundKey as b,
|
|
261
|
+
key$1 as c,
|
|
253
262
|
diagramOrderKey as d,
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
263
|
+
key$3 as e,
|
|
264
|
+
parse$1 as f,
|
|
265
|
+
getMap as g,
|
|
266
|
+
serializer$1 as h,
|
|
267
|
+
key$2 as k,
|
|
257
268
|
mxCellOrderKey as m,
|
|
258
269
|
parse$4 as p,
|
|
259
270
|
serialize as s,
|
|
260
271
|
xml2ydoc as x,
|
|
261
272
|
ydoc2xml as y
|
|
262
273
|
};
|
|
263
|
-
//# sourceMappingURL=index-
|
|
274
|
+
//# sourceMappingURL=index-BhW4J2Zt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-BhW4J2Zt.js","sources":["../src/helper/xml.ts","../src/helper/yjs.ts","../src/models/mxCell.ts","../src/models/mxGraphModel.ts","../src/models/diagram.ts","../src/models/mxfile.ts","../src/transform/index.ts"],"sourcesContent":["import { xml2js, js2xml, type ElementCompact } from \"xml-js\";\n\nfunction deepProcess(node: unknown): void {\n if (node == null) return;\n\n if (Array.isArray(node)) {\n for (const item of node) {\n deepProcess(item);\n }\n return;\n }\n\n if (typeof node !== \"object\") return;\n\n const obj = node as Record<string, unknown>;\n const keys = Object.keys(obj);\n for (const key of keys) {\n if (key === \"_attributes\") continue;\n\n let value = obj[key];\n const keyLower = key.toLowerCase();\n\n if (\n (keyLower === \"diagram\" || keyLower === \"mxcell\") &&\n value !== undefined &&\n !Array.isArray(value)\n ) {\n obj[key] = [value];\n value = obj[key];\n }\n\n if (Array.isArray(value)) {\n for (const v of value) deepProcess(v);\n } else if (value && typeof value === \"object\") {\n deepProcess(value);\n }\n }\n}\n\nexport function parse(xml: string) {\n const result = xml2js(xml, { compact: true }) as Record<string, unknown>;\n deepProcess(result);\n return result;\n}\n\nexport function serializer(obj: ElementCompact, spaces = 2) {\n return js2xml(obj, {\n compact: true,\n spaces,\n });\n}\n","import * as Y from \"yjs\";\n\n/**\n * 从 Y.Map 中安全获取子 Map(格式固定,转型安全)\n */\nexport function getMap<T = unknown>(\n parent: Y.Map<unknown>,\n key: string,\n): Y.Map<T> | undefined {\n return parent.get(key) as Y.Map<T> | undefined;\n}\n\n/**\n * 从 Y.Map 中安全获取子 Array(格式固定,转型安全)\n */\nexport function getArray<T = unknown>(\n parent: Y.Map<unknown>,\n key: string,\n): Y.Array<T> | undefined {\n return parent.get(key) as Y.Array<T> | undefined;\n}\n","import * as Y from \"yjs\";\nimport { xml2js, js2xml } from \"xml-js\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"mxCell\";\n\nconst mxGeometryKey = \"mxGeometry\";\nconst mxGeometryAttributeKey = \"geometry\";\n\nexport interface MxCellModel extends ElementCompact {\n [mxGeometryKey]?: ElementCompact;\n}\n\nexport function parse(object: MxCellModel): Y.XmlElement {\n const xmlElement = new Y.XmlElement(\"mxCell\");\n\n for (const attribute of Object.keys(object._attributes || {})) {\n xmlElement.setAttribute(\n attribute,\n `${object._attributes?.[attribute] || \"\"}`,\n );\n }\n\n if (object[mxGeometryKey]) {\n const geometry = object[mxGeometryKey];\n const geometryString = js2xml(\n { [mxGeometryKey]: geometry },\n {\n compact: true,\n },\n );\n xmlElement.setAttribute(mxGeometryAttributeKey, geometryString);\n delete object[mxGeometryKey];\n }\n\n return xmlElement;\n}\n\nexport function serialize(xmlElement: Y.XmlElement) {\n const rawAttributes = {\n ...xmlElement.getAttributes(),\n };\n\n // 提取 mxGeometry(不需要转义,它本身就是 XML 字符串)\n let mxGeometry: ElementCompact | null = null;\n let mxGeometryString: string | undefined;\n\n if (mxGeometryAttributeKey in rawAttributes) {\n mxGeometryString = rawAttributes[mxGeometryAttributeKey];\n delete rawAttributes[mxGeometryAttributeKey];\n }\n\n // 转义其他属性值中的特殊字符\n const attributes: Record<string, string> = {};\n for (const [key, value] of Object.entries(rawAttributes)) {\n if (typeof value === \"string\") {\n attributes[key] = value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n } else if (value != null) {\n attributes[key] = String(value);\n }\n }\n\n // 解析 mxGeometry\n if (mxGeometryString) {\n try {\n const parsed = xml2js(mxGeometryString, { compact: true }) as Record<\n string,\n ElementCompact\n >;\n mxGeometry = parsed[mxGeometryKey] ?? null;\n if (mxGeometry && mxGeometry._attributes) {\n mxGeometry._attributes[\"as\"] = \"geometry\";\n }\n } catch (e) {\n console.warn(\"[y-mxgraph] Failed to parse mxGeometry:\", e);\n }\n }\n\n const obj: Record<string, unknown> = {\n _attributes: attributes,\n };\n\n if (mxGeometry) {\n obj[mxGeometryKey] = mxGeometry;\n }\n\n return obj;\n}\n","import * as Y from \"yjs\";\nimport { getMap, getArray } from \"../helper/yjs\";\n\nimport {\n key as mxCellKey,\n parse as parseMxCell,\n serialize as serializeMxCell,\n type MxCellModel,\n} from \"./mxCell\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"mxGraphModel\";\nexport const mxCellOrderKey = mxCellKey + \"Order\";\n/** 协同同步的 mxGraphModel 属性:仅 background */\nexport const backgroundKey = \"background\";\n\nexport interface MxGraphModel extends ElementCompact {\n _attributes?: Record<string, string>;\n root: {\n mxCell: MxCellModel[];\n };\n}\n\nexport type YMxGraphModel = Y.Map<unknown>;\n\nexport function parse(object: MxGraphModel, doc?: Y.Doc) {\n const mxCells = (object.root[mxCellKey] || []).map((cell: MxCellModel) => {\n return {\n value: parseMxCell(cell),\n id: (cell._attributes?.id || \"\") as string,\n };\n });\n\n const mxGraphElement = doc?.getMap(key) || new Y.Map();\n\n const cells = new Y.Map<Y.XmlElement>();\n const cellsOrder = new Y.Array<string>();\n\n mxCells.forEach((cell) => {\n cells.set(cell.id, cell.value);\n });\n\n cellsOrder.push(mxCells.map((cell) => cell.id));\n\n mxGraphElement.set(mxCellKey, cells);\n mxGraphElement.set(mxCellOrderKey, cellsOrder);\n\n const bg = object._attributes?.background;\n if (bg != null && bg !== \"\") {\n mxGraphElement.set(backgroundKey, String(bg));\n }\n\n return mxGraphElement as YMxGraphModel;\n}\n\nexport function serialize(map: YMxGraphModel) {\n const cells = getMap<Y.XmlElement>(map, mxCellKey)!;\n const cellsOrder = getArray<string>(map, mxCellOrderKey)!;\n const bg = map.get(backgroundKey) as string | undefined;\n const _attributes: Record<string, string> = {};\n if (bg) _attributes.background = bg;\n return {\n _attributes,\n root: {\n [mxCellKey]: cellsOrder\n .toArray()\n .map((id) => serializeMxCell(cells!.get(id) as Y.XmlElement)),\n },\n };\n}\n","import * as Y from \"yjs\";\nimport { getMap } from \"../helper/yjs\";\nimport {\n parse as parseMxGraphModel,\n serialize as serializeMxGraphModel,\n key as mxGraphModelKey,\n type MxGraphModel,\n type YMxGraphModel,\n} from \"./mxGraphModel\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"diagram\";\n\nexport interface Diagram extends ElementCompact {\n mxGraphModel: MxGraphModel;\n}\n\nexport type YDiagram = Y.Map<unknown>;\n\nexport function parse(object: Diagram): YDiagram {\n const yDiagramElement = new Y.Map();\n yDiagramElement.set(\"name\", `${object._attributes?.name || \"\"}`);\n yDiagramElement.set(\"id\", `${object._attributes?.id || \"\"}`);\n\n const mxGraphModel = parseMxGraphModel(object[mxGraphModelKey]);\n\n yDiagramElement.set(mxGraphModelKey, mxGraphModel);\n return yDiagramElement as YDiagram;\n}\n\nexport function serialize(yDiagram: YDiagram) {\n const mxGraphModel = getMap(yDiagram, mxGraphModelKey);\n\n return {\n _attributes: {\n name: yDiagram.get(\"name\") as string,\n id: yDiagram.get(\"id\") as string,\n },\n [mxGraphModelKey]: mxGraphModel\n ? serializeMxGraphModel(mxGraphModel)\n : undefined,\n };\n}\n","import * as Y from \"yjs\";\nimport { getMap, getArray } from \"../helper/yjs\";\nimport {\n parse as parseDiagram,\n key as diagramKey,\n serialize as serializeDiagram,\n} from \"./diagram\";\nimport type { Diagram, YDiagram } from \"./diagram\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"mxfile\";\nexport const diagramOrderKey = diagramKey + \"Order\";\n\nexport type YMxFile = Y.Map<unknown>;\n\nexport interface MxFile extends ElementCompact {\n diagram: Diagram[];\n}\n\nexport function parse(object: MxFile, doc: Y.Doc) {\n const mxfile = doc.getMap(key);\n mxfile.set(\"pages\", (object._attributes?.pages || \"1\") + \"\");\n\n const diagramList = object.diagram.map((diagram) => ({\n value: parseDiagram(diagram),\n id: (diagram._attributes?.id || \"\") as string,\n }));\n const diagramMap = new Y.Map<YDiagram>();\n const diagramOrder = new Y.Array<string>();\n diagramList.forEach((diagram) => {\n diagramMap.set(diagram.id, diagram.value);\n });\n diagramOrder.push(diagramList.map((diagram) => diagram.id));\n\n mxfile.set(diagramKey, diagramMap);\n mxfile.set(diagramOrderKey, diagramOrder);\n return mxfile;\n}\n\nexport function serializer(yMxFile: YMxFile): ElementCompact {\n const diagrams = getMap<YDiagram>(yMxFile, diagramKey);\n const diagramOrder = getArray<string>(yMxFile, diagramOrderKey);\n\n const orderIds = diagramOrder ? diagramOrder.toArray() : [];\n // 如果 diagramOrder 为空但 diagram map 不为空,使用 diagram map 中的所有 ID\n const ids =\n orderIds.length > 0\n ? orderIds\n : diagrams\n ? Array.from(diagrams.keys())\n : [];\n\n const obj: Record<string, unknown> = {\n _attributes: {\n pages: (yMxFile.get(\"pages\") as string) || \"1\",\n },\n [diagramKey]: ids\n .map((id) => diagrams!.get(id) as YDiagram)\n .filter((d): d is YDiagram => !!d)\n .map((diagramElement) => serializeDiagram(diagramElement)),\n };\n\n return obj as ElementCompact;\n}\n","import * as Y from \"yjs\";\nimport { parse, serializer } from \"../helper/xml\";\nimport {\n parse as parseMxFile,\n key as mxfileKey,\n serializer as serializerMxFile,\n type YMxFile,\n} from \"../models/mxfile\";\nimport {\n parse as parseMxGraphModel,\n key as mxGraphModelKey,\n serialize as serializerMxGraphModel,\n type YMxGraphModel,\n} from \"../models/mxGraphModel\";\n\nexport function xml2ydoc(xml: string, doc: Y.Doc): Y.Doc {\n const object = parse(xml);\n\n const mxfile = (object as Record<string, unknown>).mxfile;\n const mxGraphModel = (object as Record<string, unknown>).mxGraphModel;\n if (mxfile) {\n doc.transact(() => {\n parseMxFile(mxfile as import(\"../models/mxfile\").MxFile, doc);\n });\n } else if (mxGraphModel) {\n doc.transact(() => {\n parseMxGraphModel(\n mxGraphModel as import(\"../models/mxGraphModel\").MxGraphModel,\n doc,\n );\n });\n } else {\n throw new Error(\"不支持的文件格式\");\n }\n\n return doc;\n}\n\nexport function ydoc2xml(doc: Y.Doc, spaces = 0): string {\n if (doc.share.has(mxfileKey)) {\n return serializer(\n {\n [mxfileKey]: serializerMxFile(doc.getMap(mxfileKey)),\n },\n spaces,\n );\n }\n if (doc.share.has(mxGraphModelKey)) {\n return serializer(\n {\n [mxGraphModelKey]: serializerMxGraphModel(doc.getMap(mxGraphModelKey)),\n },\n spaces,\n );\n }\n\n return \"\";\n}\n"],"names":["key","parse","serializer","serialize","mxCellKey","_a","parseMxCell","serializeMxCell","parseMxGraphModel","mxGraphModelKey","serializeMxGraphModel","diagramKey","parseDiagram","serializeDiagram","parseMxFile","mxfileKey","serializerMxFile","serializerMxGraphModel"],"mappings":"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"}
|
|
@@ -140,12 +140,14 @@ function serialize$2(xmlElement) {
|
|
|
140
140
|
}
|
|
141
141
|
const key$2 = "mxGraphModel";
|
|
142
142
|
const mxCellOrderKey = key$3 + "Order";
|
|
143
|
+
const backgroundKey = "background";
|
|
143
144
|
function parse$2(object, doc) {
|
|
145
|
+
var _a;
|
|
144
146
|
const mxCells = (object.root[key$3] || []).map((cell) => {
|
|
145
|
-
var
|
|
147
|
+
var _a2;
|
|
146
148
|
return {
|
|
147
149
|
value: parse$3(cell),
|
|
148
|
-
id: ((
|
|
150
|
+
id: ((_a2 = cell._attributes) == null ? void 0 : _a2.id) || ""
|
|
149
151
|
};
|
|
150
152
|
});
|
|
151
153
|
const mxGraphElement = (doc == null ? void 0 : doc.getMap(key$2)) || new Y__namespace.Map();
|
|
@@ -157,13 +159,20 @@ function parse$2(object, doc) {
|
|
|
157
159
|
cellsOrder.push(mxCells.map((cell) => cell.id));
|
|
158
160
|
mxGraphElement.set(key$3, cells);
|
|
159
161
|
mxGraphElement.set(mxCellOrderKey, cellsOrder);
|
|
162
|
+
const bg = (_a = object._attributes) == null ? void 0 : _a.background;
|
|
163
|
+
if (bg != null && bg !== "") {
|
|
164
|
+
mxGraphElement.set(backgroundKey, String(bg));
|
|
165
|
+
}
|
|
160
166
|
return mxGraphElement;
|
|
161
167
|
}
|
|
162
168
|
function serialize$1(map) {
|
|
163
169
|
const cells = getMap(map, key$3);
|
|
164
170
|
const cellsOrder = getArray(map, mxCellOrderKey);
|
|
171
|
+
const bg = map.get(backgroundKey);
|
|
172
|
+
const _attributes = {};
|
|
173
|
+
if (bg) _attributes.background = bg;
|
|
165
174
|
return {
|
|
166
|
-
_attributes
|
|
175
|
+
_attributes,
|
|
167
176
|
root: {
|
|
168
177
|
[key$3]: cellsOrder.toArray().map((id) => serialize$2(cells.get(id)))
|
|
169
178
|
}
|
|
@@ -264,10 +273,12 @@ function ydoc2xml(doc, spaces = 0) {
|
|
|
264
273
|
}
|
|
265
274
|
return "";
|
|
266
275
|
}
|
|
276
|
+
exports.backgroundKey = backgroundKey;
|
|
267
277
|
exports.diagramOrderKey = diagramOrderKey;
|
|
268
|
-
exports.
|
|
269
|
-
exports.key
|
|
270
|
-
exports.key$
|
|
278
|
+
exports.getMap = getMap;
|
|
279
|
+
exports.key = key$2;
|
|
280
|
+
exports.key$1 = key;
|
|
281
|
+
exports.key$2 = key$1;
|
|
271
282
|
exports.key$3 = key$3;
|
|
272
283
|
exports.mxCellOrderKey = mxCellOrderKey;
|
|
273
284
|
exports.parse = parse$4;
|
|
@@ -276,4 +287,4 @@ exports.serialize = serialize;
|
|
|
276
287
|
exports.serializer = serializer$1;
|
|
277
288
|
exports.xml2ydoc = xml2ydoc;
|
|
278
289
|
exports.ydoc2xml = ydoc2xml;
|
|
279
|
-
//# sourceMappingURL=index-
|
|
290
|
+
//# sourceMappingURL=index-D3Hk2QcW.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-D3Hk2QcW.cjs","sources":["../src/helper/xml.ts","../src/helper/yjs.ts","../src/models/mxCell.ts","../src/models/mxGraphModel.ts","../src/models/diagram.ts","../src/models/mxfile.ts","../src/transform/index.ts"],"sourcesContent":["import { xml2js, js2xml, type ElementCompact } from \"xml-js\";\n\nfunction deepProcess(node: unknown): void {\n if (node == null) return;\n\n if (Array.isArray(node)) {\n for (const item of node) {\n deepProcess(item);\n }\n return;\n }\n\n if (typeof node !== \"object\") return;\n\n const obj = node as Record<string, unknown>;\n const keys = Object.keys(obj);\n for (const key of keys) {\n if (key === \"_attributes\") continue;\n\n let value = obj[key];\n const keyLower = key.toLowerCase();\n\n if (\n (keyLower === \"diagram\" || keyLower === \"mxcell\") &&\n value !== undefined &&\n !Array.isArray(value)\n ) {\n obj[key] = [value];\n value = obj[key];\n }\n\n if (Array.isArray(value)) {\n for (const v of value) deepProcess(v);\n } else if (value && typeof value === \"object\") {\n deepProcess(value);\n }\n }\n}\n\nexport function parse(xml: string) {\n const result = xml2js(xml, { compact: true }) as Record<string, unknown>;\n deepProcess(result);\n return result;\n}\n\nexport function serializer(obj: ElementCompact, spaces = 2) {\n return js2xml(obj, {\n compact: true,\n spaces,\n });\n}\n","import * as Y from \"yjs\";\n\n/**\n * 从 Y.Map 中安全获取子 Map(格式固定,转型安全)\n */\nexport function getMap<T = unknown>(\n parent: Y.Map<unknown>,\n key: string,\n): Y.Map<T> | undefined {\n return parent.get(key) as Y.Map<T> | undefined;\n}\n\n/**\n * 从 Y.Map 中安全获取子 Array(格式固定,转型安全)\n */\nexport function getArray<T = unknown>(\n parent: Y.Map<unknown>,\n key: string,\n): Y.Array<T> | undefined {\n return parent.get(key) as Y.Array<T> | undefined;\n}\n","import * as Y from \"yjs\";\nimport { xml2js, js2xml } from \"xml-js\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"mxCell\";\n\nconst mxGeometryKey = \"mxGeometry\";\nconst mxGeometryAttributeKey = \"geometry\";\n\nexport interface MxCellModel extends ElementCompact {\n [mxGeometryKey]?: ElementCompact;\n}\n\nexport function parse(object: MxCellModel): Y.XmlElement {\n const xmlElement = new Y.XmlElement(\"mxCell\");\n\n for (const attribute of Object.keys(object._attributes || {})) {\n xmlElement.setAttribute(\n attribute,\n `${object._attributes?.[attribute] || \"\"}`,\n );\n }\n\n if (object[mxGeometryKey]) {\n const geometry = object[mxGeometryKey];\n const geometryString = js2xml(\n { [mxGeometryKey]: geometry },\n {\n compact: true,\n },\n );\n xmlElement.setAttribute(mxGeometryAttributeKey, geometryString);\n delete object[mxGeometryKey];\n }\n\n return xmlElement;\n}\n\nexport function serialize(xmlElement: Y.XmlElement) {\n const rawAttributes = {\n ...xmlElement.getAttributes(),\n };\n\n // 提取 mxGeometry(不需要转义,它本身就是 XML 字符串)\n let mxGeometry: ElementCompact | null = null;\n let mxGeometryString: string | undefined;\n\n if (mxGeometryAttributeKey in rawAttributes) {\n mxGeometryString = rawAttributes[mxGeometryAttributeKey];\n delete rawAttributes[mxGeometryAttributeKey];\n }\n\n // 转义其他属性值中的特殊字符\n const attributes: Record<string, string> = {};\n for (const [key, value] of Object.entries(rawAttributes)) {\n if (typeof value === \"string\") {\n attributes[key] = value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n } else if (value != null) {\n attributes[key] = String(value);\n }\n }\n\n // 解析 mxGeometry\n if (mxGeometryString) {\n try {\n const parsed = xml2js(mxGeometryString, { compact: true }) as Record<\n string,\n ElementCompact\n >;\n mxGeometry = parsed[mxGeometryKey] ?? null;\n if (mxGeometry && mxGeometry._attributes) {\n mxGeometry._attributes[\"as\"] = \"geometry\";\n }\n } catch (e) {\n console.warn(\"[y-mxgraph] Failed to parse mxGeometry:\", e);\n }\n }\n\n const obj: Record<string, unknown> = {\n _attributes: attributes,\n };\n\n if (mxGeometry) {\n obj[mxGeometryKey] = mxGeometry;\n }\n\n return obj;\n}\n","import * as Y from \"yjs\";\nimport { getMap, getArray } from \"../helper/yjs\";\n\nimport {\n key as mxCellKey,\n parse as parseMxCell,\n serialize as serializeMxCell,\n type MxCellModel,\n} from \"./mxCell\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"mxGraphModel\";\nexport const mxCellOrderKey = mxCellKey + \"Order\";\n/** 协同同步的 mxGraphModel 属性:仅 background */\nexport const backgroundKey = \"background\";\n\nexport interface MxGraphModel extends ElementCompact {\n _attributes?: Record<string, string>;\n root: {\n mxCell: MxCellModel[];\n };\n}\n\nexport type YMxGraphModel = Y.Map<unknown>;\n\nexport function parse(object: MxGraphModel, doc?: Y.Doc) {\n const mxCells = (object.root[mxCellKey] || []).map((cell: MxCellModel) => {\n return {\n value: parseMxCell(cell),\n id: (cell._attributes?.id || \"\") as string,\n };\n });\n\n const mxGraphElement = doc?.getMap(key) || new Y.Map();\n\n const cells = new Y.Map<Y.XmlElement>();\n const cellsOrder = new Y.Array<string>();\n\n mxCells.forEach((cell) => {\n cells.set(cell.id, cell.value);\n });\n\n cellsOrder.push(mxCells.map((cell) => cell.id));\n\n mxGraphElement.set(mxCellKey, cells);\n mxGraphElement.set(mxCellOrderKey, cellsOrder);\n\n const bg = object._attributes?.background;\n if (bg != null && bg !== \"\") {\n mxGraphElement.set(backgroundKey, String(bg));\n }\n\n return mxGraphElement as YMxGraphModel;\n}\n\nexport function serialize(map: YMxGraphModel) {\n const cells = getMap<Y.XmlElement>(map, mxCellKey)!;\n const cellsOrder = getArray<string>(map, mxCellOrderKey)!;\n const bg = map.get(backgroundKey) as string | undefined;\n const _attributes: Record<string, string> = {};\n if (bg) _attributes.background = bg;\n return {\n _attributes,\n root: {\n [mxCellKey]: cellsOrder\n .toArray()\n .map((id) => serializeMxCell(cells!.get(id) as Y.XmlElement)),\n },\n };\n}\n","import * as Y from \"yjs\";\nimport { getMap } from \"../helper/yjs\";\nimport {\n parse as parseMxGraphModel,\n serialize as serializeMxGraphModel,\n key as mxGraphModelKey,\n type MxGraphModel,\n type YMxGraphModel,\n} from \"./mxGraphModel\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"diagram\";\n\nexport interface Diagram extends ElementCompact {\n mxGraphModel: MxGraphModel;\n}\n\nexport type YDiagram = Y.Map<unknown>;\n\nexport function parse(object: Diagram): YDiagram {\n const yDiagramElement = new Y.Map();\n yDiagramElement.set(\"name\", `${object._attributes?.name || \"\"}`);\n yDiagramElement.set(\"id\", `${object._attributes?.id || \"\"}`);\n\n const mxGraphModel = parseMxGraphModel(object[mxGraphModelKey]);\n\n yDiagramElement.set(mxGraphModelKey, mxGraphModel);\n return yDiagramElement as YDiagram;\n}\n\nexport function serialize(yDiagram: YDiagram) {\n const mxGraphModel = getMap(yDiagram, mxGraphModelKey);\n\n return {\n _attributes: {\n name: yDiagram.get(\"name\") as string,\n id: yDiagram.get(\"id\") as string,\n },\n [mxGraphModelKey]: mxGraphModel\n ? serializeMxGraphModel(mxGraphModel)\n : undefined,\n };\n}\n","import * as Y from \"yjs\";\nimport { getMap, getArray } from \"../helper/yjs\";\nimport {\n parse as parseDiagram,\n key as diagramKey,\n serialize as serializeDiagram,\n} from \"./diagram\";\nimport type { Diagram, YDiagram } from \"./diagram\";\nimport type { ElementCompact } from \"xml-js\";\n\nexport const key = \"mxfile\";\nexport const diagramOrderKey = diagramKey + \"Order\";\n\nexport type YMxFile = Y.Map<unknown>;\n\nexport interface MxFile extends ElementCompact {\n diagram: Diagram[];\n}\n\nexport function parse(object: MxFile, doc: Y.Doc) {\n const mxfile = doc.getMap(key);\n mxfile.set(\"pages\", (object._attributes?.pages || \"1\") + \"\");\n\n const diagramList = object.diagram.map((diagram) => ({\n value: parseDiagram(diagram),\n id: (diagram._attributes?.id || \"\") as string,\n }));\n const diagramMap = new Y.Map<YDiagram>();\n const diagramOrder = new Y.Array<string>();\n diagramList.forEach((diagram) => {\n diagramMap.set(diagram.id, diagram.value);\n });\n diagramOrder.push(diagramList.map((diagram) => diagram.id));\n\n mxfile.set(diagramKey, diagramMap);\n mxfile.set(diagramOrderKey, diagramOrder);\n return mxfile;\n}\n\nexport function serializer(yMxFile: YMxFile): ElementCompact {\n const diagrams = getMap<YDiagram>(yMxFile, diagramKey);\n const diagramOrder = getArray<string>(yMxFile, diagramOrderKey);\n\n const orderIds = diagramOrder ? diagramOrder.toArray() : [];\n // 如果 diagramOrder 为空但 diagram map 不为空,使用 diagram map 中的所有 ID\n const ids =\n orderIds.length > 0\n ? orderIds\n : diagrams\n ? Array.from(diagrams.keys())\n : [];\n\n const obj: Record<string, unknown> = {\n _attributes: {\n pages: (yMxFile.get(\"pages\") as string) || \"1\",\n },\n [diagramKey]: ids\n .map((id) => diagrams!.get(id) as YDiagram)\n .filter((d): d is YDiagram => !!d)\n .map((diagramElement) => serializeDiagram(diagramElement)),\n };\n\n return obj as ElementCompact;\n}\n","import * as Y from \"yjs\";\nimport { parse, serializer } from \"../helper/xml\";\nimport {\n parse as parseMxFile,\n key as mxfileKey,\n serializer as serializerMxFile,\n type YMxFile,\n} from \"../models/mxfile\";\nimport {\n parse as parseMxGraphModel,\n key as mxGraphModelKey,\n serialize as serializerMxGraphModel,\n type YMxGraphModel,\n} from \"../models/mxGraphModel\";\n\nexport function xml2ydoc(xml: string, doc: Y.Doc): Y.Doc {\n const object = parse(xml);\n\n const mxfile = (object as Record<string, unknown>).mxfile;\n const mxGraphModel = (object as Record<string, unknown>).mxGraphModel;\n if (mxfile) {\n doc.transact(() => {\n parseMxFile(mxfile as import(\"../models/mxfile\").MxFile, doc);\n });\n } else if (mxGraphModel) {\n doc.transact(() => {\n parseMxGraphModel(\n mxGraphModel as import(\"../models/mxGraphModel\").MxGraphModel,\n doc,\n );\n });\n } else {\n throw new Error(\"不支持的文件格式\");\n }\n\n return doc;\n}\n\nexport function ydoc2xml(doc: Y.Doc, spaces = 0): string {\n if (doc.share.has(mxfileKey)) {\n return serializer(\n {\n [mxfileKey]: serializerMxFile(doc.getMap(mxfileKey)),\n },\n spaces,\n );\n }\n if (doc.share.has(mxGraphModelKey)) {\n return serializer(\n {\n [mxGraphModelKey]: serializerMxGraphModel(doc.getMap(mxGraphModelKey)),\n },\n spaces,\n );\n }\n\n return \"\";\n}\n"],"names":["key","parse","xml2js","serializer","js2xml","Y","serialize","mxCellKey","_a","parseMxCell","serializeMxCell","parseMxGraphModel","mxGraphModelKey","serializeMxGraphModel","diagramKey","parseDiagram","serializeDiagram","parseMxFile","mxfileKey","serializerMxFile","serializerMxGraphModel"],"mappings":"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"}
|
package/models/diagram.d.ts
CHANGED
package/models/mxGraphModel.d.ts
CHANGED
|
@@ -3,7 +3,10 @@ import { type MxCellModel } from "./mxCell";
|
|
|
3
3
|
import type { ElementCompact } from "xml-js";
|
|
4
4
|
export declare const key = "mxGraphModel";
|
|
5
5
|
export declare const mxCellOrderKey: string;
|
|
6
|
+
/** 协同同步的 mxGraphModel 属性:仅 background */
|
|
7
|
+
export declare const backgroundKey = "background";
|
|
6
8
|
export interface MxGraphModel extends ElementCompact {
|
|
9
|
+
_attributes?: Record<string, string>;
|
|
7
10
|
root: {
|
|
8
11
|
mxCell: MxCellModel[];
|
|
9
12
|
};
|
|
@@ -11,7 +14,7 @@ export interface MxGraphModel extends ElementCompact {
|
|
|
11
14
|
export type YMxGraphModel = Y.Map<unknown>;
|
|
12
15
|
export declare function parse(object: MxGraphModel, doc?: Y.Doc): YMxGraphModel;
|
|
13
16
|
export declare function serialize(map: YMxGraphModel): {
|
|
14
|
-
_attributes:
|
|
17
|
+
_attributes: Record<string, string>;
|
|
15
18
|
root: {
|
|
16
19
|
mxCell: Record<string, unknown>[];
|
|
17
20
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mxGraphModel.d.ts","sourceRoot":"","sources":["../../src/models/mxGraphModel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAE7C,eAAO,MAAM,GAAG,iBAAiB,CAAC;AAClC,eAAO,MAAM,cAAc,QAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"mxGraphModel.d.ts","sourceRoot":"","sources":["../../src/models/mxGraphModel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAE7C,eAAO,MAAM,GAAG,iBAAiB,CAAC;AAClC,eAAO,MAAM,cAAc,QAAsB,CAAC;AAClD,yCAAyC;AACzC,eAAO,MAAM,aAAa,eAAe,CAAC;AAE1C,MAAM,WAAW,YAAa,SAAQ,cAAc;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,IAAI,EAAE;QACJ,MAAM,EAAE,WAAW,EAAE,CAAC;KACvB,CAAC;CACH;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAE3C,wBAAgB,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,GA2B5B,aAAa,CACvC;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,aAAa;;;;;EAc3C"}
|
package/models/view.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { YDiagram } from "./diagram";
|
|
2
|
+
/** draw.io patch 里 view.background 的值 → XML 属性 */
|
|
3
|
+
export declare function patchValueToXmlAttr(value: string): string;
|
|
4
|
+
/** XML background → draw.io patch 用的 JSON 字符串 */
|
|
5
|
+
export declare function xmlAttrToPatchValue(value: string): string;
|
|
6
|
+
export declare function getBackground(diagram: YDiagram): string | undefined;
|
|
7
|
+
export declare function setBackground(diagram: YDiagram, background: string | undefined): void;
|
|
8
|
+
/** 生成 draw.io 可消费的 view patch(仅 background) */
|
|
9
|
+
export declare function diffBackgroundViewPatch(prev: string | undefined, curr: string | undefined): Record<string, string> | undefined;
|
|
10
|
+
/** 应用 draw.io diffPages 的 view 段(仅处理 background) */
|
|
11
|
+
export declare function applyViewPatch(diagram: YDiagram, viewPatch: Record<string, unknown>): void;
|
|
12
|
+
//# sourceMappingURL=view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/models/view.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE1C,kDAAkD;AAClD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED,iDAAiD;AACjD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAKnE;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,QAAQ,EACjB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,IAAI,CAQN;AAED,+CAA+C;AAC/C,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAOpC;AAED,oDAAoD;AACpD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,IAAI,CAeN"}
|
package/package.json
CHANGED
package/transform.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const transform = require("./index-
|
|
3
|
+
const transform = require("./index-D3Hk2QcW.cjs");
|
|
4
4
|
exports.xml2ydoc = transform.xml2ydoc;
|
|
5
5
|
exports.ydoc2xml = transform.ydoc2xml;
|
|
6
6
|
//# sourceMappingURL=transform.cjs.map
|
package/transform.js
CHANGED
package/y-mxgraph.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const transform = require("./index-
|
|
3
|
+
const transform = require("./index-D3Hk2QcW.cjs");
|
|
4
4
|
const Y = require("yjs");
|
|
5
5
|
const colord = require("colord");
|
|
6
6
|
function _interopNamespaceDefault(e) {
|
|
@@ -20,6 +20,54 @@ function _interopNamespaceDefault(e) {
|
|
|
20
20
|
return Object.freeze(n);
|
|
21
21
|
}
|
|
22
22
|
const Y__namespace = /* @__PURE__ */ _interopNamespaceDefault(Y);
|
|
23
|
+
function patchValueToXmlAttr(value) {
|
|
24
|
+
try {
|
|
25
|
+
const parsed = JSON.parse(value);
|
|
26
|
+
if (typeof parsed === "string") return parsed;
|
|
27
|
+
} catch (e) {
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
function xmlAttrToPatchValue(value) {
|
|
32
|
+
return JSON.stringify(value);
|
|
33
|
+
}
|
|
34
|
+
function getBackground(diagram) {
|
|
35
|
+
const gm = transform.getMap(diagram, transform.key);
|
|
36
|
+
if (!gm) return void 0;
|
|
37
|
+
const bg = gm.get(transform.backgroundKey);
|
|
38
|
+
return bg || void 0;
|
|
39
|
+
}
|
|
40
|
+
function setBackground(diagram, background) {
|
|
41
|
+
const gm = transform.getMap(diagram, transform.key);
|
|
42
|
+
if (!gm) return;
|
|
43
|
+
if (background != null && background !== "") {
|
|
44
|
+
gm.set(transform.backgroundKey, background);
|
|
45
|
+
} else {
|
|
46
|
+
gm.delete(transform.backgroundKey);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function diffBackgroundViewPatch(prev, curr) {
|
|
50
|
+
const pv = prev != null ? prev : "";
|
|
51
|
+
const cv = curr != null ? curr : "";
|
|
52
|
+
if (pv === cv) return void 0;
|
|
53
|
+
return {
|
|
54
|
+
background: cv === "" ? '""' : xmlAttrToPatchValue(cv)
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function applyViewPatch(diagram, viewPatch) {
|
|
58
|
+
if (!("background" in viewPatch)) return;
|
|
59
|
+
const raw = viewPatch.background;
|
|
60
|
+
if (raw === null || raw === void 0) {
|
|
61
|
+
setBackground(diagram, void 0);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const str = String(raw);
|
|
65
|
+
if (str === "" || str === '""' || str === "null") {
|
|
66
|
+
setBackground(diagram, void 0);
|
|
67
|
+
} else {
|
|
68
|
+
setBackground(diagram, patchValueToXmlAttr(str));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
23
71
|
var __defProp$1 = Object.defineProperty;
|
|
24
72
|
var __defProps = Object.defineProperties;
|
|
25
73
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
@@ -72,11 +120,39 @@ function ensureUniqueOrder(orderArr) {
|
|
|
72
120
|
dupIdx.sort((a, b) => b - a).forEach((idx) => orderArr.delete(idx, 1));
|
|
73
121
|
}
|
|
74
122
|
}
|
|
123
|
+
function pruneEmptyPatch(patch) {
|
|
124
|
+
var _a, _b;
|
|
125
|
+
if (!patch[DIFF_UPDATE]) return patch;
|
|
126
|
+
for (const id of Object.keys(patch[DIFF_UPDATE])) {
|
|
127
|
+
const u = patch[DIFF_UPDATE][id];
|
|
128
|
+
const cells = u.cells;
|
|
129
|
+
if (cells == null ? void 0 : cells[DIFF_UPDATE]) {
|
|
130
|
+
for (const cid of Object.keys(cells[DIFF_UPDATE])) {
|
|
131
|
+
if (Object.keys(cells[DIFF_UPDATE][cid]).length === 0) {
|
|
132
|
+
delete cells[DIFF_UPDATE][cid];
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (Object.keys(cells[DIFF_UPDATE]).length === 0) {
|
|
136
|
+
delete cells[DIFF_UPDATE];
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (cells && !((_a = cells[DIFF_REMOVE]) == null ? void 0 : _a.length) && !((_b = cells[DIFF_INSERT]) == null ? void 0 : _b.length) && (!cells[DIFF_UPDATE] || Object.keys(cells[DIFF_UPDATE]).length === 0)) {
|
|
140
|
+
delete u.cells;
|
|
141
|
+
}
|
|
142
|
+
if (Object.keys(u).length === 0) {
|
|
143
|
+
delete patch[DIFF_UPDATE][id];
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (Object.keys(patch[DIFF_UPDATE]).length === 0) {
|
|
147
|
+
delete patch[DIFF_UPDATE];
|
|
148
|
+
}
|
|
149
|
+
return patch;
|
|
150
|
+
}
|
|
75
151
|
function applyFilePatch(doc, patch, options) {
|
|
76
152
|
doc.transact(() => {
|
|
77
|
-
const mxfile = doc.getMap(transform.key);
|
|
153
|
+
const mxfile = doc.getMap(transform.key$1);
|
|
78
154
|
if (patch[DIFF_REMOVE]) {
|
|
79
|
-
const diagramsMap = mxfile.get(transform.key$
|
|
155
|
+
const diagramsMap = mxfile.get(transform.key$2);
|
|
80
156
|
const orderArr = mxfile.get(
|
|
81
157
|
transform.diagramOrderKey
|
|
82
158
|
);
|
|
@@ -90,7 +166,7 @@ function applyFilePatch(doc, patch, options) {
|
|
|
90
166
|
}
|
|
91
167
|
}
|
|
92
168
|
if (patch[DIFF_INSERT]) {
|
|
93
|
-
const diagramsMap = mxfile.get(transform.key$
|
|
169
|
+
const diagramsMap = mxfile.get(transform.key$2);
|
|
94
170
|
const orderArr = mxfile.get(
|
|
95
171
|
transform.diagramOrderKey
|
|
96
172
|
);
|
|
@@ -161,7 +237,7 @@ function applyFilePatch(doc, patch, options) {
|
|
|
161
237
|
if (patch[DIFF_UPDATE]) {
|
|
162
238
|
Object.keys(patch[DIFF_UPDATE]).forEach((id) => {
|
|
163
239
|
const diagramsMap = mxfile.get(
|
|
164
|
-
transform.key$
|
|
240
|
+
transform.key$2
|
|
165
241
|
);
|
|
166
242
|
const diagram = diagramsMap.get(id);
|
|
167
243
|
if (diagram) {
|
|
@@ -172,8 +248,11 @@ function applyFilePatch(doc, patch, options) {
|
|
|
172
248
|
update.name || ""
|
|
173
249
|
);
|
|
174
250
|
}
|
|
251
|
+
if (update.view && typeof update.view === "object") {
|
|
252
|
+
applyViewPatch(diagram, update.view);
|
|
253
|
+
}
|
|
175
254
|
if (update.cells) {
|
|
176
|
-
const yMxGraphModel = diagram.get(transform.key
|
|
255
|
+
const yMxGraphModel = diagram.get(transform.key);
|
|
177
256
|
if (!yMxGraphModel) return;
|
|
178
257
|
const cellsMap = yMxGraphModel.get(transform.key$3);
|
|
179
258
|
const orderArr = yMxGraphModel.get(transform.mxCellOrderKey);
|
|
@@ -308,8 +387,8 @@ function applyFilePatch(doc, patch, options) {
|
|
|
308
387
|
}
|
|
309
388
|
function initDocSnapshot(doc, resetSnapshot = false) {
|
|
310
389
|
try {
|
|
311
|
-
const mxfile = doc.getMap(transform.key);
|
|
312
|
-
const diagramsMap = mxfile.get(transform.key$
|
|
390
|
+
const mxfile = doc.getMap(transform.key$1);
|
|
391
|
+
const diagramsMap = mxfile.get(transform.key$2);
|
|
313
392
|
const orderArr = mxfile.get(transform.diagramOrderKey);
|
|
314
393
|
const orderIds = orderArr ? orderArr.toArray() : [];
|
|
315
394
|
const allDiagramIds = orderIds.length > 0 ? orderIds : diagramsMap ? Array.from(diagramsMap.keys()) : [];
|
|
@@ -317,13 +396,14 @@ function initDocSnapshot(doc, resetSnapshot = false) {
|
|
|
317
396
|
const snap = {
|
|
318
397
|
diagramOrder,
|
|
319
398
|
cellsOrder: /* @__PURE__ */ new Map(),
|
|
320
|
-
cellAttrs: /* @__PURE__ */ new Map()
|
|
399
|
+
cellAttrs: /* @__PURE__ */ new Map(),
|
|
400
|
+
diagramBackground: /* @__PURE__ */ new Map()
|
|
321
401
|
};
|
|
322
402
|
const diagrams = diagramOrder.map((id) => diagramsMap.get(id)).filter((d) => !!d);
|
|
323
403
|
for (const d of diagrams) {
|
|
324
404
|
const did = d.get("id") || "";
|
|
325
405
|
if (!did) continue;
|
|
326
|
-
const gm = d.get(transform.key
|
|
406
|
+
const gm = d.get(transform.key);
|
|
327
407
|
if (gm) {
|
|
328
408
|
const order = gm.get(transform.mxCellOrderKey);
|
|
329
409
|
const ids = order ? order.toArray().slice() : [];
|
|
@@ -346,6 +426,7 @@ function initDocSnapshot(doc, resetSnapshot = false) {
|
|
|
346
426
|
snap.cellsOrder.set(did, []);
|
|
347
427
|
snap.cellAttrs.set(did, /* @__PURE__ */ new Map());
|
|
348
428
|
}
|
|
429
|
+
snap.diagramBackground.set(did, getBackground(d));
|
|
349
430
|
}
|
|
350
431
|
docSnapshots.set(doc, snap);
|
|
351
432
|
} catch (e) {
|
|
@@ -358,21 +439,23 @@ function generatePatch(events, explicitDoc) {
|
|
|
358
439
|
const doc = (_b = (_a = events[0]) == null ? void 0 : _a.transaction) == null ? void 0 : _b.doc;
|
|
359
440
|
if (!doc) return patch;
|
|
360
441
|
if (!events || events.length === 0) return patch;
|
|
361
|
-
const mxfile = doc.getMap(transform.key);
|
|
362
|
-
const diagramsMap = mxfile.get(transform.key$
|
|
442
|
+
const mxfile = doc.getMap(transform.key$1);
|
|
443
|
+
const diagramsMap = mxfile.get(transform.key$2);
|
|
363
444
|
const orderArr = mxfile.get(transform.diagramOrderKey);
|
|
364
445
|
let snap = docSnapshots.get(doc);
|
|
365
446
|
if (!snap) {
|
|
366
447
|
snap = {
|
|
367
448
|
diagramOrder: null,
|
|
368
449
|
cellsOrder: /* @__PURE__ */ new Map(),
|
|
369
|
-
cellAttrs: /* @__PURE__ */ new Map()
|
|
450
|
+
cellAttrs: /* @__PURE__ */ new Map(),
|
|
451
|
+
diagramBackground: /* @__PURE__ */ new Map()
|
|
370
452
|
};
|
|
371
453
|
docSnapshots.set(doc, snap);
|
|
372
454
|
}
|
|
373
455
|
const prevDiagramOrder = snap.diagramOrder;
|
|
374
456
|
const prevCellsOrder = snap.cellsOrder;
|
|
375
457
|
const prevCellsAttrs = snap.cellAttrs;
|
|
458
|
+
const prevDiagramBackground = snap.diagramBackground;
|
|
376
459
|
const ensureUpdate = (diagramId) => {
|
|
377
460
|
patch[DIFF_UPDATE] = patch[DIFF_UPDATE] || {};
|
|
378
461
|
patch[DIFF_UPDATE][diagramId] = patch[DIFF_UPDATE][diagramId] || {};
|
|
@@ -388,10 +471,12 @@ function generatePatch(events, explicitDoc) {
|
|
|
388
471
|
const diagramsList = currDiagramOrder.map((id) => diagramsMap.get(id)).filter((d) => !!d);
|
|
389
472
|
const currCellsOrder = /* @__PURE__ */ new Map();
|
|
390
473
|
const cellAttrMap = /* @__PURE__ */ new Map();
|
|
474
|
+
const currDiagramBackground = /* @__PURE__ */ new Map();
|
|
391
475
|
for (const d of diagramsList) {
|
|
392
476
|
const did = d.get("id") || "";
|
|
477
|
+
currDiagramBackground.set(did, getBackground(d));
|
|
393
478
|
const attrs = /* @__PURE__ */ new Map();
|
|
394
|
-
const gm = d.get(transform.key
|
|
479
|
+
const gm = d.get(transform.key);
|
|
395
480
|
if (gm) {
|
|
396
481
|
const cellsMap = gm.get(transform.key$3);
|
|
397
482
|
const orderArr2 = gm.get(transform.mxCellOrderKey);
|
|
@@ -511,19 +596,35 @@ function generatePatch(events, explicitDoc) {
|
|
|
511
596
|
if (!(target instanceof Y__namespace.Map)) continue;
|
|
512
597
|
if (!diagramSet.has(target)) continue;
|
|
513
598
|
const changed = ev.keysChanged || /* @__PURE__ */ new Set();
|
|
514
|
-
if (!changed
|
|
599
|
+
if (!(changed == null ? void 0 : changed.has("name"))) continue;
|
|
515
600
|
const did = target.get("id") || "";
|
|
516
601
|
if (!did || insertedDiagramIdGlobal.has(did)) continue;
|
|
517
|
-
|
|
518
|
-
u.name = target.get("name") || "";
|
|
602
|
+
ensureUpdate(did).name = target.get("name") || "";
|
|
519
603
|
}
|
|
520
604
|
}
|
|
521
605
|
if (!prevDiagramOrder) {
|
|
522
606
|
for (const d of diagramsList) {
|
|
523
607
|
const did = d.get("id") || "";
|
|
524
608
|
if (!did) continue;
|
|
525
|
-
|
|
526
|
-
|
|
609
|
+
ensureUpdate(did).name = d.get("name") || "";
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
for (const ev of events) {
|
|
613
|
+
const target = ev.target;
|
|
614
|
+
if (!(target instanceof Y__namespace.Map)) continue;
|
|
615
|
+
for (const d of diagramsList) {
|
|
616
|
+
const gm = d.get(transform.key);
|
|
617
|
+
if (gm !== target) continue;
|
|
618
|
+
const changed = ev.keysChanged || /* @__PURE__ */ new Set();
|
|
619
|
+
if (!changed.has(transform.backgroundKey)) continue;
|
|
620
|
+
const did = d.get("id") || "";
|
|
621
|
+
if (!did || insertedDiagramIdGlobal.has(did)) continue;
|
|
622
|
+
const viewDiff = diffBackgroundViewPatch(
|
|
623
|
+
prevDiagramBackground.get(did),
|
|
624
|
+
getBackground(d)
|
|
625
|
+
);
|
|
626
|
+
if (viewDiff) ensureUpdate(did).view = viewDiff;
|
|
627
|
+
break;
|
|
527
628
|
}
|
|
528
629
|
}
|
|
529
630
|
for (const ev of events) {
|
|
@@ -552,6 +653,14 @@ function generatePatch(events, explicitDoc) {
|
|
|
552
653
|
}
|
|
553
654
|
}
|
|
554
655
|
if (prevDiagramOrder) {
|
|
656
|
+
for (const [did, currBg] of currDiagramBackground.entries()) {
|
|
657
|
+
if (insertedDiagramIdGlobal.has(did)) continue;
|
|
658
|
+
const viewDiff = diffBackgroundViewPatch(
|
|
659
|
+
prevDiagramBackground.get(did),
|
|
660
|
+
currBg
|
|
661
|
+
);
|
|
662
|
+
if (viewDiff) ensureUpdate(did).view = viewDiff;
|
|
663
|
+
}
|
|
555
664
|
for (const [did, currAttrsMap] of cellAttrMap.entries()) {
|
|
556
665
|
const prevAttrsMap = prevCellsAttrs.get(did) || /* @__PURE__ */ new Map();
|
|
557
666
|
const cellsPatch = ensureCellSection(did);
|
|
@@ -599,8 +708,12 @@ function generatePatch(events, explicitDoc) {
|
|
|
599
708
|
}
|
|
600
709
|
snap.cellsOrder = newCellsOrder;
|
|
601
710
|
snap.cellAttrs = newCellsAttrs;
|
|
711
|
+
snap.diagramBackground = /* @__PURE__ */ new Map();
|
|
712
|
+
for (const [did, bg] of currDiagramBackground.entries()) {
|
|
713
|
+
snap.diagramBackground.set(did, bg);
|
|
714
|
+
}
|
|
602
715
|
docSnapshots.set(doc, snap);
|
|
603
|
-
return patch;
|
|
716
|
+
return pruneEmptyPatch(patch);
|
|
604
717
|
}
|
|
605
718
|
const LOCAL_ORIGIN = {};
|
|
606
719
|
function createMxEventObject(name, props) {
|
|
@@ -1273,8 +1386,8 @@ function mergeFileIntoDoc(doc, fileXml, strategy) {
|
|
|
1273
1386
|
);
|
|
1274
1387
|
return false;
|
|
1275
1388
|
}
|
|
1276
|
-
const mxfileMap = doc.getMap(transform.key);
|
|
1277
|
-
const diagramMap = mxfileMap.get(transform.key$
|
|
1389
|
+
const mxfileMap = doc.getMap(transform.key$1);
|
|
1390
|
+
const diagramMap = mxfileMap.get(transform.key$2);
|
|
1278
1391
|
const diagramOrder = mxfileMap.get(transform.diagramOrderKey);
|
|
1279
1392
|
if (!diagramMap || !diagramOrder) {
|
|
1280
1393
|
console.warn("[y-mxgraph] 合并失败,doc 结构不完整,回退到 replace");
|
|
@@ -1301,7 +1414,7 @@ function mergeFileIntoDoc(doc, fileXml, strategy) {
|
|
|
1301
1414
|
return true;
|
|
1302
1415
|
}
|
|
1303
1416
|
function reconcileInitialContent(doc, file, strategy, applyFileData) {
|
|
1304
|
-
const mxfileMap = doc.getMap(transform.key);
|
|
1417
|
+
const mxfileMap = doc.getMap(transform.key$1);
|
|
1305
1418
|
const docHasData = mxfileMap.size > 0;
|
|
1306
1419
|
const fileHasAnyData = !!file.data;
|
|
1307
1420
|
const fileHasDiagrams = fileHasAnyData && file.data.includes("<diagram");
|
|
@@ -1432,8 +1545,8 @@ class Binding {
|
|
|
1432
1545
|
return;
|
|
1433
1546
|
}
|
|
1434
1547
|
if (this.shouldReplaceWhenDocHasData && !transaction.local) {
|
|
1435
|
-
const mxfileMap = doc.getMap(transform.key);
|
|
1436
|
-
const diagramMap = mxfileMap.get(transform.key$
|
|
1548
|
+
const mxfileMap = doc.getMap(transform.key$1);
|
|
1549
|
+
const diagramMap = mxfileMap.get(transform.key$2);
|
|
1437
1550
|
if (diagramMap && diagramMap.size > 0) {
|
|
1438
1551
|
const xml = transform.ydoc2xml(doc);
|
|
1439
1552
|
if (xml && xml.includes("<diagram")) {
|
|
@@ -1465,7 +1578,7 @@ class Binding {
|
|
|
1465
1578
|
this.suppressLocalApply = false;
|
|
1466
1579
|
}
|
|
1467
1580
|
};
|
|
1468
|
-
doc.getMap(transform.key).observeDeep(this.docObserver);
|
|
1581
|
+
doc.getMap(transform.key$1).observeDeep(this.docObserver);
|
|
1469
1582
|
if (awareness) {
|
|
1470
1583
|
this.cleanupCollaborator = bindCollaborator(file, {
|
|
1471
1584
|
awareness,
|
|
@@ -1500,7 +1613,7 @@ class Binding {
|
|
|
1500
1613
|
destroy(deep = false) {
|
|
1501
1614
|
var _a, _b;
|
|
1502
1615
|
this.mxGraphModel.removeListener("change", this.mxListener);
|
|
1503
|
-
this.doc.getMap(transform.key).unobserveDeep(this.docObserver);
|
|
1616
|
+
this.doc.getMap(transform.key$1).unobserveDeep(this.docObserver);
|
|
1504
1617
|
if (deep) {
|
|
1505
1618
|
(_a = this.cleanupCollaborator) == null ? void 0 : _a.call(this);
|
|
1506
1619
|
(_b = this.cleanupUndoManager) == null ? void 0 : _b.call(this);
|