@syncfusion/ej2-richtexteditor 29.2.4-795127 → 29.2.4-803054

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.
@@ -27988,6 +27988,9 @@ var ImageSettings = /** @class */ (function (_super) {
27988
27988
  __decorate$1([
27989
27989
  Property(false)
27990
27990
  ], ImageSettings.prototype, "resizeByPercent", void 0);
27991
+ __decorate$1([
27992
+ Property(false)
27993
+ ], ImageSettings.prototype, "uploadRemoteURLs", void 0);
27991
27994
  return ImageSettings;
27992
27995
  }(ChildProperty));
27993
27996
  /**
@@ -40503,7 +40506,11 @@ var PasteCleanup = /** @class */ (function () {
40503
40506
  if (e.args && value !== null && this.parent.editorMode === 'HTML') {
40504
40507
  var file = void 0;
40505
40508
  var files = e.args.clipboardData.files;
40506
- if (value.length === 0 || (!isNullOrUndefined(files) && files.length > 0)) {
40509
+ var elm = createElement('p');
40510
+ elm.innerHTML = value;
40511
+ var source = this.findSource(elm);
40512
+ var extractedSRC = this.parent.insertImageSettings.uploadRemoteURLs ? this.extractImageSrcDOM(value) : null;
40513
+ if (value.length === 0 || (!isNullOrUndefined(files) && files.length > 0 && source === 'html')) {
40507
40514
  var htmlRegex = new RegExp(/<\/[a-z][\s\S]*>/i);
40508
40515
  value = e.args.clipboardData.getData('text/plain');
40509
40516
  this.parent.trigger(beforePasteCleanup, { value: value });
@@ -40546,6 +40553,14 @@ var PasteCleanup = /** @class */ (function () {
40546
40553
  value = divElement.innerHTML;
40547
40554
  }
40548
40555
  }
40556
+ else if (Array.isArray(extractedSRC) && extractedSRC.length &&
40557
+ this.parent.insertImageSettings.saveUrl && this.parent.insertImageSettings.path) {
40558
+ this.parent.trigger(beforePasteCleanup, { value: value });
40559
+ for (var i = 0; i < extractedSRC.length; i++) {
40560
+ var src = extractedSRC[i];
40561
+ this.fetchImageWithMetadata(src);
40562
+ }
40563
+ }
40549
40564
  else if (value.length > 0) {
40550
40565
  this.parent.trigger(beforePasteCleanup, { value: value });
40551
40566
  this.parent.formatter.editorManager.observer.notify(MS_WORD_CLEANUP, {
@@ -40602,6 +40617,69 @@ var PasteCleanup = /** @class */ (function () {
40602
40617
  }
40603
40618
  }
40604
40619
  };
40620
+ PasteCleanup.prototype.findSource = function (element) {
40621
+ var metaNodes = element.querySelectorAll('meta');
40622
+ for (var i = 0; i < metaNodes.length; i++) {
40623
+ var metaNode = metaNodes[i];
40624
+ var content = metaNode.getAttribute('content');
40625
+ var name_1 = metaNode.getAttribute('name');
40626
+ if (name_1 && name_1.toLowerCase().indexOf('generator') >= 0 && content && content.toLowerCase().indexOf('microsoft') >= 0) {
40627
+ for (var j = 0; j < PASTE_SOURCE.length; j++) {
40628
+ if (content.toLowerCase().indexOf(PASTE_SOURCE[j]) >= 0) {
40629
+ return PASTE_SOURCE[j];
40630
+ }
40631
+ }
40632
+ }
40633
+ }
40634
+ return 'html';
40635
+ };
40636
+ PasteCleanup.prototype.extractImageSrcDOM = function (value) {
40637
+ if (!value || typeof value !== 'string') {
40638
+ return null;
40639
+ }
40640
+ var parser = new DOMParser();
40641
+ var doc = parser.parseFromString(value, 'text/html');
40642
+ var images = doc.querySelectorAll('img');
40643
+ if (images.length === 0) {
40644
+ return null;
40645
+ }
40646
+ var srcs = Array.from(images)
40647
+ .map(function (img) { return img.getAttribute('src') || img.src || ''; })
40648
+ .map(function (src) { return src.trim(); })
40649
+ .filter(function (src) { return !!src; })
40650
+ // Exclude base64/data URLs, blob URLs, and anything containing "id="
40651
+ .filter(function (src) {
40652
+ var s = src.toLowerCase();
40653
+ return !s.startsWith('data:') && !s.includes('base64') && !s.startsWith('blob:') && !s.includes('id=');
40654
+ });
40655
+ return srcs.length ? srcs : null;
40656
+ };
40657
+ PasteCleanup.prototype.fetchImageWithMetadata = function (url) {
40658
+ var _this = this;
40659
+ fetch(url)
40660
+ .then(function (response) {
40661
+ if (!response.ok) {
40662
+ console.warn("Fetch status " + response.status + " for: " + url);
40663
+ return null;
40664
+ }
40665
+ return response.blob();
40666
+ })
40667
+ .then(function (blob) {
40668
+ if (blob) {
40669
+ var filename = _this.getFilenameFromUrl(url) || 'downloaded-image.jpg';
40670
+ var mimeType = blob.type || 'image/jpeg';
40671
+ var file = new File([blob], filename, { type: mimeType });
40672
+ var imageElement = _this.parent.inputElement.querySelector("img[src=\"" + url + "\"]");
40673
+ _this.uploadMethod(file, imageElement);
40674
+ }
40675
+ });
40676
+ };
40677
+ // Helper method to extract filename from URL
40678
+ PasteCleanup.prototype.getFilenameFromUrl = function (url) {
40679
+ var pathname = new URL(url).pathname;
40680
+ var filename = pathname.substring(pathname.lastIndexOf('/') + 1);
40681
+ return filename || 'image.jpg';
40682
+ };
40605
40683
  PasteCleanup.prototype.splitBreakLine = function (value) {
40606
40684
  var enterSplitText = value.split('\r\n\r\n');
40607
40685
  var finalText = '';