Jump to content

User:Aaron Liu/NoPiper.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
function noPipe(str){
	if(typeof noPipeAll !== "undefined"){
		if(noPipeAll===false){
			console.log("why you noPipeAll = false to me");
			if(mw.config.get('wgNamespaceNumber') !== 0) return str;
		}
	}else if(mw.config.get('wgNamespaceNumber') !== 0) // set noPipeAll = true to use this script outside mainspace
		return str;
	
	const api = new mw.Api({
		ajax: { headers: { 'Api-User-Agent': 'NoPiper/1.0' } },
		parameters: { redirects: true, action: 'query',
					format:'json', formatversion: 2}
	});
	// Possible optimization: remove duplicates and do replaceall?
	for(const match of str.matchAll(/\[\[(?!Category:):?([^\]#]+)(#[^\]#]+)?\|([^\[\]\n\uE000]+)\]\]/g)){
		console.log(match)
		api.get({
			titles: match[3], redirects: true,
			action: 'query', format: 'json', formatversion: 2
		}).then(pipe => {
			console.log(JSON.stringify(pipe))
			pipe=pipe.query.redirects;
			if(typeof pipe!=="undefined"){
				pipe=pipe[0];
				api.get({
					titles: match[1], redirects: true,
					action: 'query', format: 'json', formatversion: 2
				}).then(link=> {
					console.log(JSON.stringify(link))
					link=link.query;
					if(typeof link.redirects!=="undefined"){
						if(typeof match[2]!=="undefined"){
							link.redirects[0].tofragment=match[2].replace("_", " ");
						}
						if(JSON.stringify(link.redirects[0])===JSON.stringify(pipe)){
							str.replace(match[0], "[["+match[3]+"]]"); //technically one could cause a bug by putting a # in here but who'd be crazy enough to do that?
						}
					}else if(link.pages[0].title===pipe.to){
						if(typeof match[2]!=="undefined") //if has target section we need to go to, evaluate if target section and our redirect section are equal
							if(typeof pipe.tofragment!=="undefined") // null safety... why can't we just compare undefineds
								if(pipe.tofragment===match[2]){
									str.replace(match[0], "[["+match[3]+"]]");
								}
						else // if any of the above are false, don't replace; otherwise, we'd continue after already replacing
							str.replace(match[0], "[["+match[3]+"]]");
					}
				});
			}
		}); // there has got to be a better way to extract data from promises
	}
	api.get({titles: "Main Page"}).done(() => {return str;});
}