// packages/dom/src/dom/clean-node-list.js
import isEmpty from "./is-empty.mjs";
import remove from "./remove.mjs";
import unwrap from "./unwrap.mjs";
import { isPhrasingContent } from "../phrasing-content.mjs";
import insertAfter from "./insert-after.mjs";
import isElement from "./is-element.mjs";
var noop = () => {
};
function cleanNodeList(nodeList, doc, schema, inline) {
  Array.from(nodeList).forEach(
    (node) => {
      const tag = node.nodeName.toLowerCase();
      if (schema.hasOwnProperty(tag) && (!schema[tag].isMatch || schema[tag].isMatch?.(node))) {
        if (isElement(node)) {
          const {
            attributes = [],
            classes = [],
            children,
            require: require2 = [],
            allowEmpty
          } = schema[tag];
          if (children && !allowEmpty && isEmpty(node)) {
            remove(node);
            return;
          }
          if (node.hasAttributes()) {
            Array.from(node.attributes).forEach(({ name }) => {
              if (name !== "class" && !attributes.includes(name)) {
                node.removeAttribute(name);
              }
            });
            if (node.classList && node.classList.length) {
              const mattchers = classes.map((item) => {
                if (item === "*") {
                  return () => true;
                } else if (typeof item === "string") {
                  return (className) => className === item;
                } else if (item instanceof RegExp) {
                  return (className) => item.test(className);
                }
                return noop;
              });
              Array.from(node.classList).forEach((name) => {
                if (!mattchers.some(
                  (isMatch) => isMatch(name)
                )) {
                  node.classList.remove(name);
                }
              });
              if (!node.classList.length) {
                node.removeAttribute("class");
              }
            }
          }
          if (node.hasChildNodes()) {
            if (children === "*") {
              return;
            }
            if (children) {
              if (require2.length && !node.querySelector(require2.join(","))) {
                cleanNodeList(
                  node.childNodes,
                  doc,
                  schema,
                  inline
                );
                unwrap(node);
              } else if (node.parentNode && node.parentNode.nodeName === "BODY" && isPhrasingContent(node)) {
                cleanNodeList(
                  node.childNodes,
                  doc,
                  schema,
                  inline
                );
                if (Array.from(node.childNodes).some(
                  (child) => !isPhrasingContent(child)
                )) {
                  unwrap(node);
                }
              } else {
                cleanNodeList(
                  node.childNodes,
                  doc,
                  children,
                  inline
                );
              }
            } else {
              while (node.firstChild) {
                remove(node.firstChild);
              }
            }
          }
        }
      } else {
        cleanNodeList(node.childNodes, doc, schema, inline);
        if (inline && !isPhrasingContent(node) && node.nextElementSibling) {
          insertAfter(doc.createElement("br"), node);
        }
        unwrap(node);
      }
    }
  );
}
export {
  cleanNodeList as default
};
//# sourceMappingURL=clean-node-list.mjs.map
