@wordpress/dom 3.2.3 → 3.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -4
- package/build/data-transfer.js +8 -5
- package/build/data-transfer.js.map +1 -1
- package/build/dom/caret-range-from-point.js +2 -2
- package/build/dom/caret-range-from-point.js.map +1 -1
- package/build/dom/clean-node-list.js +11 -11
- package/build/dom/clean-node-list.js.map +1 -1
- package/build/dom/document-has-text-selection.js +1 -1
- package/build/dom/document-has-text-selection.js.map +1 -1
- package/build/dom/document-has-uncollapsed-selection.js +2 -2
- package/build/dom/document-has-uncollapsed-selection.js.map +1 -1
- package/build/dom/get-range-height.js +12 -6
- package/build/dom/get-range-height.js.map +1 -1
- package/build/dom/get-rectangle-from-range.js +6 -3
- package/build/dom/get-rectangle-from-range.js.map +1 -1
- package/build/dom/index.js +38 -38
- package/build/dom/is-edge.js +4 -2
- package/build/dom/is-edge.js.map +1 -1
- package/build/dom/place-caret-at-edge.js +108 -0
- package/build/dom/place-caret-at-edge.js.map +1 -0
- package/build/dom/place-caret-at-horizontal-edge.js +2 -84
- package/build/dom/place-caret-at-horizontal-edge.js.map +1 -1
- package/build/dom/place-caret-at-vertical-edge.js +6 -56
- package/build/dom/place-caret-at-vertical-edge.js.map +1 -1
- package/build/dom/strip-html.js +14 -2
- package/build/dom/strip-html.js.map +1 -1
- package/build/focusable.js +30 -17
- package/build/focusable.js.map +1 -1
- package/build/index.js +4 -2
- package/build/index.js.map +1 -1
- package/build/tabbable.js +4 -4
- package/build/tabbable.js.map +1 -1
- package/build-module/data-transfer.js +8 -5
- package/build-module/data-transfer.js.map +1 -1
- package/build-module/dom/caret-range-from-point.js +2 -2
- package/build-module/dom/caret-range-from-point.js.map +1 -1
- package/build-module/dom/clean-node-list.js +11 -11
- package/build-module/dom/clean-node-list.js.map +1 -1
- package/build-module/dom/document-has-text-selection.js +1 -1
- package/build-module/dom/document-has-text-selection.js.map +1 -1
- package/build-module/dom/document-has-uncollapsed-selection.js +2 -2
- package/build-module/dom/document-has-uncollapsed-selection.js.map +1 -1
- package/build-module/dom/get-range-height.js +12 -6
- package/build-module/dom/get-range-height.js.map +1 -1
- package/build-module/dom/get-rectangle-from-range.js +6 -3
- package/build-module/dom/get-rectangle-from-range.js.map +1 -1
- package/build-module/dom/is-edge.js +4 -2
- package/build-module/dom/is-edge.js.map +1 -1
- package/build-module/dom/place-caret-at-edge.js +95 -0
- package/build-module/dom/place-caret-at-edge.js.map +1 -0
- package/build-module/dom/place-caret-at-horizontal-edge.js +2 -81
- package/build-module/dom/place-caret-at-horizontal-edge.js.map +1 -1
- package/build-module/dom/place-caret-at-vertical-edge.js +6 -54
- package/build-module/dom/place-caret-at-vertical-edge.js.map +1 -1
- package/build-module/dom/strip-html.js +11 -2
- package/build-module/dom/strip-html.js.map +1 -1
- package/build-module/focusable.js +30 -17
- package/build-module/focusable.js.map +1 -1
- package/build-module/tabbable.js +2 -2
- package/build-module/tabbable.js.map +1 -1
- package/build-types/dom/caret-range-from-point.d.ts +2 -2
- package/build-types/dom/clean-node-list.d.ts +2 -2
- package/build-types/dom/document-has-text-selection.d.ts +1 -1
- package/build-types/dom/document-has-uncollapsed-selection.d.ts +2 -2
- package/build-types/dom/is-edge.d.ts.map +1 -1
- package/build-types/dom/place-caret-at-edge.d.ts +9 -0
- package/build-types/dom/place-caret-at-edge.d.ts.map +1 -0
- package/build-types/dom/place-caret-at-horizontal-edge.d.ts.map +1 -1
- package/build-types/dom/place-caret-at-vertical-edge.d.ts +4 -5
- package/build-types/dom/place-caret-at-vertical-edge.d.ts.map +1 -1
- package/build-types/dom/strip-html.d.ts.map +1 -1
- package/build-types/focusable.d.ts +11 -2
- package/build-types/focusable.d.ts.map +1 -1
- package/build-types/tabbable.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/dom/caret-range-from-point.js +2 -2
- package/src/dom/document-has-text-selection.js +1 -1
- package/src/dom/document-has-uncollapsed-selection.js +2 -2
- package/src/dom/is-edge.js +4 -1
- package/src/dom/place-caret-at-edge.js +95 -0
- package/src/dom/place-caret-at-horizontal-edge.js +2 -83
- package/src/dom/place-caret-at-vertical-edge.js +6 -64
- package/src/dom/strip-html.js +12 -5
- package/src/dom/test/strip-html.js +64 -0
- package/src/focusable.js +37 -32
- package/src/tabbable.js +2 -4
- package/src/test/dom.js +8 -15
- package/tsconfig.tsbuildinfo +1 -1
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["@wordpress/dom/src/dom/clean-node-list.js"],"names":["includes","noop","isEmpty","remove","unwrap","isPhrasingContent","insertAfter","isElement","cleanNodeList","nodeList","doc","schema","inline","Array","from","forEach","node","tag","nodeName","toLowerCase","hasOwnProperty","isMatch","attributes","classes","children","require","allowEmpty","hasAttributes","name","removeAttribute","classList","length","mattchers","map","item","className","RegExp","test","some","hasChildNodes","querySelector","join","childNodes","parentNode","child","firstChild","nextElementSibling","createElement"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { includes, noop } from 'lodash';\n\n/**\n * Internal dependencies\n */\nimport isEmpty from './is-empty';\nimport remove from './remove';\nimport unwrap from './unwrap';\nimport { isPhrasingContent } from '../phrasing-content';\nimport insertAfter from './insert-after';\nimport isElement from './is-element';\n\n/* eslint-disable jsdoc/valid-types */\n/**\n * @typedef SchemaItem\n * @property {string[]} [attributes] Attributes.\n * @property {(string | RegExp)[]} [classes] Classnames or RegExp to test against.\n * @property {'*' | { [tag: string]: SchemaItem }} [children] Child schemas.\n * @property {string[]} [require] Selectors to test required children against. Leave empty or undefined if there are no requirements.\n * @property {boolean} allowEmpty Whether to allow nodes without children.\n * @property {(node: Node) => boolean} [isMatch] Function to test whether a node is a match. If left undefined any node will be assumed to match.\n */\n\n/** @typedef {{ [tag: string]: SchemaItem }} Schema */\n/* eslint-enable jsdoc/valid-types */\n\n/**\n * Given a schema, unwraps or removes nodes, attributes and classes on a node\n * list.\n *\n * @param {NodeList} nodeList The nodeList to filter.\n * @param {Document} doc The document of the nodeList.\n * @param {Schema} schema An array of functions that can mutate with the provided node.\n * @param {boolean} inline Whether to clean for inline mode.\n */\nexport default function cleanNodeList( nodeList, doc, schema, inline ) {\n\tArray.from( nodeList ).forEach( (\n\t\t/** @type {Node & { nextElementSibling?: unknown }} */ node\n\t) => {\n\t\tconst tag = node.nodeName.toLowerCase();\n\n\t\t// It's a valid child, if the tag exists in the schema without an isMatch\n\t\t// function, or with an isMatch function that matches the node.\n\t\tif (\n\t\t\tschema.hasOwnProperty( tag ) &&\n\t\t\t( ! schema[ tag ].isMatch || schema[ tag ].isMatch?.( node ) )\n\t\t) {\n\t\t\tif ( isElement( node ) ) {\n\t\t\t\tconst {\n\t\t\t\t\tattributes = [],\n\t\t\t\t\tclasses = [],\n\t\t\t\t\tchildren,\n\t\t\t\t\trequire = [],\n\t\t\t\t\tallowEmpty,\n\t\t\t\t} = schema[ tag ];\n\n\t\t\t\t// If the node is empty and it's supposed to have children,\n\t\t\t\t// remove the node.\n\t\t\t\tif ( children && ! allowEmpty && isEmpty( node ) ) {\n\t\t\t\t\tremove( node );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( node.hasAttributes() ) {\n\t\t\t\t\t// Strip invalid attributes.\n\t\t\t\t\tArray.from( node.attributes ).forEach( ( { name } ) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tname !== 'class' &&\n\t\t\t\t\t\t\t! includes( attributes, name )\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tnode.removeAttribute( name );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\t// Strip invalid classes.\n\t\t\t\t\t// In jsdom-jscore, 'node.classList' can be undefined.\n\t\t\t\t\t// TODO: Explore patching this in jsdom-jscore.\n\t\t\t\t\tif ( node.classList && node.classList.length ) {\n\t\t\t\t\t\tconst mattchers = classes.map( ( item ) => {\n\t\t\t\t\t\t\tif ( typeof item === 'string' ) {\n\t\t\t\t\t\t\t\treturn ( /** @type {string} */ className ) =>\n\t\t\t\t\t\t\t\t\tclassName === item;\n\t\t\t\t\t\t\t} else if ( item instanceof RegExp ) {\n\t\t\t\t\t\t\t\treturn ( /** @type {string} */ className ) =>\n\t\t\t\t\t\t\t\t\titem.test( className );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn noop;\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tArray.from( node.classList ).forEach( ( name ) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t! mattchers.some( ( isMatch ) =>\n\t\t\t\t\t\t\t\t\tisMatch( name )\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tnode.classList.remove( name );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tif ( ! node.classList.length ) {\n\t\t\t\t\t\t\tnode.removeAttribute( 'class' );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( node.hasChildNodes() ) {\n\t\t\t\t\t// Do not filter any content.\n\t\t\t\t\tif ( children === '*' ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Continue if the node is supposed to have children.\n\t\t\t\t\tif ( children ) {\n\t\t\t\t\t\t// If a parent requires certain children, but it does\n\t\t\t\t\t\t// not have them, drop the parent and continue.\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\trequire.length &&\n\t\t\t\t\t\t\t! node.querySelector( require.join( ',' ) )\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcleanNodeList(\n\t\t\t\t\t\t\t\tnode.childNodes,\n\t\t\t\t\t\t\t\tdoc,\n\t\t\t\t\t\t\t\tschema,\n\t\t\t\t\t\t\t\tinline\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tunwrap( node );\n\t\t\t\t\t\t\t// If the node is at the top, phrasing content, and\n\t\t\t\t\t\t\t// contains children that are block content, unwrap\n\t\t\t\t\t\t\t// the node because it is invalid.\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\tnode.parentNode &&\n\t\t\t\t\t\t\tnode.parentNode.nodeName === 'BODY' &&\n\t\t\t\t\t\t\tisPhrasingContent( node )\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcleanNodeList(\n\t\t\t\t\t\t\t\tnode.childNodes,\n\t\t\t\t\t\t\t\tdoc,\n\t\t\t\t\t\t\t\tschema,\n\t\t\t\t\t\t\t\tinline\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tArray.from( node.childNodes ).some(\n\t\t\t\t\t\t\t\t\t( child ) => ! isPhrasingContent( child )\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tunwrap( node );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcleanNodeList(\n\t\t\t\t\t\t\t\tnode.childNodes,\n\t\t\t\t\t\t\t\tdoc,\n\t\t\t\t\t\t\t\tchildren,\n\t\t\t\t\t\t\t\tinline\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Remove children if the node is not supposed to have any.\n\t\t\t\t\t} else {\n\t\t\t\t\t\twhile ( node.firstChild ) {\n\t\t\t\t\t\t\tremove( node.firstChild );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Invalid child. Continue with schema at the same place and unwrap.\n\t\t} else {\n\t\t\tcleanNodeList( node.childNodes, doc, schema, inline );\n\n\t\t\t// For inline mode, insert a line break when unwrapping nodes that\n\t\t\t// are not phrasing content.\n\t\t\tif (\n\t\t\t\tinline &&\n\t\t\t\t! isPhrasingContent( node ) &&\n\t\t\t\tnode.nextElementSibling\n\t\t\t) {\n\t\t\t\tinsertAfter( doc.createElement( 'br' ), node );\n\t\t\t}\n\n\t\t\tunwrap( node );\n\t\t}\n\t} );\n}\n"]}
|
1
|
+
{"version":3,"sources":["@wordpress/dom/src/dom/clean-node-list.js"],"names":["includes","noop","isEmpty","remove","unwrap","isPhrasingContent","insertAfter","isElement","cleanNodeList","nodeList","doc","schema","inline","Array","from","forEach","node","tag","nodeName","toLowerCase","hasOwnProperty","isMatch","attributes","classes","children","require","allowEmpty","hasAttributes","name","removeAttribute","classList","length","mattchers","map","item","className","RegExp","test","some","hasChildNodes","querySelector","join","childNodes","parentNode","child","firstChild","nextElementSibling","createElement"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,QAAT,EAAmBC,IAAnB,QAA+B,QAA/B;AAEA;AACA;AACA;;AACA,OAAOC,OAAP,MAAoB,YAApB;AACA,OAAOC,MAAP,MAAmB,UAAnB;AACA,OAAOC,MAAP,MAAmB,UAAnB;AACA,SAASC,iBAAT,QAAkC,qBAAlC;AACA,OAAOC,WAAP,MAAwB,gBAAxB;AACA,OAAOC,SAAP,MAAsB,cAAtB;AAEA;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,eAAe,SAASC,aAAT,CAAwBC,QAAxB,EAAkCC,GAAlC,EAAuCC,MAAvC,EAA+CC,MAA/C,EAAwD;AACtEC,EAAAA,KAAK,CAACC,IAAN,CAAYL,QAAZ,EAAuBM,OAAvB,CAAgC;AAC/B;AAAuDC,EAAAA,IADxB,KAE3B;AAAA;;AACJ,UAAMC,GAAG,GAAGD,IAAI,CAACE,QAAL,CAAcC,WAAd,EAAZ,CADI,CAGJ;AACA;;AACA,QACCR,MAAM,CAACS,cAAP,CAAuBH,GAAvB,MACE,CAAEN,MAAM,CAAEM,GAAF,CAAN,CAAcI,OAAhB,2BAA2B,eAAAV,MAAM,CAAEM,GAAF,CAAN,EAAcI,OAAzC,gDAA2B,sCAAyBL,IAAzB,CAD7B,CADD,EAGE;AACD,UAAKT,SAAS,CAAES,IAAF,CAAd,EAAyB;AACxB,cAAM;AACLM,UAAAA,UAAU,GAAG,EADR;AAELC,UAAAA,OAAO,GAAG,EAFL;AAGLC,UAAAA,QAHK;AAILC,UAAAA,OAAO,GAAG,EAJL;AAKLC,UAAAA;AALK,YAMFf,MAAM,CAAEM,GAAF,CANV,CADwB,CASxB;AACA;;AACA,YAAKO,QAAQ,IAAI,CAAEE,UAAd,IAA4BxB,OAAO,CAAEc,IAAF,CAAxC,EAAmD;AAClDb,UAAAA,MAAM,CAAEa,IAAF,CAAN;AACA;AACA;;AAED,YAAKA,IAAI,CAACW,aAAL,EAAL,EAA4B;AAC3B;AACAd,UAAAA,KAAK,CAACC,IAAN,CAAYE,IAAI,CAACM,UAAjB,EAA8BP,OAA9B,CAAuC,QAAgB;AAAA,gBAAd;AAAEa,cAAAA;AAAF,aAAc;;AACtD,gBACCA,IAAI,KAAK,OAAT,IACA,CAAE5B,QAAQ,CAAEsB,UAAF,EAAcM,IAAd,CAFX,EAGE;AACDZ,cAAAA,IAAI,CAACa,eAAL,CAAsBD,IAAtB;AACA;AACD,WAPD,EAF2B,CAW3B;AACA;AACA;;AACA,cAAKZ,IAAI,CAACc,SAAL,IAAkBd,IAAI,CAACc,SAAL,CAAeC,MAAtC,EAA+C;AAC9C,kBAAMC,SAAS,GAAGT,OAAO,CAACU,GAAR,CAAeC,IAAF,IAAY;AAC1C,kBAAK,OAAOA,IAAP,KAAgB,QAArB,EAAgC;AAC/B,uBAAO;AAAE;AAAsBC,gBAAAA,SAAxB,KACNA,SAAS,KAAKD,IADf;AAEA,eAHD,MAGO,IAAKA,IAAI,YAAYE,MAArB,EAA8B;AACpC,uBAAO;AAAE;AAAsBD,gBAAAA,SAAxB,KACND,IAAI,CAACG,IAAL,CAAWF,SAAX,CADD;AAEA;;AAED,qBAAOlC,IAAP;AACA,aAViB,CAAlB;AAYAY,YAAAA,KAAK,CAACC,IAAN,CAAYE,IAAI,CAACc,SAAjB,EAA6Bf,OAA7B,CAAwCa,IAAF,IAAY;AACjD,kBACC,CAAEI,SAAS,CAACM,IAAV,CAAkBjB,OAAF,IACjBA,OAAO,CAAEO,IAAF,CADN,CADH,EAIE;AACDZ,gBAAAA,IAAI,CAACc,SAAL,CAAe3B,MAAf,CAAuByB,IAAvB;AACA;AACD,aARD;;AAUA,gBAAK,CAAEZ,IAAI,CAACc,SAAL,CAAeC,MAAtB,EAA+B;AAC9Bf,cAAAA,IAAI,CAACa,eAAL,CAAsB,OAAtB;AACA;AACD;AACD;;AAED,YAAKb,IAAI,CAACuB,aAAL,EAAL,EAA4B;AAC3B;AACA,cAAKf,QAAQ,KAAK,GAAlB,EAAwB;AACvB;AACA,WAJ0B,CAM3B;;;AACA,cAAKA,QAAL,EAAgB;AACf;AACA;AACA,gBACCC,OAAO,CAACM,MAAR,IACA,CAAEf,IAAI,CAACwB,aAAL,CAAoBf,OAAO,CAACgB,IAAR,CAAc,GAAd,CAApB,CAFH,EAGE;AACDjC,cAAAA,aAAa,CACZQ,IAAI,CAAC0B,UADO,EAEZhC,GAFY,EAGZC,MAHY,EAIZC,MAJY,CAAb;AAMAR,cAAAA,MAAM,CAAEY,IAAF,CAAN,CAPC,CAQD;AACA;AACA;AACA,aAdD,MAcO,IACNA,IAAI,CAAC2B,UAAL,IACA3B,IAAI,CAAC2B,UAAL,CAAgBzB,QAAhB,KAA6B,MAD7B,IAEAb,iBAAiB,CAAEW,IAAF,CAHX,EAIL;AACDR,cAAAA,aAAa,CACZQ,IAAI,CAAC0B,UADO,EAEZhC,GAFY,EAGZC,MAHY,EAIZC,MAJY,CAAb;;AAOA,kBACCC,KAAK,CAACC,IAAN,CAAYE,IAAI,CAAC0B,UAAjB,EAA8BJ,IAA9B,CACGM,KAAF,IAAa,CAAEvC,iBAAiB,CAAEuC,KAAF,CADjC,CADD,EAIE;AACDxC,gBAAAA,MAAM,CAAEY,IAAF,CAAN;AACA;AACD,aAnBM,MAmBA;AACNR,cAAAA,aAAa,CACZQ,IAAI,CAAC0B,UADO,EAEZhC,GAFY,EAGZc,QAHY,EAIZZ,MAJY,CAAb;AAMA,aA3Cc,CA4Cf;;AACA,WA7CD,MA6CO;AACN,mBAAQI,IAAI,CAAC6B,UAAb,EAA0B;AACzB1C,cAAAA,MAAM,CAAEa,IAAI,CAAC6B,UAAP,CAAN;AACA;AACD;AACD;AACD,OAtHA,CAuHD;;AACA,KA3HD,MA2HO;AACNrC,MAAAA,aAAa,CAAEQ,IAAI,CAAC0B,UAAP,EAAmBhC,GAAnB,EAAwBC,MAAxB,EAAgCC,MAAhC,CAAb,CADM,CAGN;AACA;;AACA,UACCA,MAAM,IACN,CAAEP,iBAAiB,CAAEW,IAAF,CADnB,IAEAA,IAAI,CAAC8B,kBAHN,EAIE;AACDxC,QAAAA,WAAW,CAAEI,GAAG,CAACqC,aAAJ,CAAmB,IAAnB,CAAF,EAA6B/B,IAA7B,CAAX;AACA;;AAEDZ,MAAAA,MAAM,CAAEY,IAAF,CAAN;AACA;AACD,GAjJD;AAkJA","sourcesContent":["/**\n * External dependencies\n */\nimport { includes, noop } from 'lodash';\n\n/**\n * Internal dependencies\n */\nimport isEmpty from './is-empty';\nimport remove from './remove';\nimport unwrap from './unwrap';\nimport { isPhrasingContent } from '../phrasing-content';\nimport insertAfter from './insert-after';\nimport isElement from './is-element';\n\n/* eslint-disable jsdoc/valid-types */\n/**\n * @typedef SchemaItem\n * @property {string[]} [attributes] Attributes.\n * @property {(string | RegExp)[]} [classes] Classnames or RegExp to test against.\n * @property {'*' | { [tag: string]: SchemaItem }} [children] Child schemas.\n * @property {string[]} [require] Selectors to test required children against. Leave empty or undefined if there are no requirements.\n * @property {boolean} allowEmpty Whether to allow nodes without children.\n * @property {(node: Node) => boolean} [isMatch] Function to test whether a node is a match. If left undefined any node will be assumed to match.\n */\n\n/** @typedef {{ [tag: string]: SchemaItem }} Schema */\n/* eslint-enable jsdoc/valid-types */\n\n/**\n * Given a schema, unwraps or removes nodes, attributes and classes on a node\n * list.\n *\n * @param {NodeList} nodeList The nodeList to filter.\n * @param {Document} doc The document of the nodeList.\n * @param {Schema} schema An array of functions that can mutate with the provided node.\n * @param {boolean} inline Whether to clean for inline mode.\n */\nexport default function cleanNodeList( nodeList, doc, schema, inline ) {\n\tArray.from( nodeList ).forEach( (\n\t\t/** @type {Node & { nextElementSibling?: unknown }} */ node\n\t) => {\n\t\tconst tag = node.nodeName.toLowerCase();\n\n\t\t// It's a valid child, if the tag exists in the schema without an isMatch\n\t\t// function, or with an isMatch function that matches the node.\n\t\tif (\n\t\t\tschema.hasOwnProperty( tag ) &&\n\t\t\t( ! schema[ tag ].isMatch || schema[ tag ].isMatch?.( node ) )\n\t\t) {\n\t\t\tif ( isElement( node ) ) {\n\t\t\t\tconst {\n\t\t\t\t\tattributes = [],\n\t\t\t\t\tclasses = [],\n\t\t\t\t\tchildren,\n\t\t\t\t\trequire = [],\n\t\t\t\t\tallowEmpty,\n\t\t\t\t} = schema[ tag ];\n\n\t\t\t\t// If the node is empty and it's supposed to have children,\n\t\t\t\t// remove the node.\n\t\t\t\tif ( children && ! allowEmpty && isEmpty( node ) ) {\n\t\t\t\t\tremove( node );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( node.hasAttributes() ) {\n\t\t\t\t\t// Strip invalid attributes.\n\t\t\t\t\tArray.from( node.attributes ).forEach( ( { name } ) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tname !== 'class' &&\n\t\t\t\t\t\t\t! includes( attributes, name )\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tnode.removeAttribute( name );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\t// Strip invalid classes.\n\t\t\t\t\t// In jsdom-jscore, 'node.classList' can be undefined.\n\t\t\t\t\t// TODO: Explore patching this in jsdom-jscore.\n\t\t\t\t\tif ( node.classList && node.classList.length ) {\n\t\t\t\t\t\tconst mattchers = classes.map( ( item ) => {\n\t\t\t\t\t\t\tif ( typeof item === 'string' ) {\n\t\t\t\t\t\t\t\treturn ( /** @type {string} */ className ) =>\n\t\t\t\t\t\t\t\t\tclassName === item;\n\t\t\t\t\t\t\t} else if ( item instanceof RegExp ) {\n\t\t\t\t\t\t\t\treturn ( /** @type {string} */ className ) =>\n\t\t\t\t\t\t\t\t\titem.test( className );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn noop;\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tArray.from( node.classList ).forEach( ( name ) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t! mattchers.some( ( isMatch ) =>\n\t\t\t\t\t\t\t\t\tisMatch( name )\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tnode.classList.remove( name );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tif ( ! node.classList.length ) {\n\t\t\t\t\t\t\tnode.removeAttribute( 'class' );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( node.hasChildNodes() ) {\n\t\t\t\t\t// Do not filter any content.\n\t\t\t\t\tif ( children === '*' ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Continue if the node is supposed to have children.\n\t\t\t\t\tif ( children ) {\n\t\t\t\t\t\t// If a parent requires certain children, but it does\n\t\t\t\t\t\t// not have them, drop the parent and continue.\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\trequire.length &&\n\t\t\t\t\t\t\t! node.querySelector( require.join( ',' ) )\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcleanNodeList(\n\t\t\t\t\t\t\t\tnode.childNodes,\n\t\t\t\t\t\t\t\tdoc,\n\t\t\t\t\t\t\t\tschema,\n\t\t\t\t\t\t\t\tinline\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tunwrap( node );\n\t\t\t\t\t\t\t// If the node is at the top, phrasing content, and\n\t\t\t\t\t\t\t// contains children that are block content, unwrap\n\t\t\t\t\t\t\t// the node because it is invalid.\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\tnode.parentNode &&\n\t\t\t\t\t\t\tnode.parentNode.nodeName === 'BODY' &&\n\t\t\t\t\t\t\tisPhrasingContent( node )\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcleanNodeList(\n\t\t\t\t\t\t\t\tnode.childNodes,\n\t\t\t\t\t\t\t\tdoc,\n\t\t\t\t\t\t\t\tschema,\n\t\t\t\t\t\t\t\tinline\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tArray.from( node.childNodes ).some(\n\t\t\t\t\t\t\t\t\t( child ) => ! isPhrasingContent( child )\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tunwrap( node );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcleanNodeList(\n\t\t\t\t\t\t\t\tnode.childNodes,\n\t\t\t\t\t\t\t\tdoc,\n\t\t\t\t\t\t\t\tchildren,\n\t\t\t\t\t\t\t\tinline\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Remove children if the node is not supposed to have any.\n\t\t\t\t\t} else {\n\t\t\t\t\t\twhile ( node.firstChild ) {\n\t\t\t\t\t\t\tremove( node.firstChild );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Invalid child. Continue with schema at the same place and unwrap.\n\t\t} else {\n\t\t\tcleanNodeList( node.childNodes, doc, schema, inline );\n\n\t\t\t// For inline mode, insert a line break when unwrapping nodes that\n\t\t\t// are not phrasing content.\n\t\t\tif (\n\t\t\t\tinline &&\n\t\t\t\t! isPhrasingContent( node ) &&\n\t\t\t\tnode.nextElementSibling\n\t\t\t) {\n\t\t\t\tinsertAfter( doc.createElement( 'br' ), node );\n\t\t\t}\n\n\t\t\tunwrap( node );\n\t\t}\n\t} );\n}\n"]}
|
@@ -4,7 +4,7 @@
|
|
4
4
|
import { assertIsDefined } from '../utils/assert-is-defined';
|
5
5
|
/**
|
6
6
|
* Check whether the current document has selected text. This applies to ranges
|
7
|
-
* of text in the document, and not selection inside
|
7
|
+
* of text in the document, and not selection inside `<input>` and `<textarea>`
|
8
8
|
* elements.
|
9
9
|
*
|
10
10
|
* See: https://developer.mozilla.org/en-US/docs/Web/API/Window/getSelection#Related_objects.
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["@wordpress/dom/src/dom/document-has-text-selection.js"],"names":["assertIsDefined","documentHasTextSelection","doc","defaultView","selection","getSelection","range","rangeCount","getRangeAt","collapsed"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,eAAT,QAAgC,4BAAhC;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,eAAe,SAASC,wBAAT,CAAmCC,GAAnC,EAAyC;AACvDF,EAAAA,eAAe,CAAEE,GAAG,CAACC,WAAN,EAAmB,iBAAnB,CAAf;AACA,QAAMC,SAAS,GAAGF,GAAG,CAACC,WAAJ,CAAgBE,YAAhB,EAAlB;AACAL,EAAAA,eAAe,CAAEI,SAAF,EAAa,WAAb,CAAf;AACA,QAAME,KAAK,GAAGF,SAAS,CAACG,UAAV,GAAuBH,SAAS,CAACI,UAAV,CAAsB,CAAtB,CAAvB,GAAmD,IAAjE;AACA,SAAO,CAAC,CAAEF,KAAH,IAAY,CAAEA,KAAK,CAACG,SAA3B;AACA","sourcesContent":["/**\n * Internal dependencies\n */\nimport { assertIsDefined } from '../utils/assert-is-defined';\n\n/**\n * Check whether the current document has selected text. This applies to ranges\n * of text in the document, and not selection inside
|
1
|
+
{"version":3,"sources":["@wordpress/dom/src/dom/document-has-text-selection.js"],"names":["assertIsDefined","documentHasTextSelection","doc","defaultView","selection","getSelection","range","rangeCount","getRangeAt","collapsed"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,eAAT,QAAgC,4BAAhC;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,eAAe,SAASC,wBAAT,CAAmCC,GAAnC,EAAyC;AACvDF,EAAAA,eAAe,CAAEE,GAAG,CAACC,WAAN,EAAmB,iBAAnB,CAAf;AACA,QAAMC,SAAS,GAAGF,GAAG,CAACC,WAAJ,CAAgBE,YAAhB,EAAlB;AACAL,EAAAA,eAAe,CAAEI,SAAF,EAAa,WAAb,CAAf;AACA,QAAME,KAAK,GAAGF,SAAS,CAACG,UAAV,GAAuBH,SAAS,CAACI,UAAV,CAAsB,CAAtB,CAAvB,GAAmD,IAAjE;AACA,SAAO,CAAC,CAAEF,KAAH,IAAY,CAAEA,KAAK,CAACG,SAA3B;AACA","sourcesContent":["/**\n * Internal dependencies\n */\nimport { assertIsDefined } from '../utils/assert-is-defined';\n\n/**\n * Check whether the current document has selected text. This applies to ranges\n * of text in the document, and not selection inside `<input>` and `<textarea>`\n * elements.\n *\n * See: https://developer.mozilla.org/en-US/docs/Web/API/Window/getSelection#Related_objects.\n *\n * @param {Document} doc The document to check.\n *\n * @return {boolean} True if there is selection, false if not.\n */\nexport default function documentHasTextSelection( doc ) {\n\tassertIsDefined( doc.defaultView, 'doc.defaultView' );\n\tconst selection = doc.defaultView.getSelection();\n\tassertIsDefined( selection, 'selection' );\n\tconst range = selection.rangeCount ? selection.getRangeAt( 0 ) : null;\n\treturn !! range && ! range.collapsed;\n}\n"]}
|
@@ -5,8 +5,8 @@ import documentHasTextSelection from './document-has-text-selection';
|
|
5
5
|
import inputFieldHasUncollapsedSelection from './input-field-has-uncollapsed-selection';
|
6
6
|
/**
|
7
7
|
* Check whether the current document has any sort of selection. This includes
|
8
|
-
* ranges of text across elements and any selection inside
|
9
|
-
*
|
8
|
+
* ranges of text across elements and any selection inside `<input>` and
|
9
|
+
* `<textarea>` elements.
|
10
10
|
*
|
11
11
|
* @param {Document} doc The document to check.
|
12
12
|
*
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["@wordpress/dom/src/dom/document-has-uncollapsed-selection.js"],"names":["documentHasTextSelection","inputFieldHasUncollapsedSelection","documentHasUncollapsedSelection","doc","activeElement"],"mappings":"AAAA;AACA;AACA;AACA,OAAOA,wBAAP,MAAqC,+BAArC;AACA,OAAOC,iCAAP,MAA8C,yCAA9C;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,eAAe,SAASC,+BAAT,CAA0CC,GAA1C,EAAgD;AAC9D,SACCH,wBAAwB,CAAEG,GAAF,CAAxB,IACE,CAAC,CAAEA,GAAG,CAACC,aAAP,IACDH,iCAAiC,CAAEE,GAAG,CAACC,aAAN,CAHnC;AAKA","sourcesContent":["/**\n * Internal dependencies\n */\nimport documentHasTextSelection from './document-has-text-selection';\nimport inputFieldHasUncollapsedSelection from './input-field-has-uncollapsed-selection';\n\n/**\n * Check whether the current document has any sort of selection. This includes\n * ranges of text across elements and any selection inside
|
1
|
+
{"version":3,"sources":["@wordpress/dom/src/dom/document-has-uncollapsed-selection.js"],"names":["documentHasTextSelection","inputFieldHasUncollapsedSelection","documentHasUncollapsedSelection","doc","activeElement"],"mappings":"AAAA;AACA;AACA;AACA,OAAOA,wBAAP,MAAqC,+BAArC;AACA,OAAOC,iCAAP,MAA8C,yCAA9C;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,eAAe,SAASC,+BAAT,CAA0CC,GAA1C,EAAgD;AAC9D,SACCH,wBAAwB,CAAEG,GAAF,CAAxB,IACE,CAAC,CAAEA,GAAG,CAACC,aAAP,IACDH,iCAAiC,CAAEE,GAAG,CAACC,aAAN,CAHnC;AAKA","sourcesContent":["/**\n * Internal dependencies\n */\nimport documentHasTextSelection from './document-has-text-selection';\nimport inputFieldHasUncollapsedSelection from './input-field-has-uncollapsed-selection';\n\n/**\n * Check whether the current document has any sort of selection. This includes\n * ranges of text across elements and any selection inside `<input>` and\n * `<textarea>` elements.\n *\n * @param {Document} doc The document to check.\n *\n * @return {boolean} Whether there is any sort of \"selection\" in the document.\n */\nexport default function documentHasUncollapsedSelection( doc ) {\n\treturn (\n\t\tdocumentHasTextSelection( doc ) ||\n\t\t( !! doc.activeElement &&\n\t\t\tinputFieldHasUncollapsedSelection( doc.activeElement ) )\n\t);\n}\n"]}
|
@@ -12,12 +12,18 @@ export default function getRangeHeight(range) {
|
|
12
12
|
return;
|
13
13
|
}
|
14
14
|
|
15
|
-
const highestTop = Math.min(...rects.map(
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
})
|
15
|
+
const highestTop = Math.min(...rects.map(_ref => {
|
16
|
+
let {
|
17
|
+
top
|
18
|
+
} = _ref;
|
19
|
+
return top;
|
20
|
+
}));
|
21
|
+
const lowestBottom = Math.max(...rects.map(_ref2 => {
|
22
|
+
let {
|
23
|
+
bottom
|
24
|
+
} = _ref2;
|
25
|
+
return bottom;
|
26
|
+
}));
|
21
27
|
return lowestBottom - highestTop;
|
22
28
|
}
|
23
29
|
//# sourceMappingURL=get-range-height.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["@wordpress/dom/src/dom/get-range-height.js"],"names":["getRangeHeight","range","rects","Array","from","getClientRects","length","highestTop","Math","min","map","top","lowestBottom","max","bottom"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASA,cAAT,CAAyBC,KAAzB,EAAiC;AAC/C,QAAMC,KAAK,GAAGC,KAAK,CAACC,IAAN,CAAYH,KAAK,CAACI,cAAN,EAAZ,CAAd;;AAEA,MAAK,CAAEH,KAAK,CAACI,MAAb,EAAsB;AACrB;AACA;;AAED,QAAMC,UAAU,GAAGC,IAAI,CAACC,GAAL,CAAU,GAAGP,KAAK,CAACQ,GAAN,CAAW,
|
1
|
+
{"version":3,"sources":["@wordpress/dom/src/dom/get-range-height.js"],"names":["getRangeHeight","range","rects","Array","from","getClientRects","length","highestTop","Math","min","map","top","lowestBottom","max","bottom"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASA,cAAT,CAAyBC,KAAzB,EAAiC;AAC/C,QAAMC,KAAK,GAAGC,KAAK,CAACC,IAAN,CAAYH,KAAK,CAACI,cAAN,EAAZ,CAAd;;AAEA,MAAK,CAAEH,KAAK,CAACI,MAAb,EAAsB;AACrB;AACA;;AAED,QAAMC,UAAU,GAAGC,IAAI,CAACC,GAAL,CAAU,GAAGP,KAAK,CAACQ,GAAN,CAAW;AAAA,QAAE;AAAEC,MAAAA;AAAF,KAAF;AAAA,WAAeA,GAAf;AAAA,GAAX,CAAb,CAAnB;AACA,QAAMC,YAAY,GAAGJ,IAAI,CAACK,GAAL,CAAU,GAAGX,KAAK,CAACQ,GAAN,CAAW;AAAA,QAAE;AAAEI,MAAAA;AAAF,KAAF;AAAA,WAAkBA,MAAlB;AAAA,GAAX,CAAb,CAArB;AAEA,SAAOF,YAAY,GAAGL,UAAtB;AACA","sourcesContent":["/**\n * Gets the height of the range without ignoring zero width rectangles, which\n * some browsers ignore when creating a union.\n *\n * @param {Range} range The range to check.\n * @return {number | undefined} Height of the range or undefined if the range has no client rectangles.\n */\nexport default function getRangeHeight( range ) {\n\tconst rects = Array.from( range.getClientRects() );\n\n\tif ( ! rects.length ) {\n\t\treturn;\n\t}\n\n\tconst highestTop = Math.min( ...rects.map( ( { top } ) => top ) );\n\tconst lowestBottom = Math.max( ...rects.map( ( { bottom } ) => bottom ) );\n\n\treturn lowestBottom - highestTop;\n}\n"]}
|
@@ -22,9 +22,12 @@ export default function getRectangleFromRange(range) {
|
|
22
22
|
} // Ignore tiny selection at the edge of a range.
|
23
23
|
|
24
24
|
|
25
|
-
const filteredRects = rects.filter(
|
26
|
-
|
27
|
-
|
25
|
+
const filteredRects = rects.filter(_ref => {
|
26
|
+
let {
|
27
|
+
width
|
28
|
+
} = _ref;
|
29
|
+
return width > 1;
|
30
|
+
}); // If it's full of tiny selections, return browser default.
|
28
31
|
|
29
32
|
if (filteredRects.length === 0) {
|
30
33
|
return range.getBoundingClientRect();
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["@wordpress/dom/src/dom/get-rectangle-from-range.js"],"names":["assertIsDefined","getRectangleFromRange","range","collapsed","rects","Array","from","getClientRects","length","filteredRects","filter","width","getBoundingClientRect","top","furthestTop","bottom","furthestBottom","left","furthestLeft","right","furthestRight","window","DOMRect","startContainer","ownerDocument","nodeName","parentNode","index","childNodes","indexOf","createRange","setStart","setEnd","rect","padNode","createTextNode","cloneRange","insertNode","removeChild"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,eAAT,QAAgC,4BAAhC;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,eAAe,SAASC,qBAAT,CAAgCC,KAAhC,EAAwC;AACtD;AACA;AACA;AACA,MAAK,CAAEA,KAAK,CAACC,SAAb,EAAyB;AACxB,UAAMC,KAAK,GAAGC,KAAK,CAACC,IAAN,CAAYJ,KAAK,CAACK,cAAN,EAAZ,CAAd,CADwB,CAGxB;;AACA,QAAKH,KAAK,CAACI,MAAN,KAAiB,CAAtB,EAA0B;AACzB,aAAOJ,KAAK,CAAE,CAAF,CAAZ;AACA,KANuB,CAQxB;;;AACA,UAAMK,aAAa,GAAGL,KAAK,CAACM,MAAN,CAAc,
|
1
|
+
{"version":3,"sources":["@wordpress/dom/src/dom/get-rectangle-from-range.js"],"names":["assertIsDefined","getRectangleFromRange","range","collapsed","rects","Array","from","getClientRects","length","filteredRects","filter","width","getBoundingClientRect","top","furthestTop","bottom","furthestBottom","left","furthestLeft","right","furthestRight","window","DOMRect","startContainer","ownerDocument","nodeName","parentNode","index","childNodes","indexOf","createRange","setStart","setEnd","rect","padNode","createTextNode","cloneRange","insertNode","removeChild"],"mappings":"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","sourcesContent":["/**\n * Internal dependencies\n */\nimport { assertIsDefined } from '../utils/assert-is-defined';\n\n/**\n * Get the rectangle of a given Range.\n *\n * @param {Range} range The range.\n *\n * @return {DOMRect} The rectangle.\n */\nexport default function getRectangleFromRange( range ) {\n\t// For uncollapsed ranges, get the rectangle that bounds the contents of the\n\t// range; this a rectangle enclosing the union of the bounding rectangles\n\t// for all the elements in the range.\n\tif ( ! range.collapsed ) {\n\t\tconst rects = Array.from( range.getClientRects() );\n\n\t\t// If there's just a single rect, return it.\n\t\tif ( rects.length === 1 ) {\n\t\t\treturn rects[ 0 ];\n\t\t}\n\n\t\t// Ignore tiny selection at the edge of a range.\n\t\tconst filteredRects = rects.filter( ( { width } ) => width > 1 );\n\n\t\t// If it's full of tiny selections, return browser default.\n\t\tif ( filteredRects.length === 0 ) {\n\t\t\treturn range.getBoundingClientRect();\n\t\t}\n\n\t\tif ( filteredRects.length === 1 ) {\n\t\t\treturn filteredRects[ 0 ];\n\t\t}\n\n\t\tlet {\n\t\t\ttop: furthestTop,\n\t\t\tbottom: furthestBottom,\n\t\t\tleft: furthestLeft,\n\t\t\tright: furthestRight,\n\t\t} = filteredRects[ 0 ];\n\n\t\tfor ( const { top, bottom, left, right } of filteredRects ) {\n\t\t\tif ( top < furthestTop ) furthestTop = top;\n\t\t\tif ( bottom > furthestBottom ) furthestBottom = bottom;\n\t\t\tif ( left < furthestLeft ) furthestLeft = left;\n\t\t\tif ( right > furthestRight ) furthestRight = right;\n\t\t}\n\n\t\treturn new window.DOMRect(\n\t\t\tfurthestLeft,\n\t\t\tfurthestTop,\n\t\t\tfurthestRight - furthestLeft,\n\t\t\tfurthestBottom - furthestTop\n\t\t);\n\t}\n\n\tconst { startContainer } = range;\n\tconst { ownerDocument } = startContainer;\n\n\t// Correct invalid \"BR\" ranges. The cannot contain any children.\n\tif ( startContainer.nodeName === 'BR' ) {\n\t\tconst { parentNode } = startContainer;\n\t\tassertIsDefined( parentNode, 'parentNode' );\n\t\tconst index = /** @type {Node[]} */ ( Array.from(\n\t\t\tparentNode.childNodes\n\t\t) ).indexOf( startContainer );\n\n\t\tassertIsDefined( ownerDocument, 'ownerDocument' );\n\t\trange = ownerDocument.createRange();\n\t\trange.setStart( parentNode, index );\n\t\trange.setEnd( parentNode, index );\n\t}\n\n\tlet rect = range.getClientRects()[ 0 ];\n\n\t// If the collapsed range starts (and therefore ends) at an element node,\n\t// `getClientRects` can be empty in some browsers. This can be resolved\n\t// by adding a temporary text node with zero-width space to the range.\n\t//\n\t// See: https://stackoverflow.com/a/6847328/995445\n\tif ( ! rect ) {\n\t\tassertIsDefined( ownerDocument, 'ownerDocument' );\n\t\tconst padNode = ownerDocument.createTextNode( '\\u200b' );\n\t\t// Do not modify the live range.\n\t\trange = range.cloneRange();\n\t\trange.insertNode( padNode );\n\t\trect = range.getClientRects()[ 0 ];\n\t\tassertIsDefined( padNode.parentNode, 'padNode.parentNode' );\n\t\tpadNode.parentNode.removeChild( padNode );\n\t}\n\n\treturn rect;\n}\n"]}
|
@@ -20,8 +20,10 @@ import isInputOrTextArea from './is-input-or-text-area';
|
|
20
20
|
* @return {boolean} True if at the edge, false if not.
|
21
21
|
*/
|
22
22
|
|
23
|
-
export default function isEdge(container, isReverse
|
24
|
-
|
23
|
+
export default function isEdge(container, isReverse) {
|
24
|
+
let onlyVertical = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
25
|
+
|
26
|
+
if (isInputOrTextArea(container) && typeof container.selectionStart === 'number') {
|
25
27
|
if (container.selectionStart !== container.selectionEnd) {
|
26
28
|
return false;
|
27
29
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["@wordpress/dom/src/dom/is-edge.js"],"names":["isRTL","getRangeHeight","getRectangleFromRange","isSelectionForward","hiddenCaretRangeFromPoint","assertIsDefined","isInputOrTextArea","isEdge","container","isReverse","onlyVertical","selectionStart","selectionEnd","value","length","isContentEditable","ownerDocument","defaultView","selection","getSelection","rangeCount","range","getRangeAt","collapsedRange","cloneRange","isForward","isCollapsed","collapse","collapsedRangeRect","rangeRect","rangeHeight","height","isReverseDir","containerRect","getBoundingClientRect","x","left","right","y","top","bottom","testRange","testRect","verticalSide","horizontalSide","verticalDiff","horizontalDiff","hasVerticalDiff","Math","abs","hasHorizontalDiff"],"mappings":"AAAA;AACA;AACA;AACA,OAAOA,KAAP,MAAkB,UAAlB;AACA,OAAOC,cAAP,MAA2B,oBAA3B;AACA,OAAOC,qBAAP,MAAkC,4BAAlC;AACA,OAAOC,kBAAP,MAA+B,wBAA/B;AACA,OAAOC,yBAAP,MAAsC,iCAAtC;AACA,SAASC,eAAT,QAAgC,4BAAhC;AACA,OAAOC,iBAAP,MAA8B,yBAA9B;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,eAAe,SAASC,MAAT,CAAiBC,SAAjB,EAA4BC,SAA5B,
|
1
|
+
{"version":3,"sources":["@wordpress/dom/src/dom/is-edge.js"],"names":["isRTL","getRangeHeight","getRectangleFromRange","isSelectionForward","hiddenCaretRangeFromPoint","assertIsDefined","isInputOrTextArea","isEdge","container","isReverse","onlyVertical","selectionStart","selectionEnd","value","length","isContentEditable","ownerDocument","defaultView","selection","getSelection","rangeCount","range","getRangeAt","collapsedRange","cloneRange","isForward","isCollapsed","collapse","collapsedRangeRect","rangeRect","rangeHeight","height","isReverseDir","containerRect","getBoundingClientRect","x","left","right","y","top","bottom","testRange","testRect","verticalSide","horizontalSide","verticalDiff","horizontalDiff","hasVerticalDiff","Math","abs","hasHorizontalDiff"],"mappings":"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","sourcesContent":["/**\n * Internal dependencies\n */\nimport isRTL from './is-rtl';\nimport getRangeHeight from './get-range-height';\nimport getRectangleFromRange from './get-rectangle-from-range';\nimport isSelectionForward from './is-selection-forward';\nimport hiddenCaretRangeFromPoint from './hidden-caret-range-from-point';\nimport { assertIsDefined } from '../utils/assert-is-defined';\nimport isInputOrTextArea from './is-input-or-text-area';\n\n/**\n * Check whether the selection is at the edge of the container. Checks for\n * horizontal position by default. Set `onlyVertical` to true to check only\n * vertically.\n *\n * @param {Element} container Focusable element.\n * @param {boolean} isReverse Set to true to check left, false to check right.\n * @param {boolean} [onlyVertical=false] Set to true to check only vertical position.\n *\n * @return {boolean} True if at the edge, false if not.\n */\nexport default function isEdge( container, isReverse, onlyVertical = false ) {\n\tif (\n\t\tisInputOrTextArea( container ) &&\n\t\ttypeof container.selectionStart === 'number'\n\t) {\n\t\tif ( container.selectionStart !== container.selectionEnd ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( isReverse ) {\n\t\t\treturn container.selectionStart === 0;\n\t\t}\n\n\t\treturn container.value.length === container.selectionStart;\n\t}\n\n\tif ( ! (/** @type {HTMLElement} */ ( container ).isContentEditable) ) {\n\t\treturn true;\n\t}\n\n\tconst { ownerDocument } = container;\n\tconst { defaultView } = ownerDocument;\n\n\tassertIsDefined( defaultView, 'defaultView' );\n\tconst selection = defaultView.getSelection();\n\n\tif ( ! selection || ! selection.rangeCount ) {\n\t\treturn false;\n\t}\n\n\tconst range = selection.getRangeAt( 0 );\n\tconst collapsedRange = range.cloneRange();\n\tconst isForward = isSelectionForward( selection );\n\tconst isCollapsed = selection.isCollapsed;\n\n\t// Collapse in direction of selection.\n\tif ( ! isCollapsed ) {\n\t\tcollapsedRange.collapse( ! isForward );\n\t}\n\n\tconst collapsedRangeRect = getRectangleFromRange( collapsedRange );\n\tconst rangeRect = getRectangleFromRange( range );\n\n\tif ( ! collapsedRangeRect || ! rangeRect ) {\n\t\treturn false;\n\t}\n\n\t// Only consider the multiline selection at the edge if the direction is\n\t// towards the edge. The selection is multiline if it is taller than the\n\t// collapsed selection.\n\tconst rangeHeight = getRangeHeight( range );\n\tif (\n\t\t! isCollapsed &&\n\t\trangeHeight &&\n\t\trangeHeight > collapsedRangeRect.height &&\n\t\tisForward === isReverse\n\t) {\n\t\treturn false;\n\t}\n\n\t// In the case of RTL scripts, the horizontal edge is at the opposite side.\n\tconst isReverseDir = isRTL( container ) ? ! isReverse : isReverse;\n\tconst containerRect = container.getBoundingClientRect();\n\n\t// To check if a selection is at the edge, we insert a test selection at the\n\t// edge of the container and check if the selections have the same vertical\n\t// or horizontal position. If they do, the selection is at the edge.\n\t// This method proves to be better than a DOM-based calculation for the\n\t// horizontal edge, since it ignores empty textnodes and a trailing line\n\t// break element. In other words, we need to check visual positioning, not\n\t// DOM positioning.\n\t// It also proves better than using the computed style for the vertical\n\t// edge, because we cannot know the padding and line height reliably in\n\t// pixels. `getComputedStyle` may return a value with different units.\n\tconst x = isReverseDir ? containerRect.left + 1 : containerRect.right - 1;\n\tconst y = isReverse ? containerRect.top + 1 : containerRect.bottom - 1;\n\tconst testRange = hiddenCaretRangeFromPoint(\n\t\townerDocument,\n\t\tx,\n\t\ty,\n\t\t/** @type {HTMLElement} */ ( container )\n\t);\n\n\tif ( ! testRange ) {\n\t\treturn false;\n\t}\n\n\tconst testRect = getRectangleFromRange( testRange );\n\n\tif ( ! testRect ) {\n\t\treturn false;\n\t}\n\n\tconst verticalSide = isReverse ? 'top' : 'bottom';\n\tconst horizontalSide = isReverseDir ? 'left' : 'right';\n\tconst verticalDiff = testRect[ verticalSide ] - rangeRect[ verticalSide ];\n\tconst horizontalDiff =\n\t\ttestRect[ horizontalSide ] - collapsedRangeRect[ horizontalSide ];\n\n\t// Allow the position to be 1px off.\n\tconst hasVerticalDiff = Math.abs( verticalDiff ) <= 1;\n\tconst hasHorizontalDiff = Math.abs( horizontalDiff ) <= 1;\n\n\treturn onlyVertical\n\t\t? hasVerticalDiff\n\t\t: hasVerticalDiff && hasHorizontalDiff;\n}\n"]}
|
@@ -0,0 +1,95 @@
|
|
1
|
+
/**
|
2
|
+
* Internal dependencies
|
3
|
+
*/
|
4
|
+
import hiddenCaretRangeFromPoint from './hidden-caret-range-from-point';
|
5
|
+
import { assertIsDefined } from '../utils/assert-is-defined';
|
6
|
+
import isInputOrTextArea from './is-input-or-text-area';
|
7
|
+
import isRTL from './is-rtl';
|
8
|
+
/**
|
9
|
+
* Gets the range to place.
|
10
|
+
*
|
11
|
+
* @param {HTMLElement} container Focusable element.
|
12
|
+
* @param {boolean} isReverse True for end, false for start.
|
13
|
+
* @param {number|undefined} x X coordinate to vertically position.
|
14
|
+
*
|
15
|
+
* @return {Range|null} The range to place.
|
16
|
+
*/
|
17
|
+
|
18
|
+
function getRange(container, isReverse, x) {
|
19
|
+
const {
|
20
|
+
ownerDocument
|
21
|
+
} = container; // In the case of RTL scripts, the horizontal edge is at the opposite side.
|
22
|
+
|
23
|
+
const isReverseDir = isRTL(container) ? !isReverse : isReverse;
|
24
|
+
const containerRect = container.getBoundingClientRect(); // When placing at the end (isReverse), find the closest range to the bottom
|
25
|
+
// right corner. When placing at the start, to the top left corner.
|
26
|
+
|
27
|
+
if (x === undefined) {
|
28
|
+
x = isReverse ? containerRect.right - 1 : containerRect.left + 1;
|
29
|
+
}
|
30
|
+
|
31
|
+
const y = isReverseDir ? containerRect.bottom - 1 : containerRect.top + 1;
|
32
|
+
return hiddenCaretRangeFromPoint(ownerDocument, x, y, container);
|
33
|
+
}
|
34
|
+
/**
|
35
|
+
* Places the caret at start or end of a given element.
|
36
|
+
*
|
37
|
+
* @param {HTMLElement} container Focusable element.
|
38
|
+
* @param {boolean} isReverse True for end, false for start.
|
39
|
+
* @param {number|undefined} x X coordinate to vertically position.
|
40
|
+
*/
|
41
|
+
|
42
|
+
|
43
|
+
export default function placeCaretAtEdge(container, isReverse, x) {
|
44
|
+
if (!container) {
|
45
|
+
return;
|
46
|
+
}
|
47
|
+
|
48
|
+
container.focus();
|
49
|
+
|
50
|
+
if (isInputOrTextArea(container)) {
|
51
|
+
// The element may not support selection setting.
|
52
|
+
if (typeof container.selectionStart !== 'number') {
|
53
|
+
return;
|
54
|
+
}
|
55
|
+
|
56
|
+
if (isReverse) {
|
57
|
+
container.selectionStart = container.value.length;
|
58
|
+
container.selectionEnd = container.value.length;
|
59
|
+
} else {
|
60
|
+
container.selectionStart = 0;
|
61
|
+
container.selectionEnd = 0;
|
62
|
+
}
|
63
|
+
|
64
|
+
return;
|
65
|
+
}
|
66
|
+
|
67
|
+
if (!container.isContentEditable) {
|
68
|
+
return;
|
69
|
+
}
|
70
|
+
|
71
|
+
let range = getRange(container, isReverse, x); // If no range range can be created or it is outside the container, the
|
72
|
+
// element may be out of view.
|
73
|
+
|
74
|
+
if (!range || !range.startContainer || !container.contains(range.startContainer)) {
|
75
|
+
container.scrollIntoView(isReverse);
|
76
|
+
range = range = getRange(container, isReverse, x);
|
77
|
+
|
78
|
+
if (!range || !range.startContainer || !container.contains(range.startContainer)) {
|
79
|
+
return;
|
80
|
+
}
|
81
|
+
}
|
82
|
+
|
83
|
+
const {
|
84
|
+
ownerDocument
|
85
|
+
} = container;
|
86
|
+
const {
|
87
|
+
defaultView
|
88
|
+
} = ownerDocument;
|
89
|
+
assertIsDefined(defaultView, 'defaultView');
|
90
|
+
const selection = defaultView.getSelection();
|
91
|
+
assertIsDefined(selection, 'selection');
|
92
|
+
selection.removeAllRanges();
|
93
|
+
selection.addRange(range);
|
94
|
+
}
|
95
|
+
//# sourceMappingURL=place-caret-at-edge.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["@wordpress/dom/src/dom/place-caret-at-edge.js"],"names":["hiddenCaretRangeFromPoint","assertIsDefined","isInputOrTextArea","isRTL","getRange","container","isReverse","x","ownerDocument","isReverseDir","containerRect","getBoundingClientRect","undefined","right","left","y","bottom","top","placeCaretAtEdge","focus","selectionStart","value","length","selectionEnd","isContentEditable","range","startContainer","contains","scrollIntoView","defaultView","selection","getSelection","removeAllRanges","addRange"],"mappings":"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","sourcesContent":["/**\n * Internal dependencies\n */\nimport hiddenCaretRangeFromPoint from './hidden-caret-range-from-point';\nimport { assertIsDefined } from '../utils/assert-is-defined';\nimport isInputOrTextArea from './is-input-or-text-area';\nimport isRTL from './is-rtl';\n\n/**\n * Gets the range to place.\n *\n * @param {HTMLElement} container Focusable element.\n * @param {boolean} isReverse True for end, false for start.\n * @param {number|undefined} x X coordinate to vertically position.\n *\n * @return {Range|null} The range to place.\n */\nfunction getRange( container, isReverse, x ) {\n\tconst { ownerDocument } = container;\n\t// In the case of RTL scripts, the horizontal edge is at the opposite side.\n\tconst isReverseDir = isRTL( container ) ? ! isReverse : isReverse;\n\tconst containerRect = container.getBoundingClientRect();\n\t// When placing at the end (isReverse), find the closest range to the bottom\n\t// right corner. When placing at the start, to the top left corner.\n\tif ( x === undefined ) {\n\t\tx = isReverse ? containerRect.right - 1 : containerRect.left + 1;\n\t}\n\tconst y = isReverseDir ? containerRect.bottom - 1 : containerRect.top + 1;\n\treturn hiddenCaretRangeFromPoint( ownerDocument, x, y, container );\n}\n\n/**\n * Places the caret at start or end of a given element.\n *\n * @param {HTMLElement} container Focusable element.\n * @param {boolean} isReverse True for end, false for start.\n * @param {number|undefined} x X coordinate to vertically position.\n */\nexport default function placeCaretAtEdge( container, isReverse, x ) {\n\tif ( ! container ) {\n\t\treturn;\n\t}\n\n\tcontainer.focus();\n\n\tif ( isInputOrTextArea( container ) ) {\n\t\t// The element may not support selection setting.\n\t\tif ( typeof container.selectionStart !== 'number' ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( isReverse ) {\n\t\t\tcontainer.selectionStart = container.value.length;\n\t\t\tcontainer.selectionEnd = container.value.length;\n\t\t} else {\n\t\t\tcontainer.selectionStart = 0;\n\t\t\tcontainer.selectionEnd = 0;\n\t\t}\n\n\t\treturn;\n\t}\n\n\tif ( ! container.isContentEditable ) {\n\t\treturn;\n\t}\n\n\tlet range = getRange( container, isReverse, x );\n\n\t// If no range range can be created or it is outside the container, the\n\t// element may be out of view.\n\tif (\n\t\t! range ||\n\t\t! range.startContainer ||\n\t\t! container.contains( range.startContainer )\n\t) {\n\t\tcontainer.scrollIntoView( isReverse );\n\t\trange = range = getRange( container, isReverse, x );\n\n\t\tif (\n\t\t\t! range ||\n\t\t\t! range.startContainer ||\n\t\t\t! container.contains( range.startContainer )\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\tconst { ownerDocument } = container;\n\tconst { defaultView } = ownerDocument;\n\tassertIsDefined( defaultView, 'defaultView' );\n\tconst selection = defaultView.getSelection();\n\tassertIsDefined( selection, 'selection' );\n\tselection.removeAllRanges();\n\tselection.addRange( range );\n}\n"]}
|
@@ -1,36 +1,7 @@
|
|
1
1
|
/**
|
2
2
|
* Internal dependencies
|
3
3
|
*/
|
4
|
-
import
|
5
|
-
/**
|
6
|
-
* Internal dependencies
|
7
|
-
*/
|
8
|
-
|
9
|
-
import hiddenCaretRangeFromPoint from './hidden-caret-range-from-point';
|
10
|
-
import isInputOrTextArea from './is-input-or-text-area';
|
11
|
-
import isRTL from './is-rtl';
|
12
|
-
/**
|
13
|
-
* Gets the range to place.
|
14
|
-
*
|
15
|
-
* @param {HTMLElement} container Focusable element.
|
16
|
-
* @param {boolean} isReverse True for end, false for start.
|
17
|
-
*
|
18
|
-
* @return {Range|null} The range to place.
|
19
|
-
*/
|
20
|
-
|
21
|
-
function getRange(container, isReverse) {
|
22
|
-
const {
|
23
|
-
ownerDocument
|
24
|
-
} = container; // In the case of RTL scripts, the horizontal edge is at the opposite side.
|
25
|
-
|
26
|
-
const isReverseDir = isRTL(container) ? !isReverse : isReverse;
|
27
|
-
const containerRect = container.getBoundingClientRect(); // When placing at the end (isReverse), find the closest range to the bottom
|
28
|
-
// right corner. When placing at the start, to the top left corner.
|
29
|
-
|
30
|
-
const x = isReverse ? containerRect.right - 1 : containerRect.left + 1;
|
31
|
-
const y = isReverseDir ? containerRect.bottom - 1 : containerRect.top + 1;
|
32
|
-
return hiddenCaretRangeFromPoint(ownerDocument, x, y, container);
|
33
|
-
}
|
4
|
+
import placeCaretAtEdge from './place-caret-at-edge';
|
34
5
|
/**
|
35
6
|
* Places the caret at start or end of a given element.
|
36
7
|
*
|
@@ -38,57 +9,7 @@ function getRange(container, isReverse) {
|
|
38
9
|
* @param {boolean} isReverse True for end, false for start.
|
39
10
|
*/
|
40
11
|
|
41
|
-
|
42
12
|
export default function placeCaretAtHorizontalEdge(container, isReverse) {
|
43
|
-
|
44
|
-
return;
|
45
|
-
}
|
46
|
-
|
47
|
-
container.focus();
|
48
|
-
|
49
|
-
if (isInputOrTextArea(container)) {
|
50
|
-
// The element may not support selection setting.
|
51
|
-
if (typeof container.selectionStart !== 'number') {
|
52
|
-
return;
|
53
|
-
}
|
54
|
-
|
55
|
-
if (isReverse) {
|
56
|
-
container.selectionStart = container.value.length;
|
57
|
-
container.selectionEnd = container.value.length;
|
58
|
-
} else {
|
59
|
-
container.selectionStart = 0;
|
60
|
-
container.selectionEnd = 0;
|
61
|
-
}
|
62
|
-
|
63
|
-
return;
|
64
|
-
}
|
65
|
-
|
66
|
-
if (!container.isContentEditable) {
|
67
|
-
return;
|
68
|
-
}
|
69
|
-
|
70
|
-
let range = getRange(container, isReverse); // If no range range can be created or it is outside the container, the
|
71
|
-
// element may be out of view.
|
72
|
-
|
73
|
-
if (!range || !range.startContainer || !container.contains(range.startContainer)) {
|
74
|
-
container.scrollIntoView(isReverse);
|
75
|
-
range = getRange(container, isReverse);
|
76
|
-
|
77
|
-
if (!range || !range.startContainer || !container.contains(range.startContainer)) {
|
78
|
-
return;
|
79
|
-
}
|
80
|
-
}
|
81
|
-
|
82
|
-
const {
|
83
|
-
ownerDocument
|
84
|
-
} = container;
|
85
|
-
const {
|
86
|
-
defaultView
|
87
|
-
} = ownerDocument;
|
88
|
-
assertIsDefined(defaultView, 'defaultView');
|
89
|
-
const selection = defaultView.getSelection();
|
90
|
-
assertIsDefined(selection, 'selection');
|
91
|
-
selection.removeAllRanges();
|
92
|
-
selection.addRange(range);
|
13
|
+
return placeCaretAtEdge(container, isReverse, undefined);
|
93
14
|
}
|
94
15
|
//# sourceMappingURL=place-caret-at-horizontal-edge.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["@wordpress/dom/src/dom/place-caret-at-horizontal-edge.js"],"names":["
|
1
|
+
{"version":3,"sources":["@wordpress/dom/src/dom/place-caret-at-horizontal-edge.js"],"names":["placeCaretAtEdge","placeCaretAtHorizontalEdge","container","isReverse","undefined"],"mappings":"AAAA;AACA;AACA;AACA,OAAOA,gBAAP,MAA6B,uBAA7B;AAEA;AACA;AACA;AACA;AACA;AACA;;AACA,eAAe,SAASC,0BAAT,CAAqCC,SAArC,EAAgDC,SAAhD,EAA4D;AAC1E,SAAOH,gBAAgB,CAAEE,SAAF,EAAaC,SAAb,EAAwBC,SAAxB,CAAvB;AACA","sourcesContent":["/**\n * Internal dependencies\n */\nimport placeCaretAtEdge from './place-caret-at-edge';\n\n/**\n * Places the caret at start or end of a given element.\n *\n * @param {HTMLElement} container Focusable element.\n * @param {boolean} isReverse True for end, false for start.\n */\nexport default function placeCaretAtHorizontalEdge( container, isReverse ) {\n\treturn placeCaretAtEdge( container, isReverse, undefined );\n}\n"]}
|
@@ -1,64 +1,16 @@
|
|
1
1
|
/**
|
2
2
|
* Internal dependencies
|
3
3
|
*/
|
4
|
-
import
|
5
|
-
import hiddenCaretRangeFromPoint from './hidden-caret-range-from-point';
|
6
|
-
import { assertIsDefined } from '../utils/assert-is-defined';
|
4
|
+
import placeCaretAtEdge from './place-caret-at-edge';
|
7
5
|
/**
|
8
6
|
* Places the caret at the top or bottom of a given element.
|
9
7
|
*
|
10
|
-
* @param {HTMLElement} container
|
11
|
-
* @param {boolean} isReverse
|
12
|
-
* @param {DOMRect} [rect]
|
13
|
-
* @param {boolean} [mayUseScroll=true] True to allow scrolling, false to disallow.
|
8
|
+
* @param {HTMLElement} container Focusable element.
|
9
|
+
* @param {boolean} isReverse True for bottom, false for top.
|
10
|
+
* @param {DOMRect} [rect] The rectangle to position the caret with.
|
14
11
|
*/
|
15
12
|
|
16
|
-
export default function placeCaretAtVerticalEdge(container, isReverse, rect
|
17
|
-
|
18
|
-
return;
|
19
|
-
}
|
20
|
-
|
21
|
-
if (!rect || !container.isContentEditable) {
|
22
|
-
placeCaretAtHorizontalEdge(container, isReverse);
|
23
|
-
return;
|
24
|
-
}
|
25
|
-
|
26
|
-
container.focus(); // Offset by a buffer half the height of the caret rect. This is needed
|
27
|
-
// because caretRangeFromPoint may default to the end of the selection if
|
28
|
-
// offset is too close to the edge. It's unclear how to precisely calculate
|
29
|
-
// this threshold; it may be the padded area of some combination of line
|
30
|
-
// height, caret height, and font size. The buffer offset is effectively
|
31
|
-
// equivalent to a point at half the height of a line of text.
|
32
|
-
|
33
|
-
const buffer = rect.height / 2;
|
34
|
-
const editableRect = container.getBoundingClientRect();
|
35
|
-
const x = rect.left;
|
36
|
-
const y = isReverse ? editableRect.bottom - buffer : editableRect.top + buffer;
|
37
|
-
const {
|
38
|
-
ownerDocument
|
39
|
-
} = container;
|
40
|
-
const {
|
41
|
-
defaultView
|
42
|
-
} = ownerDocument;
|
43
|
-
const range = hiddenCaretRangeFromPoint(ownerDocument, x, y, container);
|
44
|
-
|
45
|
-
if (!range || !container.contains(range.startContainer)) {
|
46
|
-
if (mayUseScroll && (!range || !range.startContainer || !range.startContainer.contains(container))) {
|
47
|
-
// Might be out of view.
|
48
|
-
// Easier than attempting to calculate manually.
|
49
|
-
container.scrollIntoView(isReverse);
|
50
|
-
placeCaretAtVerticalEdge(container, isReverse, rect, false);
|
51
|
-
return;
|
52
|
-
}
|
53
|
-
|
54
|
-
placeCaretAtHorizontalEdge(container, isReverse);
|
55
|
-
return;
|
56
|
-
}
|
57
|
-
|
58
|
-
assertIsDefined(defaultView, 'defaultView');
|
59
|
-
const selection = defaultView.getSelection();
|
60
|
-
assertIsDefined(selection, 'selection');
|
61
|
-
selection.removeAllRanges();
|
62
|
-
selection.addRange(range);
|
13
|
+
export default function placeCaretAtVerticalEdge(container, isReverse, rect) {
|
14
|
+
return placeCaretAtEdge(container, isReverse, rect === null || rect === void 0 ? void 0 : rect.left);
|
63
15
|
}
|
64
16
|
//# sourceMappingURL=place-caret-at-vertical-edge.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["@wordpress/dom/src/dom/place-caret-at-vertical-edge.js"],"names":["
|
1
|
+
{"version":3,"sources":["@wordpress/dom/src/dom/place-caret-at-vertical-edge.js"],"names":["placeCaretAtEdge","placeCaretAtVerticalEdge","container","isReverse","rect","left"],"mappings":"AAAA;AACA;AACA;AACA,OAAOA,gBAAP,MAA6B,uBAA7B;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,eAAe,SAASC,wBAAT,CAAmCC,SAAnC,EAA8CC,SAA9C,EAAyDC,IAAzD,EAAgE;AAC9E,SAAOJ,gBAAgB,CAAEE,SAAF,EAAaC,SAAb,EAAwBC,IAAxB,aAAwBA,IAAxB,uBAAwBA,IAAI,CAAEC,IAA9B,CAAvB;AACA","sourcesContent":["/**\n * Internal dependencies\n */\nimport placeCaretAtEdge from './place-caret-at-edge';\n\n/**\n * Places the caret at the top or bottom of a given element.\n *\n * @param {HTMLElement} container Focusable element.\n * @param {boolean} isReverse True for bottom, false for top.\n * @param {DOMRect} [rect] The rectangle to position the caret with.\n */\nexport default function placeCaretAtVerticalEdge( container, isReverse, rect ) {\n\treturn placeCaretAtEdge( container, isReverse, rect?.left );\n}\n"]}
|
@@ -1,3 +1,7 @@
|
|
1
|
+
/**
|
2
|
+
* Internal dependencies
|
3
|
+
*/
|
4
|
+
import safeHTML from './safe-html';
|
1
5
|
/**
|
2
6
|
* Removes any HTML tags from the provided string.
|
3
7
|
*
|
@@ -5,8 +9,13 @@
|
|
5
9
|
*
|
6
10
|
* @return {string} The text content with any html removed.
|
7
11
|
*/
|
12
|
+
|
8
13
|
export default function stripHTML(html) {
|
9
|
-
|
10
|
-
|
14
|
+
// Remove any script tags or on* attributes otherwise their *contents* will be left
|
15
|
+
// in place following removal of HTML tags.
|
16
|
+
html = safeHTML(html);
|
17
|
+
const doc = document.implementation.createHTMLDocument('');
|
18
|
+
doc.body.innerHTML = html;
|
19
|
+
return doc.body.textContent || '';
|
11
20
|
}
|
12
21
|
//# sourceMappingURL=strip-html.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["@wordpress/dom/src/dom/strip-html.js"],"names":["stripHTML","html","
|
1
|
+
{"version":3,"sources":["@wordpress/dom/src/dom/strip-html.js"],"names":["safeHTML","stripHTML","html","doc","document","implementation","createHTMLDocument","body","innerHTML","textContent"],"mappings":"AAAA;AACA;AACA;AACA,OAAOA,QAAP,MAAqB,aAArB;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,eAAe,SAASC,SAAT,CAAoBC,IAApB,EAA2B;AACzC;AACA;AACAA,EAAAA,IAAI,GAAGF,QAAQ,CAAEE,IAAF,CAAf;AAEA,QAAMC,GAAG,GAAGC,QAAQ,CAACC,cAAT,CAAwBC,kBAAxB,CAA4C,EAA5C,CAAZ;AACAH,EAAAA,GAAG,CAACI,IAAJ,CAASC,SAAT,GAAqBN,IAArB;AACA,SAAOC,GAAG,CAACI,IAAJ,CAASE,WAAT,IAAwB,EAA/B;AACA","sourcesContent":["/**\n * Internal dependencies\n */\nimport safeHTML from './safe-html';\n\n/**\n * Removes any HTML tags from the provided string.\n *\n * @param {string} html The string containing html.\n *\n * @return {string} The text content with any html removed.\n */\nexport default function stripHTML( html ) {\n\t// Remove any script tags or on* attributes otherwise their *contents* will be left\n\t// in place following removal of HTML tags.\n\thtml = safeHTML( html );\n\n\tconst doc = document.implementation.createHTMLDocument( '' );\n\tdoc.body.innerHTML = html;\n\treturn doc.body.textContent || '';\n}\n"]}
|