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 +198 -11
- package/NOTICE.md +4 -0
- package/README.md +6 -1
- package/editbar.js +1 -1
- package/exportHTML.js +1 -1
- package/index.js +1 -1
- package/package.json +1 -1
- package/settings.js +2 -0
- package/static/js/clientHooks.js +50 -50
- package/static/js/contentCollection.js +1 -1
- package/static/js/toolbar.js +1 -1
package/LICENSE.md
CHANGED
|
@@ -1,14 +1,201 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
3
4
|
|
|
4
|
-
|
|
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
|
-
|
|
7
|
+
1. Definitions.
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
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
package/exportHTML.js
CHANGED
package/index.js
CHANGED
package/package.json
CHANGED
package/settings.js
CHANGED
package/static/js/clientHooks.js
CHANGED
|
@@ -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
|
];
|
package/static/js/toolbar.js
CHANGED