mirror of
https://github.com/BookStackApp/BookStack.git
synced 2024-10-01 01:36:00 -04:00
Started draw.io integration
This commit is contained in:
parent
03eb63ec77
commit
0dc1f0b07f
@ -220,6 +220,124 @@ function codePlugin() {
|
|||||||
}
|
}
|
||||||
codePlugin();
|
codePlugin();
|
||||||
|
|
||||||
|
function drawIoPlugin() {
|
||||||
|
|
||||||
|
const drawIoUrl = 'https://www.draw.io/?embed=1&ui=atlas&spin=1&proto=json';
|
||||||
|
let iframe = null;
|
||||||
|
let pageEditor = null;
|
||||||
|
|
||||||
|
function isDrawing(node) {
|
||||||
|
return node.hasAttribute('drawio-diagram');
|
||||||
|
}
|
||||||
|
|
||||||
|
function showDrawingEditor(mceEditor) {
|
||||||
|
pageEditor = mceEditor;
|
||||||
|
iframe = document.createElement('iframe');
|
||||||
|
iframe.setAttribute('frameborder', '0');
|
||||||
|
window.addEventListener('message', drawReceive);
|
||||||
|
iframe.setAttribute('src', drawIoUrl);
|
||||||
|
iframe.setAttribute('class', 'fullscreen');
|
||||||
|
document.body.appendChild(iframe);
|
||||||
|
}
|
||||||
|
|
||||||
|
function drawReceive(event) {
|
||||||
|
if (!event.data || event.data.length < 1) return;
|
||||||
|
let message = JSON.parse(event.data);
|
||||||
|
console.log(message);
|
||||||
|
if (message.event === 'init') {
|
||||||
|
drawEventInit();
|
||||||
|
} else if (message.event === 'exit') {
|
||||||
|
drawEventClose();
|
||||||
|
} else if (message.event === 'save') {
|
||||||
|
drawEventSave(message);
|
||||||
|
} else if (message.event === 'export') {
|
||||||
|
drawEventExport(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateContent(svg) {
|
||||||
|
let svgWrap = document.createElement('div');
|
||||||
|
svgWrap.setAttribute('drawio-diagram', svg);
|
||||||
|
svgWrap.setAttribute('contenteditable', 'false');
|
||||||
|
pageEditor.insertContent(svgWrap.outerHTML);
|
||||||
|
}
|
||||||
|
|
||||||
|
function b64DecodeUnicode(str) {
|
||||||
|
str = str.split(';base64,')[1];
|
||||||
|
// Going backwards: from bytestream, to percent-encoding, to original string.
|
||||||
|
return decodeURIComponent(atob(str).split('').map(function(c) {
|
||||||
|
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
|
||||||
|
}).join(''));
|
||||||
|
}
|
||||||
|
|
||||||
|
function drawEventExport(message) {
|
||||||
|
updateContent(message.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
function drawEventSave(message) {
|
||||||
|
drawPostMessage({action: 'export', format: 'svg', xml: message.xml, spin: 'Updating drawing'});
|
||||||
|
}
|
||||||
|
|
||||||
|
function drawEventInit() {
|
||||||
|
drawPostMessage({action: 'load', autosave: 1, xml: ''});
|
||||||
|
}
|
||||||
|
|
||||||
|
function drawEventClose() {
|
||||||
|
window.removeEventListener('message', drawReceive);
|
||||||
|
if (iframe) document.body.removeChild(iframe);
|
||||||
|
}
|
||||||
|
|
||||||
|
function drawPostMessage(data) {
|
||||||
|
iframe.contentWindow.postMessage(JSON.stringify(data), '*');
|
||||||
|
}
|
||||||
|
|
||||||
|
window.tinymce.PluginManager.add('drawio', function(editor, url) {
|
||||||
|
|
||||||
|
let $ = editor.$;
|
||||||
|
|
||||||
|
editor.addCommand('drawio', () => {
|
||||||
|
showDrawingEditor(editor);
|
||||||
|
});
|
||||||
|
|
||||||
|
editor.addButton('drawio', {
|
||||||
|
text: 'Drawing',
|
||||||
|
icon: false,
|
||||||
|
cmd: 'drawio'
|
||||||
|
});
|
||||||
|
|
||||||
|
editor.on('dblclick', event => {
|
||||||
|
let selectedNode = editor.selection.getNode();
|
||||||
|
if (!isDrawing(selectedNode)) return;
|
||||||
|
showDrawingEditor(editor);
|
||||||
|
});
|
||||||
|
|
||||||
|
editor.on('PreProcess', function (e) {
|
||||||
|
$('div[drawio-diagram]', e.node).
|
||||||
|
each((index, elem) => {
|
||||||
|
let $elem = $(elem);
|
||||||
|
let svgData = b64DecodeUnicode($elem.attr('drawio-diagram'));
|
||||||
|
$elem.html(svgData);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
editor.on('SetContent', function () {
|
||||||
|
|
||||||
|
let drawings = $('body > div[drawio-diagram]');
|
||||||
|
|
||||||
|
if (!drawings.length) return;
|
||||||
|
editor.undoManager.transact(function () {
|
||||||
|
drawings.each((index, elem) => {
|
||||||
|
let svgContent = b64DecodeUnicode(elem.getAttribute('drawio-diagram'));
|
||||||
|
elem.setAttribute('contenteditable', 'false');
|
||||||
|
elem.innerHTML = svgContent;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
drawIoPlugin();
|
||||||
|
|
||||||
window.tinymce.PluginManager.add('customhr', function (editor) {
|
window.tinymce.PluginManager.add('customhr', function (editor) {
|
||||||
editor.addCommand('InsertHorizontalRule', function () {
|
editor.addCommand('InsertHorizontalRule', function () {
|
||||||
let hrElem = document.createElement('hr');
|
let hrElem = document.createElement('hr');
|
||||||
@ -259,12 +377,12 @@ module.exports = {
|
|||||||
statusbar: false,
|
statusbar: false,
|
||||||
menubar: false,
|
menubar: false,
|
||||||
paste_data_images: false,
|
paste_data_images: false,
|
||||||
extended_valid_elements: 'pre[*]',
|
extended_valid_elements: 'pre[*],svg[*],div[drawio-diagram]',
|
||||||
automatic_uploads: false,
|
automatic_uploads: false,
|
||||||
valid_children: "-div[p|h1|h2|h3|h4|h5|h6|blockquote],+div[pre]",
|
valid_children: "-div[p|h1|h2|h3|h4|h5|h6|blockquote],+div[pre],+div[svg],+svg",
|
||||||
plugins: "image table textcolor paste link autolink fullscreen imagetools code customhr autosave lists codeeditor",
|
plugins: "image table textcolor paste link autolink fullscreen imagetools code customhr autosave lists codeeditor drawio",
|
||||||
imagetools_toolbar: 'imageoptions',
|
imagetools_toolbar: 'imageoptions',
|
||||||
toolbar: "undo redo | styleselect | bold italic underline strikethrough superscript subscript | forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | table image-insert link hr | removeformat code fullscreen",
|
toolbar: "undo redo | styleselect | bold italic underline strikethrough superscript subscript | forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | table image-insert link hr | removeformat code fullscreen drawio",
|
||||||
content_style: "body {padding-left: 15px !important; padding-right: 15px !important; margin:0!important; margin-left:auto!important;margin-right:auto!important;}",
|
content_style: "body {padding-left: 15px !important; padding-right: 15px !important; margin:0!important; margin-left:auto!important;margin-right:auto!important;}",
|
||||||
style_formats: [
|
style_formats: [
|
||||||
{title: "Header Large", format: "h2"},
|
{title: "Header Large", format: "h2"},
|
||||||
|
@ -231,4 +231,16 @@ $btt-size: 40px;
|
|||||||
input {
|
input {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.fullscreen {
|
||||||
|
border:0;
|
||||||
|
position:fixed;
|
||||||
|
top:0;
|
||||||
|
left:0;
|
||||||
|
right:0;
|
||||||
|
bottom:0;
|
||||||
|
width:100%;
|
||||||
|
height:100%;
|
||||||
|
z-index: 150;
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user