X-Git-Url: http://git.shiar.nl/minimedit.git/blobdiff_plain/d3ed59c2753c2babd5aa9a1c5e0109c644904ba8..d09e700618e8dd4e990870f5650c2fe42497ca62:/edit/page.js diff --git a/edit/page.js b/edit/page.js index 3071844..3101ea1 100644 --- a/edit/page.js +++ b/edit/page.js @@ -1,11 +1,25 @@ +var pagebody; + +function editorcontents() { + return document.getElementsByClassName('static')[0]; +} + +function editorsetup() { + +CKEDITOR.disableAutoInline = true; + CKEDITOR.plugins.add('inlinesave', { init: function(editor) { editor.addCommand( 'inlinesave', { exec: function (editor) { var pagename = window.location.pathname; var body = editor.getData(); + // trim trailing whitespace in non-empty paragraphs + body = body.replace(/((?!

).{3})(?:\s|\u200B)+(?=<\/p>)/g, '$1'); // empty line is equivalent to a paragraph break body = body.replace(/
\s*
/g, '

'); + // keep names and preceding abbreviations together + body = body.replace(/\b((?:[Dd]hr|[Mm](?:w|e?vr|r|r?ss?)|[A-Z])\.)\s+(?=[A-Zdtv])/g, '$1 '); // wrap long line after each sentence body = body.replace(/^(\t*).{73,}/mg, function (line, indent) { var dots = '(?:.{24,72}|.{73,}?)'; // chars before punctuation @@ -14,6 +28,10 @@ CKEDITOR.plugins.add('inlinesave', { }); // treat standalone placeholders as block elements body = body.replace(/

(\[\[.*\]\])<\/p>/g, '$1'); + // strip redundant domain in relative urls + var hostlink = 'https?://' + window.location.hostname.replace(/\W/g, '\\$&'); + hostlink = new RegExp('(]*href="|]*src=")' + hostlink + '(?=/)', 'gi'); + body = body.replace(hostlink, '$1'); var data = 'body='+encodeURIComponent(body); var ajaxpost = new XMLHttpRequest(); @@ -39,7 +57,7 @@ CKEDITOR.plugins.add('inlinesave', { ajaxpost.send(data); }, }); - editor.setKeystroke(CKEDITOR.CTRL + 83 /*S*/, 'inlinesave'); + editor.setKeystroke(CKEDITOR.CTRL + 'S'.charCodeAt(0), 'inlinesave'); editor.ui.addButton( 'Inlinesave', { command: 'inlinesave', label: editor.lang.save.toolbar, @@ -101,31 +119,46 @@ CKEDITOR.on('instanceCreated', function (event) { var config = editor.config; config.language = 'nl'; config.extraPlugins = 'inlinesave,placeholder,image2,uploadimage'; - config.format_tags = 'h2;h3;h4;p'; - config.allowedContent = true; + config.removePlugins = 'image,exportpdf'; // conflicts with imag2 + config.allowedContent = { + $1: { + elements: CKEDITOR.dtd, + attributes: true, + styles: true, + classes: true, + }, + }; + config.disallowedContent = 'img[width,height]'; config.entities = false; // keep unicode - config.filebrowserImageUploadUrl = '/edit/page?output=ckescript'; - config.uploadUrl = '/edit/page?output=ckjson'; + config.filebrowserImageUploadUrl = '/edit/page?output=ckjson'; config.image2_alignClasses = ['left', 'center', 'right']; + config.image2_prefillDimensions = false; config.image2_disableResizer = true; config.stylesSet = [ - { name: 'Klein', element: 'small' }, - { name: 'Zijkant', element: 'span', attributes: { 'class': 'right' } }, - { name: 'Attributie', element: 'em', attributes: { 'class': 'right' } }, - { name: 'Quote', element: 'q' }, - { name: 'Gemarkeerd', element: 'span', styles: { 'background-color': 'Yellow' } }, + { name: 'Paginakop', element: 'h2' }, + { name: 'Paragraafkop', element: 'h3' }, + { name: 'Alineakop', element: 'h4' }, - { name: 'Kadertekst', element: 'aside' }, - { name: 'Uitgelijnd', element: 'div', attributes: { 'class': 'right' } }, + { name: 'Gerelateerd', element: 'aside' }, + { name: 'Voetnoot', element: 'div', attributes: { 'class': 'right' } }, { name: 'Kolom', element: 'div', attributes: { 'class': 'col' } }, + { name: 'Navigatie', element: 'p', attributes: { 'class': 'nav' } }, { name: 'Waarschuwing', element: 'div', attributes: { 'class': 'warn' } }, + + { name: 'Klein', element: 'small' }, + { name: 'Aanhaling', element: 'q' }, + { name: 'Doorstreept', element: 's' }, + { name: 'Gemarkeerd', element: 'mark' }, + { name: 'Rechts', element: 'span', attributes: { 'class': 'right' } }, + { name: 'Attributie', element: 'em', attributes: { 'class': 'right' } }, + { name: 'Ingelogd', element: 'span', attributes: { 'class': 'login' } }, + { name: 'Uitgelogd', element: 'span', attributes: { 'class': 'logout' } }, ]; config.pasteFilter = pastefilter; - config.contentsCss = document.styleSheets[0].href; + config.contentsCss = [...document.styleSheets].map(e => e.href).filter(Boolean); config.toolbar = [ ['Inlinesave', '-', 'Undo', 'Redo'], - ['Format', 'Styles'], - ['Bold', 'Italic', 'Link'], + ['Styles', 'Bold', 'Italic', 'Link'], ['BulletedList', 'NumberedList', 'Blockquote'], ['Table', 'CreateDiv'], ['Image', 'HorizontalRule', 'CreatePlaceholder'], @@ -149,20 +182,27 @@ CKEDITOR.on('instanceCreated', function (event) { }; }); - CKEDITOR.disableAutoInline = true; - -// add edit link to menu -var pagebody = document.getElementsByClassName('static')[0]; if (pagebody) { - var editlink = document.querySelector('a[href="#edit"]'); - if (editlink) + // add edit link to menu + var editdiv = document.querySelector('header .login > p'); + if (!editdiv) return; + var editlink = editdiv.appendChild(document.createElement('a')); + editlink.append('\u270D'); + editlink.className = 'icon icon-edit'; + editlink.href = '#edit'; editlink.onclick = function (e) { editlink.style.fontWeight = 'bold'; editlink.href = ''; editlink.onclick = undefined; + document.body.replaceChild(pagebody, editorcontents()); pagebody.setAttribute('contenteditable', true); pagebody.querySelectorAll('[data-dyn]').forEach(function (el) { - el.outerHTML = '[[' + el.getAttribute('data-dyn') + ']]'; + let blockname = el.getAttribute('data-dyn'); + if (!blockname) { + el.remove(); + return; + } + el.outerHTML = '[[' + blockname + ']]'; }); CKEDITOR.inline(pagebody, { customConfig: '' }); document.body.className = 'edit'; @@ -173,3 +213,15 @@ if (pagebody) { } } +} + +var ckesrc = document.currentScript.getAttribute('data-ckesrc'); +document.addEventListener('DOMContentLoaded', function (e) { + pagebody = editorcontents(); + if (!pagebody) return; + pagebody = pagebody.cloneNode(true); + var editorinc = document.createElement('script'); + editorinc.addEventListener('load', editorsetup); + editorinc.src = ckesrc; + document.getElementsByTagName('head')[0].appendChild(editorinc); +});