X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/114f10d5ca3e1f0b7070846df8e4e596487fb026..d6456e961afde217e045140fdf8cf88921897536:/resources/assets/js/components/wysiwyg-editor.js diff --git a/resources/assets/js/components/wysiwyg-editor.js b/resources/assets/js/components/wysiwyg-editor.js index 614cfb80f..c03c0d2aa 100644 --- a/resources/assets/js/components/wysiwyg-editor.js +++ b/resources/assets/js/components/wysiwyg-editor.js @@ -168,23 +168,24 @@ function codePlugin() { }); } - function codeMirrorContainerToPre($codeMirrorContainer) { - let textArea = $codeMirrorContainer[0].querySelector('textarea'); - let code = textArea.textContent; - let lang = $codeMirrorContainer[0].getAttribute('data-lang'); - - $codeMirrorContainer.removeAttr('contentEditable'); - let $pre = $('
'); - $pre.append($('
').each((index, elem) => {
- // Needs to be textContent since innerText produces BR:s
- elem.textContent = code;
- }).attr('class', `language-${lang}`));
- $codeMirrorContainer.replaceWith($pre);
+ function codeMirrorContainerToPre(codeMirrorContainer) {
+ const textArea = codeMirrorContainer.querySelector('textarea');
+ const code = textArea.textContent;
+ const lang = codeMirrorContainer.getAttribute('data-lang');
+
+ codeMirrorContainer.removeAttribute('contentEditable');
+ const pre = document.createElement('pre');
+ const codeElem = document.createElement('code');
+ codeElem.classList.add(`language-${lang}`);
+ codeElem.textContent = code;
+ pre.appendChild(codeElem);
+
+ codeMirrorContainer.parentElement.replaceChild(pre, codeMirrorContainer);
}
window.tinymce.PluginManager.add('codeeditor', function(editor, url) {
- let $ = editor.$;
+ const $ = editor.$;
editor.addButton('codeeditor', {
text: 'Code block',
@@ -198,10 +199,8 @@ function codePlugin() {
// Convert
editor.on('PreProcess', function (e) {
- $('div.CodeMirrorContainer', e.node).
- each((index, elem) => {
- let $elem = $(elem);
- codeMirrorContainerToPre($elem);
+ $('div.CodeMirrorContainer', e.node).each((index, elem) => {
+ codeMirrorContainerToPre(elem);
});
});
@@ -217,10 +216,10 @@ function codePlugin() {
$('.CodeMirrorContainer').filter((index ,elem) => {
return typeof elem.querySelector('.CodeMirror').CodeMirror === 'undefined';
}).each((index, elem) => {
- codeMirrorContainerToPre($(elem));
+ codeMirrorContainerToPre(elem);
});
- let codeSamples = $('body > pre').filter((index, elem) => {
+ const codeSamples = $('body > pre').filter((index, elem) => {
return elem.contentEditable !== "false";
});
@@ -341,7 +340,7 @@ function drawIoPlugin() {
});
editor.on('SetContent', function () {
- let drawings = editor.$('body > div[drawio-diagram]');
+ const drawings = editor.$('body > div[drawio-diagram]');
if (!drawings.length) return;
editor.undoManager.transact(function () {
@@ -379,6 +378,27 @@ function customHrPlugin() {
}
+function listenForBookStackEditorEvents(editor) {
+
+ // Replace editor content
+ window.$events.listen('editor::replace', ({html}) => {
+ editor.setContent(html);
+ });
+
+ // Append editor content
+ window.$events.listen('editor::append', ({html}) => {
+ const content = editor.getContent() + html;
+ editor.setContent(content);
+ });
+
+ // Prepend editor content
+ window.$events.listen('editor::prepend', ({html}) => {
+ const content = html + editor.getContent();
+ editor.setContent(content);
+ });
+
+}
+
class WysiwygEditor {
constructor(elem) {
@@ -472,9 +492,10 @@ class WysiwygEditor {
if (type === 'file') {
window.EntitySelectorPopup.show(function(entity) {
- let originalField = win.document.getElementById(field_name);
+ const originalField = win.document.getElementById(field_name);
originalField.value = entity.link;
- $(originalField).closest('.mce-form').find('input').eq(2).val(entity.name);
+ const mceForm = originalField.closest('.mce-form');
+ mceForm.querySelectorAll('input')[2].value = entity.name;
});
}
@@ -553,6 +574,10 @@ class WysiwygEditor {
editor.focus();
}
+ listenForBookStackEditorEvents(editor);
+
+ // TODO - Update to standardise across both editors
+ // Use events within listenForBookStackEditorEvents instead (Different event signature)
window.$events.listen('editor-html-update', html => {
editor.setContent(html);
editor.selection.select(editor.getBody(), true);
@@ -583,6 +608,18 @@ class WysiwygEditor {
let dom = editor.dom,
rng = tinymce.dom.RangeUtils.getCaretRangeFromPoint(event.clientX, event.clientY, editor.getDoc());
+ // Template insertion
+ const templateId = event.dataTransfer.getData('bookstack/template');
+ if (templateId) {
+ event.preventDefault();
+ window.$http.get(`/templates/${templateId}`).then(resp => {
+ editor.selection.setRng(rng);
+ editor.undoManager.transact(function () {
+ editor.execCommand('mceInsertContent', false, resp.data.html);
+ });
+ });
+ }
+
// Don't allow anything to be dropped in a captioned image.
if (dom.getParent(rng.startContainer, '.mceTemp')) {
event.preventDefault();