edit/page: replace format selection by style options
[minimedit.git] / edit / page.js
index 3071844a96e685c64d8ae6328e81af773e940bc2..f927c1fd248c2d746996e791ed51e1676432b8d5 100644 (file)
@@ -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(/((?!<p>).{3})(?:\s|\u200B)+(?=<\/p>)/g, '$1');
                                // empty line is equivalent to a paragraph break
                                body = body.replace(/<br \/>\s*<br \/>/g, '<p>');
+                               // keep names and preceding abbreviations together
+                               body = body.replace(/\b((?:dhr|mw|me?vr|mr?s?)\.)\s+(?=[A-Z])/ig, '$1&nbsp;');
                                // wrap long line after each sentence
                                body = body.replace(/^(\t*).{73,}/mg, function (line, indent) {
                                        var dots = '(?:.{24,72}|.{73,}?)'; // chars before punctuation
@@ -101,7 +115,6 @@ 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.entities = false; // keep unicode
                config.filebrowserImageUploadUrl = '/edit/page?output=ckescript';
@@ -109,23 +122,30 @@ CKEDITOR.on('instanceCreated', function (event) {
                config.image2_alignClasses = ['left', 'center', 'right'];
                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.toolbar = [
                        ['Inlinesave', '-', 'Undo', 'Redo'],
-                       ['Format', 'Styles'],
-                       ['Bold', 'Italic', 'Link'],
+                       ['Styles', 'Bold', 'Italic', 'Link'],
                        ['BulletedList', 'NumberedList', 'Blockquote'],
                        ['Table', 'CreateDiv'],
                        ['Image', 'HorizontalRule', 'CreatePlaceholder'],
@@ -149,20 +169,23 @@ CKEDITOR.on('instanceCreated', function (event) {
        };
 });
 
-       CKEDITOR.disableAutoInline = true;
-
-// add edit link to menu
-var pagebody = document.getElementsByClassName('static')[0];
 if (pagebody) {
+       // add edit link to menu
        var editlink = document.querySelector('a[href="#edit"]');
        if (editlink)
        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 +196,12 @@ if (pagebody) {
        }
 }
 
+}
+
+document.addEventListener('DOMContentLoaded', function (e) {
+       pagebody = editorcontents().cloneNode(true);
+       var editorinc = document.createElement('script');
+       editorinc.addEventListener('load', editorsetup);
+       editorinc.src = ckesrc;
+       document.getElementsByTagName('head')[0].appendChild(editorinc);
+});