all files / packages/list/ ListHTMLConverter.js

100% Statements 35/35
90% Branches 9/10
100% Functions 6/6
100% Lines 33/33
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65                  36×           20× 20× 20×   20× 20× 20× 28×           14×   12× 12×                      
import { isString } from '../../util'
import renderListNode from './renderListNode'
import getListTagName from './getListTagName'
 
export default {
 
  type: "list",
 
  matchElement: function(el) {
    return el.is('ul') || el.is('ol')
  },
 
  import: function(el, node, converter) {
    let self = this
    this._santizeNestedLists(el)
    if (el.is('ol')) {
      node.ordered = true
    }
    node.items = []
    let itemEls = el.findAll('li')
    itemEls.forEach(function(li) {
      // ATTENTION: pulling out nested list elements here on-the-fly
      let listItem = converter.convertElement(li)
      listItem.level = _getLevel(li)
      node.items.push(listItem.id)
    })
    function _getLevel(li) {
      let _el = li
      let level = 1
      while(_el) {
        if (_el.parentNode === el) return level
        _el = _el.parentNode
        Eif (self.matchElement(_el)) level++
      }
    }
  },
 
  export: function(node, el, converter) {
    let $$ = converter.$$
    el.tagName = getListTagName(node)
    renderListNode(node, el, (arg)=>{
      if (isString(arg)) {
        return $$(arg)
      } else {
        let item = arg
        return $$('li').append(converter.annotatedText(item.getTextPath()))
      }
    })
    return el
  },
 
  _santizeNestedLists(root) {
    let nestedLists = root.findAll('ol,ul')
    nestedLists.forEach((el)=>{
      while (!el.parentNode.is('ol,ul')) {
        // pull it up
        let parent = el.parentNode
        let grandParent = parent.parentNode
        let pos = grandParent.getChildIndex(parent)
        grandParent.insertAt(pos+1, el)
      }
    })
  }
}