@inpageedit/core 0.9.2 → 0.9.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.
Files changed (27) hide show
  1. package/dist/{index-CInRo1qR.js → index-BJ2aqva1.js} +2 -2
  2. package/dist/{index-CInRo1qR.js.map → index-BJ2aqva1.js.map} +1 -1
  3. package/dist/{index-Ek5d60jn.js → index-BKxuoVoX.js} +1567 -1412
  4. package/dist/index-BKxuoVoX.js.map +1 -0
  5. package/dist/{index-DxGjTpIn.js → index-CA_JNRF8.js} +2 -2
  6. package/dist/{index-DxGjTpIn.js.map → index-CA_JNRF8.js.map} +1 -1
  7. package/dist/{index-CaI9BFuB.js → index-CMuITxgX.js} +2 -2
  8. package/dist/{index-CaI9BFuB.js.map → index-CMuITxgX.js.map} +1 -1
  9. package/dist/{index-UjgKGkN2.js → index-CNsfHvio.js} +2 -2
  10. package/dist/{index-UjgKGkN2.js.map → index-CNsfHvio.js.map} +1 -1
  11. package/dist/{index-C-A3jSMx.js → index-CiceXP5j.js} +2 -2
  12. package/dist/{index-C-A3jSMx.js.map → index-CiceXP5j.js.map} +1 -1
  13. package/dist/{index-CWbHdYKu.js → index-D8zKl2eU.js} +2 -2
  14. package/dist/{index-CWbHdYKu.js.map → index-D8zKl2eU.js.map} +1 -1
  15. package/dist/{index-btJ_NMuF.js → index-D968kDLW.js} +2 -2
  16. package/dist/{index-btJ_NMuF.js.map → index-D968kDLW.js.map} +1 -1
  17. package/dist/{index-RFAZzS9C.js → index-DRaYlg2d.js} +2 -2
  18. package/dist/{index-RFAZzS9C.js.map → index-DRaYlg2d.js.map} +1 -1
  19. package/dist/{index-D6055L55.js → index-DtLiqtR8.js} +2 -2
  20. package/dist/{index-D6055L55.js.map → index-DtLiqtR8.js.map} +1 -1
  21. package/dist/index.js +1 -1
  22. package/dist/services/storage/IDBStorage.d.ts +69 -31
  23. package/dist/services/storage/index.d.ts +8 -8
  24. package/lib/index.umd.js +23 -23
  25. package/lib/index.umd.js.map +1 -1
  26. package/package.json +3 -3
  27. package/dist/index-Ek5d60jn.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { j as i, F as S, P as E } from "./index-CvhkVj_L.js";
2
- import { B as C, I as z, S as y } from "./index-Ek5d60jn.js";
2
+ import { B as C, I as z, S as y } from "./index-BKxuoVoX.js";
3
3
  import { I as j } from "./IconQuickEdit-CAL1HXIb.js";
4
4
  import { R as q } from "./Preferences-DS4-CFWe.js";
5
5
  import { M as I } from "./index-lZkYoUca.js";
@@ -354,4 +354,4 @@ G(p, 1, h);
354
354
  export {
355
355
  h as PluginQuickDiff
356
356
  };
357
- //# sourceMappingURL=index-CInRo1qR.js.map
357
+ //# sourceMappingURL=index-BJ2aqva1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-CInRo1qR.js","sources":["../src/components/MwUserLinks.tsx","../src/plugins/quick-diff/components/DiffTable.tsx","../src/components/utils.tsx","../src/plugins/quick-diff/index.tsx"],"sourcesContent":["import { InPageEdit } from '@/InPageEdit'\r\n\r\nexport const MwUserLinks = (props: { user: string; target?: string; ctx: InPageEdit }) => {\r\n let { user, target, ctx } = props\r\n const getUrl = ctx.getUrl.bind(ctx)\r\n return (\r\n <span className=\"mw-userlinks\">\r\n <a href={getUrl(`User:${user}`)} className=\"mw-userlink\" target={target}>\r\n {user}\r\n </a>{' '}\r\n <span className=\"mw-usertoollinks\">\r\n (\r\n <a href={getUrl(`User_talk:${user}`)} className=\"mw-usertoollinks-talk\" target={target}>\r\n talk\r\n </a>\r\n {' | '}\r\n <a\r\n href={getUrl(`Special:Contributions/${user}`)}\r\n className=\"mw-usertoollinks-contribs\"\r\n target={target}\r\n >\r\n contribs\r\n </a>\r\n {' | '}\r\n <a\r\n href={getUrl(`Special:Block/${user}`)}\r\n className=\"mw-usertoollinks-block\"\r\n target={target}\r\n >\r\n block\r\n </a>\r\n )\r\n </span>\r\n </span>\r\n )\r\n}\r\n","import './style.scss'\r\nimport { JSX } from 'jsx-dom/jsx-runtime'\r\nimport { CompareApiResponse } from '../index.js'\r\nimport { InPageEdit } from '@/InPageEdit.js'\r\n\r\nexport type DiffTableProps = {\r\n data: Partial<CompareApiResponse['compare']>\r\n ctx: InPageEdit\r\n} & JSX.IntrinsicElements['table']\r\n\r\nexport enum DiffTableEvent {\r\n update = 'ipe:diff-table/update',\r\n edit = 'ipe:diff-table/edit',\r\n}\r\n\r\n// DOM 事件类型定义\r\ndeclare global {\r\n interface HTMLElementEventMap {\r\n [DiffTableEvent.update]: CustomEvent<{\r\n fromrev: number\r\n torev: number\r\n }>\r\n [DiffTableEvent.edit]: CustomEvent<{\r\n revid: number\r\n }>\r\n }\r\n}\r\n\r\nconst formatDate = new Intl.DateTimeFormat(undefined, {\r\n dateStyle: 'medium',\r\n timeStyle: 'medium',\r\n}).format\r\n\r\nconst DiffTableHeader = (props: {\r\n ctx: InPageEdit\r\n type?: 'from' | 'to'\r\n pageid?: number\r\n pagetitle?: string\r\n revid?: number\r\n size?: number\r\n timestamp?: string\r\n username?: string\r\n userid?: number\r\n comment?: string\r\n parsedcomment?: string\r\n}) => {\r\n let classList = ['diff-title']\r\n if (props.type === 'from') {\r\n classList.push('diff-otitle')\r\n } else if (props.type === 'to') {\r\n classList.push('diff-ntitle')\r\n }\r\n if (!props.pageid || !props.userid) {\r\n return (\r\n <td colSpan={2} className={classList}>\r\n <div className=\"mw-diff-title--title\">\r\n {props.type === 'from' ? 'Original content' : props.type === 'to' ? 'Your content' : ''}\r\n </div>\r\n </td>\r\n )\r\n }\r\n const handleEditClick = (e: Event) => {\r\n e.preventDefault()\r\n e.target!.dispatchEvent(\r\n new CustomEvent(DiffTableEvent.edit, {\r\n detail: { revid: props.revid! },\r\n bubbles: true,\r\n })\r\n )\r\n }\r\n return (\r\n <td colSpan={2} className={classList}>\r\n <div className=\"mw-diff-title--title\">\r\n {props.pagetitle || props.timestamp}\r\n {props.revid ? ` (rev#${props.revid})` : ''}\r\n </div>\r\n <div className=\"mw-diff-title--actions\">\r\n <a\r\n href={props.ctx.getUrl('', { action: 'edit', oldid: props.revid! })}\r\n onClick={handleEditClick}\r\n >\r\n <IconQuickEdit style=\"width: 1em; height: 1em\" />\r\n Quick edit\r\n </a>\r\n </div>\r\n <div className=\"mw-diff-title--user\">\r\n {props.username && <MwUserLinks ctx={props.ctx} user={props.username} target=\"_blank\" />}\r\n </div>\r\n <div className=\"mw-diff-title--timestamp\">\r\n {props.timestamp && formatDate(new Date(props.timestamp))}\r\n </div>\r\n <div className=\"mw-diff-title--comment\">\r\n {props.parsedcomment && (\r\n <>\r\n (<i innerHTML={props.parsedcomment}></i>)\r\n </>\r\n )}\r\n </div>\r\n </td>\r\n )\r\n}\r\n\r\nconst DiffTableNavigation = (props: { data: DiffTableProps['data']; ctx: InPageEdit }) => {\r\n const data = props.data\r\n if (!data.prev && !data.next) {\r\n return null\r\n }\r\n\r\n // 统一的事件处理器\r\n const handleNavigationClick = (e: Event, fromrev: number, torev: number) => {\r\n e.preventDefault()\r\n e.target!.dispatchEvent(\r\n new CustomEvent(DiffTableEvent.update, {\r\n detail: { fromrev, torev },\r\n bubbles: true,\r\n })\r\n )\r\n }\r\n\r\n return (\r\n <tr className=\"mw-diff-title--navigation\">\r\n <td colSpan={2}>\r\n {data.prev ? (\r\n <a\r\n href={props.ctx.getUrl('', { diff: data.prev!, oldid: data.fromrevid! })}\r\n onClick={(e) => handleNavigationClick(e, data.prev!, data.fromrevid!)}\r\n >\r\n ← Previous\r\n </a>\r\n ) : (\r\n <i>Oldest version</i>\r\n )}\r\n </td>\r\n <td colSpan={2}>\r\n {data.next ? (\r\n <a\r\n href={props.ctx.getUrl('', { diff: data.next!, oldid: data.torevid! })}\r\n onClick={(e) => handleNavigationClick(e, data.torevid!, data.next!)}\r\n >\r\n Next →\r\n </a>\r\n ) : (\r\n <i>Newest version</i>\r\n )}\r\n </td>\r\n </tr>\r\n )\r\n}\r\n\r\nexport const DiffTable = (props: DiffTableProps) => {\r\n const { data, ...rest } = props\r\n const table = (\r\n <table className={`theme-ipe diff diff-type-table`} data-mw=\"interface\" {...rest}>\r\n <colgroup>\r\n <col className=\"diff-marker\" />\r\n <col className=\"diff-content\" />\r\n <col className=\"diff-marker\" />\r\n <col className=\"diff-content\" />\r\n </colgroup>\r\n <tbody>\r\n <tr>\r\n <DiffTableHeader\r\n ctx={props.ctx}\r\n type=\"from\"\r\n pageid={data.fromid}\r\n pagetitle={data.fromtitle}\r\n revid={data.fromrevid}\r\n size={data.fromsize}\r\n timestamp={data.fromtimestamp}\r\n username={data.fromuser}\r\n userid={data.fromuserid}\r\n comment={data.fromcomment}\r\n parsedcomment={data.fromparsedcomment}\r\n />\r\n <DiffTableHeader\r\n ctx={props.ctx}\r\n type=\"to\"\r\n pageid={data.toid}\r\n pagetitle={data.totitle}\r\n revid={data.torevid}\r\n size={data.tosize}\r\n timestamp={data.totimestamp}\r\n username={data.touser}\r\n userid={data.touserid}\r\n comment={data.tocomment}\r\n parsedcomment={data.toparsedcomment}\r\n />\r\n </tr>\r\n <DiffTableNavigation data={data} ctx={props.ctx} />\r\n <div id=\"diffbody\"></div>\r\n <tr className=\"diff-size\" style={{ textAlign: 'center' }}>\r\n <td colSpan={2} className=\"diff-size-old\">\r\n {data.fromsize !== undefined && `${data.fromsize} bytes`}\r\n </td>\r\n <td colSpan={2} className=\"diff-size-new\">\r\n {data.tosize !== undefined && `${data.tosize} bytes`}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n )\r\n table.querySelector('#diffbody')!.outerHTML =\r\n data.body ||\r\n (\r\n <tr>\r\n <td colSpan={4}>\r\n <div\r\n style={{\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n height: '5rem',\r\n }}\r\n >\r\n <i>No changes</i>\r\n </div>\r\n </td>\r\n </tr>\r\n ).outerHTML\r\n return table\r\n}\r\n","import { CSSProperties, ReactElement } from 'jsx-dom'\r\n\r\nexport const qs = <T extends Element>(\r\n selector: string,\r\n parent: HTMLElement | Document = document\r\n) => {\r\n return parent.querySelector(selector) as T | null\r\n}\r\nexport const qsa = <T extends Element>(\r\n selector: string,\r\n parent: HTMLElement | Document = document\r\n) => {\r\n return parent.querySelectorAll(selector) as NodeListOf<T>\r\n}\r\n\r\nexport const setStyles = (el: HTMLElement | ReactElement, style: CSSProperties) => {\r\n Object.entries(style).forEach(([key, value]) => {\r\n if (typeof value === 'undefined' || value === null) {\r\n el.style.removeProperty(key)\r\n } else {\r\n const isImportant = typeof value === 'string' && value.endsWith('!important')\r\n // @ts-ignore\r\n el.style.setProperty(\r\n key,\r\n value.replace('!important', '').trim(),\r\n isImportant ? 'important' : undefined\r\n )\r\n }\r\n })\r\n return el\r\n}\r\n","import { Inject, InPageEdit, Schema } from '@/InPageEdit'\r\nimport { type QuickEditEventPayload } from '@/plugins/quick-edit'\r\nimport { IPEModal, IPEModalOptions } from '@inpageedit/modal'\r\nimport { DiffTable, DiffTableEvent } from './components/DiffTable'\r\nimport { MwApiResponse } from 'wiki-saikou'\r\n\r\ndeclare module '@/InPageEdit' {\r\n interface InPageEdit {\r\n quickDiff: PluginQuickDiff\r\n }\r\n}\r\n\r\nexport interface CompareApiRequestOptions {\r\n fromtitle: string\r\n fromid: number\r\n fromrev: number\r\n frompst: boolean\r\n totitle: string\r\n toid: number\r\n torev: number\r\n torelative?: 'cur' | 'prev' | 'next'\r\n topst: boolean\r\n prop: string\r\n difftype: 'table' | 'unified'\r\n // deprecated, but still works\r\n fromtext: string\r\n fromsection: string | number\r\n fromcontentmodel: string\r\n totext: string\r\n tosection: string | number\r\n tocontentmodel: string\r\n}\r\n\r\nexport interface CompareApiResponse {\r\n compare: Partial<{\r\n fromid: number\r\n fromrevid: number\r\n fromns: number\r\n fromtitle: string\r\n fromsize: number\r\n fromtimestamp: string\r\n fromuser: string\r\n fromuserid: number\r\n fromcomment: string\r\n fromparsedcomment?: string\r\n toid: number\r\n torevid: number\r\n tons: number\r\n totitle: string\r\n tosize: number\r\n totimestamp: string\r\n touser: string\r\n touserid: number\r\n tocomment: string\r\n toparsedcomment: string\r\n diffsize: number\r\n prev: number\r\n next: number\r\n }> & {\r\n body: string\r\n }\r\n}\r\n\r\n@Inject(['wiki', 'getUrl', 'preferences'])\r\n@RegisterPreferences(\r\n Schema.object({\r\n 'quickDiff.keyshortcut': Schema.string()\r\n .default('ctrl-d')\r\n .description('Key shortcut to open quick diff in quick edit modal'),\r\n })\r\n .description('Quick diff options')\r\n .extra('category', 'edit')\r\n)\r\nexport class PluginQuickDiff extends BasePlugin {\r\n constructor(public ctx: InPageEdit) {\r\n super(ctx, {}, 'quick-diff')\r\n }\r\n\r\n protected start(): Promise<void> | void {\r\n this.ctx.set('quickDiff', this)\r\n this.ctx.on('quick-edit/wiki-page', this.injectQuickEdit.bind(this))\r\n window.RLQ.push(this.injectHistoryPage.bind(this))\r\n }\r\n\r\n protected stop(): Promise<void> | void {}\r\n\r\n private injectHistoryPage() {\r\n const mwCompareForm = qs<HTMLFormElement>('#mw-history-compare')\r\n if (!mwCompareForm) {\r\n return\r\n }\r\n const compareButtons = qsa('.mw-history-compareselectedversions-button', mwCompareForm)\r\n compareButtons.forEach((el) => {\r\n el.after(\r\n <button\r\n className=\"cdx-button\"\r\n onClick={(e) => {\r\n e.preventDefault()\r\n const formData = new FormData(mwCompareForm)\r\n const fromrev = Number(formData.get('oldid')) || 0\r\n const torev = Number(formData.get('diff')) || 0\r\n const title = formData.get('title') as string\r\n if (!title || !fromrev || !torev) {\r\n return this.logger.warn('Missing title or revision IDs')\r\n }\r\n this.comparePages({\r\n fromrev,\r\n torev,\r\n })\r\n }}\r\n >\r\n Quick Diff\r\n </button>\r\n )\r\n })\r\n }\r\n\r\n private async injectQuickEdit({ modal, wikiPage, options }: QuickEditEventPayload) {\r\n if (wikiPage.pageid === 0 || options.section === 'new') {\r\n // User is creating a new page, no need to show diff button\r\n return\r\n }\r\n let latestDiffModal: IPEModal | undefined = undefined\r\n modal.addButton(\r\n {\r\n label: 'Diff',\r\n side: 'left',\r\n keyPress: (await this.ctx.preferences.get<string>('quickDiff.keyshortcut')) || undefined,\r\n className: 'btn btn-secondary',\r\n method: () => {\r\n const pageTitle = wikiPage.title\r\n const fromtext = wikiPage.revisions?.[0]?.content || ''\r\n const totext =\r\n (modal.get$content().querySelector<HTMLTextAreaElement>('textarea[name=\"text\"]')\r\n ?.value as string) || ''\r\n\r\n if (fromtext === totext) {\r\n return this.ctx.modal.notify('info', { title: 'Quick Diff', content: 'No changes' })\r\n }\r\n\r\n latestDiffModal = this.comparePages(\r\n {\r\n fromtitle: pageTitle,\r\n fromtext,\r\n totitle: pageTitle,\r\n totext,\r\n topst: true,\r\n },\r\n latestDiffModal,\r\n {\r\n backdrop: false,\r\n draggable: true,\r\n }\r\n )\r\n return latestDiffModal\r\n },\r\n },\r\n 2\r\n )\r\n modal.on(modal.Event.Close, () => {\r\n latestDiffModal?.destroy()\r\n latestDiffModal = undefined\r\n })\r\n }\r\n\r\n readonly COMPARE_API_DEFAULT_OPTIONS: Partial<CompareApiRequestOptions> = {\r\n prop: [\r\n 'comment',\r\n 'diff',\r\n 'diffsize',\r\n 'ids',\r\n 'parsedcomment',\r\n 'size',\r\n 'timestamp',\r\n 'title',\r\n 'user',\r\n 'rel',\r\n ].join('|'),\r\n difftype: 'table',\r\n }\r\n\r\n comparePages(\r\n options: Partial<CompareApiRequestOptions>,\r\n modal?: IPEModal,\r\n modalOptions?: Partial<IPEModalOptions>\r\n ) {\r\n if (!modal || modal.isDestroyed) {\r\n modal = this.ctx.modal\r\n .createObject({\r\n title: 'Loading diff...',\r\n content: '',\r\n className: 'quick-diff',\r\n center: false,\r\n ...modalOptions,\r\n })\r\n .init()\r\n } else {\r\n modal.removeButton('*')\r\n }\r\n\r\n modal.setContent(\r\n <section\r\n style={{ height: '70vh', display: 'flex', justifyContent: 'center', alignItems: 'center' }}\r\n >\r\n <ProgressBar />\r\n </section>\r\n )\r\n modal.bringToFront()\r\n\r\n if (window.mw && mw.loader.getState('mediawiki.diff.styles') !== 'ready') {\r\n mw.loader.load(['mediawiki.diff.styles'])\r\n }\r\n\r\n this.ctx.api\r\n .post<MwApiResponse<CompareApiResponse>>({\r\n ...this.COMPARE_API_DEFAULT_OPTIONS,\r\n ...options,\r\n action: 'compare',\r\n format: 'json',\r\n formatversion: 2,\r\n })\r\n .then((res) => {\r\n if (!res.data.compare) {\r\n throw new Error('No compare data received', { cause: res })\r\n }\r\n const {\r\n data: { compare },\r\n } = res\r\n modal.setTitle(\r\n compare.fromtitle && compare.totitle\r\n ? `${compare.fromtitle}${compare.fromrevid ? ` (${compare.fromrevid})` : ''} ⇔ ${compare.totitle}${compare.torevid ? ` (${compare.torevid})` : ''}`\r\n : 'Differences'\r\n )\r\n let diffTable!: HTMLElement\r\n modal.setContent(\r\n (\r\n <section\r\n style={{\r\n minHeight: '70vh',\r\n }}\r\n >\r\n <DiffTable ref={(ref) => (diffTable = ref)} data={compare} ctx={this.ctx} />\r\n </section>\r\n ) as HTMLElement\r\n )\r\n diffTable.addEventListener(\r\n DiffTableEvent.update,\r\n (e) => {\r\n e.stopPropagation()\r\n this.comparePages(\r\n {\r\n fromrev: e.detail.fromrev,\r\n torev: e.detail.torev,\r\n },\r\n modal,\r\n modalOptions\r\n )\r\n },\r\n { once: true }\r\n )\r\n\r\n // TODO: 不应该硬编码,移动到 in-article-links 插件中\r\n this.ctx.inject(['quickEdit'], (ctx) => {\r\n const handleQuickEdit = (e: CustomEvent<{ revid: number }>) => {\r\n e.stopPropagation()\r\n ctx.quickEdit({ revision: e.detail.revid })\r\n }\r\n diffTable.addEventListener(DiffTableEvent.edit, handleQuickEdit)\r\n modal.on(modal.Event.Close, () => {\r\n diffTable.removeEventListener(DiffTableEvent.edit, handleQuickEdit)\r\n })\r\n })\r\n\r\n if (compare.fromrevid && compare.torevid) {\r\n modal.addButton({\r\n label: 'Original Compare Page',\r\n side: 'right',\r\n className: 'btn btn-secondary',\r\n method: () => {\r\n window.location.href = this.ctx.getUrl('', {\r\n oldid: compare.fromrevid,\r\n diff: compare.torevid,\r\n })\r\n },\r\n })\r\n }\r\n })\r\n .catch((err) => {\r\n modal.setContent(\r\n (\r\n <MBox title=\"Failed to load diff\" type=\"error\">\r\n <pre>{err instanceof Error ? err.message : String(err)}</pre>\r\n </MBox>\r\n ) as HTMLElement\r\n )\r\n })\r\n\r\n return modal.show()\r\n }\r\n}\r\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","qs","selector","parent","qsa","_PluginQuickDiff_decorators","_init","_a","Inject","RegisterPreferences","Schema","PluginQuickDiff","BasePlugin","mwCompareForm","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
+ {"version":3,"file":"index-BJ2aqva1.js","sources":["../src/components/MwUserLinks.tsx","../src/plugins/quick-diff/components/DiffTable.tsx","../src/components/utils.tsx","../src/plugins/quick-diff/index.tsx"],"sourcesContent":["import { InPageEdit } from '@/InPageEdit'\r\n\r\nexport const MwUserLinks = (props: { user: string; target?: string; ctx: InPageEdit }) => {\r\n let { user, target, ctx } = props\r\n const getUrl = ctx.getUrl.bind(ctx)\r\n return (\r\n <span className=\"mw-userlinks\">\r\n <a href={getUrl(`User:${user}`)} className=\"mw-userlink\" target={target}>\r\n {user}\r\n </a>{' '}\r\n <span className=\"mw-usertoollinks\">\r\n (\r\n <a href={getUrl(`User_talk:${user}`)} className=\"mw-usertoollinks-talk\" target={target}>\r\n talk\r\n </a>\r\n {' | '}\r\n <a\r\n href={getUrl(`Special:Contributions/${user}`)}\r\n className=\"mw-usertoollinks-contribs\"\r\n target={target}\r\n >\r\n contribs\r\n </a>\r\n {' | '}\r\n <a\r\n href={getUrl(`Special:Block/${user}`)}\r\n className=\"mw-usertoollinks-block\"\r\n target={target}\r\n >\r\n block\r\n </a>\r\n )\r\n </span>\r\n </span>\r\n )\r\n}\r\n","import './style.scss'\r\nimport { JSX } from 'jsx-dom/jsx-runtime'\r\nimport { CompareApiResponse } from '../index.js'\r\nimport { InPageEdit } from '@/InPageEdit.js'\r\n\r\nexport type DiffTableProps = {\r\n data: Partial<CompareApiResponse['compare']>\r\n ctx: InPageEdit\r\n} & JSX.IntrinsicElements['table']\r\n\r\nexport enum DiffTableEvent {\r\n update = 'ipe:diff-table/update',\r\n edit = 'ipe:diff-table/edit',\r\n}\r\n\r\n// DOM 事件类型定义\r\ndeclare global {\r\n interface HTMLElementEventMap {\r\n [DiffTableEvent.update]: CustomEvent<{\r\n fromrev: number\r\n torev: number\r\n }>\r\n [DiffTableEvent.edit]: CustomEvent<{\r\n revid: number\r\n }>\r\n }\r\n}\r\n\r\nconst formatDate = new Intl.DateTimeFormat(undefined, {\r\n dateStyle: 'medium',\r\n timeStyle: 'medium',\r\n}).format\r\n\r\nconst DiffTableHeader = (props: {\r\n ctx: InPageEdit\r\n type?: 'from' | 'to'\r\n pageid?: number\r\n pagetitle?: string\r\n revid?: number\r\n size?: number\r\n timestamp?: string\r\n username?: string\r\n userid?: number\r\n comment?: string\r\n parsedcomment?: string\r\n}) => {\r\n let classList = ['diff-title']\r\n if (props.type === 'from') {\r\n classList.push('diff-otitle')\r\n } else if (props.type === 'to') {\r\n classList.push('diff-ntitle')\r\n }\r\n if (!props.pageid || !props.userid) {\r\n return (\r\n <td colSpan={2} className={classList}>\r\n <div className=\"mw-diff-title--title\">\r\n {props.type === 'from' ? 'Original content' : props.type === 'to' ? 'Your content' : ''}\r\n </div>\r\n </td>\r\n )\r\n }\r\n const handleEditClick = (e: Event) => {\r\n e.preventDefault()\r\n e.target!.dispatchEvent(\r\n new CustomEvent(DiffTableEvent.edit, {\r\n detail: { revid: props.revid! },\r\n bubbles: true,\r\n })\r\n )\r\n }\r\n return (\r\n <td colSpan={2} className={classList}>\r\n <div className=\"mw-diff-title--title\">\r\n {props.pagetitle || props.timestamp}\r\n {props.revid ? ` (rev#${props.revid})` : ''}\r\n </div>\r\n <div className=\"mw-diff-title--actions\">\r\n <a\r\n href={props.ctx.getUrl('', { action: 'edit', oldid: props.revid! })}\r\n onClick={handleEditClick}\r\n >\r\n <IconQuickEdit style=\"width: 1em; height: 1em\" />\r\n Quick edit\r\n </a>\r\n </div>\r\n <div className=\"mw-diff-title--user\">\r\n {props.username && <MwUserLinks ctx={props.ctx} user={props.username} target=\"_blank\" />}\r\n </div>\r\n <div className=\"mw-diff-title--timestamp\">\r\n {props.timestamp && formatDate(new Date(props.timestamp))}\r\n </div>\r\n <div className=\"mw-diff-title--comment\">\r\n {props.parsedcomment && (\r\n <>\r\n (<i innerHTML={props.parsedcomment}></i>)\r\n </>\r\n )}\r\n </div>\r\n </td>\r\n )\r\n}\r\n\r\nconst DiffTableNavigation = (props: { data: DiffTableProps['data']; ctx: InPageEdit }) => {\r\n const data = props.data\r\n if (!data.prev && !data.next) {\r\n return null\r\n }\r\n\r\n // 统一的事件处理器\r\n const handleNavigationClick = (e: Event, fromrev: number, torev: number) => {\r\n e.preventDefault()\r\n e.target!.dispatchEvent(\r\n new CustomEvent(DiffTableEvent.update, {\r\n detail: { fromrev, torev },\r\n bubbles: true,\r\n })\r\n )\r\n }\r\n\r\n return (\r\n <tr className=\"mw-diff-title--navigation\">\r\n <td colSpan={2}>\r\n {data.prev ? (\r\n <a\r\n href={props.ctx.getUrl('', { diff: data.prev!, oldid: data.fromrevid! })}\r\n onClick={(e) => handleNavigationClick(e, data.prev!, data.fromrevid!)}\r\n >\r\n ← Previous\r\n </a>\r\n ) : (\r\n <i>Oldest version</i>\r\n )}\r\n </td>\r\n <td colSpan={2}>\r\n {data.next ? (\r\n <a\r\n href={props.ctx.getUrl('', { diff: data.next!, oldid: data.torevid! })}\r\n onClick={(e) => handleNavigationClick(e, data.torevid!, data.next!)}\r\n >\r\n Next →\r\n </a>\r\n ) : (\r\n <i>Newest version</i>\r\n )}\r\n </td>\r\n </tr>\r\n )\r\n}\r\n\r\nexport const DiffTable = (props: DiffTableProps) => {\r\n const { data, ...rest } = props\r\n const table = (\r\n <table className={`theme-ipe diff diff-type-table`} data-mw=\"interface\" {...rest}>\r\n <colgroup>\r\n <col className=\"diff-marker\" />\r\n <col className=\"diff-content\" />\r\n <col className=\"diff-marker\" />\r\n <col className=\"diff-content\" />\r\n </colgroup>\r\n <tbody>\r\n <tr>\r\n <DiffTableHeader\r\n ctx={props.ctx}\r\n type=\"from\"\r\n pageid={data.fromid}\r\n pagetitle={data.fromtitle}\r\n revid={data.fromrevid}\r\n size={data.fromsize}\r\n timestamp={data.fromtimestamp}\r\n username={data.fromuser}\r\n userid={data.fromuserid}\r\n comment={data.fromcomment}\r\n parsedcomment={data.fromparsedcomment}\r\n />\r\n <DiffTableHeader\r\n ctx={props.ctx}\r\n type=\"to\"\r\n pageid={data.toid}\r\n pagetitle={data.totitle}\r\n revid={data.torevid}\r\n size={data.tosize}\r\n timestamp={data.totimestamp}\r\n username={data.touser}\r\n userid={data.touserid}\r\n comment={data.tocomment}\r\n parsedcomment={data.toparsedcomment}\r\n />\r\n </tr>\r\n <DiffTableNavigation data={data} ctx={props.ctx} />\r\n <div id=\"diffbody\"></div>\r\n <tr className=\"diff-size\" style={{ textAlign: 'center' }}>\r\n <td colSpan={2} className=\"diff-size-old\">\r\n {data.fromsize !== undefined && `${data.fromsize} bytes`}\r\n </td>\r\n <td colSpan={2} className=\"diff-size-new\">\r\n {data.tosize !== undefined && `${data.tosize} bytes`}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n )\r\n table.querySelector('#diffbody')!.outerHTML =\r\n data.body ||\r\n (\r\n <tr>\r\n <td colSpan={4}>\r\n <div\r\n style={{\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n height: '5rem',\r\n }}\r\n >\r\n <i>No changes</i>\r\n </div>\r\n </td>\r\n </tr>\r\n ).outerHTML\r\n return table\r\n}\r\n","import { CSSProperties, ReactElement } from 'jsx-dom'\r\n\r\nexport const qs = <T extends Element>(\r\n selector: string,\r\n parent: HTMLElement | Document = document\r\n) => {\r\n return parent.querySelector(selector) as T | null\r\n}\r\nexport const qsa = <T extends Element>(\r\n selector: string,\r\n parent: HTMLElement | Document = document\r\n) => {\r\n return parent.querySelectorAll(selector) as NodeListOf<T>\r\n}\r\n\r\nexport const setStyles = (el: HTMLElement | ReactElement, style: CSSProperties) => {\r\n Object.entries(style).forEach(([key, value]) => {\r\n if (typeof value === 'undefined' || value === null) {\r\n el.style.removeProperty(key)\r\n } else {\r\n const isImportant = typeof value === 'string' && value.endsWith('!important')\r\n // @ts-ignore\r\n el.style.setProperty(\r\n key,\r\n value.replace('!important', '').trim(),\r\n isImportant ? 'important' : undefined\r\n )\r\n }\r\n })\r\n return el\r\n}\r\n","import { Inject, InPageEdit, Schema } from '@/InPageEdit'\r\nimport { type QuickEditEventPayload } from '@/plugins/quick-edit'\r\nimport { IPEModal, IPEModalOptions } from '@inpageedit/modal'\r\nimport { DiffTable, DiffTableEvent } from './components/DiffTable'\r\nimport { MwApiResponse } from 'wiki-saikou'\r\n\r\ndeclare module '@/InPageEdit' {\r\n interface InPageEdit {\r\n quickDiff: PluginQuickDiff\r\n }\r\n}\r\n\r\nexport interface CompareApiRequestOptions {\r\n fromtitle: string\r\n fromid: number\r\n fromrev: number\r\n frompst: boolean\r\n totitle: string\r\n toid: number\r\n torev: number\r\n torelative?: 'cur' | 'prev' | 'next'\r\n topst: boolean\r\n prop: string\r\n difftype: 'table' | 'unified'\r\n // deprecated, but still works\r\n fromtext: string\r\n fromsection: string | number\r\n fromcontentmodel: string\r\n totext: string\r\n tosection: string | number\r\n tocontentmodel: string\r\n}\r\n\r\nexport interface CompareApiResponse {\r\n compare: Partial<{\r\n fromid: number\r\n fromrevid: number\r\n fromns: number\r\n fromtitle: string\r\n fromsize: number\r\n fromtimestamp: string\r\n fromuser: string\r\n fromuserid: number\r\n fromcomment: string\r\n fromparsedcomment?: string\r\n toid: number\r\n torevid: number\r\n tons: number\r\n totitle: string\r\n tosize: number\r\n totimestamp: string\r\n touser: string\r\n touserid: number\r\n tocomment: string\r\n toparsedcomment: string\r\n diffsize: number\r\n prev: number\r\n next: number\r\n }> & {\r\n body: string\r\n }\r\n}\r\n\r\n@Inject(['wiki', 'getUrl', 'preferences'])\r\n@RegisterPreferences(\r\n Schema.object({\r\n 'quickDiff.keyshortcut': Schema.string()\r\n .default('ctrl-d')\r\n .description('Key shortcut to open quick diff in quick edit modal'),\r\n })\r\n .description('Quick diff options')\r\n .extra('category', 'edit')\r\n)\r\nexport class PluginQuickDiff extends BasePlugin {\r\n constructor(public ctx: InPageEdit) {\r\n super(ctx, {}, 'quick-diff')\r\n }\r\n\r\n protected start(): Promise<void> | void {\r\n this.ctx.set('quickDiff', this)\r\n this.ctx.on('quick-edit/wiki-page', this.injectQuickEdit.bind(this))\r\n window.RLQ.push(this.injectHistoryPage.bind(this))\r\n }\r\n\r\n protected stop(): Promise<void> | void {}\r\n\r\n private injectHistoryPage() {\r\n const mwCompareForm = qs<HTMLFormElement>('#mw-history-compare')\r\n if (!mwCompareForm) {\r\n return\r\n }\r\n const compareButtons = qsa('.mw-history-compareselectedversions-button', mwCompareForm)\r\n compareButtons.forEach((el) => {\r\n el.after(\r\n <button\r\n className=\"cdx-button\"\r\n onClick={(e) => {\r\n e.preventDefault()\r\n const formData = new FormData(mwCompareForm)\r\n const fromrev = Number(formData.get('oldid')) || 0\r\n const torev = Number(formData.get('diff')) || 0\r\n const title = formData.get('title') as string\r\n if (!title || !fromrev || !torev) {\r\n return this.logger.warn('Missing title or revision IDs')\r\n }\r\n this.comparePages({\r\n fromrev,\r\n torev,\r\n })\r\n }}\r\n >\r\n Quick Diff\r\n </button>\r\n )\r\n })\r\n }\r\n\r\n private async injectQuickEdit({ modal, wikiPage, options }: QuickEditEventPayload) {\r\n if (wikiPage.pageid === 0 || options.section === 'new') {\r\n // User is creating a new page, no need to show diff button\r\n return\r\n }\r\n let latestDiffModal: IPEModal | undefined = undefined\r\n modal.addButton(\r\n {\r\n label: 'Diff',\r\n side: 'left',\r\n keyPress: (await this.ctx.preferences.get<string>('quickDiff.keyshortcut')) || undefined,\r\n className: 'btn btn-secondary',\r\n method: () => {\r\n const pageTitle = wikiPage.title\r\n const fromtext = wikiPage.revisions?.[0]?.content || ''\r\n const totext =\r\n (modal.get$content().querySelector<HTMLTextAreaElement>('textarea[name=\"text\"]')\r\n ?.value as string) || ''\r\n\r\n if (fromtext === totext) {\r\n return this.ctx.modal.notify('info', { title: 'Quick Diff', content: 'No changes' })\r\n }\r\n\r\n latestDiffModal = this.comparePages(\r\n {\r\n fromtitle: pageTitle,\r\n fromtext,\r\n totitle: pageTitle,\r\n totext,\r\n topst: true,\r\n },\r\n latestDiffModal,\r\n {\r\n backdrop: false,\r\n draggable: true,\r\n }\r\n )\r\n return latestDiffModal\r\n },\r\n },\r\n 2\r\n )\r\n modal.on(modal.Event.Close, () => {\r\n latestDiffModal?.destroy()\r\n latestDiffModal = undefined\r\n })\r\n }\r\n\r\n readonly COMPARE_API_DEFAULT_OPTIONS: Partial<CompareApiRequestOptions> = {\r\n prop: [\r\n 'comment',\r\n 'diff',\r\n 'diffsize',\r\n 'ids',\r\n 'parsedcomment',\r\n 'size',\r\n 'timestamp',\r\n 'title',\r\n 'user',\r\n 'rel',\r\n ].join('|'),\r\n difftype: 'table',\r\n }\r\n\r\n comparePages(\r\n options: Partial<CompareApiRequestOptions>,\r\n modal?: IPEModal,\r\n modalOptions?: Partial<IPEModalOptions>\r\n ) {\r\n if (!modal || modal.isDestroyed) {\r\n modal = this.ctx.modal\r\n .createObject({\r\n title: 'Loading diff...',\r\n content: '',\r\n className: 'quick-diff',\r\n center: false,\r\n ...modalOptions,\r\n })\r\n .init()\r\n } else {\r\n modal.removeButton('*')\r\n }\r\n\r\n modal.setContent(\r\n <section\r\n style={{ height: '70vh', display: 'flex', justifyContent: 'center', alignItems: 'center' }}\r\n >\r\n <ProgressBar />\r\n </section>\r\n )\r\n modal.bringToFront()\r\n\r\n if (window.mw && mw.loader.getState('mediawiki.diff.styles') !== 'ready') {\r\n mw.loader.load(['mediawiki.diff.styles'])\r\n }\r\n\r\n this.ctx.api\r\n .post<MwApiResponse<CompareApiResponse>>({\r\n ...this.COMPARE_API_DEFAULT_OPTIONS,\r\n ...options,\r\n action: 'compare',\r\n format: 'json',\r\n formatversion: 2,\r\n })\r\n .then((res) => {\r\n if (!res.data.compare) {\r\n throw new Error('No compare data received', { cause: res })\r\n }\r\n const {\r\n data: { compare },\r\n } = res\r\n modal.setTitle(\r\n compare.fromtitle && compare.totitle\r\n ? `${compare.fromtitle}${compare.fromrevid ? ` (${compare.fromrevid})` : ''} ⇔ ${compare.totitle}${compare.torevid ? ` (${compare.torevid})` : ''}`\r\n : 'Differences'\r\n )\r\n let diffTable!: HTMLElement\r\n modal.setContent(\r\n (\r\n <section\r\n style={{\r\n minHeight: '70vh',\r\n }}\r\n >\r\n <DiffTable ref={(ref) => (diffTable = ref)} data={compare} ctx={this.ctx} />\r\n </section>\r\n ) as HTMLElement\r\n )\r\n diffTable.addEventListener(\r\n DiffTableEvent.update,\r\n (e) => {\r\n e.stopPropagation()\r\n this.comparePages(\r\n {\r\n fromrev: e.detail.fromrev,\r\n torev: e.detail.torev,\r\n },\r\n modal,\r\n modalOptions\r\n )\r\n },\r\n { once: true }\r\n )\r\n\r\n // TODO: 不应该硬编码,移动到 in-article-links 插件中\r\n this.ctx.inject(['quickEdit'], (ctx) => {\r\n const handleQuickEdit = (e: CustomEvent<{ revid: number }>) => {\r\n e.stopPropagation()\r\n ctx.quickEdit({ revision: e.detail.revid })\r\n }\r\n diffTable.addEventListener(DiffTableEvent.edit, handleQuickEdit)\r\n modal.on(modal.Event.Close, () => {\r\n diffTable.removeEventListener(DiffTableEvent.edit, handleQuickEdit)\r\n })\r\n })\r\n\r\n if (compare.fromrevid && compare.torevid) {\r\n modal.addButton({\r\n label: 'Original Compare Page',\r\n side: 'right',\r\n className: 'btn btn-secondary',\r\n method: () => {\r\n window.location.href = this.ctx.getUrl('', {\r\n oldid: compare.fromrevid,\r\n diff: compare.torevid,\r\n })\r\n },\r\n })\r\n }\r\n })\r\n .catch((err) => {\r\n modal.setContent(\r\n (\r\n <MBox title=\"Failed to load diff\" type=\"error\">\r\n <pre>{err instanceof Error ? err.message : String(err)}</pre>\r\n </MBox>\r\n ) as HTMLElement\r\n )\r\n })\r\n\r\n return modal.show()\r\n }\r\n}\r\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","qs","selector","parent","qsa","_PluginQuickDiff_decorators","_init","_a","Inject","RegisterPreferences","Schema","PluginQuickDiff","BasePlugin","mwCompareForm","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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"}