User:MPGuy2824/scripts/constituencyCleaner.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.
// <nowiki>
// Structure borrowed Novem Linguae's DraftCleaner script
// jshint esversion: 8, esnext:false
$(async function() {

/* 
- Adds "Run ConstCleaner" link to the left sidebar
- Uses:
    - Use the {{Full party name with color}} template
*/

async function getWikicode(title) {
	let pageIsDeleted = ! mw.config.get('wgCurRevisionId');
	if ( pageIsDeleted ) {
		return '';
	}

	var wikicode = '';
	title = encodeURIComponent(title);
	await $.ajax({
		url: mw.config.get( 'wgServer') + mw.config.get( 'wgScriptPath') +
			'/api.php?action=parse&page=' + title +
			'&prop=wikitext&formatversion=2&format=json',
		success: function (result) {
			wikicode = result.parse.wikitext;
		},
		dataType: "json",
	});
	return wikicode;
}

function goToShowChangesScreen(titleWithNamespaceAndUnderscores, wikicode, editSummary) {
	let titleEncoded = encodeURIComponent(titleWithNamespaceAndUnderscores);
	let wgServer = mw.config.get('wgServer');
	let wgScriptPath = mw.config.get('wgScriptPath');
	let baseURL = wgServer + wgScriptPath + '/';
	// https://stackoverflow.com/a/12464290/3480193
	$(`<form action="${baseURL}index.php?title=${titleEncoded}&action=submit" method="POST"/>`)
		.append($('<input type="hidden" name="wpTextbox1">').val(wikicode))
		.append($('<input type="hidden" name="wpSummary">').val(editSummary))
		.append($('<input type="hidden" name="mode">').val('preview'))
		.append($('<input type="hidden" name="wpDiff">').val('Show changes'))
		.append($('<input type="hidden" name="wpUltimateParam">').val('1'))
		.appendTo($(document.body)) //it has to be added somewhere into the <body>
		.trigger('submit');
}

/** returns the pagename, including the namespace name, but with spaces replaced by underscores */
function getArticleName() {
	return mw.config.get('wgPageName');
}

// don't run when not viewing articles
let action = mw.config.get('wgAction');
let isNotViewing = action != 'view';
if ( isNotViewing ) {
	return;
}

// don't run when viewing diffs
let isDiff = mw.config.get('wgDiffNewId');
if ( isDiff ) {
	return;
}

// Don't run in virtual namespaces
let isVirtualNamespace = mw.config.get('wgNamespaceNumber') < 0;
if ( isVirtualNamespace ) {
	return;
}

let titleWithNamespaceAndUnderscores = getArticleName();
let namespaceNumber = mw.config.get('wgNamespaceNumber');

let running = false;

// Add DraftCleaner to the toolbar
mw.loader.using(['mediawiki.util'], function () {
	mw.util.addPortletLink('p-navigation', '#', 'Run ConstCleaner', 'ConstCleanerLink');
	$('#ConstCleanerLink').on('click', async function() {
		// prevent running the script while script is already in progress
		if ( running ) {
			return;
		}
		running = true;

		mw.notify('Parsing page content...');
	
		// get page wikicode
		let titleWithNamespaceAndSpaces = titleWithNamespaceAndUnderscores.replace(/_/g, ' ');
		let originalWikicode = await getWikicode(titleWithNamespaceAndUnderscores);
		let wikicode = originalWikicode;

		let dc = new ConstCleaner();
		wikicode = dc.cleanConst(wikicode, namespaceNumber, titleWithNamespaceAndSpaces);

		let needsChanges = wikicode != originalWikicode;
		if ( needsChanges ) {
			let summary = 'clean up (via [[User:MPGuy2824/scripts/constituencyCleaner.js|constituencyCleaner]] script)';
			await goToShowChangesScreen(titleWithNamespaceAndUnderscores, wikicode, summary);
		} else {
			mw.notify('No changes needed!');
		}
	});
});

class ConstCleaner {
	cleanConst(wikicode, namespaceNumber, titleWithNamespaceAndSpaces) {
		// run before other stuff
		wikicode = this.fixListSection(wikicode);
		wikicode = this.addFullPartyNameWithColor(wikicode);
		wikicode = this.cleanInfobox(wikicode);
		wikicode = this.swapBracketRefPeriodWithRefBracket(wikicode);
		wikicode = this.cleanInfobox(wikicode);
		return wikicode;
	}
	
	// 
	addFullPartyNameWithColor(wikicode) {
		// <ref>[https://test.com''Test'']</ref>
		wikicode = wikicode.replace(/ bgcolor=\"/gm, ' style=\"background-color:');
		wikicode = wikicode.replace(/background\:/gm, 'background-color:');

		wikicode = wikicode.replace(/\|\s*(width=\"[0-9]+px\"\s)?\s*style=\"?background-color:\s*\{\{party color\|([A-Za-z\-\|\'\ \(\)]+)\}\}\;?\"?\s*\|\s*\n\|\|?\s*\[\[([A-Za-z\'\-\ \(\)]+)(\|[A-Za-z\-\'\ \(\)]+)?\]\]\s*/gm, '|{{Full party name with color|$2}}\n');
		wikicode = wikicode.replace(/\|\s*(width=\"[0-9]+px\"\s)?\s*rowspan\s*=\s*\"?([0-9]+)\"?\s*(width=\"[0-9]+px\"\s)?\s+style=\"?background-color:\s*\{\{party color\|([A-Za-z\-\|\'\ \(\)]+)\}\}\;?\"?\s*\|\|?\s*\n\|\|?\s*rowspan=\"?([0-9]+)\"?\s*\|\s*\[\[([A-Za-z\-\'\ \(\)]+)(\|[A-Za-z\-\ \(\)]+)?\]\]\s*/gm, '| {{Full party name with color|$4|rowspan=$2}}\n');
		wikicode = wikicode.replace(/\|\s*\[\[([A-Za-z\-\'\ \(\)]+)(\|[A-Za-z\-\ \(\)]+)?\]\]\s*\|\s*(width=\"[0-9]+px\"\s)?\s*style=\"?background-color:\s*\{\{party color\|([A-Za-z\-\|\'\ \(\)]+)\}\}\;?\"?\s*\|\s*/gm, '| {{Full party name with color|$1}}\n');
		wikicode = wikicode.replace(/\|(\s*rowspan=\"?([0-9]+)\|)?\s*\[\[([A-Za-z\-\'\ \(\)]+)(\|[A-Za-z\-\ \(\)]+)?\]\]\s*\|(\s*rowspan=\"?([0-9]+))?\s*\{\{party color cell\|([A-Za-z\-\|\'\ \(\)]+)\}\}\s*/gm, '| {{Full party name with color|$3|rowspan=$2}}\n');
		wikicode = wikicode.replace(/\|rowspan=1}}/gm, '}}');
		wikicode = wikicode.replace(/{{Party name with color\|/gm, '{{Full party name with color|');
		wikicode = wikicode.replace(/{{Full party name with color\|Independent(\|\})/gm, '{{Full party name with color|Independent (politician)$1');
		return wikicode;
	}

	// 
	fixListSection(wikicode) {
		wikicode = wikicode.replace(/==\s*Members? of( the)? (Legislative Assembly|Vidhana? Sabha)\s*==\s*/gm, '== Members of the Legislative Assembly ==\n');
		wikicode = wikicode.replace(/==\s*Members? of( the)? ((P|p)arliament|Lok Sabha)\s*==\s*/gm, '== Members of Parliament ==\n');
		wikicode = wikicode.replace(/\"sortable\"/gm, '\"wikitable sortable\"');
		wikicode = wikicode.replace(/\"wikitable\"/gm, '\"wikitable sortable\"');
		wikicode = wikicode.replace(/\"wikitable sortable\"\s*width=\"[0-9]+px\"/gm, '\"wikitable sortable\"');
		return wikicode;
	}
	
	//
	swapBracketRefPeriodWithRefBracket(wikicode) {
//		wikicode = wikicode.replace(/\}\}((?:<ref[^>]*?>[^>]*?<\/ref>){1,})/gm, '$1}}');
//		wikicode = wikicode.replace(/((?:<ref[^>]*?>[^>]*?<\/ref>){1,})\.\n/gm, ".$1\n");
		return wikicode;
	}

	cleanInfobox(wikicode) {
//		wikicode = wikicode.replace(/\{\{Infobox Indian state legislative assembly constituency/gm, '{{Infobox constituency');
		wikicode = wikicode.replace(/(\s*|\s*established\s*=\s*[0-9]+)\s*([\-–])\s*present/gm, '$1');
		wikicode = wikicode.replace(/([\ \t]*\|\s*(parl_name|most_successful_party|image_size)\s*=\s*([\w\s\[\]]+)?)\s*/gm, '');
		wikicode = wikicode.replace(/([\ \t]*\|\s*Reservation\s*=\s*)/gm, '| reservation = ');
		wikicode = wikicode.replace(/([\ \t]*\|\s*image\s*=\s*)/gm, '| map_image = ');
		wikicode = wikicode.replace(/([\ \t]*\|\s*constituency\s*=\s*)/gm, '| loksabha_cons = ');
		return wikicode;
	}

	_replaceAll(haystack, needle, replacement) {
		let regex = new RegExp(this._escapeRegEx(needle), 'g');
		haystack = haystack.replace(regex, replacement);
		return haystack;
	}
}
});
// </nowiki>