@inpageedit/core 0.14.5 → 0.15.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 (71) hide show
  1. package/dist/{BasePlugin-DD7l-5Xw.js → BasePlugin-BCVSn9QJ.js} +2 -2
  2. package/dist/{BasePlugin-DD7l-5Xw.js.map → BasePlugin-BCVSn9QJ.js.map} +1 -1
  3. package/dist/InputBox-CZ1v4_l3.js +50 -0
  4. package/dist/InputBox-CZ1v4_l3.js.map +1 -0
  5. package/dist/PluginImagesUsed-Bq_C_rgg.js +90 -0
  6. package/dist/PluginImagesUsed-Bq_C_rgg.js.map +1 -0
  7. package/dist/{PluginPrefSync-CbFuuC19.js → PluginPrefSync-DP5NyPnI.js} +4 -4
  8. package/dist/{PluginPrefSync-CbFuuC19.js.map → PluginPrefSync-DP5NyPnI.js.map} +1 -1
  9. package/dist/{PluginStoreApp-MbC3G9tu.js → PluginStoreApp-_YWpLgfs.js} +2 -2
  10. package/dist/{PluginStoreApp-MbC3G9tu.js.map → PluginStoreApp-_YWpLgfs.js.map} +1 -1
  11. package/dist/PluginTemplatesUsed-DS_rHctR.js +76 -0
  12. package/dist/PluginTemplatesUsed-DS_rHctR.js.map +1 -0
  13. package/dist/Preferences-DqtjY7XU.js +1541 -0
  14. package/dist/Preferences-DqtjY7XU.js.map +1 -0
  15. package/dist/browser-DR-yCqVg.js +1160 -0
  16. package/dist/browser-DR-yCqVg.js.map +1 -0
  17. package/dist/components/index.js +1 -1
  18. package/dist/{index-BpQ6VGMz.js → index-B9VO3swL.js} +108 -63
  19. package/dist/index-B9VO3swL.js.map +1 -0
  20. package/dist/{index-BanevHQ2.js → index-C3t-Xj3e.js} +85 -82
  21. package/dist/index-C3t-Xj3e.js.map +1 -0
  22. package/dist/{index-WfXtYVMt.js → index-CS1kidKF.js} +149 -117
  23. package/dist/index-CS1kidKF.js.map +1 -0
  24. package/dist/index-Cb2_vqBl.js +44 -0
  25. package/dist/index-Cb2_vqBl.js.map +1 -0
  26. package/dist/{index-B3jld2sl.js → index-CbdkXGs7.js} +4 -4
  27. package/dist/{index-B3jld2sl.js.map → index-CbdkXGs7.js.map} +1 -1
  28. package/dist/{index-DxaqNWv4.js → index-CcAmmXbb.js} +904 -704
  29. package/dist/index-CcAmmXbb.js.map +1 -0
  30. package/dist/index-Cq8xPcEY.js +170 -0
  31. package/dist/index-Cq8xPcEY.js.map +1 -0
  32. package/dist/{index-DensW9qt.js → index-DPA1ptYq.js} +5 -5
  33. package/dist/index-DPA1ptYq.js.map +1 -0
  34. package/dist/{index-BjDTD66_.js → index-DVvsTsLI.js} +29 -15
  35. package/dist/index-DVvsTsLI.js.map +1 -0
  36. package/dist/{index-CnR6CqkM.js → index-DjyjqpeO.js} +2 -2
  37. package/dist/{index-CnR6CqkM.js.map → index-DjyjqpeO.js.map} +1 -1
  38. package/dist/index-FvMu0Ka0.js +342 -0
  39. package/dist/index-FvMu0Ka0.js.map +1 -0
  40. package/dist/index-mFwJhDwE.js +168 -0
  41. package/dist/index-mFwJhDwE.js.map +1 -0
  42. package/dist/{index-De25v1_Q.js → index-n5KKWE9v.js} +6 -6
  43. package/dist/index-n5KKWE9v.js.map +1 -0
  44. package/dist/{index-DKCZDN-Q.js → index-rKL4D_7I.js} +5 -5
  45. package/dist/{index-DKCZDN-Q.js.map → index-rKL4D_7I.js.map} +1 -1
  46. package/dist/index.d.ts +334 -148
  47. package/dist/index.js +5 -5
  48. package/dist/models/index.js +1 -1
  49. package/dist/plugins/index.js +18 -14
  50. package/dist/plugins/index.js.map +1 -1
  51. package/dist/services/index.js +9 -8
  52. package/dist/style.css +1 -1
  53. package/lib/index.umd.js +14 -12
  54. package/lib/index.umd.js.map +1 -1
  55. package/lib/style.css +1 -1
  56. package/package.json +4 -2
  57. package/dist/InputBox-nQKtiWtZ.js +0 -30
  58. package/dist/InputBox-nQKtiWtZ.js.map +0 -1
  59. package/dist/Preferences-C10tZMl1.js +0 -2701
  60. package/dist/Preferences-C10tZMl1.js.map +0 -1
  61. package/dist/index-7R2LfhNn.js +0 -220
  62. package/dist/index-7R2LfhNn.js.map +0 -1
  63. package/dist/index-BXNyXvre.js +0 -116
  64. package/dist/index-BXNyXvre.js.map +0 -1
  65. package/dist/index-BanevHQ2.js.map +0 -1
  66. package/dist/index-BjDTD66_.js.map +0 -1
  67. package/dist/index-BpQ6VGMz.js.map +0 -1
  68. package/dist/index-De25v1_Q.js.map +0 -1
  69. package/dist/index-DensW9qt.js.map +0 -1
  70. package/dist/index-DxaqNWv4.js.map +0 -1
  71. package/dist/index-WfXtYVMt.js.map +0 -1
@@ -0,0 +1,342 @@
1
+ import { j as t } from "./index-CM_6yF2v.js";
2
+ import { R as B, I as j, S as U } from "./Preferences-DqtjY7XU.js";
3
+ import { B as I } from "./BasePlugin-BCVSn9QJ.js";
4
+ import { I as b, C as M } from "./InputBox-CZ1v4_l3.js";
5
+ const q = (a) => /* @__PURE__ */ t(
6
+ "svg",
7
+ {
8
+ xmlns: "http://www.w3.org/2000/svg",
9
+ width: "24",
10
+ height: "24",
11
+ viewBox: "0 0 24 24",
12
+ fill: "none",
13
+ stroke: "currentColor",
14
+ "stroke-width": "2",
15
+ "stroke-linecap": "round",
16
+ "stroke-linejoin": "round",
17
+ ...a,
18
+ class: `icon icon-tabler icons-tabler-outline icon-tabler-upload ${a.className || ""}`,
19
+ children: [
20
+ /* @__PURE__ */ t("path", { stroke: "none", d: "M0 0h24v24H0z", fill: "none" }),
21
+ /* @__PURE__ */ t("path", { d: "M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2" }),
22
+ /* @__PURE__ */ t("path", { d: "M7 9l5 -5l5 5" }),
23
+ /* @__PURE__ */ t("path", { d: "M12 4l0 12" })
24
+ ]
25
+ }
26
+ );
27
+ var L = Object.create, F = Object.defineProperty, Q = Object.getOwnPropertyDescriptor, S = (a, e) => (e = Symbol[a]) ? e : Symbol.for("Symbol." + a), D = (a) => {
28
+ throw TypeError(a);
29
+ }, $ = (a, e, r) => e in a ? F(a, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : a[e] = r, A = (a, e) => F(a, "name", { value: e, configurable: !0 }), O = (a) => [, , , L(a?.[S("metadata")] ?? null)], z = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], N = (a) => a !== void 0 && typeof a != "function" ? D("Function expected") : a, W = (a, e, r, n, l) => ({ kind: z[a], name: e, metadata: n, addInitializer: (p) => r._ ? D("Already initialized") : l.push(N(p || null)) }), X = (a, e) => $(e, S("metadata"), a[3]), H = (a, e, r, n) => {
30
+ for (var l = 0, p = a[e >> 1], o = p && p.length; l < o; l++) p[l].call(r);
31
+ return n;
32
+ }, R = (a, e, r, n, l, p) => {
33
+ var o, v, x, h = e & 7, g = !1, u = 0, f = a[u] || (a[u] = []), k = h && (l = l.prototype, h < 5 && (h > 3 || !g) && Q(l, r));
34
+ A(l, r);
35
+ for (var i = n.length - 1; i >= 0; i--)
36
+ x = W(h, r, v = {}, a[3], f), o = (0, n[i])(l, x), v._ = 1, N(o) && (l = o);
37
+ return X(a, l), k && F(l, r, k), g ? h ^ 4 ? p : k : l;
38
+ }, T, P, C;
39
+ const G = ({ $: a }) => /* @__PURE__ */ t("div", { className: "ipe-quickUpload__preview-placeholder is-na", children: /* @__PURE__ */ t("span", { children: [
40
+ /* @__PURE__ */ t(
41
+ "svg",
42
+ {
43
+ xmlns: "http://www.w3.org/2000/svg",
44
+ width: "24",
45
+ height: "24",
46
+ viewBox: "0 0 24 24",
47
+ fill: "currentColor",
48
+ class: "icon icon-tabler icons-tabler-filled icon-tabler-file-unknown",
49
+ children: [
50
+ /* @__PURE__ */ t("path", { stroke: "none", d: "M0 0h24v24H0z", fill: "none" }),
51
+ /* @__PURE__ */ t("path", { d: "M12 2l.117 .007a1 1 0 0 1 .876 .876l.007 .117v4l.005 .15a2 2 0 0 0 1.838 1.844l.157 .006h4l.117 .007a1 1 0 0 1 .876 .876l.007 .117v9a3 3 0 0 1 -2.824 2.995l-.176 .005h-10a3 3 0 0 1 -2.995 -2.824l-.005 -.176v-14a3 3 0 0 1 2.824 -2.995l.176 -.005zm0 15a1 1 0 0 0 -.993 .883l-.007 .127a1 1 0 0 0 1.993 .117l.007 -.127a1 1 0 0 0 -1 -1m1.136 -5.727a2.5 2.5 0 0 0 -3.037 .604a1 1 0 0 0 1.434 1.389l.088 -.09a.5 .5 0 1 1 .379 .824a1 1 0 0 0 -.002 2a2.5 2.5 0 0 0 1.137 -4.727" }),
52
+ /* @__PURE__ */ t("path", { d: "M19 7h-4l-.001 -4.001z" })
53
+ ]
54
+ }
55
+ ),
56
+ /* @__PURE__ */ t("p", { children: a`No preview available` })
57
+ ] }) });
58
+ T = [B(
59
+ U.object({
60
+ "quickUpload.summary": U.string().description("Default summary of the quick upload").default("[IPE-NEXT] Quick upload")
61
+ })
62
+ ), j(["modal", "$", "wikiTitle", "wikiFile", "quickPreview", "preferences"])];
63
+ class y extends (C = I) {
64
+ constructor(e) {
65
+ super(e, {}, "quick-upload"), this.ctx = e;
66
+ }
67
+ async start() {
68
+ this.injectQuickEdit(), this.injectToolbox(), this.ctx.set("quickUpload", this);
69
+ }
70
+ async stop() {
71
+ }
72
+ injectQuickEdit() {
73
+ }
74
+ injectToolbox() {
75
+ const { $: e } = this.ctx;
76
+ this.ctx.inject(["toolbox"], (r) => {
77
+ r.toolbox.addButton({
78
+ id: "quick-upload",
79
+ group: "group2",
80
+ index: 2,
81
+ icon: /* @__PURE__ */ t(q, {}),
82
+ tooltip: () => e`Quick Upload`,
83
+ onClick: (n) => {
84
+ n.preventDefault(), this.showModal();
85
+ }
86
+ }), r.on("dispose", () => {
87
+ r.toolbox.removeButton("quick-upload");
88
+ });
89
+ });
90
+ }
91
+ formatFileSize(e = 0) {
92
+ if (e = Number(e), !Number.isFinite(e) || e < 0)
93
+ return "0 B";
94
+ const r = ["B", "KB", "MB", "GB", "TB"];
95
+ let n = 0;
96
+ for (; e >= 1024 && n < r.length - 1; )
97
+ e /= 1024, n++;
98
+ return `${new Intl.NumberFormat(void 0, {
99
+ maximumFractionDigits: 2
100
+ }).format(e)} ${r[n]}`;
101
+ }
102
+ getDefaultPreviewPlaceholder() {
103
+ const { $: e } = this.ctx;
104
+ return /* @__PURE__ */ t("div", { className: "ipe-quickUpload__preview-placeholder", children: /* @__PURE__ */ t("span", { children: [
105
+ /* @__PURE__ */ t(q, {}),
106
+ /* @__PURE__ */ t("p", { children: e`Drag & drop a file here` })
107
+ ] }) });
108
+ }
109
+ isFileAccepted(e, r) {
110
+ if (!r) return !0;
111
+ const n = r.split(",").map((o) => o.trim()).filter(Boolean);
112
+ if (!n.length) return !0;
113
+ const l = e.type || "", p = e.name || "";
114
+ return n.some((o) => {
115
+ if (o.startsWith("."))
116
+ return p.toLowerCase().endsWith(o.toLowerCase());
117
+ if (o.endsWith("/*")) {
118
+ const v = o.slice(0, -1);
119
+ return l.startsWith(v);
120
+ }
121
+ return l === o;
122
+ });
123
+ }
124
+ async showModal() {
125
+ const { $: e } = this.ctx, r = this.ctx.modal.show({
126
+ className: "ipe-quickUpload compact-buttons",
127
+ sizeClass: "smallToMedium",
128
+ center: !1,
129
+ title: e`Quick Upload`,
130
+ content: e`Quick Upload`,
131
+ outSideClose: !1
132
+ });
133
+ let n = !1;
134
+ const l = () => {
135
+ u.reset(), p(), g = !1;
136
+ }, p = async (i) => {
137
+ if (f.innerHTML = "", !i) {
138
+ f.appendChild(this.getDefaultPreviewPlaceholder());
139
+ return;
140
+ }
141
+ g || (u.querySelector('input[name="filename"]').value = i.name);
142
+ const d = await this.ctx.quickPreview.getPreviewElement(i) || /* @__PURE__ */ t(G, { $: e });
143
+ f.appendChild(
144
+ /* @__PURE__ */ t("div", { className: "ipe-quickUpload__preview-content", children: d })
145
+ ), f.appendChild(
146
+ /* @__PURE__ */ t("section", { className: "ipe-quickUpload__preview-info", children: /* @__PURE__ */ t("ul", { children: [
147
+ /* @__PURE__ */ t("li", { children: /* @__PURE__ */ t("strong", { children: i.name }) }),
148
+ /* @__PURE__ */ t("li", { children: /* @__PURE__ */ t("i", { children: i.type }) }),
149
+ /* @__PURE__ */ t("li", { children: this.formatFileSize(i.size) })
150
+ ] }) })
151
+ );
152
+ }, o = async (i) => {
153
+ if (i.preventDefault(), n)
154
+ return !1;
155
+ const d = new FormData(u), m = Object.fromEntries(d.entries());
156
+ n = !0, r.setLoadingState(!0), this.ctx.emit("analytics/event", {
157
+ feature: "quick-upload",
158
+ page: m.filename?.toString() || void 0
159
+ });
160
+ try {
161
+ const s = await this.ctx.wikiFile.upload(m);
162
+ if (this.logger.debug(s), s.data?.upload?.result === "Success")
163
+ return this.ctx.modal.notify("success", {
164
+ title: e`Upload successful`,
165
+ content: /* @__PURE__ */ t("div", { children: [
166
+ /* @__PURE__ */ t("p", { children: /* @__PURE__ */ t("strong", { children: e`File has been uploaded successfully.` }) }),
167
+ /* @__PURE__ */ t("p", { children: /* @__PURE__ */ t(
168
+ "a",
169
+ {
170
+ href: this.ctx.wikiFile.getFileUrl(`File:${s.data.upload.filename}`),
171
+ target: "_blank",
172
+ rel: "noopener noreferrer",
173
+ children: s.data.upload.filename
174
+ }
175
+ ) })
176
+ ] }),
177
+ closeAfter: 10 * 1e3
178
+ }), l(), !0;
179
+ throw s;
180
+ } catch (s) {
181
+ if (this.ctx.logger.error(s), s?.data?.upload) {
182
+ const c = s.data.upload;
183
+ if (c.result === "Success")
184
+ return !0;
185
+ if (Array.isArray(c.warnings?.duplicate) && c.warnings.duplicate.length > 0)
186
+ return this.ctx.modal.dialog({
187
+ title: e`File duplicated`,
188
+ content: /* @__PURE__ */ t("div", { children: [
189
+ e`This file is a duplicate of the following file:`,
190
+ /* @__PURE__ */ t("ol", { children: c.warnings.duplicate.map((_) => /* @__PURE__ */ t("li", { children: /* @__PURE__ */ t(
191
+ "a",
192
+ {
193
+ href: this.ctx.wikiFile.getFileUrl(`File:${_}`),
194
+ target: "_blank",
195
+ rel: "noopener noreferrer",
196
+ children: _
197
+ }
198
+ ) }, _)) })
199
+ ] })
200
+ }), !1;
201
+ if (c.warnings?.exists)
202
+ return this.ctx.modal.dialog({
203
+ title: e`File already exists`,
204
+ content: e`There is a file with the same name already exists.`
205
+ }), !1;
206
+ }
207
+ let w = [];
208
+ if (s instanceof Error) {
209
+ w.push(s.message);
210
+ let c = s;
211
+ for (; c.cause && (c = c.cause, c instanceof Error); )
212
+ w.push(c.message);
213
+ } else
214
+ w.push(e`Upload failed with unknown error.`);
215
+ return this.ctx.modal.dialog({
216
+ title: e`Upload failed`,
217
+ content: /* @__PURE__ */ t("div", { style: { whiteSpace: "pre-wrap" }, children: w.join(`
218
+ `) })
219
+ }), !1;
220
+ } finally {
221
+ r.setLoadingState(!1), n = !1;
222
+ }
223
+ }, v = (i) => {
224
+ i.preventDefault(), i.stopPropagation(), i.currentTarget?.classList.remove("is-dragover");
225
+ const m = u.querySelector('input[type="file"]');
226
+ if (!m) return;
227
+ const s = Array.from(i.dataTransfer?.files || []);
228
+ if (!s.length) return;
229
+ const w = m.accept || "", c = s.find((E) => this.isFileAccepted(E, w)) || null;
230
+ if (!c)
231
+ return;
232
+ const _ = new DataTransfer();
233
+ _.items.add(c), m.files = _.files, m.dispatchEvent(new Event("change", { bubbles: !0 }));
234
+ }, x = (i) => {
235
+ i.preventDefault(), i.stopPropagation();
236
+ const d = i.currentTarget;
237
+ i.dataTransfer && (i.dataTransfer.dropEffect = "copy"), d?.classList.add("is-dragover");
238
+ }, h = (i) => {
239
+ i.preventDefault(), i.stopPropagation(), i.currentTarget?.classList.remove("is-dragover");
240
+ };
241
+ let g = !1;
242
+ const u = /* @__PURE__ */ t("form", { onSubmit: o, className: "ipe-quickUpload__form", children: [
243
+ /* @__PURE__ */ t(
244
+ b,
245
+ {
246
+ label: e`File name`,
247
+ name: "filename",
248
+ id: "filename",
249
+ placeholder: "Example.jpg",
250
+ required: !0,
251
+ inputProps: {
252
+ onInput: () => {
253
+ g = !0;
254
+ }
255
+ }
256
+ }
257
+ ),
258
+ /* @__PURE__ */ t(b, { label: e`File`, name: "file", id: "file", required: !0, children: /* @__PURE__ */ t(
259
+ "input",
260
+ {
261
+ required: !0,
262
+ type: "file",
263
+ name: "file",
264
+ id: "file",
265
+ accept: "image/*,video/*,audio/*,application/pdf",
266
+ onChange: (i) => {
267
+ const d = i.target?.files?.[0];
268
+ d?.size && p(d);
269
+ }
270
+ }
271
+ ) }),
272
+ /* @__PURE__ */ t(
273
+ b,
274
+ {
275
+ label: e`Summary`,
276
+ id: "summary",
277
+ name: "comment",
278
+ placeholder: "Upload file from ...",
279
+ value: await this.ctx.preferences.get("quickUpload.summary") || ""
280
+ }
281
+ ),
282
+ /* @__PURE__ */ t("div", { className: "ipe-input-box", children: [
283
+ /* @__PURE__ */ t("label", { htmlFor: "text", children: e`File description` }),
284
+ /* @__PURE__ */ t(
285
+ "textarea",
286
+ {
287
+ name: "text",
288
+ id: "text",
289
+ placeholder: `This file is for...
290
+ [[Category:XXX]]`
291
+ }
292
+ )
293
+ ] }),
294
+ /* @__PURE__ */ t(M, { name: "ignorewarnings", label: e`Ignore warnings and upload anyway` })
295
+ ] }), f = /* @__PURE__ */ t(
296
+ "div",
297
+ {
298
+ className: "ipe-quickUpload__preview",
299
+ onClick: (i) => {
300
+ const d = i.target;
301
+ d && d.closest("img, .ipe-quickUpload__preview-placeholder") && (i.preventDefault(), u.querySelector('input[type="file"]').click());
302
+ },
303
+ children: this.getDefaultPreviewPlaceholder()
304
+ }
305
+ ), k = /* @__PURE__ */ t(
306
+ "section",
307
+ {
308
+ className: "ipe-quickUpload__container",
309
+ onDrop: v,
310
+ onDragOver: x,
311
+ onDragLeave: h,
312
+ children: [
313
+ f,
314
+ u
315
+ ]
316
+ }
317
+ );
318
+ return r.setContent(k), r.setButtons([
319
+ {
320
+ label: e`Cancel`,
321
+ className: "is-danger is-text",
322
+ method: (i) => {
323
+ r.close();
324
+ }
325
+ },
326
+ {
327
+ label: e`Upload`,
328
+ className: "is-primary is-text",
329
+ method: (i) => {
330
+ u.requestSubmit();
331
+ }
332
+ }
333
+ ]), r;
334
+ }
335
+ }
336
+ P = O(C);
337
+ y = R(P, 0, "PluginQuickUpload", T, y);
338
+ H(P, 1, y);
339
+ export {
340
+ y as PluginQuickUpload
341
+ };
342
+ //# sourceMappingURL=index-FvMu0Ka0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-FvMu0Ka0.js","sources":["../src/components/Icon/IconUpload.tsx","../src/plugins/quick-upload/index.tsx"],"sourcesContent":["import { SVGProps } from 'jsx-dom'\n\nexport const IconUpload = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n {...props}\n class={`icon icon-tabler icons-tabler-outline icon-tabler-upload ${props.className || ''}`}\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2\" />\n <path d=\"M7 9l5 -5l5 5\" />\n <path d=\"M12 4l0 12\" />\n </svg>\n)\n","import { Inject, InPageEdit, Schema } from '@/InPageEdit'\n\nimport './style.scss'\nimport { UploadFileResult } from '@/services/WikiFileService'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n quickUpload: PluginQuickUpload\n }\n interface Preferences {\n 'quickUpload.summary': string\n }\n}\n\nconst PreviewPlaceholderNA = ({ $ }: { $: (strings: TemplateStringsArray) => string }) => (\n <div className=\"ipe-quickUpload__preview-placeholder is-na\">\n <span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n class=\"icon icon-tabler icons-tabler-filled icon-tabler-file-unknown\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M12 2l.117 .007a1 1 0 0 1 .876 .876l.007 .117v4l.005 .15a2 2 0 0 0 1.838 1.844l.157 .006h4l.117 .007a1 1 0 0 1 .876 .876l.007 .117v9a3 3 0 0 1 -2.824 2.995l-.176 .005h-10a3 3 0 0 1 -2.995 -2.824l-.005 -.176v-14a3 3 0 0 1 2.824 -2.995l.176 -.005zm0 15a1 1 0 0 0 -.993 .883l-.007 .127a1 1 0 0 0 1.993 .117l.007 -.127a1 1 0 0 0 -1 -1m1.136 -5.727a2.5 2.5 0 0 0 -3.037 .604a1 1 0 0 0 1.434 1.389l.088 -.09a.5 .5 0 1 1 .379 .824a1 1 0 0 0 -.002 2a2.5 2.5 0 0 0 1.137 -4.727\" />\n <path d=\"M19 7h-4l-.001 -4.001z\" />\n </svg>\n <p>{$`No preview available`}</p>\n </span>\n </div>\n)\n\n@RegisterPreferences(\n Schema.object({\n 'quickUpload.summary': Schema.string()\n .description('Default summary of the quick upload')\n .default('[IPE-NEXT] Quick upload'),\n })\n)\n@Inject(['modal', '$', 'wikiTitle', 'wikiFile', 'quickPreview', 'preferences'])\nexport class PluginQuickUpload extends BasePlugin {\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'quick-upload')\n }\n protected async start() {\n this.injectQuickEdit()\n this.injectToolbox()\n this.ctx.set('quickUpload', this)\n }\n protected async stop() {}\n\n private injectQuickEdit() {}\n private injectToolbox() {\n const { $ } = this.ctx\n this.ctx.inject(['toolbox'], (ctx) => {\n ctx.toolbox.addButton({\n id: 'quick-upload',\n group: 'group2',\n index: 2,\n icon: <IconUpload />,\n tooltip: () => $`Quick Upload`,\n onClick: (e) => {\n e.preventDefault()\n this.showModal()\n },\n })\n ctx.on('dispose', () => {\n ctx.toolbox.removeButton('quick-upload')\n })\n })\n }\n\n private formatFileSize(size: number = 0) {\n size = Number(size)\n if (!Number.isFinite(size) || size < 0) {\n return '0 B'\n }\n\n const units = ['B', 'KB', 'MB', 'GB', 'TB']\n let index = 0\n\n while (size >= 1024 && index < units.length - 1) {\n size /= 1024\n index++\n }\n\n // 使用 Intl 来格式化数字(自动处理千分位、小数等)\n const formatter = new Intl.NumberFormat(undefined, {\n maximumFractionDigits: 2,\n })\n\n return `${formatter.format(size)} ${units[index]}`\n }\n\n private getDefaultPreviewPlaceholder() {\n const { $ } = this.ctx\n return (\n <div className=\"ipe-quickUpload__preview-placeholder\">\n <span>\n <IconUpload />\n <p>{$`Drag & drop a file here`}</p>\n </span>\n </div>\n )\n }\n\n private isFileAccepted(file: File, accept: string): boolean {\n if (!accept) return true\n const rules = accept\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean)\n if (!rules.length) return true\n const fileType = file.type || ''\n const fileName = file.name || ''\n return rules.some((rule) => {\n // extension: .png .pdf\n if (rule.startsWith('.')) {\n return fileName.toLowerCase().endsWith(rule.toLowerCase())\n }\n // image/*, video/* ...\n if (rule.endsWith('/*')) {\n const prefix = rule.slice(0, -1) // keep the trailing slash\n return fileType.startsWith(prefix)\n }\n // exact mime\n return fileType === rule\n })\n }\n\n async showModal() {\n const { $ } = this.ctx\n\n const modal = this.ctx.modal.show({\n className: 'ipe-quickUpload compact-buttons',\n sizeClass: 'smallToMedium',\n center: false,\n title: $`Quick Upload`,\n content: $`Quick Upload`,\n outSideClose: false,\n })\n\n let isUploading = false\n const resetForm = () => {\n formEl.reset()\n handlePreview()\n isInputFileName = false\n }\n const handlePreview = async (file?: File) => {\n previewWrapper.innerHTML = ''\n if (!file) {\n previewWrapper.appendChild(this.getDefaultPreviewPlaceholder())\n return\n }\n if (!isInputFileName) {\n formEl.querySelector<HTMLInputElement>('input[name=\"filename\"]')!.value = file.name\n }\n const previewEl = (await this.ctx.quickPreview.getPreviewElement(file)) || (\n <PreviewPlaceholderNA $={$} />\n )\n previewWrapper.appendChild(\n <div className=\"ipe-quickUpload__preview-content\">{previewEl}</div>\n )\n previewWrapper.appendChild(\n <section className=\"ipe-quickUpload__preview-info\">\n <ul>\n <li>\n <strong>{file.name}</strong>\n </li>\n <li>\n <i>{file.type}</i>\n </li>\n <li>{this.formatFileSize(file.size)}</li>\n </ul>\n </section>\n )\n }\n const handleSubmit = async (e: Event) => {\n e.preventDefault()\n if (isUploading) {\n return false\n }\n\n const formData = new FormData(formEl)\n const body = Object.fromEntries(formData.entries())\n\n isUploading = true\n modal.setLoadingState(true)\n\n this.ctx.emit('analytics/event', {\n feature: 'quick-upload',\n page: body.filename?.toString() || undefined,\n })\n\n try {\n const result = await this.ctx.wikiFile.upload(body)\n this.logger.debug(result)\n\n if (result.data?.upload?.result === 'Success') {\n this.ctx.modal.notify('success', {\n title: $`Upload successful`,\n content: (\n <div>\n <p>\n <strong>{$`File has been uploaded successfully.`}</strong>\n </p>\n <p>\n <a\n href={this.ctx.wikiFile.getFileUrl(`File:${result.data.upload.filename}`)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {result.data.upload.filename}\n </a>\n </p>\n </div>\n ),\n closeAfter: 10 * 1000,\n })\n resetForm()\n return true\n }\n\n // Handle errors\n throw result\n } catch (e) {\n this.ctx.logger.error(e)\n\n if ((e as any)?.data?.upload) {\n const uploadResult = (e as any).data.upload as UploadFileResult\n if (uploadResult.result === 'Success') {\n // 理论上不会走到这里,只是为了类型体操\n return true\n }\n if (\n Array.isArray(uploadResult.warnings?.duplicate) &&\n uploadResult.warnings.duplicate.length > 0\n ) {\n this.ctx.modal.dialog({\n title: $`File duplicated`,\n content: (\n <div>\n {$`This file is a duplicate of the following file:`}\n <ol>\n {uploadResult.warnings.duplicate.map((fname) => (\n <li key={fname}>\n <a\n href={this.ctx.wikiFile.getFileUrl(`File:${fname}`)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {fname}\n </a>\n </li>\n ))}\n </ol>\n </div>\n ),\n })\n return false\n }\n if (uploadResult.warnings?.exists) {\n this.ctx.modal.dialog({\n title: $`File already exists`,\n content: $`There is a file with the same name already exists.`,\n })\n return false\n }\n }\n\n let msg = []\n if (e instanceof Error) {\n msg.push(e.message)\n let cur = e\n while ((cur as any).cause) {\n cur = (cur as any).cause\n if (cur instanceof Error) {\n msg.push(cur.message)\n } else {\n break\n }\n }\n } else {\n msg.push($`Upload failed with unknown error.`)\n }\n\n this.ctx.modal.dialog({\n title: $`Upload failed`,\n content: <div style={{ whiteSpace: 'pre-wrap' }}>{msg.join('\\n')}</div>,\n })\n return false\n } finally {\n modal.setLoadingState(false)\n isUploading = false\n }\n }\n const handleDrop = (e: DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n const container = e.currentTarget as HTMLElement\n container?.classList.remove('is-dragover')\n const fileInput = formEl.querySelector<HTMLInputElement>('input[type=\"file\"]')\n if (!fileInput) return\n const files = Array.from(e.dataTransfer?.files || [])\n if (!files.length) return\n const accept = fileInput.accept || ''\n const picked = files.find((f) => this.isFileAccepted(f, accept)) || null\n if (!picked) {\n // 不符合 accept 的文件,不做处理\n return\n }\n const dt = new DataTransfer()\n dt.items.add(picked)\n fileInput.files = dt.files\n // 触发原有 onChange 逻辑(包含预览)\n fileInput.dispatchEvent(new Event('change', { bubbles: true }))\n }\n const handleDragOver = (e: DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n const container = e.currentTarget as HTMLElement\n if (e.dataTransfer) {\n e.dataTransfer.dropEffect = 'copy'\n }\n container?.classList.add('is-dragover')\n }\n const handleDragLeave = (e: DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n const container = e.currentTarget as HTMLElement\n container?.classList.remove('is-dragover')\n }\n\n let isInputFileName = false\n const formEl = (\n <form onSubmit={handleSubmit} className=\"ipe-quickUpload__form\">\n <InputBox\n label={$`File name`}\n name=\"filename\"\n id=\"filename\"\n placeholder=\"Example.jpg\"\n required={true}\n inputProps={{\n onInput: () => {\n isInputFileName = true\n },\n }}\n />\n <InputBox label={$`File`} name=\"file\" id=\"file\" required>\n <input\n required\n type=\"file\"\n name=\"file\"\n id=\"file\"\n accept=\"image/*,video/*,audio/*,application/pdf\"\n onChange={(e: Event) => {\n const file = (e.target as HTMLInputElement)?.files?.[0]\n if (file?.size) {\n handlePreview(file)\n }\n }}\n />\n </InputBox>\n <InputBox\n label={$`Summary`}\n id=\"summary\"\n // DO NOT CHANGE:\n // 虽然文案是 summary,但其实 API 里是 comment\n name=\"comment\"\n placeholder=\"Upload file from ...\"\n value={(await this.ctx.preferences.get('quickUpload.summary')) || ''}\n />\n <div className=\"ipe-input-box\">\n <label htmlFor=\"text\">{$`File description`}</label>\n <textarea\n name=\"text\"\n id=\"text\"\n placeholder={'This file is for...\\n[[Category:XXX]]'}\n ></textarea>\n </div>\n <CheckBox name=\"ignorewarnings\" label={$`Ignore warnings and upload anyway`} />\n </form>\n ) as HTMLFormElement\n\n const previewWrapper = (\n <div\n className=\"ipe-quickUpload__preview\"\n onClick={(e) => {\n const target = e.target\n if (\n target &&\n (target as HTMLElement).closest('img, .ipe-quickUpload__preview-placeholder')\n ) {\n e.preventDefault()\n formEl.querySelector<HTMLInputElement>('input[type=\"file\"]')!.click()\n }\n }}\n >\n {this.getDefaultPreviewPlaceholder()}\n </div>\n )\n\n const containerEl = (\n <section\n className=\"ipe-quickUpload__container\"\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n >\n {previewWrapper}\n {formEl}\n </section>\n ) as HTMLElement\n\n modal.setContent(containerEl)\n\n modal.setButtons([\n {\n label: $`Cancel`,\n className: 'is-danger is-text',\n method: (e) => {\n modal.close()\n },\n },\n {\n label: $`Upload`,\n className: 'is-primary is-text',\n method: (e) => {\n formEl.requestSubmit()\n },\n },\n ])\n\n return modal\n }\n}\n"],"names":["IconUpload","props","jsxs","jsx","_PluginQuickUpload_decorators","_init","_a","PreviewPlaceholderNA","$","RegisterPreferences","Schema","Inject","PluginQuickUpload","BasePlugin","ctx","e","size","units","index","file","accept","rules","s","fileType","fileName","rule","prefix","modal","isUploading","resetForm","formEl","handlePreview","isInputFileName","previewWrapper","previewEl","handleSubmit","formData","body","result","uploadResult","fname","msg","cur","handleDrop","fileInput","files","picked","f","dt","handleDragOver","container","handleDragLeave","InputBox","CheckBox","target","containerEl","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
@@ -0,0 +1,168 @@
1
+ import { j as o, F as j, P as T } from "./index-CM_6yF2v.js";
2
+ import { I as C, R as q, S as f } from "./Preferences-DqtjY7XU.js";
3
+ import { B as E } from "./BasePlugin-BCVSn9QJ.js";
4
+ import { m as F } from "./makeCallable-LDU0xZMJ.js";
5
+ var S = Object.create, w = Object.defineProperty, W = Object.getOwnPropertyDescriptor, _ = (n, e) => (e = Symbol[n]) ? e : Symbol.for("Symbol." + n), k = (n) => {
6
+ throw TypeError(n);
7
+ }, L = (n, e, i) => e in n ? w(n, e, { enumerable: !0, configurable: !0, writable: !0, value: i }) : n[e] = i, Q = (n, e) => w(n, "name", { value: e, configurable: !0 }), $ = (n) => [, , , S(n?.[_("metadata")] ?? null)], N = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], y = (n) => n !== void 0 && typeof n != "function" ? k("Function expected") : n, z = (n, e, i, r, t) => ({ kind: N[n], name: e, metadata: r, addInitializer: (s) => i._ ? k("Already initialized") : t.push(y(s || null)) }), I = (n, e) => L(e, _("metadata"), n[3]), R = (n, e, i, r) => {
8
+ for (var t = 0, s = n[e >> 1], a = s && s.length; t < a; t++) s[t].call(i);
9
+ return r;
10
+ }, B = (n, e, i, r, t, s) => {
11
+ var a, c, p, u = e & 7, l = !1, g = 0, x = n[g] || (n[g] = []), d = u && (t = t.prototype, u < 5 && (u > 3 || !l) && W(t, i));
12
+ Q(t, i);
13
+ for (var h = r.length - 1; h >= 0; h--)
14
+ p = z(u, i, c = {}, n[3], x), a = (0, r[h])(t, p), c._ = 1, y(a) && (t = a);
15
+ return I(n, t), d && w(t, i, d), l ? u ^ 4 ? s : d : t;
16
+ }, b, m, P;
17
+ b = [C(["api", "wikiPage", "modal", "preferences", "$"]), q(
18
+ f.object({
19
+ "quickPreview.keyshortcut": f.string().default("ctrl-i").description("Key shortcut to open quick preview in quick edit modal")
20
+ }).extra("category", "editor").description("Quick preview options")
21
+ )];
22
+ class v extends (P = E) {
23
+ constructor(e) {
24
+ super(e, {}, "quickPreview"), this.ctx = e, this._contentTypeCache = /* @__PURE__ */ new Map(), this._objectUrls = /* @__PURE__ */ new WeakMap(), this.ctx.set("quickPreview", F(this, "previewWikitext"));
25
+ }
26
+ start() {
27
+ this.ctx.on("quick-edit/wiki-page", this.injectQuickEdit.bind(this));
28
+ }
29
+ stop() {
30
+ }
31
+ previewWikitext(e, i, r, t, s) {
32
+ const { $: a } = this.ctx;
33
+ return r ||= this.ctx.wikiPage.newBlankPage({
34
+ title: "API"
35
+ }), (!t || t.isDestroyed) && (t = this.ctx.modal.createObject({
36
+ className: "in-page-edit ipe-quickPreview",
37
+ sizeClass: "large",
38
+ center: !1,
39
+ ...s
40
+ }).init()), t.show(), t.setTitle(a`Preview - Loading...`), t.setContent(/* @__PURE__ */ o(T, {})), t.bringToFront(), this.ctx.emit("quick-preview/show-modal", {
41
+ ctx: this.ctx,
42
+ text: e,
43
+ modal: t,
44
+ wikiPage: r
45
+ }), r.preview(e, i).then((c) => {
46
+ const {
47
+ data: { parse: p }
48
+ } = c;
49
+ t.setTitle(a(p.title)`Preview - {{ $1 }}`);
50
+ let u = null;
51
+ t.setContent(
52
+ /* @__PURE__ */ o("section", { children: /* @__PURE__ */ o(
53
+ "div",
54
+ {
55
+ ref: (l) => u = l,
56
+ className: "mw-parser-output",
57
+ innerHTML: p.text
58
+ }
59
+ ) })
60
+ ), window.mw?.hook && typeof jQuery == "function" && window.mw.hook("wikipage.content").fire(jQuery(u)), this.ctx.emit("quick-preview/loaded", {
61
+ ctx: this.ctx,
62
+ modal: t,
63
+ wikiPage: r,
64
+ text: e,
65
+ parseData: p
66
+ });
67
+ }).catch((c) => {
68
+ t.setTitle(a`Preview - Failed`), t.setContent(
69
+ /* @__PURE__ */ o(j, { children: [
70
+ /* @__PURE__ */ o("p", { children: a`Failed to preview` }),
71
+ /* @__PURE__ */ o("p", { children: c instanceof Error ? c.message : String(c) })
72
+ ] })
73
+ );
74
+ }), t;
75
+ }
76
+ async injectQuickEdit({ options: e, modal: i, wikiPage: r }) {
77
+ const { $: t } = this.ctx;
78
+ let s;
79
+ i.addButton(
80
+ {
81
+ label: t`Preview`,
82
+ side: "left",
83
+ className: "btn btn-secondary",
84
+ keyPress: await this.ctx.preferences.get("quickPreview.keyshortcut.quickEdit") || void 0,
85
+ method: () => {
86
+ let a = i.get$content().querySelector('textarea[name="text"]')?.value || "";
87
+ if (e.section === "new") {
88
+ const c = i.get$content().querySelector('input[name="summary"]')?.value;
89
+ c && (a = `==${c}==
90
+ ${a}`);
91
+ }
92
+ s = this.previewWikitext(
93
+ a,
94
+ void 0,
95
+ r,
96
+ s,
97
+ {
98
+ backdrop: !1,
99
+ draggable: !0
100
+ }
101
+ );
102
+ }
103
+ },
104
+ 1
105
+ ), i.on(i.Event.Close, () => {
106
+ s?.destroy(), s = void 0;
107
+ });
108
+ }
109
+ fetchContentType(e) {
110
+ const i = this._contentTypeCache.get(e);
111
+ if (i) return i;
112
+ const r = fetch(e, { method: "HEAD" }).then((t) => t.headers.get("content-type") || "").catch(() => (this._contentTypeCache.delete(e), ""));
113
+ return this._contentTypeCache.set(e, r), r;
114
+ }
115
+ async getPreviewType(e) {
116
+ if (!e) return "unknown";
117
+ let i, r;
118
+ if (e instanceof File)
119
+ i = e.type, r = e.name.split(".").pop()?.toLowerCase() || "";
120
+ else {
121
+ const t = new URL(e, location.origin);
122
+ t.protocol === "data:" || t.protocol === "blob:" || t.protocol.startsWith("http") ? i = await this.fetchContentType(t.href) : i = "", r = t.pathname.split(".").pop()?.toLowerCase() || "";
123
+ }
124
+ return i.startsWith("image/") && /** Windows provide PDFs as image/pdf */
125
+ !i.includes("pdf") ? "image" : i.startsWith("video/") ? "video" : i.startsWith("audio/") ? "audio" : i.startsWith("text/html") ? "html" : r === "md" ? "markdown" : i.startsWith("text/") ? "text" : ["jpg", "jpeg", "png", "gif", "bmp", "tiff", "ico", "webp"].includes(r) ? "image" : ["mp4", "webm", "ogg", "flv", "avi", "mov", "wmv", "mkv"].includes(r) ? "video" : ["mp3", "wav", "ogg", "flac", "aac", "m4a", "wma"].includes(r) ? "audio" : ["html", "htm"].includes(r) ? "html" : ["json", "yml", "yaml", "toml", "py"].includes(r) ? "text" : ["pdf"].includes(r) ? "pdf" : "unknown";
126
+ }
127
+ async previewFile(e, i) {
128
+ const r = await this.getPreviewElement(e, i);
129
+ return r ? this.ctx.modal.dialog({
130
+ className: "in-page-edit ipe-quickPreview",
131
+ sizeClass: "mediumToLarge",
132
+ center: !0,
133
+ title: i ?? (e instanceof File ? e.name : e),
134
+ content: /* @__PURE__ */ o("section", { className: "ipe-quickPreview__content", children: r })
135
+ }) : void 0;
136
+ }
137
+ getObjectUrl(e) {
138
+ if (!this._objectUrls.has(e)) {
139
+ const i = URL.createObjectURL(e);
140
+ this._objectUrls.set(e, i);
141
+ }
142
+ return this._objectUrls.get(e);
143
+ }
144
+ async getPreviewElement(e, i) {
145
+ const r = await this.getPreviewType(e), t = e instanceof File ? this.getObjectUrl(e) : e;
146
+ switch (r) {
147
+ case "image":
148
+ return /* @__PURE__ */ o("img", { src: t, alt: i ?? (e instanceof File ? e.name : e) });
149
+ case "video":
150
+ return /* @__PURE__ */ o("video", { src: t, controls: !0, "aria-label": i });
151
+ case "audio":
152
+ return /* @__PURE__ */ o("audio", { src: t, controls: !0, "aria-label": i });
153
+ case "pdf":
154
+ return /* @__PURE__ */ o("embed", { type: "application/pdf", src: t, "aria-label": i });
155
+ }
156
+ return null;
157
+ }
158
+ previewWikiPage(e) {
159
+ throw new Error("Not implemented");
160
+ }
161
+ }
162
+ m = $(P);
163
+ v = B(m, 0, "PluginQuickPreview", b, v);
164
+ R(m, 1, v);
165
+ export {
166
+ v as PluginQuickPreview
167
+ };
168
+ //# sourceMappingURL=index-mFwJhDwE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-mFwJhDwE.js","sources":["../src/plugins/quick-preview/index.tsx"],"sourcesContent":["import { Inject, InPageEdit, Schema } from '@/InPageEdit'\nimport { type QuickEditEventPayload } from '@/plugins/quick-edit'\nimport { IWikiPage } from '@/models/WikiPage'\nimport { MwApiParams } from 'wiki-saikou'\nimport { PageParseData } from '@/models/WikiPage/types/PageParseData'\nimport { IPEModal, IPEModalOptions } from '@inpageedit/modal'\n\nimport './style.scss'\n\ninterface QuickPreviewEventPayload {\n ctx: InPageEdit\n modal: IPEModal\n wikiPage: IWikiPage\n text: string\n parseData: PageParseData\n}\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n quickPreview: PluginQuickPreview & {\n // for backward compatibility\n (\n ...args: Parameters<PluginQuickPreview['previewWikitext']>\n ): ReturnType<PluginQuickPreview['previewWikitext']>\n }\n }\n interface Events {\n 'quick-preview/show-modal'(payload: Omit<QuickPreviewEventPayload, 'parseData'>): void\n 'quick-preview/loaded'(payload: QuickPreviewEventPayload): void\n }\n interface PreferencesMap {\n 'quickPreview.keyshortcut.quickEdit': string\n 'quickPreview.keyshortcut.quickDelete': string\n }\n}\n\n@Inject(['api', 'wikiPage', 'modal', 'preferences', '$'])\n@RegisterPreferences(\n Schema.object({\n 'quickPreview.keyshortcut': Schema.string()\n .default('ctrl-i')\n .description('Key shortcut to open quick preview in quick edit modal'),\n })\n .extra('category', 'editor')\n .description('Quick preview options')\n)\nexport class PluginQuickPreview extends BasePlugin {\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'quickPreview')\n this.ctx.set('quickPreview', makeCallable(this, 'previewWikitext'))\n }\n\n protected start(): Promise<void> | void {\n this.ctx.on('quick-edit/wiki-page', this.injectQuickEdit.bind(this))\n }\n\n protected stop(): Promise<void> | void {}\n\n previewWikitext(\n text: string,\n params?: MwApiParams,\n wikiPage?: IWikiPage,\n modal?: IPEModal,\n modalOptions?: Partial<IPEModalOptions>\n ) {\n const { $ } = this.ctx\n\n wikiPage ||= this.ctx.wikiPage.newBlankPage({\n title: 'API',\n })\n\n if (!modal || modal.isDestroyed) {\n modal = this.ctx.modal\n .createObject({\n className: 'in-page-edit ipe-quickPreview',\n sizeClass: 'large',\n center: false,\n ...modalOptions,\n })\n .init()\n }\n\n modal.show()\n modal.setTitle($`Preview - Loading...`)\n modal.setContent(<ProgressBar />)\n modal.bringToFront()\n this.ctx.emit('quick-preview/show-modal', {\n ctx: this.ctx,\n text,\n modal,\n wikiPage,\n })\n\n wikiPage\n .preview(text, params)\n .then((ret) => {\n const {\n data: { parse },\n } = ret\n modal.setTitle($(parse.title)`Preview - {{ $1 }}`)\n let outputRef: HTMLElement | null = null\n modal.setContent(\n (\n <section>\n <div\n ref={(el) => (outputRef = el)}\n className=\"mw-parser-output\"\n innerHTML={parse.text}\n ></div>\n </section>\n ) as HTMLElement\n )\n if (window.mw?.hook && typeof jQuery === 'function') {\n window.mw.hook('wikipage.content').fire(jQuery(outputRef!))\n }\n this.ctx.emit('quick-preview/loaded', {\n ctx: this.ctx,\n modal,\n wikiPage,\n text,\n parseData: parse,\n })\n })\n .catch((error) => {\n modal.setTitle($`Preview - Failed`)\n modal.setContent(\n <>\n <p>{$`Failed to preview`}</p>\n <p>{error instanceof Error ? error.message : String(error)}</p>\n </>\n )\n })\n\n return modal\n }\n\n private async injectQuickEdit({ options, modal, wikiPage }: QuickEditEventPayload) {\n const { $ } = this.ctx\n let latestPreviewModal: IPEModal | undefined = undefined\n modal.addButton(\n {\n label: $`Preview`,\n side: 'left',\n className: 'btn btn-secondary',\n keyPress:\n (await this.ctx.preferences.get('quickPreview.keyshortcut.quickEdit')) || undefined,\n method: () => {\n let wikitext =\n (modal.get$content().querySelector<HTMLTextAreaElement>('textarea[name=\"text\"]')\n ?.value as string) || ''\n if (options.section === 'new') {\n const title = modal\n .get$content()\n .querySelector<HTMLInputElement>('input[name=\"summary\"]')?.value\n if (title) {\n wikitext = `==${title}==\\n${wikitext}`\n }\n }\n\n latestPreviewModal = this.previewWikitext(\n wikitext,\n undefined,\n wikiPage,\n latestPreviewModal,\n {\n backdrop: false,\n draggable: true,\n }\n )\n },\n },\n 1\n )\n modal.on(modal.Event.Close, () => {\n latestPreviewModal?.destroy()\n latestPreviewModal = undefined\n })\n }\n\n private _contentTypeCache = new Map<string, Promise<string>>()\n private fetchContentType(url: string) {\n const cached = this._contentTypeCache.get(url)\n if (cached) return cached\n const promise = fetch(url, { method: 'HEAD' })\n .then((res) => res.headers.get('content-type') || '')\n .catch(() => {\n this._contentTypeCache.delete(url)\n return ''\n })\n this._contentTypeCache.set(url, promise)\n return promise\n }\n async getPreviewType(fileOrUrl: File | string) {\n if (!fileOrUrl) return 'unknown'\n let contentType: string\n let ext: string\n if (fileOrUrl instanceof File) {\n contentType = fileOrUrl.type\n ext = fileOrUrl.name.split('.').pop()?.toLowerCase() || ''\n } else {\n const url = new URL(fileOrUrl, location.origin)\n if (url.protocol === 'data:' || url.protocol === 'blob:' || url.protocol.startsWith('http')) {\n contentType = await this.fetchContentType(url.href)\n } else {\n contentType = ''\n }\n ext = url.pathname.split('.').pop()?.toLowerCase() || ''\n }\n if (\n contentType.startsWith('image/') &&\n /** Windows provide PDFs as image/pdf */ !contentType.includes('pdf')\n ) {\n return 'image'\n }\n if (contentType.startsWith('video/')) return 'video'\n if (contentType.startsWith('audio/')) return 'audio'\n if (contentType.startsWith('text/html')) return 'html'\n if (ext === 'md') return 'markdown'\n if (contentType.startsWith('text/')) return 'text'\n // detect by file extension\n if (['jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'ico', 'webp'].includes(ext)) return 'image'\n if (['mp4', 'webm', 'ogg', 'flv', 'avi', 'mov', 'wmv', 'mkv'].includes(ext)) return 'video'\n if (['mp3', 'wav', 'ogg', 'flac', 'aac', 'm4a', 'wma'].includes(ext)) return 'audio'\n if (['html', 'htm'].includes(ext)) return 'html'\n if (['json', 'yml', 'yaml', 'toml', 'py'].includes(ext)) return 'text'\n if (['pdf'].includes(ext)) return 'pdf'\n return 'unknown'\n }\n async previewFile(fileOrUrl: File | string, alt?: string) {\n const previewElement = await this.getPreviewElement(fileOrUrl, alt)\n if (!previewElement) return\n const modal = this.ctx.modal.dialog({\n className: 'in-page-edit ipe-quickPreview',\n sizeClass: 'mediumToLarge',\n center: true,\n title: alt ?? (fileOrUrl instanceof File ? fileOrUrl.name : fileOrUrl),\n content: <section className=\"ipe-quickPreview__content\">{previewElement}</section>,\n })\n return modal\n }\n private _objectUrls = new WeakMap<File, string>()\n private getObjectUrl(file: File) {\n if (!this._objectUrls.has(file)) {\n const objUrl = URL.createObjectURL(file)\n this._objectUrls.set(file, objUrl)\n }\n return this._objectUrls.get(file)!\n }\n async getPreviewElement(fileOrUrl: File | string, alt?: string) {\n const previewType = await this.getPreviewType(fileOrUrl)\n const url = fileOrUrl instanceof File ? this.getObjectUrl(fileOrUrl) : fileOrUrl\n switch (previewType) {\n case 'image':\n return (\n <img src={url} alt={alt ?? (fileOrUrl instanceof File ? fileOrUrl.name : fileOrUrl)} />\n )\n case 'video':\n return <video src={url} controls={true} aria-label={alt} />\n case 'audio':\n return <audio src={url} controls={true} aria-label={alt} />\n case 'pdf':\n return <embed type=\"application/pdf\" src={url} aria-label={alt} />\n }\n return null\n }\n\n previewWikiPage(title: string) {\n throw new Error('Not implemented')\n }\n}\n"],"names":["_PluginQuickPreview_decorators","_init","_a","Inject","RegisterPreferences","Schema","PluginQuickPreview","BasePlugin","ctx","makeCallable","text","params","wikiPage","modal","modalOptions","$","jsx","ProgressBar","ret","parse","outputRef","el","error","jsxs","Fragment","options","latestPreviewModal","wikitext","title","url","cached","promise","res","fileOrUrl","contentType","ext","alt","previewElement","file","objUrl","previewType","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { j as r, P as m } from "./index-CM_6yF2v.js";
2
- import { B as h } from "./BasePlugin-DD7l-5Xw.js";
2
+ import { B as h } from "./BasePlugin-BCVSn9QJ.js";
3
3
  import { T as u } from "./index-DD5CVCfD.js";
4
- import { I as f, C as g } from "./InputBox-nQKtiWtZ.js";
5
- import { S as d } from "./Preferences-C10tZMl1.js";
4
+ import { I as f, C as g } from "./InputBox-CZ1v4_l3.js";
5
+ import { S as d } from "./Preferences-DqtjY7XU.js";
6
6
  class y extends h {
7
7
  constructor(e) {
8
8
  super(e, {}, "quick-redirect"), this.ctx = e;
@@ -17,7 +17,7 @@ class y extends h {
17
17
  }
18
18
  start() {
19
19
  this.ctx.set("quickRedirect", this);
20
- const e = this.ctx.$, t = window.mw?.config.get("wgPageName") || "", a = window.mw?.config.get("wgIsProbablyEditable");
20
+ const { $: e } = this.ctx, t = window.mw?.config.get("wgPageName") || "", a = window.mw?.config.get("wgIsProbablyEditable");
21
21
  this.ctx.inject(["toolbox"], (i) => {
22
22
  this.ctx = i, i.toolbox.addButton({
23
23
  id: "quick-redirect",
@@ -61,7 +61,7 @@ class y extends h {
61
61
  stop() {
62
62
  }
63
63
  async showModal(e) {
64
- const t = this.ctx.$, a = await this.ctx.preferences.get("quickRedirect.reason");
64
+ const { $: t } = this.ctx, a = await this.ctx.preferences.get("quickRedirect.reason");
65
65
  e || (e = {}), this.ctx.emit("quick-redirect/init-options", { ctx: this.ctx, options: e });
66
66
  const i = this.ctx.modal.createObject({
67
67
  title: t`Quick Redirect`,
@@ -170,4 +170,4 @@ class y extends h {
170
170
  export {
171
171
  y as PluginQuickRedirect
172
172
  };
173
- //# sourceMappingURL=index-De25v1_Q.js.map
173
+ //# sourceMappingURL=index-n5KKWE9v.js.map