@wordpress/blocks
Version:
Block API for WordPress.
60 lines (55 loc) • 1.74 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = listReducer;
var _dom = require("@wordpress/dom");
/**
* WordPress dependencies
*/
function isList(node) {
return node.nodeName === 'OL' || node.nodeName === 'UL';
}
function shallowTextContent(element) {
return Array.from(element.childNodes).map(({
nodeValue = ''
}) => nodeValue).join('');
}
function listReducer(node) {
if (!isList(node)) {
return;
}
const list = node;
const prevElement = node.previousElementSibling;
// Merge with previous list if:
// * There is a previous list of the same type.
// * There is only one list item.
if (prevElement && prevElement.nodeName === node.nodeName && list.children.length === 1) {
// Move all child nodes, including any text nodes, if any.
while (list.firstChild) {
prevElement.appendChild(list.firstChild);
}
list.parentNode.removeChild(list);
}
const parentElement = node.parentNode;
// Nested list with empty parent item.
if (parentElement && parentElement.nodeName === 'LI' && parentElement.children.length === 1 && !/\S/.test(shallowTextContent(parentElement))) {
const parentListItem = parentElement;
const prevListItem = parentListItem.previousElementSibling;
const parentList = parentListItem.parentNode;
if (prevListItem) {
prevListItem.appendChild(list);
parentList.removeChild(parentListItem);
}
}
// Invalid: OL/UL > OL/UL.
if (parentElement && isList(parentElement)) {
const prevListItem = node.previousElementSibling;
if (prevListItem) {
prevListItem.appendChild(node);
} else {
(0, _dom.unwrap)(node);
}
}
}
//# sourceMappingURL=list-reducer.js.map