Файл: library/wysihtml5/src/dom/convert_to_list.js
Строк: 143
<?php
/**
* Converts an HTML fragment/element into a unordered/ordered list
*
* @param {Element} element The element which should be turned into a list
* @param {String} listType The list type in which to convert the tree (either "ul" or "ol")
* @return {Element} The created list
*
* @example
* <!-- Assume the following dom: -->
* <span id="pseudo-list">
* eminem<br>
* dr. dre
* <div>50 Cent</div>
* </span>
*
* <script>
* wysihtml5.dom.convertToList(document.getElementById("pseudo-list"), "ul");
* </script>
*
* <!-- Will result in: -->
* <ul>
* <li>eminem</li>
* <li>dr. dre</li>
* <li>50 Cent</li>
* </ul>
*/
wysihtml5.dom.convertToList = (function() {
function _createListItem(doc, list) {
var listItem = doc.createElement("li");
list.appendChild(listItem);
return listItem;
}
function _createList(doc, type) {
return doc.createElement(type);
}
function convertToList(element, listType) {
if (element.nodeName === "UL" || element.nodeName === "OL" || element.nodeName === "MENU") {
// Already a list
return element;
}
var doc = element.ownerDocument,
list = _createList(doc, listType),
lineBreaks = element.querySelectorAll("br"),
lineBreaksLength = lineBreaks.length,
childNodes,
childNodesLength,
childNode,
lineBreak,
parentNode,
isBlockElement,
isLineBreak,
currentListItem,
i;
// First find <br> at the end of inline elements and move them behind them
for (i=0; i<lineBreaksLength; i++) {
lineBreak = lineBreaks[i];
while ((parentNode = lineBreak.parentNode) && parentNode !== element && parentNode.lastChild === lineBreak) {
if (wysihtml5.dom.getStyle("display").from(parentNode) === "block") {
parentNode.removeChild(lineBreak);
break;
}
wysihtml5.dom.insert(lineBreak).after(lineBreak.parentNode);
}
}
childNodes = wysihtml5.lang.array(element.childNodes).get();
childNodesLength = childNodes.length;
for (i=0; i<childNodesLength; i++) {
currentListItem = currentListItem || _createListItem(doc, list);
childNode = childNodes[i];
isBlockElement = wysihtml5.dom.getStyle("display").from(childNode) === "block";
isLineBreak = childNode.nodeName === "BR";
if (isBlockElement) {
// Append blockElement to current <li> if empty, otherwise create a new one
currentListItem = currentListItem.firstChild ? _createListItem(doc, list) : currentListItem;
currentListItem.appendChild(childNode);
currentListItem = null;
continue;
}
if (isLineBreak) {
// Only create a new list item in the next iteration when the current one has already content
currentListItem = currentListItem.firstChild ? null : currentListItem;
continue;
}
currentListItem.appendChild(childNode);
}
if (childNodes.length === 0) {
_createListItem(doc, list);
}
element.parentNode.replaceChild(list, element);
return list;
}
return convertToList;
})();
?>