@inpageedit/core 0.14.2 → 0.14.4

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 (50) hide show
  1. package/dist/{BasePlugin-YOi2_vUo.js → BasePlugin-DD7l-5Xw.js} +2 -2
  2. package/dist/{BasePlugin-YOi2_vUo.js.map → BasePlugin-DD7l-5Xw.js.map} +1 -1
  3. package/dist/{PluginPrefSync-jTNlRQE-.js → PluginPrefSync-CbFuuC19.js} +3 -3
  4. package/dist/{PluginPrefSync-jTNlRQE-.js.map → PluginPrefSync-CbFuuC19.js.map} +1 -1
  5. package/dist/{PluginStoreApp-CGNxKXAN.js → PluginStoreApp-MbC3G9tu.js} +89 -85
  6. package/dist/PluginStoreApp-MbC3G9tu.js.map +1 -0
  7. package/dist/Preferences-C10tZMl1.js +2701 -0
  8. package/dist/Preferences-C10tZMl1.js.map +1 -0
  9. package/dist/{index-QtEF2mzS.js → index-B3jld2sl.js} +4 -4
  10. package/dist/{index-QtEF2mzS.js.map → index-B3jld2sl.js.map} +1 -1
  11. package/dist/{index-3NZkG2a3.js → index-BXNyXvre.js} +3 -3
  12. package/dist/{index-3NZkG2a3.js.map → index-BXNyXvre.js.map} +1 -1
  13. package/dist/{index-Dclp60EO.js → index-BanevHQ2.js} +3 -3
  14. package/dist/{index-Dclp60EO.js.map → index-BanevHQ2.js.map} +1 -1
  15. package/dist/index-BdHmr8jw.js +3090 -0
  16. package/dist/index-BdHmr8jw.js.map +1 -0
  17. package/dist/index-BjDTD66_.js +491 -0
  18. package/dist/index-BjDTD66_.js.map +1 -0
  19. package/dist/{index-D97lUU3h.js → index-BpQ6VGMz.js} +55 -55
  20. package/dist/index-BpQ6VGMz.js.map +1 -0
  21. package/dist/{index-D-fW3ESK.js → index-CnR6CqkM.js} +2 -2
  22. package/dist/{index-D-fW3ESK.js.map → index-CnR6CqkM.js.map} +1 -1
  23. package/dist/{index-DELHsLHS.js → index-DKCZDN-Q.js} +4 -4
  24. package/dist/{index-DELHsLHS.js.map → index-DKCZDN-Q.js.map} +1 -1
  25. package/dist/{index-BBNseJXG.js → index-DVOc6fB6.js} +3 -3
  26. package/dist/{index-BBNseJXG.js.map → index-DVOc6fB6.js.map} +1 -1
  27. package/dist/{index-D6zFqL2u.js → index-De25v1_Q.js} +3 -3
  28. package/dist/{index-D6zFqL2u.js.map → index-De25v1_Q.js.map} +1 -1
  29. package/dist/{index-BrYKe18j.js → index-DensW9qt.js} +3 -3
  30. package/dist/{index-BrYKe18j.js.map → index-DensW9qt.js.map} +1 -1
  31. package/dist/{index-DmLoihN1.js → index-WfXtYVMt.js} +134 -131
  32. package/dist/index-WfXtYVMt.js.map +1 -0
  33. package/dist/index.d.ts +21 -14
  34. package/dist/index.js +5 -5
  35. package/dist/models/index.js +7 -503
  36. package/dist/models/index.js.map +1 -1
  37. package/dist/plugins/index.js +10 -10
  38. package/dist/services/index.js +1 -1
  39. package/dist/style.css +1 -1
  40. package/lib/index.umd.js +11 -11
  41. package/lib/index.umd.js.map +1 -1
  42. package/lib/style.css +1 -1
  43. package/package.json +1 -1
  44. package/dist/PluginStoreApp-CGNxKXAN.js.map +0 -1
  45. package/dist/Preferences-BF2fcXrn.js +0 -1539
  46. package/dist/Preferences-BF2fcXrn.js.map +0 -1
  47. package/dist/index-C3m6ng6b.js +0 -4245
  48. package/dist/index-C3m6ng6b.js.map +0 -1
  49. package/dist/index-D97lUU3h.js.map +0 -1
  50. package/dist/index-DmLoihN1.js.map +0 -1
@@ -1,506 +1,10 @@
1
- import { W as I } from "../WatchlistAction-BbNAyryN.js";
2
- class y {
3
- constructor() {
4
- this.values = {};
5
- }
6
- get length() {
7
- return Object.keys(this.values).length;
8
- }
9
- clear() {
10
- this.values = {};
11
- }
12
- getItem(s) {
13
- return this.values[s] ?? null;
14
- }
15
- setItem(s, o) {
16
- this.values[s] = typeof o == "string" ? o : String(o);
17
- }
18
- removeItem(s) {
19
- delete this.values[s];
20
- }
21
- key(s) {
22
- return Object.keys(this.values)[s] ?? null;
23
- }
24
- }
25
- const N = () => new Proxy(new y(), {
26
- set(i, s, o) {
27
- return typeof s == "string" && i.setItem(s, o), !0;
28
- },
29
- get(i, s) {
30
- return typeof s == "string" && !(s in i) ? i.getItem(s) : Reflect.get(i, s);
31
- }
32
- });
33
- function b(i) {
34
- class s {
35
- constructor(a, t = !0) {
36
- this._loaded = t, this.api = i, a.revisions?.forEach((r) => {
37
- typeof r?.slots?.main == "object" && Object.assign(r, r.slots.main);
38
- }), this.pageInfo = {
39
- ...s.DEFAULT_PAGE_INFO,
40
- ...a
41
- };
42
- }
43
- static {
44
- this.api = i;
45
- }
46
- static {
47
- this.DEFAULT_QUERY_PARAMS = {
48
- action: "query",
49
- prop: "info|templates|transcludedin|images|pageimages|revisions",
50
- inprop: "protection|url|varianttitles",
51
- intestactions: "edit|move|delete",
52
- tllimit: "max",
53
- tilimit: "max",
54
- imlimit: "max",
55
- piprop: "thumbnail|name|original",
56
- pithumbsize: "200",
57
- pilimit: "max",
58
- rvprop: "ids|timestamp|flags|comment|user|content",
59
- rvslots: "main"
60
- };
61
- }
62
- static {
63
- this.DEFAULT_PAGE_INFO = {
64
- pageid: 0,
65
- ns: 0,
66
- title: "",
67
- contentmodel: "wikitext",
68
- pagelanguage: "",
69
- pagelanguagehtmlcode: "",
70
- pagelanguagedir: "ltr",
71
- touched: (/* @__PURE__ */ new Date()).toISOString(),
72
- lastrevid: 0,
73
- length: 0,
74
- protection: [],
75
- restrictiontypes: [],
76
- fullurl: "",
77
- canonicalurl: "",
78
- editurl: "",
79
- varianttitles: {},
80
- actions: {
81
- edit: !0,
82
- move: !1,
83
- delete: !1
84
- },
85
- revisions: [],
86
- templates: [],
87
- images: []
88
- };
89
- }
90
- // Utils
91
- static async newFromApi(a) {
92
- const { data: t } = await this.api.get({
93
- ...s.DEFAULT_QUERY_PARAMS,
94
- ...a
95
- }), r = t?.query?.pages?.[0];
96
- if (!r || !r.title)
97
- throw new Error("Invalid page info", { cause: t });
98
- return new s(r, !0);
99
- }
100
- static newBlankPage(a = {}) {
101
- return new s(a, !1);
102
- }
103
- static async newFromAnyKind(a) {
104
- const { title: t, pageId: r, revisionId: e } = a || {};
105
- return e ? this.newFromApi({ revids: parseInt(e.toString(), 10) }) : r ? this.newFromApi({ pageids: parseInt(r.toString(), 10) }) : t ? this.newFromApi({ titles: t.toString() }) : null;
106
- }
107
- static async newBatchFromApi(a) {
108
- const { titles: t, pageids: r, revids: e, ...n } = a || {}, { data: l } = await this.api.post({
109
- ...s.DEFAULT_QUERY_PARAMS,
110
- titles: t?.join("|") ?? void 0,
111
- pageids: r?.join("|") ?? void 0,
112
- revids: e?.join("|") ?? void 0,
113
- ...n
114
- });
115
- return l?.query?.pages?.map((c) => new s(c, !0)) || [];
116
- }
117
- // Page actions
118
- async parse(a) {
119
- return this.api.post({
120
- action: "parse",
121
- page: this.pageInfo.title,
122
- prop: "text|langlinks|categories|links|templates|images|externallinks|sections|revid|displaytitle|iwlinks|properties|parsewarnings",
123
- ...a
124
- });
125
- }
126
- async preview(a, t) {
127
- return this.parse({
128
- action: "parse",
129
- page: void 0,
130
- title: this.title,
131
- text: a,
132
- pst: 1,
133
- preview: 1,
134
- disableeditsection: 1,
135
- disablelimitreport: 1,
136
- ...t
137
- });
138
- }
139
- async edit(a, t) {
140
- const {
141
- text: r,
142
- prependtext: e,
143
- appendtext: n,
144
- summary: l = "",
145
- watchlist: c = I.preferences,
146
- section: u
147
- } = a;
148
- return this.api.postWithEditToken({
149
- action: "edit",
150
- title: this.title,
151
- starttimestamp: this.pageInfo.touched,
152
- basetimestamp: this.revisions[0]?.timestamp,
153
- text: r,
154
- prependtext: e,
155
- appendtext: n,
156
- summary: l,
157
- watchlist: c,
158
- section: u,
159
- ...t
160
- });
161
- }
162
- async createOnly(a, t) {
163
- return this.edit(a, { createonly: 1, ...t });
164
- }
165
- async delete(a, t) {
166
- return this.api.postWithEditToken({
167
- action: "delete",
168
- title: this.pageInfo.title || void 0,
169
- pageid: this.pageInfo.pageid || void 0,
170
- reason: a,
171
- deletetalk: t?.deletetalk,
172
- ...t
173
- });
174
- }
175
- async moveTo(a, t, r) {
176
- return this.api.postWithEditToken({
177
- action: "move",
178
- from: this.pageInfo.title,
179
- to: a,
180
- reason: t,
181
- movetalk: 1,
182
- movesubpages: 1,
183
- ...r
184
- });
185
- }
186
- // === utilities ===
187
- userCan(a) {
188
- return !!this.pageInfo?.actions?.[a];
189
- }
190
- userCanEdit() {
191
- return this.userCan("edit");
192
- }
193
- async reloadSelfInfo() {
194
- const a = await s.newFromApi({
195
- pageids: this.pageInfo.pageid,
196
- titles: this.pageInfo.title
197
- }), t = (this.pageInfo.revisions || []).concat(a.revisions || []).sort((r, e) => r.revid - e.revid).reduce(
198
- (r, e) => (r.find((n) => n.revid === e.revid) || r.push(e), r),
199
- []
200
- );
201
- return this.pageInfo = a.pageInfo, this.pageInfo.revisions = t, this._loaded = !0, this;
202
- }
203
- // === sugar getters ===
204
- get pageid() {
205
- return this.pageInfo.pageid;
206
- }
207
- get title() {
208
- return this.pageInfo.title;
209
- }
210
- get ns() {
211
- return this.pageInfo.ns;
212
- }
213
- get contentmodel() {
214
- return this.pageInfo.contentmodel;
215
- }
216
- get fullurl() {
217
- return this.pageInfo.fullurl;
218
- }
219
- get canonicalurl() {
220
- return this.pageInfo.canonicalurl;
221
- }
222
- get editurl() {
223
- return this.pageInfo.editurl;
224
- }
225
- get revisions() {
226
- return this.pageInfo.revisions || [];
227
- }
228
- get lastrevid() {
229
- return this.pageInfo.lastrevid;
230
- }
231
- get templates() {
232
- return this.pageInfo.templates || [];
233
- }
234
- get images() {
235
- return this.pageInfo.images || [];
236
- }
237
- }
238
- return s;
239
- }
240
- const m = /* @__PURE__ */ new WeakMap(), g = {
241
- toDBKey: (i) => i.replace(/ /g, "_"),
242
- toNormalText: (i) => i.replace(/_/g, " "),
243
- ensureCase: (i, s) => s === "first-letter" ? i.charAt(0).toUpperCase() + i.slice(1) : i
244
- }, h = {
245
- /**
246
- * 标准化特殊页面名称:转换为全小写
247
- */
248
- normalizeSpecialPageName: (i) => i.toLowerCase(),
249
- /**
250
- * 构建特殊页面别名索引
251
- */
252
- buildSpecialPageIndex: (i) => {
253
- const s = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map();
254
- for (const t of i.specialpagealiases) {
255
- const r = t.realname;
256
- s.set(r, r);
257
- const e = h.normalizeSpecialPageName(r);
258
- a.set(e, r);
259
- for (const n of t.aliases) {
260
- o.set(n, r);
261
- const l = h.normalizeSpecialPageName(n);
262
- a.set(l, r);
263
- }
264
- }
265
- return { byRealName: s, byAlias: o, byNormalized: a };
266
- },
267
- /**
268
- * 查找特殊页面的真实名称
269
- */
270
- findSpecialPageRealName: (i, s) => {
271
- const o = i.split("/")[0];
272
- let a = s.byRealName.get(o) ?? s.byAlias.get(o);
273
- if (a !== void 0)
274
- return a;
275
- const t = h.normalizeSpecialPageName(o);
276
- return s.byNormalized.get(t) ?? null;
277
- }
278
- }, p = {
279
- /**
280
- * 标准化命名空间文本:转换为全小写+下划线格式
281
- */
282
- normalizeNamespaceText: (i) => i.replace(/[_\s]+/g, "_").toLowerCase().replace(/^_+|_+$/g, ""),
283
- buildIndex: (i) => {
284
- const s = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map(), t = /* @__PURE__ */ new Map();
285
- for (const [r, e] of Object.entries(i.namespaces)) {
286
- const n = parseInt(r);
287
- s.set(e.name, n), o.set(e.canonical ?? "", n);
288
- const l = p.normalizeNamespaceText(e.name), c = p.normalizeNamespaceText(e.canonical ?? "");
289
- t.set(l, n), t.set(c, n);
290
- }
291
- for (const r of i.namespacealiases) {
292
- a.set(r.alias, r.id);
293
- const e = p.normalizeNamespaceText(r.alias);
294
- t.set(e, r.id);
295
- }
296
- return { byName: s, byCanonical: o, byAlias: a, byNormalized: t };
297
- },
298
- findNamespaceId: (i, s) => {
299
- let o = s.byName.get(i) ?? s.byCanonical.get(i) ?? s.byAlias.get(i);
300
- if (o !== void 0)
301
- return o;
302
- const a = p.normalizeNamespaceText(i);
303
- return s.byNormalized.get(a) ?? null;
304
- },
305
- isTalkPage: (i) => i % 2 === 1 && i > 0,
306
- getDefaultNamespaceInfo: (i) => ({
307
- id: i,
308
- name: "",
309
- canonical: "",
310
- case: "first-letter",
311
- content: !1,
312
- nonincludable: !1,
313
- subpages: !1
314
- })
315
- };
316
- function w(i) {
317
- const s = m.get(i);
318
- if (s)
319
- return s;
320
- const o = p.buildIndex(i), a = h.buildSpecialPageIndex(i);
321
- class t {
322
- constructor(e, n) {
323
- if (this.newTitle = t.create.bind(t), this.toText = this.getPrefixedText.bind(this), this.toString = this.getPrefixedDBKey.bind(this), this.#t = e || "", this.#e = n ?? 0, n === void 0)
324
- this.fixNSByTitle();
325
- else {
326
- const l = this.parseTitlePrefix(this.#t);
327
- l && l.namespaceId === this.#e && (this.#t = l.mainTitle);
328
- }
329
- if (this.getMainText() === "")
330
- throw new Error("Invalid title");
331
- }
332
- static {
333
- this._meta = i;
334
- }
335
- static {
336
- this._namespaceIndex = o;
337
- }
338
- static {
339
- this._specialPageIndex = a;
340
- }
341
- /** 缓存的 main title,不包含命名空间前缀,大小写和空格状态不确定 */
342
- #t;
343
- /** 缓存的 namespace ID */
344
- #e;
345
- static create(e, n) {
346
- return new t(e, n);
347
- }
348
- /**
349
- * 解析标题前缀,返回匹配到的命名空间 ID 与剥离后的主标题
350
- */
351
- parseTitlePrefix(e) {
352
- const n = e.indexOf(":");
353
- if (n <= 0)
354
- return null;
355
- const l = e.substring(0, n), c = e.substring(n + 1), u = p.findNamespaceId(
356
- l,
357
- t._namespaceIndex
358
- );
359
- return u === null ? null : { namespaceId: u, mainTitle: c };
360
- }
361
- /**
362
- * 如果标题包含可识别命名空间,则采用该命名空间并剥离前缀
363
- */
364
- adoptNamespaceFromTitle() {
365
- const e = this.parseTitlePrefix(this.#t);
366
- e && (this.#t = e.mainTitle, this.#e = e.namespaceId);
367
- }
368
- fixNSByTitle() {
369
- const e = this.#t.indexOf(":");
370
- if (e !== -1) {
371
- if (e === 0) {
372
- this.#t = this.#t.substring(1);
373
- return;
374
- }
375
- this.adoptNamespaceFromTitle();
376
- }
377
- }
378
- getNamespaceInfo() {
379
- return t._meta.namespaces[this.#e] ?? p.getDefaultNamespaceInfo(this.#e);
380
- }
381
- /**
382
- * 若为特殊页面,返回解析后的真实主名(含子页面);否则返回 null
383
- */
384
- resolveSpecialFullTitle() {
385
- if (this.#e !== -1) return null;
386
- const e = h.findSpecialPageRealName(
387
- this.#t,
388
- t._specialPageIndex
389
- );
390
- if (!e) return null;
391
- const n = this.#t.includes("/") ? this.#t.substring(this.#t.indexOf("/")) : "";
392
- return e + n;
393
- }
394
- /**
395
- * 将主标题格式化为输出内容(文本或 DBKey),并做大小写规范化
396
- */
397
- formatMainForOutput(e) {
398
- const n = this.getNamespaceInfo(), c = this.resolveSpecialFullTitle() ?? this.#t, u = e === "db" ? g.toDBKey(c) : g.toNormalText(c);
399
- return g.ensureCase(u, n.case);
400
- }
401
- getMainDBKey() {
402
- return this.formatMainForOutput("db");
403
- }
404
- getMainText() {
405
- return this.formatMainForOutput("text");
406
- }
407
- getMainRootText() {
408
- return this.getMainText().split("/")[0];
409
- }
410
- getPrefixedDBKey() {
411
- return this.#e === 0 ? this.getMainDBKey() : `${this.getNamespaceDBKey()}:${this.getMainDBKey()}`;
412
- }
413
- getPrefixedText() {
414
- return this.#e === 0 ? this.getMainText() : `${this.getNamespaceText()}:${this.getMainText()}`;
415
- }
416
- getNamespaceId() {
417
- return this.#e;
418
- }
419
- getNamespaceText() {
420
- return this.getNamespaceInfo().name ?? "";
421
- }
422
- getNamespaceDBKey() {
423
- const e = this.getNamespaceInfo();
424
- return g.ensureCase(g.toDBKey(this.getNamespaceText()), e.case);
425
- }
426
- getSubjectPage() {
427
- if (p.isTalkPage(this.#e)) {
428
- const e = this.#e - 1;
429
- return new t(this.#t, e);
430
- }
431
- return this;
432
- }
433
- getTalkPage() {
434
- if (p.isTalkPage(this.#e))
435
- return this;
436
- if (this.#e < 0)
437
- return null;
438
- const e = this.#e + 1;
439
- return t._meta.namespaces[e.toString()] ? new t(this.#t, e) : null;
440
- }
441
- getURL(e) {
442
- const n = this.getPrefixedDBKey();
443
- return this.buildArticleURL(n, e);
444
- }
445
- /**
446
- * 构建文章 URL 并附加查询参数
447
- */
448
- buildArticleURL(e, n) {
449
- const c = t._meta.general.articlepath.replace("$1", e), u = new URL(c, location.origin);
450
- return n && (n instanceof URLSearchParams ? n : new URLSearchParams(n)).forEach((d, f) => {
451
- u.searchParams.set(f, d);
452
- }), u;
453
- }
454
- /**
455
- * 设置标题,重置当前实例的 dbkey 和 ns
456
- * 行为:
457
- * - 如果标题包含可识别的命名空间前缀,则以该前缀为准更新 ns,并移除前缀
458
- * - 如果标题前缀与当前 ns 相同,则仅移除冗余前缀并保留当前 ns
459
- * - 否则(无前缀),重置为主命名空间
460
- */
461
- setTitle(e) {
462
- this.#t = e;
463
- const n = this.#e;
464
- this.#e = 0;
465
- const l = this.parseTitlePrefix(this.#t);
466
- return l ? (n !== 0 && l.namespaceId === n ? (this.#t = l.mainTitle, this.#e = n) : (this.#t = l.mainTitle, this.#e = l.namespaceId), this) : this;
467
- }
468
- setMainText(e) {
469
- return this.#t = e, this;
470
- }
471
- setNamespaceText(e) {
472
- const n = p.findNamespaceId(e, t._namespaceIndex);
473
- return n !== null && (this.#e = n), this;
474
- }
475
- setNamespaceId(e) {
476
- return this.#e = e, this;
477
- }
478
- equals(e) {
479
- return typeof e == "string" && (e = new t(e)), this.getPrefixedDBKey() === e.getPrefixedDBKey();
480
- }
481
- isSpecial(e) {
482
- if (this.#e !== -1)
483
- return !1;
484
- const n = new t(e, -1);
485
- return this.getMainRootText() === n.getMainRootText();
486
- }
487
- toJSON() {
488
- return {
489
- ns: this.#e,
490
- text: this.getMainText(),
491
- title: this.getPrefixedText(),
492
- url: this.getURL().toString(),
493
- isSpecial: this.#e < 0
494
- };
495
- }
496
- }
497
- return m.set(i, t), t;
498
- }
1
+ import { M as o, c as r, a as t, u as i } from "../index-BjDTD66_.js";
2
+ import { W as c } from "../WatchlistAction-BbNAyryN.js";
499
3
  export {
500
- y as MemoryStorage,
501
- I as WatchlistAction,
502
- b as createWikiPageModel,
503
- w as createWikiTitleModel,
504
- N as useMemoryStorage
4
+ o as MemoryStorage,
5
+ c as WatchlistAction,
6
+ r as createWikiPageModel,
7
+ t as createWikiTitleModel,
8
+ i as useMemoryStorage
505
9
  };
506
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/models/MemoryStorage.ts","../../src/models/WikiPage/index.ts","../../src/models/WikiTitle/index.ts"],"sourcesContent":["export class MemoryStorage implements Storage {\n private values: Record<string, string> = {}\n get length(): number {\n return Object.keys(this.values).length\n }\n clear(): void {\n this.values = {}\n }\n getItem(key: string): string | null {\n return this.values[key] ?? null\n }\n setItem(key: string, value: string): void {\n this.values[key] = typeof value === 'string' ? value : String(value)\n }\n removeItem(key: string): void {\n delete this.values[key]\n }\n key(index: number): string | null {\n const keys = Object.keys(this.values)\n return keys[index] ?? null\n }\n}\nexport const useMemoryStorage = () => {\n // handle storage.foo = 'bar' case\n return new Proxy(new MemoryStorage(), {\n set(target, prop, value) {\n if (typeof prop === 'string') {\n target.setItem(prop, value)\n }\n return true\n },\n get(target, prop) {\n if (typeof prop === 'string' && !(prop in target)) {\n return target.getItem(prop)\n }\n return Reflect.get(target, prop)\n },\n })\n}\n","import type { PageInfo } from './types/PageInfo'\nimport { PageParseData } from './types/PageParseData'\nimport { WatchlistAction } from './types/WatchlistAction'\nimport { MediaWikiApi, MwApiParams, MwApiResponse, FexiosFinalContext } from 'wiki-saikou/browser'\n\nexport interface WikiPageEditPayload {\n text?: string\n prependtext?: string\n appendtext?: string\n summary?: string\n watchlist?: WatchlistAction\n section?: number | 'new' | undefined\n}\n\nexport interface IWikiPage {\n pageInfo: PageInfo\n parse(params?: MwApiParams): Promise<FexiosFinalContext<MwApiResponse<{ parse: PageParseData }>>>\n preview(\n text: string,\n params?: MwApiParams\n ): Promise<FexiosFinalContext<MwApiResponse<{ parse: PageParseData }>>>\n edit(\n payload: WikiPageEditPayload,\n params?: MwApiParams\n ): Promise<FexiosFinalContext<MwApiResponse<{ success: boolean }>>>\n createOnly(\n payload: { text: string } & Pick<WikiPageEditPayload, 'summary' | 'watchlist'>,\n params?: MwApiParams\n ): Promise<FexiosFinalContext<MwApiResponse<{ success: boolean }>>>\n delete(\n reason?: string,\n params?: MwApiParams\n ): Promise<\n FexiosFinalContext<\n MwApiResponse<{\n delete: {\n title: string\n reason: string\n logid: boolean\n }\n }>\n >\n >\n moveTo(\n title: string,\n reason?: string,\n params?: Partial<\n MwApiParams & {\n movetalk: boolean\n movesubpages: boolean\n }\n >\n ): Promise<FexiosFinalContext<MwApiResponse<{ success: boolean }>>>\n userCan(action: keyof PageInfo['actions']): boolean\n userCanEdit(): boolean\n reloadSelfInfo(): Promise<this>\n // sugar getters (instance level)\n readonly pageid: PageInfo['pageid']\n readonly title: PageInfo['title']\n readonly ns: PageInfo['ns']\n readonly contentmodel: PageInfo['contentmodel']\n readonly fullurl: PageInfo['fullurl']\n readonly canonicalurl: PageInfo['canonicalurl']\n readonly editurl: PageInfo['editurl']\n readonly revisions: NonNullable<PageInfo['revisions']>\n readonly lastrevid: PageInfo['lastrevid']\n readonly templates: NonNullable<PageInfo['templates']>\n readonly images: NonNullable<PageInfo['images']>\n}\n\nexport interface WikiPageConstructor {\n // Constructor\n new (pageInfo: Partial<PageInfo>, loaded?: boolean): IWikiPage\n // Static members\n newFromApi(payload: MwApiParams): Promise<IWikiPage>\n newBlankPage(init?: Partial<PageInfo>): IWikiPage\n /**\n * Create a new WikiPage instance from any kind of identifier\n * priority: revid > pageid > title\n */\n newFromAnyKind(payload: {\n title?: string\n pageid?: number\n revid?: number\n }): Promise<IWikiPage | null>\n newBatchFromApi(\n params: MwApiParams & {\n titles?: string[]\n pageids?: number[]\n revids?: number[]\n }\n ): Promise<IWikiPage[]>\n}\n\nexport function createWikiPageModel(api: MediaWikiApi): WikiPageConstructor {\n class WikiPage implements IWikiPage {\n private static readonly api = api\n readonly api = api\n public pageInfo: PageInfo\n static readonly DEFAULT_QUERY_PARAMS: MwApiParams = {\n action: 'query',\n prop: 'info|templates|transcludedin|images|pageimages|revisions',\n inprop: 'protection|url|varianttitles',\n intestactions: 'edit|move|delete',\n tllimit: 'max',\n tilimit: 'max',\n imlimit: 'max',\n piprop: 'thumbnail|name|original',\n pithumbsize: '200',\n pilimit: 'max',\n rvprop: 'ids|timestamp|flags|comment|user|content',\n rvslots: 'main',\n }\n static readonly DEFAULT_PAGE_INFO: PageInfo = {\n pageid: 0,\n ns: 0,\n title: '',\n contentmodel: 'wikitext',\n pagelanguage: '',\n pagelanguagehtmlcode: '',\n pagelanguagedir: 'ltr',\n touched: new Date().toISOString(),\n lastrevid: 0,\n length: 0,\n protection: [],\n restrictiontypes: [],\n fullurl: '',\n canonicalurl: '',\n editurl: '',\n varianttitles: {},\n actions: {\n edit: true,\n move: false,\n delete: false,\n },\n revisions: [],\n templates: [],\n images: [],\n }\n\n constructor(\n pageInfo: Partial<PageInfo>,\n public _loaded = true\n ) {\n // Handle modern MW content model slots\n pageInfo.revisions?.forEach((rev) => {\n // @ts-ignore\n if (typeof rev?.slots?.main === 'object') {\n Object.assign(rev, (rev as any).slots.main)\n }\n })\n this.pageInfo = {\n ...WikiPage.DEFAULT_PAGE_INFO,\n ...pageInfo,\n }\n }\n\n // Utils\n static async newFromApi(payload: MwApiParams) {\n const { data } = await this.api.get<{\n query: {\n pages: PageInfo[]\n }\n }>({\n ...WikiPage.DEFAULT_QUERY_PARAMS,\n ...payload,\n })\n const info = data?.query?.pages?.[0]\n if (!info || !info.title) {\n throw new Error('Invalid page info', { cause: data })\n }\n return new WikiPage(info, true)\n }\n static newBlankPage(init: Partial<PageInfo> = {}) {\n return new WikiPage(init, false)\n }\n static async newFromAnyKind(payload: { title?: string; pageId?: number; revisionId?: number }) {\n const { title, pageId, revisionId } = payload || {}\n if (revisionId) {\n return this.newFromApi({ revids: parseInt(revisionId.toString(), 10) })\n } else if (pageId) {\n return this.newFromApi({ pageids: parseInt(pageId.toString(), 10) })\n } else if (title) {\n return this.newFromApi({ titles: title.toString() })\n }\n return null\n }\n static async newBatchFromApi(\n params: MwApiParams & {\n titles?: string[]\n pageids?: number[]\n revids?: number[]\n }\n ) {\n const { titles, pageids, revids, ...rest } = params || {}\n const { data } = await this.api.post<{\n query: {\n pages: PageInfo[]\n }\n }>({\n ...WikiPage.DEFAULT_QUERY_PARAMS,\n titles: titles?.join('|') ?? undefined,\n pageids: pageids?.join('|') ?? undefined,\n revids: revids?.join('|') ?? undefined,\n ...rest,\n })\n return data?.query?.pages?.map((page) => new WikiPage(page, true)) || []\n }\n\n // Page actions\n async parse(params?: MwApiParams) {\n return this.api.post({\n action: 'parse',\n page: this.pageInfo.title,\n prop: 'text|langlinks|categories|links|templates|images|externallinks|sections|revid|displaytitle|iwlinks|properties|parsewarnings',\n ...params,\n })\n }\n async preview(text: string, params?: MwApiParams) {\n return this.parse({\n action: 'parse',\n page: undefined,\n title: this.title,\n text,\n pst: 1,\n preview: 1,\n disableeditsection: 1,\n disablelimitreport: 1,\n ...params,\n })\n }\n async edit(payload: WikiPageEditPayload, params?: MwApiParams) {\n const {\n text,\n prependtext,\n appendtext,\n summary = '',\n watchlist = WatchlistAction.preferences,\n section,\n } = payload\n return this.api.postWithEditToken({\n action: 'edit',\n title: this.title,\n starttimestamp: this.pageInfo.touched,\n basetimestamp: this.revisions[0]?.timestamp,\n text,\n prependtext,\n appendtext,\n summary,\n watchlist,\n section,\n ...params,\n })\n }\n async createOnly(\n payload: { text: string; summary?: string; watchlist?: WatchlistAction },\n params?: MwApiParams\n ) {\n return this.edit(payload, { createonly: 1, ...params })\n }\n async delete(reason?: string, params?: MwApiParams & { deletetalk?: boolean }) {\n return this.api.postWithEditToken<{\n delete: {\n title: string\n reason: string\n logid: boolean\n }\n }>({\n action: 'delete',\n title: this.pageInfo.title || undefined,\n pageid: this.pageInfo.pageid || undefined,\n reason,\n deletetalk: params?.deletetalk,\n ...params,\n })\n }\n async moveTo(\n title: string,\n reason?: string,\n params?: Partial<\n MwApiParams & {\n movetalk: boolean\n movesubpages: boolean\n }\n >\n ) {\n return this.api.postWithEditToken({\n action: 'move',\n from: this.pageInfo.title,\n to: title,\n reason,\n movetalk: 1,\n movesubpages: 1,\n ...params,\n })\n }\n\n // === utilities ===\n\n userCan(action: keyof PageInfo['actions']) {\n const val = this.pageInfo?.actions?.[action]\n return !!val\n }\n userCanEdit() {\n return this.userCan('edit')\n }\n async reloadSelfInfo() {\n const page = await WikiPage.newFromApi({\n pageids: this.pageInfo.pageid,\n titles: this.pageInfo.title,\n })\n const revisions = (this.pageInfo.revisions || [])\n .concat(page.revisions || [])\n .sort((a, b) => a.revid - b.revid)\n .reduce(\n (acc, cur) => {\n if (!acc.find((rev) => rev.revid === cur.revid)) acc.push(cur)\n return acc\n },\n [] as Required<PageInfo>['revisions']\n )\n this.pageInfo = page.pageInfo\n this.pageInfo.revisions = revisions\n this._loaded = true\n return this\n }\n\n // === sugar getters ===\n get pageid() {\n return this.pageInfo.pageid\n }\n get title() {\n return this.pageInfo.title\n }\n get ns() {\n return this.pageInfo.ns\n }\n get contentmodel() {\n return this.pageInfo.contentmodel\n }\n get fullurl() {\n return this.pageInfo.fullurl\n }\n get canonicalurl() {\n return this.pageInfo.canonicalurl\n }\n get editurl() {\n return this.pageInfo.editurl\n }\n get revisions() {\n return this.pageInfo.revisions || []\n }\n get lastrevid() {\n return this.pageInfo.lastrevid\n }\n get templates() {\n return this.pageInfo.templates || []\n }\n get images() {\n return this.pageInfo.images || []\n }\n }\n\n return WikiPage as WikiPageConstructor\n}\n\n// re-export types\nexport * from './types/PageInfo'\nexport * from './types/PageParseData'\nexport * from './types/WatchlistAction'\n","import { WikiSiteInfo } from '@/types/WikiMetadata'\n\n// 使用 WeakMap 避免内存泄漏\nconst caches = new WeakMap<WikiSiteInfo, WikiTitleConstructor>()\n\n// 命名空间查找索引\ninterface NamespaceIndex {\n byName: Map<string, number>\n byCanonical: Map<string, number>\n byAlias: Map<string, number>\n byNormalized: Map<string, number> // 标准化索引:全小写+下划线格式\n}\n\n// 特殊页面别名索引\ninterface SpecialPageIndex {\n byRealName: Map<string, string> // realname -> realname\n byAlias: Map<string, string> // alias -> realname\n byNormalized: Map<string, string> // normalized -> realname\n}\n\nexport interface IWikiTitle {\n /**\n * Get db key without namespace prefix\n * e.g. \"template:hello world\" -> \"Hello_world\"\n */\n getMainDBKey(): string\n\n /**\n * Get page name without namespace prefix\n * e.g. \"template:hello world\" -> \"Hello world\"\n */\n getMainText(): string\n\n /**\n * Get db key with namespace prefix\n * e.g. \"template:hello world\" -> \"Template:Hello_world\"\n */\n getPrefixedDBKey(): string\n\n /**\n * Get page name with namespace prefix\n * e.g. \"template:hello world\" -> \"Template:Hello world\"\n */\n getPrefixedText(): string\n\n // Shortcuts\n toText: () => string\n toString: () => string\n\n /**\n * Get namespace ID\n * e.g. \"template:hello world\" -> 10\n */\n getNamespaceId(): number\n\n /**\n * Get namespace text\n * e.g. \"template:hello world\" -> \"Template\"\n */\n getNamespaceText(): string\n\n /**\n * Get namespace db key\n * e.g. \"template talk:hello world\" -> \"Template_talk\"\n */\n getNamespaceDBKey(): string\n\n /**\n * Get subject page\n * If current page is subject page, return itself\n * e.g. \"template talk:hello world\" -> new WikiTitle(\"Template:Hello world\")\n */\n getSubjectPage(): IWikiTitle\n\n /**\n * Get talk page\n * If current page is talk page, return itself\n * If current page cannot have talk page, return null\n * e.g. \"template:hello world\" -> new WikiTitle(\"Template talk:Hello world\")\n */\n getTalkPage(): IWikiTitle | null\n\n /**\n * Get URL of the page\n * e.g. \"template:hello world\" -> \"https://example.com/wiki/Template:Hello_world\"\n */\n getURL(params?: Record<string, string> | URLSearchParams): URL\n\n /**\n * Reset current title with given title string\n */\n setTitle(title: string): IWikiTitle\n\n /**\n * Set main title, keep current ns, update dbkey\n */\n setMainText(mainTitle: string): IWikiTitle\n\n /**\n * Set namespace by text\n */\n setNamespaceText(namespaceText: string): IWikiTitle\n\n /**\n * Set namespace by ID\n */\n setNamespaceId(namespaceId: number): IWikiTitle\n\n /**\n * Check if the title is equal to another title\n */\n equals(other: IWikiTitle | string): boolean\n\n /**\n * Check if the title is specific special page\n * e.g. \"Special:Diff\" is \"差异\" or \"diff\" -> true\n */\n isSpecial(alia: string): boolean\n\n newTitle(title: string, namespace?: number): IWikiTitle\n}\n\nexport interface WikiTitleConstructor {\n new (title: string, namespace?: number): IWikiTitle\n create(title: string, namespace?: number): IWikiTitle\n}\n\n// 工具函数\nconst titleUtils = {\n toDBKey: (text: string): string => text.replace(/ /g, '_'),\n toNormalText: (text: string): string => text.replace(/_/g, ' '),\n ensureCase: (text: string, caseType: string): string => {\n if (caseType === 'first-letter') {\n return text.charAt(0).toUpperCase() + text.slice(1)\n } else {\n return text\n }\n },\n}\n\n// 特殊页面工具函数\nconst specialPageUtils = {\n /**\n * 标准化特殊页面名称:转换为全小写\n */\n normalizeSpecialPageName: (name: string): string => {\n return name.toLowerCase()\n },\n\n /**\n * 构建特殊页面别名索引\n */\n buildSpecialPageIndex: (metadata: WikiSiteInfo): SpecialPageIndex => {\n const byRealName = new Map<string, string>()\n const byAlias = new Map<string, string>()\n const byNormalized = new Map<string, string>()\n\n for (const specialPage of metadata.specialpagealiases) {\n const realName = specialPage.realname\n byRealName.set(realName, realName)\n\n // 添加标准化索引\n const normalizedRealName = specialPageUtils.normalizeSpecialPageName(realName)\n byNormalized.set(normalizedRealName, realName)\n\n // 处理别名\n for (const alias of specialPage.aliases) {\n byAlias.set(alias, realName)\n\n // 添加标准化的别名索引\n const normalizedAlias = specialPageUtils.normalizeSpecialPageName(alias)\n byNormalized.set(normalizedAlias, realName)\n }\n }\n\n return { byRealName, byAlias, byNormalized }\n },\n\n /**\n * 查找特殊页面的真实名称\n */\n findSpecialPageRealName: (name: string, index: SpecialPageIndex): string | null => {\n // 提取主部分(忽略子页面)\n const mainPart = name.split('/')[0]\n\n // 首先尝试原始输入(精确匹配)\n let result = index.byRealName.get(mainPart) ?? index.byAlias.get(mainPart)\n if (result !== undefined) {\n return result\n }\n\n // 标准化输入并查找\n const normalized = specialPageUtils.normalizeSpecialPageName(mainPart)\n return index.byNormalized.get(normalized) ?? null\n },\n}\n\n// 命名空间工具函数\nconst namespaceUtils = {\n /**\n * 标准化命名空间文本:转换为全小写+下划线格式\n */\n normalizeNamespaceText: (text: string): string => {\n return text\n .replace(/[_\\s]+/g, '_') // 将空格和下划线统一为下划线\n .toLowerCase()\n .replace(/^_+|_+$/g, '') // 移除首尾下划线\n },\n\n buildIndex: (metadata: WikiSiteInfo): NamespaceIndex => {\n const byName = new Map<string, number>()\n const byCanonical = new Map<string, number>()\n const byAlias = new Map<string, number>()\n const byNormalized = new Map<string, number>()\n\n // 构建命名空间索引\n for (const [id, ns] of Object.entries(metadata.namespaces)) {\n const nsId = parseInt(id)\n byName.set(ns.name, nsId)\n byCanonical.set(ns.canonical ?? '', nsId)\n\n // 添加标准化索引\n const normalizedName = namespaceUtils.normalizeNamespaceText(ns.name)\n const normalizedCanonical = namespaceUtils.normalizeNamespaceText(ns.canonical ?? '')\n byNormalized.set(normalizedName, nsId)\n byNormalized.set(normalizedCanonical, nsId)\n }\n\n // 构建别名索引\n for (const alias of metadata.namespacealiases) {\n byAlias.set(alias.alias, alias.id)\n\n // 添加标准化的别名索引\n const normalizedAlias = namespaceUtils.normalizeNamespaceText(alias.alias)\n byNormalized.set(normalizedAlias, alias.id)\n }\n\n return { byName, byCanonical, byAlias, byNormalized }\n },\n\n findNamespaceId: (namespaceText: string, index: NamespaceIndex): number | null => {\n // 首先尝试原始输入(精确匹配)\n let result =\n index.byName.get(namespaceText) ??\n index.byCanonical.get(namespaceText) ??\n index.byAlias.get(namespaceText)\n if (result !== undefined) {\n return result\n }\n\n // 标准化输入并查找\n const normalized = namespaceUtils.normalizeNamespaceText(namespaceText)\n return index.byNormalized.get(normalized) ?? null\n },\n\n isTalkPage: (ns: number): boolean => ns % 2 === 1 && ns > 0,\n\n getDefaultNamespaceInfo: (ns: number) => ({\n id: ns,\n name: '',\n canonical: '',\n case: 'first-letter' as const,\n content: false,\n nonincludable: false,\n subpages: false,\n }),\n}\n\nexport function createWikiTitleModel(metadata: WikiSiteInfo): WikiTitleConstructor {\n const exists = caches.get(metadata)\n if (exists) {\n return exists\n }\n\n // 预建命名空间索引\n const namespaceIndex = namespaceUtils.buildIndex(metadata)\n // 预建特殊页面索引\n const specialPageIndex = specialPageUtils.buildSpecialPageIndex(metadata)\n\n class WikiTitle implements IWikiTitle {\n static readonly _meta = metadata\n static readonly _namespaceIndex = namespaceIndex\n static readonly _specialPageIndex = specialPageIndex\n\n /** 缓存的 main title,不包含命名空间前缀,大小写和空格状态不确定 */\n #title: string\n /** 缓存的 namespace ID */\n #ns: number\n\n constructor(title: string, namespace?: number) {\n this.#title = title || ''\n this.#ns = namespace ?? 0\n\n // 只有在没有显式命名空间参数时才解析标题中的命名空间前缀\n if (namespace === void 0) {\n this.fixNSByTitle()\n } else {\n // 显式传入命名空间时:仅当标题中的前缀与显式命名空间一致时才移除前缀\n const parsed = this.parseTitlePrefix(this.#title)\n if (parsed && parsed.namespaceId === this.#ns) {\n this.#title = parsed.mainTitle\n }\n }\n\n if (this.getMainText() === '') {\n throw new Error('Invalid title')\n }\n }\n\n static create(title: string, namespace?: number): WikiTitle {\n return new WikiTitle(title, namespace)\n }\n newTitle = WikiTitle.create.bind(WikiTitle)\n\n /**\n * 解析标题前缀,返回匹配到的命名空间 ID 与剥离后的主标题\n */\n private parseTitlePrefix(rawTitle: string): { namespaceId: number; mainTitle: string } | null {\n const colonIndex = rawTitle.indexOf(':')\n if (colonIndex <= 0) {\n return null\n }\n const potentialNamespace = rawTitle.substring(0, colonIndex)\n const mainTitle = rawTitle.substring(colonIndex + 1)\n const namespaceId = namespaceUtils.findNamespaceId(\n potentialNamespace,\n WikiTitle._namespaceIndex\n )\n if (namespaceId === null) return null\n return { namespaceId, mainTitle }\n }\n\n /**\n * 如果标题包含可识别命名空间,则采用该命名空间并剥离前缀\n */\n private adoptNamespaceFromTitle(): void {\n const parsed = this.parseTitlePrefix(this.#title)\n if (!parsed) return\n this.#title = parsed.mainTitle\n this.#ns = parsed.namespaceId\n }\n\n private fixNSByTitle(): void {\n const colonIndex = this.#title.indexOf(':')\n if (colonIndex === -1) {\n return // 没有命名空间前缀\n }\n\n if (colonIndex === 0) {\n // 只有冒号,将冒号后的部分作为标题\n this.#title = this.#title.substring(1)\n return\n }\n\n // 查找匹配的命名空间并采用\n this.adoptNamespaceFromTitle()\n }\n\n private getNamespaceInfo() {\n return (\n WikiTitle._meta.namespaces[this.#ns] ?? namespaceUtils.getDefaultNamespaceInfo(this.#ns)\n )\n }\n\n /**\n * 若为特殊页面,返回解析后的真实主名(含子页面);否则返回 null\n */\n private resolveSpecialFullTitle(): string | null {\n if (this.#ns !== -1) return null\n const realName = specialPageUtils.findSpecialPageRealName(\n this.#title,\n WikiTitle._specialPageIndex\n )\n if (!realName) return null\n const subPage = this.#title.includes('/')\n ? this.#title.substring(this.#title.indexOf('/'))\n : ''\n return realName + subPage\n }\n\n /**\n * 将主标题格式化为输出内容(文本或 DBKey),并做大小写规范化\n */\n private formatMainForOutput(mode: 'text' | 'db'): string {\n const nsInfo = this.getNamespaceInfo()\n const resolved = this.resolveSpecialFullTitle()\n const base = resolved ?? this.#title\n const converted = mode === 'db' ? titleUtils.toDBKey(base) : titleUtils.toNormalText(base)\n return titleUtils.ensureCase(converted, nsInfo.case)\n }\n\n getMainDBKey(): string {\n return this.formatMainForOutput('db')\n }\n\n getMainText(): string {\n return this.formatMainForOutput('text')\n }\n\n private getMainRootText(): string {\n return this.getMainText().split('/')[0]\n }\n\n getPrefixedDBKey(): string {\n if (this.#ns === 0) {\n return this.getMainDBKey()\n }\n return `${this.getNamespaceDBKey()}:${this.getMainDBKey()}`\n }\n\n getPrefixedText(): string {\n if (this.#ns === 0) {\n return this.getMainText()\n }\n return `${this.getNamespaceText()}:${this.getMainText()}`\n }\n\n // aliases\n toText = this.getPrefixedText.bind(this)\n toString = this.getPrefixedDBKey.bind(this)\n\n getNamespaceId(): number {\n return this.#ns\n }\n\n getNamespaceText(): string {\n return this.getNamespaceInfo().name ?? ''\n }\n getNamespaceDBKey(): string {\n const nsInfo = this.getNamespaceInfo()\n return titleUtils.ensureCase(titleUtils.toDBKey(this.getNamespaceText()), nsInfo.case)\n }\n\n getSubjectPage(): IWikiTitle {\n if (namespaceUtils.isTalkPage(this.#ns)) {\n const subjectNs = this.#ns - 1\n return new WikiTitle(this.#title, subjectNs)\n }\n return this\n }\n\n getTalkPage(): IWikiTitle | null {\n if (namespaceUtils.isTalkPage(this.#ns)) {\n return this\n }\n\n // 特殊页面和媒体页面没有讨论页\n if (this.#ns < 0) {\n return null\n }\n\n const talkNs = this.#ns + 1\n const talkNsInfo = WikiTitle._meta.namespaces[talkNs.toString()]\n if (!talkNsInfo) {\n return null\n }\n\n return new WikiTitle(this.#title, talkNs)\n }\n\n getURL(params?: Record<string, string> | URLSearchParams): URL {\n const prefixedDbKey = this.getPrefixedDBKey()\n return this.buildArticleURL(prefixedDbKey, params)\n }\n\n /**\n * 构建文章 URL 并附加查询参数\n */\n private buildArticleURL(\n prefixedDbKey: string,\n params?: Record<string, string> | URLSearchParams\n ): URL {\n const articlePath = WikiTitle._meta.general.articlepath\n const path = articlePath.replace('$1', prefixedDbKey)\n const url = new URL(path, location.origin)\n if (params) {\n const searchParams =\n params instanceof URLSearchParams ? params : new URLSearchParams(params)\n searchParams.forEach((value, key) => {\n url.searchParams.set(key, value)\n })\n }\n return url\n }\n\n /**\n * 设置标题,重置当前实例的 dbkey 和 ns\n * 行为:\n * - 如果标题包含可识别的命名空间前缀,则以该前缀为准更新 ns,并移除前缀\n * - 如果标题前缀与当前 ns 相同,则仅移除冗余前缀并保留当前 ns\n * - 否则(无前缀),重置为主命名空间\n */\n setTitle(title: string): this {\n this.#title = title\n const previousNs = this.#ns\n // 默认重置为主命名空间\n this.#ns = 0\n\n const parsed = this.parseTitlePrefix(this.#title)\n if (parsed) {\n // 如果与之前的 ns 一致,则视为冗余前缀,仅剥离前缀并保持 ns\n if (previousNs !== 0 && parsed.namespaceId === previousNs) {\n this.#title = parsed.mainTitle\n this.#ns = previousNs\n } else {\n // 使用标题中的命名空间\n this.#title = parsed.mainTitle\n this.#ns = parsed.namespaceId\n }\n return this\n }\n\n // 无可识别前缀,保持主命名空间\n return this\n }\n\n setMainText(text: string): this {\n this.#title = text\n return this\n }\n\n setNamespaceText(namespaceText: string): this {\n const namespaceId = namespaceUtils.findNamespaceId(namespaceText, WikiTitle._namespaceIndex)\n if (namespaceId !== null) {\n this.#ns = namespaceId\n }\n return this\n }\n\n setNamespaceId(namespaceId: number): this {\n this.#ns = namespaceId\n return this\n }\n\n equals(other: IWikiTitle | string): boolean {\n if (typeof other === 'string') {\n other = new WikiTitle(other)\n }\n return this.getPrefixedDBKey() === other.getPrefixedDBKey()\n }\n\n isSpecial(alia: string): boolean {\n // 如果不是特殊页面命名空间,直接返回 false\n if (this.#ns !== -1) {\n return false\n }\n const targetTitle = new WikiTitle(alia, -1)\n return this.getMainRootText() === targetTitle.getMainRootText()\n }\n\n toJSON(): Record<string, any> {\n return {\n ns: this.#ns,\n text: this.getMainText(),\n title: this.getPrefixedText(),\n url: this.getURL().toString(),\n isSpecial: this.#ns < 0,\n }\n }\n }\n\n caches.set(metadata, WikiTitle)\n return WikiTitle\n}\n"],"names":["MemoryStorage","key","value","index","useMemoryStorage","target","prop","createWikiPageModel","api","WikiPage","pageInfo","_loaded","rev","payload","data","info","init","title","pageId","revisionId","params","titles","pageids","revids","rest","page","text","prependtext","appendtext","summary","watchlist","WatchlistAction","section","reason","action","revisions","a","b","acc","cur","caches","titleUtils","caseType","specialPageUtils","name","metadata","byRealName","byAlias","byNormalized","specialPage","realName","normalizedRealName","alias","normalizedAlias","mainPart","result","normalized","namespaceUtils","byName","byCanonical","id","ns","nsId","normalizedName","normalizedCanonical","namespaceText","createWikiTitleModel","exists","namespaceIndex","specialPageIndex","WikiTitle","namespace","#title","#ns","parsed","rawTitle","colonIndex","potentialNamespace","mainTitle","namespaceId","subPage","mode","nsInfo","base","converted","subjectNs","talkNs","prefixedDbKey","path","url","previousNs","other","alia","targetTitle"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -1,13 +1,13 @@
1
- import { PluginAnalytics as i } from "../index-Dclp60EO.js";
2
- import { PluginInArticleLinks as u } from "../index-BBNseJXG.js";
3
- import { PluginPluginStore as t } from "../index-QtEF2mzS.js";
4
- import { PluginPreferencesUI as f } from "../index-DELHsLHS.js";
5
- import { PluginQuickDiff as g } from "../index-D97lUU3h.js";
6
- import { PluginQuickEdit as m } from "../index-DmLoihN1.js";
7
- import { PluginQuickMove as c } from "../index-BrYKe18j.js";
8
- import { PluginQuickPreview as Q } from "../index-3NZkG2a3.js";
9
- import { PluginQuickRedirect as d } from "../index-D6zFqL2u.js";
10
- import { PluginToolbox as A } from "../index-D-fW3ESK.js";
1
+ import { PluginAnalytics as i } from "../index-BanevHQ2.js";
2
+ import { PluginInArticleLinks as u } from "../index-DVOc6fB6.js";
3
+ import { PluginPluginStore as t } from "../index-B3jld2sl.js";
4
+ import { PluginPreferencesUI as f } from "../index-DKCZDN-Q.js";
5
+ import { PluginQuickDiff as g } from "../index-BpQ6VGMz.js";
6
+ import { PluginQuickEdit as m } from "../index-WfXtYVMt.js";
7
+ import { PluginQuickMove as c } from "../index-DensW9qt.js";
8
+ import { PluginQuickPreview as Q } from "../index-BXNyXvre.js";
9
+ import { PluginQuickRedirect as d } from "../index-De25v1_Q.js";
10
+ import { PluginToolbox as A } from "../index-CnR6CqkM.js";
11
11
  export {
12
12
  i as PluginAnalytics,
13
13
  u as PluginInArticleLinks,
@@ -1,4 +1,4 @@
1
- import { A as r, C as i, b as s, N as c, P as o, M as v, c as S, R as t, a as d, W as P, d as M, e as l } from "../index-C3m6ng6b.js";
1
+ import { A as r, C as i, b as s, N as c, P as o, M as v, c as S, R as t, a as d, W as P, d as M, e as l } from "../index-BdHmr8jw.js";
2
2
  export {
3
3
  r as ApiService,
4
4
  i as CurrentPageService,