Jump to content

User:Guywan/Scripts/BulletSort.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Guywan (talk | contribs) at 11:27, 30 November 2019. The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
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>
$(function(api)
{
	if(mw.config.get("wgAction") !== "edit")
	{
		return;
	}
	
	document.onkeyup = function(e)
	{
    	if(e.ctrlKey && e.altKey && e.which == 83)
    	{
    		mw.notify("Sorting...", "info");
    		
    		// Purely to allow 'Sorting...' to display before we start sorting.
    		// That's a 100 miliseconds you'll never get back.
    		setTimeout(function()
    		{
    			console.time("_");
    			
    			try
    			{
    				run();
    				mw.notify("Done.", "info");
    			}
    			catch(e)
    			{
    				console.log(e);
    				mw.notify("Failed. See your console for more info.", "info");
    			}
    			
    			console.timeEnd("_");

    		}, 100);
		}
	};
	
	function run()
	{
		api = new mw.Api();
		
		const txtarea = document.getElementById("wpTextbox1");
		const start = txtarea.selectionStart;
		const end = txtarea.selectionEnd;
		
		var lines = txtarea.value.substring(start, end).split("\n");
		
		console.log(lines);
		
		var level = "*";

		// (1) Create the tree.
		var t = tree(level, lines);
		
		console.log(t);
		
		// (2) Sort the tree.
		var parsedLines = parse(txtarea.value.substring(start, end))
			.replace(/(<\/?[^>]*>)|(<!--.*?-->)/g, "")
			.split("\n");
		
		console.log(parsedLines);
			
		map = {};
		for(var i = 0; i < lines.length; i++)
		{
			map[lines[i]] = parsedLines[i].trim();
		}
		
		sort(t.sort(compare));
		
		// (3) Convert the tree back into a string.
		var sorted = join(t);
		
		txtarea.value = txtarea.value.substring(0, start) + sorted + txtarea.value.substr(end + 1);
	}
	
	function tree(level, list)
	{
		var branch = [];
		for(var i = 0; i < list.length; i++)
		{
			var line = list[i];
			if(level !== "*" && line.match(/^\*+/)[0].length < level.length)
			{
				return [branch, i];
			}
			else if(line.match(/^\*+/)[0] == level)
			{
				branch.push({"text": line, "children": null});
			}
			else if(line.match(/^\*+/)[0] == level + "*")
			{
				var result = tree(level + "*", list.slice(i));
				
				branch[branch.length - 1].children = result[0];
				
				i += result[1] - 1;
			}
		}
		
		return branch;
	}
		
	function sort(list)
	{
		for(var i = 0; i < list.length; i++)
		{
			if(list[i].children !== null && list[i].children !== undefined)
			{
				list[i].children.sort(compare);
				
				sort(list[i].children);
			}
		}
	}
		
	function join(list)
	{
		joined = "";
		for(var i = 0; i < list.length; i++)
		{
			joined += list[i].text + "\n";
			
			if(list[i].children !== null)
			{
				joined += join(list[i].children);
			}
		}
		
		return joined;
	}
	
	function compare(a, b)
	{
		return map[a.text].localeCompare(map[b.text]);
	}
	
	function parse(text)
	{
		var response = $.ajax(
		{
			url : `https://en.wikipedia.org/w/api.php?action=parse&text=${encodeURI(text).replace(/&/g, "%26")}&contentmodel=wikitext&format=json`,
			async : false
		});
		
		return JSON.parse(response.responseText).parse.text["*"];
	}
});
// </nowiki>