| [ Index ] |
PHP Cross Reference of WordPress Trunk (Updated Daily) |
[Summary view] [Print] [Text view]
1 (function() { 2 "use strict"; 3 var wp; 4 (wp ||= {}).dom = (() => { 5 var __create = Object.create; 6 var __defProp = Object.defineProperty; 7 var __getOwnPropDesc = Object.getOwnPropertyDescriptor; 8 var __getOwnPropNames = Object.getOwnPropertyNames; 9 var __getProtoOf = Object.getPrototypeOf; 10 var __hasOwnProp = Object.prototype.hasOwnProperty; 11 var __commonJS = (cb, mod) => function __require() { 12 return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; 13 }; 14 var __export = (target, all) => { 15 for (var name in all) 16 __defProp(target, name, { get: all[name], enumerable: true }); 17 }; 18 var __copyProps = (to, from, except, desc) => { 19 if (from && typeof from === "object" || typeof from === "function") { 20 for (let key of __getOwnPropNames(from)) 21 if (!__hasOwnProp.call(to, key) && key !== except) 22 __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); 23 } 24 return to; 25 }; 26 var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( 27 // If the importer is in node compatibility mode or this is not an ESM 28 // file that has been converted to a CommonJS file using a Babel- 29 // compatible transform (i.e. "__esModule" has not been set), then set 30 // "default" to the CommonJS "module.exports" for node compatibility. 31 isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, 32 mod 33 )); 34 var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); 35 36 // package-external:@wordpress/deprecated 37 var require_deprecated = __commonJS({ 38 "package-external:@wordpress/deprecated"(exports, module) { 39 module.exports = window.wp.deprecated; 40 } 41 }); 42 43 // packages/dom/build-module/index.mjs 44 var index_exports = {}; 45 __export(index_exports, { 46 __unstableStripHTML: () => stripHTML, 47 computeCaretRect: () => computeCaretRect, 48 documentHasSelection: () => documentHasSelection, 49 documentHasTextSelection: () => documentHasTextSelection, 50 documentHasUncollapsedSelection: () => documentHasUncollapsedSelection, 51 focus: () => focus, 52 getFilesFromDataTransfer: () => getFilesFromDataTransfer, 53 getOffsetParent: () => getOffsetParent, 54 getPhrasingContentSchema: () => getPhrasingContentSchema, 55 getRectangleFromRange: () => getRectangleFromRange, 56 getScrollContainer: () => getScrollContainer, 57 insertAfter: () => insertAfter, 58 isEmpty: () => isEmpty, 59 isEntirelySelected: () => isEntirelySelected, 60 isFormElement: () => isFormElement, 61 isHorizontalEdge: () => isHorizontalEdge, 62 isNumberInput: () => isNumberInput, 63 isPhrasingContent: () => isPhrasingContent, 64 isRTL: () => isRTL, 65 isSelectionForward: () => isSelectionForward, 66 isTextContent: () => isTextContent, 67 isTextField: () => isTextField, 68 isVerticalEdge: () => isVerticalEdge, 69 placeCaretAtHorizontalEdge: () => placeCaretAtHorizontalEdge, 70 placeCaretAtVerticalEdge: () => placeCaretAtVerticalEdge, 71 remove: () => remove, 72 removeInvalidHTML: () => removeInvalidHTML, 73 replace: () => replace, 74 replaceTag: () => replaceTag, 75 safeHTML: () => safeHTML, 76 unwrap: () => unwrap, 77 wrap: () => wrap 78 }); 79 80 // packages/dom/build-module/focusable.mjs 81 var focusable_exports = {}; 82 __export(focusable_exports, { 83 find: () => find 84 }); 85 function buildSelector(sequential) { 86 return [ 87 sequential ? '[tabindex]:not([tabindex^="-"])' : "[tabindex]", 88 "a[href]", 89 "button:not([disabled])", 90 'input:not([type="hidden"]):not([disabled])', 91 "select:not([disabled])", 92 "textarea:not([disabled])", 93 'iframe:not([tabindex^="-"])', 94 "object", 95 "embed", 96 "summary", 97 "area[href]", 98 "[contenteditable]:not([contenteditable=false])" 99 ].join(","); 100 } 101 function isVisible(element) { 102 return element.offsetWidth > 0 || element.offsetHeight > 0 || element.getClientRects().length > 0; 103 } 104 function isValidFocusableArea(element) { 105 const map = element.closest("map[name]"); 106 if (!map) { 107 return false; 108 } 109 const img = element.ownerDocument.querySelector( 110 'img[usemap="#' + map.name + '"]' 111 ); 112 return !!img && isVisible(img); 113 } 114 function find(context, { sequential = false } = {}) { 115 const elements = context.querySelectorAll(buildSelector(sequential)); 116 return Array.from(elements).filter((element) => { 117 if (!isVisible(element)) { 118 return false; 119 } 120 if (element.closest("[inert]")) { 121 return false; 122 } 123 const { nodeName } = element; 124 if ("AREA" === nodeName) { 125 return isValidFocusableArea( 126 /** @type {HTMLAreaElement} */ 127 element 128 ); 129 } 130 return true; 131 }); 132 } 133 134 // packages/dom/build-module/tabbable.mjs 135 var tabbable_exports = {}; 136 __export(tabbable_exports, { 137 find: () => find2, 138 findNext: () => findNext, 139 findPrevious: () => findPrevious, 140 isTabbableIndex: () => isTabbableIndex 141 }); 142 function getTabIndex(element) { 143 const tabIndex = element.getAttribute("tabindex"); 144 return tabIndex === null ? 0 : parseInt(tabIndex, 10); 145 } 146 function isTabbableIndex(element) { 147 return getTabIndex(element) !== -1; 148 } 149 function createStatefulCollapseRadioGroup() { 150 const CHOSEN_RADIO_BY_NAME = {}; 151 return function collapseRadioGroup(result, element) { 152 const { nodeName, type, checked, name } = element; 153 if (nodeName !== "INPUT" || type !== "radio" || !name) { 154 return result.concat(element); 155 } 156 const hasChosen = CHOSEN_RADIO_BY_NAME.hasOwnProperty(name); 157 const isChosen = checked || !hasChosen; 158 if (!isChosen) { 159 return result; 160 } 161 if (hasChosen) { 162 const hadChosenElement = CHOSEN_RADIO_BY_NAME[name]; 163 result = result.filter((e) => e !== hadChosenElement); 164 } 165 CHOSEN_RADIO_BY_NAME[name] = element; 166 return result.concat(element); 167 }; 168 } 169 function mapElementToObjectTabbable(element, index) { 170 return { element, index }; 171 } 172 function mapObjectTabbableToElement(object) { 173 return object.element; 174 } 175 function compareObjectTabbables(a, b) { 176 const aTabIndex = getTabIndex(a.element); 177 const bTabIndex = getTabIndex(b.element); 178 if (aTabIndex === bTabIndex) { 179 return a.index - b.index; 180 } 181 return aTabIndex - bTabIndex; 182 } 183 function filterTabbable(focusables) { 184 return focusables.filter(isTabbableIndex).map(mapElementToObjectTabbable).sort(compareObjectTabbables).map(mapObjectTabbableToElement).reduce(createStatefulCollapseRadioGroup(), []); 185 } 186 function find2(context) { 187 return filterTabbable(find(context)); 188 } 189 function findPrevious(element) { 190 return filterTabbable(find(element.ownerDocument.body)).reverse().find( 191 (focusable) => ( 192 // eslint-disable-next-line no-bitwise 193 element.compareDocumentPosition(focusable) & element.DOCUMENT_POSITION_PRECEDING 194 ) 195 ); 196 } 197 function findNext(element) { 198 return filterTabbable(find(element.ownerDocument.body)).find( 199 (focusable) => ( 200 // eslint-disable-next-line no-bitwise 201 element.compareDocumentPosition(focusable) & element.DOCUMENT_POSITION_FOLLOWING 202 ) 203 ); 204 } 205 206 // packages/dom/build-module/utils/assert-is-defined.mjs 207 function assertIsDefined(val, name) { 208 if (val === void 0 || val === null) { 209 throw new Error( 210 `Expected '$name}' to be defined, but received $val}` 211 ); 212 } 213 } 214 215 // packages/dom/build-module/dom/get-rectangle-from-range.mjs 216 function getRectangleFromRange(range) { 217 if (!range.collapsed) { 218 const rects2 = Array.from(range.getClientRects()); 219 if (rects2.length === 1) { 220 return rects2[0]; 221 } 222 const filteredRects = rects2.filter(({ width }) => width > 1); 223 if (filteredRects.length === 0) { 224 return range.getBoundingClientRect(); 225 } 226 if (filteredRects.length === 1) { 227 return filteredRects[0]; 228 } 229 let { 230 top: furthestTop, 231 bottom: furthestBottom, 232 left: furthestLeft, 233 right: furthestRight 234 } = filteredRects[0]; 235 for (const { top, bottom, left, right } of filteredRects) { 236 if (top < furthestTop) { 237 furthestTop = top; 238 } 239 if (bottom > furthestBottom) { 240 furthestBottom = bottom; 241 } 242 if (left < furthestLeft) { 243 furthestLeft = left; 244 } 245 if (right > furthestRight) { 246 furthestRight = right; 247 } 248 } 249 return new window.DOMRect( 250 furthestLeft, 251 furthestTop, 252 furthestRight - furthestLeft, 253 furthestBottom - furthestTop 254 ); 255 } 256 const { startContainer } = range; 257 const { ownerDocument } = startContainer; 258 if (startContainer.nodeName === "BR") { 259 const { parentNode } = startContainer; 260 assertIsDefined(parentNode, "parentNode"); 261 const index = ( 262 /** @type {Node[]} */ 263 Array.from(parentNode.childNodes).indexOf(startContainer) 264 ); 265 assertIsDefined(ownerDocument, "ownerDocument"); 266 range = ownerDocument.createRange(); 267 range.setStart(parentNode, index); 268 range.setEnd(parentNode, index); 269 } 270 const rects = range.getClientRects(); 271 if (rects.length > 1) { 272 return null; 273 } 274 if (rects.length === 1 && startContainer.nodeType === startContainer.TEXT_NODE && range.startOffset > 0 && range.startOffset < /** @type {Text} */ 275 startContainer.length) { 276 assertIsDefined(ownerDocument, "ownerDocument"); 277 const measure = (start, end) => { 278 const charRange = ownerDocument.createRange(); 279 charRange.setStart(startContainer, start); 280 charRange.setEnd(startContainer, end); 281 return charRange.getBoundingClientRect(); 282 }; 283 const before = measure(range.startOffset - 1, range.startOffset); 284 const after = measure(range.startOffset, range.startOffset + 1); 285 if (before.bottom <= after.top) { 286 return null; 287 } 288 } 289 let rect = rects[0]; 290 if (!rect || rect.height === 0) { 291 assertIsDefined(ownerDocument, "ownerDocument"); 292 const padNode = ownerDocument.createTextNode("\u200B"); 293 range = range.cloneRange(); 294 range.insertNode(padNode); 295 rect = range.getClientRects()[0]; 296 assertIsDefined(padNode.parentNode, "padNode.parentNode"); 297 padNode.parentNode.removeChild(padNode); 298 } 299 return rect; 300 } 301 302 // packages/dom/build-module/dom/compute-caret-rect.mjs 303 function computeCaretRect(win) { 304 const selection = win.getSelection(); 305 assertIsDefined(selection, "selection"); 306 const range = selection.rangeCount ? selection.getRangeAt(0) : null; 307 if (!range) { 308 return null; 309 } 310 return getRectangleFromRange(range); 311 } 312 313 // packages/dom/build-module/dom/document-has-text-selection.mjs 314 function documentHasTextSelection(doc) { 315 assertIsDefined(doc.defaultView, "doc.defaultView"); 316 const selection = doc.defaultView.getSelection(); 317 assertIsDefined(selection, "selection"); 318 const range = selection.rangeCount ? selection.getRangeAt(0) : null; 319 return !!range && !range.collapsed; 320 } 321 322 // packages/dom/build-module/dom/is-html-input-element.mjs 323 function isHTMLInputElement(node) { 324 return node?.nodeName === "INPUT"; 325 } 326 327 // packages/dom/build-module/dom/is-text-field.mjs 328 function isTextField(node) { 329 const nonTextInputs = [ 330 "button", 331 "checkbox", 332 "hidden", 333 "file", 334 "radio", 335 "image", 336 "range", 337 "reset", 338 "submit", 339 "number", 340 "email", 341 "time" 342 ]; 343 return isHTMLInputElement(node) && node.type && !nonTextInputs.includes(node.type) || node.nodeName === "TEXTAREA" || /** @type {HTMLElement} */ 344 node.contentEditable === "true"; 345 } 346 347 // packages/dom/build-module/dom/input-field-has-uncollapsed-selection.mjs 348 function inputFieldHasUncollapsedSelection(element) { 349 if (!isHTMLInputElement(element) && !isTextField(element)) { 350 return false; 351 } 352 try { 353 const { selectionStart, selectionEnd } = ( 354 /** @type {HTMLInputElement | HTMLTextAreaElement} */ 355 element 356 ); 357 return ( 358 // `null` means the input type doesn't implement selection, thus we 359 // cannot determine whether the selection is collapsed, so we 360 // default to true. 361 selectionStart === null || // when not null, compare the two points 362 selectionStart !== selectionEnd 363 ); 364 } catch { 365 return true; 366 } 367 } 368 369 // packages/dom/build-module/dom/document-has-uncollapsed-selection.mjs 370 function documentHasUncollapsedSelection(doc) { 371 return documentHasTextSelection(doc) || !!doc.activeElement && inputFieldHasUncollapsedSelection(doc.activeElement); 372 } 373 374 // packages/dom/build-module/dom/document-has-selection.mjs 375 function documentHasSelection(doc) { 376 return !!doc.activeElement && (isHTMLInputElement(doc.activeElement) || isTextField(doc.activeElement) || documentHasTextSelection(doc)); 377 } 378 379 // packages/dom/build-module/dom/get-computed-style.mjs 380 function getComputedStyle(element) { 381 assertIsDefined( 382 element.ownerDocument.defaultView, 383 "element.ownerDocument.defaultView" 384 ); 385 return element.ownerDocument.defaultView.getComputedStyle(element); 386 } 387 388 // packages/dom/build-module/dom/get-scroll-container.mjs 389 function getScrollContainer(node, direction = "vertical") { 390 if (!node) { 391 return void 0; 392 } 393 if (direction === "vertical" || direction === "all") { 394 if (node.scrollHeight > node.clientHeight) { 395 const { overflowY } = getComputedStyle(node); 396 if (/(auto|scroll)/.test(overflowY)) { 397 return node; 398 } 399 } 400 } 401 if (direction === "horizontal" || direction === "all") { 402 if (node.scrollWidth > node.clientWidth) { 403 const { overflowX } = getComputedStyle(node); 404 if (/(auto|scroll)/.test(overflowX)) { 405 return node; 406 } 407 } 408 } 409 if (node.ownerDocument === node.parentNode) { 410 return node; 411 } 412 return getScrollContainer( 413 /** @type {Element} */ 414 node.parentNode, 415 direction 416 ); 417 } 418 419 // packages/dom/build-module/dom/get-offset-parent.mjs 420 function getOffsetParent(node) { 421 let closestElement; 422 while (closestElement = /** @type {Node} */ 423 node.parentNode) { 424 if (closestElement.nodeType === closestElement.ELEMENT_NODE) { 425 break; 426 } 427 } 428 if (!closestElement) { 429 return null; 430 } 431 if (getComputedStyle( 432 /** @type {Element} */ 433 closestElement 434 ).position !== "static") { 435 return closestElement; 436 } 437 return ( 438 /** @type {Node & { offsetParent: Node }} */ 439 closestElement.offsetParent 440 ); 441 } 442 443 // packages/dom/build-module/dom/is-input-or-text-area.mjs 444 function isInputOrTextArea(element) { 445 return element.tagName === "INPUT" || element.tagName === "TEXTAREA"; 446 } 447 448 // packages/dom/build-module/dom/is-entirely-selected.mjs 449 var ZWNBSP = "\uFEFF"; 450 function isEntirelySelected(element) { 451 if (isInputOrTextArea(element)) { 452 return element.selectionStart === 0 && element.value.length === element.selectionEnd; 453 } 454 if (!element.isContentEditable) { 455 return true; 456 } 457 const text = element.textContent || ""; 458 if (text === "" || text === ZWNBSP) { 459 return true; 460 } 461 const { ownerDocument } = element; 462 const { defaultView } = ownerDocument; 463 assertIsDefined(defaultView, "defaultView"); 464 const selection = defaultView.getSelection(); 465 assertIsDefined(selection, "selection"); 466 const range = selection.rangeCount ? selection.getRangeAt(0) : null; 467 if (!range) { 468 return true; 469 } 470 const { startContainer, endContainer, startOffset, endOffset } = range; 471 if (startContainer === element && endContainer === element && startOffset === 0 && endOffset === element.childNodes.length) { 472 return true; 473 } 474 const lastChild = element.lastChild; 475 assertIsDefined(lastChild, "lastChild"); 476 const endContainerContentLength = endContainer.nodeType === endContainer.TEXT_NODE ? ( 477 /** @type {Text} */ 478 endContainer.data.length 479 ) : endContainer.childNodes.length; 480 return isDeepChild(startContainer, element, "firstChild") && isDeepChild(endContainer, element, "lastChild") && startOffset === 0 && endOffset === endContainerContentLength; 481 } 482 function isDeepChild(query, container, propName) { 483 let candidate = container; 484 do { 485 if (query === candidate) { 486 return true; 487 } 488 candidate = candidate[propName]; 489 while (candidate && candidate.nodeType === candidate.TEXT_NODE && candidate.nodeValue === "") { 490 candidate = candidate[propName === "lastChild" ? "previousSibling" : "nextSibling"]; 491 } 492 } while (candidate); 493 return false; 494 } 495 496 // packages/dom/build-module/dom/is-form-element.mjs 497 function isFormElement(element) { 498 if (!element) { 499 return false; 500 } 501 const { tagName } = element; 502 const checkForInputTextarea = isInputOrTextArea(element); 503 return checkForInputTextarea || tagName === "BUTTON" || tagName === "SELECT"; 504 } 505 506 // packages/dom/build-module/dom/is-rtl.mjs 507 function isRTL(element) { 508 return getComputedStyle(element).direction === "rtl"; 509 } 510 511 // packages/dom/build-module/dom/get-range-height.mjs 512 function getRangeHeight(range) { 513 const rects = Array.from(range.getClientRects()); 514 if (!rects.length) { 515 return; 516 } 517 const highestTop = Math.min(...rects.map(({ top }) => top)); 518 const lowestBottom = Math.max(...rects.map(({ bottom }) => bottom)); 519 return lowestBottom - highestTop; 520 } 521 522 // packages/dom/build-module/dom/is-selection-forward.mjs 523 function isSelectionForward(selection) { 524 const { anchorNode, focusNode, anchorOffset, focusOffset } = selection; 525 assertIsDefined(anchorNode, "anchorNode"); 526 assertIsDefined(focusNode, "focusNode"); 527 const position = anchorNode.compareDocumentPosition(focusNode); 528 if (position & anchorNode.DOCUMENT_POSITION_PRECEDING) { 529 return false; 530 } 531 if (position & anchorNode.DOCUMENT_POSITION_FOLLOWING) { 532 return true; 533 } 534 if (position === 0) { 535 return anchorOffset <= focusOffset; 536 } 537 return true; 538 } 539 540 // packages/dom/build-module/dom/caret-range-from-point.mjs 541 function caretRangeFromPoint(doc, x, y) { 542 if (doc.caretPositionFromPoint) { 543 const point = doc.caretPositionFromPoint(x, y); 544 if (!point) { 545 return null; 546 } 547 const range = doc.createRange(); 548 range.setStart(point.offsetNode, point.offset); 549 range.collapse(true); 550 return range; 551 } 552 if (doc.caretRangeFromPoint) { 553 return doc.caretRangeFromPoint(x, y); 554 } 555 return null; 556 } 557 558 // packages/dom/build-module/dom/hidden-caret-range-from-point.mjs 559 function hiddenCaretRangeFromPoint(doc, x, y, container) { 560 const originalZIndex = container.style.zIndex; 561 const originalPosition = container.style.position; 562 const originalBorderRadius = container.style.borderRadius; 563 const { position = "static" } = getComputedStyle(container); 564 if (position === "static") { 565 container.style.position = "relative"; 566 } 567 container.style.zIndex = "10000"; 568 container.style.borderRadius = "0"; 569 const range = caretRangeFromPoint(doc, x, y); 570 container.style.zIndex = originalZIndex; 571 container.style.position = originalPosition; 572 container.style.borderRadius = originalBorderRadius; 573 return range; 574 } 575 576 // packages/dom/build-module/dom/scroll-if-no-range.mjs 577 function scrollIfNoRange(container, alignToTop, callback) { 578 let range = callback(); 579 if (!range || !range.startContainer || !container.contains(range.startContainer)) { 580 container.scrollIntoView(alignToTop); 581 range = callback(); 582 if (!range || !range.startContainer || !container.contains(range.startContainer)) { 583 return null; 584 } 585 } 586 return range; 587 } 588 589 // packages/dom/build-module/dom/is-edge.mjs 590 function isEdge(container, isReverse, onlyVertical = false) { 591 if (isInputOrTextArea(container) && typeof container.selectionStart === "number") { 592 if (container.selectionStart !== container.selectionEnd) { 593 return false; 594 } 595 if (isReverse) { 596 return container.selectionStart === 0; 597 } 598 return container.value.length === container.selectionStart; 599 } 600 if (!container.isContentEditable) { 601 return true; 602 } 603 const { ownerDocument } = container; 604 const { defaultView } = ownerDocument; 605 assertIsDefined(defaultView, "defaultView"); 606 const selection = defaultView.getSelection(); 607 if (!selection || !selection.rangeCount) { 608 return false; 609 } 610 const range = selection.getRangeAt(0); 611 const collapsedRange = range.cloneRange(); 612 const isForward = isSelectionForward(selection); 613 const isCollapsed = selection.isCollapsed; 614 if (!isCollapsed) { 615 collapsedRange.collapse(!isForward); 616 } 617 const collapsedRangeRect = getRectangleFromRange(collapsedRange); 618 const rangeRect = getRectangleFromRange(range); 619 if (!collapsedRangeRect || !rangeRect) { 620 return false; 621 } 622 const rangeHeight = getRangeHeight(range); 623 if (!isCollapsed && rangeHeight && rangeHeight > collapsedRangeRect.height && isForward === isReverse) { 624 return false; 625 } 626 const isReverseDir = isRTL(container) ? !isReverse : isReverse; 627 const containerRect = container.getBoundingClientRect(); 628 const x = isReverseDir ? containerRect.left + 1 : containerRect.right - 1; 629 const y = isReverse ? containerRect.top + 1 : containerRect.bottom - 1; 630 const isFarFromVerticalEdge = (y < 0 || y > defaultView.innerHeight) && rangeRect.top >= 0 && rangeRect.bottom <= defaultView.innerHeight; 631 const isFarFromHorizontalEdge = (x < 0 || x > defaultView.innerWidth) && rangeRect.left >= 0 && rangeRect.right <= defaultView.innerWidth; 632 if (isFarFromVerticalEdge || !onlyVertical && isFarFromHorizontalEdge) { 633 return false; 634 } 635 const testRange = scrollIfNoRange( 636 container, 637 isReverse, 638 () => hiddenCaretRangeFromPoint(ownerDocument, x, y, container) 639 ); 640 if (!testRange) { 641 return false; 642 } 643 const testRect = getRectangleFromRange(testRange); 644 if (!testRect) { 645 return false; 646 } 647 const verticalSide = isReverse ? "top" : "bottom"; 648 const horizontalSide = isReverseDir ? "left" : "right"; 649 const verticalDiff = testRect[verticalSide] - rangeRect[verticalSide]; 650 const horizontalDiff = testRect[horizontalSide] - collapsedRangeRect[horizontalSide]; 651 const hasVerticalDiff = Math.abs(verticalDiff) <= 1; 652 const hasHorizontalDiff = Math.abs(horizontalDiff) <= 1; 653 return onlyVertical ? hasVerticalDiff : hasVerticalDiff && hasHorizontalDiff; 654 } 655 656 // packages/dom/build-module/dom/is-horizontal-edge.mjs 657 function isHorizontalEdge(container, isReverse) { 658 return isEdge(container, isReverse); 659 } 660 661 // packages/dom/build-module/dom/is-number-input.mjs 662 var import_deprecated = __toESM(require_deprecated(), 1); 663 function isNumberInput(node) { 664 (0, import_deprecated.default)("wp.dom.isNumberInput", { 665 since: "6.1", 666 version: "6.5" 667 }); 668 return isHTMLInputElement(node) && node.type === "number" && !isNaN(node.valueAsNumber); 669 } 670 671 // packages/dom/build-module/dom/is-vertical-edge.mjs 672 function isVerticalEdge(container, isReverse) { 673 return isEdge(container, isReverse, true); 674 } 675 676 // packages/dom/build-module/dom/place-caret-at-edge.mjs 677 function getRange(container, isReverse, x) { 678 const { ownerDocument } = container; 679 const isReverseDir = isRTL(container) ? !isReverse : isReverse; 680 const containerRect = container.getBoundingClientRect(); 681 if (x === void 0) { 682 x = isReverse ? containerRect.right - 1 : containerRect.left + 1; 683 } else if (x <= containerRect.left) { 684 x = containerRect.left + 1; 685 } else if (x >= containerRect.right) { 686 x = containerRect.right - 1; 687 } 688 const y = isReverseDir ? containerRect.bottom - 1 : containerRect.top + 1; 689 return hiddenCaretRangeFromPoint(ownerDocument, x, y, container); 690 } 691 function placeCaretAtEdge(container, isReverse, x) { 692 if (!container) { 693 return; 694 } 695 container.focus(); 696 if (isInputOrTextArea(container)) { 697 if (typeof container.selectionStart !== "number") { 698 return; 699 } 700 if (isReverse) { 701 container.selectionStart = container.value.length; 702 container.selectionEnd = container.value.length; 703 } else { 704 container.selectionStart = 0; 705 container.selectionEnd = 0; 706 } 707 return; 708 } 709 if (container.contentEditable !== "true") { 710 return; 711 } 712 const range = scrollIfNoRange( 713 container, 714 isReverse, 715 () => getRange(container, isReverse, x) 716 ); 717 if (!range) { 718 return; 719 } 720 const { ownerDocument } = container; 721 const { defaultView } = ownerDocument; 722 assertIsDefined(defaultView, "defaultView"); 723 const selection = defaultView.getSelection(); 724 assertIsDefined(selection, "selection"); 725 selection.removeAllRanges(); 726 selection.addRange(range); 727 } 728 729 // packages/dom/build-module/dom/place-caret-at-horizontal-edge.mjs 730 function placeCaretAtHorizontalEdge(container, isReverse) { 731 return placeCaretAtEdge(container, isReverse, void 0); 732 } 733 734 // packages/dom/build-module/dom/place-caret-at-vertical-edge.mjs 735 function placeCaretAtVerticalEdge(container, isReverse, rect) { 736 return placeCaretAtEdge(container, isReverse, rect?.left); 737 } 738 739 // packages/dom/build-module/dom/insert-after.mjs 740 function insertAfter(newNode, referenceNode) { 741 assertIsDefined(referenceNode.parentNode, "referenceNode.parentNode"); 742 referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling); 743 } 744 745 // packages/dom/build-module/dom/remove.mjs 746 function remove(node) { 747 assertIsDefined(node.parentNode, "node.parentNode"); 748 node.parentNode.removeChild(node); 749 } 750 751 // packages/dom/build-module/dom/replace.mjs 752 function replace(processedNode, newNode) { 753 assertIsDefined(processedNode.parentNode, "processedNode.parentNode"); 754 insertAfter(newNode, processedNode.parentNode); 755 remove(processedNode); 756 } 757 758 // packages/dom/build-module/dom/unwrap.mjs 759 function unwrap(node) { 760 const parent = node.parentNode; 761 assertIsDefined(parent, "node.parentNode"); 762 while (node.firstChild) { 763 parent.insertBefore(node.firstChild, node); 764 } 765 parent.removeChild(node); 766 } 767 768 // packages/dom/build-module/dom/replace-tag.mjs 769 function replaceTag(node, tagName) { 770 const newNode = node.ownerDocument.createElement(tagName); 771 while (node.firstChild) { 772 newNode.appendChild(node.firstChild); 773 } 774 assertIsDefined(node.parentNode, "node.parentNode"); 775 node.parentNode.replaceChild(newNode, node); 776 return newNode; 777 } 778 779 // packages/dom/build-module/dom/wrap.mjs 780 function wrap(newNode, referenceNode) { 781 assertIsDefined(referenceNode.parentNode, "referenceNode.parentNode"); 782 referenceNode.parentNode.insertBefore(newNode, referenceNode); 783 newNode.appendChild(referenceNode); 784 } 785 786 // packages/dom/build-module/dom/safe-html.mjs 787 function safeHTML(html) { 788 const { body } = document.implementation.createHTMLDocument(""); 789 body.innerHTML = html; 790 const elements = body.getElementsByTagName("*"); 791 let elementIndex = elements.length; 792 while (elementIndex--) { 793 const element = elements[elementIndex]; 794 if (element.tagName === "SCRIPT") { 795 remove(element); 796 } else { 797 let attributeIndex = element.attributes.length; 798 while (attributeIndex--) { 799 const { name: key } = element.attributes[attributeIndex]; 800 if (key.startsWith("on")) { 801 element.removeAttribute(key); 802 } 803 } 804 } 805 } 806 return body.innerHTML; 807 } 808 809 // packages/dom/build-module/dom/strip-html.mjs 810 function stripHTML(html) { 811 html = safeHTML(html); 812 const doc = document.implementation.createHTMLDocument(""); 813 doc.body.innerHTML = html; 814 return doc.body.textContent || ""; 815 } 816 817 // packages/dom/build-module/dom/is-empty.mjs 818 function isEmpty(element) { 819 switch (element.nodeType) { 820 case element.TEXT_NODE: 821 return /^[ \f\n\r\t\v\u00a0]*$/.test(element.nodeValue || ""); 822 case element.ELEMENT_NODE: 823 if (element.hasAttributes()) { 824 return false; 825 } else if (!element.hasChildNodes()) { 826 return true; 827 } 828 return ( 829 /** @type {Element[]} */ 830 Array.from(element.childNodes).every(isEmpty) 831 ); 832 default: 833 return true; 834 } 835 } 836 837 // packages/dom/build-module/phrasing-content.mjs 838 var textContentSchema = { 839 strong: {}, 840 em: {}, 841 s: {}, 842 del: {}, 843 ins: {}, 844 a: { attributes: ["href", "target", "rel", "id"] }, 845 code: {}, 846 abbr: { attributes: ["title"] }, 847 sub: {}, 848 sup: {}, 849 br: {}, 850 small: {}, 851 // To do: fix blockquote. 852 // cite: {}, 853 q: { attributes: ["cite"] }, 854 dfn: { attributes: ["title"] }, 855 data: { attributes: ["value"] }, 856 time: { attributes: ["datetime"] }, 857 var: {}, 858 samp: {}, 859 kbd: {}, 860 i: {}, 861 b: {}, 862 u: {}, 863 mark: {}, 864 ruby: {}, 865 rt: {}, 866 rp: {}, 867 bdi: { attributes: ["dir"] }, 868 bdo: { attributes: ["dir"] }, 869 wbr: {}, 870 "#text": {} 871 }; 872 var embeddedContentSchema = { 873 audio: { 874 attributes: [ 875 "src", 876 "preload", 877 "autoplay", 878 "mediagroup", 879 "loop", 880 "muted" 881 ] 882 }, 883 canvas: { attributes: ["width", "height"] }, 884 embed: { attributes: ["src", "type", "width", "height"] }, 885 img: { 886 attributes: [ 887 "alt", 888 "src", 889 "srcset", 890 "usemap", 891 "ismap", 892 "width", 893 "height" 894 ] 895 }, 896 object: { 897 attributes: [ 898 "data", 899 "type", 900 "name", 901 "usemap", 902 "form", 903 "width", 904 "height" 905 ] 906 }, 907 video: { 908 attributes: [ 909 "src", 910 "poster", 911 "preload", 912 "playsinline", 913 "autoplay", 914 "mediagroup", 915 "loop", 916 "muted", 917 "controls", 918 "width", 919 "height" 920 ] 921 }, 922 math: { 923 attributes: ["display", "xmlns"], 924 children: "*" 925 } 926 }; 927 var excludedElements = ["#text", "br", "wbr"]; 928 Object.keys(textContentSchema).filter((element) => !excludedElements.includes(element)).forEach((tag) => { 929 const { [tag]: removedTag, ...restSchema } = textContentSchema; 930 textContentSchema[tag].children = { 931 ...restSchema, 932 img: embeddedContentSchema.img 933 }; 934 }); 935 var phrasingContentSchema = { 936 ...textContentSchema, 937 ...embeddedContentSchema 938 }; 939 function getPhrasingContentSchema(context) { 940 if (context !== "paste") { 941 return phrasingContentSchema; 942 } 943 const { 944 u, 945 // Used to mark misspelling. Shouldn't be pasted. 946 abbr, 947 // Invisible. 948 data, 949 // Invisible. 950 time, 951 // Invisible. 952 wbr, 953 // Invisible. 954 bdi, 955 // Invisible. 956 bdo, 957 // Invisible. 958 ...remainingContentSchema 959 } = { 960 ...phrasingContentSchema, 961 // We shouldn't paste potentially sensitive information which is not 962 // visible to the user when pasted, so strip the attributes. 963 ins: { children: phrasingContentSchema.ins.children }, 964 del: { children: phrasingContentSchema.del.children } 965 }; 966 return remainingContentSchema; 967 } 968 function isPhrasingContent(node) { 969 const tag = node.nodeName.toLowerCase(); 970 return getPhrasingContentSchema().hasOwnProperty(tag) || tag === "span"; 971 } 972 function isTextContent(node) { 973 const tag = node.nodeName.toLowerCase(); 974 return textContentSchema.hasOwnProperty(tag) || tag === "span"; 975 } 976 977 // packages/dom/build-module/dom/is-element.mjs 978 function isElement(node) { 979 return !!node && node.nodeType === node.ELEMENT_NODE; 980 } 981 982 // packages/dom/build-module/dom/clean-node-list.mjs 983 var noop = () => { 984 }; 985 function cleanNodeList(nodeList, doc, schema, inline) { 986 Array.from(nodeList).forEach( 987 (node) => { 988 const tag = node.nodeName.toLowerCase(); 989 if (schema.hasOwnProperty(tag) && (!schema[tag].isMatch || schema[tag].isMatch?.(node))) { 990 if (isElement(node)) { 991 const { 992 attributes = [], 993 classes = [], 994 children, 995 require: require2 = [], 996 allowEmpty 997 } = schema[tag]; 998 if (children && !allowEmpty && isEmpty(node)) { 999 if (isPhrasingContent(node) && node.hasChildNodes()) { 1000 unwrap(node); 1001 } else { 1002 remove(node); 1003 } 1004 return; 1005 } 1006 if (node.hasAttributes()) { 1007 Array.from(node.attributes).forEach(({ name }) => { 1008 if (name !== "class" && !attributes.includes(name)) { 1009 node.removeAttribute(name); 1010 } 1011 }); 1012 if (node.classList && node.classList.length) { 1013 const mattchers = classes.map((item) => { 1014 if (item === "*") { 1015 return () => true; 1016 } else if (typeof item === "string") { 1017 return (className) => className === item; 1018 } else if (item instanceof RegExp) { 1019 return (className) => item.test(className); 1020 } 1021 return noop; 1022 }); 1023 Array.from(node.classList).forEach((name) => { 1024 if (!mattchers.some( 1025 (isMatch) => isMatch(name) 1026 )) { 1027 node.classList.remove(name); 1028 } 1029 }); 1030 if (!node.classList.length) { 1031 node.removeAttribute("class"); 1032 } 1033 } 1034 } 1035 if (node.hasChildNodes()) { 1036 if (children === "*") { 1037 return; 1038 } 1039 if (children) { 1040 if (require2.length && !node.querySelector(require2.join(","))) { 1041 cleanNodeList( 1042 node.childNodes, 1043 doc, 1044 schema, 1045 inline 1046 ); 1047 unwrap(node); 1048 } else if (node.parentNode && node.parentNode.nodeName === "BODY" && isPhrasingContent(node)) { 1049 cleanNodeList( 1050 node.childNodes, 1051 doc, 1052 schema, 1053 inline 1054 ); 1055 if (Array.from(node.childNodes).some( 1056 (child) => !isPhrasingContent(child) 1057 )) { 1058 unwrap(node); 1059 } 1060 } else { 1061 cleanNodeList( 1062 node.childNodes, 1063 doc, 1064 children, 1065 inline 1066 ); 1067 } 1068 } else { 1069 while (node.firstChild) { 1070 remove(node.firstChild); 1071 } 1072 } 1073 } 1074 } 1075 } else { 1076 cleanNodeList(node.childNodes, doc, schema, inline); 1077 if (inline && !isPhrasingContent(node) && node.nextElementSibling) { 1078 insertAfter(doc.createElement("br"), node); 1079 } 1080 unwrap(node); 1081 } 1082 } 1083 ); 1084 } 1085 1086 // packages/dom/build-module/dom/remove-invalid-html.mjs 1087 function removeInvalidHTML(HTML, schema, inline) { 1088 const doc = document.implementation.createHTMLDocument(""); 1089 doc.body.innerHTML = HTML; 1090 cleanNodeList(doc.body.childNodes, doc, schema, inline); 1091 return doc.body.innerHTML; 1092 } 1093 1094 // packages/dom/build-module/data-transfer.mjs 1095 function getFilesFromDataTransfer(dataTransfer) { 1096 const files = Array.from(dataTransfer.files); 1097 Array.from(dataTransfer.items).forEach((item) => { 1098 const file = item.getAsFile(); 1099 if (file && !files.find( 1100 ({ name, type, size }) => name === file.name && type === file.type && size === file.size 1101 )) { 1102 files.push(file); 1103 } 1104 }); 1105 return files; 1106 } 1107 1108 // packages/dom/build-module/index.mjs 1109 var focus = { focusable: focusable_exports, tabbable: tabbable_exports }; 1110 return __toCommonJS(index_exports); 1111 })(); 1112 (window.wp ||= {}).dom = wp.dom; 1113 })();
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated : Sat Sep 12 08:20:32 2026 | Cross-referenced by PHPXref |