roosterjs-content-model-core 9.51.0 → 9.52.0

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.
@@ -1,10 +1,4 @@
1
- /**
2
- * @internal
3
- */
4
- export interface CssRule {
5
- selectors: string[];
6
- text: string;
7
- }
1
+ import type { CssRule } from 'roosterjs-content-model-types';
8
2
  /**
9
3
  * @internal
10
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"convertInlineCss.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/createModelFromHtml/convertInlineCss.ts"],"names":[],"mappings":";;;;AAAA,2EAAsD;AAUtD;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,YAAoB;IACxC,IAAM,KAAK,GAAG,cAAc,CAAC;IAC7B,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,IAAI,EAAE,EAAR,CAAQ,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,GAAa;IAC1C,IAAM,MAAM,GAAG,IAAA,qCAAO,EAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,IAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,MAAM,CAAC,OAAO,CAAC,UAAA,SAAS;;QACpB,IAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QAE9B,IAAI,KAAK,EAAE;YACP,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;gBACpE,IAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAiB,CAAC;gBAEvD,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE;oBACtD,MAAM,CAAC,IAAI,CAAC;wBACR,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC;wBAC5C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;qBAC3B,CAAC,CAAC;iBACN;aACJ;SACJ;QAED,MAAA,SAAS,CAAC,UAAU,0CAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC;AAxBD,4CAwBC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,IAAgB,EAAE,QAAmB;4BACzD,CAAC;;QACA,IAAA,KAAsB,QAAQ,CAAC,CAAC,CAAC,EAA/B,SAAS,eAAA,EAAE,IAAI,UAAgB,CAAC;;YAExC,KAAuB,IAAA,6BAAA,sBAAA,SAAS,CAAA,CAAA,oCAAA,2DAAE;gBAA7B,IAAM,QAAQ,sBAAA;gBACf,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE;oBAC/B,SAAS;iBACZ;gBAED,IAAM,KAAK,GAAG,IAAA,qCAAO,EAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAEvD,qEAAqE;gBACrE,+EAA+E;gBAC/E,yCAAyC;gBACzC,KAAK,CAAC,OAAO,CAAC,UAAA,IAAI;oBACd,OAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBAArE,CAAqE,CACxE,CAAC;aACL;;;;;;;;;;IAhBL,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;gBAApC,CAAC;KAiBT;AACL,CAAC;AAnBD,4CAmBC","sourcesContent":["import { toArray } from 'roosterjs-content-model-dom';\n\n/**\n * @internal\n */\nexport interface CssRule {\n selectors: string[];\n text: string;\n}\n\n/**\n * @internal\n *\n * Splits CSS selectors, avoiding splits within parentheses\n * @param selectorText The CSS selector string\n * @return Array of trimmed selectors\n */\nfunction splitSelectors(selectorText: string) {\n const regex = /(?![^(]*\\)),/;\n return selectorText.split(regex).map(s => s.trim());\n}\n\n/**\n * @internal\n */\nexport function retrieveCssRules(doc: Document): CssRule[] {\n const styles = toArray(doc.querySelectorAll('style'));\n const result: CssRule[] = [];\n\n styles.forEach(styleNode => {\n const sheet = styleNode.sheet;\n\n if (sheet) {\n for (let ruleIndex = 0; ruleIndex < sheet.cssRules.length; ruleIndex++) {\n const rule = sheet.cssRules[ruleIndex] as CSSStyleRule;\n\n if (rule.type == CSSRule.STYLE_RULE && rule.selectorText) {\n result.push({\n selectors: splitSelectors(rule.selectorText),\n text: rule.style.cssText,\n });\n }\n }\n }\n\n styleNode.parentNode?.removeChild(styleNode);\n });\n\n return result;\n}\n\n/**\n * @internal\n */\nexport function convertInlineCss(root: ParentNode, cssRules: CssRule[]) {\n for (let i = cssRules.length - 1; i >= 0; i--) {\n const { selectors, text } = cssRules[i];\n\n for (const selector of selectors) {\n if (!selector || !selector.trim()) {\n continue;\n }\n\n const nodes = toArray(root.querySelectorAll(selector));\n\n // Always put existing styles after so that they have higher priority\n // Which means if both global style and inline style apply to the same element,\n // inline style will have higher priority\n nodes.forEach(node =>\n node.setAttribute('style', text + (node.getAttribute('style') || ''))\n );\n }\n }\n}\n"]}
1
+ {"version":3,"file":"convertInlineCss.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/createModelFromHtml/convertInlineCss.ts"],"names":[],"mappings":";;;;AAAA,2EAAsD;AAGtD;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,YAAoB;IACxC,IAAM,KAAK,GAAG,cAAc,CAAC;IAC7B,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,IAAI,EAAE,EAAR,CAAQ,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,GAAa;IAC1C,IAAM,MAAM,GAAG,IAAA,qCAAO,EAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,IAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,MAAM,CAAC,OAAO,CAAC,UAAA,SAAS;;QACpB,IAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QAE9B,IAAI,KAAK,EAAE;YACP,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;gBACpE,IAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAiB,CAAC;gBAEvD,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE;oBACtD,MAAM,CAAC,IAAI,CAAC;wBACR,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC;wBAC5C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;qBAC3B,CAAC,CAAC;iBACN;aACJ;SACJ;QAED,MAAA,SAAS,CAAC,UAAU,0CAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC;AAxBD,4CAwBC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,IAAgB,EAAE,QAAmB;4BACzD,CAAC;;QACA,IAAA,KAAsB,QAAQ,CAAC,CAAC,CAAC,EAA/B,SAAS,eAAA,EAAE,IAAI,UAAgB,CAAC;;YAExC,KAAuB,IAAA,6BAAA,sBAAA,SAAS,CAAA,CAAA,oCAAA,2DAAE;gBAA7B,IAAM,QAAQ,sBAAA;gBACf,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE;oBAC/B,SAAS;iBACZ;gBAED,IAAM,KAAK,GAAG,IAAA,qCAAO,EAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAEvD,qEAAqE;gBACrE,+EAA+E;gBAC/E,yCAAyC;gBACzC,KAAK,CAAC,OAAO,CAAC,UAAA,IAAI;oBACd,OAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBAArE,CAAqE,CACxE,CAAC;aACL;;;;;;;;;;IAhBL,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;gBAApC,CAAC;KAiBT;AACL,CAAC;AAnBD,4CAmBC","sourcesContent":["import { toArray } from 'roosterjs-content-model-dom';\nimport type { CssRule } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n *\n * Splits CSS selectors, avoiding splits within parentheses\n * @param selectorText The CSS selector string\n * @return Array of trimmed selectors\n */\nfunction splitSelectors(selectorText: string) {\n const regex = /(?![^(]*\\)),/;\n return selectorText.split(regex).map(s => s.trim());\n}\n\n/**\n * @internal\n */\nexport function retrieveCssRules(doc: Document): CssRule[] {\n const styles = toArray(doc.querySelectorAll('style'));\n const result: CssRule[] = [];\n\n styles.forEach(styleNode => {\n const sheet = styleNode.sheet;\n\n if (sheet) {\n for (let ruleIndex = 0; ruleIndex < sheet.cssRules.length; ruleIndex++) {\n const rule = sheet.cssRules[ruleIndex] as CSSStyleRule;\n\n if (rule.type == CSSRule.STYLE_RULE && rule.selectorText) {\n result.push({\n selectors: splitSelectors(rule.selectorText),\n text: rule.style.cssText,\n });\n }\n }\n }\n\n styleNode.parentNode?.removeChild(styleNode);\n });\n\n return result;\n}\n\n/**\n * @internal\n */\nexport function convertInlineCss(root: ParentNode, cssRules: CssRule[]) {\n for (let i = cssRules.length - 1; i >= 0; i--) {\n const { selectors, text } = cssRules[i];\n\n for (const selector of selectors) {\n if (!selector || !selector.trim()) {\n continue;\n }\n\n const nodes = toArray(root.querySelectorAll(selector));\n\n // Always put existing styles after so that they have higher priority\n // Which means if both global style and inline style apply to the same element,\n // inline style will have higher priority\n nodes.forEach(node =>\n node.setAttribute('style', text + (node.getAttribute('style') || ''))\n );\n }\n }\n}\n"]}
@@ -27,6 +27,7 @@ function generatePasteOptionFromPlugins(editor, clipboardData, fragment, htmlFro
27
27
  pasteType: pasteType,
28
28
  domToModelOption: domToModelOption,
29
29
  containsBlockElements: !!htmlFromClipboard.containsBlockElements,
30
+ globalCssRules: htmlFromClipboard.globalCssRules,
30
31
  };
31
32
  return editor.triggerEvent('beforePaste', event, true /* broadcast */);
32
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generatePasteOptionFromPlugins.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/paste/generatePasteOptionFromPlugins.ts"],"names":[],"mappings":";;;AASA;;GAEG;AACH,SAAgB,8BAA8B,CAC1C,MAAe,EACf,aAA4B,EAC5B,QAA0B,EAC1B,iBAAoC,EACpC,SAAoB;;IAEpB,IAAM,gBAAgB,GAAkC;QACpD,qBAAqB,EAAE,EAAE;QACzB,wBAAwB,EAAE,EAAE;QAC5B,uBAAuB,EAAE,EAAE;QAC3B,oBAAoB,EAAE,EAAE;QACxB,iBAAiB,EAAE,EAAE;QACrB,eAAe,EAAE,EAAE;QACnB,mBAAmB,EAAE,EAAE;QACvB,yBAAyB,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,kBAAkB,CAAC,UAAU;aAC7E,yBAAyB;KACjC,CAAC;IAEF,IAAM,KAAK,GAAqB;QAC5B,SAAS,EAAE,aAAa;QACxB,aAAa,eAAA;QACb,QAAQ,UAAA;QACR,UAAU,EAAE,MAAA,iBAAiB,CAAC,UAAU,mCAAI,EAAE;QAC9C,SAAS,EAAE,MAAA,iBAAiB,CAAC,SAAS,mCAAI,EAAE;QAC5C,cAAc,EAAE,iBAAiB,CAAC,QAAQ;QAC1C,SAAS,EAAE,SAAS;QACpB,gBAAgB,kBAAA;QAChB,qBAAqB,EAAE,CAAC,CAAC,iBAAiB,CAAC,qBAAqB;KACnE,CAAC;IAEF,OAAO,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;AAC3E,CAAC;AAhCD,wEAgCC","sourcesContent":["import type { HtmlFromClipboard } from './retrieveHtmlInfo';\nimport type {\n BeforePasteEvent,\n ClipboardData,\n DomToModelOptionForSanitizing,\n PasteType,\n IEditor,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function generatePasteOptionFromPlugins(\n editor: IEditor,\n clipboardData: ClipboardData,\n fragment: DocumentFragment,\n htmlFromClipboard: HtmlFromClipboard,\n pasteType: PasteType\n): BeforePasteEvent {\n const domToModelOption: DomToModelOptionForSanitizing = {\n additionalAllowedTags: [],\n additionalDisallowedTags: [],\n additionalFormatParsers: {},\n formatParserOverride: {},\n processorOverride: {},\n styleSanitizers: {},\n attributeSanitizers: {},\n processNonVisibleElements: !!editor.getEnvironment().domToModelSettings.customized\n .processNonVisibleElements,\n };\n\n const event: BeforePasteEvent = {\n eventType: 'beforePaste',\n clipboardData,\n fragment,\n htmlBefore: htmlFromClipboard.htmlBefore ?? '',\n htmlAfter: htmlFromClipboard.htmlAfter ?? '',\n htmlAttributes: htmlFromClipboard.metadata,\n pasteType: pasteType,\n domToModelOption,\n containsBlockElements: !!htmlFromClipboard.containsBlockElements,\n };\n\n return editor.triggerEvent('beforePaste', event, true /* broadcast */);\n}\n"]}
1
+ {"version":3,"file":"generatePasteOptionFromPlugins.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/paste/generatePasteOptionFromPlugins.ts"],"names":[],"mappings":";;;AASA;;GAEG;AACH,SAAgB,8BAA8B,CAC1C,MAAe,EACf,aAA4B,EAC5B,QAA0B,EAC1B,iBAAoC,EACpC,SAAoB;;IAEpB,IAAM,gBAAgB,GAAkC;QACpD,qBAAqB,EAAE,EAAE;QACzB,wBAAwB,EAAE,EAAE;QAC5B,uBAAuB,EAAE,EAAE;QAC3B,oBAAoB,EAAE,EAAE;QACxB,iBAAiB,EAAE,EAAE;QACrB,eAAe,EAAE,EAAE;QACnB,mBAAmB,EAAE,EAAE;QACvB,yBAAyB,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,kBAAkB,CAAC,UAAU;aAC7E,yBAAyB;KACjC,CAAC;IAEF,IAAM,KAAK,GAAqB;QAC5B,SAAS,EAAE,aAAa;QACxB,aAAa,eAAA;QACb,QAAQ,UAAA;QACR,UAAU,EAAE,MAAA,iBAAiB,CAAC,UAAU,mCAAI,EAAE;QAC9C,SAAS,EAAE,MAAA,iBAAiB,CAAC,SAAS,mCAAI,EAAE;QAC5C,cAAc,EAAE,iBAAiB,CAAC,QAAQ;QAC1C,SAAS,EAAE,SAAS;QACpB,gBAAgB,kBAAA;QAChB,qBAAqB,EAAE,CAAC,CAAC,iBAAiB,CAAC,qBAAqB;QAChE,cAAc,EAAE,iBAAiB,CAAC,cAAc;KACnD,CAAC;IAEF,OAAO,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;AAC3E,CAAC;AAjCD,wEAiCC","sourcesContent":["import type { HtmlFromClipboard } from './retrieveHtmlInfo';\nimport type {\n BeforePasteEvent,\n ClipboardData,\n DomToModelOptionForSanitizing,\n PasteType,\n IEditor,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function generatePasteOptionFromPlugins(\n editor: IEditor,\n clipboardData: ClipboardData,\n fragment: DocumentFragment,\n htmlFromClipboard: HtmlFromClipboard,\n pasteType: PasteType\n): BeforePasteEvent {\n const domToModelOption: DomToModelOptionForSanitizing = {\n additionalAllowedTags: [],\n additionalDisallowedTags: [],\n additionalFormatParsers: {},\n formatParserOverride: {},\n processorOverride: {},\n styleSanitizers: {},\n attributeSanitizers: {},\n processNonVisibleElements: !!editor.getEnvironment().domToModelSettings.customized\n .processNonVisibleElements,\n };\n\n const event: BeforePasteEvent = {\n eventType: 'beforePaste',\n clipboardData,\n fragment,\n htmlBefore: htmlFromClipboard.htmlBefore ?? '',\n htmlAfter: htmlFromClipboard.htmlAfter ?? '',\n htmlAttributes: htmlFromClipboard.metadata,\n pasteType: pasteType,\n domToModelOption,\n containsBlockElements: !!htmlFromClipboard.containsBlockElements,\n globalCssRules: htmlFromClipboard.globalCssRules,\n };\n\n return editor.triggerEvent('beforePaste', event, true /* broadcast */);\n}\n"]}
@@ -1,5 +1,4 @@
1
- import type { ClipboardData } from 'roosterjs-content-model-types';
2
- import type { CssRule } from '../createModelFromHtml/convertInlineCss';
1
+ import type { ClipboardData, CssRule } from 'roosterjs-content-model-types';
3
2
  /**
4
3
  * @internal
5
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"retrieveHtmlInfo.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/paste/retrieveHtmlInfo.ts"],"names":[],"mappings":";;;;AAAA,4EAA2E;AAC3E,2EAKqC;AAIrC,IAAM,cAAc,GAAG,sBAAsB,CAAC;AAC9C,IAAM,YAAY,GAAG,oBAAoB,CAAC;AAa1C;;GAEG;AACH,SAAgB,gBAAgB,CAC5B,GAAoB,EACpB,aAAqC;IAErC,IAAI,MAAM,GAAsB;QAC5B,QAAQ,EAAE,EAAE;QACZ,cAAc,EAAE,EAAE;KACrB,CAAC;IAEF,IAAI,GAAG,EAAE;QACL,MAAM,mDACC,mBAAmB,CAAC,aAAa,CAAC,KACrC,cAAc,EAAE,IAAA,mCAAgB,EAAC,GAAG,CAAC,EACrC,QAAQ,EAAE,IAAA,sDAAwB,EAAC,GAAG,CAAC,EACvC,qBAAqB,EAAE,kBAAkB,CAAC,GAAG,CAAC,GACjD,CAAC;QAEF,aAAa,CAAC,uBAAuB,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;KACrE;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AArBD,4CAqBC;AAED,SAAS,oBAAoB,CAAC,GAAa;;IACvC,IAAM,YAAY,GAAa,EAAE,CAAC;IAElC,KAAK,IAAI,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE;QACpE,IAAI,IAAA,0CAAY,EAAC,KAAK,EAAE,WAAW,CAAC,EAAE;YAClC,IAAM,aAAa,GAAG,MAAA,KAAK,CAAC,SAAS,0CAAE,OAAO,CAAC,gBAAgB,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;YAE5E,IAAI,aAAa,EAAE;gBACf,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,4CAA4C;aACtE;SACJ;aAAM,IAAI,IAAA,0CAAY,EAAC,KAAK,EAAE,cAAc,CAAC,EAAE;YAC5C,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;SACpC;KACJ;IAED,OAAO,YAAY,CAAC;AACxB,CAAC;AAED,SAAS,mBAAmB,CACxB,aAAqC;;IAKrC,IAAM,OAAO,GAAG,MAAA,aAAa,CAAC,OAAO,mCAAI,EAAE,CAAC;IAC5C,IAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACnD,IAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,SAAS,GAAG,EAAE,CAAC;IAEnB,IAAI,UAAU,IAAI,CAAC,IAAI,QAAQ,IAAI,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE;QACnE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAC9C,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9D,aAAa,CAAC,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;KACxF;SAAM;QACH,aAAa,CAAC,IAAI,GAAG,OAAO,CAAC;KAChC;IAED,OAAO,EAAE,UAAU,YAAA,EAAE,SAAS,WAAA,EAAE,CAAC;AACrC,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAa;IACrC,IAAM,QAAQ,GAAG,IAAA,qCAAO,EAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;IAEzD,OAAO,QAAQ,CAAC,IAAI,CAAC,UAAA,EAAE,IAAI,OAAA,IAAA,0CAAY,EAAC,EAAE,EAAE,cAAc,CAAC,IAAI,IAAA,4CAAc,EAAC,EAAE,CAAC,EAAtD,CAAsD,CAAC,CAAC;AACvF,CAAC","sourcesContent":["import { retrieveCssRules } from '../createModelFromHtml/convertInlineCss';\nimport {\n isBlockElement,\n isNodeOfType,\n retrieveDocumentMetadata,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type { ClipboardData } from 'roosterjs-content-model-types';\nimport type { CssRule } from '../createModelFromHtml/convertInlineCss';\n\nconst START_FRAGMENT = '<!--StartFragment-->';\nconst END_FRAGMENT = '<!--EndFragment-->';\n\n/**\n * @internal\n */\nexport interface HtmlFromClipboard {\n metadata: Record<string, string>;\n globalCssRules: CssRule[];\n htmlBefore?: string;\n htmlAfter?: string;\n containsBlockElements?: boolean;\n}\n\n/**\n * @internal\n */\nexport function retrieveHtmlInfo(\n doc: Document | null,\n clipboardData: Partial<ClipboardData>\n): HtmlFromClipboard {\n let result: HtmlFromClipboard = {\n metadata: {},\n globalCssRules: [],\n };\n\n if (doc) {\n result = {\n ...retrieveHtmlStrings(clipboardData),\n globalCssRules: retrieveCssRules(doc),\n metadata: retrieveDocumentMetadata(doc),\n containsBlockElements: checkBlockElements(doc),\n };\n\n clipboardData.htmlFirstLevelChildTags = retrieveTopLevelTags(doc);\n }\n\n return result;\n}\n\nfunction retrieveTopLevelTags(doc: Document): string[] {\n const topLevelTags: string[] = [];\n\n for (let child = doc.body.firstChild; child; child = child.nextSibling) {\n if (isNodeOfType(child, 'TEXT_NODE')) {\n const trimmedString = child.nodeValue?.replace(/(\\r\\n|\\r|\\n)/gm, '').trim();\n\n if (trimmedString) {\n topLevelTags.push(''); // Push an empty string as tag for text node\n }\n } else if (isNodeOfType(child, 'ELEMENT_NODE')) {\n topLevelTags.push(child.tagName);\n }\n }\n\n return topLevelTags;\n}\n\nfunction retrieveHtmlStrings(\n clipboardData: Partial<ClipboardData>\n): {\n htmlBefore: string;\n htmlAfter: string;\n} {\n const rawHtml = clipboardData.rawHtml ?? '';\n const startIndex = rawHtml.indexOf(START_FRAGMENT);\n const endIndex = rawHtml.lastIndexOf(END_FRAGMENT);\n let htmlBefore = '';\n let htmlAfter = '';\n\n if (startIndex >= 0 && endIndex >= startIndex + START_FRAGMENT.length) {\n htmlBefore = rawHtml.substring(0, startIndex);\n htmlAfter = rawHtml.substring(endIndex + END_FRAGMENT.length);\n clipboardData.html = rawHtml.substring(startIndex + START_FRAGMENT.length, endIndex);\n } else {\n clipboardData.html = rawHtml;\n }\n\n return { htmlBefore, htmlAfter };\n}\n\nfunction checkBlockElements(doc: Document): boolean {\n const elements = toArray(doc.body.querySelectorAll('*'));\n\n return elements.some(el => isNodeOfType(el, 'ELEMENT_NODE') && isBlockElement(el));\n}\n"]}
1
+ {"version":3,"file":"retrieveHtmlInfo.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/paste/retrieveHtmlInfo.ts"],"names":[],"mappings":";;;;AAAA,4EAA2E;AAC3E,2EAKqC;AAGrC,IAAM,cAAc,GAAG,sBAAsB,CAAC;AAC9C,IAAM,YAAY,GAAG,oBAAoB,CAAC;AAa1C;;GAEG;AACH,SAAgB,gBAAgB,CAC5B,GAAoB,EACpB,aAAqC;IAErC,IAAI,MAAM,GAAsB;QAC5B,QAAQ,EAAE,EAAE;QACZ,cAAc,EAAE,EAAE;KACrB,CAAC;IAEF,IAAI,GAAG,EAAE;QACL,MAAM,mDACC,mBAAmB,CAAC,aAAa,CAAC,KACrC,cAAc,EAAE,IAAA,mCAAgB,EAAC,GAAG,CAAC,EACrC,QAAQ,EAAE,IAAA,sDAAwB,EAAC,GAAG,CAAC,EACvC,qBAAqB,EAAE,kBAAkB,CAAC,GAAG,CAAC,GACjD,CAAC;QAEF,aAAa,CAAC,uBAAuB,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;KACrE;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AArBD,4CAqBC;AAED,SAAS,oBAAoB,CAAC,GAAa;;IACvC,IAAM,YAAY,GAAa,EAAE,CAAC;IAElC,KAAK,IAAI,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE;QACpE,IAAI,IAAA,0CAAY,EAAC,KAAK,EAAE,WAAW,CAAC,EAAE;YAClC,IAAM,aAAa,GAAG,MAAA,KAAK,CAAC,SAAS,0CAAE,OAAO,CAAC,gBAAgB,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;YAE5E,IAAI,aAAa,EAAE;gBACf,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,4CAA4C;aACtE;SACJ;aAAM,IAAI,IAAA,0CAAY,EAAC,KAAK,EAAE,cAAc,CAAC,EAAE;YAC5C,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;SACpC;KACJ;IAED,OAAO,YAAY,CAAC;AACxB,CAAC;AAED,SAAS,mBAAmB,CACxB,aAAqC;;IAKrC,IAAM,OAAO,GAAG,MAAA,aAAa,CAAC,OAAO,mCAAI,EAAE,CAAC;IAC5C,IAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACnD,IAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,SAAS,GAAG,EAAE,CAAC;IAEnB,IAAI,UAAU,IAAI,CAAC,IAAI,QAAQ,IAAI,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE;QACnE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAC9C,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9D,aAAa,CAAC,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;KACxF;SAAM;QACH,aAAa,CAAC,IAAI,GAAG,OAAO,CAAC;KAChC;IAED,OAAO,EAAE,UAAU,YAAA,EAAE,SAAS,WAAA,EAAE,CAAC;AACrC,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAa;IACrC,IAAM,QAAQ,GAAG,IAAA,qCAAO,EAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;IAEzD,OAAO,QAAQ,CAAC,IAAI,CAAC,UAAA,EAAE,IAAI,OAAA,IAAA,0CAAY,EAAC,EAAE,EAAE,cAAc,CAAC,IAAI,IAAA,4CAAc,EAAC,EAAE,CAAC,EAAtD,CAAsD,CAAC,CAAC;AACvF,CAAC","sourcesContent":["import { retrieveCssRules } from '../createModelFromHtml/convertInlineCss';\nimport {\n isBlockElement,\n isNodeOfType,\n retrieveDocumentMetadata,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type { ClipboardData, CssRule } from 'roosterjs-content-model-types';\n\nconst START_FRAGMENT = '<!--StartFragment-->';\nconst END_FRAGMENT = '<!--EndFragment-->';\n\n/**\n * @internal\n */\nexport interface HtmlFromClipboard {\n metadata: Record<string, string>;\n globalCssRules: CssRule[];\n htmlBefore?: string;\n htmlAfter?: string;\n containsBlockElements?: boolean;\n}\n\n/**\n * @internal\n */\nexport function retrieveHtmlInfo(\n doc: Document | null,\n clipboardData: Partial<ClipboardData>\n): HtmlFromClipboard {\n let result: HtmlFromClipboard = {\n metadata: {},\n globalCssRules: [],\n };\n\n if (doc) {\n result = {\n ...retrieveHtmlStrings(clipboardData),\n globalCssRules: retrieveCssRules(doc),\n metadata: retrieveDocumentMetadata(doc),\n containsBlockElements: checkBlockElements(doc),\n };\n\n clipboardData.htmlFirstLevelChildTags = retrieveTopLevelTags(doc);\n }\n\n return result;\n}\n\nfunction retrieveTopLevelTags(doc: Document): string[] {\n const topLevelTags: string[] = [];\n\n for (let child = doc.body.firstChild; child; child = child.nextSibling) {\n if (isNodeOfType(child, 'TEXT_NODE')) {\n const trimmedString = child.nodeValue?.replace(/(\\r\\n|\\r|\\n)/gm, '').trim();\n\n if (trimmedString) {\n topLevelTags.push(''); // Push an empty string as tag for text node\n }\n } else if (isNodeOfType(child, 'ELEMENT_NODE')) {\n topLevelTags.push(child.tagName);\n }\n }\n\n return topLevelTags;\n}\n\nfunction retrieveHtmlStrings(\n clipboardData: Partial<ClipboardData>\n): {\n htmlBefore: string;\n htmlAfter: string;\n} {\n const rawHtml = clipboardData.rawHtml ?? '';\n const startIndex = rawHtml.indexOf(START_FRAGMENT);\n const endIndex = rawHtml.lastIndexOf(END_FRAGMENT);\n let htmlBefore = '';\n let htmlAfter = '';\n\n if (startIndex >= 0 && endIndex >= startIndex + START_FRAGMENT.length) {\n htmlBefore = rawHtml.substring(0, startIndex);\n htmlAfter = rawHtml.substring(endIndex + END_FRAGMENT.length);\n clipboardData.html = rawHtml.substring(startIndex + START_FRAGMENT.length, endIndex);\n } else {\n clipboardData.html = rawHtml;\n }\n\n return { htmlBefore, htmlAfter };\n}\n\nfunction checkBlockElements(doc: Document): boolean {\n const elements = toArray(doc.body.querySelectorAll('*'));\n\n return elements.some(el => isNodeOfType(el, 'ELEMENT_NODE') && isBlockElement(el));\n}\n"]}
@@ -1,10 +1,4 @@
1
- /**
2
- * @internal
3
- */
4
- export interface CssRule {
5
- selectors: string[];
6
- text: string;
7
- }
1
+ import type { CssRule } from 'roosterjs-content-model-types';
8
2
  /**
9
3
  * @internal
10
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"convertInlineCss.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/createModelFromHtml/convertInlineCss.ts"],"names":[],"mappings":";;;;IAUA;;;;;;OAMG;IACH,SAAS,cAAc,CAAC,YAAoB;QACxC,IAAM,KAAK,GAAG,cAAc,CAAC;QAC7B,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,IAAI,EAAE,EAAR,CAAQ,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,SAAgB,gBAAgB,CAAC,GAAa;QAC1C,IAAM,MAAM,GAAG,IAAA,qCAAO,EAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;QACtD,IAAM,MAAM,GAAc,EAAE,CAAC;QAE7B,MAAM,CAAC,OAAO,CAAC,UAAA,SAAS;;YACpB,IAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;YAE9B,IAAI,KAAK,EAAE;gBACP,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;oBACpE,IAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAiB,CAAC;oBAEvD,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE;wBACtD,MAAM,CAAC,IAAI,CAAC;4BACR,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC;4BAC5C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;yBAC3B,CAAC,CAAC;qBACN;iBACJ;aACJ;YAED,MAAA,SAAS,CAAC,UAAU,0CAAE,WAAW,CAAC,SAAS,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAClB,CAAC;IAxBD,4CAwBC;IAED;;OAEG;IACH,SAAgB,gBAAgB,CAAC,IAAgB,EAAE,QAAmB;gCACzD,CAAC;;YACA,IAAA,KAAsB,QAAQ,CAAC,CAAC,CAAC,EAA/B,SAAS,eAAA,EAAE,IAAI,UAAgB,CAAC;;gBAExC,KAAuB,IAAA,6BAAA,sBAAA,SAAS,CAAA,CAAA,oCAAA,2DAAE;oBAA7B,IAAM,QAAQ,sBAAA;oBACf,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE;wBAC/B,SAAS;qBACZ;oBAED,IAAM,KAAK,GAAG,IAAA,qCAAO,EAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAEvD,qEAAqE;oBACrE,+EAA+E;oBAC/E,yCAAyC;oBACzC,KAAK,CAAC,OAAO,CAAC,UAAA,IAAI;wBACd,OAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;oBAArE,CAAqE,CACxE,CAAC;iBACL;;;;;;;;;;QAhBL,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;oBAApC,CAAC;SAiBT;IACL,CAAC;IAnBD,4CAmBC","sourcesContent":["import { toArray } from 'roosterjs-content-model-dom';\n\n/**\n * @internal\n */\nexport interface CssRule {\n selectors: string[];\n text: string;\n}\n\n/**\n * @internal\n *\n * Splits CSS selectors, avoiding splits within parentheses\n * @param selectorText The CSS selector string\n * @return Array of trimmed selectors\n */\nfunction splitSelectors(selectorText: string) {\n const regex = /(?![^(]*\\)),/;\n return selectorText.split(regex).map(s => s.trim());\n}\n\n/**\n * @internal\n */\nexport function retrieveCssRules(doc: Document): CssRule[] {\n const styles = toArray(doc.querySelectorAll('style'));\n const result: CssRule[] = [];\n\n styles.forEach(styleNode => {\n const sheet = styleNode.sheet;\n\n if (sheet) {\n for (let ruleIndex = 0; ruleIndex < sheet.cssRules.length; ruleIndex++) {\n const rule = sheet.cssRules[ruleIndex] as CSSStyleRule;\n\n if (rule.type == CSSRule.STYLE_RULE && rule.selectorText) {\n result.push({\n selectors: splitSelectors(rule.selectorText),\n text: rule.style.cssText,\n });\n }\n }\n }\n\n styleNode.parentNode?.removeChild(styleNode);\n });\n\n return result;\n}\n\n/**\n * @internal\n */\nexport function convertInlineCss(root: ParentNode, cssRules: CssRule[]) {\n for (let i = cssRules.length - 1; i >= 0; i--) {\n const { selectors, text } = cssRules[i];\n\n for (const selector of selectors) {\n if (!selector || !selector.trim()) {\n continue;\n }\n\n const nodes = toArray(root.querySelectorAll(selector));\n\n // Always put existing styles after so that they have higher priority\n // Which means if both global style and inline style apply to the same element,\n // inline style will have higher priority\n nodes.forEach(node =>\n node.setAttribute('style', text + (node.getAttribute('style') || ''))\n );\n }\n }\n}\n"]}
1
+ {"version":3,"file":"convertInlineCss.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/createModelFromHtml/convertInlineCss.ts"],"names":[],"mappings":";;;;IAGA;;;;;;OAMG;IACH,SAAS,cAAc,CAAC,YAAoB;QACxC,IAAM,KAAK,GAAG,cAAc,CAAC;QAC7B,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,IAAI,EAAE,EAAR,CAAQ,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,SAAgB,gBAAgB,CAAC,GAAa;QAC1C,IAAM,MAAM,GAAG,IAAA,qCAAO,EAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;QACtD,IAAM,MAAM,GAAc,EAAE,CAAC;QAE7B,MAAM,CAAC,OAAO,CAAC,UAAA,SAAS;;YACpB,IAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;YAE9B,IAAI,KAAK,EAAE;gBACP,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;oBACpE,IAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAiB,CAAC;oBAEvD,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE;wBACtD,MAAM,CAAC,IAAI,CAAC;4BACR,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC;4BAC5C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;yBAC3B,CAAC,CAAC;qBACN;iBACJ;aACJ;YAED,MAAA,SAAS,CAAC,UAAU,0CAAE,WAAW,CAAC,SAAS,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAClB,CAAC;IAxBD,4CAwBC;IAED;;OAEG;IACH,SAAgB,gBAAgB,CAAC,IAAgB,EAAE,QAAmB;gCACzD,CAAC;;YACA,IAAA,KAAsB,QAAQ,CAAC,CAAC,CAAC,EAA/B,SAAS,eAAA,EAAE,IAAI,UAAgB,CAAC;;gBAExC,KAAuB,IAAA,6BAAA,sBAAA,SAAS,CAAA,CAAA,oCAAA,2DAAE;oBAA7B,IAAM,QAAQ,sBAAA;oBACf,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE;wBAC/B,SAAS;qBACZ;oBAED,IAAM,KAAK,GAAG,IAAA,qCAAO,EAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAEvD,qEAAqE;oBACrE,+EAA+E;oBAC/E,yCAAyC;oBACzC,KAAK,CAAC,OAAO,CAAC,UAAA,IAAI;wBACd,OAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;oBAArE,CAAqE,CACxE,CAAC;iBACL;;;;;;;;;;QAhBL,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;oBAApC,CAAC;SAiBT;IACL,CAAC;IAnBD,4CAmBC","sourcesContent":["import { toArray } from 'roosterjs-content-model-dom';\nimport type { CssRule } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n *\n * Splits CSS selectors, avoiding splits within parentheses\n * @param selectorText The CSS selector string\n * @return Array of trimmed selectors\n */\nfunction splitSelectors(selectorText: string) {\n const regex = /(?![^(]*\\)),/;\n return selectorText.split(regex).map(s => s.trim());\n}\n\n/**\n * @internal\n */\nexport function retrieveCssRules(doc: Document): CssRule[] {\n const styles = toArray(doc.querySelectorAll('style'));\n const result: CssRule[] = [];\n\n styles.forEach(styleNode => {\n const sheet = styleNode.sheet;\n\n if (sheet) {\n for (let ruleIndex = 0; ruleIndex < sheet.cssRules.length; ruleIndex++) {\n const rule = sheet.cssRules[ruleIndex] as CSSStyleRule;\n\n if (rule.type == CSSRule.STYLE_RULE && rule.selectorText) {\n result.push({\n selectors: splitSelectors(rule.selectorText),\n text: rule.style.cssText,\n });\n }\n }\n }\n\n styleNode.parentNode?.removeChild(styleNode);\n });\n\n return result;\n}\n\n/**\n * @internal\n */\nexport function convertInlineCss(root: ParentNode, cssRules: CssRule[]) {\n for (let i = cssRules.length - 1; i >= 0; i--) {\n const { selectors, text } = cssRules[i];\n\n for (const selector of selectors) {\n if (!selector || !selector.trim()) {\n continue;\n }\n\n const nodes = toArray(root.querySelectorAll(selector));\n\n // Always put existing styles after so that they have higher priority\n // Which means if both global style and inline style apply to the same element,\n // inline style will have higher priority\n nodes.forEach(node =>\n node.setAttribute('style', text + (node.getAttribute('style') || ''))\n );\n }\n }\n}\n"]}
@@ -28,6 +28,7 @@ define(["require", "exports"], function (require, exports) {
28
28
  pasteType: pasteType,
29
29
  domToModelOption: domToModelOption,
30
30
  containsBlockElements: !!htmlFromClipboard.containsBlockElements,
31
+ globalCssRules: htmlFromClipboard.globalCssRules,
31
32
  };
32
33
  return editor.triggerEvent('beforePaste', event, true /* broadcast */);
33
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generatePasteOptionFromPlugins.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/paste/generatePasteOptionFromPlugins.ts"],"names":[],"mappings":";;;;IASA;;OAEG;IACH,SAAgB,8BAA8B,CAC1C,MAAe,EACf,aAA4B,EAC5B,QAA0B,EAC1B,iBAAoC,EACpC,SAAoB;;QAEpB,IAAM,gBAAgB,GAAkC;YACpD,qBAAqB,EAAE,EAAE;YACzB,wBAAwB,EAAE,EAAE;YAC5B,uBAAuB,EAAE,EAAE;YAC3B,oBAAoB,EAAE,EAAE;YACxB,iBAAiB,EAAE,EAAE;YACrB,eAAe,EAAE,EAAE;YACnB,mBAAmB,EAAE,EAAE;YACvB,yBAAyB,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,kBAAkB,CAAC,UAAU;iBAC7E,yBAAyB;SACjC,CAAC;QAEF,IAAM,KAAK,GAAqB;YAC5B,SAAS,EAAE,aAAa;YACxB,aAAa,eAAA;YACb,QAAQ,UAAA;YACR,UAAU,EAAE,MAAA,iBAAiB,CAAC,UAAU,mCAAI,EAAE;YAC9C,SAAS,EAAE,MAAA,iBAAiB,CAAC,SAAS,mCAAI,EAAE;YAC5C,cAAc,EAAE,iBAAiB,CAAC,QAAQ;YAC1C,SAAS,EAAE,SAAS;YACpB,gBAAgB,kBAAA;YAChB,qBAAqB,EAAE,CAAC,CAAC,iBAAiB,CAAC,qBAAqB;SACnE,CAAC;QAEF,OAAO,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IAC3E,CAAC;IAhCD,wEAgCC","sourcesContent":["import type { HtmlFromClipboard } from './retrieveHtmlInfo';\nimport type {\n BeforePasteEvent,\n ClipboardData,\n DomToModelOptionForSanitizing,\n PasteType,\n IEditor,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function generatePasteOptionFromPlugins(\n editor: IEditor,\n clipboardData: ClipboardData,\n fragment: DocumentFragment,\n htmlFromClipboard: HtmlFromClipboard,\n pasteType: PasteType\n): BeforePasteEvent {\n const domToModelOption: DomToModelOptionForSanitizing = {\n additionalAllowedTags: [],\n additionalDisallowedTags: [],\n additionalFormatParsers: {},\n formatParserOverride: {},\n processorOverride: {},\n styleSanitizers: {},\n attributeSanitizers: {},\n processNonVisibleElements: !!editor.getEnvironment().domToModelSettings.customized\n .processNonVisibleElements,\n };\n\n const event: BeforePasteEvent = {\n eventType: 'beforePaste',\n clipboardData,\n fragment,\n htmlBefore: htmlFromClipboard.htmlBefore ?? '',\n htmlAfter: htmlFromClipboard.htmlAfter ?? '',\n htmlAttributes: htmlFromClipboard.metadata,\n pasteType: pasteType,\n domToModelOption,\n containsBlockElements: !!htmlFromClipboard.containsBlockElements,\n };\n\n return editor.triggerEvent('beforePaste', event, true /* broadcast */);\n}\n"]}
1
+ {"version":3,"file":"generatePasteOptionFromPlugins.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/paste/generatePasteOptionFromPlugins.ts"],"names":[],"mappings":";;;;IASA;;OAEG;IACH,SAAgB,8BAA8B,CAC1C,MAAe,EACf,aAA4B,EAC5B,QAA0B,EAC1B,iBAAoC,EACpC,SAAoB;;QAEpB,IAAM,gBAAgB,GAAkC;YACpD,qBAAqB,EAAE,EAAE;YACzB,wBAAwB,EAAE,EAAE;YAC5B,uBAAuB,EAAE,EAAE;YAC3B,oBAAoB,EAAE,EAAE;YACxB,iBAAiB,EAAE,EAAE;YACrB,eAAe,EAAE,EAAE;YACnB,mBAAmB,EAAE,EAAE;YACvB,yBAAyB,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,kBAAkB,CAAC,UAAU;iBAC7E,yBAAyB;SACjC,CAAC;QAEF,IAAM,KAAK,GAAqB;YAC5B,SAAS,EAAE,aAAa;YACxB,aAAa,eAAA;YACb,QAAQ,UAAA;YACR,UAAU,EAAE,MAAA,iBAAiB,CAAC,UAAU,mCAAI,EAAE;YAC9C,SAAS,EAAE,MAAA,iBAAiB,CAAC,SAAS,mCAAI,EAAE;YAC5C,cAAc,EAAE,iBAAiB,CAAC,QAAQ;YAC1C,SAAS,EAAE,SAAS;YACpB,gBAAgB,kBAAA;YAChB,qBAAqB,EAAE,CAAC,CAAC,iBAAiB,CAAC,qBAAqB;YAChE,cAAc,EAAE,iBAAiB,CAAC,cAAc;SACnD,CAAC;QAEF,OAAO,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IAC3E,CAAC;IAjCD,wEAiCC","sourcesContent":["import type { HtmlFromClipboard } from './retrieveHtmlInfo';\nimport type {\n BeforePasteEvent,\n ClipboardData,\n DomToModelOptionForSanitizing,\n PasteType,\n IEditor,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function generatePasteOptionFromPlugins(\n editor: IEditor,\n clipboardData: ClipboardData,\n fragment: DocumentFragment,\n htmlFromClipboard: HtmlFromClipboard,\n pasteType: PasteType\n): BeforePasteEvent {\n const domToModelOption: DomToModelOptionForSanitizing = {\n additionalAllowedTags: [],\n additionalDisallowedTags: [],\n additionalFormatParsers: {},\n formatParserOverride: {},\n processorOverride: {},\n styleSanitizers: {},\n attributeSanitizers: {},\n processNonVisibleElements: !!editor.getEnvironment().domToModelSettings.customized\n .processNonVisibleElements,\n };\n\n const event: BeforePasteEvent = {\n eventType: 'beforePaste',\n clipboardData,\n fragment,\n htmlBefore: htmlFromClipboard.htmlBefore ?? '',\n htmlAfter: htmlFromClipboard.htmlAfter ?? '',\n htmlAttributes: htmlFromClipboard.metadata,\n pasteType: pasteType,\n domToModelOption,\n containsBlockElements: !!htmlFromClipboard.containsBlockElements,\n globalCssRules: htmlFromClipboard.globalCssRules,\n };\n\n return editor.triggerEvent('beforePaste', event, true /* broadcast */);\n}\n"]}
@@ -1,5 +1,4 @@
1
- import type { ClipboardData } from 'roosterjs-content-model-types';
2
- import type { CssRule } from '../createModelFromHtml/convertInlineCss';
1
+ import type { ClipboardData, CssRule } from 'roosterjs-content-model-types';
3
2
  /**
4
3
  * @internal
5
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"retrieveHtmlInfo.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/paste/retrieveHtmlInfo.ts"],"names":[],"mappings":";;;;IAUA,IAAM,cAAc,GAAG,sBAAsB,CAAC;IAC9C,IAAM,YAAY,GAAG,oBAAoB,CAAC;IAa1C;;OAEG;IACH,SAAgB,gBAAgB,CAC5B,GAAoB,EACpB,aAAqC;QAErC,IAAI,MAAM,GAAsB;YAC5B,QAAQ,EAAE,EAAE;YACZ,cAAc,EAAE,EAAE;SACrB,CAAC;QAEF,IAAI,GAAG,EAAE;YACL,MAAM,mDACC,mBAAmB,CAAC,aAAa,CAAC,KACrC,cAAc,EAAE,IAAA,mCAAgB,EAAC,GAAG,CAAC,EACrC,QAAQ,EAAE,IAAA,sDAAwB,EAAC,GAAG,CAAC,EACvC,qBAAqB,EAAE,kBAAkB,CAAC,GAAG,CAAC,GACjD,CAAC;YAEF,aAAa,CAAC,uBAAuB,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;SACrE;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IArBD,4CAqBC;IAED,SAAS,oBAAoB,CAAC,GAAa;;QACvC,IAAM,YAAY,GAAa,EAAE,CAAC;QAElC,KAAK,IAAI,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE;YACpE,IAAI,IAAA,0CAAY,EAAC,KAAK,EAAE,WAAW,CAAC,EAAE;gBAClC,IAAM,aAAa,GAAG,MAAA,KAAK,CAAC,SAAS,0CAAE,OAAO,CAAC,gBAAgB,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;gBAE5E,IAAI,aAAa,EAAE;oBACf,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,4CAA4C;iBACtE;aACJ;iBAAM,IAAI,IAAA,0CAAY,EAAC,KAAK,EAAE,cAAc,CAAC,EAAE;gBAC5C,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;aACpC;SACJ;QAED,OAAO,YAAY,CAAC;IACxB,CAAC;IAED,SAAS,mBAAmB,CACxB,aAAqC;;QAKrC,IAAM,OAAO,GAAG,MAAA,aAAa,CAAC,OAAO,mCAAI,EAAE,CAAC;QAC5C,IAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACnD,IAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QACnD,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,IAAI,SAAS,GAAG,EAAE,CAAC;QAEnB,IAAI,UAAU,IAAI,CAAC,IAAI,QAAQ,IAAI,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE;YACnE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YAC9C,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAC9D,aAAa,CAAC,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;SACxF;aAAM;YACH,aAAa,CAAC,IAAI,GAAG,OAAO,CAAC;SAChC;QAED,OAAO,EAAE,UAAU,YAAA,EAAE,SAAS,WAAA,EAAE,CAAC;IACrC,CAAC;IAED,SAAS,kBAAkB,CAAC,GAAa;QACrC,IAAM,QAAQ,GAAG,IAAA,qCAAO,EAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;QAEzD,OAAO,QAAQ,CAAC,IAAI,CAAC,UAAA,EAAE,IAAI,OAAA,IAAA,0CAAY,EAAC,EAAE,EAAE,cAAc,CAAC,IAAI,IAAA,4CAAc,EAAC,EAAE,CAAC,EAAtD,CAAsD,CAAC,CAAC;IACvF,CAAC","sourcesContent":["import { retrieveCssRules } from '../createModelFromHtml/convertInlineCss';\nimport {\n isBlockElement,\n isNodeOfType,\n retrieveDocumentMetadata,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type { ClipboardData } from 'roosterjs-content-model-types';\nimport type { CssRule } from '../createModelFromHtml/convertInlineCss';\n\nconst START_FRAGMENT = '<!--StartFragment-->';\nconst END_FRAGMENT = '<!--EndFragment-->';\n\n/**\n * @internal\n */\nexport interface HtmlFromClipboard {\n metadata: Record<string, string>;\n globalCssRules: CssRule[];\n htmlBefore?: string;\n htmlAfter?: string;\n containsBlockElements?: boolean;\n}\n\n/**\n * @internal\n */\nexport function retrieveHtmlInfo(\n doc: Document | null,\n clipboardData: Partial<ClipboardData>\n): HtmlFromClipboard {\n let result: HtmlFromClipboard = {\n metadata: {},\n globalCssRules: [],\n };\n\n if (doc) {\n result = {\n ...retrieveHtmlStrings(clipboardData),\n globalCssRules: retrieveCssRules(doc),\n metadata: retrieveDocumentMetadata(doc),\n containsBlockElements: checkBlockElements(doc),\n };\n\n clipboardData.htmlFirstLevelChildTags = retrieveTopLevelTags(doc);\n }\n\n return result;\n}\n\nfunction retrieveTopLevelTags(doc: Document): string[] {\n const topLevelTags: string[] = [];\n\n for (let child = doc.body.firstChild; child; child = child.nextSibling) {\n if (isNodeOfType(child, 'TEXT_NODE')) {\n const trimmedString = child.nodeValue?.replace(/(\\r\\n|\\r|\\n)/gm, '').trim();\n\n if (trimmedString) {\n topLevelTags.push(''); // Push an empty string as tag for text node\n }\n } else if (isNodeOfType(child, 'ELEMENT_NODE')) {\n topLevelTags.push(child.tagName);\n }\n }\n\n return topLevelTags;\n}\n\nfunction retrieveHtmlStrings(\n clipboardData: Partial<ClipboardData>\n): {\n htmlBefore: string;\n htmlAfter: string;\n} {\n const rawHtml = clipboardData.rawHtml ?? '';\n const startIndex = rawHtml.indexOf(START_FRAGMENT);\n const endIndex = rawHtml.lastIndexOf(END_FRAGMENT);\n let htmlBefore = '';\n let htmlAfter = '';\n\n if (startIndex >= 0 && endIndex >= startIndex + START_FRAGMENT.length) {\n htmlBefore = rawHtml.substring(0, startIndex);\n htmlAfter = rawHtml.substring(endIndex + END_FRAGMENT.length);\n clipboardData.html = rawHtml.substring(startIndex + START_FRAGMENT.length, endIndex);\n } else {\n clipboardData.html = rawHtml;\n }\n\n return { htmlBefore, htmlAfter };\n}\n\nfunction checkBlockElements(doc: Document): boolean {\n const elements = toArray(doc.body.querySelectorAll('*'));\n\n return elements.some(el => isNodeOfType(el, 'ELEMENT_NODE') && isBlockElement(el));\n}\n"]}
1
+ {"version":3,"file":"retrieveHtmlInfo.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/paste/retrieveHtmlInfo.ts"],"names":[],"mappings":";;;;IASA,IAAM,cAAc,GAAG,sBAAsB,CAAC;IAC9C,IAAM,YAAY,GAAG,oBAAoB,CAAC;IAa1C;;OAEG;IACH,SAAgB,gBAAgB,CAC5B,GAAoB,EACpB,aAAqC;QAErC,IAAI,MAAM,GAAsB;YAC5B,QAAQ,EAAE,EAAE;YACZ,cAAc,EAAE,EAAE;SACrB,CAAC;QAEF,IAAI,GAAG,EAAE;YACL,MAAM,mDACC,mBAAmB,CAAC,aAAa,CAAC,KACrC,cAAc,EAAE,IAAA,mCAAgB,EAAC,GAAG,CAAC,EACrC,QAAQ,EAAE,IAAA,sDAAwB,EAAC,GAAG,CAAC,EACvC,qBAAqB,EAAE,kBAAkB,CAAC,GAAG,CAAC,GACjD,CAAC;YAEF,aAAa,CAAC,uBAAuB,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;SACrE;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IArBD,4CAqBC;IAED,SAAS,oBAAoB,CAAC,GAAa;;QACvC,IAAM,YAAY,GAAa,EAAE,CAAC;QAElC,KAAK,IAAI,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE;YACpE,IAAI,IAAA,0CAAY,EAAC,KAAK,EAAE,WAAW,CAAC,EAAE;gBAClC,IAAM,aAAa,GAAG,MAAA,KAAK,CAAC,SAAS,0CAAE,OAAO,CAAC,gBAAgB,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;gBAE5E,IAAI,aAAa,EAAE;oBACf,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,4CAA4C;iBACtE;aACJ;iBAAM,IAAI,IAAA,0CAAY,EAAC,KAAK,EAAE,cAAc,CAAC,EAAE;gBAC5C,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;aACpC;SACJ;QAED,OAAO,YAAY,CAAC;IACxB,CAAC;IAED,SAAS,mBAAmB,CACxB,aAAqC;;QAKrC,IAAM,OAAO,GAAG,MAAA,aAAa,CAAC,OAAO,mCAAI,EAAE,CAAC;QAC5C,IAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACnD,IAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QACnD,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,IAAI,SAAS,GAAG,EAAE,CAAC;QAEnB,IAAI,UAAU,IAAI,CAAC,IAAI,QAAQ,IAAI,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE;YACnE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YAC9C,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAC9D,aAAa,CAAC,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;SACxF;aAAM;YACH,aAAa,CAAC,IAAI,GAAG,OAAO,CAAC;SAChC;QAED,OAAO,EAAE,UAAU,YAAA,EAAE,SAAS,WAAA,EAAE,CAAC;IACrC,CAAC;IAED,SAAS,kBAAkB,CAAC,GAAa;QACrC,IAAM,QAAQ,GAAG,IAAA,qCAAO,EAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;QAEzD,OAAO,QAAQ,CAAC,IAAI,CAAC,UAAA,EAAE,IAAI,OAAA,IAAA,0CAAY,EAAC,EAAE,EAAE,cAAc,CAAC,IAAI,IAAA,4CAAc,EAAC,EAAE,CAAC,EAAtD,CAAsD,CAAC,CAAC;IACvF,CAAC","sourcesContent":["import { retrieveCssRules } from '../createModelFromHtml/convertInlineCss';\nimport {\n isBlockElement,\n isNodeOfType,\n retrieveDocumentMetadata,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type { ClipboardData, CssRule } from 'roosterjs-content-model-types';\n\nconst START_FRAGMENT = '<!--StartFragment-->';\nconst END_FRAGMENT = '<!--EndFragment-->';\n\n/**\n * @internal\n */\nexport interface HtmlFromClipboard {\n metadata: Record<string, string>;\n globalCssRules: CssRule[];\n htmlBefore?: string;\n htmlAfter?: string;\n containsBlockElements?: boolean;\n}\n\n/**\n * @internal\n */\nexport function retrieveHtmlInfo(\n doc: Document | null,\n clipboardData: Partial<ClipboardData>\n): HtmlFromClipboard {\n let result: HtmlFromClipboard = {\n metadata: {},\n globalCssRules: [],\n };\n\n if (doc) {\n result = {\n ...retrieveHtmlStrings(clipboardData),\n globalCssRules: retrieveCssRules(doc),\n metadata: retrieveDocumentMetadata(doc),\n containsBlockElements: checkBlockElements(doc),\n };\n\n clipboardData.htmlFirstLevelChildTags = retrieveTopLevelTags(doc);\n }\n\n return result;\n}\n\nfunction retrieveTopLevelTags(doc: Document): string[] {\n const topLevelTags: string[] = [];\n\n for (let child = doc.body.firstChild; child; child = child.nextSibling) {\n if (isNodeOfType(child, 'TEXT_NODE')) {\n const trimmedString = child.nodeValue?.replace(/(\\r\\n|\\r|\\n)/gm, '').trim();\n\n if (trimmedString) {\n topLevelTags.push(''); // Push an empty string as tag for text node\n }\n } else if (isNodeOfType(child, 'ELEMENT_NODE')) {\n topLevelTags.push(child.tagName);\n }\n }\n\n return topLevelTags;\n}\n\nfunction retrieveHtmlStrings(\n clipboardData: Partial<ClipboardData>\n): {\n htmlBefore: string;\n htmlAfter: string;\n} {\n const rawHtml = clipboardData.rawHtml ?? '';\n const startIndex = rawHtml.indexOf(START_FRAGMENT);\n const endIndex = rawHtml.lastIndexOf(END_FRAGMENT);\n let htmlBefore = '';\n let htmlAfter = '';\n\n if (startIndex >= 0 && endIndex >= startIndex + START_FRAGMENT.length) {\n htmlBefore = rawHtml.substring(0, startIndex);\n htmlAfter = rawHtml.substring(endIndex + END_FRAGMENT.length);\n clipboardData.html = rawHtml.substring(startIndex + START_FRAGMENT.length, endIndex);\n } else {\n clipboardData.html = rawHtml;\n }\n\n return { htmlBefore, htmlAfter };\n}\n\nfunction checkBlockElements(doc: Document): boolean {\n const elements = toArray(doc.body.querySelectorAll('*'));\n\n return elements.some(el => isNodeOfType(el, 'ELEMENT_NODE') && isBlockElement(el));\n}\n"]}
@@ -1,10 +1,4 @@
1
- /**
2
- * @internal
3
- */
4
- export interface CssRule {
5
- selectors: string[];
6
- text: string;
7
- }
1
+ import type { CssRule } from 'roosterjs-content-model-types';
8
2
  /**
9
3
  * @internal
10
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"convertInlineCss.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/createModelFromHtml/convertInlineCss.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAUtD;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,YAAoB;IACxC,IAAM,KAAK,GAAG,cAAc,CAAC;IAC7B,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,IAAI,EAAE,EAAR,CAAQ,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAa;IAC1C,IAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,IAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,MAAM,CAAC,OAAO,CAAC,UAAA,SAAS;;QACpB,IAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QAE9B,IAAI,KAAK,EAAE;YACP,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;gBACpE,IAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAiB,CAAC;gBAEvD,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE;oBACtD,MAAM,CAAC,IAAI,CAAC;wBACR,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC;wBAC5C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;qBAC3B,CAAC,CAAC;iBACN;aACJ;SACJ;QAED,MAAA,SAAS,CAAC,UAAU,0CAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAgB,EAAE,QAAmB;4BACzD,CAAC;;QACA,IAAA,KAAsB,QAAQ,CAAC,CAAC,CAAC,EAA/B,SAAS,eAAA,EAAE,IAAI,UAAgB,CAAC;;YAExC,KAAuB,IAAA,6BAAA,SAAA,SAAS,CAAA,CAAA,oCAAA,2DAAE;gBAA7B,IAAM,QAAQ,sBAAA;gBACf,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE;oBAC/B,SAAS;iBACZ;gBAED,IAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAEvD,qEAAqE;gBACrE,+EAA+E;gBAC/E,yCAAyC;gBACzC,KAAK,CAAC,OAAO,CAAC,UAAA,IAAI;oBACd,OAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBAArE,CAAqE,CACxE,CAAC;aACL;;;;;;;;;;IAhBL,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;gBAApC,CAAC;KAiBT;AACL,CAAC","sourcesContent":["import { toArray } from 'roosterjs-content-model-dom';\n\n/**\n * @internal\n */\nexport interface CssRule {\n selectors: string[];\n text: string;\n}\n\n/**\n * @internal\n *\n * Splits CSS selectors, avoiding splits within parentheses\n * @param selectorText The CSS selector string\n * @return Array of trimmed selectors\n */\nfunction splitSelectors(selectorText: string) {\n const regex = /(?![^(]*\\)),/;\n return selectorText.split(regex).map(s => s.trim());\n}\n\n/**\n * @internal\n */\nexport function retrieveCssRules(doc: Document): CssRule[] {\n const styles = toArray(doc.querySelectorAll('style'));\n const result: CssRule[] = [];\n\n styles.forEach(styleNode => {\n const sheet = styleNode.sheet;\n\n if (sheet) {\n for (let ruleIndex = 0; ruleIndex < sheet.cssRules.length; ruleIndex++) {\n const rule = sheet.cssRules[ruleIndex] as CSSStyleRule;\n\n if (rule.type == CSSRule.STYLE_RULE && rule.selectorText) {\n result.push({\n selectors: splitSelectors(rule.selectorText),\n text: rule.style.cssText,\n });\n }\n }\n }\n\n styleNode.parentNode?.removeChild(styleNode);\n });\n\n return result;\n}\n\n/**\n * @internal\n */\nexport function convertInlineCss(root: ParentNode, cssRules: CssRule[]) {\n for (let i = cssRules.length - 1; i >= 0; i--) {\n const { selectors, text } = cssRules[i];\n\n for (const selector of selectors) {\n if (!selector || !selector.trim()) {\n continue;\n }\n\n const nodes = toArray(root.querySelectorAll(selector));\n\n // Always put existing styles after so that they have higher priority\n // Which means if both global style and inline style apply to the same element,\n // inline style will have higher priority\n nodes.forEach(node =>\n node.setAttribute('style', text + (node.getAttribute('style') || ''))\n );\n }\n }\n}\n"]}
1
+ {"version":3,"file":"convertInlineCss.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/createModelFromHtml/convertInlineCss.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAGtD;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,YAAoB;IACxC,IAAM,KAAK,GAAG,cAAc,CAAC;IAC7B,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,IAAI,EAAE,EAAR,CAAQ,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAa;IAC1C,IAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,IAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,MAAM,CAAC,OAAO,CAAC,UAAA,SAAS;;QACpB,IAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QAE9B,IAAI,KAAK,EAAE;YACP,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;gBACpE,IAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAiB,CAAC;gBAEvD,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE;oBACtD,MAAM,CAAC,IAAI,CAAC;wBACR,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC;wBAC5C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;qBAC3B,CAAC,CAAC;iBACN;aACJ;SACJ;QAED,MAAA,SAAS,CAAC,UAAU,0CAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAgB,EAAE,QAAmB;4BACzD,CAAC;;QACA,IAAA,KAAsB,QAAQ,CAAC,CAAC,CAAC,EAA/B,SAAS,eAAA,EAAE,IAAI,UAAgB,CAAC;;YAExC,KAAuB,IAAA,6BAAA,SAAA,SAAS,CAAA,CAAA,oCAAA,2DAAE;gBAA7B,IAAM,QAAQ,sBAAA;gBACf,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE;oBAC/B,SAAS;iBACZ;gBAED,IAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAEvD,qEAAqE;gBACrE,+EAA+E;gBAC/E,yCAAyC;gBACzC,KAAK,CAAC,OAAO,CAAC,UAAA,IAAI;oBACd,OAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBAArE,CAAqE,CACxE,CAAC;aACL;;;;;;;;;;IAhBL,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;gBAApC,CAAC;KAiBT;AACL,CAAC","sourcesContent":["import { toArray } from 'roosterjs-content-model-dom';\nimport type { CssRule } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n *\n * Splits CSS selectors, avoiding splits within parentheses\n * @param selectorText The CSS selector string\n * @return Array of trimmed selectors\n */\nfunction splitSelectors(selectorText: string) {\n const regex = /(?![^(]*\\)),/;\n return selectorText.split(regex).map(s => s.trim());\n}\n\n/**\n * @internal\n */\nexport function retrieveCssRules(doc: Document): CssRule[] {\n const styles = toArray(doc.querySelectorAll('style'));\n const result: CssRule[] = [];\n\n styles.forEach(styleNode => {\n const sheet = styleNode.sheet;\n\n if (sheet) {\n for (let ruleIndex = 0; ruleIndex < sheet.cssRules.length; ruleIndex++) {\n const rule = sheet.cssRules[ruleIndex] as CSSStyleRule;\n\n if (rule.type == CSSRule.STYLE_RULE && rule.selectorText) {\n result.push({\n selectors: splitSelectors(rule.selectorText),\n text: rule.style.cssText,\n });\n }\n }\n }\n\n styleNode.parentNode?.removeChild(styleNode);\n });\n\n return result;\n}\n\n/**\n * @internal\n */\nexport function convertInlineCss(root: ParentNode, cssRules: CssRule[]) {\n for (let i = cssRules.length - 1; i >= 0; i--) {\n const { selectors, text } = cssRules[i];\n\n for (const selector of selectors) {\n if (!selector || !selector.trim()) {\n continue;\n }\n\n const nodes = toArray(root.querySelectorAll(selector));\n\n // Always put existing styles after so that they have higher priority\n // Which means if both global style and inline style apply to the same element,\n // inline style will have higher priority\n nodes.forEach(node =>\n node.setAttribute('style', text + (node.getAttribute('style') || ''))\n );\n }\n }\n}\n"]}
@@ -24,6 +24,7 @@ export function generatePasteOptionFromPlugins(editor, clipboardData, fragment,
24
24
  pasteType: pasteType,
25
25
  domToModelOption: domToModelOption,
26
26
  containsBlockElements: !!htmlFromClipboard.containsBlockElements,
27
+ globalCssRules: htmlFromClipboard.globalCssRules,
27
28
  };
28
29
  return editor.triggerEvent('beforePaste', event, true /* broadcast */);
29
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generatePasteOptionFromPlugins.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/paste/generatePasteOptionFromPlugins.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAC1C,MAAe,EACf,aAA4B,EAC5B,QAA0B,EAC1B,iBAAoC,EACpC,SAAoB;;IAEpB,IAAM,gBAAgB,GAAkC;QACpD,qBAAqB,EAAE,EAAE;QACzB,wBAAwB,EAAE,EAAE;QAC5B,uBAAuB,EAAE,EAAE;QAC3B,oBAAoB,EAAE,EAAE;QACxB,iBAAiB,EAAE,EAAE;QACrB,eAAe,EAAE,EAAE;QACnB,mBAAmB,EAAE,EAAE;QACvB,yBAAyB,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,kBAAkB,CAAC,UAAU;aAC7E,yBAAyB;KACjC,CAAC;IAEF,IAAM,KAAK,GAAqB;QAC5B,SAAS,EAAE,aAAa;QACxB,aAAa,eAAA;QACb,QAAQ,UAAA;QACR,UAAU,EAAE,MAAA,iBAAiB,CAAC,UAAU,mCAAI,EAAE;QAC9C,SAAS,EAAE,MAAA,iBAAiB,CAAC,SAAS,mCAAI,EAAE;QAC5C,cAAc,EAAE,iBAAiB,CAAC,QAAQ;QAC1C,SAAS,EAAE,SAAS;QACpB,gBAAgB,kBAAA;QAChB,qBAAqB,EAAE,CAAC,CAAC,iBAAiB,CAAC,qBAAqB;KACnE,CAAC;IAEF,OAAO,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;AAC3E,CAAC","sourcesContent":["import type { HtmlFromClipboard } from './retrieveHtmlInfo';\nimport type {\n BeforePasteEvent,\n ClipboardData,\n DomToModelOptionForSanitizing,\n PasteType,\n IEditor,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function generatePasteOptionFromPlugins(\n editor: IEditor,\n clipboardData: ClipboardData,\n fragment: DocumentFragment,\n htmlFromClipboard: HtmlFromClipboard,\n pasteType: PasteType\n): BeforePasteEvent {\n const domToModelOption: DomToModelOptionForSanitizing = {\n additionalAllowedTags: [],\n additionalDisallowedTags: [],\n additionalFormatParsers: {},\n formatParserOverride: {},\n processorOverride: {},\n styleSanitizers: {},\n attributeSanitizers: {},\n processNonVisibleElements: !!editor.getEnvironment().domToModelSettings.customized\n .processNonVisibleElements,\n };\n\n const event: BeforePasteEvent = {\n eventType: 'beforePaste',\n clipboardData,\n fragment,\n htmlBefore: htmlFromClipboard.htmlBefore ?? '',\n htmlAfter: htmlFromClipboard.htmlAfter ?? '',\n htmlAttributes: htmlFromClipboard.metadata,\n pasteType: pasteType,\n domToModelOption,\n containsBlockElements: !!htmlFromClipboard.containsBlockElements,\n };\n\n return editor.triggerEvent('beforePaste', event, true /* broadcast */);\n}\n"]}
1
+ {"version":3,"file":"generatePasteOptionFromPlugins.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/paste/generatePasteOptionFromPlugins.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAC1C,MAAe,EACf,aAA4B,EAC5B,QAA0B,EAC1B,iBAAoC,EACpC,SAAoB;;IAEpB,IAAM,gBAAgB,GAAkC;QACpD,qBAAqB,EAAE,EAAE;QACzB,wBAAwB,EAAE,EAAE;QAC5B,uBAAuB,EAAE,EAAE;QAC3B,oBAAoB,EAAE,EAAE;QACxB,iBAAiB,EAAE,EAAE;QACrB,eAAe,EAAE,EAAE;QACnB,mBAAmB,EAAE,EAAE;QACvB,yBAAyB,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,kBAAkB,CAAC,UAAU;aAC7E,yBAAyB;KACjC,CAAC;IAEF,IAAM,KAAK,GAAqB;QAC5B,SAAS,EAAE,aAAa;QACxB,aAAa,eAAA;QACb,QAAQ,UAAA;QACR,UAAU,EAAE,MAAA,iBAAiB,CAAC,UAAU,mCAAI,EAAE;QAC9C,SAAS,EAAE,MAAA,iBAAiB,CAAC,SAAS,mCAAI,EAAE;QAC5C,cAAc,EAAE,iBAAiB,CAAC,QAAQ;QAC1C,SAAS,EAAE,SAAS;QACpB,gBAAgB,kBAAA;QAChB,qBAAqB,EAAE,CAAC,CAAC,iBAAiB,CAAC,qBAAqB;QAChE,cAAc,EAAE,iBAAiB,CAAC,cAAc;KACnD,CAAC;IAEF,OAAO,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;AAC3E,CAAC","sourcesContent":["import type { HtmlFromClipboard } from './retrieveHtmlInfo';\nimport type {\n BeforePasteEvent,\n ClipboardData,\n DomToModelOptionForSanitizing,\n PasteType,\n IEditor,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function generatePasteOptionFromPlugins(\n editor: IEditor,\n clipboardData: ClipboardData,\n fragment: DocumentFragment,\n htmlFromClipboard: HtmlFromClipboard,\n pasteType: PasteType\n): BeforePasteEvent {\n const domToModelOption: DomToModelOptionForSanitizing = {\n additionalAllowedTags: [],\n additionalDisallowedTags: [],\n additionalFormatParsers: {},\n formatParserOverride: {},\n processorOverride: {},\n styleSanitizers: {},\n attributeSanitizers: {},\n processNonVisibleElements: !!editor.getEnvironment().domToModelSettings.customized\n .processNonVisibleElements,\n };\n\n const event: BeforePasteEvent = {\n eventType: 'beforePaste',\n clipboardData,\n fragment,\n htmlBefore: htmlFromClipboard.htmlBefore ?? '',\n htmlAfter: htmlFromClipboard.htmlAfter ?? '',\n htmlAttributes: htmlFromClipboard.metadata,\n pasteType: pasteType,\n domToModelOption,\n containsBlockElements: !!htmlFromClipboard.containsBlockElements,\n globalCssRules: htmlFromClipboard.globalCssRules,\n };\n\n return editor.triggerEvent('beforePaste', event, true /* broadcast */);\n}\n"]}
@@ -1,5 +1,4 @@
1
- import type { ClipboardData } from 'roosterjs-content-model-types';
2
- import type { CssRule } from '../createModelFromHtml/convertInlineCss';
1
+ import type { ClipboardData, CssRule } from 'roosterjs-content-model-types';
3
2
  /**
4
3
  * @internal
5
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"retrieveHtmlInfo.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/paste/retrieveHtmlInfo.ts"],"names":[],"mappings":"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","sourcesContent":["import { retrieveCssRules } from '../createModelFromHtml/convertInlineCss';\nimport {\n isBlockElement,\n isNodeOfType,\n retrieveDocumentMetadata,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type { ClipboardData } from 'roosterjs-content-model-types';\nimport type { CssRule } from '../createModelFromHtml/convertInlineCss';\n\nconst START_FRAGMENT = '<!--StartFragment-->';\nconst END_FRAGMENT = '<!--EndFragment-->';\n\n/**\n * @internal\n */\nexport interface HtmlFromClipboard {\n metadata: Record<string, string>;\n globalCssRules: CssRule[];\n htmlBefore?: string;\n htmlAfter?: string;\n containsBlockElements?: boolean;\n}\n\n/**\n * @internal\n */\nexport function retrieveHtmlInfo(\n doc: Document | null,\n clipboardData: Partial<ClipboardData>\n): HtmlFromClipboard {\n let result: HtmlFromClipboard = {\n metadata: {},\n globalCssRules: [],\n };\n\n if (doc) {\n result = {\n ...retrieveHtmlStrings(clipboardData),\n globalCssRules: retrieveCssRules(doc),\n metadata: retrieveDocumentMetadata(doc),\n containsBlockElements: checkBlockElements(doc),\n };\n\n clipboardData.htmlFirstLevelChildTags = retrieveTopLevelTags(doc);\n }\n\n return result;\n}\n\nfunction retrieveTopLevelTags(doc: Document): string[] {\n const topLevelTags: string[] = [];\n\n for (let child = doc.body.firstChild; child; child = child.nextSibling) {\n if (isNodeOfType(child, 'TEXT_NODE')) {\n const trimmedString = child.nodeValue?.replace(/(\\r\\n|\\r|\\n)/gm, '').trim();\n\n if (trimmedString) {\n topLevelTags.push(''); // Push an empty string as tag for text node\n }\n } else if (isNodeOfType(child, 'ELEMENT_NODE')) {\n topLevelTags.push(child.tagName);\n }\n }\n\n return topLevelTags;\n}\n\nfunction retrieveHtmlStrings(\n clipboardData: Partial<ClipboardData>\n): {\n htmlBefore: string;\n htmlAfter: string;\n} {\n const rawHtml = clipboardData.rawHtml ?? '';\n const startIndex = rawHtml.indexOf(START_FRAGMENT);\n const endIndex = rawHtml.lastIndexOf(END_FRAGMENT);\n let htmlBefore = '';\n let htmlAfter = '';\n\n if (startIndex >= 0 && endIndex >= startIndex + START_FRAGMENT.length) {\n htmlBefore = rawHtml.substring(0, startIndex);\n htmlAfter = rawHtml.substring(endIndex + END_FRAGMENT.length);\n clipboardData.html = rawHtml.substring(startIndex + START_FRAGMENT.length, endIndex);\n } else {\n clipboardData.html = rawHtml;\n }\n\n return { htmlBefore, htmlAfter };\n}\n\nfunction checkBlockElements(doc: Document): boolean {\n const elements = toArray(doc.body.querySelectorAll('*'));\n\n return elements.some(el => isNodeOfType(el, 'ELEMENT_NODE') && isBlockElement(el));\n}\n"]}
1
+ {"version":3,"file":"retrieveHtmlInfo.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/paste/retrieveHtmlInfo.ts"],"names":[],"mappings":"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","sourcesContent":["import { retrieveCssRules } from '../createModelFromHtml/convertInlineCss';\nimport {\n isBlockElement,\n isNodeOfType,\n retrieveDocumentMetadata,\n toArray,\n} from 'roosterjs-content-model-dom';\nimport type { ClipboardData, CssRule } from 'roosterjs-content-model-types';\n\nconst START_FRAGMENT = '<!--StartFragment-->';\nconst END_FRAGMENT = '<!--EndFragment-->';\n\n/**\n * @internal\n */\nexport interface HtmlFromClipboard {\n metadata: Record<string, string>;\n globalCssRules: CssRule[];\n htmlBefore?: string;\n htmlAfter?: string;\n containsBlockElements?: boolean;\n}\n\n/**\n * @internal\n */\nexport function retrieveHtmlInfo(\n doc: Document | null,\n clipboardData: Partial<ClipboardData>\n): HtmlFromClipboard {\n let result: HtmlFromClipboard = {\n metadata: {},\n globalCssRules: [],\n };\n\n if (doc) {\n result = {\n ...retrieveHtmlStrings(clipboardData),\n globalCssRules: retrieveCssRules(doc),\n metadata: retrieveDocumentMetadata(doc),\n containsBlockElements: checkBlockElements(doc),\n };\n\n clipboardData.htmlFirstLevelChildTags = retrieveTopLevelTags(doc);\n }\n\n return result;\n}\n\nfunction retrieveTopLevelTags(doc: Document): string[] {\n const topLevelTags: string[] = [];\n\n for (let child = doc.body.firstChild; child; child = child.nextSibling) {\n if (isNodeOfType(child, 'TEXT_NODE')) {\n const trimmedString = child.nodeValue?.replace(/(\\r\\n|\\r|\\n)/gm, '').trim();\n\n if (trimmedString) {\n topLevelTags.push(''); // Push an empty string as tag for text node\n }\n } else if (isNodeOfType(child, 'ELEMENT_NODE')) {\n topLevelTags.push(child.tagName);\n }\n }\n\n return topLevelTags;\n}\n\nfunction retrieveHtmlStrings(\n clipboardData: Partial<ClipboardData>\n): {\n htmlBefore: string;\n htmlAfter: string;\n} {\n const rawHtml = clipboardData.rawHtml ?? '';\n const startIndex = rawHtml.indexOf(START_FRAGMENT);\n const endIndex = rawHtml.lastIndexOf(END_FRAGMENT);\n let htmlBefore = '';\n let htmlAfter = '';\n\n if (startIndex >= 0 && endIndex >= startIndex + START_FRAGMENT.length) {\n htmlBefore = rawHtml.substring(0, startIndex);\n htmlAfter = rawHtml.substring(endIndex + END_FRAGMENT.length);\n clipboardData.html = rawHtml.substring(startIndex + START_FRAGMENT.length, endIndex);\n } else {\n clipboardData.html = rawHtml;\n }\n\n return { htmlBefore, htmlAfter };\n}\n\nfunction checkBlockElements(doc: Document): boolean {\n const elements = toArray(doc.body.querySelectorAll('*'));\n\n return elements.some(el => isNodeOfType(el, 'ELEMENT_NODE') && isBlockElement(el));\n}\n"]}
package/package.json CHANGED
@@ -3,10 +3,10 @@
3
3
  "description": "Core editor for roosterjs",
4
4
  "dependencies": {
5
5
  "tslib": "^2.3.1",
6
- "roosterjs-content-model-dom": "^9.51.0",
7
- "roosterjs-content-model-types": "^9.51.0"
6
+ "roosterjs-content-model-dom": "^9.52.0",
7
+ "roosterjs-content-model-types": "^9.52.0"
8
8
  },
9
- "version": "9.51.0",
9
+ "version": "9.52.0",
10
10
  "main": "./lib/index.js",
11
11
  "typings": "./lib/index.d.ts",
12
12
  "module": "./lib-mjs/index.js",