UNPKG

@wordpress/blocks

Version:
70 lines (69 loc) 2.09 kB
// packages/blocks/src/api/raw-handling/special-comment-converter.js import { remove, replace } from "@wordpress/dom"; function specialCommentConverter(node, doc) { if (node.nodeType !== node.COMMENT_NODE) { return; } if (node.nodeValue !== "nextpage" && node.nodeValue.indexOf("more") !== 0) { return; } const block = createBlock(node, doc); if (!node.parentNode || node.parentNode.nodeName !== "P") { replace(node, block); } else { const childNodes = Array.from(node.parentNode.childNodes); const nodeIndex = childNodes.indexOf(node); const wrapperNode = node.parentNode.parentNode || doc.body; const paragraphBuilder = (acc, child) => { if (!acc) { acc = doc.createElement("p"); } acc.appendChild(child); return acc; }; [ childNodes.slice(0, nodeIndex).reduce(paragraphBuilder, null), block, childNodes.slice(nodeIndex + 1).reduce(paragraphBuilder, null) ].forEach( (element) => element && wrapperNode.insertBefore(element, node.parentNode) ); remove(node.parentNode); } } function createBlock(commentNode, doc) { if (commentNode.nodeValue === "nextpage") { return createNextpage(doc); } const customText = commentNode.nodeValue.slice(4).trim(); let sibling = commentNode; let noTeaser = false; while (sibling = sibling.nextSibling) { if (sibling.nodeType === sibling.COMMENT_NODE && sibling.nodeValue === "noteaser") { noTeaser = true; remove(sibling); break; } } return createMore(customText, noTeaser, doc); } function createMore(customText, noTeaser, doc) { const node = doc.createElement("wp-block"); node.dataset.block = "core/more"; if (customText) { node.dataset.customText = customText; } if (noTeaser) { node.dataset.noTeaser = ""; } return node; } function createNextpage(doc) { const node = doc.createElement("wp-block"); node.dataset.block = "core/nextpage"; return node; } export { specialCommentConverter as default }; //# sourceMappingURL=special-comment-converter.js.map