@wordpress/blocks
Version:
Block API for WordPress.
43 lines (42 loc) • 1.53 kB
JavaScript
// packages/blocks/src/api/raw-handling/figure-content-reducer.js
import { isTextContent } from "@wordpress/dom";
function isFigureContent(node, schema) {
const tag = node.nodeName.toLowerCase();
if (tag === "figcaption" || isTextContent(node)) {
return false;
}
return tag in (schema?.figure?.children ?? {});
}
function canHaveAnchor(node, schema) {
const tag = node.nodeName.toLowerCase();
return tag in (schema?.figure?.children?.a?.children ?? {});
}
function wrapFigureContent(element, beforeElement = element) {
const figure = element.ownerDocument.createElement("figure");
beforeElement.parentNode.insertBefore(figure, beforeElement);
figure.appendChild(element);
}
function figureContentReducer(node, doc, schema) {
if (!isFigureContent(node, schema)) {
return;
}
let nodeToInsert = node;
const parentNode = node.parentNode;
if (canHaveAnchor(node, schema) && parentNode.nodeName === "A" && parentNode.childNodes.length === 1) {
nodeToInsert = node.parentNode;
}
const wrapper = nodeToInsert.closest("p,div");
if (wrapper) {
if (!node.classList) {
wrapFigureContent(nodeToInsert, wrapper);
} else if (node.classList.contains("alignright") || node.classList.contains("alignleft") || node.classList.contains("aligncenter") || !wrapper.textContent.trim()) {
wrapFigureContent(nodeToInsert, wrapper);
}
} else {
wrapFigureContent(nodeToInsert);
}
}
export {
figureContentReducer as default
};
//# sourceMappingURL=figure-content-reducer.js.map