});
}
- 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></pre>');
- $pre.append($('<code></code>').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',
// 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);
});
});
$('.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";
});
});
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 () {
}
+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) {
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;
});
}
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);
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();