User:Guywan/Scripts/ListAlpha.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()
{
	if(mw.config.get("wgAction") != "view")
	{
		return;
	}
	
	var version = "02.06.19";
	
	var text;
	
	// Store line and section numbers.
	var lineList = [[]];
	
	$("#p-cactions ul").append("<li id='ca-listalpha'><a href='#' title='Alphabetize list entries'>List Alphabetizer</a></li>");
	$("#ca-listalpha").on("click", function()
	{
		mw.notify("Starting alphabetization.", "info");
		
		text = getWikitext(mw.config.get("wgPageName"), "?action=raw");
		
		// Split the page into lines of text.
		text = text.split("\n");
		
		// Run a regex over each line.
		var listFound = false, curSection = 0;
		for(var i = 0; i < text.length; i++)
		{
			if(text[i].match(/^==+.+==+$/g))
			{
				// We've reached a new section.
				curSection++;
				
				lineList.push([i]);
			}
			else if(text[i].match(/^\*.*/g))
			{
				lineList[curSection].push(i);
				
				if(!listFound)
				{
					listFound = true;
				}
			}
		}
		
		// If no list was found, abort.
		if(!listFound)
		{
			mw.notify("No lists to alphabetize!", "warn");
			return;
		}
		
		mw.notify("Completed. Showing preview.");
		
		var pext = "";
		for(var y = 0; y < lineList.length; y++)
		{
			if(lineList[y].length > 1)
			{
				pext += text[lineList[0][0]] + " <a id='" + y + ":" + x +"'>Remove all items in section</a>\n\n";
				
				for(var x = 1; x < lineList[y].length; x++)
				{
					pext += text[lineList[y][x]] + "<a id='" + y + ":" + x +"'>Remove item</a>\n";
				}
			}
		}
		
		// Setup the preview.
		api = new mw.Api();
		
		/*
		 * Very WET. Suggestions are welcome.
		 */
		api.parse(pext)
		.fail(function(result) { mw.notify("Failed to parse preview: " + result, "error"); } )
		.done(function(data)
		{
			// ==================
			// PRE-PREVIEW (^_^.)
			// ==================
			
			$("#mw-content-text").html(data).prepend("<div style='border-bottom:1px solid #a2a9b1;text-align:center'>"
			+ "<h3>The following is an overview of the items that will be alphabetized</h3><br/>"
			+ "<h3>Remove items that you do not wish to be alphabetized</h3><br/>"
			+ "<button id='listalpha-submit' class='mw-ui-button mw-ui-progressive'>Proceed</button>"
			+ "<button id='listalpha-cancel' class='mw-ui-button mw-ui-quiet mw-ui-destructive'>Cancel</button></div>");
			
			$("#listalpha-submit").on("click", function()
			{
				// Put it back together!
				text = text.join("\n");
				
				api.parse(text)
				.fail(function(result) { mw.notify("Failed to parse preview: " + result, "error"); } )
				.done(function(data)
				{
					// ===============
					// PREVIEW \(^o^)/
					// ===============
					
					$("#mw-content-text").html(data).prepend("<div style='border-bottom:1px solid #a2a9b1;text-align:center'>"
					+ "<h3>This is a <strong>preview</strong> of the changes you will make.</h3><br/>"
					+ "<button id='listalpha-submit' class='mw-ui-button mw-ui-progressive'>Submit</button>"
					+ "<button id='listalpha-cancel' class='mw-ui-button mw-ui-quiet mw-ui-destructive'>Cancel</button></div>");
					
					$("#listalpha-submit").on("click", function()
					{
						// Post edited text.
						api.post(
						{
							"action" : "edit",
							"title" : mw.config.get("wgPageName"),
							"text" : text,
							"summary" : "Alphabetizing lists with [[User:Guywan/Scripts/ListAlpha|ListAlpha]] V" + version + ".",
							"token" : mw.user.tokens.get("csrtToken")
						})
						.fail(function(result) { mw.notify("Failed to post: " + result, "error"); })
						.done(function()
						{
							mw.notify("Success! Refreshing.", "info");
							window.location.href = mw.util.getUrl(mw.config.get("wgPageName"));
						});
					});
					
					$("#listalpha-cancel").on("click", function()
					{
						window.location.href = mw.util.getUrl(mw.config.get("wgPageName"));
					});
				});
			});
			
			$("#listalpha-cancel").on("click", function()
			{
				window.location.href = mw.util.getUrl(mw.config.get("wgPageName"));
			});
		});
	});
	
	function getWikitext(page, params)
	{
		// Get page wikitext.
		return $.ajax(
		{
			url : mw.util.getUrl(page) + params,
			data : "text",
			async : false
		}).responseText;
	}
});