WIP: Note editing, markdown to html
[oweals/karmaworld.git] / karmaworld / apps / wysihtml5 / static / wysihtml5 / wysihtml-0.4.17 / src / dom / resolve_list.js
1 /**
2  * Unwraps an unordered/ordered list
3  *
4  * @param {Element} element The list element which should be unwrapped
5  *
6  * @example
7  *    <!-- Assume the following dom: -->
8  *    <ul id="list">
9  *      <li>eminem</li>
10  *      <li>dr. dre</li>
11  *      <li>50 Cent</li>
12  *    </ul>
13  *
14  *    <script>
15  *      wysihtml5.dom.resolveList(document.getElementById("list"));
16  *    </script>
17  *
18  *    <!-- Will result in: -->
19  *    eminem<br>
20  *    dr. dre<br>
21  *    50 Cent<br>
22  */
23 (function(dom) {
24   function _isBlockElement(node) {
25     return dom.getStyle("display").from(node) === "block";
26   }
27
28   function _isLineBreak(node) {
29     return node.nodeName === "BR";
30   }
31
32   function _appendLineBreak(element) {
33     var lineBreak = element.ownerDocument.createElement("br");
34     element.appendChild(lineBreak);
35   }
36
37   function resolveList(list, useLineBreaks) {
38     if (!list.nodeName.match(/^(MENU|UL|OL)$/)) {
39       return;
40     }
41
42     var doc             = list.ownerDocument,
43         fragment        = doc.createDocumentFragment(),
44         previousSibling = wysihtml5.dom.domNode(list).prev({ignoreBlankTexts: true}),
45         firstChild,
46         lastChild,
47         isLastChild,
48         shouldAppendLineBreak,
49         paragraph,
50         listItem;
51
52     if (useLineBreaks) {
53       // Insert line break if list is after a non-block element
54       if (previousSibling && !_isBlockElement(previousSibling) && !_isLineBreak(previousSibling)) {
55         _appendLineBreak(fragment);
56       }
57
58       while (listItem = (list.firstElementChild || list.firstChild)) {
59         lastChild = listItem.lastChild;
60         while (firstChild = listItem.firstChild) {
61           isLastChild           = firstChild === lastChild;
62           // This needs to be done before appending it to the fragment, as it otherwise will lose style information
63           shouldAppendLineBreak = isLastChild && !_isBlockElement(firstChild) && !_isLineBreak(firstChild);
64           fragment.appendChild(firstChild);
65           if (shouldAppendLineBreak) {
66             _appendLineBreak(fragment);
67           }
68         }
69
70         listItem.parentNode.removeChild(listItem);
71       }
72     } else {
73       while (listItem = (list.firstElementChild || list.firstChild)) {
74         if (listItem.querySelector && listItem.querySelector("div, p, ul, ol, menu, blockquote, h1, h2, h3, h4, h5, h6")) {
75           while (firstChild = listItem.firstChild) {
76             fragment.appendChild(firstChild);
77           }
78         } else {
79           paragraph = doc.createElement("p");
80           while (firstChild = listItem.firstChild) {
81             paragraph.appendChild(firstChild);
82           }
83           fragment.appendChild(paragraph);
84         }
85         listItem.parentNode.removeChild(listItem);
86       }
87     }
88
89     list.parentNode.replaceChild(fragment, list);
90   }
91
92   dom.resolveList = resolveList;
93 })(wysihtml5.dom);