User:Nardog/Unpipe.js

['edit', 'submit'].includes(mw.config.get('wgAction')) && $.when(	$.ajax( '//tools-static.wmflabs.org/meta/scripts/pathoschild.templatescript.js', { dataType: 'script', cache: true } ),	mw.loader.using(['mediawiki.api', 'mediawiki.Title']) ).then(function unpipe {	let replace = data => {		Object.entries(data.tokens).forEach(([source, ts]) => { if (!ts.some(t => data.redirs[t.pn])) return; let links = ts.map(t => {				let r = data.redirs[t.pn] || {};				return [r.to || t.pn, t.fragment || r.tofragment].join('#');			}); if (links[0] !== links[1]) return; data.repl = data.repl.split(source).join(source.replace(/^[^|]+\|/, 'script')			.options({ minor: true })			.clickDiff;	};	let query = (titles, data) => {		if (!titles.length) {			replace(data);			return;		}		new mw.Api.post({			action: 'query',			titles: titles.slice(0, 50),			redirects: 1,			formatversion: 2		}, {			headers: { 'Promise-Non-Write-API-Action': 1 }		}).then(response => {			(response.query.redirects || []).forEach(r => {				data.redirs[r.from] = r;			});			query(titles.slice(50), data);		});	};	window.pathoschild.TemplateScript.add([{		name: 'Unpipe links',		script: editor => {			let orig = editor.get, repl = orig, tokens = {};			let titles = new Set;			let match, re = /\[\[([^|\]]+)\|([^\]]+)\]\]/g; while ((match = re.exec(orig))) { if (tokens[match[0]]) continue; let ts = match.slice(1).map(s => mw.Title.newFromText(s)); if (ts.some(t => !t || t.namespace)) continue; let pns = ts.map(t => t.toText); if (pns[0].endsWith(' (disambiguation)')) continue; if (pns[0] === pns[1] && ts[0].fragment === ts[1].fragment) { repl = repl.split(match[0]).join(`${match[2]}`); continue; }				tokens[match[0]] = pns.map((pn, i) => {					titles.add(pn);					return { pn, fragment: ts[i].fragment };				}); }			query([...titles], { editor, orig, repl, tokens, redirs: {} }); }	}]); });