@inpageedit/core 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/{IconQuickEdit-YVn1ANbm.js → IconQuickEdit-CAL1HXIb.js} +4 -4
  2. package/dist/IconQuickEdit-CAL1HXIb.js.map +1 -0
  3. package/dist/__test__/utils/constants.d.ts +2 -2
  4. package/dist/{index-DpLwTw4C.js → index-9Z4ds-WM.js} +2627 -2095
  5. package/dist/index-9Z4ds-WM.js.map +1 -0
  6. package/dist/{index-DlgTb4XY.js → index-BB9MXkUv.js} +3 -3
  7. package/dist/{index-DlgTb4XY.js.map → index-BB9MXkUv.js.map} +1 -1
  8. package/dist/{index-VzP81S7B.js → index-BDVcDlsf.js} +2 -2
  9. package/dist/{index-VzP81S7B.js.map → index-BDVcDlsf.js.map} +1 -1
  10. package/dist/{index--xn9BebC.js → index-CADkQBg0.js} +61 -69
  11. package/dist/{index--xn9BebC.js.map → index-CADkQBg0.js.map} +1 -1
  12. package/dist/{index-DTA86mHU.js → index-CBQsBfc2.js} +31 -33
  13. package/dist/index-CBQsBfc2.js.map +1 -0
  14. package/dist/{index-BT1mN_St.js → index-CNsB3Vcb.js} +2 -2
  15. package/dist/{index-BT1mN_St.js.map → index-CNsB3Vcb.js.map} +1 -1
  16. package/dist/index-CYdxWw9g.js +355 -0
  17. package/dist/index-CYdxWw9g.js.map +1 -0
  18. package/dist/{index-C0V2s48o.js → index-D7SQwFxl.js} +38 -33
  19. package/dist/index-D7SQwFxl.js.map +1 -0
  20. package/dist/index-DMNUP3fg.js +193 -0
  21. package/dist/index-DMNUP3fg.js.map +1 -0
  22. package/dist/{index-TzKe6Ebm.js → index-G3k3kjCU.js} +2 -2
  23. package/dist/{index-TzKe6Ebm.js.map → index-G3k3kjCU.js.map} +1 -1
  24. package/dist/{index-DDWds9Jg.js → index-dp6_MU68.js} +28 -28
  25. package/dist/index-dp6_MU68.js.map +1 -0
  26. package/dist/index.js +1 -1
  27. package/dist/models/WikiTitle/index.d.ts +1 -0
  28. package/dist/plugins/in-article-links/index.d.ts +1 -1
  29. package/dist/plugins/quick-delete/index.d.ts +1 -1
  30. package/dist/plugins/quick-diff/PluginQuickDiffCore.d.ts +1 -1
  31. package/dist/plugins/quick-edit/index.d.ts +1 -1
  32. package/dist/plugins/quick-preview/index.d.ts +1 -1
  33. package/dist/services/CurrentPageService.d.ts +28 -0
  34. package/dist/services/{ModalService/index.d.ts → ModalService.d.ts} +4 -4
  35. package/dist/services/WikiMetadataService.d.ts +1 -1
  36. package/dist/services/WikiTitleService.d.ts +19 -7
  37. package/dist/style.css +1 -1
  38. package/lib/index.umd.js +36 -35
  39. package/lib/index.umd.js.map +1 -1
  40. package/lib/style.css +1 -1
  41. package/package.json +8 -7
  42. package/dist/IconQuickEdit-YVn1ANbm.js.map +0 -1
  43. package/dist/index-C0V2s48o.js.map +0 -1
  44. package/dist/index-DDWds9Jg.js.map +0 -1
  45. package/dist/index-DDef1ojx.js +0 -166
  46. package/dist/index-DDef1ojx.js.map +0 -1
  47. package/dist/index-DTA86mHU.js.map +0 -1
  48. package/dist/index-DpLwTw4C.js.map +0 -1
  49. package/dist/index-loWqosf7.js +0 -331
  50. package/dist/index-loWqosf7.js.map +0 -1
  51. package/dist/services/ModalService/IPEModal.d.ts +0 -235
@@ -1,5 +1,5 @@
1
1
  import { j as s } from "./index-CvhkVj_L.js";
2
- import { B as I, S as b, a as v, I as S } from "./index-DpLwTw4C.js";
2
+ import { B as I, S as b, a as v, I as S } from "./index-9Z4ds-WM.js";
3
3
  import { A as w } from "./ActionButton-BgbTKTg7.js";
4
4
  const O = (r) => typeof r == "function";
5
5
  async function j(r) {
@@ -87,7 +87,7 @@ class u extends (D = I) {
87
87
  }).description(""),
88
88
  "about",
89
89
  {}
90
- ), import("./index-BT1mN_St.js").then((e) => {
90
+ ), import("./index-CNsB3Vcb.js").then((e) => {
91
91
  const t = this.ctx.plugin(e.PluginPreferencesUI);
92
92
  this.addDisposeHandler(() => {
93
93
  t.dispose();
@@ -168,4 +168,4 @@ k(f, 1, u);
168
168
  export {
169
169
  u as PluginPreferences
170
170
  };
171
- //# sourceMappingURL=index-DlgTb4XY.js.map
171
+ //# sourceMappingURL=index-BB9MXkUv.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-DlgTb4XY.js","sources":["../src/utils/computeable.ts","../src/plugins/preferences/index.tsx"],"sourcesContent":["export type ComputeAble<T> = (() => T | Promise<T>) | T\r\nconst isFunction = (value: any): value is Function => typeof value === 'function'\r\nexport async function computeFallback<T>(value: ComputeAble<T>): Promise<T> {\r\n if (isFunction(value)) {\r\n return await value()\r\n } else {\r\n return value\r\n }\r\n}\r\n","import { Inject, InPageEdit, Schema } from '@/InPageEdit.js'\r\nimport { IPEStorageItem, IPEStorageManager } from '@/services/StorageService.js'\r\nimport { computeFallback, ComputeAble } from '@/utils/computeable.js'\r\n\r\ndeclare module '@/InPageEdit' {\r\n export interface InPageEdit {\r\n preferences: PluginPreferences\r\n }\r\n}\r\n\r\nexport interface InPageEditPreferenceUICategory {\r\n name: string\r\n label: string\r\n description?: string\r\n index?: number\r\n}\r\n\r\nexport interface InPageEditPreferenceUIRegistryItem {\r\n name: string\r\n schema: Schema\r\n defaults: Record<string, any>\r\n category: string\r\n}\r\n\r\n@Inject(['storage'])\r\nexport class PluginPreferences extends BasePlugin {\r\n private db: IPEStorageManager<any>\r\n public customRegistries: InPageEditPreferenceUIRegistryItem[] = []\r\n public categoryDefinitions: InPageEditPreferenceUICategory[] = []\r\n private _defaultPreferences: Record<string, any> = {}\r\n\r\n constructor(public ctx: InPageEdit) {\r\n super(ctx, {}, 'preferences')\r\n this.db = ctx.storage.createDatabse<any>('preferences', Infinity)\r\n this.ctx.set('preferences', this)\r\n }\r\n\r\n async start() {\r\n this.defineCategory({\r\n name: 'general',\r\n label: 'General',\r\n description: 'General settings',\r\n })\r\n this.defineCategory({\r\n name: 'edit',\r\n label: 'Editing',\r\n description: 'Settings related to editing content',\r\n })\r\n this.defineCategory({\r\n name: 'about',\r\n label: 'About',\r\n description: 'About InPageEdit',\r\n index: 99,\r\n })\r\n\r\n this.registerCustomConfig(\r\n 'about',\r\n Schema.object({\r\n about: Schema.const(\r\n <div className=\"prose\">\r\n <h2>✏️ InPageEdit NEXT</h2>\r\n <i>v{this.ctx.version}</i>\r\n <h2>Portals</h2>\r\n <div style=\"display: flex; flex-direction: column; gap: 1rem\">\r\n <a\r\n href={this.ctx.Endpoints.HOME_URL}\r\n target=\"_blank\"\r\n style={{ display: 'block', width: '100%' }}\r\n >\r\n Official Website & Help Center\r\n </a>\r\n <ActionButton\r\n href={`${this.ctx.Endpoints.UPDATE_LOGS_URL}#${this.ctx.version}`}\r\n style={{ display: 'block', width: '100%' }}\r\n >\r\n Update Logs\r\n </ActionButton>\r\n </div>\r\n <h2>Join us</h2>\r\n <ul>\r\n <li>\r\n <strong>GitHub</strong>:{' '}\r\n <a href={this.ctx.Endpoints.GITHUB_URL} target=\"_blank\">\r\n inpageedit/inpageedit-next\r\n </a>\r\n </li>\r\n <li>\r\n <strong>QQ Group</strong>: 1026023666\r\n </li>\r\n </ul>\r\n <hr />\r\n <p>🚀 Modular, Extensible Supercharged Plugin for MediaWiki.</p>\r\n <p>InPageEdit-NEXT Copyright © 2025-present dragon-fish</p>\r\n </div>\r\n ).role('raw-html'),\r\n }).description(''),\r\n 'about',\r\n {}\r\n )\r\n\r\n import('./ui/index').then((module) => {\r\n const fork = this.ctx.plugin(module.PluginPreferencesUI)\r\n this.addDisposeHandler(() => {\r\n fork.dispose()\r\n })\r\n })\r\n }\r\n\r\n async get<T = any>(key: string, fallback?: ComputeAble<T>): Promise<T | null> {\r\n fallback ??= () => {\r\n const defaultValue = this.getDefaultValue(key)\r\n this.logger.debug(key, `(fallback value: ${defaultValue})`)\r\n return defaultValue as T\r\n }\r\n const value = (await this.db.get(key, undefined)) as T | null\r\n return value !== null ? value : ((await computeFallback(fallback)) as T)\r\n }\r\n\r\n getDefaultValue(key: string): unknown {\r\n return (this._defaultPreferences[key] ??= this.loadDefaultConfigs()[key])\r\n }\r\n\r\n set<T = any>(key: string, value: T): Promise<IPEStorageItem<T> | void> {\r\n const defaultValue = this.getDefaultValue(key)\r\n if (value === defaultValue) {\r\n return this.db.delete(key)\r\n } else {\r\n return this.db.set(key, value)\r\n }\r\n }\r\n\r\n async getAll() {\r\n const data = this.loadDefaultConfigs()\r\n await this.db.iterate((value: IPEStorageItem, key: string) => {\r\n data[key] = value\r\n })\r\n return data\r\n }\r\n\r\n private loadDefaultConfigs() {\r\n const data = {} as Record<string, any>\r\n this.getConfigRegistries().forEach((item) => {\r\n // 首先读取 schema 上的默认值\r\n try {\r\n const defaultValues = item.schema({}) as any\r\n Object.entries(defaultValues).forEach(([key, val]) => {\r\n data[key] = val\r\n })\r\n } catch {}\r\n\r\n // 然后读取注册时定义的默认值\r\n item.defaults &&\r\n Object.entries(item.defaults).forEach(([key, val]) => {\r\n data[key] = val\r\n })\r\n })\r\n\r\n Object.entries(data).forEach(([key, val]) => {\r\n this._defaultPreferences[key] = val\r\n })\r\n\r\n return data\r\n }\r\n\r\n registerCustomConfig(\r\n name: string,\r\n schema: Schema,\r\n category: string,\r\n defaults: Record<string, any>\r\n ) {\r\n this.customRegistries.push({\r\n name,\r\n schema,\r\n category,\r\n defaults,\r\n })\r\n return this\r\n }\r\n\r\n getConfigRegistries(category?: string): InPageEditPreferenceUIRegistryItem[] {\r\n return Array.from(this.ctx.registry.entries())\r\n .map<{\r\n name: string\r\n schema: Schema\r\n defaults: Record<string, any>\r\n }>(([plugin, fork]) => {\r\n if (plugin === null) {\r\n return {\r\n name: '@root',\r\n schema: (InPageEdit as any)?.PreferencesSchema || null,\r\n defaults: (InPageEdit as any)?.PreferencesDefaults || {},\r\n }\r\n } else {\r\n return {\r\n name: plugin.name,\r\n schema: (plugin as any)?.PreferencesSchema || null,\r\n defaults: (plugin as any)?.PreferencesDefaults || {},\r\n }\r\n }\r\n })\r\n .filter((item) => item.schema !== null)\r\n .map((item) => {\r\n return {\r\n ...item,\r\n category: item.schema.meta.category || 'general',\r\n }\r\n })\r\n .concat(this.customRegistries)\r\n .filter((item) => !category || item.category === category)\r\n }\r\n\r\n defineCategory(category: InPageEditPreferenceUICategory) {\r\n const index = this.categoryDefinitions.findIndex((tab) => tab.name === category.name)\r\n if (index < 0) {\r\n this.categoryDefinitions.push(category)\r\n } else {\r\n this.categoryDefinitions[index] = category\r\n }\r\n this.categoryDefinitions.sort((a, b) => {\r\n return (a.index ?? 0) - (b.index ?? 0)\r\n })\r\n return this\r\n }\r\n\r\n getConfigCategories() {\r\n return this.categoryDefinitions\r\n }\r\n}\r\n"],"names":["isFunction","value","computeFallback","_PluginPreferences_decorators","_init","_a","Inject","PluginPreferences","BasePlugin","ctx","Schema","jsxs","jsx","ActionButton","module","fork","key","fallback","defaultValue","data","item","defaultValues","val","name","schema","category","defaults","plugin","InPageEdit","index","tab","a","b","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
1
+ {"version":3,"file":"index-BB9MXkUv.js","sources":["../src/utils/computeable.ts","../src/plugins/preferences/index.tsx"],"sourcesContent":["export type ComputeAble<T> = (() => T | Promise<T>) | T\r\nconst isFunction = (value: any): value is Function => typeof value === 'function'\r\nexport async function computeFallback<T>(value: ComputeAble<T>): Promise<T> {\r\n if (isFunction(value)) {\r\n return await value()\r\n } else {\r\n return value\r\n }\r\n}\r\n","import { Inject, InPageEdit, Schema } from '@/InPageEdit.js'\r\nimport { IPEStorageItem, IPEStorageManager } from '@/services/StorageService.js'\r\nimport { computeFallback, ComputeAble } from '@/utils/computeable.js'\r\n\r\ndeclare module '@/InPageEdit' {\r\n export interface InPageEdit {\r\n preferences: PluginPreferences\r\n }\r\n}\r\n\r\nexport interface InPageEditPreferenceUICategory {\r\n name: string\r\n label: string\r\n description?: string\r\n index?: number\r\n}\r\n\r\nexport interface InPageEditPreferenceUIRegistryItem {\r\n name: string\r\n schema: Schema\r\n defaults: Record<string, any>\r\n category: string\r\n}\r\n\r\n@Inject(['storage'])\r\nexport class PluginPreferences extends BasePlugin {\r\n private db: IPEStorageManager<any>\r\n public customRegistries: InPageEditPreferenceUIRegistryItem[] = []\r\n public categoryDefinitions: InPageEditPreferenceUICategory[] = []\r\n private _defaultPreferences: Record<string, any> = {}\r\n\r\n constructor(public ctx: InPageEdit) {\r\n super(ctx, {}, 'preferences')\r\n this.db = ctx.storage.createDatabse<any>('preferences', Infinity)\r\n this.ctx.set('preferences', this)\r\n }\r\n\r\n async start() {\r\n this.defineCategory({\r\n name: 'general',\r\n label: 'General',\r\n description: 'General settings',\r\n })\r\n this.defineCategory({\r\n name: 'edit',\r\n label: 'Editing',\r\n description: 'Settings related to editing content',\r\n })\r\n this.defineCategory({\r\n name: 'about',\r\n label: 'About',\r\n description: 'About InPageEdit',\r\n index: 99,\r\n })\r\n\r\n this.registerCustomConfig(\r\n 'about',\r\n Schema.object({\r\n about: Schema.const(\r\n <div className=\"prose\">\r\n <h2>✏️ InPageEdit NEXT</h2>\r\n <i>v{this.ctx.version}</i>\r\n <h2>Portals</h2>\r\n <div style=\"display: flex; flex-direction: column; gap: 1rem\">\r\n <a\r\n href={this.ctx.Endpoints.HOME_URL}\r\n target=\"_blank\"\r\n style={{ display: 'block', width: '100%' }}\r\n >\r\n Official Website & Help Center\r\n </a>\r\n <ActionButton\r\n href={`${this.ctx.Endpoints.UPDATE_LOGS_URL}#${this.ctx.version}`}\r\n style={{ display: 'block', width: '100%' }}\r\n >\r\n Update Logs\r\n </ActionButton>\r\n </div>\r\n <h2>Join us</h2>\r\n <ul>\r\n <li>\r\n <strong>GitHub</strong>:{' '}\r\n <a href={this.ctx.Endpoints.GITHUB_URL} target=\"_blank\">\r\n inpageedit/inpageedit-next\r\n </a>\r\n </li>\r\n <li>\r\n <strong>QQ Group</strong>: 1026023666\r\n </li>\r\n </ul>\r\n <hr />\r\n <p>🚀 Modular, Extensible Supercharged Plugin for MediaWiki.</p>\r\n <p>InPageEdit-NEXT Copyright © 2025-present dragon-fish</p>\r\n </div>\r\n ).role('raw-html'),\r\n }).description(''),\r\n 'about',\r\n {}\r\n )\r\n\r\n import('./ui/index').then((module) => {\r\n const fork = this.ctx.plugin(module.PluginPreferencesUI)\r\n this.addDisposeHandler(() => {\r\n fork.dispose()\r\n })\r\n })\r\n }\r\n\r\n async get<T = any>(key: string, fallback?: ComputeAble<T>): Promise<T | null> {\r\n fallback ??= () => {\r\n const defaultValue = this.getDefaultValue(key)\r\n this.logger.debug(key, `(fallback value: ${defaultValue})`)\r\n return defaultValue as T\r\n }\r\n const value = (await this.db.get(key, undefined)) as T | null\r\n return value !== null ? value : ((await computeFallback(fallback)) as T)\r\n }\r\n\r\n getDefaultValue(key: string): unknown {\r\n return (this._defaultPreferences[key] ??= this.loadDefaultConfigs()[key])\r\n }\r\n\r\n set<T = any>(key: string, value: T): Promise<IPEStorageItem<T> | void> {\r\n const defaultValue = this.getDefaultValue(key)\r\n if (value === defaultValue) {\r\n return this.db.delete(key)\r\n } else {\r\n return this.db.set(key, value)\r\n }\r\n }\r\n\r\n async getAll() {\r\n const data = this.loadDefaultConfigs()\r\n await this.db.iterate((value: IPEStorageItem, key: string) => {\r\n data[key] = value\r\n })\r\n return data\r\n }\r\n\r\n private loadDefaultConfigs() {\r\n const data = {} as Record<string, any>\r\n this.getConfigRegistries().forEach((item) => {\r\n // 首先读取 schema 上的默认值\r\n try {\r\n const defaultValues = item.schema({}) as any\r\n Object.entries(defaultValues).forEach(([key, val]) => {\r\n data[key] = val\r\n })\r\n } catch {}\r\n\r\n // 然后读取注册时定义的默认值\r\n item.defaults &&\r\n Object.entries(item.defaults).forEach(([key, val]) => {\r\n data[key] = val\r\n })\r\n })\r\n\r\n Object.entries(data).forEach(([key, val]) => {\r\n this._defaultPreferences[key] = val\r\n })\r\n\r\n return data\r\n }\r\n\r\n registerCustomConfig(\r\n name: string,\r\n schema: Schema,\r\n category: string,\r\n defaults: Record<string, any>\r\n ) {\r\n this.customRegistries.push({\r\n name,\r\n schema,\r\n category,\r\n defaults,\r\n })\r\n return this\r\n }\r\n\r\n getConfigRegistries(category?: string): InPageEditPreferenceUIRegistryItem[] {\r\n return Array.from(this.ctx.registry.entries())\r\n .map<{\r\n name: string\r\n schema: Schema\r\n defaults: Record<string, any>\r\n }>(([plugin, fork]) => {\r\n if (plugin === null) {\r\n return {\r\n name: '@root',\r\n schema: (InPageEdit as any)?.PreferencesSchema || null,\r\n defaults: (InPageEdit as any)?.PreferencesDefaults || {},\r\n }\r\n } else {\r\n return {\r\n name: plugin.name,\r\n schema: (plugin as any)?.PreferencesSchema || null,\r\n defaults: (plugin as any)?.PreferencesDefaults || {},\r\n }\r\n }\r\n })\r\n .filter((item) => item.schema !== null)\r\n .map((item) => {\r\n return {\r\n ...item,\r\n category: item.schema.meta.category || 'general',\r\n }\r\n })\r\n .concat(this.customRegistries)\r\n .filter((item) => !category || item.category === category)\r\n }\r\n\r\n defineCategory(category: InPageEditPreferenceUICategory) {\r\n const index = this.categoryDefinitions.findIndex((tab) => tab.name === category.name)\r\n if (index < 0) {\r\n this.categoryDefinitions.push(category)\r\n } else {\r\n this.categoryDefinitions[index] = category\r\n }\r\n this.categoryDefinitions.sort((a, b) => {\r\n return (a.index ?? 0) - (b.index ?? 0)\r\n })\r\n return this\r\n }\r\n\r\n getConfigCategories() {\r\n return this.categoryDefinitions\r\n }\r\n}\r\n"],"names":["isFunction","value","computeFallback","_PluginPreferences_decorators","_init","_a","Inject","PluginPreferences","BasePlugin","ctx","Schema","jsxs","jsx","ActionButton","module","fork","key","fallback","defaultValue","data","item","defaultValues","val","name","schema","category","defaults","plugin","InPageEdit","index","tab","a","b","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { j as a } from "./index-CvhkVj_L.js";
2
- import { b as D, I as C, S as m } from "./index-DpLwTw4C.js";
2
+ import { b as D, I as C, S as m } from "./index-9Z4ds-WM.js";
3
3
  import { R as T } from "./Preferences-Bg3J5Ur9.js";
4
4
  var E = Object.create, x = Object.defineProperty, q = Object.getOwnPropertyDescriptor, y = (e, t) => (t = Symbol[e]) ? t : Symbol.for("Symbol." + e), _ = (e) => {
5
5
  throw TypeError(e);
@@ -136,4 +136,4 @@ O(f, 1, v);
136
136
  export {
137
137
  v as PluginToolbox
138
138
  };
139
- //# sourceMappingURL=index-VzP81S7B.js.map
139
+ //# sourceMappingURL=index-BDVcDlsf.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-VzP81S7B.js","sources":["../src/plugins/toolbox/index.tsx"],"sourcesContent":["import { Inject, InPageEdit, Schema, Service } from '@/InPageEdit'\r\nimport { JSX, ReactElement } from 'jsx-dom'\r\nimport './styles.scss'\r\n\r\ndeclare module '@/InPageEdit' {\r\n interface InPageEdit {\r\n toolbox: PluginToolbox\r\n }\r\n interface Events {\r\n 'toolbox/button-added'(payload: { ctx: InPageEdit; button: HTMLElement }): void\r\n 'toolbox/button-removed'(payload: { ctx: InPageEdit; id: string }): void\r\n }\r\n}\r\n\r\n@RegisterPreferences(\r\n Schema.object({\r\n toolboxAlwaysShow: Schema.boolean()\r\n .description('Make the toolbox opened by default')\r\n .default(false),\r\n }).description('Toolbox preferences')\r\n)\r\n@Inject(['preferences'])\r\nexport class PluginToolbox extends Service {\r\n container!: HTMLElement\r\n\r\n constructor(public ctx: InPageEdit) {\r\n super(ctx, 'toolbox', false)\r\n }\r\n\r\n protected async start(): Promise<void> {\r\n this.container = this.createToolbox()\r\n this.ctx.preferences.get('toolboxAlwaysShow').then((val) => {\r\n if (val) {\r\n this.container.classList.add('is-persistent')\r\n }\r\n })\r\n this.setupHoverLogic()\r\n document.body.appendChild(this.container)\r\n\r\n // 初始化时更新按钮延迟\r\n this.updateButtonDelays()\r\n }\r\n\r\n protected stop(): void | Promise<void> {\r\n this.container?.remove()\r\n }\r\n\r\n private get isPersistent() {\r\n return this.container.classList.contains('is-persistent')\r\n }\r\n\r\n private setupHoverLogic() {\r\n let hoverTimeout: number | null = null\r\n\r\n // 鼠标进入时暂时展开\r\n this.container.addEventListener('mouseenter', () => {\r\n if (hoverTimeout) {\r\n clearTimeout(hoverTimeout)\r\n hoverTimeout = null\r\n }\r\n\r\n // 如果不在持久化状态,则添加hover展开效果\r\n if (!this.isPersistent) {\r\n this.container.classList.add('is-hovered')\r\n }\r\n })\r\n\r\n // 鼠标离开时收起(如果不是持久化状态)\r\n this.container.addEventListener('mouseleave', () => {\r\n if (!this.isPersistent) {\r\n hoverTimeout = window.setTimeout(() => {\r\n this.container.classList.remove('is-hovered')\r\n }, 150) // 延迟150ms收起,避免快速移动鼠标时闪烁\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 计算按钮动画延迟\r\n * @param index 按钮索引(从0开始)\r\n * @param totalCount 总按钮数量\r\n * @returns 延迟时间(秒)\r\n */\r\n private calculateButtonDelay(index: number, totalCount: number): number {\r\n if (totalCount <= 1) return 0\r\n\r\n // 总动画时长150ms = 0.15s\r\n const totalDuration = 0.15\r\n // 使用平方根函数创建非线性延迟,差值逐渐缩小\r\n const normalizedIndex = index / (totalCount - 1)\r\n const delay = totalDuration * Math.sqrt(normalizedIndex)\r\n\r\n return Math.round(delay * 1000) / 1000 // 保留3位小数\r\n }\r\n\r\n /**\r\n * 更新按钮组的动画延迟\r\n */\r\n private updateButtonDelays() {\r\n const btnGroups = this.container.querySelectorAll('.btn-group')\r\n\r\n btnGroups.forEach((group) => {\r\n const buttons = group.querySelectorAll('.btn-tip-group')\r\n const totalCount = buttons.length\r\n\r\n buttons.forEach((button, index) => {\r\n const delay = this.calculateButtonDelay(index, totalCount)\r\n ;(button as HTMLElement).style.setProperty('--transition-delay', `${delay}s`)\r\n ;(button as HTMLElement).style.setProperty('--max-transition-delay', '0.15s')\r\n })\r\n })\r\n }\r\n\r\n private createToolbox() {\r\n const toggler = (\r\n <button\r\n className=\"ipe-toolbox-btn\"\r\n id=\"toolbox-toggler\"\r\n onClick={() => {\r\n this.toggle()\r\n }}\r\n >\r\n {/* Font Awesome 5 Solid: Plus */}\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"448\" height=\"512\" viewBox=\"0 0 448 512\">\r\n <rect width=\"448\" height=\"512\" fill=\"none\" />\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32\"\r\n />\r\n </svg>\r\n </button>\r\n )\r\n const element = (\r\n <div id=\"ipe-edit-toolbox\">\r\n <ul className=\"btn-group group1\" style={{ display: 'flex', flexDirection: 'column' }}></ul>\r\n <ul className=\"btn-group group2\" style={{ display: 'flex', flexDirection: 'row' }}></ul>\r\n {toggler}\r\n </div>\r\n )\r\n\r\n return element as HTMLElement\r\n }\r\n\r\n private normalizeButtonId(id: string) {\r\n if (!id) {\r\n id = Math.random().toString(36).substring(2, 8)\r\n }\r\n return `ipe-toolbox__${id.trim()}`.replace(/\\s\\.#/g, '-')\r\n }\r\n\r\n addButton(payload: {\r\n id: string\r\n group?: 'auto' | 'group1' | 'group2'\r\n icon: string | HTMLElement | SVGElement | ReactElement\r\n tooltip?: string | HTMLElement\r\n itemProps?: JSX.IntrinsicElements['li']\r\n buttonProps?: JSX.IntrinsicElements['button']\r\n onClick?: (event: MouseEvent) => void\r\n index?: number\r\n }) {\r\n let { id, group, icon, tooltip, itemProps, buttonProps, onClick, index } = payload\r\n id = this.normalizeButtonId(id)\r\n\r\n const existingButton = this.container.querySelector(`#${id}`)\r\n if (existingButton) {\r\n this.ctx.logger('toolbox').warn(`Button with id ${id} already exists, replacing it.`)\r\n existingButton.remove()\r\n }\r\n\r\n let groupEl: HTMLElement | null = null\r\n if (typeof group === 'undefined' || group === 'auto') {\r\n // 选择按钮最少的那一组,一样多就选第一组\r\n const group1 = this.container.querySelector('.btn-group.group1') as HTMLElement\r\n const group2 = this.container.querySelector('.btn-group.group2') as HTMLElement\r\n const group1Count = group1?.children.length || 0\r\n const group2Count = group2?.children.length || 0\r\n groupEl = group1Count <= group2Count ? group1 : group2\r\n } else {\r\n groupEl = this.container.querySelector(`.btn-group.${group}`)\r\n }\r\n if (!groupEl) throw new Error(`Button group ${group} not found`)\r\n\r\n const button = (\r\n <li class=\"btn-tip-group\" id={id} onClick={onClick} {...itemProps}>\r\n <div class=\"btn-tip\">{tooltip}</div>\r\n <button id={`${id}-btn`} class=\"ipe-toolbox-btn\" {...buttonProps}>\r\n {icon}\r\n </button>\r\n </li>\r\n )\r\n\r\n if (typeof index === 'number') {\r\n if (index <= 0) {\r\n groupEl.prepend(button)\r\n } else if (index >= groupEl.children.length) {\r\n groupEl.appendChild(button)\r\n } else {\r\n groupEl.children[index]?.before(button)\r\n }\r\n } else {\r\n groupEl.appendChild(button)\r\n }\r\n\r\n this.ctx.emit('toolbox/button-added', {\r\n ctx: this.ctx,\r\n button: button as HTMLElement,\r\n })\r\n\r\n // 更新按钮延迟\r\n this.updateButtonDelays()\r\n\r\n return button as HTMLElement\r\n }\r\n\r\n removeButton(id: string) {\r\n const button = this.container.querySelector(`.ipe-toolbox-btn#${id}`)\r\n button?.remove()\r\n this.ctx.emit('toolbox/button-removed', { ctx: this.ctx, id })\r\n\r\n // 更新按钮延迟\r\n this.updateButtonDelays()\r\n }\r\n\r\n getContainer() {\r\n return this.container\r\n }\r\n\r\n get isOpened() {\r\n return (\r\n this.container.classList.contains('is-persistent') ||\r\n this.container.classList.contains('is-hovered')\r\n )\r\n }\r\n\r\n toggle(force?: boolean) {\r\n const isPersistent = this.isPersistent\r\n const newPersistent = typeof force === 'boolean' ? force : !isPersistent\r\n this.container.classList.toggle('is-persistent', newPersistent)\r\n this.container.classList.remove('is-hovered')\r\n this.ctx.preferences.set('toolboxAlwaysShow', newPersistent)\r\n }\r\n}\r\n"],"names":["_PluginToolbox_decorators","_init","_a","RegisterPreferences","Schema","Inject","PluginToolbox","Service","ctx","val","hoverTimeout","index","totalCount","totalDuration","normalizedIndex","delay","group","buttons","button","jsxs","jsx","id","payload","icon","tooltip","itemProps","buttonProps","onClick","existingButton","groupEl","group1","group2","group1Count","group2Count","force","isPersistent","newPersistent","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
1
+ {"version":3,"file":"index-BDVcDlsf.js","sources":["../src/plugins/toolbox/index.tsx"],"sourcesContent":["import { Inject, InPageEdit, Schema, Service } from '@/InPageEdit'\r\nimport { JSX, ReactElement } from 'jsx-dom'\r\nimport './styles.scss'\r\n\r\ndeclare module '@/InPageEdit' {\r\n interface InPageEdit {\r\n toolbox: PluginToolbox\r\n }\r\n interface Events {\r\n 'toolbox/button-added'(payload: { ctx: InPageEdit; button: HTMLElement }): void\r\n 'toolbox/button-removed'(payload: { ctx: InPageEdit; id: string }): void\r\n }\r\n}\r\n\r\n@RegisterPreferences(\r\n Schema.object({\r\n toolboxAlwaysShow: Schema.boolean()\r\n .description('Make the toolbox opened by default')\r\n .default(false),\r\n }).description('Toolbox preferences')\r\n)\r\n@Inject(['preferences'])\r\nexport class PluginToolbox extends Service {\r\n container!: HTMLElement\r\n\r\n constructor(public ctx: InPageEdit) {\r\n super(ctx, 'toolbox', false)\r\n }\r\n\r\n protected async start(): Promise<void> {\r\n this.container = this.createToolbox()\r\n this.ctx.preferences.get('toolboxAlwaysShow').then((val) => {\r\n if (val) {\r\n this.container.classList.add('is-persistent')\r\n }\r\n })\r\n this.setupHoverLogic()\r\n document.body.appendChild(this.container)\r\n\r\n // 初始化时更新按钮延迟\r\n this.updateButtonDelays()\r\n }\r\n\r\n protected stop(): void | Promise<void> {\r\n this.container?.remove()\r\n }\r\n\r\n private get isPersistent() {\r\n return this.container.classList.contains('is-persistent')\r\n }\r\n\r\n private setupHoverLogic() {\r\n let hoverTimeout: number | null = null\r\n\r\n // 鼠标进入时暂时展开\r\n this.container.addEventListener('mouseenter', () => {\r\n if (hoverTimeout) {\r\n clearTimeout(hoverTimeout)\r\n hoverTimeout = null\r\n }\r\n\r\n // 如果不在持久化状态,则添加hover展开效果\r\n if (!this.isPersistent) {\r\n this.container.classList.add('is-hovered')\r\n }\r\n })\r\n\r\n // 鼠标离开时收起(如果不是持久化状态)\r\n this.container.addEventListener('mouseleave', () => {\r\n if (!this.isPersistent) {\r\n hoverTimeout = window.setTimeout(() => {\r\n this.container.classList.remove('is-hovered')\r\n }, 150) // 延迟150ms收起,避免快速移动鼠标时闪烁\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 计算按钮动画延迟\r\n * @param index 按钮索引(从0开始)\r\n * @param totalCount 总按钮数量\r\n * @returns 延迟时间(秒)\r\n */\r\n private calculateButtonDelay(index: number, totalCount: number): number {\r\n if (totalCount <= 1) return 0\r\n\r\n // 总动画时长150ms = 0.15s\r\n const totalDuration = 0.15\r\n // 使用平方根函数创建非线性延迟,差值逐渐缩小\r\n const normalizedIndex = index / (totalCount - 1)\r\n const delay = totalDuration * Math.sqrt(normalizedIndex)\r\n\r\n return Math.round(delay * 1000) / 1000 // 保留3位小数\r\n }\r\n\r\n /**\r\n * 更新按钮组的动画延迟\r\n */\r\n private updateButtonDelays() {\r\n const btnGroups = this.container.querySelectorAll('.btn-group')\r\n\r\n btnGroups.forEach((group) => {\r\n const buttons = group.querySelectorAll('.btn-tip-group')\r\n const totalCount = buttons.length\r\n\r\n buttons.forEach((button, index) => {\r\n const delay = this.calculateButtonDelay(index, totalCount)\r\n ;(button as HTMLElement).style.setProperty('--transition-delay', `${delay}s`)\r\n ;(button as HTMLElement).style.setProperty('--max-transition-delay', '0.15s')\r\n })\r\n })\r\n }\r\n\r\n private createToolbox() {\r\n const toggler = (\r\n <button\r\n className=\"ipe-toolbox-btn\"\r\n id=\"toolbox-toggler\"\r\n onClick={() => {\r\n this.toggle()\r\n }}\r\n >\r\n {/* Font Awesome 5 Solid: Plus */}\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"448\" height=\"512\" viewBox=\"0 0 448 512\">\r\n <rect width=\"448\" height=\"512\" fill=\"none\" />\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32\"\r\n />\r\n </svg>\r\n </button>\r\n )\r\n const element = (\r\n <div id=\"ipe-edit-toolbox\">\r\n <ul className=\"btn-group group1\" style={{ display: 'flex', flexDirection: 'column' }}></ul>\r\n <ul className=\"btn-group group2\" style={{ display: 'flex', flexDirection: 'row' }}></ul>\r\n {toggler}\r\n </div>\r\n )\r\n\r\n return element as HTMLElement\r\n }\r\n\r\n private normalizeButtonId(id: string) {\r\n if (!id) {\r\n id = Math.random().toString(36).substring(2, 8)\r\n }\r\n return `ipe-toolbox__${id.trim()}`.replace(/\\s\\.#/g, '-')\r\n }\r\n\r\n addButton(payload: {\r\n id: string\r\n group?: 'auto' | 'group1' | 'group2'\r\n icon: string | HTMLElement | SVGElement | ReactElement\r\n tooltip?: string | HTMLElement\r\n itemProps?: JSX.IntrinsicElements['li']\r\n buttonProps?: JSX.IntrinsicElements['button']\r\n onClick?: (event: MouseEvent) => void\r\n index?: number\r\n }) {\r\n let { id, group, icon, tooltip, itemProps, buttonProps, onClick, index } = payload\r\n id = this.normalizeButtonId(id)\r\n\r\n const existingButton = this.container.querySelector(`#${id}`)\r\n if (existingButton) {\r\n this.ctx.logger('toolbox').warn(`Button with id ${id} already exists, replacing it.`)\r\n existingButton.remove()\r\n }\r\n\r\n let groupEl: HTMLElement | null = null\r\n if (typeof group === 'undefined' || group === 'auto') {\r\n // 选择按钮最少的那一组,一样多就选第一组\r\n const group1 = this.container.querySelector('.btn-group.group1') as HTMLElement\r\n const group2 = this.container.querySelector('.btn-group.group2') as HTMLElement\r\n const group1Count = group1?.children.length || 0\r\n const group2Count = group2?.children.length || 0\r\n groupEl = group1Count <= group2Count ? group1 : group2\r\n } else {\r\n groupEl = this.container.querySelector(`.btn-group.${group}`)\r\n }\r\n if (!groupEl) throw new Error(`Button group ${group} not found`)\r\n\r\n const button = (\r\n <li class=\"btn-tip-group\" id={id} onClick={onClick} {...itemProps}>\r\n <div class=\"btn-tip\">{tooltip}</div>\r\n <button id={`${id}-btn`} class=\"ipe-toolbox-btn\" {...buttonProps}>\r\n {icon}\r\n </button>\r\n </li>\r\n )\r\n\r\n if (typeof index === 'number') {\r\n if (index <= 0) {\r\n groupEl.prepend(button)\r\n } else if (index >= groupEl.children.length) {\r\n groupEl.appendChild(button)\r\n } else {\r\n groupEl.children[index]?.before(button)\r\n }\r\n } else {\r\n groupEl.appendChild(button)\r\n }\r\n\r\n this.ctx.emit('toolbox/button-added', {\r\n ctx: this.ctx,\r\n button: button as HTMLElement,\r\n })\r\n\r\n // 更新按钮延迟\r\n this.updateButtonDelays()\r\n\r\n return button as HTMLElement\r\n }\r\n\r\n removeButton(id: string) {\r\n const button = this.container.querySelector(`.ipe-toolbox-btn#${id}`)\r\n button?.remove()\r\n this.ctx.emit('toolbox/button-removed', { ctx: this.ctx, id })\r\n\r\n // 更新按钮延迟\r\n this.updateButtonDelays()\r\n }\r\n\r\n getContainer() {\r\n return this.container\r\n }\r\n\r\n get isOpened() {\r\n return (\r\n this.container.classList.contains('is-persistent') ||\r\n this.container.classList.contains('is-hovered')\r\n )\r\n }\r\n\r\n toggle(force?: boolean) {\r\n const isPersistent = this.isPersistent\r\n const newPersistent = typeof force === 'boolean' ? force : !isPersistent\r\n this.container.classList.toggle('is-persistent', newPersistent)\r\n this.container.classList.remove('is-hovered')\r\n this.ctx.preferences.set('toolboxAlwaysShow', newPersistent)\r\n }\r\n}\r\n"],"names":["_PluginToolbox_decorators","_init","_a","RegisterPreferences","Schema","Inject","PluginToolbox","Service","ctx","val","hoverTimeout","index","totalCount","totalDuration","normalizedIndex","delay","group","buttons","button","jsxs","jsx","id","payload","icon","tooltip","itemProps","buttonProps","onClick","existingButton","groupEl","group1","group2","group1Count","group2Count","force","isPersistent","newPersistent","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- import { j as a, F as Ee, P as Ne } from "./index-CvhkVj_L.js";
2
- import { B as K, I as Se, S as P } from "./index-DpLwTw4C.js";
3
- import { I as Pe } from "./IconQuickEdit-YVn1ANbm.js";
1
+ import { j as a, F as Ne, P as Ee } from "./index-CvhkVj_L.js";
2
+ import { B as K, I as Se, S as P } from "./index-9Z4ds-WM.js";
3
+ import { I as Pe } from "./IconQuickEdit-CAL1HXIb.js";
4
4
  import { R as We } from "./Preferences-Bg3J5Ur9.js";
5
5
  import { R as _e } from "./RadioBox-nJqWsxW2.js";
6
6
  import { M as Oe } from "./index-lZkYoUca.js";
7
- class E {
7
+ class N {
8
8
  diff(e, n, i = {}) {
9
9
  let s;
10
10
  typeof i == "function" ? (s = i, i = {}) : "callback" in i && (s = i.callback);
@@ -36,8 +36,8 @@ class E {
36
36
  p && (w[d - 1] = void 0);
37
37
  let D = !1;
38
38
  if (k) {
39
- const N = k.oldPos - d;
40
- D = k && 0 <= N && N < o;
39
+ const E = k.oldPos - d;
40
+ D = k && 0 <= E && E < o;
41
41
  }
42
42
  const b = p && p.oldPos + 1 < f;
43
43
  if (!D && !b) {
@@ -135,7 +135,7 @@ class E {
135
135
  return s;
136
136
  }
137
137
  }
138
- class Te extends E {
138
+ class Te extends N {
139
139
  }
140
140
  const ee = new Te();
141
141
  function te(t, e, n) {
@@ -162,7 +162,7 @@ function $(t, e, n) {
162
162
  throw Error(`string ${JSON.stringify(t)} doesn't start with prefix ${JSON.stringify(e)}; this is a bug`);
163
163
  return n + t.slice(e.length);
164
164
  }
165
- function q(t, e, n) {
165
+ function H(t, e, n) {
166
166
  if (!e)
167
167
  return t + n;
168
168
  if (t.slice(-e.length) != e)
@@ -173,7 +173,7 @@ function W(t, e) {
173
173
  return $(t, e, "");
174
174
  }
175
175
  function O(t, e) {
176
- return q(t, e, "");
176
+ return H(t, e, "");
177
177
  }
178
178
  function X(t, e) {
179
179
  return e.slice(0, Le(t, e));
@@ -204,7 +204,7 @@ function Fe(t) {
204
204
  `) && !t.startsWith(`
205
205
  `) && !t.match(/[^\r]\n/);
206
206
  }
207
- function je(t) {
207
+ function Ae(t) {
208
208
  return !t.includes(`\r
209
209
  `) && t.includes(`
210
210
  `);
@@ -219,8 +219,8 @@ function S(t) {
219
219
  const e = t.match(/^\s*/);
220
220
  return e ? e[0] : "";
221
221
  }
222
- const L = "a-zA-Z0-9_\\u{C0}-\\u{FF}\\u{D8}-\\u{F6}\\u{F8}-\\u{2C6}\\u{2C8}-\\u{2D7}\\u{2DE}-\\u{2FF}\\u{1E00}-\\u{1EFF}", Ae = new RegExp(`[${L}]+|\\s+|[^${L}]`, "ug");
223
- class Ie extends E {
222
+ const L = "a-zA-Z0-9_\\u{C0}-\\u{FF}\\u{D8}-\\u{F6}\\u{F8}-\\u{2C6}\\u{2C8}-\\u{2D7}\\u{2DE}-\\u{2FF}\\u{1E00}-\\u{1EFF}", je = new RegExp(`[${L}]+|\\s+|[^${L}]`, "ug");
223
+ class Ie extends N {
224
224
  equals(e, n, i) {
225
225
  return i.ignoreCase && (e = e.toLowerCase(), n = n.toLowerCase()), e.trim() === n.trim();
226
226
  }
@@ -232,7 +232,7 @@ class Ie extends E {
232
232
  throw new Error('The segmenter passed must have a granularity of "word"');
233
233
  i = Array.from(l.segment(e), (o) => o.segment);
234
234
  } else
235
- i = e.match(Ae) || [];
235
+ i = e.match(je) || [];
236
236
  const s = [];
237
237
  let r = null;
238
238
  return i.forEach((l) => {
@@ -260,7 +260,7 @@ function Z(t, e, n, i) {
260
260
  const s = S(e.value), r = _(e.value), l = S(n.value), o = _(n.value);
261
261
  if (t) {
262
262
  const f = V(s, l);
263
- t.value = q(t.value, l, f), e.value = W(e.value, f), n.value = W(n.value, f);
263
+ t.value = H(t.value, l, f), e.value = W(e.value, f), n.value = W(n.value, f);
264
264
  }
265
265
  if (i) {
266
266
  const f = Y(r, o);
@@ -279,7 +279,7 @@ function Z(t, e, n, i) {
279
279
  const s = S(i.value), r = S(e.value), l = _(e.value), o = V(s, r);
280
280
  e.value = W(e.value, o);
281
281
  const f = Y(W(s, o), l);
282
- e.value = O(e.value, f), i.value = $(i.value, s, f), t.value = q(t.value, s, s.slice(0, s.length - f.length));
282
+ e.value = O(e.value, f), i.value = $(i.value, s, f), t.value = H(t.value, s, s.slice(0, s.length - f.length));
283
283
  } else if (i) {
284
284
  const s = S(i.value), r = _(e.value), l = X(r, s);
285
285
  e.value = O(e.value, l);
@@ -288,7 +288,7 @@ function Z(t, e, n, i) {
288
288
  e.value = W(e.value, l);
289
289
  }
290
290
  }
291
- class ze extends E {
291
+ class ze extends N {
292
292
  tokenize(e) {
293
293
  const n = new RegExp(`(\\r?\\n)|[${L}]+|[^\\S\\n\\r]+|[^${L}]`, "ug");
294
294
  return e.match(n) || [];
@@ -306,7 +306,7 @@ function $e(t, e) {
306
306
  Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]);
307
307
  return e;
308
308
  }
309
- class qe extends E {
309
+ class He extends N {
310
310
  constructor() {
311
311
  super(...arguments), this.tokenize = le;
312
312
  }
@@ -318,7 +318,7 @@ class qe extends E {
318
318
  `) && (n = n.slice(0, -1))), super.equals(e, n, i);
319
319
  }
320
320
  }
321
- const R = new qe();
321
+ const R = new He();
322
322
  function F(t, e, n) {
323
323
  return R.diff(t, e, n);
324
324
  }
@@ -336,10 +336,10 @@ function le(t, e) {
336
336
  }
337
337
  return n;
338
338
  }
339
- function He(t) {
339
+ function qe(t) {
340
340
  return t == "." || t == "!" || t == "?";
341
341
  }
342
- class Me extends E {
342
+ class Me extends N {
343
343
  tokenize(e) {
344
344
  var n;
345
345
  const i = [];
@@ -349,7 +349,7 @@ class Me extends E {
349
349
  i.push(e.slice(s));
350
350
  break;
351
351
  }
352
- if (He(e[r]) && e[r + 1].match(/\s/)) {
352
+ if (qe(e[r]) && e[r + 1].match(/\s/)) {
353
353
  for (i.push(e.slice(s, r + 1)), r = s = r + 1; !((n = e[r + 1]) === null || n === void 0) && n.match(/\s/); )
354
354
  r++;
355
355
  i.push(e.slice(s, r + 1)), s = r + 1;
@@ -362,7 +362,7 @@ const oe = new Me();
362
362
  function fe(t, e, n) {
363
363
  return oe.diff(t, e, n);
364
364
  }
365
- class Re extends E {
365
+ class Re extends N {
366
366
  tokenize(e) {
367
367
  return e.split(/([{}:;,]|\s+)/);
368
368
  }
@@ -371,7 +371,7 @@ const ae = new Re();
371
371
  function ce(t, e, n) {
372
372
  return ae.diff(t, e, n);
373
373
  }
374
- class Je extends E {
374
+ class Je extends N {
375
375
  constructor() {
376
376
  super(...arguments), this.tokenize = le;
377
377
  }
@@ -380,7 +380,7 @@ class Je extends E {
380
380
  }
381
381
  castInput(e, n) {
382
382
  const { undefinedReplacement: i, stringifyReplacer: s = (r, l) => typeof l > "u" ? i : l } = n;
383
- return typeof e == "string" ? e : JSON.stringify(j(e, null, null, s), null, " ");
383
+ return typeof e == "string" ? e : JSON.stringify(A(e, null, null, s), null, " ");
384
384
  }
385
385
  equals(e, n, i) {
386
386
  return super.equals(e.replace(/,([\r\n])/g, "$1"), n.replace(/,([\r\n])/g, "$1"), i);
@@ -390,7 +390,7 @@ const ue = new Je();
390
390
  function de(t, e, n) {
391
391
  return ue.diff(t, e, n);
392
392
  }
393
- function j(t, e, n, i, s) {
393
+ function A(t, e, n, i, s) {
394
394
  e = e || [], n = n || [], i && (t = i(s === void 0 ? "" : s, t));
395
395
  let r;
396
396
  for (r = 0; r < e.length; r += 1)
@@ -399,7 +399,7 @@ function j(t, e, n, i, s) {
399
399
  let l;
400
400
  if (Object.prototype.toString.call(t) === "[object Array]") {
401
401
  for (e.push(t), l = new Array(t.length), n.push(l), r = 0; r < t.length; r += 1)
402
- l[r] = j(t[r], e, n, i, String(r));
402
+ l[r] = A(t[r], e, n, i, String(r));
403
403
  return e.pop(), n.pop(), l;
404
404
  }
405
405
  if (t && t.toJSON && (t = t.toJSON()), typeof t == "object" && t !== null) {
@@ -409,13 +409,13 @@ function j(t, e, n, i, s) {
409
409
  for (f in t)
410
410
  Object.prototype.hasOwnProperty.call(t, f) && o.push(f);
411
411
  for (o.sort(), r = 0; r < o.length; r += 1)
412
- f = o[r], l[f] = j(t[f], e, n, i, f);
412
+ f = o[r], l[f] = A(t[f], e, n, i, f);
413
413
  e.pop(), n.pop();
414
414
  } else
415
415
  l = t;
416
416
  return l;
417
417
  }
418
- class Ue extends E {
418
+ class Ue extends N {
419
419
  tokenize(e) {
420
420
  return e.slice();
421
421
  }
@@ -528,7 +528,7 @@ function pe(t, e, n = {}) {
528
528
  return Ye(t, i[0], n);
529
529
  }
530
530
  function Ye(t, e, n = {}) {
531
- (n.autoConvertLineEndings || n.autoConvertLineEndings == null) && (Fe(t) && Qe(e) ? e = ge(e) : je(t) && Be(e) && (e = ve(e)));
531
+ (n.autoConvertLineEndings || n.autoConvertLineEndings == null) && (Fe(t) && Qe(e) ? e = ge(e) : Ae(t) && Be(e) && (e = ve(e)));
532
532
  const i = t.split(`
533
533
  `), s = e.hunks, r = n.compareLine || ((m, v, x, C) => v === C), l = n.fuzzFactor || 0;
534
534
  let o = 0;
@@ -558,19 +558,19 @@ function Ye(t, e, n = {}) {
558
558
  function g(m, v, x, C = 0, d = !0, u = [], p = 0) {
559
559
  let k = 0, D = !1;
560
560
  for (; C < m.length; C++) {
561
- const b = m[C], N = b.length > 0 ? b[0] : " ", z = b.length > 0 ? b.substr(1) : b;
562
- if (N === "-")
563
- if (r(v + 1, i[v], N, z))
561
+ const b = m[C], E = b.length > 0 ? b[0] : " ", z = b.length > 0 ? b.substr(1) : b;
562
+ if (E === "-")
563
+ if (r(v + 1, i[v], E, z))
564
564
  v++, k = 0;
565
565
  else
566
566
  return !x || i[v] == null ? null : (u[p] = i[v], g(m, v + 1, x - 1, C, !1, u, p + 1));
567
- if (N === "+") {
567
+ if (E === "+") {
568
568
  if (!d)
569
569
  return null;
570
570
  u[p] = z, p++, k = 0, D = !0;
571
571
  }
572
- if (N === " ")
573
- if (k++, u[p] = i[v], r(v + 1, i[v], N, z))
572
+ if (E === " ")
573
+ if (k++, u[p] = i[v], r(v + 1, i[v], E, z))
574
574
  p++, d = !0, D = !1, v++;
575
575
  else
576
576
  return D || !x ? null : i[v] && (g(m, v + 1, x - 1, C + 1, !1, u, p + 1) || g(m, v + 1, x - 1, C, !1, u, p + 1)) || g(m, v, x - 1, C + 1, !1, u, p);
@@ -639,7 +639,7 @@ function we(t) {
639
639
  lines: e.lines.map((n) => n.startsWith("-") ? `+${n.slice(1)}` : n.startsWith("+") ? `-${n.slice(1)}` : n)
640
640
  })) });
641
641
  }
642
- function H(t, e, n, i, s, r, l) {
642
+ function q(t, e, n, i, s, r, l) {
643
643
  let o;
644
644
  l ? typeof l == "function" ? o = { callback: l } : o = l : o = {}, typeof o.context > "u" && (o.context = 4);
645
645
  const f = o.context;
@@ -708,9 +708,9 @@ function H(t, e, n, i, s, r, l) {
708
708
  };
709
709
  }
710
710
  }
711
- function A(t) {
711
+ function j(t) {
712
712
  if (Array.isArray(t))
713
- return t.map(A).join(`
713
+ return t.map(j).join(`
714
714
  `);
715
715
  const e = [];
716
716
  t.oldFileName == t.newFileName && e.push("Index: " + t.oldFileName), e.push("==================================================================="), e.push("--- " + t.oldFileName + (typeof t.oldHeader > "u" ? "" : " " + t.oldHeader)), e.push("+++ " + t.newFileName + (typeof t.newHeader > "u" ? "" : " " + t.newHeader));
@@ -727,12 +727,12 @@ function A(t) {
727
727
  function U(t, e, n, i, s, r, l) {
728
728
  if (typeof l == "function" && (l = { callback: l }), l?.callback) {
729
729
  const { callback: o } = l;
730
- H(t, e, n, i, s, r, Object.assign(Object.assign({}, l), { callback: (f) => {
731
- o(f ? A(f) : void 0);
730
+ q(t, e, n, i, s, r, Object.assign(Object.assign({}, l), { callback: (f) => {
731
+ o(f ? j(f) : void 0);
732
732
  } }));
733
733
  } else {
734
- const o = H(t, e, n, i, s, r, l);
735
- return o ? A(o) : void 0;
734
+ const o = q(t, e, n, i, s, r, l);
735
+ return o ? j(o) : void 0;
736
736
  }
737
737
  }
738
738
  function Ze(t, e, n, i, s, r) {
@@ -766,11 +766,11 @@ function tt(t) {
766
766
  }
767
767
  const nt = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
768
768
  __proto__: null,
769
- Diff: E,
769
+ Diff: N,
770
770
  applyPatch: pe,
771
771
  applyPatches: Xe,
772
772
  arrayDiff: me,
773
- canonicalize: j,
773
+ canonicalize: A,
774
774
  characterDiff: ee,
775
775
  convertChangesToDMP: Ke,
776
776
  convertChangesToXML: et,
@@ -786,13 +786,13 @@ const nt = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
786
786
  diffTrimmedLines: se,
787
787
  diffWords: ie,
788
788
  diffWordsWithSpace: M,
789
- formatPatch: A,
789
+ formatPatch: j,
790
790
  jsonDiff: ue,
791
791
  lineDiff: R,
792
792
  parsePatch: J,
793
793
  reversePatch: we,
794
794
  sentenceDiff: oe,
795
- structuredPatch: H,
795
+ structuredPatch: q,
796
796
  wordDiff: ne,
797
797
  wordsWithSpaceDiff: re
798
798
  }, Symbol.toStringTag, { value: "Module" }));
@@ -870,7 +870,7 @@ const lt = new Intl.DateTimeFormat(void 0, {
870
870
  ) }),
871
871
  /* @__PURE__ */ a("div", { className: "mw-diff-title--user", children: t.username && /* @__PURE__ */ a(st, { ctx: t.ctx, user: t.username, target: "_blank" }) }),
872
872
  /* @__PURE__ */ a("div", { className: "mw-diff-title--timestamp", children: t.timestamp && lt(new Date(t.timestamp)) }),
873
- /* @__PURE__ */ a("div", { className: "mw-diff-title--comment", children: t.parsedcomment && /* @__PURE__ */ a(Ee, { children: [
873
+ /* @__PURE__ */ a("div", { className: "mw-diff-title--comment", children: t.parsedcomment && /* @__PURE__ */ a(Ne, { children: [
874
874
  "(",
875
875
  /* @__PURE__ */ a("i", { innerHTML: t.parsedcomment }),
876
876
  ")"
@@ -1021,7 +1021,6 @@ class I extends (be = K) {
1021
1021
  this.ctx.set("quickDiff", this), this.ctx.on("quick-edit/wiki-page", this.injectQuickEdit.bind(this)), window.RLQ.push(this.injectHistoryPage.bind(this));
1022
1022
  }
1023
1023
  stop() {
1024
- this.ctx.off("quick-edit/wiki-page", this.injectQuickEdit.bind(this));
1025
1024
  }
1026
1025
  injectHistoryPage() {
1027
1026
  const e = at("#mw-history-compare");
@@ -1049,10 +1048,10 @@ class I extends (be = K) {
1049
1048
  );
1050
1049
  });
1051
1050
  }
1052
- injectQuickEdit({ modal: e, wikiPage: n }) {
1053
- if (n.pageid === 0)
1051
+ injectQuickEdit({ modal: e, wikiPage: n, options: i }) {
1052
+ if (n.pageid === 0 || i.section === "new")
1054
1053
  return;
1055
- let i;
1054
+ let s;
1056
1055
  e.addButton(
1057
1056
  {
1058
1057
  label: "Diff",
@@ -1060,26 +1059,26 @@ class I extends (be = K) {
1060
1059
  keyPress: "ctrl-d",
1061
1060
  className: "btn btn-secondary",
1062
1061
  method: () => {
1063
- const s = n.title, r = n.revisions?.[0]?.content || "", l = e.get$content().querySelector('textarea[name="text"]')?.value || "";
1064
- return r === l ? this.ctx.modal.notify("info", { title: "Quick Diff", content: "No changes" }) : (i = this.comparePages(
1062
+ const r = n.title, l = n.revisions?.[0]?.content || "", o = e.get$content().querySelector('textarea[name="text"]')?.value || "";
1063
+ return l === o ? this.ctx.modal.notify("info", { title: "Quick Diff", content: "No changes" }) : (s = this.comparePages(
1065
1064
  {
1066
- fromtitle: s,
1067
- fromtext: r,
1068
- totitle: s,
1069
- totext: l,
1065
+ fromtitle: r,
1066
+ fromtext: l,
1067
+ totitle: r,
1068
+ totext: o,
1070
1069
  topst: !0
1071
1070
  },
1072
- i,
1071
+ s,
1073
1072
  {
1074
1073
  backdrop: !1,
1075
1074
  draggable: !0
1076
1075
  }
1077
- ), i);
1076
+ ), s);
1078
1077
  }
1079
1078
  },
1080
1079
  2
1081
1080
  ), e.on(e.Event.Close, () => {
1082
- i?.destroy(), i = void 0;
1081
+ s?.destroy(), s = void 0;
1083
1082
  });
1084
1083
  }
1085
1084
  simpleTextDiff(e, n) {
@@ -1166,7 +1165,7 @@ class I extends (be = K) {
1166
1165
  "section",
1167
1166
  {
1168
1167
  style: { height: "70vh", display: "flex", justifyContent: "center", alignItems: "center" },
1169
- children: /* @__PURE__ */ a(Ne, {})
1168
+ children: /* @__PURE__ */ a(Ee, {})
1170
1169
  }
1171
1170
  )
1172
1171
  ), n.bringToFront(), window.mw && mw.loader.getState("mediawiki.diff.styles") !== "ready" && mw.loader.load(["mediawiki.diff.styles"]), this.ctx.api.post({
@@ -1176,13 +1175,6 @@ class I extends (be = K) {
1176
1175
  format: "json",
1177
1176
  formatversion: 2
1178
1177
  }).then((s) => {
1179
- if (s.data?.error || s.data?.errors) {
1180
- const o = [s.data?.error, ...s.data?.errors || []].filter(
1181
- Boolean
1182
- );
1183
- throw new Error(o.map((f) => f.info).join(`
1184
- `), { cause: s });
1185
- }
1186
1178
  if (!s.data.compare)
1187
1179
  throw new Error("No compare data received", { cause: s });
1188
1180
  const {
@@ -1254,4 +1246,4 @@ class St extends K {
1254
1246
  export {
1255
1247
  St as PluginQuickDiff
1256
1248
  };
1257
- //# sourceMappingURL=index--xn9BebC.js.map
1249
+ //# sourceMappingURL=index-CADkQBg0.js.map