-
Notifications
You must be signed in to change notification settings - Fork 1
/
sync-redirect.ts
65 lines (52 loc) · 4.09 KB
/
sync-redirect.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import { ApiQueryInfoParams, ApiQueryRevisionsParams } from 'types-mediawiki/api_params';
import { MediaWikiDataError, PageRevisionsResult } from '../global-types';
mw.loader.using(['mediawiki.util'], async () => {
if (!mw.Title.isTalkNamespace(mw.config.get('wgNamespaceNumber'))) return;
const mainPageInfoRevisions = (await new mw.Api().get({
action: 'query',
formatversion: '2',
prop: ['info', 'revisions'],
rvprop: 'content',
rvslots: 'main',
titles: `${mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceNumber') - 1]}:${mw.config.get('wgTitle')}`,
} satisfies ApiQueryInfoParams & ApiQueryRevisionsParams)) as PageRevisionsResult & { query: { pages: { redirect?: boolean }[] } };
if (!mainPageInfoRevisions.query.pages[0].redirect) return;
const link = mw.util.addPortletLink(mw.config.get('skin') === 'minerva' ? 'p-tb' : 'p-cactions', '#', 'Sync with main page redirect', 'sync-redirect')!;
link.addEventListener('click', async (event) => {
event.preventDefault();
mw.notify('Editing...', { tag: 'sync-redirect-notification' });
const mainPageContent: string = mainPageInfoRevisions.query.pages[0].revisions[0].slots.main.content;
const redirectTarget = /#redirect:? *\[\[(.+)]]/i.exec(mainPageContent)?.[1].replaceAll('_', ' ').split('|')[0].split('#')[0].trim();
if (!redirectTarget) return mw.notify('Failed to parse redirect target!', { type: 'error', tag: 'sync-redirect-notification' });
const redirectTargetParsed = new DOMParser().parseFromString(redirectTarget, 'text/html').documentElement.textContent;
if (!redirectTargetParsed) return mw.notify('Failed to parse redirect target!', { type: 'error', tag: 'sync-redirect-notification' });
const mwRedirectTarget = mw.Title.newFromText(redirectTargetParsed);
if (!mwRedirectTarget) return mw.notify('Failed to parse redirect target!', { type: 'error', tag: 'sync-redirect-notification' });
const mainTargetText = mwRedirectTarget.getMainText();
const pageMove = /{{ *r(edirect)?( from)?(( a)? page)? (move|rename|pm) *}}/i.test(mainPageContent);
const destinationTalkNamespaceName = mw.config.get('wgFormattedNamespaces')[mwRedirectTarget.getNamespaceId() + 1];
await new mw.Api()
.edit(mw.config.get('wgPageName'), () => ({
text: `#REDIRECT [[${destinationTalkNamespaceName}:${mainTargetText}]]${pageMove ? '\n\n{{Redirect category shell|\n{{R from move}}\n}}' : ''}`,
summary: `Sync redirect with main page, to [[${destinationTalkNamespaceName}:${mainTargetText}]] (via [[User:Eejit43/scripts/sync-redirect|script]])`,
minor: true,
}))
.catch(async (errorCode: string, errorInfo: MediaWikiDataError) => {
if (errorCode === 'nocreate-missing')
await new mw.Api()
.create(
mw.config.get('wgPageName'),
{ summary: `Create redirect matching main page, to [[${destinationTalkNamespaceName}:${mainTargetText}]] (via [[User:Eejit43/scripts/sync-redirect|script]])` },
`#REDIRECT [[${destinationTalkNamespaceName}:${mainTargetText}]]${pageMove ? '\n\n{{Redirect category shell|\n{{R from move}}\n}}' : ''}`,
)
.catch((errorCode: string, errorInfo: MediaWikiDataError) => {
mw.notify(`Failed to redirect page: ${errorInfo?.error.info ?? 'Unknown error'} (${errorCode})`, { type: 'error', tag: 'sync-redirect-notification' });
});
else mw.notify(`Failed to redirect page: ${errorInfo?.error.info ?? 'Unknown error'} (${errorCode})`, { type: 'error', tag: 'sync-redirect-notification' });
});
mw.notify('Successfully redirected page, reloading...', { type: 'success', tag: 'sync-redirect-notification' });
const newUrl = new URL(window.location.href);
newUrl.searchParams.set('redirect', 'no');
window.location.href = newUrl.href;
});
});