'use strict' module.exports = listItem var u = require('unist-builder') var wrap = require('../wrap') var all = require('../all') function listItem(h, node, parent) { var children = node.children var head = children[0] var raw = all(h, node) var loose = parent ? listLoose(parent) : listItemLoose(node) var props = {} var result var container var index var length var child /* Tight lists should not render 'paragraph' nodes as 'p' tags */ if (loose) { result = raw } else { result = [] length = raw.length index = -1 while (++index < length) { child = raw[index] if (child.tagName === 'p') { result = result.concat(child.children) } else { result.push(child) } } } if (typeof node.checked === 'boolean') { if (loose && (!head || head.type !== 'paragraph')) { result.unshift(h(null, 'p', [])) } container = loose ? result[0].children : result if (container.length !== 0) { container.unshift(u('text', ' ')) } container.unshift( h(null, 'input', { type: 'checkbox', checked: node.checked, disabled: true }) ) // According to github-markdown-css, this class hides bullet. props.className = ['task-list-item'] } if (loose && result.length !== 0) { result = wrap(result, true) } return h(node, 'li', props, result) } function listLoose(node) { var loose = node.spread var children = node.children var length = children.length var index = -1 while (!loose && ++index < length) { loose = listItemLoose(children[index]) } return loose } function listItemLoose(node) { var spread = node.spread return spread === undefined || spread === null ? node.children.length > 1 : spread }