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.
- package/lib/command/createModelFromHtml/convertInlineCss.d.ts +1 -7
- package/lib/command/createModelFromHtml/convertInlineCss.js.map +1 -1
- package/lib/command/paste/generatePasteOptionFromPlugins.js +1 -0
- package/lib/command/paste/generatePasteOptionFromPlugins.js.map +1 -1
- package/lib/command/paste/retrieveHtmlInfo.d.ts +1 -2
- package/lib/command/paste/retrieveHtmlInfo.js.map +1 -1
- package/lib-amd/command/createModelFromHtml/convertInlineCss.d.ts +1 -7
- package/lib-amd/command/createModelFromHtml/convertInlineCss.js.map +1 -1
- package/lib-amd/command/paste/generatePasteOptionFromPlugins.js +1 -0
- package/lib-amd/command/paste/generatePasteOptionFromPlugins.js.map +1 -1
- package/lib-amd/command/paste/retrieveHtmlInfo.d.ts +1 -2
- package/lib-amd/command/paste/retrieveHtmlInfo.js.map +1 -1
- package/lib-mjs/command/createModelFromHtml/convertInlineCss.d.ts +1 -7
- package/lib-mjs/command/createModelFromHtml/convertInlineCss.js.map +1 -1
- package/lib-mjs/command/paste/generatePasteOptionFromPlugins.js +1 -0
- package/lib-mjs/command/paste/generatePasteOptionFromPlugins.js.map +1 -1
- package/lib-mjs/command/paste/retrieveHtmlInfo.d.ts +1 -2
- package/lib-mjs/command/paste/retrieveHtmlInfo.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convertInlineCss.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/createModelFromHtml/convertInlineCss.ts"],"names":[],"mappings":";;;;AAAA,2EAAsD;
|
|
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;
|
|
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 +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;
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convertInlineCss.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/createModelFromHtml/convertInlineCss.ts"],"names":[],"mappings":";;;;
|
|
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;
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retrieveHtmlInfo.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/paste/retrieveHtmlInfo.ts"],"names":[],"mappings":";;;;
|
|
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 +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;
|
|
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;
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retrieveHtmlInfo.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/command/paste/retrieveHtmlInfo.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EACH,cAAc,EACd,YAAY,EACZ,wBAAwB,EACxB,OAAO,GACV,MAAM,6BAA6B,CAAC;
|
|
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.
|
|
7
|
-
"roosterjs-content-model-types": "^9.
|
|
6
|
+
"roosterjs-content-model-dom": "^9.52.0",
|
|
7
|
+
"roosterjs-content-model-types": "^9.52.0"
|
|
8
8
|
},
|
|
9
|
-
"version": "9.
|
|
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",
|