]> git.0d.be Git - panikdb.git/commitdiff
wiki: add support for (unordered) lists
authorFrédéric Péters <fpeters@0d.be>
Sat, 20 Jun 2020 08:50:11 +0000 (10:50 +0200)
committerFrédéric Péters <fpeters@0d.be>
Sat, 20 Jun 2020 08:50:11 +0000 (10:50 +0200)
panikdb/static/js/combo.wiki.js

index 524b041b0b0dada30cbe83c028ccef054310b61a..dc9a74ebfc77f04da59216c9f079a51aa3210e35 100644 (file)
@@ -37,6 +37,7 @@ function auto_anchors() {
   var Phylly = {
     BLOCKS: [
           {name: 'intertitre', tag: 'H4', klass: 'intertitle'},
+          {name: 'liste', special: 'list', tag: 'UL', klass: 'list'},
           {name: 'illustration', special: 'img', tag: 'DIV', subtag: true, klass: 'figure'},
           {name: 'code', tag: 'PRE', klass: 'code'},
           {name: 'note', tag: 'DIV', subtag: true, klass: 'note'},
@@ -70,6 +71,20 @@ function auto_anchors() {
         sel.removeAllRanges();
         sel.addRange(range);
       }
+      if (sel.anchorNode.tagName == "LI" && sel.anchorNode.innerHTML == "<br>") {
+        // new empty li got inserted, insert a <p> within
+        var empty_p = document.createElement('P');
+        empty_p.appendChild(document.createElement('BR'));
+        var empty_li = anchorNode;
+        if (empty_li.childNodes.length) { // lone <br>
+          empty_li.removeChild(empty_li.childNodes[0]);
+        }
+        empty_li.appendChild(empty_p);
+        var range = document.createRange();
+        range.setStart(empty_p, 0);
+        sel.removeAllRanges();
+        sel.addRange(range);
+      }
       var prev_p = sel.anchorNode.previousSibling;
       if (! prev_p) return;
       if (prev_p.tagName != 'P') {
@@ -149,6 +164,11 @@ function auto_anchors() {
     if (node.parentNode.contentEditable === 'true') return node;
     return get_contenteditable_subnode(node.parentNode);
   }
+  function get_parent(node, type) {
+   if (node === null) return null;
+   if (node.tagName == type) return node;
+   return get_parent(node.parentNode, type);
+  }
   function get_active_block(node) {
     var main_node = get_contenteditable_subnode(node);
     if (main_node === null) return null;
@@ -177,6 +197,35 @@ function auto_anchors() {
 
       return;
     }
+    if (this.action_block.special == 'list') {
+      if (this.classList.contains('on')) { // toggle off
+        var main_node = get_contenteditable_subnode(sel.anchorNode);
+        var li = get_parent(sel.anchorNode, 'LI');
+        for (var i=li.childNodes.length; i>0; i--) {
+          var child = li.childNodes[i-1];
+          main_node.insertAdjacentElement('afterend', child);
+          var range = document.createRange();
+          range.setStart(child, 0);
+          sel.removeAllRanges();
+          sel.addRange(range);
+        }
+        li.remove();
+        update_block_style_popup();
+      } else {
+        var current_node = sel.anchorNode;
+        var ul = document.createElement('UL');
+        ul.className = 'list';
+        var li = document.createElement('LI');
+        ul.appendChild(li);
+        sel.anchorNode.parentNode.insertBefore(ul, current_node);
+        li.appendChild(current_node);
+        var range = document.createRange();
+        range.setStart(current_node, 0);
+        sel.removeAllRanges();
+        sel.addRange(range);
+      }
+      return;
+    }
     if (this.classList.contains('on')) { // toggle off
       if (this.action_block.subtag) {
         // unwrap