@inpageedit/core 0.14.2 → 0.14.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{BasePlugin-YOi2_vUo.js → BasePlugin-DD7l-5Xw.js} +2 -2
- package/dist/{BasePlugin-YOi2_vUo.js.map → BasePlugin-DD7l-5Xw.js.map} +1 -1
- package/dist/{PluginPrefSync-jTNlRQE-.js → PluginPrefSync-CbFuuC19.js} +3 -3
- package/dist/{PluginPrefSync-jTNlRQE-.js.map → PluginPrefSync-CbFuuC19.js.map} +1 -1
- package/dist/{PluginStoreApp-CGNxKXAN.js → PluginStoreApp-qiSVtnBy.js} +2 -2
- package/dist/{PluginStoreApp-CGNxKXAN.js.map → PluginStoreApp-qiSVtnBy.js.map} +1 -1
- package/dist/Preferences-C10tZMl1.js +2701 -0
- package/dist/Preferences-C10tZMl1.js.map +1 -0
- package/dist/{index-3NZkG2a3.js → index-BXNyXvre.js} +3 -3
- package/dist/{index-3NZkG2a3.js.map → index-BXNyXvre.js.map} +1 -1
- package/dist/{index-Dclp60EO.js → index-BanevHQ2.js} +3 -3
- package/dist/{index-Dclp60EO.js.map → index-BanevHQ2.js.map} +1 -1
- package/dist/index-BjDTD66_.js +491 -0
- package/dist/index-BjDTD66_.js.map +1 -0
- package/dist/{index-D97lUU3h.js → index-BpQ6VGMz.js} +55 -55
- package/dist/index-BpQ6VGMz.js.map +1 -0
- package/dist/{index-D-fW3ESK.js → index-CnR6CqkM.js} +2 -2
- package/dist/{index-D-fW3ESK.js.map → index-CnR6CqkM.js.map} +1 -1
- package/dist/{index-DELHsLHS.js → index-DKCZDN-Q.js} +4 -4
- package/dist/{index-DELHsLHS.js.map → index-DKCZDN-Q.js.map} +1 -1
- package/dist/{index-BBNseJXG.js → index-DVOc6fB6.js} +3 -3
- package/dist/{index-BBNseJXG.js.map → index-DVOc6fB6.js.map} +1 -1
- package/dist/{index-D6zFqL2u.js → index-De25v1_Q.js} +3 -3
- package/dist/{index-D6zFqL2u.js.map → index-De25v1_Q.js.map} +1 -1
- package/dist/{index-BrYKe18j.js → index-DensW9qt.js} +3 -3
- package/dist/{index-BrYKe18j.js.map → index-DensW9qt.js.map} +1 -1
- package/dist/{index-QtEF2mzS.js → index-DrIf5j8O.js} +4 -4
- package/dist/{index-QtEF2mzS.js.map → index-DrIf5j8O.js.map} +1 -1
- package/dist/index-MgXERLzL.js +3090 -0
- package/dist/index-MgXERLzL.js.map +1 -0
- package/dist/{index-DmLoihN1.js → index-WfXtYVMt.js} +134 -131
- package/dist/index-WfXtYVMt.js.map +1 -0
- package/dist/index.d.ts +15 -8
- package/dist/index.js +5 -5
- package/dist/models/index.js +7 -503
- package/dist/models/index.js.map +1 -1
- package/dist/plugins/index.js +10 -10
- package/dist/services/index.js +1 -1
- package/lib/index.umd.js +11 -11
- package/lib/index.umd.js.map +1 -1
- package/package.json +1 -1
- package/dist/Preferences-BF2fcXrn.js +0 -1539
- package/dist/Preferences-BF2fcXrn.js.map +0 -1
- package/dist/index-C3m6ng6b.js +0 -4245
- package/dist/index-C3m6ng6b.js.map +0 -1
- package/dist/index-D97lUU3h.js.map +0 -1
- package/dist/index-DmLoihN1.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-BjDTD66_.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 createonly?: boolean\n recreate?: boolean\n starttimestamp?: string\n baserevid?: number\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 & MwApiParams,\n /** @deprecated Append params in `payload` instead */\n params?: MwApiParams\n ): Promise<FexiosFinalContext<MwApiResponse<{ success: boolean }>>>\n createOnly(\n payload: Pick<WikiPageEditPayload, 'summary' | 'watchlist'> & {\n text: string\n recreate?: boolean\n },\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 & MwApiParams, params?: MwApiParams) {\n return this.api.postWithEditToken({\n action: 'edit',\n title: this.title,\n starttimestamp: this.pageInfo.touched,\n basetimestamp: this.revisions[0]?.timestamp,\n ...payload,\n ...params,\n })\n }\n async createOnly(\n payload: Pick<WikiPageEditPayload, 'summary' | 'watchlist'> & {\n text: string\n recreate?: boolean\n },\n params?: MwApiParams\n ) {\n return this.edit(payload, { createonly: 1, recreate: payload.recreate, ...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","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,11 +1,11 @@
|
|
|
1
|
-
import { j as i, F as
|
|
1
|
+
import { j as i, F as E, P as S } from "./index-CM_6yF2v.js";
|
|
2
2
|
import { I as C } from "./IconQuickEdit-CMCQncyj.js";
|
|
3
|
-
import {
|
|
4
|
-
import { B as
|
|
5
|
-
import { M as
|
|
6
|
-
const
|
|
7
|
-
let { user: e, target: r, ctx:
|
|
8
|
-
const n =
|
|
3
|
+
import { q as $, h as q, I as z, R as j, S as b } from "./Preferences-C10tZMl1.js";
|
|
4
|
+
import { B as I } from "./BasePlugin-DD7l-5Xw.js";
|
|
5
|
+
import { M as T } from "./index-CG38LlAh.js";
|
|
6
|
+
const O = (t) => {
|
|
7
|
+
let { user: e, target: r, ctx: a } = t;
|
|
8
|
+
const n = a.getUrl.bind(a);
|
|
9
9
|
return /* @__PURE__ */ i("span", { className: "mw-userlinks", children: [
|
|
10
10
|
/* @__PURE__ */ i("a", { href: n(`User:${e}`), className: "mw-userlink", target: r, children: e }),
|
|
11
11
|
" ",
|
|
@@ -37,15 +37,15 @@ const I = (t) => {
|
|
|
37
37
|
] });
|
|
38
38
|
};
|
|
39
39
|
var m = /* @__PURE__ */ ((t) => (t.update = "ipe:diff-table/update", t.edit = "ipe:diff-table/edit", t))(m || {});
|
|
40
|
-
const
|
|
40
|
+
const L = new Intl.DateTimeFormat(void 0, {
|
|
41
41
|
dateStyle: "medium",
|
|
42
42
|
timeStyle: "medium"
|
|
43
43
|
}).format, k = (t) => {
|
|
44
44
|
let e = ["diff-title"];
|
|
45
45
|
if (t.type === "from" ? e.push("diff-otitle") : t.type === "to" && e.push("diff-ntitle"), !t.pageid || !t.userid)
|
|
46
46
|
return /* @__PURE__ */ i("td", { colSpan: 2, className: e, children: /* @__PURE__ */ i("div", { className: "mw-diff-title--title", children: t.type === "from" ? "Original content" : t.type === "to" ? "Your content" : "" }) });
|
|
47
|
-
const r = (
|
|
48
|
-
|
|
47
|
+
const r = (a) => {
|
|
48
|
+
a.preventDefault(), a.target.dispatchEvent(
|
|
49
49
|
new CustomEvent("ipe:diff-table/edit", {
|
|
50
50
|
detail: { revid: t.revid },
|
|
51
51
|
bubbles: !0
|
|
@@ -68,20 +68,20 @@ const T = new Intl.DateTimeFormat(void 0, {
|
|
|
68
68
|
]
|
|
69
69
|
}
|
|
70
70
|
) }),
|
|
71
|
-
/* @__PURE__ */ i("div", { className: "mw-diff-title--user", children: t.username && /* @__PURE__ */ i(
|
|
72
|
-
/* @__PURE__ */ i("div", { className: "mw-diff-title--timestamp", children: t.timestamp &&
|
|
73
|
-
/* @__PURE__ */ i("div", { className: "mw-diff-title--comment", children: t.parsedcomment && /* @__PURE__ */ i(
|
|
71
|
+
/* @__PURE__ */ i("div", { className: "mw-diff-title--user", children: t.username && /* @__PURE__ */ i(O, { ctx: t.ctx, user: t.username, target: "_blank" }) }),
|
|
72
|
+
/* @__PURE__ */ i("div", { className: "mw-diff-title--timestamp", children: t.timestamp && L(new Date(t.timestamp)) }),
|
|
73
|
+
/* @__PURE__ */ i("div", { className: "mw-diff-title--comment", children: t.parsedcomment && /* @__PURE__ */ i(E, { children: [
|
|
74
74
|
"(",
|
|
75
75
|
/* @__PURE__ */ i("i", { innerHTML: t.parsedcomment }),
|
|
76
76
|
")"
|
|
77
77
|
] }) })
|
|
78
78
|
] });
|
|
79
|
-
},
|
|
79
|
+
}, Q = (t) => {
|
|
80
80
|
const e = t.data;
|
|
81
81
|
if (!e.prev && !e.next)
|
|
82
82
|
return null;
|
|
83
|
-
const r = (
|
|
84
|
-
|
|
83
|
+
const r = (a, n, c) => {
|
|
84
|
+
a.preventDefault(), a.target.dispatchEvent(
|
|
85
85
|
new CustomEvent("ipe:diff-table/update", {
|
|
86
86
|
detail: { fromrev: n, torev: c },
|
|
87
87
|
bubbles: !0
|
|
@@ -93,7 +93,7 @@ const T = new Intl.DateTimeFormat(void 0, {
|
|
|
93
93
|
"a",
|
|
94
94
|
{
|
|
95
95
|
href: t.ctx.getUrl("", { diff: e.prev, oldid: e.fromrevid }),
|
|
96
|
-
onClick: (
|
|
96
|
+
onClick: (a) => r(a, e.prev, e.fromrevid),
|
|
97
97
|
children: "← Previous"
|
|
98
98
|
}
|
|
99
99
|
) : /* @__PURE__ */ i("i", { children: "Oldest version" }) }),
|
|
@@ -101,13 +101,13 @@ const T = new Intl.DateTimeFormat(void 0, {
|
|
|
101
101
|
"a",
|
|
102
102
|
{
|
|
103
103
|
href: t.ctx.getUrl("", { diff: e.next, oldid: e.torevid }),
|
|
104
|
-
onClick: (
|
|
104
|
+
onClick: (a) => r(a, e.torevid, e.next),
|
|
105
105
|
children: "Next →"
|
|
106
106
|
}
|
|
107
107
|
) : /* @__PURE__ */ i("i", { children: "Newest version" }) })
|
|
108
108
|
] });
|
|
109
|
-
},
|
|
110
|
-
const { data: e, ...r } = t,
|
|
109
|
+
}, U = (t) => {
|
|
110
|
+
const { data: e, ...r } = t, a = /* @__PURE__ */ i("table", { className: "theme-ipe diff diff-type-table", "data-mw": "interface", ...r, children: [
|
|
111
111
|
/* @__PURE__ */ i("colgroup", { children: [
|
|
112
112
|
/* @__PURE__ */ i("col", { className: "diff-marker" }),
|
|
113
113
|
/* @__PURE__ */ i("col", { className: "diff-content" }),
|
|
@@ -149,7 +149,7 @@ const T = new Intl.DateTimeFormat(void 0, {
|
|
|
149
149
|
}
|
|
150
150
|
)
|
|
151
151
|
] }),
|
|
152
|
-
/* @__PURE__ */ i(
|
|
152
|
+
/* @__PURE__ */ i(Q, { data: e, ctx: t.ctx }),
|
|
153
153
|
/* @__PURE__ */ i("div", { id: "diffbody" }),
|
|
154
154
|
/* @__PURE__ */ i("tr", { className: "diff-size", style: { textAlign: "center" }, children: [
|
|
155
155
|
/* @__PURE__ */ i("td", { colSpan: 2, className: "diff-size-old", children: e.fromsize !== void 0 && `${e.fromsize} bytes` }),
|
|
@@ -157,7 +157,7 @@ const T = new Intl.DateTimeFormat(void 0, {
|
|
|
157
157
|
] })
|
|
158
158
|
] })
|
|
159
159
|
] });
|
|
160
|
-
return
|
|
160
|
+
return a.querySelector("#diffbody").outerHTML = e.body || (/* @__PURE__ */ i("tr", { children: /* @__PURE__ */ i("td", { colSpan: 4, children: /* @__PURE__ */ i(
|
|
161
161
|
"div",
|
|
162
162
|
{
|
|
163
163
|
style: {
|
|
@@ -168,26 +168,26 @@ const T = new Intl.DateTimeFormat(void 0, {
|
|
|
168
168
|
},
|
|
169
169
|
children: /* @__PURE__ */ i("i", { children: "No changes" })
|
|
170
170
|
}
|
|
171
|
-
) }) })).outerHTML,
|
|
172
|
-
}
|
|
171
|
+
) }) })).outerHTML, a;
|
|
172
|
+
};
|
|
173
173
|
var F = Object.create, p = Object.defineProperty, M = Object.getOwnPropertyDescriptor, y = (t, e) => (e = Symbol[t]) ? e : Symbol.for("Symbol." + t), w = (t) => {
|
|
174
174
|
throw TypeError(t);
|
|
175
|
-
}, B = (t, e, r) => e in t ? p(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r, A = (t, e) => p(t, "name", { value: e, configurable: !0 }), H = (t) => [, , , F(t?.[y("metadata")] ?? null)], R = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], _ = (t) => t !== void 0 && typeof t != "function" ? w("Function expected") : t, K = (t, e, r,
|
|
176
|
-
for (var n = 0, c = t[e >> 1],
|
|
177
|
-
return
|
|
178
|
-
}, J = (t, e, r,
|
|
179
|
-
var
|
|
175
|
+
}, B = (t, e, r) => e in t ? p(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r, A = (t, e) => p(t, "name", { value: e, configurable: !0 }), H = (t) => [, , , F(t?.[y("metadata")] ?? null)], R = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], _ = (t) => t !== void 0 && typeof t != "function" ? w("Function expected") : t, K = (t, e, r, a, n) => ({ kind: R[t], name: e, metadata: a, addInitializer: (c) => r._ ? w("Already initialized") : n.push(_(c || null)) }), Y = (t, e) => B(e, y("metadata"), t[3]), G = (t, e, r, a) => {
|
|
176
|
+
for (var n = 0, c = t[e >> 1], o = c && c.length; n < o; n++) c[n].call(r);
|
|
177
|
+
return a;
|
|
178
|
+
}, J = (t, e, r, a, n, c) => {
|
|
179
|
+
var o, d, s, l = e & 7, f = !1, x = 0, P = t[x] || (t[x] = []), u = l && (n = n.prototype, l < 5 && (l > 3 || !f) && M(n, r));
|
|
180
180
|
A(n, r);
|
|
181
|
-
for (var h =
|
|
182
|
-
s = K(l, r, d = {}, t[3],
|
|
181
|
+
for (var h = a.length - 1; h >= 0; h--)
|
|
182
|
+
s = K(l, r, d = {}, t[3], P), o = (0, a[h])(n, s), d._ = 1, _(o) && (n = o);
|
|
183
183
|
return Y(t, n), u && p(n, r, u), f ? l ^ 4 ? c : u : n;
|
|
184
184
|
}, N, g, D;
|
|
185
|
-
N = [
|
|
185
|
+
N = [z(["wiki", "getUrl", "preferences", "$"]), j(
|
|
186
186
|
b.object({
|
|
187
187
|
"quickDiff.keyshortcut": b.string().default("ctrl-d").description("Key shortcut to open quick diff in quick edit modal")
|
|
188
188
|
}).description("Quick diff options").extra("category", "editor")
|
|
189
189
|
)];
|
|
190
|
-
class v extends (D =
|
|
190
|
+
class v extends (D = I) {
|
|
191
191
|
constructor(e) {
|
|
192
192
|
super(e, {}, "quick-diff"), this.ctx = e, this.COMPARE_API_DEFAULT_OPTIONS = {
|
|
193
193
|
prop: [
|
|
@@ -211,10 +211,10 @@ class v extends (D = z) {
|
|
|
211
211
|
stop() {
|
|
212
212
|
}
|
|
213
213
|
injectHistoryPage() {
|
|
214
|
-
const e = this.ctx.$, r =
|
|
214
|
+
const e = this.ctx.$, r = $("#mw-history-compare");
|
|
215
215
|
if (!r)
|
|
216
216
|
return;
|
|
217
|
-
|
|
217
|
+
q(".mw-history-compareselectedversions-button", r).forEach((n) => {
|
|
218
218
|
n.after(
|
|
219
219
|
/* @__PURE__ */ i(
|
|
220
220
|
"button",
|
|
@@ -222,8 +222,8 @@ class v extends (D = z) {
|
|
|
222
222
|
className: "cdx-button",
|
|
223
223
|
onClick: (c) => {
|
|
224
224
|
c.preventDefault();
|
|
225
|
-
const
|
|
226
|
-
if (!
|
|
225
|
+
const o = new FormData(r), d = Number(o.get("oldid")) || 0, s = Number(o.get("diff")) || 0;
|
|
226
|
+
if (!o.get("title") || !d || !s)
|
|
227
227
|
return this.logger.warn("Missing title or revision IDs");
|
|
228
228
|
this.comparePages({
|
|
229
229
|
fromrev: d,
|
|
@@ -236,8 +236,8 @@ class v extends (D = z) {
|
|
|
236
236
|
);
|
|
237
237
|
});
|
|
238
238
|
}
|
|
239
|
-
async injectQuickEdit({ modal: e, wikiPage: r, options:
|
|
240
|
-
if (r.pageid === 0 ||
|
|
239
|
+
async injectQuickEdit({ modal: e, wikiPage: r, options: a }) {
|
|
240
|
+
if (r.pageid === 0 || a.section === "new")
|
|
241
241
|
return;
|
|
242
242
|
const n = this.ctx.$;
|
|
243
243
|
let c;
|
|
@@ -248,16 +248,16 @@ class v extends (D = z) {
|
|
|
248
248
|
keyPress: await this.ctx.preferences.get("quickDiff.keyshortcut") || void 0,
|
|
249
249
|
className: "btn btn-secondary",
|
|
250
250
|
method: () => {
|
|
251
|
-
const
|
|
251
|
+
const o = r.title, d = r.revisions?.[0]?.content || "", s = e.get$content().querySelector('textarea[name="text"]')?.value || "";
|
|
252
252
|
return d === s ? this.ctx.modal.notify("info", { title: n`Quick Diff`, content: n`No changes` }) : (this.ctx.emit("quick-diff/quick-edit-modal", {
|
|
253
253
|
ctx: this.ctx,
|
|
254
254
|
modal: e,
|
|
255
255
|
wikiPage: r
|
|
256
256
|
}), c = this.comparePages(
|
|
257
257
|
{
|
|
258
|
-
fromtitle:
|
|
258
|
+
fromtitle: o,
|
|
259
259
|
fromtext: d,
|
|
260
|
-
totitle:
|
|
260
|
+
totitle: o,
|
|
261
261
|
totext: s,
|
|
262
262
|
topst: !0
|
|
263
263
|
},
|
|
@@ -274,14 +274,14 @@ class v extends (D = z) {
|
|
|
274
274
|
c?.destroy(), c = void 0;
|
|
275
275
|
});
|
|
276
276
|
}
|
|
277
|
-
comparePages(e, r,
|
|
277
|
+
comparePages(e, r, a) {
|
|
278
278
|
const n = this.ctx.$;
|
|
279
279
|
return !r || r.isDestroyed ? r = this.ctx.modal.createObject({
|
|
280
280
|
title: n`Loading diff...`,
|
|
281
281
|
content: "",
|
|
282
282
|
className: "quick-diff",
|
|
283
283
|
center: !1,
|
|
284
|
-
...
|
|
284
|
+
...a
|
|
285
285
|
}).init() : r.removeButton("*"), this.ctx.emit("quick-diff/init-options", {
|
|
286
286
|
ctx: this.ctx,
|
|
287
287
|
options: e
|
|
@@ -290,7 +290,7 @@ class v extends (D = z) {
|
|
|
290
290
|
"section",
|
|
291
291
|
{
|
|
292
292
|
style: { height: "70vh", display: "flex", justifyContent: "center", alignItems: "center" },
|
|
293
|
-
children: /* @__PURE__ */ i(
|
|
293
|
+
children: /* @__PURE__ */ i(S, {})
|
|
294
294
|
}
|
|
295
295
|
)
|
|
296
296
|
), r.bringToFront(), window.mw && mw.loader.getState("mediawiki.diff.styles") !== "ready" && mw.loader.load(["mediawiki.diff.styles"]), this.ctx.api.post({
|
|
@@ -303,10 +303,10 @@ class v extends (D = z) {
|
|
|
303
303
|
if (!c.data.compare)
|
|
304
304
|
throw new Error("No compare data received", { cause: c });
|
|
305
305
|
const {
|
|
306
|
-
data: { compare:
|
|
306
|
+
data: { compare: o }
|
|
307
307
|
} = c;
|
|
308
308
|
r.setTitle(
|
|
309
|
-
|
|
309
|
+
o.fromtitle && o.totitle ? `${o.fromtitle}${o.fromrevid ? ` (${o.fromrevid})` : ""} ⇔ ${o.totitle}${o.torevid ? ` (${o.torevid})` : ""}` : n`Differences`
|
|
310
310
|
);
|
|
311
311
|
let d;
|
|
312
312
|
r.setContent(
|
|
@@ -316,7 +316,7 @@ class v extends (D = z) {
|
|
|
316
316
|
style: {
|
|
317
317
|
minHeight: "70vh"
|
|
318
318
|
},
|
|
319
|
-
children: /* @__PURE__ */ i(
|
|
319
|
+
children: /* @__PURE__ */ i(U, { ref: (s) => d = s, data: o, ctx: this.ctx })
|
|
320
320
|
}
|
|
321
321
|
)
|
|
322
322
|
), d.addEventListener(
|
|
@@ -328,7 +328,7 @@ class v extends (D = z) {
|
|
|
328
328
|
torev: s.detail.torev
|
|
329
329
|
},
|
|
330
330
|
r,
|
|
331
|
-
|
|
331
|
+
a
|
|
332
332
|
);
|
|
333
333
|
},
|
|
334
334
|
{ once: !0 }
|
|
@@ -339,24 +339,24 @@ class v extends (D = z) {
|
|
|
339
339
|
d.addEventListener(m.edit, l), r.on(r.Event.Close, () => {
|
|
340
340
|
d.removeEventListener(m.edit, l);
|
|
341
341
|
});
|
|
342
|
-
}),
|
|
342
|
+
}), o.fromrevid && o.torevid && r.addButton({
|
|
343
343
|
label: n`Original Compare Page`,
|
|
344
344
|
side: "right",
|
|
345
345
|
className: "btn btn-secondary",
|
|
346
346
|
method: () => {
|
|
347
347
|
window.location.href = this.ctx.getUrl("", {
|
|
348
|
-
oldid:
|
|
349
|
-
diff:
|
|
348
|
+
oldid: o.fromrevid,
|
|
349
|
+
diff: o.torevid
|
|
350
350
|
});
|
|
351
351
|
}
|
|
352
352
|
}), this.ctx.emit("quick-diff/loaded", {
|
|
353
353
|
ctx: this.ctx,
|
|
354
354
|
modal: r,
|
|
355
|
-
compare:
|
|
355
|
+
compare: o
|
|
356
356
|
});
|
|
357
357
|
}).catch((c) => {
|
|
358
358
|
r.setContent(
|
|
359
|
-
/* @__PURE__ */ i(
|
|
359
|
+
/* @__PURE__ */ i(T, { title: n`Failed to load diff`, type: "error", children: /* @__PURE__ */ i("pre", { children: c instanceof Error ? c.message : String(c) }) })
|
|
360
360
|
);
|
|
361
361
|
}), r.show();
|
|
362
362
|
}
|
|
@@ -367,4 +367,4 @@ G(g, 1, v);
|
|
|
367
367
|
export {
|
|
368
368
|
v as PluginQuickDiff
|
|
369
369
|
};
|
|
370
|
-
//# sourceMappingURL=index-
|
|
370
|
+
//# sourceMappingURL=index-BpQ6VGMz.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-BpQ6VGMz.js","sources":["../src/components/MwUserLinks.tsx","../src/plugins/quick-diff/components/DiffTable.tsx","../src/plugins/quick-diff/index.tsx"],"sourcesContent":["import { InPageEdit } from '@/InPageEdit'\n\nexport const MwUserLinks = (props: { user: string; target?: string; ctx: InPageEdit }) => {\n let { user, target, ctx } = props\n const getUrl = ctx.getUrl.bind(ctx)\n return (\n <span className=\"mw-userlinks\">\n <a href={getUrl(`User:${user}`)} className=\"mw-userlink\" target={target}>\n {user}\n </a>{' '}\n <span className=\"mw-usertoollinks\">\n (\n <a href={getUrl(`User_talk:${user}`)} className=\"mw-usertoollinks-talk\" target={target}>\n talk\n </a>\n {' | '}\n <a\n href={getUrl(`Special:Contributions/${user}`)}\n className=\"mw-usertoollinks-contribs\"\n target={target}\n >\n contribs\n </a>\n {' | '}\n <a\n href={getUrl(`Special:Block/${user}`)}\n className=\"mw-usertoollinks-block\"\n target={target}\n >\n block\n </a>\n )\n </span>\n </span>\n )\n}\n","import './style.scss'\nimport { JSX } from 'jsx-dom/jsx-runtime'\nimport { CompareApiResponse } from '../index.js'\nimport { InPageEdit } from '@/InPageEdit.js'\n\nexport type DiffTableProps = {\n data: Partial<CompareApiResponse['compare']>\n ctx: InPageEdit\n} & JSX.IntrinsicElements['table']\n\nexport enum DiffTableEvent {\n update = 'ipe:diff-table/update',\n edit = 'ipe:diff-table/edit',\n}\n\n// DOM 事件类型定义\ndeclare global {\n interface HTMLElementEventMap {\n [DiffTableEvent.update]: CustomEvent<{\n fromrev: number\n torev: number\n }>\n [DiffTableEvent.edit]: CustomEvent<{\n revid: number\n }>\n }\n}\n\nconst formatDate = new Intl.DateTimeFormat(undefined, {\n dateStyle: 'medium',\n timeStyle: 'medium',\n}).format\n\nconst DiffTableHeader = (props: {\n ctx: InPageEdit\n type?: 'from' | 'to'\n pageid?: number\n pagetitle?: string\n revid?: number\n size?: number\n timestamp?: string\n username?: string\n userid?: number\n comment?: string\n parsedcomment?: string\n}) => {\n let classList = ['diff-title']\n if (props.type === 'from') {\n classList.push('diff-otitle')\n } else if (props.type === 'to') {\n classList.push('diff-ntitle')\n }\n if (!props.pageid || !props.userid) {\n return (\n <td colSpan={2} className={classList}>\n <div className=\"mw-diff-title--title\">\n {props.type === 'from' ? 'Original content' : props.type === 'to' ? 'Your content' : ''}\n </div>\n </td>\n )\n }\n const handleEditClick = (e: Event) => {\n e.preventDefault()\n e.target!.dispatchEvent(\n new CustomEvent(DiffTableEvent.edit, {\n detail: { revid: props.revid! },\n bubbles: true,\n })\n )\n }\n return (\n <td colSpan={2} className={classList}>\n <div className=\"mw-diff-title--title\">\n {props.pagetitle || props.timestamp}\n {props.revid ? ` (rev#${props.revid})` : ''}\n </div>\n <div className=\"mw-diff-title--actions\">\n <a\n href={props.ctx.getUrl('', { action: 'edit', oldid: props.revid! })}\n onClick={handleEditClick}\n >\n <IconQuickEdit style=\"width: 1em; height: 1em\" />\n Quick edit\n </a>\n </div>\n <div className=\"mw-diff-title--user\">\n {props.username && <MwUserLinks ctx={props.ctx} user={props.username} target=\"_blank\" />}\n </div>\n <div className=\"mw-diff-title--timestamp\">\n {props.timestamp && formatDate(new Date(props.timestamp))}\n </div>\n <div className=\"mw-diff-title--comment\">\n {props.parsedcomment && (\n <>\n (<i innerHTML={props.parsedcomment}></i>)\n </>\n )}\n </div>\n </td>\n )\n}\n\nconst DiffTableNavigation = (props: { data: DiffTableProps['data']; ctx: InPageEdit }) => {\n const data = props.data\n if (!data.prev && !data.next) {\n return null\n }\n\n // 统一的事件处理器\n const handleNavigationClick = (e: Event, fromrev: number, torev: number) => {\n e.preventDefault()\n e.target!.dispatchEvent(\n new CustomEvent(DiffTableEvent.update, {\n detail: { fromrev, torev },\n bubbles: true,\n })\n )\n }\n\n return (\n <tr className=\"mw-diff-title--navigation\">\n <td colSpan={2}>\n {data.prev ? (\n <a\n href={props.ctx.getUrl('', { diff: data.prev!, oldid: data.fromrevid! })}\n onClick={(e) => handleNavigationClick(e, data.prev!, data.fromrevid!)}\n >\n ← Previous\n </a>\n ) : (\n <i>Oldest version</i>\n )}\n </td>\n <td colSpan={2}>\n {data.next ? (\n <a\n href={props.ctx.getUrl('', { diff: data.next!, oldid: data.torevid! })}\n onClick={(e) => handleNavigationClick(e, data.torevid!, data.next!)}\n >\n Next →\n </a>\n ) : (\n <i>Newest version</i>\n )}\n </td>\n </tr>\n )\n}\n\nexport const DiffTable = (props: DiffTableProps) => {\n const { data, ...rest } = props\n const table = (\n <table className={`theme-ipe diff diff-type-table`} data-mw=\"interface\" {...rest}>\n <colgroup>\n <col className=\"diff-marker\" />\n <col className=\"diff-content\" />\n <col className=\"diff-marker\" />\n <col className=\"diff-content\" />\n </colgroup>\n <tbody>\n <tr>\n <DiffTableHeader\n ctx={props.ctx}\n type=\"from\"\n pageid={data.fromid}\n pagetitle={data.fromtitle}\n revid={data.fromrevid}\n size={data.fromsize}\n timestamp={data.fromtimestamp}\n username={data.fromuser}\n userid={data.fromuserid}\n comment={data.fromcomment}\n parsedcomment={data.fromparsedcomment}\n />\n <DiffTableHeader\n ctx={props.ctx}\n type=\"to\"\n pageid={data.toid}\n pagetitle={data.totitle}\n revid={data.torevid}\n size={data.tosize}\n timestamp={data.totimestamp}\n username={data.touser}\n userid={data.touserid}\n comment={data.tocomment}\n parsedcomment={data.toparsedcomment}\n />\n </tr>\n <DiffTableNavigation data={data} ctx={props.ctx} />\n <div id=\"diffbody\"></div>\n <tr className=\"diff-size\" style={{ textAlign: 'center' }}>\n <td colSpan={2} className=\"diff-size-old\">\n {data.fromsize !== undefined && `${data.fromsize} bytes`}\n </td>\n <td colSpan={2} className=\"diff-size-new\">\n {data.tosize !== undefined && `${data.tosize} bytes`}\n </td>\n </tr>\n </tbody>\n </table>\n )\n table.querySelector('#diffbody')!.outerHTML =\n data.body ||\n (\n <tr>\n <td colSpan={4}>\n <div\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '5rem',\n }}\n >\n <i>No changes</i>\n </div>\n </td>\n </tr>\n ).outerHTML\n return table\n}\n","import { Inject, InPageEdit, Schema } from '@/InPageEdit'\nimport { type QuickEditEventPayload } from '@/plugins/quick-edit'\nimport { IPEModal, IPEModalOptions } from '@inpageedit/modal'\nimport { DiffTable, DiffTableEvent } from './components/DiffTable'\nimport { MwApiResponse } from 'wiki-saikou'\nimport { IWikiPage } from '@/models/WikiPage/index.js'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n quickDiff: PluginQuickDiff\n }\n interface Events {\n 'quick-diff/init-options'(payload: {\n ctx: InPageEdit\n options: Partial<CompareApiRequestOptions>\n }): void\n 'quick-diff/loaded'(payload: {\n ctx: InPageEdit\n modal: IPEModal\n compare: CompareApiResponse['compare']\n }): void\n 'quick-diff/quick-edit-modal'(payload: {\n ctx: InPageEdit\n modal: IPEModal\n wikiPage: IWikiPage\n }): void\n }\n interface PreferencesMap {\n 'quickDiff.keyshortcut': string\n }\n}\n\nexport interface CompareApiRequestOptions {\n fromtitle: string\n fromid: number\n fromrev: number\n frompst: boolean\n totitle: string\n toid: number\n torev: number\n torelative?: 'cur' | 'prev' | 'next'\n topst: boolean\n prop: string\n difftype: 'table' | 'unified'\n // deprecated, but still works\n fromtext: string\n fromsection: string | number\n fromcontentmodel: string\n totext: string\n tosection: string | number\n tocontentmodel: string\n}\n\nexport interface CompareApiResponse {\n compare: Partial<{\n fromid: number\n fromrevid: number\n fromns: number\n fromtitle: string\n fromsize: number\n fromtimestamp: string\n fromuser: string\n fromuserid: number\n fromcomment: string\n fromparsedcomment?: string\n toid: number\n torevid: number\n tons: number\n totitle: string\n tosize: number\n totimestamp: string\n touser: string\n touserid: number\n tocomment: string\n toparsedcomment: string\n diffsize: number\n prev: number\n next: number\n }> & {\n body: string\n }\n}\n\n@Inject(['wiki', 'getUrl', 'preferences', '$'])\n@RegisterPreferences(\n Schema.object({\n 'quickDiff.keyshortcut': Schema.string()\n .default('ctrl-d')\n .description('Key shortcut to open quick diff in quick edit modal'),\n })\n .description('Quick diff options')\n .extra('category', 'editor')\n)\nexport class PluginQuickDiff extends BasePlugin {\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'quick-diff')\n }\n\n protected start(): Promise<void> | void {\n this.ctx.set('quickDiff', this)\n this.ctx.on('quick-edit/wiki-page', this.injectQuickEdit.bind(this))\n window.RLQ.push(this.injectHistoryPage.bind(this))\n }\n\n protected stop(): Promise<void> | void {}\n\n private injectHistoryPage() {\n const $ = this.ctx.$\n const mwCompareForm = qs<HTMLFormElement>('#mw-history-compare')\n if (!mwCompareForm) {\n return\n }\n const compareButtons = qsa('.mw-history-compareselectedversions-button', mwCompareForm)\n compareButtons.forEach((el) => {\n el.after(\n <button\n className=\"cdx-button\"\n onClick={(e) => {\n e.preventDefault()\n const formData = new FormData(mwCompareForm)\n const fromrev = Number(formData.get('oldid')) || 0\n const torev = Number(formData.get('diff')) || 0\n const title = formData.get('title') as string\n if (!title || !fromrev || !torev) {\n return this.logger.warn('Missing title or revision IDs')\n }\n this.comparePages({\n fromrev,\n torev,\n })\n }}\n >\n {$`Quick Diff`}\n </button>\n )\n })\n }\n\n private async injectQuickEdit({ modal, wikiPage, options }: QuickEditEventPayload) {\n if (wikiPage.pageid === 0 || options.section === 'new') {\n // User is creating a new page, no need to show diff button\n return\n }\n const $ = this.ctx.$\n let latestDiffModal: IPEModal | undefined = undefined\n modal.addButton(\n {\n label: $`Diff`,\n side: 'left',\n keyPress: (await this.ctx.preferences.get('quickDiff.keyshortcut')) || undefined,\n className: 'btn btn-secondary',\n method: () => {\n const pageTitle = wikiPage.title\n const fromtext = wikiPage.revisions?.[0]?.content || ''\n const totext =\n (modal.get$content().querySelector<HTMLTextAreaElement>('textarea[name=\"text\"]')\n ?.value as string) || ''\n\n if (fromtext === totext) {\n return this.ctx.modal.notify('info', { title: $`Quick Diff`, content: $`No changes` })\n }\n\n this.ctx.emit('quick-diff/quick-edit-modal', {\n ctx: this.ctx,\n modal,\n wikiPage,\n })\n\n latestDiffModal = this.comparePages(\n {\n fromtitle: pageTitle,\n fromtext,\n totitle: pageTitle,\n totext,\n topst: true,\n },\n latestDiffModal,\n {\n backdrop: false,\n draggable: true,\n }\n )\n return latestDiffModal\n },\n },\n 2\n )\n modal.on(modal.Event.Close, () => {\n latestDiffModal?.destroy()\n latestDiffModal = undefined\n })\n }\n\n readonly COMPARE_API_DEFAULT_OPTIONS: Partial<CompareApiRequestOptions> = {\n prop: [\n 'comment',\n 'diff',\n 'diffsize',\n 'ids',\n 'parsedcomment',\n 'size',\n 'timestamp',\n 'title',\n 'user',\n 'rel',\n ].join('|'),\n difftype: 'table',\n }\n\n comparePages(\n options: Partial<CompareApiRequestOptions>,\n modal?: IPEModal,\n modalOptions?: Partial<IPEModalOptions>\n ) {\n const $ = this.ctx.$\n if (!modal || modal.isDestroyed) {\n modal = this.ctx.modal\n .createObject({\n title: $`Loading diff...`,\n content: '',\n className: 'quick-diff',\n center: false,\n ...modalOptions,\n })\n .init()\n } else {\n modal.removeButton('*')\n }\n\n this.ctx.emit('quick-diff/init-options', {\n ctx: this.ctx,\n options,\n })\n\n modal.setContent(\n <section\n style={{ height: '70vh', display: 'flex', justifyContent: 'center', alignItems: 'center' }}\n >\n <ProgressBar />\n </section>\n )\n modal.bringToFront()\n\n if (window.mw && mw.loader.getState('mediawiki.diff.styles') !== 'ready') {\n mw.loader.load(['mediawiki.diff.styles'])\n }\n\n this.ctx.api\n .post<MwApiResponse<CompareApiResponse>>({\n ...this.COMPARE_API_DEFAULT_OPTIONS,\n ...options,\n action: 'compare',\n format: 'json',\n formatversion: 2,\n })\n .then((res) => {\n if (!res.data.compare) {\n throw new Error('No compare data received', { cause: res })\n }\n const {\n data: { compare },\n } = res\n modal.setTitle(\n compare.fromtitle && compare.totitle\n ? `${compare.fromtitle}${compare.fromrevid ? ` (${compare.fromrevid})` : ''} ⇔ ${compare.totitle}${compare.torevid ? ` (${compare.torevid})` : ''}`\n : $`Differences`\n )\n let diffTable!: HTMLElement\n modal.setContent(\n (\n <section\n style={{\n minHeight: '70vh',\n }}\n >\n <DiffTable ref={(ref) => (diffTable = ref)} data={compare} ctx={this.ctx} />\n </section>\n ) as HTMLElement\n )\n diffTable.addEventListener(\n DiffTableEvent.update,\n (e) => {\n e.stopPropagation()\n this.comparePages(\n {\n fromrev: e.detail.fromrev,\n torev: e.detail.torev,\n },\n modal,\n modalOptions\n )\n },\n { once: true }\n )\n\n // TODO: 不应该硬编码,移动到 in-article-links 插件中\n this.ctx.inject(['quickEdit'], (ctx) => {\n const handleQuickEdit = (e: CustomEvent<{ revid: number }>) => {\n e.stopPropagation()\n ctx.quickEdit({ revision: e.detail.revid })\n }\n diffTable.addEventListener(DiffTableEvent.edit, handleQuickEdit)\n modal.on(modal.Event.Close, () => {\n diffTable.removeEventListener(DiffTableEvent.edit, handleQuickEdit)\n })\n })\n\n if (compare.fromrevid && compare.torevid) {\n modal.addButton({\n label: $`Original Compare Page`,\n side: 'right',\n className: 'btn btn-secondary',\n method: () => {\n window.location.href = this.ctx.getUrl('', {\n oldid: compare.fromrevid,\n diff: compare.torevid,\n })\n },\n })\n }\n\n this.ctx.emit('quick-diff/loaded', {\n ctx: this.ctx,\n modal,\n compare,\n })\n })\n .catch((err) => {\n modal.setContent(\n (\n <MBox title={$`Failed to load diff`} type=\"error\">\n <pre>{err instanceof Error ? err.message : String(err)}</pre>\n </MBox>\n ) as HTMLElement\n )\n })\n\n return modal.show()\n }\n}\n"],"names":["MwUserLinks","props","user","target","ctx","getUrl","jsxs","jsx","DiffTableEvent","formatDate","DiffTableHeader","classList","handleEditClick","e","IconQuickEdit","Fragment","DiffTableNavigation","data","handleNavigationClick","fromrev","torev","DiffTable","rest","table","_PluginQuickDiff_decorators","_init","_a","Inject","RegisterPreferences","Schema","PluginQuickDiff","BasePlugin","$","mwCompareForm","qs","qsa","el","formData","modal","wikiPage","options","latestDiffModal","pageTitle","fromtext","totext","modalOptions","ProgressBar","res","compare","diffTable","ref","handleQuickEdit","err","MBox","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { j as l } from "./index-CM_6yF2v.js";
|
|
2
|
-
import { c as M, g as f, R as I, I as L, S as v } from "./Preferences-
|
|
2
|
+
import { c as M, g as f, R as I, I as L, S as v } from "./Preferences-C10tZMl1.js";
|
|
3
3
|
var N = Object.create, x = Object.defineProperty, q = Object.getOwnPropertyDescriptor, _ = (i, t) => (t = Symbol[i]) ? t : Symbol.for("Symbol." + i), w = (i) => {
|
|
4
4
|
throw TypeError(i);
|
|
5
5
|
}, A = (i, t, e) => t in i ? x(i, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : i[t] = e, T = (i, t) => x(i, "name", { value: t, configurable: !0 }), C = (i) => [, , , N(i?.[_("metadata")] ?? null)], E = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], P = (i) => i !== void 0 && typeof i != "function" ? w("Function expected") : i, k = (i, t, e, n, o) => ({ kind: E[i], name: t, metadata: n, addInitializer: (r) => e._ ? w("Already initialized") : o.push(P(r || null)) }), D = (i, t) => A(t, _("metadata"), i[3]), z = (i, t, e, n) => {
|
|
@@ -192,4 +192,4 @@ z(m, 1, b);
|
|
|
192
192
|
export {
|
|
193
193
|
b as PluginToolbox
|
|
194
194
|
};
|
|
195
|
-
//# sourceMappingURL=index-
|
|
195
|
+
//# sourceMappingURL=index-CnR6CqkM.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-D-fW3ESK.js","sources":["../src/plugins/toolbox/index.tsx"],"sourcesContent":["import { Inject, InPageEdit, Schema, Service } from '@/InPageEdit'\nimport { JSX, ReactElement } from 'jsx-dom'\nimport './styles.scss'\nimport { ComputeAbleSync } from '@/utils/computeable.js'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n toolbox: PluginToolbox\n }\n interface Events {\n 'toolbox/button-added'(payload: { ctx: InPageEdit; payload: ToolboxButton }): void\n 'toolbox/button-removed'(payload: { ctx: InPageEdit; payload: ToolboxButton }): void\n 'toolbox/button-clicked'(payload: {\n ctx: InPageEdit\n event: MouseEvent\n payload: ToolboxButton\n }): void\n 'toolbox/toggle'(payload: { ctx: InPageEdit; opened: boolean }): void\n }\n interface PreferencesMap {\n toolboxAlwaysShow: boolean\n }\n}\n\ninterface ToolboxButton {\n id: string\n group?: 'auto' | 'group1' | 'group2'\n icon: ComputeAbleSync<string | HTMLElement | SVGElement | ReactElement>\n tooltip?: ComputeAbleSync<string | HTMLElement>\n itemProps?: JSX.IntrinsicElements['li']\n buttonProps?: JSX.IntrinsicElements['button']\n onClick?: (event: MouseEvent) => void\n index?: number // 任意数值均可:负数靠前、正数靠后、Infinity 末尾、未传时按插入顺序\n}\n\n@RegisterPreferences(\n Schema.object({\n toolboxAlwaysShow: Schema.boolean()\n .description('Make the toolbox opened by default')\n .default(false),\n }).description('Toolbox preferences')\n)\n@Inject(['preferences'])\nexport class PluginToolbox extends Service {\n container!: HTMLElement\n\n // ==== 内部状态 ====\n private buttons: ToolboxButton[] = []\n\n // 插入顺序序列号:用于当 index 未给时保持“自然顺序”\n private seqCounter = 0\n private seqMap = new Map<string, number>() // id -> seq\n\n constructor(public ctx: InPageEdit) {\n super(ctx, 'toolbox', false)\n }\n\n protected async start(): Promise<void> {\n this.container = this.createToolbox()\n this.ctx.preferences.get('toolboxAlwaysShow').then((val) => {\n if (val) {\n this.container.classList.add('is-persistent')\n }\n })\n this.setupHoverLogic()\n document.body.appendChild(this.container)\n\n // 国际化变化时重新渲染\n this.ctx.on('i18n/changed', () => {\n console.info('i18n/changed', this.buttons)\n this.renderAll()\n })\n }\n\n protected stop(): void | Promise<void> {\n this.container?.remove()\n }\n\n private get isPersistent() {\n return this.container.classList.contains('is-persistent')\n }\n\n private setupHoverLogic() {\n let hoverTimeout: number | null = null\n\n // 鼠标进入时暂时展开\n this.container.addEventListener('mouseenter', () => {\n if (hoverTimeout) {\n clearTimeout(hoverTimeout)\n hoverTimeout = null\n }\n\n // 如果不在持久化状态,则添加hover展开效果\n if (!this.isPersistent) {\n this.container.classList.add('is-hovered')\n }\n })\n\n // 鼠标离开时收起(如果不是持久化状态)\n this.container.addEventListener('mouseleave', () => {\n if (!this.isPersistent) {\n hoverTimeout = window.setTimeout(() => {\n this.container.classList.remove('is-hovered')\n }, 150) // 延迟150ms收起,避免快速移动鼠标时闪烁\n }\n })\n }\n\n /**\n * 计算按钮动画延迟\n * @param index 按钮索引(从0开始)\n * @param totalCount 总按钮数量\n * @returns 延迟时间(秒)\n */\n private calculateButtonDelay(index: number, totalCount: number): number {\n if (totalCount <= 1) return 0\n\n // 总动画时长150ms = 0.15s\n const totalDuration = 0.15\n // 使用平方根函数创建非线性延迟,差值逐渐缩小\n const normalizedIndex = index / (totalCount - 1)\n const delay = totalDuration * Math.sqrt(normalizedIndex)\n\n return Math.round(delay * 1000) / 1000 // 保留3位小数\n }\n\n /**\n * 更新按钮组的动画延迟\n */\n private updateButtonDelays() {\n const btnGroups = this.container.querySelectorAll('.btn-group')\n\n btnGroups.forEach((group) => {\n const buttons = group.querySelectorAll('.btn-tip-group')\n const totalCount = buttons.length\n\n buttons.forEach((button, index) => {\n const delay = this.calculateButtonDelay(index, totalCount)\n ;(button as HTMLElement).style.setProperty('--transition-delay', `${delay}s`)\n ;(button as HTMLElement).style.setProperty('--max-transition-delay', '0.15s')\n })\n })\n }\n\n private createToolbox() {\n const toggler = (\n <button\n className=\"ipe-toolbox-btn\"\n id=\"toolbox-toggler\"\n onClick={() => {\n this.toggle()\n }}\n >\n {/* Font Awesome 5 Solid: Plus */}\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"448\" height=\"512\" viewBox=\"0 0 448 512\">\n <rect width=\"448\" height=\"512\" fill=\"none\" />\n <path\n fill=\"currentColor\"\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\"\n />\n </svg>\n </button>\n )\n const element = (\n <div id=\"ipe-edit-toolbox\">\n <ul className=\"btn-group group1\" style={{ display: 'flex', flexDirection: 'column' }}></ul>\n <ul className=\"btn-group group2\" style={{ display: 'flex', flexDirection: 'row' }}></ul>\n {toggler}\n </div>\n )\n\n return element as HTMLElement\n }\n\n private normalizeButtonId(id: string) {\n if (!id) {\n id = Math.random().toString(36).substring(2, 8)\n }\n // 修复:正确替换空白/点/井号(保留语义,修正正则)\n return `ipe-toolbox__${id.trim()}`.replace(/[\\s.#]+/g, '-')\n }\n\n // ====== 排序与分组 ======\n private chooseAutoGroup(): 'group1' | 'group2' {\n const g1 = this.buttons.filter((b) => b.group === 'group1').length\n const g2 = this.buttons.filter((b) => b.group === 'group2').length\n return g1 <= g2 ? 'group1' : 'group2'\n }\n\n // 归一化排序键:\n // 1) 若 index 是有限数值 => 直接使用(允许负数/小数/很大数);\n // 2) 若为 Infinity / -Infinity => 自然比较;\n // 3) 若 NaN / 未提供 => 返回 null,后续用插入顺序(seq)比较。\n private orderKey(btn: ToolboxButton): number | null {\n const idx = (btn as any).index\n if (typeof idx === 'number') {\n if (Number.isNaN(idx)) return null\n return idx // 包含 Infinity 与 -Infinity\n }\n return null\n }\n\n private compareButtons = (a: ToolboxButton, b: ToolboxButton) => {\n const ak = this.orderKey(a) // number | null\n const bk = this.orderKey(b)\n\n const va = ak ?? 0\n const vb = bk ?? 0\n\n if (va < vb) return -1\n if (va > vb) return 1\n\n // 有效值相等时的细化:\n const sa = this.seqMap.get(a.id) ?? 0\n const sb = this.seqMap.get(b.id) ?? 0\n\n if (ak === null && bk === null) {\n if (sa !== sb) return sa - sb\n return 0 // 不以 id 再兜底,保持稳定排序\n }\n\n if (ak === null && bk !== null) return -1 // 无 index(按0) 优先于 数值 index=0\n if (ak !== null && bk === null) return 1\n\n // 双方都有 index 且值相等,退化到 seq;仍然相等时返回 0\n if (sa !== sb) return sa - sb\n return 0\n }\n\n // ====== 对外 API:新增/替换/删除 ======\n addButton(payload: ToolboxButton) {\n // 统一化 id(保留原意:若缺失则补)\n payload.id = (payload.id || '').trim()\n if (!payload.id) {\n this.ctx.logger('toolbox').warn('Button id is empty, generating a random one.')\n payload.id = Math.random().toString(36).slice(2, 10)\n }\n\n const existingIndex = this.buttons.findIndex((button) => button.id === payload.id)\n\n // 分组:新增时 auto,替换时默认保留原组,除非明确指定\n const nextGroup: 'group1' | 'group2' = (() => {\n if (existingIndex !== -1) {\n const old = this.buttons[existingIndex]\n return !payload.group || payload.group === 'auto' ? (old.group as any) : payload.group\n }\n return !payload.group || payload.group === 'auto' ? this.chooseAutoGroup() : payload.group\n })()\n\n // 序列号:用于 index 未提供时,保持插入顺序\n if (!this.seqMap.has(payload.id)) {\n this.seqMap.set(payload.id, this.seqCounter++)\n }\n\n if (existingIndex !== -1) {\n // 替换:保留旧的 seq,不动;index 未传则沿用旧值\n const old = this.buttons[existingIndex]\n const incomingIndex =\n typeof payload.index === 'number' && !Number.isNaN(payload.index)\n ? payload.index\n : old.index\n const merged: ToolboxButton = { ...old, ...payload, group: nextGroup, index: incomingIndex }\n\n this.buttons.splice(existingIndex, 1, merged)\n } else {\n // 新增:按给定 index 或留空;只设置组\n const incomingIndex =\n typeof payload.index === 'number' && !Number.isNaN(payload.index)\n ? payload.index\n : undefined\n const fresh: ToolboxButton = { ...payload, group: nextGroup, index: incomingIndex }\n this.buttons.push(fresh)\n }\n\n this.ctx.emit('toolbox/button-added', { ctx: this.ctx, payload })\n this.renderAll()\n }\n\n removeButton(id: string) {\n const index = this.buttons.findIndex((button) => button.id === id)\n if (index !== -1) {\n const payload = this.buttons[index]\n this.buttons.splice(index, 1)\n // 可选择是否保留 seq,使得将来同 id 重加时仍按旧顺序;这里删除时保留更合理\n this.ctx.emit('toolbox/button-removed', { ctx: this.ctx, payload })\n this.renderAll()\n }\n }\n\n // ====== 渲染 ======\n private renderButton(payload: ToolboxButton) {\n let { id, icon, index, tooltip, itemProps, buttonProps, onClick } = payload\n const normalizedId = this.normalizeButtonId(id)\n\n // 结构尽量保持,避免在 <li> 上绑定 click 造成双触发\n const element = (\n <li class=\"btn-tip-group\" id={normalizedId} data-id={id} data-index={index} {...itemProps}>\n <div class=\"btn-tip\">{computeFallbackSync(tooltip)}</div>\n <button\n id={`${normalizedId}-btn`}\n data-id={payload.id}\n class=\"ipe-toolbox-btn\"\n onClick={(e: any) => {\n onClick?.(e as MouseEvent)\n this.ctx.emit('toolbox/button-clicked', {\n ctx: this.ctx,\n event: e as MouseEvent,\n payload,\n })\n }}\n {...buttonProps}\n >\n {computeFallbackSync(icon)}\n </button>\n </li>\n )\n\n return element as HTMLElement\n }\n\n private renderAll() {\n const group1 = this.buttons\n .filter((b) => b.group === 'group1')\n .slice()\n .sort(this.compareButtons)\n const group2 = this.buttons\n .filter((b) => b.group === 'group2')\n .slice()\n .sort(this.compareButtons)\n\n const group1El = this.container.querySelector('.btn-group.group1') as HTMLElement\n const group2El = this.container.querySelector('.btn-group.group2') as HTMLElement\n\n group1El.innerHTML = ''\n group2El.innerHTML = ''\n\n group1.forEach((button) => {\n group1El.appendChild(this.renderButton(button))\n })\n group2.forEach((button) => {\n group2El.appendChild(this.renderButton(button))\n })\n\n // 统一更新动画延迟\n this.updateButtonDelays()\n }\n\n getContainer() {\n return this.container\n }\n\n get isOpened() {\n return (\n this.container.classList.contains('is-persistent') ||\n this.container.classList.contains('is-hovered')\n )\n }\n\n toggle(force?: boolean) {\n const isPersistent = this.isPersistent\n const newPersistent = typeof force === 'boolean' ? force : !isPersistent\n this.container.classList.toggle('is-persistent', newPersistent)\n this.container.classList.remove('is-hovered')\n this.ctx.preferences.set('toolboxAlwaysShow', newPersistent)\n this.ctx.emit('toolbox/toggle', { ctx: this.ctx, opened: this.isOpened })\n }\n}\n"],"names":["_PluginToolbox_decorators","_init","_a","RegisterPreferences","Schema","Inject","PluginToolbox","Service","ctx","a","b","ak","bk","va","vb","sa","sb","val","hoverTimeout","index","totalCount","totalDuration","normalizedIndex","delay","group","buttons","button","jsxs","jsx","id","g1","g2","btn","idx","payload","existingIndex","nextGroup","old","incomingIndex","merged","fresh","icon","tooltip","itemProps","buttonProps","onClick","normalizedId","computeFallbackSync","e","group1","group2","group1El","group2El","force","isPersistent","newPersistent","__decoratorStart","__decorateElement","__runInitializers"],"mappings":";;;;;;;;;;;;;GAAAA,GAAAC,GAAAC;AAmCAF,IAAA,CAACG;AAAA,EACCC,EAAO,OAAO;AAAA,IACZ,mBAAmBA,EAAO,QAAA,EACvB,YAAY,oCAAoC,EAChD,QAAQ,EAAK;AAAA,EAAA,CACjB,EAAE,YAAY,qBAAqB;AACtC,GACCC,EAAO,CAAC,aAAa,CAAC,CAAA;AAChB,MAAMC,WAAsBJ,IAAAK,GAAQ;AAAA;AAAA,EAUzC,YAAmBC,GAAiB;AAClC,UAAMA,GAAK,WAAW,EAAK,GADV,KAAA,MAAAA,GATnB,KAAA,YAAA,QAGA,KAAQ,UAA2B,CAAA,GAGnC,KAAQ,aAAa,GACrB,KAAQ,6BAAa,IAAA,GAuJrB,KAAQ,iBAAiB,CAACC,GAAkBC,MAAqB;AAC/D,YAAMC,IAAK,KAAK,SAASF,CAAC,GACpBG,IAAK,KAAK,SAASF,CAAC,GAEpBG,IAAKF,KAAM,GACXG,IAAKF,KAAM;AAEjB,UAAIC,IAAKC,EAAI,QAAO;AACpB,UAAID,IAAKC,EAAI,QAAO;AAGpB,YAAMC,IAAK,KAAK,OAAO,IAAIN,EAAE,EAAE,KAAK,GAC9BO,IAAK,KAAK,OAAO,IAAIN,EAAE,EAAE,KAAK;AAEpC,aAAIC,MAAO,QAAQC,MAAO,OACpBG,MAAOC,IAAWD,IAAKC,IACpB,IAGLL,MAAO,QAAQC,MAAO,OAAa,KACnCD,MAAO,QAAQC,MAAO,OAAa,IAGnCG,MAAOC,IAAWD,IAAKC,IACpB;AAAA,IACT;AAAA,EA5KA;AAAA,EAEA,MAAgB,QAAuB;AACrC,SAAK,YAAY,KAAK,cAAA,GACtB,KAAK,IAAI,YAAY,IAAI,mBAAmB,EAAE,KAAK,CAACC,MAAQ;AAC1D,MAAIA,KACF,KAAK,UAAU,UAAU,IAAI,eAAe;AAAA,IAEhD,CAAC,GACD,KAAK,gBAAA,GACL,SAAS,KAAK,YAAY,KAAK,SAAS,GAGxC,KAAK,IAAI,GAAG,gBAAgB,MAAM;AAEhC,WAAK,UAAA;AAAA,IACP,CAAC;AAAA,EACH;AAAA,EAEU,OAA6B;AACrC,SAAK,WAAW,OAAA;AAAA,EAClB;AAAA,EAEA,IAAY,eAAe;AACzB,WAAO,KAAK,UAAU,UAAU,SAAS,eAAe;AAAA,EAC1D;AAAA,EAEQ,kBAAkB;AACxB,QAAIC,IAA8B;AAGlC,SAAK,UAAU,iBAAiB,cAAc,MAAM;AAClD,MAAIA,MACF,aAAaA,CAAY,GACzBA,IAAe,OAIZ,KAAK,gBACR,KAAK,UAAU,UAAU,IAAI,YAAY;AAAA,IAE7C,CAAC,GAGD,KAAK,UAAU,iBAAiB,cAAc,MAAM;AAClD,MAAK,KAAK,iBACRA,IAAe,OAAO,WAAW,MAAM;AACrC,aAAK,UAAU,UAAU,OAAO,YAAY;AAAA,MAC9C,GAAG,GAAG;AAAA,IAEV,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,qBAAqBC,GAAeC,GAA4B;AACtE,QAAIA,KAAc,EAAG,QAAO;AAG5B,UAAMC,IAAgB,MAEhBC,IAAkBH,KAASC,IAAa,IACxCG,IAAQF,IAAgB,KAAK,KAAKC,CAAe;AAEvD,WAAO,KAAK,MAAMC,IAAQ,GAAI,IAAI;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB;AAG3B,IAFkB,KAAK,UAAU,iBAAiB,YAAY,EAEpD,QAAQ,CAACC,MAAU;AAC3B,YAAMC,IAAUD,EAAM,iBAAiB,gBAAgB,GACjDJ,IAAaK,EAAQ;AAE3B,MAAAA,EAAQ,QAAQ,CAACC,GAAQP,MAAU;AACjC,cAAMI,IAAQ,KAAK,qBAAqBJ,GAAOC,CAAU;AACvD,QAAAM,EAAuB,MAAM,YAAY,sBAAsB,GAAGH,CAAK,GAAG,GAC1EG,EAAuB,MAAM,YAAY,0BAA0B,OAAO;AAAA,MAC9E,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEQ,gBAAgB;AA2BtB,WAPEC,gBAAAA,EAAC,OAAA,EAAI,IAAG,oBACN,UAAA;AAAA,MAAA,gBAAAC,EAAC,MAAA,EAAG,WAAU,oBAAmB,OAAO,EAAE,SAAS,QAAQ,eAAe,SAAA,EAAS,CAAG;AAAA,MACtF,gBAAAA,EAAC,MAAA,EAAG,WAAU,oBAAmB,OAAO,EAAE,SAAS,QAAQ,eAAe,MAAA,EAAM,CAAG;AAAA,MApBrF,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,IAAG;AAAA,UACH,SAAS,MAAM;AACb,iBAAK,OAAA;AAAA,UACP;AAAA,UAGA,UAAAD,gBAAAA,EAAC,SAAI,OAAM,8BAA6B,OAAM,OAAM,QAAO,OAAM,SAAQ,eACvE,UAAA;AAAA,YAAA,gBAAAC,EAAC,UAAK,OAAM,OAAM,QAAO,OAAM,MAAK,QAAO;AAAA,YAC3C,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,GAAE;AAAA,cAAA;AAAA,YAAA;AAAA,UACJ,EAAA,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,IAOC,GACH;AAAA,EAIJ;AAAA,EAEQ,kBAAkBC,GAAY;AACpC,WAAKA,MACHA,IAAK,KAAK,SAAS,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,IAGzC,gBAAgBA,EAAG,KAAA,CAAM,GAAG,QAAQ,YAAY,GAAG;AAAA,EAC5D;AAAA;AAAA,EAGQ,kBAAuC;AAC7C,UAAMC,IAAK,KAAK,QAAQ,OAAO,CAACpB,MAAMA,EAAE,UAAU,QAAQ,EAAE,QACtDqB,IAAK,KAAK,QAAQ,OAAO,CAACrB,MAAMA,EAAE,UAAU,QAAQ,EAAE;AAC5D,WAAOoB,KAAMC,IAAK,WAAW;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,SAASC,GAAmC;AAClD,UAAMC,IAAOD,EAAY;AACzB,WAAI,OAAOC,KAAQ,WACb,OAAO,MAAMA,CAAG,IAAU,OACvBA,IAEF;AAAA,EACT;AAAA;AAAA,EA8BA,UAAUC,GAAwB;AAEhC,IAAAA,EAAQ,MAAMA,EAAQ,MAAM,IAAI,KAAA,GAC3BA,EAAQ,OACX,KAAK,IAAI,OAAO,SAAS,EAAE,KAAK,8CAA8C,GAC9EA,EAAQ,KAAK,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE;AAGrD,UAAMC,IAAgB,KAAK,QAAQ,UAAU,CAACT,MAAWA,EAAO,OAAOQ,EAAQ,EAAE,GAG3EE,KAAkC,MAAM;AAC5C,UAAID,MAAkB,IAAI;AACxB,cAAME,IAAM,KAAK,QAAQF,CAAa;AACtC,eAAO,CAACD,EAAQ,SAASA,EAAQ,UAAU,SAAUG,EAAI,QAAgBH,EAAQ;AAAA,MACnF;AACA,aAAO,CAACA,EAAQ,SAASA,EAAQ,UAAU,SAAS,KAAK,oBAAoBA,EAAQ;AAAA,IACvF,GAAA;AAOA,QAJK,KAAK,OAAO,IAAIA,EAAQ,EAAE,KAC7B,KAAK,OAAO,IAAIA,EAAQ,IAAI,KAAK,YAAY,GAG3CC,MAAkB,IAAI;AAExB,YAAME,IAAM,KAAK,QAAQF,CAAa,GAChCG,IACJ,OAAOJ,EAAQ,SAAU,YAAY,CAAC,OAAO,MAAMA,EAAQ,KAAK,IAC5DA,EAAQ,QACRG,EAAI,OACJE,IAAwB,EAAE,GAAGF,GAAK,GAAGH,GAAS,OAAOE,GAAW,OAAOE,EAAA;AAE7E,WAAK,QAAQ,OAAOH,GAAe,GAAGI,CAAM;AAAA,IAC9C,OAAO;AAEL,YAAMD,IACJ,OAAOJ,EAAQ,SAAU,YAAY,CAAC,OAAO,MAAMA,EAAQ,KAAK,IAC5DA,EAAQ,QACR,QACAM,IAAuB,EAAE,GAAGN,GAAS,OAAOE,GAAW,OAAOE,EAAA;AACpE,WAAK,QAAQ,KAAKE,CAAK;AAAA,IACzB;AAEA,SAAK,IAAI,KAAK,wBAAwB,EAAE,KAAK,KAAK,KAAK,SAAAN,GAAS,GAChE,KAAK,UAAA;AAAA,EACP;AAAA,EAEA,aAAaL,GAAY;AACvB,UAAMV,IAAQ,KAAK,QAAQ,UAAU,CAACO,MAAWA,EAAO,OAAOG,CAAE;AACjE,QAAIV,MAAU,IAAI;AAChB,YAAMe,IAAU,KAAK,QAAQf,CAAK;AAClC,WAAK,QAAQ,OAAOA,GAAO,CAAC,GAE5B,KAAK,IAAI,KAAK,0BAA0B,EAAE,KAAK,KAAK,KAAK,SAAAe,GAAS,GAClE,KAAK,UAAA;AAAA,IACP;AAAA,EACF;AAAA;AAAA,EAGQ,aAAaA,GAAwB;AAC3C,QAAI,EAAE,IAAAL,GAAI,MAAAY,GAAM,OAAAtB,GAAO,SAAAuB,GAAS,WAAAC,GAAW,aAAAC,GAAa,SAAAC,MAAYX;AACpE,UAAMY,IAAe,KAAK,kBAAkBjB,CAAE;AAyB9C,WArBEF,gBAAAA,EAAC,MAAA,EAAG,OAAM,iBAAgB,IAAImB,GAAc,WAASjB,GAAI,cAAYV,GAAQ,GAAGwB,GAC9E,UAAA;AAAA,MAAA,gBAAAf,EAAC,OAAA,EAAI,OAAM,WAAW,UAAAmB,EAAoBL,CAAO,GAAE;AAAA,MACnD,gBAAAd;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,IAAI,GAAGkB,CAAY;AAAA,UACnB,WAASZ,EAAQ;AAAA,UACjB,OAAM;AAAA,UACN,SAAS,CAACc,MAAW;AACnB,YAAAH,IAAUG,CAAe,GACzB,KAAK,IAAI,KAAK,0BAA0B;AAAA,cACtC,KAAK,KAAK;AAAA,cACV,OAAOA;AAAA,cACP,SAAAd;AAAA,YAAA,CACD;AAAA,UACH;AAAA,UACC,GAAGU;AAAA,UAEH,YAAoBH,CAAI;AAAA,QAAA;AAAA,MAAA;AAAA,IAC3B,GACF;AAAA,EAIJ;AAAA,EAEQ,YAAY;AAClB,UAAMQ,IAAS,KAAK,QACjB,OAAO,CAACvC,MAAMA,EAAE,UAAU,QAAQ,EAClC,MAAA,EACA,KAAK,KAAK,cAAc,GACrBwC,IAAS,KAAK,QACjB,OAAO,CAACxC,MAAMA,EAAE,UAAU,QAAQ,EAClC,MAAA,EACA,KAAK,KAAK,cAAc,GAErByC,IAAW,KAAK,UAAU,cAAc,mBAAmB,GAC3DC,IAAW,KAAK,UAAU,cAAc,mBAAmB;AAEjE,IAAAD,EAAS,YAAY,IACrBC,EAAS,YAAY,IAErBH,EAAO,QAAQ,CAACvB,MAAW;AACzB,MAAAyB,EAAS,YAAY,KAAK,aAAazB,CAAM,CAAC;AAAA,IAChD,CAAC,GACDwB,EAAO,QAAQ,CAACxB,MAAW;AACzB,MAAA0B,EAAS,YAAY,KAAK,aAAa1B,CAAM,CAAC;AAAA,IAChD,CAAC,GAGD,KAAK,mBAAA;AAAA,EACP;AAAA,EAEA,eAAe;AACb,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,WAAW;AACb,WACE,KAAK,UAAU,UAAU,SAAS,eAAe,KACjD,KAAK,UAAU,UAAU,SAAS,YAAY;AAAA,EAElD;AAAA,EAEA,OAAO2B,GAAiB;AACtB,UAAMC,IAAe,KAAK,cACpBC,IAAgB,OAAOF,KAAU,YAAYA,IAAQ,CAACC;AAC5D,SAAK,UAAU,UAAU,OAAO,iBAAiBC,CAAa,GAC9D,KAAK,UAAU,UAAU,OAAO,YAAY,GAC5C,KAAK,IAAI,YAAY,IAAI,qBAAqBA,CAAa,GAC3D,KAAK,IAAI,KAAK,kBAAkB,EAAE,KAAK,KAAK,KAAK,QAAQ,KAAK,SAAA,CAAU;AAAA,EAC1E;AACF;AAnUOtD,IAAAuD,EAAAtD,CAAA;AAAMI,IAANmD,yBARPzD,GAQaM,CAAA;AAANoD,EAAAzD,GAAA,GAAMK,CAAA;"}
|
|
1
|
+
{"version":3,"file":"index-CnR6CqkM.js","sources":["../src/plugins/toolbox/index.tsx"],"sourcesContent":["import { Inject, InPageEdit, Schema, Service } from '@/InPageEdit'\nimport { JSX, ReactElement } from 'jsx-dom'\nimport './styles.scss'\nimport { ComputeAbleSync } from '@/utils/computeable.js'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n toolbox: PluginToolbox\n }\n interface Events {\n 'toolbox/button-added'(payload: { ctx: InPageEdit; payload: ToolboxButton }): void\n 'toolbox/button-removed'(payload: { ctx: InPageEdit; payload: ToolboxButton }): void\n 'toolbox/button-clicked'(payload: {\n ctx: InPageEdit\n event: MouseEvent\n payload: ToolboxButton\n }): void\n 'toolbox/toggle'(payload: { ctx: InPageEdit; opened: boolean }): void\n }\n interface PreferencesMap {\n toolboxAlwaysShow: boolean\n }\n}\n\ninterface ToolboxButton {\n id: string\n group?: 'auto' | 'group1' | 'group2'\n icon: ComputeAbleSync<string | HTMLElement | SVGElement | ReactElement>\n tooltip?: ComputeAbleSync<string | HTMLElement>\n itemProps?: JSX.IntrinsicElements['li']\n buttonProps?: JSX.IntrinsicElements['button']\n onClick?: (event: MouseEvent) => void\n index?: number // 任意数值均可:负数靠前、正数靠后、Infinity 末尾、未传时按插入顺序\n}\n\n@RegisterPreferences(\n Schema.object({\n toolboxAlwaysShow: Schema.boolean()\n .description('Make the toolbox opened by default')\n .default(false),\n }).description('Toolbox preferences')\n)\n@Inject(['preferences'])\nexport class PluginToolbox extends Service {\n container!: HTMLElement\n\n // ==== 内部状态 ====\n private buttons: ToolboxButton[] = []\n\n // 插入顺序序列号:用于当 index 未给时保持“自然顺序”\n private seqCounter = 0\n private seqMap = new Map<string, number>() // id -> seq\n\n constructor(public ctx: InPageEdit) {\n super(ctx, 'toolbox', false)\n }\n\n protected async start(): Promise<void> {\n this.container = this.createToolbox()\n this.ctx.preferences.get('toolboxAlwaysShow').then((val) => {\n if (val) {\n this.container.classList.add('is-persistent')\n }\n })\n this.setupHoverLogic()\n document.body.appendChild(this.container)\n\n // 国际化变化时重新渲染\n this.ctx.on('i18n/changed', () => {\n console.info('i18n/changed', this.buttons)\n this.renderAll()\n })\n }\n\n protected stop(): void | Promise<void> {\n this.container?.remove()\n }\n\n private get isPersistent() {\n return this.container.classList.contains('is-persistent')\n }\n\n private setupHoverLogic() {\n let hoverTimeout: number | null = null\n\n // 鼠标进入时暂时展开\n this.container.addEventListener('mouseenter', () => {\n if (hoverTimeout) {\n clearTimeout(hoverTimeout)\n hoverTimeout = null\n }\n\n // 如果不在持久化状态,则添加hover展开效果\n if (!this.isPersistent) {\n this.container.classList.add('is-hovered')\n }\n })\n\n // 鼠标离开时收起(如果不是持久化状态)\n this.container.addEventListener('mouseleave', () => {\n if (!this.isPersistent) {\n hoverTimeout = window.setTimeout(() => {\n this.container.classList.remove('is-hovered')\n }, 150) // 延迟150ms收起,避免快速移动鼠标时闪烁\n }\n })\n }\n\n /**\n * 计算按钮动画延迟\n * @param index 按钮索引(从0开始)\n * @param totalCount 总按钮数量\n * @returns 延迟时间(秒)\n */\n private calculateButtonDelay(index: number, totalCount: number): number {\n if (totalCount <= 1) return 0\n\n // 总动画时长150ms = 0.15s\n const totalDuration = 0.15\n // 使用平方根函数创建非线性延迟,差值逐渐缩小\n const normalizedIndex = index / (totalCount - 1)\n const delay = totalDuration * Math.sqrt(normalizedIndex)\n\n return Math.round(delay * 1000) / 1000 // 保留3位小数\n }\n\n /**\n * 更新按钮组的动画延迟\n */\n private updateButtonDelays() {\n const btnGroups = this.container.querySelectorAll('.btn-group')\n\n btnGroups.forEach((group) => {\n const buttons = group.querySelectorAll('.btn-tip-group')\n const totalCount = buttons.length\n\n buttons.forEach((button, index) => {\n const delay = this.calculateButtonDelay(index, totalCount)\n ;(button as HTMLElement).style.setProperty('--transition-delay', `${delay}s`)\n ;(button as HTMLElement).style.setProperty('--max-transition-delay', '0.15s')\n })\n })\n }\n\n private createToolbox() {\n const toggler = (\n <button\n className=\"ipe-toolbox-btn\"\n id=\"toolbox-toggler\"\n onClick={() => {\n this.toggle()\n }}\n >\n {/* Font Awesome 5 Solid: Plus */}\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"448\" height=\"512\" viewBox=\"0 0 448 512\">\n <rect width=\"448\" height=\"512\" fill=\"none\" />\n <path\n fill=\"currentColor\"\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\"\n />\n </svg>\n </button>\n )\n const element = (\n <div id=\"ipe-edit-toolbox\">\n <ul className=\"btn-group group1\" style={{ display: 'flex', flexDirection: 'column' }}></ul>\n <ul className=\"btn-group group2\" style={{ display: 'flex', flexDirection: 'row' }}></ul>\n {toggler}\n </div>\n )\n\n return element as HTMLElement\n }\n\n private normalizeButtonId(id: string) {\n if (!id) {\n id = Math.random().toString(36).substring(2, 8)\n }\n // 修复:正确替换空白/点/井号(保留语义,修正正则)\n return `ipe-toolbox__${id.trim()}`.replace(/[\\s.#]+/g, '-')\n }\n\n // ====== 排序与分组 ======\n private chooseAutoGroup(): 'group1' | 'group2' {\n const g1 = this.buttons.filter((b) => b.group === 'group1').length\n const g2 = this.buttons.filter((b) => b.group === 'group2').length\n return g1 <= g2 ? 'group1' : 'group2'\n }\n\n // 归一化排序键:\n // 1) 若 index 是有限数值 => 直接使用(允许负数/小数/很大数);\n // 2) 若为 Infinity / -Infinity => 自然比较;\n // 3) 若 NaN / 未提供 => 返回 null,后续用插入顺序(seq)比较。\n private orderKey(btn: ToolboxButton): number | null {\n const idx = (btn as any).index\n if (typeof idx === 'number') {\n if (Number.isNaN(idx)) return null\n return idx // 包含 Infinity 与 -Infinity\n }\n return null\n }\n\n private compareButtons = (a: ToolboxButton, b: ToolboxButton) => {\n const ak = this.orderKey(a) // number | null\n const bk = this.orderKey(b)\n\n const va = ak ?? 0\n const vb = bk ?? 0\n\n if (va < vb) return -1\n if (va > vb) return 1\n\n // 有效值相等时的细化:\n const sa = this.seqMap.get(a.id) ?? 0\n const sb = this.seqMap.get(b.id) ?? 0\n\n if (ak === null && bk === null) {\n if (sa !== sb) return sa - sb\n return 0 // 不以 id 再兜底,保持稳定排序\n }\n\n if (ak === null && bk !== null) return -1 // 无 index(按0) 优先于 数值 index=0\n if (ak !== null && bk === null) return 1\n\n // 双方都有 index 且值相等,退化到 seq;仍然相等时返回 0\n if (sa !== sb) return sa - sb\n return 0\n }\n\n // ====== 对外 API:新增/替换/删除 ======\n addButton(payload: ToolboxButton) {\n // 统一化 id(保留原意:若缺失则补)\n payload.id = (payload.id || '').trim()\n if (!payload.id) {\n this.ctx.logger('toolbox').warn('Button id is empty, generating a random one.')\n payload.id = Math.random().toString(36).slice(2, 10)\n }\n\n const existingIndex = this.buttons.findIndex((button) => button.id === payload.id)\n\n // 分组:新增时 auto,替换时默认保留原组,除非明确指定\n const nextGroup: 'group1' | 'group2' = (() => {\n if (existingIndex !== -1) {\n const old = this.buttons[existingIndex]\n return !payload.group || payload.group === 'auto' ? (old.group as any) : payload.group\n }\n return !payload.group || payload.group === 'auto' ? this.chooseAutoGroup() : payload.group\n })()\n\n // 序列号:用于 index 未提供时,保持插入顺序\n if (!this.seqMap.has(payload.id)) {\n this.seqMap.set(payload.id, this.seqCounter++)\n }\n\n if (existingIndex !== -1) {\n // 替换:保留旧的 seq,不动;index 未传则沿用旧值\n const old = this.buttons[existingIndex]\n const incomingIndex =\n typeof payload.index === 'number' && !Number.isNaN(payload.index)\n ? payload.index\n : old.index\n const merged: ToolboxButton = { ...old, ...payload, group: nextGroup, index: incomingIndex }\n\n this.buttons.splice(existingIndex, 1, merged)\n } else {\n // 新增:按给定 index 或留空;只设置组\n const incomingIndex =\n typeof payload.index === 'number' && !Number.isNaN(payload.index)\n ? payload.index\n : undefined\n const fresh: ToolboxButton = { ...payload, group: nextGroup, index: incomingIndex }\n this.buttons.push(fresh)\n }\n\n this.ctx.emit('toolbox/button-added', { ctx: this.ctx, payload })\n this.renderAll()\n }\n\n removeButton(id: string) {\n const index = this.buttons.findIndex((button) => button.id === id)\n if (index !== -1) {\n const payload = this.buttons[index]\n this.buttons.splice(index, 1)\n // 可选择是否保留 seq,使得将来同 id 重加时仍按旧顺序;这里删除时保留更合理\n this.ctx.emit('toolbox/button-removed', { ctx: this.ctx, payload })\n this.renderAll()\n }\n }\n\n // ====== 渲染 ======\n private renderButton(payload: ToolboxButton) {\n let { id, icon, index, tooltip, itemProps, buttonProps, onClick } = payload\n const normalizedId = this.normalizeButtonId(id)\n\n // 结构尽量保持,避免在 <li> 上绑定 click 造成双触发\n const element = (\n <li class=\"btn-tip-group\" id={normalizedId} data-id={id} data-index={index} {...itemProps}>\n <div class=\"btn-tip\">{computeFallbackSync(tooltip)}</div>\n <button\n id={`${normalizedId}-btn`}\n data-id={payload.id}\n class=\"ipe-toolbox-btn\"\n onClick={(e: any) => {\n onClick?.(e as MouseEvent)\n this.ctx.emit('toolbox/button-clicked', {\n ctx: this.ctx,\n event: e as MouseEvent,\n payload,\n })\n }}\n {...buttonProps}\n >\n {computeFallbackSync(icon)}\n </button>\n </li>\n )\n\n return element as HTMLElement\n }\n\n private renderAll() {\n const group1 = this.buttons\n .filter((b) => b.group === 'group1')\n .slice()\n .sort(this.compareButtons)\n const group2 = this.buttons\n .filter((b) => b.group === 'group2')\n .slice()\n .sort(this.compareButtons)\n\n const group1El = this.container.querySelector('.btn-group.group1') as HTMLElement\n const group2El = this.container.querySelector('.btn-group.group2') as HTMLElement\n\n group1El.innerHTML = ''\n group2El.innerHTML = ''\n\n group1.forEach((button) => {\n group1El.appendChild(this.renderButton(button))\n })\n group2.forEach((button) => {\n group2El.appendChild(this.renderButton(button))\n })\n\n // 统一更新动画延迟\n this.updateButtonDelays()\n }\n\n getContainer() {\n return this.container\n }\n\n get isOpened() {\n return (\n this.container.classList.contains('is-persistent') ||\n this.container.classList.contains('is-hovered')\n )\n }\n\n toggle(force?: boolean) {\n const isPersistent = this.isPersistent\n const newPersistent = typeof force === 'boolean' ? force : !isPersistent\n this.container.classList.toggle('is-persistent', newPersistent)\n this.container.classList.remove('is-hovered')\n this.ctx.preferences.set('toolboxAlwaysShow', newPersistent)\n this.ctx.emit('toolbox/toggle', { ctx: this.ctx, opened: this.isOpened })\n }\n}\n"],"names":["_PluginToolbox_decorators","_init","_a","RegisterPreferences","Schema","Inject","PluginToolbox","Service","ctx","a","b","ak","bk","va","vb","sa","sb","val","hoverTimeout","index","totalCount","totalDuration","normalizedIndex","delay","group","buttons","button","jsxs","jsx","id","g1","g2","btn","idx","payload","existingIndex","nextGroup","old","incomingIndex","merged","fresh","icon","tooltip","itemProps","buttonProps","onClick","normalizedId","computeFallbackSync","e","group1","group2","group1El","group2El","force","isPersistent","newPersistent","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { j as _, P as Ae, F as Ie } from "./index-CM_6yF2v.js";
|
|
2
2
|
import { a as re, m as te, u as ae, b as oe, e as T, o as Le, f as le, g as Fe, w as J, n as U, h as F, i as Me, j as Pe, t as je, k as Te, s as De, r as O, l as z, p as Re, q, v as G, F as Oe, x as qe, y as He, z as se, A as Ue, B as ne, c as Be } from "./vueHooks-l04s8cIl.js";
|
|
3
|
-
import { S as Ve, I as ze } from "./Preferences-
|
|
3
|
+
import { S as Ve, I as ze } from "./Preferences-C10tZMl1.js";
|
|
4
4
|
import { n as Ge } from "./noop-ClDc6zv4.js";
|
|
5
5
|
import { _ as Je } from "./_plugin-vue_export-helper-CHgC5LLL.js";
|
|
6
|
-
import { B as We } from "./BasePlugin-
|
|
6
|
+
import { B as We } from "./BasePlugin-DD7l-5Xw.js";
|
|
7
7
|
const k = '@charset "UTF-8";:host{display:block;font-family:var(--schema-font-family, ui-sans-serif, system-ui, -apple-system);color:var(--schema-color-fg, #111827)}*,*:before,*:after{box-sizing:border-box}.wrapper{display:block;background:var(--schema-color-bg, #ffffff)}.form{display:grid;gap:12px}.field{display:grid;gap:6px;padding:8px 10px;border:1px solid var(--schema-color-muted, #e5e7eb);border-radius:var(--schema-radius, 10px);background:var(--schema-surface, #fff)}.label{font-size:12px;color:var(--schema-color-muted-text, #6b7280)}.input,select,textarea{width:100%;padding:8px 10px;border-radius:8px;border:1px solid var(--schema-color-muted, #e5e7eb);background:var(--schema-input-bg, #fff);color:inherit}.checkbox{display:inline-flex;align-items:center;gap:8px}.helper{font-size:12px;color:var(--schema-color-muted-text, #6b7280)}.row{display:grid;gap:8px}.actions{display:flex;gap:8px}.btn{padding:6px 10px;border:1px solid var(--schema-color-muted, #e5e7eb);background:var(--schema-btn-bg, #f8fafc);border-radius:8px;cursor:pointer}.btn.primary{background:var(--schema-color-primary, #2563eb);color:#fff;border-color:transparent}.btn:disabled{opacity:.5;cursor:not-allowed}.btn.danger{background:var(--schema-color-danger, #dc2626);color:#fff;border-color:transparent}.group{display:grid;gap:10px}.kv{display:grid;grid-template-columns:1fr 1fr auto;gap:8px;align-items:center}.badge{display:inline-flex;padding:2px 6px;border-radius:999px;font-size:11px;background:var(--schema-badge-bg, #eef2ff);color:var(--schema-badge-fg, #4f46e5)}.hidden{display:none!important}.toolbar{display:flex;gap:6px}.schema-collection-row{position:relative;transition:transform var(--schema-collection-transition-duration, .25s) var(--schema-collection-transition-ease, ease),opacity var(--schema-collection-transition-duration, .25s) var(--schema-collection-transition-ease, ease)}.schema-collection-row.enter{opacity:0}.schema-collection-row.enter.enter-active{opacity:1}.schema-collection-row.leaving{opacity:0}.field.schema-type-array .group,.field.schema-type-array .group .row{position:relative}', ce = {
|
|
8
8
|
arrayAdd: "+",
|
|
9
9
|
arrayMoveUp: "↑",
|
|
@@ -1080,7 +1080,7 @@ class Q extends (we = We) {
|
|
|
1080
1080
|
});
|
|
1081
1081
|
}
|
|
1082
1082
|
async start() {
|
|
1083
|
-
import("./PluginPrefSync-
|
|
1083
|
+
import("./PluginPrefSync-CbFuuC19.js").then(({ PluginPrefSync: e }) => {
|
|
1084
1084
|
this.ctx.plugin(e);
|
|
1085
1085
|
}).catch(this.ctx.logger.warn), this.ctx.on("preferences/changed", (e) => {
|
|
1086
1086
|
this._form?.mergeValue?.(e.input);
|
|
@@ -1176,4 +1176,4 @@ bt(K, 1, Q);
|
|
|
1176
1176
|
export {
|
|
1177
1177
|
Q as PluginPreferencesUI
|
|
1178
1178
|
};
|
|
1179
|
-
//# sourceMappingURL=index-
|
|
1179
|
+
//# sourceMappingURL=index-DKCZDN-Q.js.map
|