@inpageedit/core 0.14.4 → 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.
- package/dist/{BasePlugin-DD7l-5Xw.js → BasePlugin-BCVSn9QJ.js} +2 -2
- package/dist/{BasePlugin-DD7l-5Xw.js.map → BasePlugin-BCVSn9QJ.js.map} +1 -1
- package/dist/InputBox-CZ1v4_l3.js +50 -0
- package/dist/InputBox-CZ1v4_l3.js.map +1 -0
- package/dist/PluginImagesUsed-Bq_C_rgg.js +90 -0
- package/dist/PluginImagesUsed-Bq_C_rgg.js.map +1 -0
- package/dist/{PluginPrefSync-CbFuuC19.js → PluginPrefSync-DP5NyPnI.js} +4 -4
- package/dist/{PluginPrefSync-CbFuuC19.js.map → PluginPrefSync-DP5NyPnI.js.map} +1 -1
- package/dist/{PluginStoreApp-MbC3G9tu.js → PluginStoreApp-_YWpLgfs.js} +2 -2
- package/dist/{PluginStoreApp-MbC3G9tu.js.map → PluginStoreApp-_YWpLgfs.js.map} +1 -1
- package/dist/PluginTemplatesUsed-DS_rHctR.js +76 -0
- package/dist/PluginTemplatesUsed-DS_rHctR.js.map +1 -0
- package/dist/Preferences-DqtjY7XU.js +1541 -0
- package/dist/Preferences-DqtjY7XU.js.map +1 -0
- package/dist/browser-DR-yCqVg.js +1160 -0
- package/dist/browser-DR-yCqVg.js.map +1 -0
- package/dist/components/index.js +1 -1
- package/dist/{index-BpQ6VGMz.js → index-B9VO3swL.js} +108 -63
- package/dist/index-B9VO3swL.js.map +1 -0
- package/dist/{index-BanevHQ2.js → index-C3t-Xj3e.js} +85 -82
- package/dist/index-C3t-Xj3e.js.map +1 -0
- package/dist/{index-WfXtYVMt.js → index-CS1kidKF.js} +149 -117
- package/dist/index-CS1kidKF.js.map +1 -0
- package/dist/index-Cb2_vqBl.js +44 -0
- package/dist/index-Cb2_vqBl.js.map +1 -0
- package/dist/{index-B3jld2sl.js → index-CbdkXGs7.js} +4 -4
- package/dist/{index-B3jld2sl.js.map → index-CbdkXGs7.js.map} +1 -1
- package/dist/{index-BdHmr8jw.js → index-CcAmmXbb.js} +904 -704
- package/dist/index-CcAmmXbb.js.map +1 -0
- package/dist/index-Cq8xPcEY.js +170 -0
- package/dist/index-Cq8xPcEY.js.map +1 -0
- package/dist/{index-DensW9qt.js → index-DPA1ptYq.js} +5 -5
- package/dist/index-DPA1ptYq.js.map +1 -0
- package/dist/{index-BjDTD66_.js → index-DVvsTsLI.js} +29 -15
- package/dist/index-DVvsTsLI.js.map +1 -0
- package/dist/{index-CnR6CqkM.js → index-DjyjqpeO.js} +2 -2
- package/dist/{index-CnR6CqkM.js.map → index-DjyjqpeO.js.map} +1 -1
- package/dist/index-FvMu0Ka0.js +342 -0
- package/dist/index-FvMu0Ka0.js.map +1 -0
- package/dist/index-mFwJhDwE.js +168 -0
- package/dist/index-mFwJhDwE.js.map +1 -0
- package/dist/{index-De25v1_Q.js → index-n5KKWE9v.js} +6 -6
- package/dist/index-n5KKWE9v.js.map +1 -0
- package/dist/{index-DKCZDN-Q.js → index-rKL4D_7I.js} +5 -5
- package/dist/{index-DKCZDN-Q.js.map → index-rKL4D_7I.js.map} +1 -1
- package/dist/index.d.ts +334 -147
- package/dist/index.js +5 -5
- package/dist/models/index.js +1 -1
- package/dist/plugins/index.js +18 -14
- package/dist/plugins/index.js.map +1 -1
- package/dist/services/index.js +9 -8
- package/dist/style.css +1 -1
- package/lib/index.umd.js +14 -12
- package/lib/index.umd.js.map +1 -1
- package/lib/style.css +1 -1
- package/package.json +4 -2
- package/dist/InputBox-nQKtiWtZ.js +0 -30
- package/dist/InputBox-nQKtiWtZ.js.map +0 -1
- package/dist/Preferences-C10tZMl1.js +0 -2701
- package/dist/Preferences-C10tZMl1.js.map +0 -1
- package/dist/index-BXNyXvre.js +0 -116
- package/dist/index-BXNyXvre.js.map +0 -1
- package/dist/index-BanevHQ2.js.map +0 -1
- package/dist/index-BdHmr8jw.js.map +0 -1
- package/dist/index-BjDTD66_.js.map +0 -1
- package/dist/index-BpQ6VGMz.js.map +0 -1
- package/dist/index-DVOc6fB6.js +0 -211
- package/dist/index-DVOc6fB6.js.map +0 -1
- package/dist/index-De25v1_Q.js.map +0 -1
- package/dist/index-DensW9qt.js.map +0 -1
- 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-
|
|
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-
|
|
5
|
-
import { S as d } from "./Preferences-
|
|
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
|
|
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
|
|
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-
|
|
173
|
+
//# sourceMappingURL=index-n5KKWE9v.js.map
|