roosterjs-content-model-plugins 9.6.1 → 9.7.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.
Files changed (163) hide show
  1. package/lib/autoFormat/hyphen/transformHyphen.js +3 -3
  2. package/lib/autoFormat/hyphen/transformHyphen.js.map +1 -1
  3. package/lib/autoFormat/link/createLink.js +7 -2
  4. package/lib/autoFormat/link/createLink.js.map +1 -1
  5. package/lib/autoFormat/link/createLinkAfterSpace.js +1 -2
  6. package/lib/autoFormat/link/createLinkAfterSpace.js.map +1 -1
  7. package/lib/autoFormat/numbers/transformFraction.js +2 -2
  8. package/lib/autoFormat/numbers/transformFraction.js.map +1 -1
  9. package/lib/autoFormat/numbers/transformOrdinals.js +2 -2
  10. package/lib/autoFormat/numbers/transformOrdinals.js.map +1 -1
  11. package/lib/edit/EditPlugin.d.ts +15 -0
  12. package/lib/edit/EditPlugin.js +14 -2
  13. package/lib/edit/EditPlugin.js.map +1 -1
  14. package/lib/imageEdit/ImageEditPlugin.d.ts +11 -5
  15. package/lib/imageEdit/ImageEditPlugin.js +209 -103
  16. package/lib/imageEdit/ImageEditPlugin.js.map +1 -1
  17. package/lib/imageEdit/types/ImageAndParagraph.d.ts +8 -0
  18. package/lib/imageEdit/types/ImageAndParagraph.js +3 -0
  19. package/lib/imageEdit/types/ImageAndParagraph.js.map +1 -0
  20. package/lib/imageEdit/types/ImageEditOptions.d.ts +1 -1
  21. package/lib/imageEdit/types/ImageEditOptions.js.map +1 -1
  22. package/lib/imageEdit/utils/applyChange.js +4 -8
  23. package/lib/imageEdit/utils/applyChange.js.map +1 -1
  24. package/lib/imageEdit/utils/createImageWrapper.d.ts +1 -1
  25. package/lib/imageEdit/utils/createImageWrapper.js +10 -6
  26. package/lib/imageEdit/utils/createImageWrapper.js.map +1 -1
  27. package/lib/imageEdit/utils/findEditingImage.d.ts +6 -0
  28. package/lib/imageEdit/utils/findEditingImage.js +43 -0
  29. package/lib/imageEdit/utils/findEditingImage.js.map +1 -0
  30. package/lib/imageEdit/utils/getSelectedImage.d.ts +6 -0
  31. package/lib/imageEdit/utils/getSelectedImage.js +21 -0
  32. package/lib/imageEdit/utils/getSelectedImage.js.map +1 -0
  33. package/lib/imageEdit/utils/updateImageEditInfo.d.ts +1 -1
  34. package/lib/imageEdit/utils/updateImageEditInfo.js +10 -6
  35. package/lib/imageEdit/utils/updateImageEditInfo.js.map +1 -1
  36. package/lib/imageEdit/utils/updateWrapper.js +2 -2
  37. package/lib/imageEdit/utils/updateWrapper.js.map +1 -1
  38. package/lib/index.d.ts +1 -1
  39. package/lib/index.js.map +1 -1
  40. package/lib/markdown/utils/setFormat.js +1 -2
  41. package/lib/markdown/utils/setFormat.js.map +1 -1
  42. package/lib/picker/getQueryString.js +2 -2
  43. package/lib/picker/getQueryString.js.map +1 -1
  44. package/lib/tableEdit/editors/TableEditor.js +4 -2
  45. package/lib/tableEdit/editors/TableEditor.js.map +1 -1
  46. package/lib/tableEdit/editors/features/TableMover.d.ts +2 -2
  47. package/lib/tableEdit/editors/features/TableMover.js +4 -4
  48. package/lib/tableEdit/editors/features/TableMover.js.map +1 -1
  49. package/lib-amd/autoFormat/hyphen/transformHyphen.js +3 -3
  50. package/lib-amd/autoFormat/hyphen/transformHyphen.js.map +1 -1
  51. package/lib-amd/autoFormat/link/createLink.js +7 -2
  52. package/lib-amd/autoFormat/link/createLink.js.map +1 -1
  53. package/lib-amd/autoFormat/link/createLinkAfterSpace.js +2 -2
  54. package/lib-amd/autoFormat/link/createLinkAfterSpace.js.map +1 -1
  55. package/lib-amd/autoFormat/numbers/transformFraction.js +2 -2
  56. package/lib-amd/autoFormat/numbers/transformFraction.js.map +1 -1
  57. package/lib-amd/autoFormat/numbers/transformOrdinals.js +2 -2
  58. package/lib-amd/autoFormat/numbers/transformOrdinals.js.map +1 -1
  59. package/lib-amd/edit/EditPlugin.d.ts +15 -0
  60. package/lib-amd/edit/EditPlugin.js +14 -2
  61. package/lib-amd/edit/EditPlugin.js.map +1 -1
  62. package/lib-amd/imageEdit/ImageEditPlugin.d.ts +11 -5
  63. package/lib-amd/imageEdit/ImageEditPlugin.js +208 -104
  64. package/lib-amd/imageEdit/ImageEditPlugin.js.map +1 -1
  65. package/lib-amd/imageEdit/types/ImageAndParagraph.d.ts +8 -0
  66. package/lib-amd/imageEdit/types/ImageAndParagraph.js +5 -0
  67. package/lib-amd/imageEdit/types/ImageAndParagraph.js.map +1 -0
  68. package/lib-amd/imageEdit/types/ImageEditOptions.d.ts +1 -1
  69. package/lib-amd/imageEdit/types/ImageEditOptions.js.map +1 -1
  70. package/lib-amd/imageEdit/utils/applyChange.js +4 -8
  71. package/lib-amd/imageEdit/utils/applyChange.js.map +1 -1
  72. package/lib-amd/imageEdit/utils/createImageWrapper.d.ts +1 -1
  73. package/lib-amd/imageEdit/utils/createImageWrapper.js +10 -7
  74. package/lib-amd/imageEdit/utils/createImageWrapper.js.map +1 -1
  75. package/lib-amd/imageEdit/utils/findEditingImage.d.ts +6 -0
  76. package/lib-amd/imageEdit/utils/findEditingImage.js +45 -0
  77. package/lib-amd/imageEdit/utils/findEditingImage.js.map +1 -0
  78. package/lib-amd/imageEdit/utils/getSelectedImage.d.ts +6 -0
  79. package/lib-amd/imageEdit/utils/getSelectedImage.js +22 -0
  80. package/lib-amd/imageEdit/utils/getSelectedImage.js.map +1 -0
  81. package/lib-amd/imageEdit/utils/updateImageEditInfo.d.ts +1 -1
  82. package/lib-amd/imageEdit/utils/updateImageEditInfo.js +10 -6
  83. package/lib-amd/imageEdit/utils/updateImageEditInfo.js.map +1 -1
  84. package/lib-amd/imageEdit/utils/updateWrapper.js +2 -2
  85. package/lib-amd/imageEdit/utils/updateWrapper.js.map +1 -1
  86. package/lib-amd/index.d.ts +1 -1
  87. package/lib-amd/index.js.map +1 -1
  88. package/lib-amd/markdown/utils/setFormat.js +2 -2
  89. package/lib-amd/markdown/utils/setFormat.js.map +1 -1
  90. package/lib-amd/picker/getQueryString.js +2 -2
  91. package/lib-amd/picker/getQueryString.js.map +1 -1
  92. package/lib-amd/tableEdit/editors/TableEditor.js +4 -2
  93. package/lib-amd/tableEdit/editors/TableEditor.js.map +1 -1
  94. package/lib-amd/tableEdit/editors/features/TableMover.d.ts +2 -2
  95. package/lib-amd/tableEdit/editors/features/TableMover.js +4 -4
  96. package/lib-amd/tableEdit/editors/features/TableMover.js.map +1 -1
  97. package/lib-mjs/autoFormat/hyphen/transformHyphen.js +1 -1
  98. package/lib-mjs/autoFormat/hyphen/transformHyphen.js.map +1 -1
  99. package/lib-mjs/autoFormat/link/createLink.js +7 -2
  100. package/lib-mjs/autoFormat/link/createLink.js.map +1 -1
  101. package/lib-mjs/autoFormat/link/createLinkAfterSpace.js +1 -2
  102. package/lib-mjs/autoFormat/link/createLinkAfterSpace.js.map +1 -1
  103. package/lib-mjs/autoFormat/numbers/transformFraction.js +1 -1
  104. package/lib-mjs/autoFormat/numbers/transformFraction.js.map +1 -1
  105. package/lib-mjs/autoFormat/numbers/transformOrdinals.js +1 -1
  106. package/lib-mjs/autoFormat/numbers/transformOrdinals.js.map +1 -1
  107. package/lib-mjs/edit/EditPlugin.d.ts +15 -0
  108. package/lib-mjs/edit/EditPlugin.js +14 -2
  109. package/lib-mjs/edit/EditPlugin.js.map +1 -1
  110. package/lib-mjs/imageEdit/ImageEditPlugin.d.ts +11 -5
  111. package/lib-mjs/imageEdit/ImageEditPlugin.js +211 -105
  112. package/lib-mjs/imageEdit/ImageEditPlugin.js.map +1 -1
  113. package/lib-mjs/imageEdit/types/ImageAndParagraph.d.ts +8 -0
  114. package/lib-mjs/imageEdit/types/ImageAndParagraph.js +2 -0
  115. package/lib-mjs/imageEdit/types/ImageAndParagraph.js.map +1 -0
  116. package/lib-mjs/imageEdit/types/ImageEditOptions.d.ts +1 -1
  117. package/lib-mjs/imageEdit/types/ImageEditOptions.js.map +1 -1
  118. package/lib-mjs/imageEdit/utils/applyChange.js +5 -9
  119. package/lib-mjs/imageEdit/utils/applyChange.js.map +1 -1
  120. package/lib-mjs/imageEdit/utils/createImageWrapper.d.ts +1 -1
  121. package/lib-mjs/imageEdit/utils/createImageWrapper.js +10 -6
  122. package/lib-mjs/imageEdit/utils/createImageWrapper.js.map +1 -1
  123. package/lib-mjs/imageEdit/utils/findEditingImage.d.ts +6 -0
  124. package/lib-mjs/imageEdit/utils/findEditingImage.js +39 -0
  125. package/lib-mjs/imageEdit/utils/findEditingImage.js.map +1 -0
  126. package/lib-mjs/imageEdit/utils/getSelectedImage.d.ts +6 -0
  127. package/lib-mjs/imageEdit/utils/getSelectedImage.js +17 -0
  128. package/lib-mjs/imageEdit/utils/getSelectedImage.js.map +1 -0
  129. package/lib-mjs/imageEdit/utils/updateImageEditInfo.d.ts +1 -1
  130. package/lib-mjs/imageEdit/utils/updateImageEditInfo.js +11 -7
  131. package/lib-mjs/imageEdit/utils/updateImageEditInfo.js.map +1 -1
  132. package/lib-mjs/imageEdit/utils/updateWrapper.js +2 -2
  133. package/lib-mjs/imageEdit/utils/updateWrapper.js.map +1 -1
  134. package/lib-mjs/index.d.ts +1 -1
  135. package/lib-mjs/index.js.map +1 -1
  136. package/lib-mjs/markdown/utils/setFormat.js +1 -2
  137. package/lib-mjs/markdown/utils/setFormat.js.map +1 -1
  138. package/lib-mjs/picker/getQueryString.js +1 -1
  139. package/lib-mjs/picker/getQueryString.js.map +1 -1
  140. package/lib-mjs/tableEdit/editors/TableEditor.js +4 -2
  141. package/lib-mjs/tableEdit/editors/TableEditor.js.map +1 -1
  142. package/lib-mjs/tableEdit/editors/features/TableMover.d.ts +2 -2
  143. package/lib-mjs/tableEdit/editors/features/TableMover.js +4 -4
  144. package/lib-mjs/tableEdit/editors/features/TableMover.js.map +1 -1
  145. package/package.json +5 -5
  146. package/lib/imageEdit/utils/getSelectedContentModelImage.d.ts +0 -5
  147. package/lib/imageEdit/utils/getSelectedContentModelImage.js +0 -16
  148. package/lib/imageEdit/utils/getSelectedContentModelImage.js.map +0 -1
  149. package/lib/pluginUtils/splitTextSegment.d.ts +0 -5
  150. package/lib/pluginUtils/splitTextSegment.js +0 -26
  151. package/lib/pluginUtils/splitTextSegment.js.map +0 -1
  152. package/lib-amd/imageEdit/utils/getSelectedContentModelImage.d.ts +0 -5
  153. package/lib-amd/imageEdit/utils/getSelectedContentModelImage.js +0 -17
  154. package/lib-amd/imageEdit/utils/getSelectedContentModelImage.js.map +0 -1
  155. package/lib-amd/pluginUtils/splitTextSegment.d.ts +0 -5
  156. package/lib-amd/pluginUtils/splitTextSegment.js +0 -26
  157. package/lib-amd/pluginUtils/splitTextSegment.js.map +0 -1
  158. package/lib-mjs/imageEdit/utils/getSelectedContentModelImage.d.ts +0 -5
  159. package/lib-mjs/imageEdit/utils/getSelectedContentModelImage.js +0 -12
  160. package/lib-mjs/imageEdit/utils/getSelectedContentModelImage.js.map +0 -1
  161. package/lib-mjs/pluginUtils/splitTextSegment.d.ts +0 -5
  162. package/lib-mjs/pluginUtils/splitTextSegment.js +0 -22
  163. package/lib-mjs/pluginUtils/splitTextSegment.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  import { checkEditInfoState } from './checkEditInfoState';
2
2
  import { generateDataURL } from './generateDataURL';
3
3
  import { getGeneratedImageSize } from './generateImageSize';
4
- import { getSelectedImageMetadata, updateImageEditInfo } from './updateImageEditInfo';
4
+ import { updateImageEditInfo } from './updateImageEditInfo';
5
5
  /**
6
6
  * @internal
7
7
  * Apply changes from the edit info of an image, write result to the image
@@ -15,7 +15,8 @@ import { getSelectedImageMetadata, updateImageEditInfo } from './updateImageEdit
15
15
  export function applyChange(editor, image, contentModelImage, editInfo, previousSrc, wasResizedOrCropped, editingImage) {
16
16
  var _a;
17
17
  var newSrc = '';
18
- var initEditInfo = (_a = getSelectedImageMetadata(editor, editingImage !== null && editingImage !== void 0 ? editingImage : image)) !== null && _a !== void 0 ? _a : undefined;
18
+ var imageEditing = editingImage !== null && editingImage !== void 0 ? editingImage : image;
19
+ var initEditInfo = (_a = updateImageEditInfo(contentModelImage, imageEditing)) !== null && _a !== void 0 ? _a : undefined;
19
20
  var state = checkEditInfoState(editInfo, initEditInfo);
20
21
  switch (state) {
21
22
  case 'ResizeOnly':
@@ -47,12 +48,12 @@ export function applyChange(editor, image, contentModelImage, editInfo, previous
47
48
  if (newSrc == editInfo.src) {
48
49
  // If newSrc is the same with original one, it means there is only size change, but no rotation, no cropping,
49
50
  // so we don't need to keep edit info, we can delete it
50
- updateImageEditInfo(contentModelImage, null);
51
+ updateImageEditInfo(contentModelImage, imageEditing, null);
51
52
  }
52
53
  else {
53
54
  // Otherwise, save the new edit info to the image so that next time when we edit the same image, we know
54
55
  // the edit info
55
- updateImageEditInfo(contentModelImage, editInfo);
56
+ updateImageEditInfo(contentModelImage, imageEditing, editInfo);
56
57
  }
57
58
  // Write back the change to image, and set its new size
58
59
  var generatedImageSize = getGeneratedImageSize(editInfo);
@@ -63,11 +64,6 @@ export function applyChange(editor, image, contentModelImage, editInfo, previous
63
64
  if (wasResizedOrCropped || state == 'FullyChanged') {
64
65
  contentModelImage.format.width = generatedImageSize.targetWidth + 'px';
65
66
  contentModelImage.format.height = generatedImageSize.targetHeight + 'px';
66
- // Remove width/height style so that it won't affect the image size, since style width/height has higher priority
67
- image.style.removeProperty('width');
68
- image.style.removeProperty('height');
69
- image.style.removeProperty('max-width');
70
- image.style.removeProperty('max-height');
71
67
  }
72
68
  }
73
69
  //# sourceMappingURL=applyChange.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"applyChange.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/imageEdit/utils/applyChange.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAOtF;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CACvB,MAAe,EACf,KAAuB,EACvB,iBAAoC,EACpC,QAA6B,EAC7B,WAAmB,EACnB,mBAA4B,EAC5B,YAA+B;;IAE/B,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAM,YAAY,GAAG,MAAA,wBAAwB,CAAC,MAAM,EAAE,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,KAAK,CAAC,mCAAI,SAAS,CAAC;IAC1F,IAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAEzD,QAAQ,KAAK,EAAE;QACX,KAAK,YAAY;YACb,qFAAqF;YACrF,MAAM,GAAG,QAAQ,CAAC,GAAG,IAAI,EAAE,CAAC;YAC5B,MAAM;QACV,KAAK,cAAc;YACf,+FAA+F;YAC/F,4DAA4D;YAC5D,MAAM,GAAG,WAAW,CAAC;YACrB,MAAM;QACV,KAAK,cAAc;YACf,8FAA8F;YAC9F,MAAM,GAAG,eAAe,CAAC,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC1D,MAAM;KACb;IAED,IAAM,UAAU,GAAG,MAAM,IAAI,WAAW,CAAC;IAEzC,IAAI,UAAU,EAAE;QACZ,yGAAyG;QACzG,sFAAsF;QACtF,IAAM,OAAK,GAAG,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE;YAC3C,KAAK,EAAE,KAAK;YACZ,WAAW,EAAE,QAAQ,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG;YACtC,WAAW,aAAA;YACX,MAAM,QAAA;SACT,CAAC,CAAC;QACH,MAAM,GAAG,OAAK,CAAC,MAAM,CAAC;KACzB;IAED,IAAI,MAAM,IAAI,QAAQ,CAAC,GAAG,EAAE;QACxB,6GAA6G;QAC7G,uDAAuD;QACvD,mBAAmB,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;KAChD;SAAM;QACH,wGAAwG;QACxG,gBAAgB;QAChB,mBAAmB,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;KACpD;IAED,uDAAuD;IACvD,IAAM,kBAAkB,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAC3D,IAAI,CAAC,kBAAkB,EAAE;QACrB,OAAO;KACV;IAED,iBAAiB,CAAC,GAAG,GAAG,MAAM,CAAC;IAE/B,IAAI,mBAAmB,IAAI,KAAK,IAAI,cAAc,EAAE;QAChD,iBAAiB,CAAC,MAAM,CAAC,KAAK,GAAG,kBAAkB,CAAC,WAAW,GAAG,IAAI,CAAC;QACvE,iBAAiB,CAAC,MAAM,CAAC,MAAM,GAAG,kBAAkB,CAAC,YAAY,GAAG,IAAI,CAAC;QAEzE,iHAAiH;QACjH,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACpC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACrC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QACxC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;KAC5C;AACL,CAAC","sourcesContent":["import { checkEditInfoState } from './checkEditInfoState';\nimport { generateDataURL } from './generateDataURL';\nimport { getGeneratedImageSize } from './generateImageSize';\nimport { getSelectedImageMetadata, updateImageEditInfo } from './updateImageEditInfo';\nimport type {\n ContentModelImage,\n IEditor,\n ImageMetadataFormat,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Apply changes from the edit info of an image, write result to the image\n * @param editor The editor object that contains the image\n * @param image The image to apply the change\n * @param editInfo Edit info that contains the changed information of the image\n * @param previousSrc Last src value of the image before the change was made\n * @param wasResizedOrCropped if the image was resized or cropped apply the new image dimensions\n * @param editingImage (optional) Image in editing state\n */\nexport function applyChange(\n editor: IEditor,\n image: HTMLImageElement,\n contentModelImage: ContentModelImage,\n editInfo: ImageMetadataFormat,\n previousSrc: string,\n wasResizedOrCropped: boolean,\n editingImage?: HTMLImageElement\n) {\n let newSrc = '';\n const initEditInfo = getSelectedImageMetadata(editor, editingImage ?? image) ?? undefined;\n const state = checkEditInfoState(editInfo, initEditInfo);\n\n switch (state) {\n case 'ResizeOnly':\n // For resize only case, no need to generate a new image, just reuse the original one\n newSrc = editInfo.src || '';\n break;\n case 'SameWithLast':\n // For SameWithLast case, image may be resized but the content is still the same with last one,\n // so no need to create a new image, but just reuse last one\n newSrc = previousSrc;\n break;\n case 'FullyChanged':\n // For other cases (cropped, rotated, ...) we need to create a new image to reflect the change\n newSrc = generateDataURL(editingImage ?? image, editInfo);\n break;\n }\n\n const srcChanged = newSrc != previousSrc;\n\n if (srcChanged) {\n // If the src is changed, fire an EditImage event so that plugins knows that a new image is used, and can\n // replace the new src with some other string and it will be used and set to the image\n const event = editor.triggerEvent('editImage', {\n image: image,\n originalSrc: editInfo.src || image.src,\n previousSrc,\n newSrc,\n });\n newSrc = event.newSrc;\n }\n\n if (newSrc == editInfo.src) {\n // If newSrc is the same with original one, it means there is only size change, but no rotation, no cropping,\n // so we don't need to keep edit info, we can delete it\n updateImageEditInfo(contentModelImage, null);\n } else {\n // Otherwise, save the new edit info to the image so that next time when we edit the same image, we know\n // the edit info\n updateImageEditInfo(contentModelImage, editInfo);\n }\n\n // Write back the change to image, and set its new size\n const generatedImageSize = getGeneratedImageSize(editInfo);\n if (!generatedImageSize) {\n return;\n }\n\n contentModelImage.src = newSrc;\n\n if (wasResizedOrCropped || state == 'FullyChanged') {\n contentModelImage.format.width = generatedImageSize.targetWidth + 'px';\n contentModelImage.format.height = generatedImageSize.targetHeight + 'px';\n\n // Remove width/height style so that it won't affect the image size, since style width/height has higher priority\n image.style.removeProperty('width');\n image.style.removeProperty('height');\n image.style.removeProperty('max-width');\n image.style.removeProperty('max-height');\n }\n}\n"]}
1
+ {"version":3,"file":"applyChange.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/imageEdit/utils/applyChange.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAO5D;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CACvB,MAAe,EACf,KAAuB,EACvB,iBAAoC,EACpC,QAA6B,EAC7B,WAAmB,EACnB,mBAA4B,EAC5B,YAA+B;;IAE/B,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAM,YAAY,GAAG,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,KAAK,CAAC;IAC3C,IAAM,YAAY,GAAG,MAAA,mBAAmB,CAAC,iBAAiB,EAAE,YAAY,CAAC,mCAAI,SAAS,CAAC;IACvF,IAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAEzD,QAAQ,KAAK,EAAE;QACX,KAAK,YAAY;YACb,qFAAqF;YACrF,MAAM,GAAG,QAAQ,CAAC,GAAG,IAAI,EAAE,CAAC;YAC5B,MAAM;QACV,KAAK,cAAc;YACf,+FAA+F;YAC/F,4DAA4D;YAC5D,MAAM,GAAG,WAAW,CAAC;YACrB,MAAM;QACV,KAAK,cAAc;YACf,8FAA8F;YAC9F,MAAM,GAAG,eAAe,CAAC,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC1D,MAAM;KACb;IAED,IAAM,UAAU,GAAG,MAAM,IAAI,WAAW,CAAC;IAEzC,IAAI,UAAU,EAAE;QACZ,yGAAyG;QACzG,sFAAsF;QACtF,IAAM,OAAK,GAAG,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE;YAC3C,KAAK,EAAE,KAAK;YACZ,WAAW,EAAE,QAAQ,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG;YACtC,WAAW,aAAA;YACX,MAAM,QAAA;SACT,CAAC,CAAC;QACH,MAAM,GAAG,OAAK,CAAC,MAAM,CAAC;KACzB;IAED,IAAI,MAAM,IAAI,QAAQ,CAAC,GAAG,EAAE;QACxB,6GAA6G;QAC7G,uDAAuD;QACvD,mBAAmB,CAAC,iBAAiB,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;KAC9D;SAAM;QACH,wGAAwG;QACxG,gBAAgB;QAChB,mBAAmB,CAAC,iBAAiB,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;KAClE;IAED,uDAAuD;IACvD,IAAM,kBAAkB,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAC3D,IAAI,CAAC,kBAAkB,EAAE;QACrB,OAAO;KACV;IAED,iBAAiB,CAAC,GAAG,GAAG,MAAM,CAAC;IAE/B,IAAI,mBAAmB,IAAI,KAAK,IAAI,cAAc,EAAE;QAChD,iBAAiB,CAAC,MAAM,CAAC,KAAK,GAAG,kBAAkB,CAAC,WAAW,GAAG,IAAI,CAAC;QACvE,iBAAiB,CAAC,MAAM,CAAC,MAAM,GAAG,kBAAkB,CAAC,YAAY,GAAG,IAAI,CAAC;KAC5E;AACL,CAAC","sourcesContent":["import { checkEditInfoState } from './checkEditInfoState';\nimport { generateDataURL } from './generateDataURL';\nimport { getGeneratedImageSize } from './generateImageSize';\nimport { updateImageEditInfo } from './updateImageEditInfo';\nimport type {\n ContentModelImage,\n IEditor,\n ImageMetadataFormat,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Apply changes from the edit info of an image, write result to the image\n * @param editor The editor object that contains the image\n * @param image The image to apply the change\n * @param editInfo Edit info that contains the changed information of the image\n * @param previousSrc Last src value of the image before the change was made\n * @param wasResizedOrCropped if the image was resized or cropped apply the new image dimensions\n * @param editingImage (optional) Image in editing state\n */\nexport function applyChange(\n editor: IEditor,\n image: HTMLImageElement,\n contentModelImage: ContentModelImage,\n editInfo: ImageMetadataFormat,\n previousSrc: string,\n wasResizedOrCropped: boolean,\n editingImage?: HTMLImageElement\n) {\n let newSrc = '';\n const imageEditing = editingImage ?? image;\n const initEditInfo = updateImageEditInfo(contentModelImage, imageEditing) ?? undefined;\n const state = checkEditInfoState(editInfo, initEditInfo);\n\n switch (state) {\n case 'ResizeOnly':\n // For resize only case, no need to generate a new image, just reuse the original one\n newSrc = editInfo.src || '';\n break;\n case 'SameWithLast':\n // For SameWithLast case, image may be resized but the content is still the same with last one,\n // so no need to create a new image, but just reuse last one\n newSrc = previousSrc;\n break;\n case 'FullyChanged':\n // For other cases (cropped, rotated, ...) we need to create a new image to reflect the change\n newSrc = generateDataURL(editingImage ?? image, editInfo);\n break;\n }\n\n const srcChanged = newSrc != previousSrc;\n\n if (srcChanged) {\n // If the src is changed, fire an EditImage event so that plugins knows that a new image is used, and can\n // replace the new src with some other string and it will be used and set to the image\n const event = editor.triggerEvent('editImage', {\n image: image,\n originalSrc: editInfo.src || image.src,\n previousSrc,\n newSrc,\n });\n newSrc = event.newSrc;\n }\n\n if (newSrc == editInfo.src) {\n // If newSrc is the same with original one, it means there is only size change, but no rotation, no cropping,\n // so we don't need to keep edit info, we can delete it\n updateImageEditInfo(contentModelImage, imageEditing, null);\n } else {\n // Otherwise, save the new edit info to the image so that next time when we edit the same image, we know\n // the edit info\n updateImageEditInfo(contentModelImage, imageEditing, editInfo);\n }\n\n // Write back the change to image, and set its new size\n const generatedImageSize = getGeneratedImageSize(editInfo);\n if (!generatedImageSize) {\n return;\n }\n\n contentModelImage.src = newSrc;\n\n if (wasResizedOrCropped || state == 'FullyChanged') {\n contentModelImage.format.width = generatedImageSize.targetWidth + 'px';\n contentModelImage.format.height = generatedImageSize.targetHeight + 'px';\n }\n}\n"]}
@@ -15,4 +15,4 @@ export interface WrapperElements {
15
15
  /**
16
16
  * @internal
17
17
  */
18
- export declare function createImageWrapper(editor: IEditor, image: HTMLImageElement, imageSpan: HTMLSpanElement, options: ImageEditOptions, editInfo: ImageMetadataFormat, htmlOptions: ImageHtmlOptions, operation?: ImageEditOperation): WrapperElements;
18
+ export declare function createImageWrapper(editor: IEditor, image: HTMLImageElement, options: ImageEditOptions, editInfo: ImageMetadataFormat, htmlOptions: ImageHtmlOptions, operation: ImageEditOperation[]): WrapperElements;
@@ -1,25 +1,27 @@
1
1
  import { createImageCropper } from '../Cropper/createImageCropper';
2
2
  import { createImageResizer } from '../Resizer/createImageResizer';
3
3
  import { createImageRotator } from '../Rotator/createImageRotator';
4
+ import { wrap } from 'roosterjs-content-model-dom';
4
5
  /**
5
6
  * @internal
6
7
  */
7
- export function createImageWrapper(editor, image, imageSpan, options, editInfo, htmlOptions, operation) {
8
+ export function createImageWrapper(editor, image, options, editInfo, htmlOptions, operation) {
8
9
  var imageClone = cloneImage(image, editInfo);
9
10
  var doc = editor.getDocument();
10
11
  var rotators = [];
11
- if (!options.disableRotate && operation === 'rotate') {
12
+ if (!options.disableRotate && operation.indexOf('rotate') > -1) {
12
13
  rotators = createImageRotator(doc, htmlOptions);
13
14
  }
14
15
  var resizers = [];
15
- if (operation === 'resize') {
16
+ if (operation.indexOf('resize') > -1) {
16
17
  resizers = createImageResizer(doc);
17
18
  }
18
19
  var croppers = [];
19
- if (operation === 'crop') {
20
+ if (operation.indexOf('crop') > -1) {
20
21
  croppers = createImageCropper(doc);
21
22
  }
22
23
  var wrapper = createWrapper(editor, imageClone, options, editInfo, resizers, rotators, croppers);
24
+ var imageSpan = wrap(doc, image, 'span');
23
25
  var shadowSpan = createShadowSpan(wrapper, imageSpan);
24
26
  return { wrapper: wrapper, shadowSpan: shadowSpan, imageClone: imageClone, resizers: resizers, rotators: rotators, croppers: croppers };
25
27
  }
@@ -38,8 +40,10 @@ var createWrapper = function (editor, image, options, editInfo, resizers, rotato
38
40
  var imageBox = doc.createElement('div');
39
41
  imageBox.setAttribute("style", "position:relative;width:100%;height:100%;overflow:hidden;transform:scale(1);");
40
42
  imageBox.appendChild(image);
41
- wrapper.setAttribute('style', "max-width: 100%; position: relative; display: inline-flex; font-size: 24px; margin: 0px; transform: rotate(" + ((_a = editInfo.angleRad) !== null && _a !== void 0 ? _a : 0) + "rad); text-align: left;");
42
- wrapper.style.display = editor.getEnvironment().isSafari ? 'inline-block' : 'inline-flex';
43
+ wrapper.setAttribute('style', "font-size: 24px; margin: 0px; transform: rotate(" + ((_a = editInfo.angleRad) !== null && _a !== void 0 ? _a : 0) + "rad);");
44
+ wrapper.style.display = editor.getEnvironment().isSafari
45
+ ? '-webkit-inline-flex'
46
+ : 'inline-flex';
43
47
  var border = createBorder(editor, options.borderColor);
44
48
  wrapper.appendChild(imageBox);
45
49
  wrapper.appendChild(border);
@@ -1 +1 @@
1
- {"version":3,"file":"createImageWrapper.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/imageEdit/utils/createImageWrapper.ts"],"names":[],"mappings":"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","sourcesContent":["import { createImageCropper } from '../Cropper/createImageCropper';\nimport { createImageResizer } from '../Resizer/createImageResizer';\nimport { createImageRotator } from '../Rotator/createImageRotator';\n\nimport type {\n IEditor,\n ImageEditOperation,\n ImageMetadataFormat,\n} from 'roosterjs-content-model-types';\nimport type { ImageEditOptions } from '../types/ImageEditOptions';\nimport type { ImageHtmlOptions } from '../types/ImageHtmlOptions';\n\n/**\n * @internal\n */\nexport interface WrapperElements {\n wrapper: HTMLSpanElement;\n shadowSpan: HTMLElement;\n imageClone: HTMLImageElement;\n resizers: HTMLDivElement[];\n rotators: HTMLDivElement[];\n croppers: HTMLDivElement[];\n}\n\n/**\n * @internal\n */\nexport function createImageWrapper(\n editor: IEditor,\n image: HTMLImageElement,\n imageSpan: HTMLSpanElement,\n options: ImageEditOptions,\n editInfo: ImageMetadataFormat,\n htmlOptions: ImageHtmlOptions,\n operation?: ImageEditOperation\n): WrapperElements {\n const imageClone = cloneImage(image, editInfo);\n const doc = editor.getDocument();\n\n let rotators: HTMLDivElement[] = [];\n if (!options.disableRotate && operation === 'rotate') {\n rotators = createImageRotator(doc, htmlOptions);\n }\n let resizers: HTMLDivElement[] = [];\n if (operation === 'resize') {\n resizers = createImageResizer(doc);\n }\n\n let croppers: HTMLDivElement[] = [];\n if (operation === 'crop') {\n croppers = createImageCropper(doc);\n }\n\n const wrapper = createWrapper(\n editor,\n imageClone,\n options,\n editInfo,\n resizers,\n rotators,\n croppers\n );\n const shadowSpan = createShadowSpan(wrapper, imageSpan);\n return { wrapper, shadowSpan, imageClone, resizers, rotators, croppers };\n}\n\nconst createShadowSpan = (wrapper: HTMLElement, imageSpan: HTMLSpanElement) => {\n const shadowRoot = imageSpan.attachShadow({\n mode: 'open',\n });\n imageSpan.style.verticalAlign = 'bottom';\n shadowRoot.appendChild(wrapper);\n return imageSpan;\n};\n\nconst createWrapper = (\n editor: IEditor,\n image: HTMLImageElement,\n options: ImageEditOptions,\n editInfo: ImageMetadataFormat,\n resizers?: HTMLDivElement[],\n rotators?: HTMLDivElement[],\n cropper?: HTMLDivElement[]\n) => {\n const doc = editor.getDocument();\n const wrapper = doc.createElement('span');\n const imageBox = doc.createElement('div');\n\n imageBox.setAttribute(\n `style`,\n `position:relative;width:100%;height:100%;overflow:hidden;transform:scale(1);`\n );\n imageBox.appendChild(image);\n wrapper.setAttribute(\n 'style',\n `max-width: 100%; position: relative; display: inline-flex; font-size: 24px; margin: 0px; transform: rotate(${\n editInfo.angleRad ?? 0\n }rad); text-align: left;`\n );\n wrapper.style.display = editor.getEnvironment().isSafari ? 'inline-block' : 'inline-flex';\n\n const border = createBorder(editor, options.borderColor);\n wrapper.appendChild(imageBox);\n wrapper.appendChild(border);\n wrapper.style.userSelect = 'none';\n\n if (resizers && resizers?.length > 0) {\n resizers.forEach(resizer => {\n wrapper.appendChild(resizer);\n });\n }\n if (rotators && rotators.length > 0) {\n rotators.forEach(r => {\n wrapper.appendChild(r);\n });\n }\n if (cropper && cropper.length > 0) {\n cropper.forEach(c => {\n wrapper.appendChild(c);\n });\n }\n\n return wrapper;\n};\n\nconst createBorder = (editor: IEditor, borderColor?: string) => {\n const doc = editor.getDocument();\n const resizeBorder = doc.createElement('div');\n resizeBorder.setAttribute(\n `style`,\n `position:absolute;left:0;right:0;top:0;bottom:0;border:solid 2px ${borderColor};pointer-events:none;`\n );\n return resizeBorder;\n};\n\nconst cloneImage = (image: HTMLImageElement, editInfo: ImageMetadataFormat) => {\n const imageClone = image.cloneNode(true) as HTMLImageElement;\n imageClone.style.removeProperty('transform');\n if (editInfo.src) {\n imageClone.src = editInfo.src;\n imageClone.removeAttribute('id');\n imageClone.style.removeProperty('max-width');\n imageClone.style.removeProperty('max-height');\n imageClone.style.width = editInfo.widthPx + 'px';\n imageClone.style.height = editInfo.heightPx + 'px';\n }\n return imageClone;\n};\n"]}
1
+ {"version":3,"file":"createImageWrapper.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/imageEdit/utils/createImageWrapper.ts"],"names":[],"mappings":"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","sourcesContent":["import { createImageCropper } from '../Cropper/createImageCropper';\nimport { createImageResizer } from '../Resizer/createImageResizer';\nimport { createImageRotator } from '../Rotator/createImageRotator';\nimport { wrap } from 'roosterjs-content-model-dom';\n\nimport type {\n IEditor,\n ImageEditOperation,\n ImageMetadataFormat,\n} from 'roosterjs-content-model-types';\nimport type { ImageEditOptions } from '../types/ImageEditOptions';\nimport type { ImageHtmlOptions } from '../types/ImageHtmlOptions';\n\n/**\n * @internal\n */\nexport interface WrapperElements {\n wrapper: HTMLSpanElement;\n shadowSpan: HTMLElement;\n imageClone: HTMLImageElement;\n resizers: HTMLDivElement[];\n rotators: HTMLDivElement[];\n croppers: HTMLDivElement[];\n}\n\n/**\n * @internal\n */\nexport function createImageWrapper(\n editor: IEditor,\n image: HTMLImageElement,\n options: ImageEditOptions,\n editInfo: ImageMetadataFormat,\n htmlOptions: ImageHtmlOptions,\n operation: ImageEditOperation[]\n): WrapperElements {\n const imageClone = cloneImage(image, editInfo);\n const doc = editor.getDocument();\n\n let rotators: HTMLDivElement[] = [];\n if (!options.disableRotate && operation.indexOf('rotate') > -1) {\n rotators = createImageRotator(doc, htmlOptions);\n }\n let resizers: HTMLDivElement[] = [];\n if (operation.indexOf('resize') > -1) {\n resizers = createImageResizer(doc);\n }\n\n let croppers: HTMLDivElement[] = [];\n if (operation.indexOf('crop') > -1) {\n croppers = createImageCropper(doc);\n }\n\n const wrapper = createWrapper(\n editor,\n imageClone,\n options,\n editInfo,\n resizers,\n rotators,\n croppers\n );\n const imageSpan = wrap(doc, image, 'span');\n const shadowSpan = createShadowSpan(wrapper, imageSpan);\n return { wrapper, shadowSpan, imageClone, resizers, rotators, croppers };\n}\n\nconst createShadowSpan = (wrapper: HTMLElement, imageSpan: HTMLSpanElement) => {\n const shadowRoot = imageSpan.attachShadow({\n mode: 'open',\n });\n imageSpan.style.verticalAlign = 'bottom';\n shadowRoot.appendChild(wrapper);\n return imageSpan;\n};\n\nconst createWrapper = (\n editor: IEditor,\n image: HTMLImageElement,\n options: ImageEditOptions,\n editInfo: ImageMetadataFormat,\n resizers?: HTMLDivElement[],\n rotators?: HTMLDivElement[],\n cropper?: HTMLDivElement[]\n) => {\n const doc = editor.getDocument();\n const wrapper = doc.createElement('span');\n const imageBox = doc.createElement('div');\n\n imageBox.setAttribute(\n `style`,\n `position:relative;width:100%;height:100%;overflow:hidden;transform:scale(1);`\n );\n imageBox.appendChild(image);\n wrapper.setAttribute(\n 'style',\n `font-size: 24px; margin: 0px; transform: rotate(${editInfo.angleRad ?? 0}rad);`\n );\n wrapper.style.display = editor.getEnvironment().isSafari\n ? '-webkit-inline-flex'\n : 'inline-flex';\n\n const border = createBorder(editor, options.borderColor);\n wrapper.appendChild(imageBox);\n wrapper.appendChild(border);\n wrapper.style.userSelect = 'none';\n\n if (resizers && resizers?.length > 0) {\n resizers.forEach(resizer => {\n wrapper.appendChild(resizer);\n });\n }\n if (rotators && rotators.length > 0) {\n rotators.forEach(r => {\n wrapper.appendChild(r);\n });\n }\n if (cropper && cropper.length > 0) {\n cropper.forEach(c => {\n wrapper.appendChild(c);\n });\n }\n\n return wrapper;\n};\n\nconst createBorder = (editor: IEditor, borderColor?: string) => {\n const doc = editor.getDocument();\n const resizeBorder = doc.createElement('div');\n resizeBorder.setAttribute(\n `style`,\n `position:absolute;left:0;right:0;top:0;bottom:0;border:solid 2px ${borderColor};pointer-events:none;`\n );\n return resizeBorder;\n};\n\nconst cloneImage = (image: HTMLImageElement, editInfo: ImageMetadataFormat) => {\n const imageClone = image.cloneNode(true) as HTMLImageElement;\n imageClone.style.removeProperty('transform');\n if (editInfo.src) {\n imageClone.src = editInfo.src;\n imageClone.removeAttribute('id');\n imageClone.style.removeProperty('max-width');\n imageClone.style.removeProperty('max-height');\n imageClone.style.width = editInfo.widthPx + 'px';\n imageClone.style.height = editInfo.heightPx + 'px';\n }\n return imageClone;\n};\n"]}
@@ -0,0 +1,6 @@
1
+ import type { ReadonlyContentModelBlockGroup } from 'roosterjs-content-model-types';
2
+ import type { ImageAndParagraph } from '../types/ImageAndParagraph';
3
+ /**
4
+ * @internal
5
+ */
6
+ export declare function findEditingImage(group: ReadonlyContentModelBlockGroup): ImageAndParagraph | null;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @internal
3
+ */
4
+ export function findEditingImage(group) {
5
+ for (var i = 0; i < group.blocks.length; i++) {
6
+ var block = group.blocks[i];
7
+ switch (block.blockType) {
8
+ case 'BlockGroup':
9
+ var result = findEditingImage(block);
10
+ if (result) {
11
+ return result;
12
+ }
13
+ break;
14
+ case 'Paragraph':
15
+ for (var j = 0; j < block.segments.length; j++) {
16
+ var segment = block.segments[j];
17
+ switch (segment.segmentType) {
18
+ case 'Image':
19
+ if (segment.dataset.isEditing) {
20
+ return {
21
+ paragraph: block,
22
+ image: segment,
23
+ };
24
+ }
25
+ break;
26
+ case 'General':
27
+ var result_1 = findEditingImage(segment);
28
+ if (result_1) {
29
+ return result_1;
30
+ }
31
+ break;
32
+ }
33
+ }
34
+ break;
35
+ }
36
+ }
37
+ return null;
38
+ }
39
+ //# sourceMappingURL=findEditingImage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findEditingImage.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/imageEdit/utils/findEditingImage.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAqC;IAClE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC1C,IAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAE9B,QAAQ,KAAK,CAAC,SAAS,EAAE;YACrB,KAAK,YAAY;gBACb,IAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBAEvC,IAAI,MAAM,EAAE;oBACR,OAAO,MAAM,CAAC;iBACjB;gBACD,MAAM;YAEV,KAAK,WAAW;gBACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBAC5C,IAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAClC,QAAQ,OAAO,CAAC,WAAW,EAAE;wBACzB,KAAK,OAAO;4BACR,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE;gCAC3B,OAAO;oCACH,SAAS,EAAE,KAAK;oCAChB,KAAK,EAAE,OAAO;iCACjB,CAAC;6BACL;4BACD,MAAM;wBAEV,KAAK,SAAS;4BACV,IAAM,QAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;4BAEzC,IAAI,QAAM,EAAE;gCACR,OAAO,QAAM,CAAC;6BACjB;4BACD,MAAM;qBACb;iBACJ;gBAED,MAAM;SACb;KACJ;IAED,OAAO,IAAI,CAAC;AAChB,CAAC","sourcesContent":["import type { ReadonlyContentModelBlockGroup } from 'roosterjs-content-model-types';\nimport type { ImageAndParagraph } from '../types/ImageAndParagraph';\n\n/**\n * @internal\n */\nexport function findEditingImage(group: ReadonlyContentModelBlockGroup): ImageAndParagraph | null {\n for (let i = 0; i < group.blocks.length; i++) {\n const block = group.blocks[i];\n\n switch (block.blockType) {\n case 'BlockGroup':\n const result = findEditingImage(block);\n\n if (result) {\n return result;\n }\n break;\n\n case 'Paragraph':\n for (let j = 0; j < block.segments.length; j++) {\n const segment = block.segments[j];\n switch (segment.segmentType) {\n case 'Image':\n if (segment.dataset.isEditing) {\n return {\n paragraph: block,\n image: segment,\n };\n }\n break;\n\n case 'General':\n const result = findEditingImage(segment);\n\n if (result) {\n return result;\n }\n break;\n }\n }\n\n break;\n }\n }\n\n return null;\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import type { ReadonlyContentModelDocument } from 'roosterjs-content-model-types';
2
+ import type { ImageAndParagraph } from '../types/ImageAndParagraph';
3
+ /**
4
+ * @internal
5
+ */
6
+ export declare function getSelectedImage(model: ReadonlyContentModelDocument): ImageAndParagraph | null;
@@ -0,0 +1,17 @@
1
+ import { getSelectedSegmentsAndParagraphs } from 'roosterjs-content-model-dom';
2
+ /**
3
+ * @internal
4
+ */
5
+ export function getSelectedImage(model) {
6
+ var selections = getSelectedSegmentsAndParagraphs(model, false);
7
+ if (selections.length == 1 && selections[0][0].segmentType == 'Image' && selections[0][1]) {
8
+ return {
9
+ image: selections[0][0],
10
+ paragraph: selections[0][1],
11
+ };
12
+ }
13
+ else {
14
+ return null;
15
+ }
16
+ }
17
+ //# sourceMappingURL=getSelectedImage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getSelectedImage.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/imageEdit/utils/getSelectedImage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,6BAA6B,CAAC;AAI/E;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAmC;IAChE,IAAM,UAAU,GAAG,gCAAgC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAElE,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;QACvF,OAAO;YACH,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC9B,CAAC;KACL;SAAM;QACH,OAAO,IAAI,CAAC;KACf;AACL,CAAC","sourcesContent":["import { getSelectedSegmentsAndParagraphs } from 'roosterjs-content-model-dom';\nimport type { ReadonlyContentModelDocument } from 'roosterjs-content-model-types';\nimport type { ImageAndParagraph } from '../types/ImageAndParagraph';\n\n/**\n * @internal\n */\nexport function getSelectedImage(model: ReadonlyContentModelDocument): ImageAndParagraph | null {\n const selections = getSelectedSegmentsAndParagraphs(model, false);\n\n if (selections.length == 1 && selections[0][0].segmentType == 'Image' && selections[0][1]) {\n return {\n image: selections[0][0],\n paragraph: selections[0][1],\n };\n } else {\n return null;\n }\n}\n"]}
@@ -2,7 +2,7 @@ import type { ContentModelImage, IEditor, ImageMetadataFormat } from 'roosterjs-
2
2
  /**
3
3
  * @internal
4
4
  */
5
- export declare function updateImageEditInfo(contentModelImage: ContentModelImage, newImageMetadata?: ImageMetadataFormat | null): void;
5
+ export declare function updateImageEditInfo(contentModelImage: ContentModelImage, image: HTMLImageElement, newImageMetadata?: ImageMetadataFormat | null | undefined): ImageMetadataFormat;
6
6
  /**
7
7
  * @internal
8
8
  * @returns
@@ -1,16 +1,17 @@
1
1
  import { __assign } from "tslib";
2
- import { getSelectedContentModelImage } from './getSelectedContentModelImage';
3
- import { updateImageMetadata } from 'roosterjs-content-model-dom';
2
+ import { getSelectedImage } from './getSelectedImage';
3
+ import { mutateSegment, updateImageMetadata } from 'roosterjs-content-model-dom';
4
4
  /**
5
5
  * @internal
6
6
  */
7
- export function updateImageEditInfo(contentModelImage, newImageMetadata) {
8
- updateImageMetadata(contentModelImage, newImageMetadata !== undefined
7
+ export function updateImageEditInfo(contentModelImage, image, newImageMetadata) {
8
+ var contentModelMetadata = updateImageMetadata(contentModelImage, newImageMetadata !== undefined
9
9
  ? function (format) {
10
10
  format = newImageMetadata;
11
11
  return format;
12
12
  }
13
13
  : undefined);
14
+ return __assign(__assign({}, getInitialEditInfo(image)), contentModelMetadata);
14
15
  }
15
16
  function getInitialEditInfo(image) {
16
17
  return {
@@ -33,9 +34,12 @@ function getInitialEditInfo(image) {
33
34
  export function getSelectedImageMetadata(editor, image) {
34
35
  var imageMetadata = getInitialEditInfo(image);
35
36
  editor.formatContentModel(function (model) {
36
- var selectedImage = getSelectedContentModelImage(model);
37
- if (selectedImage) {
38
- imageMetadata = __assign(__assign({}, imageMetadata), selectedImage.dataset);
37
+ var selectedImage = getSelectedImage(model);
38
+ if (selectedImage === null || selectedImage === void 0 ? void 0 : selectedImage.image) {
39
+ mutateSegment(selectedImage.paragraph, selectedImage === null || selectedImage === void 0 ? void 0 : selectedImage.image, function (modelImage) {
40
+ imageMetadata = updateImageEditInfo(modelImage, image);
41
+ });
42
+ return true;
39
43
  }
40
44
  return false;
41
45
  });
@@ -1 +1 @@
1
- {"version":3,"file":"updateImageEditInfo.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/imageEdit/utils/updateImageEditInfo.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAOlE;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAC/B,iBAAoC,EACpC,gBAA6C;IAE7C,mBAAmB,CACf,iBAAiB,EACjB,gBAAgB,KAAK,SAAS;QAC1B,CAAC,CAAC,UAAA,MAAM;YACF,MAAM,GAAG,gBAAgB,CAAC;YAC1B,OAAO,MAAM,CAAC;QAClB,CAAC;QACH,CAAC,CAAC,SAAS,CAClB,CAAC;AACN,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAuB;IAC/C,OAAO;QACH,GAAG,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE;QACpC,OAAO,EAAE,KAAK,CAAC,WAAW;QAC1B,QAAQ,EAAE,KAAK,CAAC,YAAY;QAC5B,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,CAAC;QACf,UAAU,EAAE,CAAC;QACb,aAAa,EAAE,CAAC;QAChB,QAAQ,EAAE,CAAC;KACd,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACpC,MAAe,EACf,KAAuB;IAEvB,IAAI,aAAa,GAAwB,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACnE,MAAM,CAAC,kBAAkB,CAAC,UAAA,KAAK;QAC3B,IAAM,aAAa,GAAG,4BAA4B,CAAC,KAAK,CAAC,CAAC;QAC1D,IAAI,aAAa,EAAE;YACf,aAAa,yBAAQ,aAAa,GAAK,aAAa,CAAC,OAAO,CAAE,CAAC;SAClE;QACD,OAAO,KAAK,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,OAAO,aAAa,CAAC;AACzB,CAAC","sourcesContent":["import { getSelectedContentModelImage } from './getSelectedContentModelImage';\nimport { updateImageMetadata } from 'roosterjs-content-model-dom';\nimport type {\n ContentModelImage,\n IEditor,\n ImageMetadataFormat,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function updateImageEditInfo(\n contentModelImage: ContentModelImage,\n newImageMetadata?: ImageMetadataFormat | null\n) {\n updateImageMetadata(\n contentModelImage,\n newImageMetadata !== undefined\n ? format => {\n format = newImageMetadata;\n return format;\n }\n : undefined\n );\n}\n\nfunction getInitialEditInfo(image: HTMLImageElement): ImageMetadataFormat {\n return {\n src: image.getAttribute('src') || '',\n widthPx: image.clientWidth,\n heightPx: image.clientHeight,\n naturalWidth: image.naturalWidth,\n naturalHeight: image.naturalHeight,\n leftPercent: 0,\n rightPercent: 0,\n topPercent: 0,\n bottomPercent: 0,\n angleRad: 0,\n };\n}\n\n/**\n * @internal\n * @returns\n */\nexport function getSelectedImageMetadata(\n editor: IEditor,\n image: HTMLImageElement\n): ImageMetadataFormat {\n let imageMetadata: ImageMetadataFormat = getInitialEditInfo(image);\n editor.formatContentModel(model => {\n const selectedImage = getSelectedContentModelImage(model);\n if (selectedImage) {\n imageMetadata = { ...imageMetadata, ...selectedImage.dataset };\n }\n return false;\n });\n\n return imageMetadata;\n}\n"]}
1
+ {"version":3,"file":"updateImageEditInfo.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/imageEdit/utils/updateImageEditInfo.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAQjF;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAC/B,iBAAoC,EACpC,KAAuB,EACvB,gBAAyD;IAEzD,IAAM,oBAAoB,GAAG,mBAAmB,CAC5C,iBAAiB,EACjB,gBAAgB,KAAK,SAAS;QAC1B,CAAC,CAAC,UAAA,MAAM;YACF,MAAM,GAAG,gBAAgB,CAAC;YAC1B,OAAO,MAAM,CAAC;QAClB,CAAC;QACH,CAAC,CAAC,SAAS,CAClB,CAAC;IACF,6BAAY,kBAAkB,CAAC,KAAK,CAAC,GAAK,oBAAoB,EAAG;AACrE,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAuB;IAC/C,OAAO;QACH,GAAG,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE;QACpC,OAAO,EAAE,KAAK,CAAC,WAAW;QAC1B,QAAQ,EAAE,KAAK,CAAC,YAAY;QAC5B,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,CAAC;QACf,UAAU,EAAE,CAAC;QACb,aAAa,EAAE,CAAC;QAChB,QAAQ,EAAE,CAAC;KACd,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACpC,MAAe,EACf,KAAuB;IAEvB,IAAI,aAAa,GAAwB,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACnE,MAAM,CAAC,kBAAkB,CAAC,UAAA,KAAK;QAC3B,IAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,KAAK,EAAE;YACtB,aAAa,CAAC,aAAa,CAAC,SAAS,EAAE,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,KAAK,EAAE,UAAA,UAAU;gBACnE,aAAa,GAAG,mBAAmB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC;SACf;QACD,OAAO,KAAK,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,OAAO,aAAa,CAAC;AACzB,CAAC","sourcesContent":["import { getSelectedImage } from './getSelectedImage';\nimport { mutateSegment, updateImageMetadata } from 'roosterjs-content-model-dom';\n\nimport type {\n ContentModelImage,\n IEditor,\n ImageMetadataFormat,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function updateImageEditInfo(\n contentModelImage: ContentModelImage,\n image: HTMLImageElement,\n newImageMetadata?: ImageMetadataFormat | null | undefined\n): ImageMetadataFormat {\n const contentModelMetadata = updateImageMetadata(\n contentModelImage,\n newImageMetadata !== undefined\n ? format => {\n format = newImageMetadata;\n return format;\n }\n : undefined\n );\n return { ...getInitialEditInfo(image), ...contentModelMetadata };\n}\n\nfunction getInitialEditInfo(image: HTMLImageElement): ImageMetadataFormat {\n return {\n src: image.getAttribute('src') || '',\n widthPx: image.clientWidth,\n heightPx: image.clientHeight,\n naturalWidth: image.naturalWidth,\n naturalHeight: image.naturalHeight,\n leftPercent: 0,\n rightPercent: 0,\n topPercent: 0,\n bottomPercent: 0,\n angleRad: 0,\n };\n}\n\n/**\n * @internal\n * @returns\n */\nexport function getSelectedImageMetadata(\n editor: IEditor,\n image: HTMLImageElement\n): ImageMetadataFormat {\n let imageMetadata: ImageMetadataFormat = getInitialEditInfo(image);\n editor.formatContentModel(model => {\n const selectedImage = getSelectedImage(model);\n if (selectedImage?.image) {\n mutateSegment(selectedImage.paragraph, selectedImage?.image, modelImage => {\n imageMetadata = updateImageEditInfo(modelImage, image);\n });\n\n return true;\n }\n return false;\n });\n\n return imageMetadata;\n}\n"]}
@@ -57,7 +57,7 @@ export function updateWrapper(editInfo, options, image, clonedImage, wrapper, re
57
57
  setSize(cropOverlays[1], undefined, 0, 0, cropBottomPx, cropRightPx, undefined);
58
58
  setSize(cropOverlays[2], cropLeftPx, undefined, 0, 0, undefined, cropBottomPx);
59
59
  setSize(cropOverlays[3], 0, cropTopPx, undefined, 0, cropLeftPx, undefined);
60
- if (angleRad) {
60
+ if (angleRad !== undefined) {
61
61
  updateHandleCursor(croppers, angleRad);
62
62
  }
63
63
  }
@@ -74,7 +74,7 @@ export function updateWrapper(editInfo, options, image, clonedImage, wrapper, re
74
74
  }
75
75
  })
76
76
  .filter(function (handle) { return !!handle; });
77
- if (angleRad) {
77
+ if (angleRad !== undefined) {
78
78
  updateHandleCursor(resizeHandles, angleRad);
79
79
  }
80
80
  updateSideHandlesVisibility(resizeHandles, smallImage);
@@ -1 +1 @@
1
- {"version":3,"file":"updateWrapper.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/imageEdit/utils/updateWrapper.ts"],"names":[],"mappings":"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","sourcesContent":["import { doubleCheckResize } from './doubleCheckResize';\nimport { getGeneratedImageSize } from './generateImageSize';\nimport { ImageEditElementClass } from '../types/ImageEditElementClass';\nimport { isElementOfType, isNodeOfType } from 'roosterjs-content-model-dom';\nimport { updateHandleCursor } from './updateHandleCursor';\nimport { updateSideHandlesVisibility } from '../Resizer/updateSideHandlesVisibility';\nimport type { ImageEditOptions } from '../types/ImageEditOptions';\nimport type { ImageMetadataFormat } from 'roosterjs-content-model-types';\nimport {\n getPx,\n isASmallImage,\n isRTL,\n setFlipped,\n setSize,\n setWrapperSizeDimensions,\n} from './imageEditUtils';\n\n/**\n * @internal\n */\nexport function updateWrapper(\n editInfo: ImageMetadataFormat,\n options: ImageEditOptions,\n image: HTMLImageElement,\n clonedImage: HTMLImageElement,\n wrapper: HTMLSpanElement,\n resizers?: HTMLDivElement[],\n croppers?: HTMLDivElement[]\n) {\n const {\n angleRad,\n bottomPercent,\n leftPercent,\n rightPercent,\n topPercent,\n flippedHorizontal,\n flippedVertical,\n } = editInfo;\n\n const generateImageSize = getGeneratedImageSize(editInfo, croppers && croppers?.length > 0);\n if (!generateImageSize) {\n return;\n }\n const {\n targetWidth,\n targetHeight,\n originalWidth,\n originalHeight,\n visibleWidth,\n visibleHeight,\n } = generateImageSize;\n\n const marginHorizontal = (targetWidth - visibleWidth) / 2;\n const marginVertical = (targetHeight - visibleHeight) / 2;\n const cropLeftPx = originalWidth * (leftPercent || 0);\n const cropRightPx = originalWidth * (rightPercent || 0);\n const cropTopPx = originalHeight * (topPercent || 0);\n const cropBottomPx = originalHeight * (bottomPercent || 0);\n\n // Update size and margin of the wrapper\n wrapper.style.margin = `${marginVertical}px ${marginHorizontal}px`;\n wrapper.style.transform = `rotate(${angleRad}rad)`;\n setWrapperSizeDimensions(wrapper, image, visibleWidth, visibleHeight);\n\n // Update the text-alignment to avoid the image to overflow if the parent element have align center or right\n // or if the direction is Right To Left\n if (isRTL(clonedImage)) {\n wrapper.style.textAlign = 'right';\n if (!croppers) {\n clonedImage.style.left = getPx(cropLeftPx);\n clonedImage.style.right = getPx(-cropRightPx);\n }\n } else {\n wrapper.style.textAlign = 'left';\n }\n\n // Update size of the image\n clonedImage.style.width = getPx(originalWidth);\n clonedImage.style.height = getPx(originalHeight);\n clonedImage.style.verticalAlign = 'bottom';\n clonedImage.style.position = 'absolute';\n\n //Update flip direction\n setFlipped(clonedImage.parentElement, flippedHorizontal, flippedVertical);\n const smallImage = isASmallImage(visibleWidth, visibleWidth);\n\n if (!croppers) {\n // For rotate/resize, set the margin of the image so that cropped part won't be visible\n clonedImage.style.margin = `${-cropTopPx}px 0 0 ${-cropLeftPx}px`;\n }\n\n if (croppers && croppers.length > 0) {\n const cropContainer = croppers[0];\n const cropOverlays = croppers.filter(\n cropper => cropper.className === ImageEditElementClass.CropOverlay\n );\n\n setSize(\n cropContainer,\n cropLeftPx,\n cropTopPx,\n cropRightPx,\n cropBottomPx,\n undefined,\n undefined\n );\n setSize(cropOverlays[0], 0, 0, cropRightPx, undefined, undefined, cropTopPx);\n setSize(cropOverlays[1], undefined, 0, 0, cropBottomPx, cropRightPx, undefined);\n setSize(cropOverlays[2], cropLeftPx, undefined, 0, 0, undefined, cropBottomPx);\n setSize(cropOverlays[3], 0, cropTopPx, undefined, 0, cropLeftPx, undefined);\n\n if (angleRad) {\n updateHandleCursor(croppers, angleRad);\n }\n }\n\n if (resizers) {\n const clientWidth = wrapper.clientWidth;\n const clientHeight = wrapper.clientHeight;\n\n doubleCheckResize(editInfo, options.preserveRatio || false, clientWidth, clientHeight);\n\n const resizeHandles = resizers\n .map(resizer => {\n const resizeHandle = resizer.firstElementChild;\n if (\n isNodeOfType(resizeHandle, 'ELEMENT_NODE') &&\n isElementOfType(resizeHandle, 'div')\n ) {\n return resizeHandle;\n }\n })\n .filter(handle => !!handle) as HTMLDivElement[];\n\n if (angleRad) {\n updateHandleCursor(resizeHandles, angleRad);\n }\n\n updateSideHandlesVisibility(resizeHandles, smallImage);\n }\n}\n"]}
1
+ {"version":3,"file":"updateWrapper.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/imageEdit/utils/updateWrapper.ts"],"names":[],"mappings":"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","sourcesContent":["import { doubleCheckResize } from './doubleCheckResize';\nimport { getGeneratedImageSize } from './generateImageSize';\nimport { ImageEditElementClass } from '../types/ImageEditElementClass';\nimport { isElementOfType, isNodeOfType } from 'roosterjs-content-model-dom';\nimport { updateHandleCursor } from './updateHandleCursor';\nimport { updateSideHandlesVisibility } from '../Resizer/updateSideHandlesVisibility';\nimport type { ImageEditOptions } from '../types/ImageEditOptions';\nimport type { ImageMetadataFormat } from 'roosterjs-content-model-types';\nimport {\n getPx,\n isASmallImage,\n isRTL,\n setFlipped,\n setSize,\n setWrapperSizeDimensions,\n} from './imageEditUtils';\n\n/**\n * @internal\n */\nexport function updateWrapper(\n editInfo: ImageMetadataFormat,\n options: ImageEditOptions,\n image: HTMLImageElement,\n clonedImage: HTMLImageElement,\n wrapper: HTMLSpanElement,\n resizers?: HTMLDivElement[],\n croppers?: HTMLDivElement[]\n) {\n const {\n angleRad,\n bottomPercent,\n leftPercent,\n rightPercent,\n topPercent,\n flippedHorizontal,\n flippedVertical,\n } = editInfo;\n\n const generateImageSize = getGeneratedImageSize(editInfo, croppers && croppers?.length > 0);\n if (!generateImageSize) {\n return;\n }\n const {\n targetWidth,\n targetHeight,\n originalWidth,\n originalHeight,\n visibleWidth,\n visibleHeight,\n } = generateImageSize;\n\n const marginHorizontal = (targetWidth - visibleWidth) / 2;\n const marginVertical = (targetHeight - visibleHeight) / 2;\n const cropLeftPx = originalWidth * (leftPercent || 0);\n const cropRightPx = originalWidth * (rightPercent || 0);\n const cropTopPx = originalHeight * (topPercent || 0);\n const cropBottomPx = originalHeight * (bottomPercent || 0);\n\n // Update size and margin of the wrapper\n wrapper.style.margin = `${marginVertical}px ${marginHorizontal}px`;\n wrapper.style.transform = `rotate(${angleRad}rad)`;\n setWrapperSizeDimensions(wrapper, image, visibleWidth, visibleHeight);\n\n // Update the text-alignment to avoid the image to overflow if the parent element have align center or right\n // or if the direction is Right To Left\n if (isRTL(clonedImage)) {\n wrapper.style.textAlign = 'right';\n if (!croppers) {\n clonedImage.style.left = getPx(cropLeftPx);\n clonedImage.style.right = getPx(-cropRightPx);\n }\n } else {\n wrapper.style.textAlign = 'left';\n }\n\n // Update size of the image\n clonedImage.style.width = getPx(originalWidth);\n clonedImage.style.height = getPx(originalHeight);\n clonedImage.style.verticalAlign = 'bottom';\n clonedImage.style.position = 'absolute';\n\n //Update flip direction\n setFlipped(clonedImage.parentElement, flippedHorizontal, flippedVertical);\n const smallImage = isASmallImage(visibleWidth, visibleWidth);\n\n if (!croppers) {\n // For rotate/resize, set the margin of the image so that cropped part won't be visible\n clonedImage.style.margin = `${-cropTopPx}px 0 0 ${-cropLeftPx}px`;\n }\n\n if (croppers && croppers.length > 0) {\n const cropContainer = croppers[0];\n const cropOverlays = croppers.filter(\n cropper => cropper.className === ImageEditElementClass.CropOverlay\n );\n\n setSize(\n cropContainer,\n cropLeftPx,\n cropTopPx,\n cropRightPx,\n cropBottomPx,\n undefined,\n undefined\n );\n setSize(cropOverlays[0], 0, 0, cropRightPx, undefined, undefined, cropTopPx);\n setSize(cropOverlays[1], undefined, 0, 0, cropBottomPx, cropRightPx, undefined);\n setSize(cropOverlays[2], cropLeftPx, undefined, 0, 0, undefined, cropBottomPx);\n setSize(cropOverlays[3], 0, cropTopPx, undefined, 0, cropLeftPx, undefined);\n\n if (angleRad !== undefined) {\n updateHandleCursor(croppers, angleRad);\n }\n }\n\n if (resizers) {\n const clientWidth = wrapper.clientWidth;\n const clientHeight = wrapper.clientHeight;\n\n doubleCheckResize(editInfo, options.preserveRatio || false, clientWidth, clientHeight);\n\n const resizeHandles = resizers\n .map(resizer => {\n const resizeHandle = resizer.firstElementChild;\n if (\n isNodeOfType(resizeHandle, 'ELEMENT_NODE') &&\n isElementOfType(resizeHandle, 'div')\n ) {\n return resizeHandle;\n }\n })\n .filter(handle => !!handle) as HTMLDivElement[];\n\n if (angleRad !== undefined) {\n updateHandleCursor(resizeHandles, angleRad);\n }\n\n updateSideHandlesVisibility(resizeHandles, smallImage);\n }\n}\n"]}
@@ -2,7 +2,7 @@ export { TableEditPlugin } from './tableEdit/TableEditPlugin';
2
2
  export { OnTableEditorCreatedCallback } from './tableEdit/OnTableEditorCreatedCallback';
3
3
  export { TableEditFeatureName } from './tableEdit/editors/features/TableEditFeatureName';
4
4
  export { PastePlugin } from './paste/PastePlugin';
5
- export { EditPlugin } from './edit/EditPlugin';
5
+ export { EditPlugin, EditOptions } from './edit/EditPlugin';
6
6
  export { AutoFormatPlugin, AutoFormatOptions } from './autoFormat/AutoFormatPlugin';
7
7
  export { ShortcutBold, ShortcutItalic, ShortcutUnderline, ShortcutClearFormat, ShortcutUndo, ShortcutUndo2, ShortcutRedo, ShortcutRedoAlt, ShortcutRedoMacOS, ShortcutBullet, ShortcutNumbering, ShortcutIncreaseFont, ShortcutDecreaseFont, ShortcutIndentList, ShortcutOutdentList, } from './shortcut/shortcuts';
8
8
  export { ShortcutPlugin } from './shortcut/ShortcutPlugin';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/roosterjs-content-model-plugins/lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAG9D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAqB,MAAM,+BAA+B,CAAC;AAEpF,OAAO,EACH,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,GACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAAE,qBAAqB,EAAsB,MAAM,yCAAyC,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EAAE,cAAc,EAAmB,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD,OAAO,EAAE,mBAAmB,EAAiB,MAAM,qCAAqC,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC","sourcesContent":["export { TableEditPlugin } from './tableEdit/TableEditPlugin';\nexport { OnTableEditorCreatedCallback } from './tableEdit/OnTableEditorCreatedCallback';\nexport { TableEditFeatureName } from './tableEdit/editors/features/TableEditFeatureName';\nexport { PastePlugin } from './paste/PastePlugin';\nexport { EditPlugin } from './edit/EditPlugin';\nexport { AutoFormatPlugin, AutoFormatOptions } from './autoFormat/AutoFormatPlugin';\n\nexport {\n ShortcutBold,\n ShortcutItalic,\n ShortcutUnderline,\n ShortcutClearFormat,\n ShortcutUndo,\n ShortcutUndo2,\n ShortcutRedo,\n ShortcutRedoAlt,\n ShortcutRedoMacOS,\n ShortcutBullet,\n ShortcutNumbering,\n ShortcutIncreaseFont,\n ShortcutDecreaseFont,\n ShortcutIndentList,\n ShortcutOutdentList,\n} from './shortcut/shortcuts';\nexport { ShortcutPlugin } from './shortcut/ShortcutPlugin';\nexport { ShortcutKeyDefinition, ShortcutCommand } from './shortcut/ShortcutCommand';\nexport { ContextMenuPluginBase, ContextMenuOptions } from './contextMenuBase/ContextMenuPluginBase';\nexport { WatermarkPlugin } from './watermark/WatermarkPlugin';\nexport { WatermarkFormat } from './watermark/WatermarkFormat';\nexport { MarkdownPlugin, MarkdownOptions } from './markdown/MarkdownPlugin';\nexport { HyperlinkPlugin } from './hyperlink/HyperlinkPlugin';\nexport { HyperlinkToolTip } from './hyperlink/HyperlinkToolTip';\nexport { PickerPlugin } from './picker/PickerPlugin';\nexport { PickerHelper } from './picker/PickerHelper';\nexport { PickerSelectionChangMode, PickerDirection, PickerHandler } from './picker/PickerHandler';\nexport { CustomReplacePlugin, CustomReplace } from './customReplace/CustomReplacePlugin';\nexport { ImageEditPlugin } from './imageEdit/ImageEditPlugin';\nexport { ImageEditOptions } from './imageEdit/types/ImageEditOptions';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/roosterjs-content-model-plugins/lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAG9D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAe,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAqB,MAAM,+BAA+B,CAAC;AAEpF,OAAO,EACH,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,GACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAAE,qBAAqB,EAAsB,MAAM,yCAAyC,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EAAE,cAAc,EAAmB,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD,OAAO,EAAE,mBAAmB,EAAiB,MAAM,qCAAqC,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC","sourcesContent":["export { TableEditPlugin } from './tableEdit/TableEditPlugin';\nexport { OnTableEditorCreatedCallback } from './tableEdit/OnTableEditorCreatedCallback';\nexport { TableEditFeatureName } from './tableEdit/editors/features/TableEditFeatureName';\nexport { PastePlugin } from './paste/PastePlugin';\nexport { EditPlugin, EditOptions } from './edit/EditPlugin';\nexport { AutoFormatPlugin, AutoFormatOptions } from './autoFormat/AutoFormatPlugin';\n\nexport {\n ShortcutBold,\n ShortcutItalic,\n ShortcutUnderline,\n ShortcutClearFormat,\n ShortcutUndo,\n ShortcutUndo2,\n ShortcutRedo,\n ShortcutRedoAlt,\n ShortcutRedoMacOS,\n ShortcutBullet,\n ShortcutNumbering,\n ShortcutIncreaseFont,\n ShortcutDecreaseFont,\n ShortcutIndentList,\n ShortcutOutdentList,\n} from './shortcut/shortcuts';\nexport { ShortcutPlugin } from './shortcut/ShortcutPlugin';\nexport { ShortcutKeyDefinition, ShortcutCommand } from './shortcut/ShortcutCommand';\nexport { ContextMenuPluginBase, ContextMenuOptions } from './contextMenuBase/ContextMenuPluginBase';\nexport { WatermarkPlugin } from './watermark/WatermarkPlugin';\nexport { WatermarkFormat } from './watermark/WatermarkFormat';\nexport { MarkdownPlugin, MarkdownOptions } from './markdown/MarkdownPlugin';\nexport { HyperlinkPlugin } from './hyperlink/HyperlinkPlugin';\nexport { HyperlinkToolTip } from './hyperlink/HyperlinkToolTip';\nexport { PickerPlugin } from './picker/PickerPlugin';\nexport { PickerHelper } from './picker/PickerHelper';\nexport { PickerSelectionChangMode, PickerDirection, PickerHandler } from './picker/PickerHandler';\nexport { CustomReplacePlugin, CustomReplace } from './customReplace/CustomReplacePlugin';\nexport { ImageEditPlugin } from './imageEdit/ImageEditPlugin';\nexport { ImageEditOptions } from './imageEdit/types/ImageEditOptions';\n"]}
@@ -1,6 +1,5 @@
1
1
  import { __assign } from "tslib";
2
- import { formatTextSegmentBeforeSelectionMarker } from 'roosterjs-content-model-api';
3
- import { splitTextSegment } from '../../pluginUtils/splitTextSegment';
2
+ import { formatTextSegmentBeforeSelectionMarker, splitTextSegment, } from 'roosterjs-content-model-api';
4
3
  /**
5
4
  * @internal
6
5
  */
@@ -1 +1 @@
1
- {"version":3,"file":"setFormat.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/markdown/utils/setFormat.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,sCAAsC,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAQtE;;GAEG;AACH,MAAM,UAAU,SAAS,CACrB,MAAe,EACf,SAAiB,EACjB,MAAiC,EACjC,UAAmC;IAEnC,sCAAsC,CAClC,MAAM,EACN,UAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO;QACtD,IAAI,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,SAAS,EAAE;YACpE,IAAM,gBAAgB,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,gBAAgB,yBACjB,YAAY,KACf,aAAa,EAAE,CAAC,CAAC,YAAY,CAAC,aAAa,EAC3C,MAAM,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM,EAC7B,UAAU,EAAE,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,UAAU,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,GAC5D,CAAC;YACF,IAAI,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE;gBAC1C,IAAM,aAAa,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;gBAClD,IAAM,cAAc,GAAG,eAAe,CAAC,IAAI;qBACtC,SAAS,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC;qBAC/B,WAAW,CAAC,SAAS,CAAC,CAAC;gBAC5B,IAAI,aAAa,GAAG,cAAc,GAAG,CAAC,EAAE;oBACpC,IAAM,aAAa,GAAG,gBAAgB,CAClC,eAAe,EACf,SAAS,EACT,cAAc,EACd,aAAa,CAChB,CAAC;oBAEF,aAAa,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC5E,aAAa,CAAC,MAAM,yBACb,aAAa,CAAC,MAAM,GACpB,MAAM,CACZ,CAAC;oBACF,IAAI,UAAU,EAAE;wBACZ,aAAa,CAAC,IAAI,GAAG;4BACjB,MAAM,EAAE,UAAU;yBACrB,CAAC;qBACL;oBAED,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;oBAClC,OAAO,IAAI,CAAC;iBACf;aACJ;SACJ;QACD,OAAO,KAAK,CAAC;IACjB,CAAC,CACJ,CAAC;AACN,CAAC","sourcesContent":["import { formatTextSegmentBeforeSelectionMarker } from 'roosterjs-content-model-api';\nimport { splitTextSegment } from '../../pluginUtils/splitTextSegment';\n\nimport type {\n ContentModelCodeFormat,\n ContentModelSegmentFormat,\n IEditor,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function setFormat(\n editor: IEditor,\n character: string,\n format: ContentModelSegmentFormat,\n codeFormat?: ContentModelCodeFormat\n) {\n formatTextSegmentBeforeSelectionMarker(\n editor,\n (_model, previousSegment, paragraph, markerFormat, context) => {\n if (previousSegment.text[previousSegment.text.length - 1] == character) {\n const textBeforeMarker = previousSegment.text.slice(0, -1);\n context.newPendingFormat = {\n ...markerFormat,\n strikethrough: !!markerFormat.strikethrough,\n italic: !!markerFormat.italic,\n fontWeight: markerFormat?.fontWeight ? 'bold' : undefined,\n };\n if (textBeforeMarker.indexOf(character) > -1) {\n const lastCharIndex = previousSegment.text.length;\n const firstCharIndex = previousSegment.text\n .substring(0, lastCharIndex - 1)\n .lastIndexOf(character);\n if (lastCharIndex - firstCharIndex > 2) {\n const formattedText = splitTextSegment(\n previousSegment,\n paragraph,\n firstCharIndex,\n lastCharIndex\n );\n\n formattedText.text = formattedText.text.replace(character, '').slice(0, -1);\n formattedText.format = {\n ...formattedText.format,\n ...format,\n };\n if (codeFormat) {\n formattedText.code = {\n format: codeFormat,\n };\n }\n\n context.canUndoByBackspace = true;\n return true;\n }\n }\n }\n return false;\n }\n );\n}\n"]}
1
+ {"version":3,"file":"setFormat.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/markdown/utils/setFormat.ts"],"names":[],"mappings":";AAAA,OAAO,EACH,sCAAsC,EACtC,gBAAgB,GACnB,MAAM,6BAA6B,CAAC;AAOrC;;GAEG;AACH,MAAM,UAAU,SAAS,CACrB,MAAe,EACf,SAAiB,EACjB,MAAiC,EACjC,UAAmC;IAEnC,sCAAsC,CAClC,MAAM,EACN,UAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO;QACtD,IAAI,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,SAAS,EAAE;YACpE,IAAM,gBAAgB,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,gBAAgB,yBACjB,YAAY,KACf,aAAa,EAAE,CAAC,CAAC,YAAY,CAAC,aAAa,EAC3C,MAAM,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM,EAC7B,UAAU,EAAE,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,UAAU,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,GAC5D,CAAC;YACF,IAAI,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE;gBAC1C,IAAM,aAAa,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;gBAClD,IAAM,cAAc,GAAG,eAAe,CAAC,IAAI;qBACtC,SAAS,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC;qBAC/B,WAAW,CAAC,SAAS,CAAC,CAAC;gBAC5B,IAAI,aAAa,GAAG,cAAc,GAAG,CAAC,EAAE;oBACpC,IAAM,aAAa,GAAG,gBAAgB,CAClC,eAAe,EACf,SAAS,EACT,cAAc,EACd,aAAa,CAChB,CAAC;oBAEF,aAAa,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC5E,aAAa,CAAC,MAAM,yBACb,aAAa,CAAC,MAAM,GACpB,MAAM,CACZ,CAAC;oBACF,IAAI,UAAU,EAAE;wBACZ,aAAa,CAAC,IAAI,GAAG;4BACjB,MAAM,EAAE,UAAU;yBACrB,CAAC;qBACL;oBAED,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;oBAClC,OAAO,IAAI,CAAC;iBACf;aACJ;SACJ;QACD,OAAO,KAAK,CAAC;IACjB,CAAC,CACJ,CAAC;AACN,CAAC","sourcesContent":["import {\n formatTextSegmentBeforeSelectionMarker,\n splitTextSegment,\n} from 'roosterjs-content-model-api';\nimport type {\n ContentModelCodeFormat,\n ContentModelSegmentFormat,\n IEditor,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function setFormat(\n editor: IEditor,\n character: string,\n format: ContentModelSegmentFormat,\n codeFormat?: ContentModelCodeFormat\n) {\n formatTextSegmentBeforeSelectionMarker(\n editor,\n (_model, previousSegment, paragraph, markerFormat, context) => {\n if (previousSegment.text[previousSegment.text.length - 1] == character) {\n const textBeforeMarker = previousSegment.text.slice(0, -1);\n context.newPendingFormat = {\n ...markerFormat,\n strikethrough: !!markerFormat.strikethrough,\n italic: !!markerFormat.italic,\n fontWeight: markerFormat?.fontWeight ? 'bold' : undefined,\n };\n if (textBeforeMarker.indexOf(character) > -1) {\n const lastCharIndex = previousSegment.text.length;\n const firstCharIndex = previousSegment.text\n .substring(0, lastCharIndex - 1)\n .lastIndexOf(character);\n if (lastCharIndex - firstCharIndex > 2) {\n const formattedText = splitTextSegment(\n previousSegment,\n paragraph,\n firstCharIndex,\n lastCharIndex\n );\n\n formattedText.text = formattedText.text.replace(character, '').slice(0, -1);\n formattedText.format = {\n ...formattedText.format,\n ...format,\n };\n if (codeFormat) {\n formattedText.code = {\n format: codeFormat,\n };\n }\n\n context.canUndoByBackspace = true;\n return true;\n }\n }\n }\n return false;\n }\n );\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { splitTextSegment } from '../pluginUtils/splitTextSegment';
1
+ import { splitTextSegment } from 'roosterjs-content-model-api';
2
2
  /**
3
3
  * @internal
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"getQueryString.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/picker/getQueryString.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAMnE;;GAEG;AACH,MAAM,UAAU,cAAc,CAC1B,gBAAwB,EACxB,SAA8C,EAC9C,eAAiC,EACjC,qBAA0C;IAE1C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAEpD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;QAChB,IAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEtC,IAAI,OAAO,CAAC,WAAW,IAAI,MAAM,EAAE;YAC/B,MAAM,GAAG,EAAE,CAAC;YACZ,MAAM;SACT;QAED,IAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAEzD,IAAI,KAAK,IAAI,CAAC,EAAE;YACZ,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;YAEhD,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAE,OAAO,CAC1B,KAAK,GAAG,CAAC;gBACL,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;gBAClE,CAAC,CAAC,OAAO,CAChB,CAAC;YAEF,MAAM;SACT;aAAM;YACH,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC;YAE/B,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAE,OAAO,CAAC,OAAO,CAAC,CAAC;SAC3C;KACJ;IAED,IAAI,CAAC,GAAG,CAAC,EAAE;QACP,MAAM,GAAG,EAAE,CAAC;KACf;IAED,OAAO,MAAM,CAAC;AAClB,CAAC","sourcesContent":["import { splitTextSegment } from '../pluginUtils/splitTextSegment';\nimport type {\n ContentModelText,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function getQueryString(\n triggerCharacter: string,\n paragraph: ShallowMutableContentModelParagraph,\n previousSegment: ContentModelText,\n splittedSegmentResult?: ContentModelText[]\n): string {\n let result = '';\n let i = paragraph.segments.indexOf(previousSegment);\n\n for (; i >= 0; i--) {\n const segment = paragraph.segments[i];\n\n if (segment.segmentType != 'Text') {\n result = '';\n break;\n }\n\n const index = segment.text.lastIndexOf(triggerCharacter);\n\n if (index >= 0) {\n result = segment.text.substring(index) + result;\n\n splittedSegmentResult?.unshift(\n index > 0\n ? splitTextSegment(segment, paragraph, index, segment.text.length)\n : segment\n );\n\n break;\n } else {\n result = segment.text + result;\n\n splittedSegmentResult?.unshift(segment);\n }\n }\n\n if (i < 0) {\n result = '';\n }\n\n return result;\n}\n"]}
1
+ {"version":3,"file":"getQueryString.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/picker/getQueryString.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAM/D;;GAEG;AACH,MAAM,UAAU,cAAc,CAC1B,gBAAwB,EACxB,SAA8C,EAC9C,eAAiC,EACjC,qBAA0C;IAE1C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAEpD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;QAChB,IAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEtC,IAAI,OAAO,CAAC,WAAW,IAAI,MAAM,EAAE;YAC/B,MAAM,GAAG,EAAE,CAAC;YACZ,MAAM;SACT;QAED,IAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAEzD,IAAI,KAAK,IAAI,CAAC,EAAE;YACZ,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;YAEhD,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAE,OAAO,CAC1B,KAAK,GAAG,CAAC;gBACL,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;gBAClE,CAAC,CAAC,OAAO,CAChB,CAAC;YAEF,MAAM;SACT;aAAM;YACH,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC;YAE/B,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAE,OAAO,CAAC,OAAO,CAAC,CAAC;SAC3C;KACJ;IAED,IAAI,CAAC,GAAG,CAAC,EAAE;QACP,MAAM,GAAG,EAAE,CAAC;KACf;IAED,OAAO,MAAM,CAAC;AAClB,CAAC","sourcesContent":["import { splitTextSegment } from 'roosterjs-content-model-api';\nimport type {\n ContentModelText,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function getQueryString(\n triggerCharacter: string,\n paragraph: ShallowMutableContentModelParagraph,\n previousSegment: ContentModelText,\n splittedSegmentResult?: ContentModelText[]\n): string {\n let result = '';\n let i = paragraph.segments.indexOf(previousSegment);\n\n for (; i >= 0; i--) {\n const segment = paragraph.segments[i];\n\n if (segment.segmentType != 'Text') {\n result = '';\n break;\n }\n\n const index = segment.text.lastIndexOf(triggerCharacter);\n\n if (index >= 0) {\n result = segment.text.substring(index) + result;\n\n splittedSegmentResult?.unshift(\n index > 0\n ? splitTextSegment(segment, paragraph, index, segment.text.length)\n : segment\n );\n\n break;\n } else {\n result = segment.text + result;\n\n splittedSegmentResult?.unshift(segment);\n }\n }\n\n if (i < 0) {\n result = '';\n }\n\n return result;\n}\n"]}
@@ -101,8 +101,10 @@ var TableEditor = /** @class */ (function () {
101
101
  _this.disposeTableInserter();
102
102
  _this.disposeCellResizers();
103
103
  };
104
- this.onEndTableMove = function () {
105
- _this.disposeTableMover();
104
+ this.onEndTableMove = function (disposeHandler) {
105
+ if (disposeHandler) {
106
+ _this.disposeTableMover();
107
+ }
106
108
  return _this.onFinishEditing();
107
109
  };
108
110
  this.onInserted = function () {