Вход Регистрация
Файл: 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(doctype) {
    return 
doc.createElement(type);
  }
  
  function 
convertToList(elementlistType) {
    if (
element.nodeName === "UL" || element.nodeName === "OL" || element.nodeName === "MENU") {
      
// Already a list
      
return element;
    }
    
    var 
doc               element.ownerDocument,
        list              = 
_createList(doclistType),
        
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=0i<lineBreaksLengthi++) {
      
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=0i<childNodesLengthi++) {
      
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;
})();
?>
Онлайн: 2
Реклама