Jump to content

User:Alex 21/script-updateepisodes.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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($) {
	setTimeout(function() {
		$.when( mw.loader.using( ['mediawiki.util']), $.ready ).then(function() {
			var portletlink = mw.util.addPortletLink('p-tv', '#', 'Update episodes');
			$(portletlink).click( function(e) {
				e.preventDefault();
				// Textbox contents
				var NumEpisodesM;
				var wpTextbox1 = document.getElementById('wpTextbox1');
				var wpTextbox1_V = wpTextbox1.value.split("\n");
				
				// Declare variables
				var NumEpisodes = false; var RTitle = false; var line;
				var OriginalAirDate = false; var EpisodeNumber = false; var RmvRefs = false;
				
				// Go though contents one line at a time
				for (var i = 0; i < wpTextbox1_V.length; i++) {	
					// Retreive particular line
					line = wpTextbox1_V[i];
					
					// Remove references param set, and on to the next episode row
					if (RmvRefs && (line.toLowerCase().indexOf('episode list') >= 0 || line.trim() == '}}')) RmvRefs = false;
					
					// Update num_episodes in Template:Infobox_television, if it exists
					if (!NumEpisodesM) {
						NumEpisodesM = line.match(/(\s*\|\s*num_episodes\s*=\s*(<onlyinclude>)?)(\d+)(.*)/);
						if (NumEpisodesM) NumEpisodes = parseInt(NumEpisodesM[3])+1;
					}
					
					// Check if first appearance of RTitle is found
					if (!RTitle) {
						// If line contains RTitle, set to <<RTitle>> if only a ref (will be removed later), else set to contents of RTitle is more than a ref (e.g. raw episode title).
						var RTitleM = line.match(/(\s*\|\s*RTitle\s*=\s*)([^<]*)<ref(.*)/);
						if (RTitleM) {
							if (RTitleM[2] === "") line = '<<RTitle>>';
							else line = RTitleM[1]+RTitleM[2];
							RTitle = true;
							RmvRefs = true;
						}
						
						// Catch episode number to add to summary
						var EpisodeNumberM = line.match(/(\s*\|\s*EpisodeNumber\s*=\s*)(.*)/);
						if (EpisodeNumberM) EpisodeNumber = EpisodeNumberM[2];
					} else if (!OriginalAirDate) {
						// If RTitle is found but OriginalAirDate not set, find the next occurrence
						// of OriginalAirDate to update Template:Aired_episodes, if it exists
						var OriginalAirDateM = line.match(/(\s*\|\s*OriginalAirDate\s*=\s*)\{\{[s|S]tart date\|([^\}]*)\}\}/);
						if (OriginalAirDateM) OriginalAirDate = OriginalAirDateM[2].replace("|df=y","");
					}
					
					// Remove director/writer/etc. references
					if (RmvRefs) line = line.replace(/<ref(.*)\/(ref)?\>/g,"");
					
					// Update line
					wpTextbox1_V[i] = line;
				}
				
				EpisodeNumber = (EpisodeNumber?EpisodeNumber:NumEpisodes);
				
				// Save values or get saved values
				if (OriginalAirDate) {
					// If EpisodeNumber/OriginalAirDate was found, saved it from transcluded season page for LoE page update
					localStorage.setItem('EpisodeNumber', EpisodeNumber);
					localStorage.setItem('OriginalAirDate', OriginalAirDate);
				} else if (localStorage.getItem('OriginalAirDate') || localStorage.getItem('EpisodeNumber')) {
					// If EpisodeNumber/OriginalAirDate was not found, obtain it from transcluded season page save for LoE page update
					OriginalAirDate = localStorage.getItem('OriginalAirDate');
					localStorage.removeItem('OriginalAirDate');
					EpisodeNumber = localStorage.getItem('EpisodeNumber');
					localStorage.removeItem('EpisodeNumber');
				}
				
				// Alert of no existance of OriginalAirDate/EpisodeNumber
				var update = true;
				if (!OriginalAirDate && !EpisodeNumber) {
					alert('Be sure to update the individual transcluded season page first, then the List of Episode page, to save the episode number and air date.');
					update = false;
				}
				
				// Update summary
				var summary = document.getElementById('wpSummary');
				if (summary.value.indexOf('Update]]; aired') >= 0) summary.value += " ["+EpisodeNumber+"]";
				else if (update) summary.value += "[[User:Alex 21/script-updateepisodes|Update]]; aired ["+EpisodeNumber+"]";
				
				// Concatenate textbox values again, but without <<RTitle>>
				var wpTextbox1NewValue = '';
				for (i = 0; i < wpTextbox1_V.length; i++) if (wpTextbox1_V[i] != '<<RTitle>>') wpTextbox1NewValue += wpTextbox1_V[i]+"\n";
				
				// Update |num_episodes=
				if (NumEpisodesM) {
					if (RTitle) wpTextbox1NewValue = wpTextbox1NewValue.replace(NumEpisodesM[1]+NumEpisodesM[3], NumEpisodesM[1]+NumEpisodes); // Season page
					else wpTextbox1NewValue = wpTextbox1NewValue.replace(NumEpisodesM[1]+NumEpisodesM[3], NumEpisodesM[1]+EpisodeNumber); // Main page
				}
				// Update Template:Aired_episodes if it exists
				if (OriginalAirDate) wpTextbox1NewValue = wpTextbox1NewValue.replace(/(\{\{Aired episodes\|)((\d*)\|(\d*)\|(\d*))/, "$1"+OriginalAirDate);
				if (EpisodeNumber) wpTextbox1NewValue = wpTextbox1NewValue.replace(/((\{\{Aired episodes\|)(.*)(\|\s*num\s*=))(\d+)/, "$1"+EpisodeNumber);
				wpTextbox1NewValue = wpTextbox1NewValue.replace(/((\{\{Aired episodes\|)(.*)(\|\s*finished\s*=))([\d\.]+)/, "$2$3");
				
				// Reset textbox with new version
				wpTextbox1.value = wpTextbox1NewValue;
			});
		});
	},900);
});