@inpageedit/core 0.17.0 → 0.17.1

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 (48) hide show
  1. package/dist/InPageEdit.js +1 -1
  2. package/dist/{PluginImagesUsed-CD7t5kqv.js → PluginImagesUsed-D5O8t694.js} +2 -2
  3. package/dist/{PluginImagesUsed-CD7t5kqv.js.map → PluginImagesUsed-D5O8t694.js.map} +1 -1
  4. package/dist/{PluginPrefSync-DgKVDgiK.js → PluginPrefSync-C8tb5SJJ.js} +2 -2
  5. package/dist/{PluginPrefSync-DgKVDgiK.js.map → PluginPrefSync-C8tb5SJJ.js.map} +1 -1
  6. package/dist/{PluginStoreApp-BwiAYQMA.js → PluginStoreApp-CeKtXL3p.js} +2 -2
  7. package/dist/{PluginStoreApp-BwiAYQMA.js.map → PluginStoreApp-CeKtXL3p.js.map} +1 -1
  8. package/dist/{PluginTemplatesUsed-CmYn48Wd.js → PluginTemplatesUsed-DYv_lbHw.js} +2 -2
  9. package/dist/{PluginTemplatesUsed-CmYn48Wd.js.map → PluginTemplatesUsed-DYv_lbHw.js.map} +1 -1
  10. package/dist/core.js +2 -2
  11. package/dist/{index-C4ncbyR6.js → index--IhZKYnh.js} +3 -3
  12. package/dist/index--IhZKYnh.js.map +1 -0
  13. package/dist/{index-BMd6Bo6r.js → index-Bf6ewNGZ.js} +2 -2
  14. package/dist/{index-BMd6Bo6r.js.map → index-Bf6ewNGZ.js.map} +1 -1
  15. package/dist/{index-BTLjDVvD.js → index-BuSA1t5R.js} +2 -2
  16. package/dist/{index-BTLjDVvD.js.map → index-BuSA1t5R.js.map} +1 -1
  17. package/dist/{index-BfW7ObKf.js → index-CaTtMzfu.js} +112 -101
  18. package/dist/index-CaTtMzfu.js.map +1 -0
  19. package/dist/{index-CZ56EKIK.js → index-CxjH0_fO.js} +2 -2
  20. package/dist/{index-CZ56EKIK.js.map → index-CxjH0_fO.js.map} +1 -1
  21. package/dist/{index-Cjyf3z1w.js → index-DSh05RaI.js} +3 -3
  22. package/dist/{index-Cjyf3z1w.js.map → index-DSh05RaI.js.map} +1 -1
  23. package/dist/{index-BvHXETfl.js → index-Dp_n8QEV.js} +2 -2
  24. package/dist/{index-BvHXETfl.js.map → index-Dp_n8QEV.js.map} +1 -1
  25. package/dist/{index-Dfp9Vp36.js → index-Mi3qr9J0.js} +2 -2
  26. package/dist/{index-Dfp9Vp36.js.map → index-Mi3qr9J0.js.map} +1 -1
  27. package/dist/{index-C2_G8gLW.js → index-QtXlz9l0.js} +3 -3
  28. package/dist/{index-C2_G8gLW.js.map → index-QtXlz9l0.js.map} +1 -1
  29. package/dist/{index-5DLUhCA3.js → index-_Sydb5MZ.js} +391 -356
  30. package/dist/index-_Sydb5MZ.js.map +1 -0
  31. package/dist/{index-B5UcAL5E.js → index-fa8d4Dv_.js} +2 -2
  32. package/dist/{index-B5UcAL5E.js.map → index-fa8d4Dv_.js.map} +1 -1
  33. package/dist/{index-s7aFr-gn.js → index-h57rl1RH.js} +11 -11
  34. package/dist/index-h57rl1RH.js.map +1 -0
  35. package/dist/{index-siZBRSp0.js → index-qbW7-LUD.js} +3 -3
  36. package/dist/index-qbW7-LUD.js.map +1 -0
  37. package/dist/index.d.ts +3 -1
  38. package/dist/index.js +2 -2
  39. package/dist/plugins/index.js +12 -12
  40. package/dist/services/index.js +1 -1
  41. package/lib/index.umd.js +15 -15
  42. package/lib/index.umd.js.map +1 -1
  43. package/package.json +2 -2
  44. package/dist/index-5DLUhCA3.js.map +0 -1
  45. package/dist/index-BfW7ObKf.js.map +0 -1
  46. package/dist/index-C4ncbyR6.js.map +0 -1
  47. package/dist/index-s7aFr-gn.js.map +0 -1
  48. package/dist/index-siZBRSp0.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-C4ncbyR6.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'\nimport { ReactNode } from 'jsx-dom'\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 createQuickDiffButton(\n payload: Partial<CompareApiRequestOptions>,\n options?: {\n label?: ReactNode\n icon?: ReactNode\n }\n ) {\n const { $ } = this.ctx\n const icon = options?.icon ?? <IconQuickDiff className=\"ipe-icon\" />\n const label = options?.label ?? $`Quick Diff`\n return (\n <a\n href={`#ipe://quick-diff/`}\n dataset={payload as any}\n className={`ipe-quick-diff`}\n style={{\n userSelect: 'none',\n marginLeft: '0.2em',\n }}\n onClick={(e) => {\n e.preventDefault()\n this.comparePages(payload)\n }}\n >\n {icon}\n {label}\n </a>\n ) as HTMLAnchorElement\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","payload","icon","IconQuickDiff","label","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-s7aFr-gn.js","sources":["../src/utils/sleep.ts","../src/plugins/quick-edit/index.tsx"],"sourcesContent":["export const sleep = (ms: number = 0) =>\n new Promise((resolve) => setTimeout(resolve, ms))\n","import { Inject, InPageEdit, Schema } from '@/InPageEdit'\nimport { IWikiPage } from '@/models/WikiPage'\nimport { WatchlistAction } from '@/models/WikiPage/types/WatchlistAction'\nimport { IPEModal } from '@inpageedit/modal'\nimport { ReactNode } from 'jsx-dom'\nimport { makeCallable } from '@/utils/makeCallable.js'\nimport { MediaWikiApiError } from 'wiki-saikou'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n quickEdit: PluginQuickEdit & {\n (...args: Parameters<PluginQuickEdit['showModal']>): ReturnType<PluginQuickEdit['showModal']>\n }\n }\n interface Events {\n 'quick-edit/init-options'(payload: Omit<QuickEditEventPayload, 'modal' | 'wikiPage'>): void\n 'quick-edit/show-modal'(payload: Omit<QuickEditEventPayload, 'wikiPage'>): void\n 'quick-edit/wiki-page'(payload: QuickEditEventPayload): void\n 'quick-edit/edit-notice'(payload: QuickEditEventPayload & { editNotices: ReactNode[] }): void\n 'quick-edit/submit'(payload: QuickEditSubmitPayload & { ctx: InPageEdit }): void\n }\n interface PreferencesMap {\n 'quickEdit.editSummary': string\n 'quickEdit.editMinor': boolean\n 'quickEdit.outSideClose': boolean\n 'quickEdit.watchList': WatchlistAction\n 'quickEdit.keyshortcut.save': string\n 'quickEdit.editFont': string\n }\n}\n\nexport interface QuickEditOptions {\n title: string\n pageId: number\n revision: number\n /**\n * - `undefined` for full article edit\n * - `0` for the first section\n * - `\"new\"` for a new section\n */\n section: number | 'new' | undefined\n editMinor: boolean\n editSummary: string\n createOnly: boolean\n reloadAfterSave: boolean\n}\n\nexport interface QuickEditEventPayload {\n ctx: InPageEdit\n options: QuickEditOptions\n modal: IPEModal\n wikiPage: IWikiPage\n}\n\nexport interface QuickEditSubmitPayload {\n wikiPage: IWikiPage\n text?: string\n summary?: string\n section?: number | 'new' | undefined\n minor?: boolean\n createonly?: boolean\n recreate?: boolean\n watchlist?: WatchlistAction\n}\n\n@Inject(['api', 'wikiPage', 'wikiTitle', 'currentPage', 'wiki', 'modal', 'preferences', '$'])\n@RegisterPreferences(\n Schema.object({\n 'quickEdit.editSummary': Schema.string()\n .description('Default edit summary for quick edits')\n .default('[IPE-NEXT] Quick edit'),\n 'quickEdit.editMinor': Schema.boolean()\n .description('Default to checking \"minor edit\" option')\n .default(false),\n 'quickEdit.outSideClose': Schema.boolean()\n .description('Close editor modal by clicking outside')\n .default(true),\n 'quickEdit.watchList': Schema.union([\n Schema.const(WatchlistAction.preferences).description('Follow MW preferences'),\n Schema.const(WatchlistAction.nochange).description('Keep the current watchlist status'),\n Schema.const(WatchlistAction.watch).description('Add the page to watchlist'),\n Schema.const(WatchlistAction.unwatch).description('Remove the page from watchlist'),\n ])\n .description('Watchlist options')\n .default(WatchlistAction.preferences),\n 'quickEdit.keyshortcut.save': Schema.string()\n .default('ctrl-s')\n .description('save button key shortcut (blank to disable)'),\n 'quickEdit.editFont': Schema.union([\n Schema.const('preferences').description('Follow MW preferences'),\n Schema.const('monospace').description('Monospace'),\n Schema.const('sans-serif').description('Sans-serif'),\n Schema.const('serif').description('Serif'),\n Schema.string().description('Custom font (same as CSS `font-family` property)').default(''),\n ])\n .description(\"Font to use in quick edit's textarea\")\n .default('preferences'),\n })\n .description('Quick edit options')\n .extra('category', 'editor')\n)\nexport class PluginQuickEdit extends BasePlugin {\n private readonly DEFAULT_OPTIONS: QuickEditOptions = {\n title: '',\n pageId: 0,\n revision: 0,\n section: undefined,\n editMinor: false,\n editSummary: '',\n createOnly: false,\n reloadAfterSave: true,\n }\n\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'quick-edit')\n this.ctx.root.set('quickEdit', makeCallable(this, 'showModal'))\n }\n\n protected start(): Promise<void> | void {\n this.ctx.inject(['toolbox'], (ctx) => {\n this.injectToolbox(ctx)\n ctx.on('dispose', () => {\n this.removeToolbox(ctx)\n })\n })\n }\n\n async showModal(payload?: string | Partial<QuickEditOptions>) {\n const { $ } = this.ctx\n if (typeof payload === 'undefined') {\n payload = {}\n } else if (typeof payload === 'string') {\n payload = {\n title: payload,\n } as Partial<QuickEditOptions>\n }\n\n // @ts-expect-error legacy `page` option\n if (payload?.page) {\n // @ts-expect-error\n payload.title = payload.page\n // @ts-expect-error\n delete payload.page\n }\n\n if (!payload.title && !payload.pageId && !payload.revision) {\n this.logger.warn('None of the title, pageId or revision provided. Using defaults.')\n const searchParams = new URLSearchParams(window.location.search)\n const title = this.ctx.currentPage.wikiTitle\n payload = {\n ...payload,\n title: title?.getPrefixedDBKey(),\n revision: searchParams.has('oldid') ? Number(searchParams.get('oldid')) : undefined,\n pageId: searchParams.has('curid') ? Number(searchParams.get('curid')) : undefined,\n }\n }\n\n if (!payload.revision && !payload.pageId && payload.title) {\n const realTarget = this.ctx.wikiTitle.resolveSpecialPageTarget(payload.title)\n if (realTarget && realTarget.title.getNamespaceId() >= 0) {\n payload.title = realTarget.title.getPrefixedDBKey()\n payload.section ??= realTarget.section\n }\n }\n\n const outSideClose = (await this.ctx.preferences.get('quickEdit.outSideClose'))!\n const watchList = (await this.ctx.preferences.get('quickEdit.watchList'))!\n const editSummary =\n typeof payload.editSummary === 'string'\n ? payload.editSummary\n : (await this.ctx.preferences.get('quickEdit.editSummary'))!\n const editMinor =\n typeof payload.editMinor === 'boolean'\n ? payload.editMinor\n : (await this.ctx.preferences.get('quickEdit.editMinor'))!\n const fontOptions = await this.getEditFontOptions()\n\n const options: QuickEditOptions = {\n ...this.DEFAULT_OPTIONS,\n editSummary,\n editMinor,\n ...payload,\n }\n if (!options.editSummary) {\n options.editSummary = (await this.ctx.preferences.get('quickEdit.editSummary')) || ''\n }\n this.ctx.emit('quick-edit/init-options', { ctx: this.ctx, options })\n\n const modal = this.ctx.modal\n .createObject({\n className: 'ipe-quickEdit',\n sizeClass: 'large',\n // backdrop: false,\n // draggable: true,\n center: false,\n outSideClose,\n })\n .init()\n modal.setTitle(\n (\n <>\n Loading: <u>{options.title}</u>\n </>\n ) as HTMLElement\n )\n modal.setContent(\n (\n <section\n className=\"ipe-quickEdit-loading\"\n style={{\n height: '70vh',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n }}\n >\n <ProgressBar />\n </section>\n ) as HTMLElement\n )\n modal.addButton({\n side: 'right',\n type: 'button',\n className: 'is-danger is-ghost',\n label: $`Cancel`,\n method() {\n modal.close()\n },\n })\n modal.show()\n this.ctx.emit('quick-edit/show-modal', { ctx: this.ctx, modal, options })\n\n let wikiPage: IWikiPage\n try {\n wikiPage = await this.getWikiPageFromPayload(options)\n if (wikiPage.pageInfo.special) {\n throw new Error($`Special page is not editable.`)\n }\n } catch (e) {\n modal.off(modal.Event.Close)\n modal.close()\n this.ctx.modal.notify('error', {\n content: e instanceof Error ? e.message : String(e),\n })\n return\n }\n\n const edittingContent = options.section === 'new' ? '' : wikiPage.revisions[0]?.content || ''\n const edittingRevId = wikiPage.revisions[0]?.revid\n const isEdittingOld = edittingRevId && edittingRevId !== wikiPage.lastrevid\n const isCreatingNewSection = options.section === 'new'\n const isCreatingNewPage = wikiPage.pageid === 0\n\n modal.setTitle(\n (\n <>\n {isCreatingNewSection\n ? $`New Section`\n : $`Quick ${isCreatingNewPage ? 'Create' : 'Edit'}`}\n : <u>{wikiPage.pageInfo.title}</u>\n {isEdittingOld ? ` (${$`Revision`} ${edittingRevId})` : ''}\n </>\n ) as HTMLElement\n )\n\n const editNotices = [] as ReactNode[]\n // Page not exists\n if (isCreatingNewPage) {\n editNotices.push(\n <MBox title={$`Attention`} type=\"important\">\n <p>{$`This page does not exist.`}</p>\n </MBox>\n )\n }\n // Edit based on old revision\n if (isEdittingOld) {\n editNotices.push(\n <MBox title={$`Attention`} type=\"warning\">\n <p\n innerHTML={$`You are editing a <em>historical version</em>; the content is not the latest!`}\n ></p>\n </MBox>\n )\n }\n this.ctx.emit('quick-edit/edit-notice', {\n ctx: this.ctx,\n options,\n modal,\n wikiPage,\n editNotices,\n })\n\n const editForm = (\n <form className=\"ipe-quickEdit__form\">\n <div className=\"ipe-quickEdit__notices\">{editNotices}</div>\n <div\n className=\"ipe-quickEdit__content\"\n style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}\n >\n {options.section === 'new' && (\n <>\n <InputBox\n label={$`Section title`}\n id=\"summary\"\n name=\"summary\"\n value={''}\n inputProps={{ placeholder: $`Topic for new section, this will be the h2 heading` }}\n />\n </>\n )}\n <textarea\n className={`ipe-quickEdit__textarea ${fontOptions.className}`}\n style={{ fontFamily: fontOptions.fontFamily }}\n name=\"text\"\n id=\"wpTextbox1\"\n >\n {edittingContent}\n </textarea>\n </div>\n <div\n class=\"ipe-quickEdit__options\"\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '1rem',\n marginTop: '1rem',\n }}\n >\n {!isCreatingNewSection && (\n <InputBox label={$`Summary`} id=\"summary\" name=\"summary\" value={options.editSummary} />\n )}\n <div className=\"ipe-input-box\">\n <label htmlFor=\"watchlist\" style={{ display: 'block' }}>\n {$`Watchlist`}\n </label>\n <div style={{ display: 'flex', gap: '1rem', whiteSpace: 'nowrap', overflowX: 'auto' }}>\n {[\n WatchlistAction.preferences,\n WatchlistAction.nochange,\n WatchlistAction.watch,\n WatchlistAction.unwatch,\n ].map((action) => (\n <RadioBox\n key={action}\n name=\"watchlist\"\n value={action}\n inputProps={{\n checked: watchList === action,\n onChange: (e) => {\n e.target &&\n (e.target as HTMLElement).closest('label')?.scrollIntoView({\n behavior: 'smooth',\n inline: 'center',\n })\n },\n }}\n >\n {$`watchlist.${action}`}\n </RadioBox>\n ))}\n </div>\n </div>\n <div style={{ display: 'flex', gap: '1rem' }}>\n <CheckBox name=\"minor\" id=\"minor\" checked={options.editMinor}>\n {$`Minor edit`}\n </CheckBox>\n <CheckBox name=\"reloadAfterSave\" id=\"reloadAfterSave\" checked={options.reloadAfterSave}>\n {$`Reload after save`}\n </CheckBox>\n </div>\n </div>\n {/* Debug Info */}\n {import.meta.env.DEV && (\n <div className=\"debug\" style={{ marginTop: '1rem' }}>\n <details>\n <pre>{JSON.stringify(wikiPage.pageInfo, null, 2)}</pre>\n </details>\n </div>\n )}\n </form>\n ) as HTMLFormElement\n modal.setContent(editForm)\n\n let dismissWarnings = false\n modal.addButton(\n {\n side: 'left',\n className: 'is-primary submit-btn',\n label: $`Submit`,\n keyPress: (await this.ctx.preferences.get('quickEdit.keyshortcut.save')) || undefined,\n method: async () => {\n const formData = new FormData(editForm)\n console.info(wikiPage, editForm, {\n text: formData.get('text') as string,\n summary: formData.get('summary') as string,\n minor: formData.get('minor') === 'on',\n })\n modal.setLoadingState(true)\n\n try {\n await this.handleSubmit({\n wikiPage,\n text: formData.get('text') as string,\n summary: formData.get('summary') as string,\n minor: formData.get('minor') === 'on',\n section: options.section,\n watchlist: watchList,\n // 如果无视风险,那么就不再尝试解决冲突,直接重建页面\n createonly: wikiPage.pageid === 0 && !dismissWarnings,\n recreate: wikiPage.pageid === 0 && dismissWarnings,\n })\n\n modal.setOptions({\n beforeClose: noop,\n })\n modal.close()\n\n this.ctx.modal.notify('success', {\n title: $`Submission Successful`,\n content: $`Your changes have been saved.`,\n })\n\n if (formData.get('reloadAfterSave')) {\n await sleep(500)\n location.reload()\n }\n } catch (error) {\n modal.setLoadingState(false)\n\n if (MediaWikiApiError.is(error)) {\n if (\n error.code === 'pagedeleted' ||\n error.code === 'editconflict' ||\n error.code === 'articleexists'\n ) {\n dismissWarnings = true\n this.ctx.modal.notify('warning', {\n title: $`Submission Error`,\n content: (\n <div>\n <p>\n <strong>{error.message}</strong>\n </p>\n <p>{$`You can try to submit again to dismiss the warnings.`}</p>\n </div>\n ),\n closeAfter: 15 * 1000,\n })\n return // can be dismissed by re-submission\n }\n }\n\n // Errors not handled above\n this.ctx.modal.notify('error', {\n title: $`Submission Error`,\n content: error instanceof Error ? error.message : String(error),\n })\n }\n },\n },\n 0\n )\n modal.setOptions({\n beforeClose: () => {\n const oldStr = wikiPage.revisions[0]?.content || ''\n const newStr = editForm.querySelector('textarea')?.value || ''\n if (newStr === oldStr) {\n return true\n } else {\n this.ctx.modal.confirm(\n {\n className: 'is-primary',\n title: $`Unsaved Changes`,\n content: $`All edit contents will be lost after closing the modal. Are you sure you want to close?`,\n center: true,\n okBtn: {\n label: $`Give Up`,\n className: 'is-danger is-ghost',\n },\n cancelBtn: {\n label: $`Continue Editing`,\n className: 'is-primary is-ghost',\n },\n },\n (confirmed) => {\n if (confirmed) {\n modal.setOptions({\n beforeClose: noop,\n })\n modal.close()\n }\n return true\n }\n )\n return false\n }\n },\n })\n this.ctx.emit('quick-edit/wiki-page', {\n ctx: this.ctx,\n options,\n modal,\n wikiPage,\n })\n\n const beforeUnload = (e: BeforeUnloadEvent) => {\n if (editForm.querySelector('textarea')?.value === edittingContent) {\n return true\n }\n e.preventDefault()\n return $`You have unsaved changes. Are you sure you want to leave?`\n }\n window.addEventListener('beforeunload', beforeUnload)\n modal.on(modal.Event.Close, () => {\n window.removeEventListener('beforeunload', beforeUnload)\n })\n }\n\n async handleSubmit(payload: QuickEditSubmitPayload) {\n const { wikiPage, ...rest } = payload\n\n this.ctx.emit('quick-edit/submit', {\n ctx: this.ctx,\n wikiPage,\n ...rest,\n })\n\n return wikiPage.edit({\n ...rest,\n })\n }\n\n static readonly BUILT_IN_FONT_OPTIONS = ['preferences', 'monospace', 'sans-serif', 'serif']\n async getEditFontOptions() {\n const prefEditFont = (await this.ctx.preferences.get('quickEdit.editFont'))!\n if (PluginQuickEdit.BUILT_IN_FONT_OPTIONS.includes(prefEditFont)) {\n const editfont =\n prefEditFont === 'preferences'\n ? this.ctx.wiki.userOptions?.editfont || 'monospace'\n : prefEditFont\n return {\n className: `mw-editfont-${editfont}`,\n fontFamily: '',\n }\n } else {\n return {\n className: 'mw-editfont-custom',\n fontFamily: prefEditFont,\n }\n }\n }\n\n async getWikiPageFromPayload(payload: Partial<QuickEditOptions>) {\n if (payload.revision) {\n return this.ctx.wikiPage.newFromRevision(payload.revision, payload.section)\n } else if (payload.pageId) {\n return this.ctx.wikiPage.newFromPageId(payload.pageId, payload.section)\n } else if (payload.title) {\n return this.ctx.wikiPage.newFromTitle(payload.title, false, payload.section)\n }\n throw new Error('Invalid payload')\n }\n\n private async injectToolbox(ctx: InPageEdit) {\n const { $ } = this.ctx\n const title = this.ctx.currentPage.wikiTitle\n const canEdit = title && title.getNamespaceId() >= 0\n ctx.toolbox.addButton({\n id: 'quick-edit',\n group: 'group1',\n index: 0,\n icon: (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"icon icon-tabler icons-tabler-outline icon-tabler-edit\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1\" />\n <path d=\"M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415z\" />\n <path d=\"M16 5l3 3\" />\n </svg>\n ) as HTMLElement,\n buttonProps: {\n disabled: !canEdit,\n },\n tooltip: () => (canEdit ? $`Quick Edit` : $`Not editable`),\n onClick: () => {\n const revision = new URLSearchParams(window.location.search).get('oldid')\n this.showModal({\n title: title?.getPrefixedText(),\n revision: revision ? Number(revision) : undefined,\n })\n },\n })\n }\n\n protected removeToolbox(ctx: InPageEdit) {\n ctx.toolbox.removeButton('quick-edit')\n }\n\n createQuickEditButton(\n payload: Partial<QuickEditOptions>,\n options?: {\n icon?: ReactNode\n label?: ReactNode\n }\n ) {\n const { $ } = this.ctx\n const icon = options?.icon ?? <IconQuickEdit className=\"ipe-icon\" />\n const label = options?.label ?? $`Quick Edit`\n return (\n <a\n href={`#ipe://quick-edit/`}\n dataset={payload as any}\n className={`ipe-quick-edit ${payload.createOnly ? 'ipe-quick-edit--create-only' : ''}`}\n style={{\n userSelect: 'none',\n marginLeft: '0.2em',\n }}\n onClick={(e) => {\n e.preventDefault()\n this.showModal(payload)\n }}\n >\n {icon}\n {label}\n </a>\n ) as HTMLAnchorElement\n }\n}\n"],"names":["sleep","ms","resolve","_PluginQuickEdit_decorators","_init","_a","Inject","RegisterPreferences","Schema","WatchlistAction","_PluginQuickEdit","BasePlugin","ctx","makeCallable","payload","$","searchParams","title","realTarget","outSideClose","watchList","editSummary","editMinor","fontOptions","options","modal","jsxs","Fragment","jsx","ProgressBar","wikiPage","e","edittingContent","edittingRevId","isEdittingOld","isCreatingNewSection","isCreatingNewPage","editNotices","MBox","editForm","InputBox","action","RadioBox","CheckBox","dismissWarnings","formData","noop","error","MediaWikiApiError","oldStr","confirmed","beforeUnload","rest","prefEditFont","canEdit","revision","icon","IconQuickEdit","label","__decoratorStart","__decorateElement","__runInitializers","PluginQuickEdit"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-siZBRSp0.js","sources":["../src/plugins/quick-preview/index.tsx"],"sourcesContent":["import { Inject, InPageEdit, Schema } from '@/InPageEdit'\nimport { type QuickEditEventPayload } from '@/plugins/quick-edit'\nimport { IWikiPage } from '@/models/WikiPage'\nimport { MwApiParams } from 'wiki-saikou'\nimport { PageParseData } from '@/models/WikiPage/types/PageParseData'\nimport { IPEModal, IPEModalOptions } from '@inpageedit/modal'\n\nimport './style.scss'\n\ninterface QuickPreviewEventPayload {\n ctx: InPageEdit\n modal: IPEModal\n wikiPage: IWikiPage\n text: string\n parseData: PageParseData\n}\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n quickPreview: PluginQuickPreview & {\n // for backward compatibility\n (\n ...args: Parameters<PluginQuickPreview['previewWikitext']>\n ): ReturnType<PluginQuickPreview['previewWikitext']>\n }\n }\n interface Events {\n 'quick-preview/show-modal'(payload: Omit<QuickPreviewEventPayload, 'parseData'>): void\n 'quick-preview/loaded'(payload: QuickPreviewEventPayload): void\n }\n interface PreferencesMap {\n 'quickPreview.keyshortcut.quickEdit': string\n 'quickPreview.keyshortcut.quickDelete': string\n }\n}\n\n@Inject(['api', 'wikiPage', 'modal', 'preferences', '$'])\n@RegisterPreferences(\n Schema.object({\n 'quickPreview.keyshortcut': Schema.string()\n .default('ctrl-i')\n .description('Key shortcut to open quick preview in quick edit modal'),\n })\n .extra('category', 'editor')\n .description('Quick preview options')\n)\nexport class PluginQuickPreview extends BasePlugin {\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'quickPreview')\n this.ctx.set('quickPreview', makeCallable(this, 'previewWikitext'))\n }\n\n protected start(): Promise<void> | void {\n this.ctx.on('quick-edit/wiki-page', this.injectQuickEdit.bind(this))\n }\n\n protected stop(): Promise<void> | void {}\n\n previewWikitext(\n text: string,\n params?: MwApiParams,\n wikiPage?: IWikiPage,\n modal?: IPEModal,\n modalOptions?: Partial<IPEModalOptions>\n ) {\n const { $ } = this.ctx\n\n wikiPage ||= this.ctx.wikiPage.newBlankPage({\n title: 'API',\n })\n\n if (!modal || modal.isDestroyed) {\n modal = this.ctx.modal\n .createObject({\n className: 'in-page-edit ipe-quickPreview',\n sizeClass: 'large',\n center: false,\n ...modalOptions,\n })\n .init()\n }\n\n modal.show()\n modal.setTitle($`Preview - Loading...`)\n modal.setContent(<ProgressBar />)\n modal.bringToFront()\n this.ctx.emit('quick-preview/show-modal', {\n ctx: this.ctx,\n text,\n modal,\n wikiPage,\n })\n\n wikiPage\n .preview(text, params)\n .then((ret) => {\n const {\n data: { parse },\n } = ret\n modal.setTitle($(parse.title)`Preview - {{ $1 }}`)\n let outputRef: HTMLElement | null = null\n modal.setContent(\n (\n <section>\n <div\n ref={(el) => (outputRef = el)}\n className=\"mw-parser-output\"\n innerHTML={parse.text}\n ></div>\n </section>\n ) as HTMLElement\n )\n if (window.mw?.hook && typeof jQuery === 'function') {\n window.mw.hook('wikipage.content').fire(jQuery(outputRef!))\n }\n this.ctx.emit('quick-preview/loaded', {\n ctx: this.ctx,\n modal,\n wikiPage,\n text,\n parseData: parse,\n })\n })\n .catch((error) => {\n modal.setTitle($`Preview - Failed`)\n modal.setContent(\n <>\n <p>{$`Failed to preview`}</p>\n <p>{error instanceof Error ? error.message : String(error)}</p>\n </>\n )\n })\n\n return modal\n }\n\n private async injectQuickEdit({ options, modal, wikiPage }: QuickEditEventPayload) {\n const { $ } = this.ctx\n let latestPreviewModal: IPEModal | undefined = undefined\n modal.addButton(\n {\n label: $`Preview`,\n side: 'left',\n className: 'btn btn-secondary',\n keyPress:\n (await this.ctx.preferences.get('quickPreview.keyshortcut.quickEdit')) || undefined,\n method: () => {\n let wikitext =\n (modal.get$content().querySelector<HTMLTextAreaElement>('textarea[name=\"text\"]')\n ?.value as string) || ''\n if (options.section === 'new') {\n const title = modal\n .get$content()\n .querySelector<HTMLInputElement>('input[name=\"summary\"]')?.value\n if (title) {\n wikitext = `==${title}==\\n${wikitext}`\n }\n }\n\n latestPreviewModal = this.previewWikitext(\n wikitext,\n undefined,\n wikiPage,\n latestPreviewModal,\n {\n backdrop: false,\n draggable: true,\n }\n )\n },\n },\n 1\n )\n modal.on(modal.Event.Close, () => {\n latestPreviewModal?.destroy()\n latestPreviewModal = undefined\n })\n }\n\n private _contentTypeCache = new Map<string, Promise<string>>()\n private fetchContentType(url: string) {\n const cached = this._contentTypeCache.get(url)\n if (cached) return cached\n const promise = fetch(url, { method: 'HEAD' })\n .then((res) => res.headers.get('content-type') || '')\n .catch(() => {\n this._contentTypeCache.delete(url)\n return ''\n })\n this._contentTypeCache.set(url, promise)\n return promise\n }\n async getPreviewType(fileOrUrl: File | string) {\n if (!fileOrUrl) return 'unknown'\n let contentType: string\n let ext: string\n if (fileOrUrl instanceof File) {\n contentType = fileOrUrl.type\n ext = fileOrUrl.name.split('.').pop()?.toLowerCase() || ''\n } else {\n const url = new URL(fileOrUrl, location.origin)\n if (url.protocol === 'data:' || url.protocol === 'blob:' || url.protocol.startsWith('http')) {\n contentType = await this.fetchContentType(url.href)\n } else {\n contentType = ''\n }\n ext = url.pathname.split('.').pop()?.toLowerCase() || ''\n }\n if (\n contentType.startsWith('image/') &&\n /** Windows provide PDFs as image/pdf */ !contentType.includes('pdf')\n ) {\n return 'image'\n }\n if (contentType.startsWith('video/')) return 'video'\n if (contentType.startsWith('audio/')) return 'audio'\n if (contentType.startsWith('text/html')) return 'html'\n if (ext === 'md') return 'markdown'\n if (contentType.startsWith('text/')) return 'text'\n // detect by file extension\n if (['jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'ico', 'webp'].includes(ext)) return 'image'\n if (['mp4', 'webm', 'ogg', 'flv', 'avi', 'mov', 'wmv', 'mkv'].includes(ext)) return 'video'\n if (['mp3', 'wav', 'ogg', 'flac', 'aac', 'm4a', 'wma'].includes(ext)) return 'audio'\n if (['html', 'htm'].includes(ext)) return 'html'\n if (['json', 'yml', 'yaml', 'toml', 'py'].includes(ext)) return 'text'\n if (['pdf'].includes(ext)) return 'pdf'\n return 'unknown'\n }\n async previewFile(fileOrUrl: File | string, alt?: string) {\n const previewElement = await this.getPreviewElement(fileOrUrl, alt)\n if (!previewElement) return\n const modal = this.ctx.modal.dialog({\n className: 'in-page-edit ipe-quickPreview',\n sizeClass: 'mediumToLarge',\n center: true,\n title: alt ?? (fileOrUrl instanceof File ? fileOrUrl.name : fileOrUrl),\n content: <section className=\"ipe-quickPreview__content\">{previewElement}</section>,\n })\n return modal\n }\n private _objectUrls = new WeakMap<File, string>()\n private getObjectUrl(file: File) {\n if (!this._objectUrls.has(file)) {\n const objUrl = URL.createObjectURL(file)\n this._objectUrls.set(file, objUrl)\n }\n return this._objectUrls.get(file)!\n }\n async getPreviewElement(fileOrUrl: File | string, alt?: string) {\n const previewType = await this.getPreviewType(fileOrUrl)\n const url = fileOrUrl instanceof File ? this.getObjectUrl(fileOrUrl) : fileOrUrl\n switch (previewType) {\n case 'image':\n return (\n <img src={url} alt={alt ?? (fileOrUrl instanceof File ? fileOrUrl.name : fileOrUrl)} />\n )\n case 'video':\n return <video src={url} controls={true} aria-label={alt} />\n case 'audio':\n return <audio src={url} controls={true} aria-label={alt} />\n case 'pdf':\n return <embed type=\"application/pdf\" src={url} aria-label={alt} />\n }\n return null\n }\n\n previewWikiPage(title: string) {\n throw new Error('Not implemented')\n }\n}\n"],"names":["_PluginQuickPreview_decorators","_init","_a","Inject","RegisterPreferences","Schema","PluginQuickPreview","BasePlugin","ctx","makeCallable","text","params","wikiPage","modal","modalOptions","$","jsx","ProgressBar","ret","parse","outputRef","el","error","jsxs","Fragment","options","latestPreviewModal","wikitext","title","url","cached","promise","res","fileOrUrl","contentType","ext","alt","previewElement","file","objUrl","previewType","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}