@richscripts2/richtexteditor 1.0.15 → 1.0.16
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/package.json +1 -1
- package/richtexteditor/plugins/all_plugins.js +962 -164
- package/richtexteditor/plugins/insertgallery.js +356 -82
- package/richtexteditor/plugins/inserttemplate.js +257 -82
- package/richtexteditor/plugins/zz_richtextbox_dialog_style.js +335 -0
- package/richtexteditor/rte.js +137 -31
- package/richtexteditor/rte_theme_default.css +755 -128
|
@@ -1,82 +1,356 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
1
|
+
RTE_DefaultConfig.plugin_insertgallery = RTE_Plugin_InsertGallery;
|
|
2
|
+
|
|
3
|
+
function RTE_Plugin_InsertGallery() {
|
|
4
|
+
var obj = this;
|
|
5
|
+
var config;
|
|
6
|
+
var editor;
|
|
7
|
+
|
|
8
|
+
obj.PluginName = "InsertGallery";
|
|
9
|
+
|
|
10
|
+
obj.InitConfig = function (argconfig) {
|
|
11
|
+
config = argconfig;
|
|
12
|
+
if (!config.galleryImages) {
|
|
13
|
+
config.galleryImages = [];
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
obj.InitEditor = function (argeditor) {
|
|
18
|
+
editor = argeditor;
|
|
19
|
+
|
|
20
|
+
editor.attachEvent("exec_command_insertgallery", function (state) {
|
|
21
|
+
state.returnValue = true;
|
|
22
|
+
obj.DoInsertGallery();
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
function append(parent, tagName, cssText, className) {
|
|
27
|
+
var tag = parent.ownerDocument.createElement(tagName);
|
|
28
|
+
if (cssText) {
|
|
29
|
+
tag.style.cssText = cssText;
|
|
30
|
+
}
|
|
31
|
+
if (className) {
|
|
32
|
+
tag.className = className;
|
|
33
|
+
}
|
|
34
|
+
parent.appendChild(tag);
|
|
35
|
+
return tag;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function clear(node) {
|
|
39
|
+
while (node.firstChild) {
|
|
40
|
+
node.removeChild(node.firstChild);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function getFileName(url) {
|
|
45
|
+
var value = String(url || "").split("#")[0].split("?")[0];
|
|
46
|
+
var lastSlash = value.lastIndexOf("/");
|
|
47
|
+
var name = lastSlash >= 0 ? value.substring(lastSlash + 1) : value;
|
|
48
|
+
try {
|
|
49
|
+
name = decodeURIComponent(name);
|
|
50
|
+
} catch (ex) {
|
|
51
|
+
}
|
|
52
|
+
return name || "Image";
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function getMetaText(item) {
|
|
56
|
+
if (item.meta) {
|
|
57
|
+
return item.meta;
|
|
58
|
+
}
|
|
59
|
+
if (item.alt) {
|
|
60
|
+
return item.alt;
|
|
61
|
+
}
|
|
62
|
+
return item.url;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function normalizeGalleryItem(item) {
|
|
66
|
+
var normalized = null;
|
|
67
|
+
|
|
68
|
+
if (typeof item === "string") {
|
|
69
|
+
normalized = {
|
|
70
|
+
url: item,
|
|
71
|
+
thumbnail: item,
|
|
72
|
+
name: getFileName(item)
|
|
73
|
+
};
|
|
74
|
+
} else if (item instanceof Array) {
|
|
75
|
+
normalized = {
|
|
76
|
+
url: item[0],
|
|
77
|
+
thumbnail: item[0],
|
|
78
|
+
name: item[1] || getFileName(item[0]),
|
|
79
|
+
meta: item[2] || ""
|
|
80
|
+
};
|
|
81
|
+
} else if (item && typeof item === "object") {
|
|
82
|
+
var url = item.url || item.src || item.href;
|
|
83
|
+
if (!url) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
normalized = {
|
|
88
|
+
url: url,
|
|
89
|
+
thumbnail: item.thumbnail || item.thumb || item.preview || url,
|
|
90
|
+
name: item.name || item.text || item.title || getFileName(url),
|
|
91
|
+
meta: item.meta || item.description || item.alt || ""
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (!normalized || !normalized.url) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (!normalized.thumbnail) {
|
|
100
|
+
normalized.thumbnail = normalized.url;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (!normalized.name) {
|
|
104
|
+
normalized.name = getFileName(normalized.url);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return normalized;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function uploadFiles(fileList, onUploaded, onFinished, onFailed) {
|
|
111
|
+
var files = [];
|
|
112
|
+
var handler = window.rte_file_upload_handler;
|
|
113
|
+
var i;
|
|
114
|
+
|
|
115
|
+
for (i = 0; i < fileList.length; i++) {
|
|
116
|
+
files.push(fileList[i]);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (!files.length) {
|
|
120
|
+
onFinished();
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (typeof handler !== "function") {
|
|
125
|
+
if (onFailed) {
|
|
126
|
+
onFailed("Upload handler is not configured.");
|
|
127
|
+
}
|
|
128
|
+
onFinished();
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
var index = 0;
|
|
133
|
+
|
|
134
|
+
function next() {
|
|
135
|
+
if (index >= files.length) {
|
|
136
|
+
onFinished();
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
var file = files[index];
|
|
141
|
+
handler(file, function (url, error) {
|
|
142
|
+
if (url) {
|
|
143
|
+
onUploaded(url, file, index, files);
|
|
144
|
+
} else if (onFailed) {
|
|
145
|
+
onFailed(error || ("Upload failed for " + file.name), file);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
index++;
|
|
149
|
+
next();
|
|
150
|
+
}, index, files);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
next();
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
obj.DoInsertGallery = function () {
|
|
157
|
+
var dialoginner = editor.createDialog(editor.getLangText("insertgallerytitle") || "Image gallery", "rte-dialog-insertgallery");
|
|
158
|
+
var closeDialog = typeof dialoginner.close === "function" ? function () {
|
|
159
|
+
dialoginner.close();
|
|
160
|
+
} : function () {
|
|
161
|
+
editor.closeCurrentPopup();
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
var browser = append(dialoginner, "div", "", "rte-gallery-browser");
|
|
165
|
+
var header = append(browser, "div", "", "rte-dialog-browser-header");
|
|
166
|
+
var kicker = append(header, "div", "", "rte-dialog-browser-kicker");
|
|
167
|
+
kicker.innerText = "Media Library";
|
|
168
|
+
var title = append(header, "div", "", "rte-dialog-browser-title");
|
|
169
|
+
title.innerText = "Image gallery";
|
|
170
|
+
var copy = append(header, "div", "", "rte-dialog-browser-copy");
|
|
171
|
+
copy.innerText = "Browse uploaded assets, filter by name, and insert the selected image into the editor.";
|
|
172
|
+
|
|
173
|
+
var toolbar = append(browser, "div", "", "rte-gallery-browser-toolbar");
|
|
174
|
+
var path = append(toolbar, "div", "", "rte-gallery-browser-path");
|
|
175
|
+
path.innerText = "/";
|
|
176
|
+
var type = append(toolbar, "div", "", "rte-gallery-browser-type");
|
|
177
|
+
type.innerText = "Image Files";
|
|
178
|
+
|
|
179
|
+
var uploadButton = append(toolbar, "button", "", "rte-gallery-browser-button");
|
|
180
|
+
uploadButton.type = "button";
|
|
181
|
+
uploadButton.innerText = "Upload";
|
|
182
|
+
|
|
183
|
+
var refreshButton = append(toolbar, "button", "", "rte-gallery-browser-button");
|
|
184
|
+
refreshButton.type = "button";
|
|
185
|
+
refreshButton.innerText = "Refresh";
|
|
186
|
+
|
|
187
|
+
var search = append(toolbar, "input", "", "rte-gallery-browser-search");
|
|
188
|
+
search.type = "search";
|
|
189
|
+
search.placeholder = "Search images";
|
|
190
|
+
|
|
191
|
+
var fileInput = append(toolbar, "input", "display:none;");
|
|
192
|
+
fileInput.type = "file";
|
|
193
|
+
fileInput.accept = "image/*,.jpg,.jpeg,.png,.gif,.bmp,.webp,.svg";
|
|
194
|
+
fileInput.multiple = true;
|
|
195
|
+
|
|
196
|
+
var status = append(browser, "div", "", "rte-gallery-browser-status");
|
|
197
|
+
var surface = append(browser, "div", "", "rte-gallery-browser-surface");
|
|
198
|
+
var grid = append(surface, "div", "", "rte-gallery-browser-grid");
|
|
199
|
+
var empty = append(surface, "div", "", "rte-gallery-browser-empty");
|
|
200
|
+
empty.innerText = "No images match this search. Upload a file or adjust the filter.";
|
|
201
|
+
|
|
202
|
+
var footer = append(browser, "div", "", "rte-gallery-browser-footer");
|
|
203
|
+
var footerText = append(footer, "div", "", "rte-gallery-browser-footer-text");
|
|
204
|
+
footerText.innerText = "Choose an image to enable insert.";
|
|
205
|
+
|
|
206
|
+
var cancelButton = append(footer, "button", "", "rte-gallery-browser-button");
|
|
207
|
+
cancelButton.type = "button";
|
|
208
|
+
cancelButton.innerText = "Cancel";
|
|
209
|
+
|
|
210
|
+
var insertButton = append(footer, "button", "", "rte-gallery-browser-button rte-gallery-browser-button-primary");
|
|
211
|
+
insertButton.type = "button";
|
|
212
|
+
insertButton.innerText = "Insert";
|
|
213
|
+
insertButton.disabled = true;
|
|
214
|
+
|
|
215
|
+
var selectedUrl = "";
|
|
216
|
+
|
|
217
|
+
function getNormalizedItems() {
|
|
218
|
+
var list = [];
|
|
219
|
+
var items = config.galleryImages || [];
|
|
220
|
+
var i;
|
|
221
|
+
for (i = 0; i < items.length; i++) {
|
|
222
|
+
var normalized = normalizeGalleryItem(items[i]);
|
|
223
|
+
if (normalized) {
|
|
224
|
+
list.push(normalized);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return list;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function getFilteredItems() {
|
|
231
|
+
var keyword = search.value.replace(/^\s+|\s+$/g, "").toLowerCase();
|
|
232
|
+
var items = getNormalizedItems();
|
|
233
|
+
if (!keyword) {
|
|
234
|
+
return items;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
return items.filter(function (item) {
|
|
238
|
+
return (item.name && item.name.toLowerCase().indexOf(keyword) >= 0)
|
|
239
|
+
|| (item.meta && item.meta.toLowerCase().indexOf(keyword) >= 0)
|
|
240
|
+
|| (item.url && item.url.toLowerCase().indexOf(keyword) >= 0);
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function updateStatus(items) {
|
|
245
|
+
var selectedName = "";
|
|
246
|
+
var i;
|
|
247
|
+
for (i = 0; i < items.length; i++) {
|
|
248
|
+
if (items[i].url === selectedUrl) {
|
|
249
|
+
selectedName = items[i].name;
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
status.innerText = items.length + " item" + (items.length === 1 ? "" : "s") + " available."
|
|
255
|
+
+ (selectedName ? " " + selectedName + " selected." : " No image selected.");
|
|
256
|
+
footerText.innerText = selectedName ? ("Ready to insert " + selectedName + ".") : "Choose an image to enable insert.";
|
|
257
|
+
insertButton.disabled = !selectedName;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function insertSelected() {
|
|
261
|
+
if (!selectedUrl) {
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
editor.insertImageByUrl(selectedUrl);
|
|
265
|
+
closeDialog();
|
|
266
|
+
editor.focus();
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
function render() {
|
|
270
|
+
clear(grid);
|
|
271
|
+
var items = getFilteredItems();
|
|
272
|
+
var i;
|
|
273
|
+
|
|
274
|
+
empty.style.display = items.length ? "none" : "block";
|
|
275
|
+
|
|
276
|
+
for (i = 0; i < items.length; i++) {
|
|
277
|
+
(function (item) {
|
|
278
|
+
var card = append(grid, "button", "", "rte-gallery-browser-card");
|
|
279
|
+
card.type = "button";
|
|
280
|
+
if (item.url === selectedUrl) {
|
|
281
|
+
card.classList.add("is-selected");
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
var selection = append(card, "div", "", "rte-gallery-browser-selection");
|
|
285
|
+
selection.innerText = item.url === selectedUrl ? "Selected" : "";
|
|
286
|
+
|
|
287
|
+
var thumb = append(card, "div", "", "rte-gallery-browser-thumbnail");
|
|
288
|
+
var image = append(thumb, "img", "", "rte-gallery-browser-thumbnail-image");
|
|
289
|
+
image.src = item.thumbnail;
|
|
290
|
+
image.alt = item.name;
|
|
291
|
+
|
|
292
|
+
var name = append(card, "div", "", "rte-gallery-browser-name");
|
|
293
|
+
name.innerText = item.name;
|
|
294
|
+
|
|
295
|
+
var meta = append(card, "div", "", "rte-gallery-browser-meta");
|
|
296
|
+
meta.innerText = getMetaText(item);
|
|
297
|
+
|
|
298
|
+
card.onclick = function () {
|
|
299
|
+
selectedUrl = item.url;
|
|
300
|
+
render();
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
card.ondblclick = function () {
|
|
304
|
+
selectedUrl = item.url;
|
|
305
|
+
insertSelected();
|
|
306
|
+
};
|
|
307
|
+
})(items[i]);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
if (selectedUrl) {
|
|
311
|
+
var stillVisible = false;
|
|
312
|
+
for (i = 0; i < items.length; i++) {
|
|
313
|
+
if (items[i].url === selectedUrl) {
|
|
314
|
+
stillVisible = true;
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
if (!stillVisible) {
|
|
319
|
+
selectedUrl = "";
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
updateStatus(items);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
uploadButton.onclick = function () {
|
|
327
|
+
fileInput.click();
|
|
328
|
+
};
|
|
329
|
+
|
|
330
|
+
fileInput.onchange = function () {
|
|
331
|
+
var lastUploaded = "";
|
|
332
|
+
status.innerText = "Uploading images...";
|
|
333
|
+
|
|
334
|
+
uploadFiles(fileInput.files, function (url) {
|
|
335
|
+
lastUploaded = url;
|
|
336
|
+
config.galleryImages.unshift(url);
|
|
337
|
+
}, function () {
|
|
338
|
+
if (lastUploaded) {
|
|
339
|
+
selectedUrl = lastUploaded;
|
|
340
|
+
}
|
|
341
|
+
fileInput.value = "";
|
|
342
|
+
render();
|
|
343
|
+
}, function (error) {
|
|
344
|
+
status.innerText = error || "Upload failed.";
|
|
345
|
+
});
|
|
346
|
+
};
|
|
347
|
+
|
|
348
|
+
refreshButton.onclick = render;
|
|
349
|
+
search.oninput = render;
|
|
350
|
+
cancelButton.onclick = closeDialog;
|
|
351
|
+
insertButton.onclick = insertSelected;
|
|
352
|
+
|
|
353
|
+
render();
|
|
354
|
+
search.focus();
|
|
355
|
+
};
|
|
356
|
+
}
|