ep_images_extended 1.0.0 → 1.0.1

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/LICENSE.md CHANGED
@@ -1,14 +1,201 @@
1
- Copyright 2021 John McLear
2
- Copyright 2021 Ilmar Türk
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
3
4
 
4
- Licensed under the Apache License, Version 2.0 (the "License");
5
- you may not use this file except in compliance with the License.
6
- You may obtain a copy of the License at
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7
6
 
8
- http://www.apache.org/licenses/LICENSE-2.0
7
+ 1. Definitions.
9
8
 
10
- Unless required by applicable law or agreed to in writing, software
11
- distributed under the License is distributed on an "AS IS" BASIS,
12
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- See the License for the specific language governing permissions and
14
- limitations under the License.
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "{}"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright {yyyy} {name of copyright owner}
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
package/NOTICE.md ADDED
@@ -0,0 +1,4 @@
1
+ This software includes substantial portions of
2
+ “ep_image_insert” (https://github.com/mamylinx/ep_image_insert)
3
+ by Mamy Linx and contributors, licensed under Apache-2.0.
4
+ The code has been modified; see individual source files for details.
package/README.md CHANGED
@@ -80,4 +80,9 @@ All other values are ignored.
80
80
 
81
81
  This was mostly made by LLMs (my requirements in this project were far beyond my coding ability at this time). Bug reports & PRs are welcome! See [`CONTRIBUTING.md`](CONTRIBUTING.md) for the coding guidelines and branching model.
82
82
 
83
- ---
83
+ ---
84
+
85
+ ## Credits / Upstream
86
+ This plugin started as a heavy rewrite of
87
+ [ep_image_insert](https://github.com/mamylinx/ep_image_insert)
88
+ by Mamy Linx, John McLear, Ilmar Türk and other contributors.
package/editbar.js CHANGED
@@ -1,5 +1,5 @@
1
1
  'use strict';
2
-
2
+ // Modified from ep_image_insert 1.0.7
3
3
  const eejs = require('ep_etherpad-lite/node/eejs/');
4
4
 
5
5
  exports.eejsBlock_editbarMenuLeft = (hookName, args, cb) => {
package/exportHTML.js CHANGED
@@ -1,5 +1,5 @@
1
1
  'use strict';
2
-
2
+ // Modified from ep_image_insert 1.0.7
3
3
  const Changeset = require('ep_etherpad-lite/static/js/Changeset');
4
4
  const Security = require('ep_etherpad-lite/static/js/security');
5
5
 
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  'use strict';
2
-
2
+ // Modified from ep_image_insert 1.0.7
3
3
  const eejs = require('ep_etherpad-lite/node/eejs/');
4
4
  const settings = require('ep_etherpad-lite/node/utils/Settings');
5
5
  const { randomUUID } = require('crypto');
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ep_images_extended",
3
3
  "description": "Insert images inline with text, float them, resize them, and more.",
4
- "version": "1.0.0",
4
+ "version": "1.0.1",
5
5
  "author": {
6
6
  "name": "DCastelone",
7
7
  "email": "daniel.m.castelone@gmail.com",
package/settings.js CHANGED
@@ -1,3 +1,5 @@
1
+ // Modified from ep_image_insert 1.0.7
2
+
1
3
  'use strict';
2
4
 
3
5
  exports.loadSettings = (hookName, settings, cb) => {
@@ -1,5 +1,5 @@
1
1
  'use strict';
2
-
2
+ // Modified from ep_image_insert 1.0.7
3
3
 
4
4
  // Simple UUID generator
5
5
  function generateUUID() {
@@ -64,7 +64,7 @@ function findImagePlaceholderPosition(lineText, imageIndex, fallbackLineElement
64
64
 
65
65
  for (let i = searchStart; i < searchEnd; i++) {
66
66
  if (lineText[i] === zwspPattern) {
67
- console.log(`[ep_images_extended] Fallback: Found ZWSP at position ${i} for image index ${imageIndex}`);
67
+ // console.log(`[ep_images_extended] Fallback: Found ZWSP at position ${i} for image index ${imageIndex}`);
68
68
  return {
69
69
  colStart: i,
70
70
  patternLength: 1,
@@ -75,7 +75,7 @@ function findImagePlaceholderPosition(lineText, imageIndex, fallbackLineElement
75
75
 
76
76
  // DOM-based fallback: when text-based approach fails, use DOM positioning
77
77
  if (fallbackLineElement) {
78
- console.log(`[ep_images_extended] DOM fallback: Using DOM-based positioning for image index ${imageIndex}`);
78
+ // console.log(`[ep_images_extended] DOM fallback: Using DOM-based positioning for image index ${imageIndex}`);
79
79
 
80
80
  // Count characters before the target image element in the DOM
81
81
  const allImagePlaceholders = Array.from(fallbackLineElement.querySelectorAll('.inline-image.image-placeholder'));
@@ -97,7 +97,7 @@ function findImagePlaceholderPosition(lineText, imageIndex, fallbackLineElement
97
97
  (currentNode.parentNode === targetImageElement ||
98
98
  targetImageElement.contains(currentNode.parentNode))) {
99
99
  // Found a text node that belongs to our target image
100
- console.log(`[ep_images_extended] DOM fallback: Found position ${approximatePosition} for image index ${imageIndex}`);
100
+ // console.log(`[ep_images_extended] DOM fallback: Found position ${approximatePosition} for image index ${imageIndex}`);
101
101
  return {
102
102
  colStart: approximatePosition,
103
103
  patternLength: 3, // Assume 3 characters for safety
@@ -111,7 +111,7 @@ function findImagePlaceholderPosition(lineText, imageIndex, fallbackLineElement
111
111
  }
112
112
 
113
113
  // If we couldn't find the exact position, use a reasonable estimate
114
- console.log(`[ep_images_extended] DOM fallback: Using estimated position ${approximatePosition} for image index ${imageIndex}`);
114
+ // console.log(`[ep_images_extended] DOM fallback: Using estimated position ${approximatePosition} for image index ${imageIndex}`);
115
115
  return {
116
116
  colStart: Math.max(0, approximatePosition - 1),
117
117
  patternLength: 3,
@@ -282,9 +282,9 @@ exports.postAceInit = function (hook, context) {
282
282
 
283
283
  // Check if image formatting menu exists (should be loaded from template)
284
284
  if ($('#imageFormatMenu').length === 0) {
285
- console.log('[ep_images_extended] Image format menu not found - template may not be loaded yet');
285
+ // console.log('[ep_images_extended] Image format menu not found - template may not be loaded yet');
286
286
  } else {
287
- console.log('[ep_images_extended] Image format menu found from template');
287
+ // console.log('[ep_images_extended] Image format menu found from template');
288
288
  }
289
289
 
290
290
  const $outlineBoxRef = padOuter.find('#imageResizeOutline');
@@ -461,53 +461,53 @@ exports.postAceInit = function (hook, context) {
461
461
  }
462
462
 
463
463
  // *** ENHANCED DEBUG: Track image click within table context ***
464
- console.log('[ep_images_extended] *** IMAGE MOUSEDOWN EVENT START ***');
465
- console.log('[ep_images_extended] Event target:', evt.target);
466
- console.log('[ep_images_extended] Event currentTarget:', evt.currentTarget);
464
+ // console.log('[ep_images_extended] *** IMAGE MOUSEDOWN EVENT START ***');
465
+ // console.log('[ep_images_extended] Event target:', evt.target);
466
+ // console.log('[ep_images_extended] Event currentTarget:', evt.currentTarget);
467
467
 
468
468
  targetOuterSpan = this;
469
469
  const $targetOuterSpan = $(targetOuterSpan);
470
- console.log('[ep_images_extended] Target outer span element:', targetOuterSpan);
471
- console.log('[ep_images_extended] Target outer span classes:', targetOuterSpan.className);
472
- console.log('[ep_images_extended] Target outer span HTML length:', targetOuterSpan.outerHTML?.length || 0);
470
+ // console.log('[ep_images_extended] Target outer span element:', targetOuterSpan);
471
+ // console.log('[ep_images_extended] Target outer span classes:', targetOuterSpan.className);
472
+ // console.log('[ep_images_extended] Target outer span HTML length:', targetOuterSpan.outerHTML?.length || 0);
473
473
 
474
474
  // *** DEBUG: Check table context ***
475
475
  const closestTable = targetOuterSpan.closest('table.dataTable');
476
476
  const closestTableCell = targetOuterSpan.closest('td, th');
477
477
  const closestAceLine = targetOuterSpan.closest('.ace-line');
478
478
 
479
- console.log('[ep_images_extended] Is image within table?', !!closestTable);
479
+ // console.log('[ep_images_extended] Is image within table?', !!closestTable);
480
480
  if (closestTable) {
481
- console.log('[ep_images_extended] Table tblId:', closestTable.getAttribute('data-tblId'));
482
- console.log('[ep_images_extended] Table row:', closestTable.getAttribute('data-row'));
483
- console.log('[ep_images_extended] Table cell:', !!closestTableCell);
481
+ // console.log('[ep_images_extended] Table tblId:', closestTable.getAttribute('data-tblId'));
482
+ // console.log('[ep_images_extended] Table row:', closestTable.getAttribute('data-row'));
483
+ // console.log('[ep_images_extended] Table cell:', !!closestTableCell);
484
484
  if (closestTableCell) {
485
- console.log('[ep_images_extended] Cell data-column:', closestTableCell.getAttribute('data-column'));
486
- console.log('[ep_images_extended] Cell innerHTML length:', closestTableCell.innerHTML?.length || 0);
485
+ // console.log('[ep_images_extended] Cell data-column:', closestTableCell.getAttribute('data-column'));
486
+ // console.log('[ep_images_extended] Cell innerHTML length:', closestTableCell.innerHTML?.length || 0);
487
487
  }
488
488
  }
489
489
  if (closestAceLine) {
490
- console.log('[ep_images_extended] Ace line ID:', closestAceLine.id);
491
- console.log('[ep_images_extended] Ace line classes:', closestAceLine.className);
492
- console.log('[ep_images_extended] Ace line innerHTML length:', closestAceLine.innerHTML?.length || 0);
490
+ // console.log('[ep_images_extended] Ace line ID:', closestAceLine.id);
491
+ // console.log('[ep_images_extended] Ace line classes:', closestAceLine.className);
492
+ // console.log('[ep_images_extended] Ace line innerHTML length:', closestAceLine.innerHTML?.length || 0);
493
493
  }
494
494
 
495
495
  const imageId = $targetOuterSpan.attr('data-image-id');
496
- console.log('[ep_images_extended] Image ID:', imageId);
496
+ // console.log('[ep_images_extended] Image ID:', imageId);
497
497
 
498
498
  if (imageId) {
499
499
  const previouslyActiveId = window.epImageInsertActiveImageId;
500
- console.log('[ep_images_extended] Previously active image ID:', previouslyActiveId);
501
- console.log('[ep_images_extended] Setting new active image ID:', imageId);
500
+ // console.log('[ep_images_extended] Previously active image ID:', previouslyActiveId);
501
+ // console.log('[ep_images_extended] Setting new active image ID:', imageId);
502
502
 
503
503
  window.epImageInsertActiveImageId = imageId; // NEW: Set active ID
504
504
 
505
505
  // *** DEBUG: Track selection styling changes ***
506
- console.log('[ep_images_extended] *** SELECTION STYLING START ***');
506
+ // console.log('[ep_images_extended] *** SELECTION STYLING START ***');
507
507
 
508
508
  // Use dynamic CSS injection to avoid triggering content collector on image elements
509
509
  if (previouslyActiveId !== imageId) {
510
- console.log('[ep_images_extended] Updating dynamic CSS selection');
510
+ // console.log('[ep_images_extended] Updating dynamic CSS selection');
511
511
  const innerDoc = $inner[0].ownerDocument;
512
512
 
513
513
  // Remove previous dynamic style if it exists
@@ -530,25 +530,25 @@ exports.postAceInit = function (hook, context) {
530
530
  }
531
531
  `;
532
532
  innerDoc.head.appendChild(styleElement);
533
- console.log('[ep_images_extended] Added dynamic CSS for image:', imageId);
533
+ // console.log('[ep_images_extended] Added dynamic CSS for image:', imageId);
534
534
  }
535
535
  }
536
536
 
537
- console.log('[ep_images_extended] *** SELECTION STYLING END ***');
537
+ // console.log('[ep_images_extended] *** SELECTION STYLING END ***');
538
538
 
539
539
  // *** DEBUG: Check DOM state after style changes ***
540
540
  if (closestAceLine) {
541
- console.log('[ep_images_extended] *** DOM STATE AFTER STYLE CHANGES ***');
542
- console.log('[ep_images_extended] Ace line innerHTML length after style changes:', closestAceLine.innerHTML?.length || 0);
543
- console.log('[ep_images_extended] Ace line innerHTML (first 500 chars):', closestAceLine.innerHTML?.substring(0, 500) || '');
541
+ // console.log('[ep_images_extended] *** DOM STATE AFTER STYLE CHANGES ***');
542
+ // console.log('[ep_images_extended] Ace line innerHTML length after style changes:', closestAceLine.innerHTML?.length || 0);
543
+ // console.log('[ep_images_extended] Ace line innerHTML (first 500 chars):', closestAceLine.innerHTML?.substring(0, 500) || '');
544
544
 
545
545
  // Check for delimiter presence in the line
546
546
  const delimiterCount = (closestAceLine.innerHTML || '').split('|').length - 1;
547
- console.log('[ep_images_extended] Delimiter count in ace line after style changes:', delimiterCount);
547
+ // console.log('[ep_images_extended] Delimiter count in ace line after style changes:', delimiterCount);
548
548
 
549
549
  // Check if tbljson class is still present
550
550
  const hasTbljsonClass = closestAceLine.innerHTML?.includes('tbljson-') || false;
551
- console.log('[ep_images_extended] Ace line still has tbljson class after changes:', hasTbljsonClass);
551
+ // console.log('[ep_images_extended] Ace line still has tbljson class after changes:', hasTbljsonClass);
552
552
  }
553
553
 
554
554
  showFormatMenu(targetOuterSpan);
@@ -566,11 +566,11 @@ exports.postAceInit = function (hook, context) {
566
566
 
567
567
  const target = $(evt.target);
568
568
  const isResizeHandle = target.hasClass('image-resize-handle');
569
- console.log('[ep_images_extended] Is resize handle clicked?', isResizeHandle);
569
+ // console.log('[ep_images_extended] Is resize handle clicked?', isResizeHandle);
570
570
 
571
571
  // If clicking on a resize handle, start the resize operation
572
572
  if (isResizeHandle) {
573
- console.log('[ep_images_extended] *** RESIZE HANDLE CLICKED - STARTING RESIZE OPERATION ***');
573
+ // console.log('[ep_images_extended] *** RESIZE HANDLE CLICKED - STARTING RESIZE OPERATION ***');
574
574
  isDragging = true;
575
575
  outlineBoxPositioned = false;
576
576
  startX = evt.clientX;
@@ -620,7 +620,7 @@ exports.postAceInit = function (hook, context) {
620
620
  colStart: placeholderInfo.colStart,
621
621
  patternLength: placeholderInfo.patternLength
622
622
  };
623
- console.log(`[ep_images_extended mousedown] Found placeholder at position ${placeholderInfo.colStart} with pattern length ${placeholderInfo.patternLength}`);
623
+ // console.log(`[ep_images_extended mousedown] Found placeholder at position ${placeholderInfo.colStart} with pattern length ${placeholderInfo.patternLength}`);
624
624
  } else {
625
625
  console.error(`[ep_images_extended mousedown] Could not find any placeholder sequence for image index ${imageIndex} in line text: "${lineText}"`);
626
626
  resizePositionData = null;
@@ -636,7 +636,7 @@ exports.postAceInit = function (hook, context) {
636
636
  }
637
637
  evt.preventDefault();
638
638
  } else {
639
- console.log('[ep_images_extended] *** SIMPLE IMAGE CLICK - NO RESIZE HANDLE ***');
639
+ // console.log('[ep_images_extended] *** SIMPLE IMAGE CLICK - NO RESIZE HANDLE ***');
640
640
  // Position cursor next to the image instead of inside it
641
641
  _aceContext.callWithAce((ace) => {
642
642
  const lineElement = $(targetOuterSpan).closest('.ace-line')[0];
@@ -665,7 +665,7 @@ exports.postAceInit = function (hook, context) {
665
665
  cursorPos = [lineNumber, placeholderInfo.colStart + placeholderInfo.patternLength];
666
666
  }
667
667
 
668
- console.log(`[ep_images_extended] Positioning cursor at [${cursorPos}] based on click position`);
668
+ // console.log(`[ep_images_extended] Positioning cursor at [${cursorPos}] based on click position`);
669
669
  ace.ace_performSelectionChange(cursorPos, cursorPos, false);
670
670
  }
671
671
  }
@@ -674,7 +674,7 @@ exports.postAceInit = function (hook, context) {
674
674
  }, 'positionCursorNextToImage', true);
675
675
  }
676
676
 
677
- console.log('[ep_images_extended] *** IMAGE MOUSEDOWN EVENT END ***');
677
+ // console.log('[ep_images_extended] *** IMAGE MOUSEDOWN EVENT END ***');
678
678
  });
679
679
 
680
680
  innerDoc.on('mousemove', function(evt) {
@@ -790,7 +790,7 @@ exports.postAceInit = function (hook, context) {
790
790
 
791
791
  // Don't apply styles directly to avoid triggering content collector
792
792
  // The visual updates will be handled by acePostWriteDomLineHTML after attributes are applied
793
- console.log('[ep_images_extended mouseup] Skipping direct style application to avoid content collection triggers');
793
+ // console.log('[ep_images_extended mouseup] Skipping direct style application to avoid content collection triggers');
794
794
 
795
795
  _aceContext.callWithAce((ace) => {
796
796
  const outerSpanAlive = (targetOuterSpan && document.contains(targetOuterSpan)) ? targetOuterSpan : null;
@@ -817,7 +817,7 @@ exports.postAceInit = function (hook, context) {
817
817
  ['image-height', heightToApplyPx],
818
818
  ['imageCssAspectRatio', newCssAspectRatioForVar]
819
819
  ]);
820
- console.log('[ep_images_extended mouseup] Successfully applied resize attributes (new targeting)');
820
+ // console.log('[ep_images_extended mouseup] Successfully applied resize attributes (new targeting)');
821
821
  } catch (err) {
822
822
  console.error('[ep_images_extended mouseup] Error applying resize attributes:', err);
823
823
  }
@@ -1045,7 +1045,7 @@ exports.postAceInit = function (hook, context) {
1045
1045
 
1046
1046
  // Function to show user feedback for copy/cut operations
1047
1047
  const showCopyFeedback = (message) => {
1048
- console.log(`[ep_images_extended] ${message}`);
1048
+ // console.log(`[ep_images_extended] ${message}`);
1049
1049
  // Could be enhanced with a temporary toast notification
1050
1050
  };
1051
1051
 
@@ -1217,7 +1217,7 @@ exports.postAceInit = function (hook, context) {
1217
1217
  // Delete the image by replacing the text range with empty string
1218
1218
  ace.ace_replaceRange(rangeStart, rangeEnd, '');
1219
1219
 
1220
- console.log('Successfully cut image at line', targetLineNumber, 'column', placeholderInfo.colStart);
1220
+ // console.log('Successfully cut image at line', targetLineNumber, 'column', placeholderInfo.colStart);
1221
1221
 
1222
1222
  } catch (error) {
1223
1223
  console.error('[ep_images_extended cut] Error deleting image:', error);
@@ -1324,7 +1324,7 @@ exports.postAceInit = function (hook, context) {
1324
1324
  ['image-float', floatValue]
1325
1325
  ]);
1326
1326
 
1327
- console.log('Applied float attribute:', floatValue, 'to image');
1327
+ // console.log('Applied float attribute:', floatValue, 'to image');
1328
1328
 
1329
1329
  } catch (error) {
1330
1330
  console.error('[ep_images_extended float] Error applying float attribute:', error);
@@ -1341,13 +1341,13 @@ exports.postAceInit = function (hook, context) {
1341
1341
  } else if (action) {
1342
1342
  // Handle action buttons
1343
1343
  if (action === 'copy') {
1344
- console.log('Copy image action triggered');
1344
+ // console.log('Copy image action triggered');
1345
1345
  handleImageCopy(false); // false = copy (don't delete after copy)
1346
1346
  } else if (action === 'cut') {
1347
- console.log('Cut image action triggered');
1347
+ // console.log('Cut image action triggered');
1348
1348
  handleImageCopy(true); // true = cut (delete after copy)
1349
1349
  } else if (action === 'delete') {
1350
- console.log('Delete image action triggered');
1350
+ // console.log('Delete image action triggered');
1351
1351
 
1352
1352
  // Use the specific selected image element (like float and resize logic does)
1353
1353
  if (currentElement) {
@@ -1367,7 +1367,7 @@ exports.postAceInit = function (hook, context) {
1367
1367
 
1368
1368
  try {
1369
1369
  ace.ace_replaceRange(rangeStart, rangeEnd, '');
1370
- console.log('[ep_images_extended delete] Successfully deleted image via helper');
1370
+ // console.log('[ep_images_extended delete] Successfully deleted image via helper');
1371
1371
  } catch (err) {
1372
1372
  console.error('[ep_images_extended delete] Error deleting image:', err);
1373
1373
  }
@@ -1391,7 +1391,7 @@ function _getLineNumberOfElement(element) {
1391
1391
  }
1392
1392
 
1393
1393
  exports.aceEditorCSS = (hookName, context) => {
1394
- console.log('[ep_images_extended] aceEditorCSS called - loading CSS file');
1394
+ // console.log('[ep_images_extended] aceEditorCSS called - loading CSS file');
1395
1395
  return [
1396
1396
  'ep_images_extended/static/css/ace.css'
1397
1397
  ];
@@ -1,5 +1,5 @@
1
1
  'use strict';
2
-
2
+ // Modified from ep_image_insert 1.0.7
3
3
  // This hook is called **before** the text of a line/segment is processed by the Changeset library.
4
4
  const collectContentPre = (hook, context) => {
5
5
  const classes = context.cls ? context.cls.split(' ') : [];
@@ -1,5 +1,5 @@
1
1
  'use strict';
2
-
2
+ // Modified from ep_image_insert 1.0.7
3
3
  const _isValid = (file) => {
4
4
  const mimedb = clientVars.ep_images_extended.mimeTypes;
5
5
  const mimeType = mimedb[file.type];