Uncompress drawio XML for better chainpad patches
This commit is contained in:
parent
8801418030
commit
c73377b8f1
3 changed files with 63 additions and 6 deletions
|
@ -49,7 +49,9 @@
|
|||
"requirejs-plugins": "^1.0.3",
|
||||
"dragula.js": "3.7.2",
|
||||
"MathJax": "3.0.5",
|
||||
"drawio": "jgraph/drawio#v20.8.18"
|
||||
"drawio": "jgraph/drawio#v20.8.18",
|
||||
"js-base64": "^3.7.5",
|
||||
"pako": "^2.1.0"
|
||||
},
|
||||
"resolutions": {
|
||||
"bootstrap": "^v4.0.0",
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
<mxfile host="app.diagrams.net" modified="2023-02-09T14:31:26.715Z" agent="5.0 (X11)" version="20.8.3" etag="vZrRUdoCIbYwi7awANB8" type="device"><diagram id="B2HR0nVHLojD-jhrMkZj" name="Seite-1">dZFNE4IgEIZ/DXeFvjyb1aWTh86MbMIMug7SaP36dICMsU4sz77vLrsQljfj2fBOXlGAJjQRI2FHQmmaZMl0zOTpyGGzdaA2SnjRAkr1guD09KEE9JHQImqruhhW2LZQ2YhxY3CIZXfUcdeO17ACZcX1mt6UsNJPQfcLv4CqZeic7jKXaXgQ+0l6yQUOX4gVhOUG0bqoGXPQ8/LCXpzv9Cf7eZiB1v4wTMFSe7pEP8SKNw==</diagram></mxfile>
|
|
@ -2,26 +2,36 @@
|
|||
define([
|
||||
'/common/sframe-app-framework.js',
|
||||
'/customize/messages.js', // translation keys
|
||||
'text!/drawio/empty.drawio',
|
||||
'/bower_components/pako/dist/pako.min.js',
|
||||
'/bower_components/js-base64/base64.js',
|
||||
'less!/drawio/app.less',
|
||||
'css!/drawio/drawio.css',
|
||||
], function (
|
||||
Framework,
|
||||
Messages,
|
||||
emptyDrawioXml) {
|
||||
pako,
|
||||
base64) {
|
||||
|
||||
console.log('XXX base64', base64);
|
||||
|
||||
// This is the main initialization loop
|
||||
var onFrameworkReady = function (framework) {
|
||||
const drawioFrame = document.querySelector('#cp-app-drawio-content');
|
||||
let lastContent = emptyDrawioXml;
|
||||
let lastContent = '';
|
||||
let drawIoInitalized = false;
|
||||
|
||||
const postMessageToDrawio = function(msg) {
|
||||
if (!drawIoInitalized) {
|
||||
return;
|
||||
}
|
||||
|
||||
console.log('XXX postMessageToDrawio', msg);
|
||||
drawioFrame.contentWindow.postMessage(JSON.stringify(msg), '*');
|
||||
};
|
||||
|
||||
const onDrawioInit = function(data) {
|
||||
drawIoInitalized = true;
|
||||
|
||||
postMessageToDrawio({
|
||||
action: 'load',
|
||||
xml: lastContent,
|
||||
|
@ -30,6 +40,7 @@ define([
|
|||
};
|
||||
|
||||
const onDrawioChange = function(newXml) {
|
||||
newXml = decompressDrawioXml(newXml);
|
||||
if (lastContent != newXml) {
|
||||
lastContent = newXml;
|
||||
framework.localChange();
|
||||
|
@ -71,7 +82,18 @@ define([
|
|||
// starting the CryptPad framework
|
||||
framework.start();
|
||||
|
||||
drawioFrame.src = '/bower_components/drawio/src/main/webapp/index.html?pages=0&dev=1&stealth=1&embed=1&drafts=0&noSaveBtn=1&modified=unsavedChanges&proto=json';
|
||||
drawioFrame.src = '/bower_components/drawio/src/main/webapp/index.html?'
|
||||
+ new URLSearchParams({
|
||||
// pages: 0,
|
||||
dev: 1,
|
||||
test: 1,
|
||||
stealth: 1,
|
||||
embed: 1,
|
||||
drafts: 0,
|
||||
noSaveBtn: 1,
|
||||
modified: 'unsavedChanges',
|
||||
proto: 'json',
|
||||
});
|
||||
|
||||
window.addEventListener("message", (event) => {
|
||||
if (event.source == drawioFrame.contentWindow) {
|
||||
|
@ -86,6 +108,40 @@ define([
|
|||
}, false);
|
||||
};
|
||||
|
||||
// As described here: https://drawio-app.com/extracting-the-xml-from-mxfiles/
|
||||
let decompressDrawioXml = function(xmlDocStr) {
|
||||
const TEXT_NODE = 3;
|
||||
|
||||
const parser = new DOMParser();
|
||||
const doc = parser.parseFromString(xmlDocStr, "application/xml");
|
||||
|
||||
doc.firstChild.removeAttribute('modified');
|
||||
doc.firstChild.removeAttribute('agent');
|
||||
doc.firstChild.removeAttribute('etag');
|
||||
|
||||
const errorNode = doc.querySelector("parsererror");
|
||||
if (errorNode) {
|
||||
console.error("error while parsing", errorNode);
|
||||
return xmlStr;
|
||||
}
|
||||
|
||||
const diagrams = doc.querySelectorAll('diagram');
|
||||
|
||||
diagrams.forEach((diagram) => {
|
||||
if (diagram.firstChild && diagram.firstChild.nodeType == TEXT_NODE) {
|
||||
const innerText = diagram.firstChild.nodeValue;
|
||||
const bin = base64.toUint8Array(innerText);
|
||||
const xmlUrlStr = pako.inflateRaw(bin, {to: 'string'});
|
||||
const xmlStr = decodeURIComponent(xmlUrlStr);
|
||||
const diagramDoc = parser.parseFromString(xmlStr, "application/xml");
|
||||
diagram.replaceChild(diagramDoc.firstChild, diagram.firstChild);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
return new XMLSerializer().serializeToString(doc);
|
||||
}
|
||||
|
||||
// Framework initialization
|
||||
Framework.create({
|
||||
toolbarContainer: '#cme_toolbox',
|
||||
|
|
Loading…
Reference in a new issue