Jump to content

User:Equazcion/ScriptInstaller.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Equazcion (talk | contribs) at 23:04, 5 October 2013. 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.
if (($('span.scriptInstallerLink').length > 0) && (wgAction != 'submit') && (wgAction != 'edit')){
	
	// Set URL prefix
	var pre = location.protocol + '//' + wgPageContentLanguage + '.' + wgNoticeProject + '.org' + '/w/index.php?title=';
	
	// Set interface text
	var installerTitle = 'You currently have the following scripts installed <div class="titleBadge"><a href="' + pre + 'User:Equazcion/ScriptInstaller' + '">Script Installer</a></div>';
	var installerMessage = 'Only scripts installed using <span style="font-weight:bold">Script Installer</span> are shown here. To uninstall a script, click "Uninstall".'; 
	var installerLink = 'Install';
	var unInstallerLink = 'Uninstall';
	var noauto = 'Must be installed manually';

	// Get the stylesheet
	importStylesheet('User:Equazcion/ScriptInstaller.css');
	
	// Set up the regex pattern for later
	var regex1='(importScript)';
	var regex2='(\\(.*\\))';
	var regex3='; \\/\\/Linkback: \\[.*?\\]\\] Added by Script installer';
	var regexObject = new RegExp(regex1+regex2+regex3,["i"]);
	
	// Create array for installed script paths
	var installedScripts = [];
	
	// Append the box of installed scripts. Hide unless we're on a designated installation page
	$('div#contentSub').after('<div hidden="hidden" class="scriptInstaller"></div>');
	
	// Set parameters for common.js ajax request	
	var request4 = {
		action:"query", 
		titles: "User:" + mw.config.get("wgUserName") + "/common.js", 
		prop: "revisions|info", 
		intoken: "edit", 
		rvprop: "content",
		indexpageids: 1,
		dataType: "xml",
		format: "xml"
	};
	
	// Do common.js ajax request
	$.get(mw.config.get("wgScriptPath")+"/api.php", request4, function(response4){
		
		// Grab common.js content and split by lines 
		var content = $(response4).find('rev').text();
		var lines = content.split('\n');
		
		// Use the regex to iterate through the lines, looking for the ones that ScriptInstaller added
		$.each(lines, function(index, value){
			var match = regexObject.exec(value);
			
			// Put the paths of the matches into the array of installed scripts
			if (match != null){
				installedScripts.push(match[2].replace(/\'/g,'').replace(/\(/g,'').replace(/\)/g,''));
			}
		});
		
		// If none were found, remove the installed script list box. Otherwise fade-in the box and set up the toggle link
		if (installedScripts.length < 1){
			$('div.scriptInstaller').remove();
		} else {
			if ((wgPageName == 'Wikipedia:WikiProject_User_scripts/Scripts') || (wgPageName == 'Wikipedia:WikiProject_User_scripts') || (wgPageName == 'Wikipedia:User scripts') || (wgPageName == 'User:Equazcion/sandbox1')){
				setTimeout(function(){
					// Insert script list toggle link, fade in script list
					$('.firstHeading span:first').after(' <a style="font-weight:bold;font-size:10px" class="scriptinstallerTog" href="#bbx">Hide installed script list</a>');
					$('.scriptInstaller').fadeIn(800, function(){
						
						// Set toggle link function
						$('.scriptinstallerTog').click(function(){
							if ($('.scriptinstallerTog').html() == "Show installed script list"){
								$('.scriptInstaller').fadeIn(500);
								$('.scriptinstallerTog').html('Hide installed script list');
							} else {
								$('.scriptInstaller').fadeOut(200);
								$('.scriptinstallerTog').html('Show installed script list');
							}
						});
					});	
				}, 500);
			}
		}
		
		// Start building the code for display of the installed list. Iterate through each installed script in the array
		var installedList = '<ul style="list-style-type:none;">';
		$.each(installedScripts, function(index, value){
			
			// For each script already installed, change the install links (into "installed" messages) that are on the current page (if any)
			//$('span.scriptInstallerLink[id="' + value.replace(/\//g,'.2F').replace(/ /g,'_').replace(/%/g,'.') + '"]')
			$('span.scriptInstallerLink[id="' + encodeURIComponent(value).replace('%3A',':').replace(/\//g,'.2F').replace(/ /g,'_').replace(/%/g,'.') + '"]')
				.attr('id','installed' + index)
				.addClass('installed')
				.html('Installed')
				.css('font-weight','bold');
			
			// Add an HTML list element for each installed script, containing .js and uninstall links
			installedList = installedList + '<li>' + 
				'<a href="#installerLink" class="unInstallerLink">' + unInstallerLink + '</a>: ' +
				'<a href="' + pre + value + '">' + decodeURIComponent(value) + '</a>' + 
			'</li>'; 
		});
		
		// Cap off the list of installed scripts
		installedList = installedList + '</ul>';
		
		// Build and append the rest if the list box code, and insert our constructed list of installed scripts
		$('.scriptInstaller').html('<div class="installerTitle">' + installerTitle + '</div>' +	
		'<div class="container1">' + 
				'<div class="installerMessage">' + installerMessage + '</div>' + 
				'<div class="uninstallList">' + installedList + '</div>' + 
		'</div>');
		
		// Iterate through each line in the installed list and set the click function for their uninstall links
		$('.scriptInstaller li').each(function(){
			var path = $(this).find('a:last').html();
			$(this).find('a:first').click(function(){
				
				// Set parameters for the first uninstall ajax request that occurs when the uninstall link is clicked
				var request5 = {
					action:"query", 
					titles: "User:" + mw.config.get("wgUserName") + "/common.js", 
					prop: "revisions|info", 
					intoken: "edit", 
					rvprop: "content",
					indexpageids: 1,
					dataType: "xml",
					format: "xml"
				};
				
				// Send the request
				$.get(mw.config.get("wgScriptPath")+"/api.php", request5, function(response5){
					
					//Grab common.js content and find/replace our line with nothing, thereby removing the script
					var content = $(response5).find('rev').text();
					var newText = content.replace("\n" + "importScript('" + path + "'); //Linkback: [[" + path + "]] Added by Script installer", "");
					
					// Set paraemeters for the ajax post that replaces common.js with our edited version
					var request6 = {
						action : "edit",
						title : "User:" + mw.config.get("wgUserName") + "/common.js", 
						text : newText,
						summary : "[[User:Equazcion/ScriptInstaller|Script installer]]: Uninstalled [[" + path + "]]",
						token: mw.user.tokens.get("editToken")
					};
					
					// Send the ajax post to save the new common.js, then reload the current page
					$.post(mw.config.get("wgScriptPath")+"/api.php", request6, function(response6){
						location.reload();
					});
				});
			});
		});
	});

	// Iterate through each templated (via {{userscript}}) script on the page
	$('span.scriptInstallerLink').each(function(){
		
		// Get the script path, which the template places in the span's ID
		var path = $(this).attr('id');
		path = path.replace(/.2F/g,'/').replace(/\_/g,' ');
		
		// If there's more than one dot left in the path, assume percent encoding was converted to dots. Leave the last dot for ".js"
		if ((path.split(".").length - 1) > 1){
			var parts = path.split('.');
    		path = parts.slice(0,-1).join('%') + '.' + parts.slice(-1);
		}
		
		// If this path leads to a valid en-wiki .js script in userspace or wikipedia space, add an install link
		if (((path.toLowerCase().substring(0, 5) == "user:") || (path.toLowerCase().substring(0,10) == 'wikipedia:')) && (path.lastIndexOf('.js') == path.length - 3)){
			$(this).html(' | <a href="#installerLink" class="installerLink">' + installerLink + '</a>');
			
			// Set the click function for the install link
			$(this).find('a.installerLink').click(function(){
				
				// Set ajax parameters for the ajax post that occurs when the install link is clicked 
				var request1 = {
					action:"edit", 
					title: "User:" + mw.config.get("wgUserName") + "/common.js", 
					appendtext: "\nimportScript('" + decodeURIComponent(path) + "'); //Linkback: [[" + decodeURIComponent(path) + "]] Added by Script installer", 
					summary: "[[User:Equazcion/ScriptInstaller|Script installer]]: Installed [[" + path + "]]", 
					token: mw.user.tokens.get("editToken")
				};
				
				// Send the ajax post, which appends our new importScript line to common.js, then reload the current page
				$.post(mw.config.get("wgScriptPath")+"/api.php", request1, function(response1){
				    location.reload();
				});
			});	
		} else {
			// If this is not a valid path to an en-wiki .js script in user or wikipedia space, add a "must install manually" message
			$(this).html(' | <span class="noauto">' + noauto + '</span>');
		}
	});
}