Jump to content

User:Alex 21/script-seriesoverview.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Alex 21 (talk | contribs) at 04:45, 20 September 2016 (Update to include unlinked seasons). 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.
$(function($) {
	var portletlink = mw.util.addPortletLink('p-tv', '#', 'Series overview');
	$(portletlink).click( function(e) {
		e.preventDefault();
		// Find overview table
		var overview = document.getElementById('seriesoverview');
		if (overview === null) {
			var k = 0;
			var alltables = document.getElementById('mw-content-text').getElementsByTagName('table');
			overview = alltables[k];
			var className = overview.className;
			while (so_tableIndexOf(className,"ambox") || so_tableIndexOf(className,"infobox") || so_tableIndexOf(className,"mw-collapsible")) { 
				k++;
				overview = alltables[k];
				className = overview.className;
			}
		}
		
		// Define parameters
		var df = 0; var _i = 1;
		var endExist = false; var episodesCol;
		var SpecialSplit = [' ',' ']; // 0: Special; 1: Split
		
		var headerBase = 3; var network_double = 0;
		var network_single = 0; var infoheaderonly = 0; var auxheaders = 0;
		
		var dateReg = /(([^\s]*)\s)?(([^\s,]*))?.*(\d{4})/;
		
		// Begin template
		var _template_head = "{{Series overview\n";
		var _template = _template_head;
		
		// Aux variables - see where episodes column is located
		for (var a = 1; a < overview.rows[0].cells.length; a++) {
			if (overview.rows[0].cells[a].innerHTML.indexOf('Episodes') != -1) {
				episodesCol = a;
				break;
			}
		}
		auxheaders = episodesCol-1;
		headerBase += auxheaders;
		
		if (auxheaders > 0) {
			for (a = 1; a < episodesCol; a++) {
				_template += "| aux"+(String.fromCharCode(64+a))+"         = "+overview.rows[0].cells[a].innerHTML+"\n";
			}
			_template += "\n";
		}
		
		// Find existance of info and network headers/columns
		if (overview.rows[1].cells[2+auxheaders] !== undefined && overview.rows[1+auxheaders].cells[2+auxheaders].innerHTML.toLowerCase() == "network") {
			network_single = 1;
		}
		if (overview.rows[0].cells[3+auxheaders] !== undefined) {
			if (overview.rows[0].cells[3+auxheaders].innerHTML.toLowerCase() == "network") {
				network_double = 1;
				headerBase++;
			} else if (overview.rows[0].cells[3+auxheaders].getAttribute('rowspan') > 1) {
				infoheaderonly = 1;
			}
		}
		var network = network_single || network_double;
		headerBase -= infoheaderonly;
		
		// Check if overview uses simple one-row header
		var onerowheader = (overview.rows[1].cells[1].tagName == "TD" ? 1 : 0);
		headerBase += onerowheader;
		
		// Add infoheader and info headers
		var extraHeadRows = overview.rows[0].cells.length-headerBase;
		var infoRows = overview.rows[1].cells.length-(headerBase-(network_single?0:1))+infoheaderonly;
		
		if (extraHeadRows > 0) {
			var infoheader = overview.rows[0].cells[headerBase+auxheaders].children[0];
			if (infoheader === undefined || infoheader.tagName == "BR") infoheader = overview.rows[0].cells[headerBase+auxheaders].innerHTML;
			if (typeof infoheader != "object") infoheader = infoheader.replace(/\n/g,'');
			else infoheader.innerHTML = infoheader.innerHTML.replace(/\n/g,'');
			
			_template += "| infoheader   = "+so_link(infoheader)+"\n";
		}
		if (infoRows > 0 && !onerowheader && !infoheaderonly) {
			for (a = 0; a < infoRows; a++) {
				_template += "| info"+(String.fromCharCode(65+a))+"        = "+overview.rows[1].cells[a+(headerBase-1)+auxheaders].innerHTML.replace("\n","")+"\n";
			}
		}
		
		// Extra links
		if (extraHeadRows > 0 || infoRows > 0 && !onerowheader) _template += "\n";
		_template = _template.replace(_template_head+"\n",_template_head);
		
		// Begin iteratin through season rows
		for (var i = 2-onerowheader; i < overview.rows.length; i++) {
			// Define parameters
			var startdate, enddate;
			var RC = overview.rows[i].cells;
			SpecialSplit[0] = ' '; var CellAdj = 0;
			
			// 0: Colour; 1: Link, 2: Episodes
			var CLE = ['','',''];
			
			if (SpecialSplit[1] == 'A') {
				SpecialSplit[1] = 'B'; // Was on first half, now on second half
			} else if (RC[0].getAttribute('rowspan') || RC[1].getAttribute('rowspan')) {
				SpecialSplit[1] = 'A'; // Now on first half
			} else {
				SpecialSplit[1] = ' '; // Not a split season
			}
			
			// Code to add after parameter name
			var ThisKey = so_ThisKey(_i,SpecialSplit);
			
			if (SpecialSplit[1] != 'B') {
				// First half or regular season, link and colour added
				// Link
				var linkCell = (RC[1].firstChild.href !== undefined ? RC[1].firstChild : RC[1].firstChild.firstChild);
				if (typeof linkCell == "object") linkCell = linkCell.textContent ? linkCell.textContent : linkCell.innerText;
				if (linkCell && linkCell.tagName != "A") {
					var aT = document.createElement('a');
					aT.innerHTML = linkCell;
					aT.href = '#Season '+linkCell;
					linkCell = aT;
				}
				
				var linkMain;
				var linkCellH = linkCell.href;
				if (!linkCell) {
					linkMain = '';
				} else if (linkCellH.indexOf('index.php') >= 0) {
					linkMain = linkCellH.substr(linkCellH.indexOf('title=')+6, linkCellH.indexOf('&')-(linkCellH.indexOf('title=')+6))+
						(linkCellH.indexOf('#') >= 0 ? linkCellH.substr(linkCellH.indexOf('#')) : '');
				} else {
					linkMain = decodeURIComponent(linkCellH.substr(linkCellH.lastIndexOf('wiki/')+5));
				}
				linkMain = linkMain.replace(/_/g, ' ').replace(/\.([A-Z0-9]{2})/g, '%$1').split('#');
				
				// Special row
				if (linkCell.innerHTML != _i) {
					_i--;
					SpecialSplit[0] = 'S';
					CellAdj = Math.max(0,RC[1].getAttribute('colspan')-2);
					ThisKey = so_ThisKey(_i,SpecialSplit);
				}
				
				CLE[0] += "| color"+ThisKey+"     = "+(RC[0].bgColor?RC[0].bgColor:RGBSTRtoHEX(RC[0].style.background?RC[0].style.background:RC[0].style.backgroundColor))+"\n";
				CLE[1] += "| link"+_i+SpecialSplit[0]+"       = <includeonly>"+linkMain[0]+"</includeonly>"+(linkMain[1]?"#"+linkMain[1]:"")+"\n";
				if (isNaN(parseInt(so_wiki(linkCell.innerHTML),10))) {
					CLE[1] += "| linkT"+ThisKey+"     = "+so_wiki(linkCell.innerHTML)+"\n";
				}
			} else {
				// Second half, only colour required
				CLE[0] += "| color"+ThisKey+"     = "+(RC[0].bgColor?RC[0].bgColor:RGBSTRtoHEX(RC[0].style.background?RC[0].style.background:RC[0].style.backgroundColor))+"\n";
			}
			
			// Aux variables
			var aux = '';
			if (episodesCol != 1 && SpecialSplit[1] != 'B') {
				for (a = 1; a < episodesCol; a++) {
					if (SpecialSplit[1] == ' ' || (SpecialSplit[1] != ' ' && RC[1+a].getAttribute('rowspan') > 1))
						aux += "| aux"+String.fromCharCode(64+a)+_i+SpecialSplit[0]+"       = "+so_wiki(RC[1+a].innerHTML)+"\n";
					CellAdj--;
				}
			} else {
				CellAdj -= episodesCol-1;
			}
			
			// Total episodes
			if (SpecialSplit[1] != 'B' && so_tba(RC[2-CellAdj].innerHTML) && !isNaN(parseInt(so_ref(RC[2-CellAdj],false),10))) {
				CLE[2] += "| episodes"+_i+SpecialSplit[0]+"   = "+so_ref(RC[2-CellAdj],false)+"\n";
			}
			
			// Colour, Link, Episodes
			_template += ( SpecialSplit[1] != ' ' ? CLE[1]+aux+CLE[2]+CLE[0] : CLE[0]+CLE[1]+aux+CLE[2] );
			
			// Aux variables split season
			if (episodesCol != 1 && SpecialSplit[1] != ' ') {
				for (a = 1; a < episodesCol; a++) {
					var cell = RC[SpecialSplit[1] == 'B' ? a-CellAdj-1 : a-CellAdj];
					_template += "| aux"+String.fromCharCode(65+a)+ThisKey+"      = "+so_wiki(cell.innerHTML)+"\n";
				}
			}
			
			// Split season episodes
			if (SpecialSplit[1] != ' ') {
				CellAdj += (SpecialSplit[1] == 'B' ? 2 : 0);
				if (so_tba(RC[3-CellAdj].innerHTML) && !isNaN(parseInt(so_ref(RC[3-CellAdj],false),10))) {
					_template += "| episodes"+ThisKey+"  = "+so_ref(RC[3-CellAdj],false)+"\n";
				}
				CellAdj--;
			}
			
			// Start and end dates
			var temp;
			var reS = dateReg.exec(so_dateref(RC[3-CellAdj]));
			if (reS) {
				var reS_x = [reS[4],reS[2],reS[5]];
				if (reS_x[0] && isNaN(parseInt(reS_x[0],10))) {
					temp = reS_x[0]; reS_x[0] = reS_x[1]; reS_x[1] = temp; df = 1;
				}
				startdate = so_startend(reS_x,"Start",df);
			}
			
			var reE = '';
			if (RC[4-CellAdj] !== undefined && RC[3-CellAdj].getAttribute('colspan') <= 1) {
				reE = dateReg.exec(so_dateref(RC[4-CellAdj]));
				if (reE) {
					var reE_x = [reE[4],reE[2],reE[5]];
					if (reE_x[0] && isNaN(parseInt(reE_x[0],10))) {
						temp = reE_x[0]; reE_x[0] = reE_x[1]; reE_x[1] = temp; df = 1;
					}
					enddate = so_startend(reE_x,"End",df);
					endExist = true;
				}
			}
			if (RC[3-CellAdj].getAttribute('colspan') > 1) { CellAdj++; }
			
			if (reS) _template += "| start"+ThisKey+"     = "+startdate+so_ref(RC[3-CellAdj],true)+"\n";
			if (reE) _template += "| end"+ThisKey+"       = "+enddate+so_ref(RC[4-CellAdj],true)+"\n";
			else if (SpecialSplit[0] != 'S' && RC[3-CellAdj].getAttribute('colspan') > 1) _template += "| end"+ThisKey+"       = start\n";
			
			// Network
			if (network && RC[5-CellAdj] !== undefined && RC[5-CellAdj].getAttribute('rowspan')) {
				_template += "| network"+ThisKey+"   = "+so_link(RC[5-CellAdj].children[0])+"\n";
				CellAdj++;
			}
			
			// Info cells
			if (infoRows > 0) {
				for (var j = 0; j < 26; j++) {
					var infoCell = RC[5+j-CellAdj];
					if (infoCell && so_tba(so_ref(infoCell,false))) {
						_template += "| info"+String.fromCharCode(65+j)+ThisKey+"     = "+so_ref(infoCell,false)+"\n";
					}
				}
			}
			
			// New lines and updating split season variables
			if (i < overview.rows.length-1 && SpecialSplit[1] != 'A') _template += "\n";
			
			if (SpecialSplit[1] == 'B') SpecialSplit[1] = ' ';
			else if (SpecialSplit[1] == 'A') _i--;
			
			_i++;
		}
		
		// Released parameters
		var released = '';
		for (a = 1; a < overview.rows[0].cells.length; a++) {
			if (overview.rows[0].cells[a].innerHTML.indexOf('release') != -1) {
				released += "| released     = y\n";
				break;
			}
		}
		if (!endExist) {
			released += "| allreleased  = y\n";
		}
		if (released) _template = _template.replace(_template_head, _template_head+released+"\n");
		
		// Finished
		_template = _template.replace('<small><span style="color: #2C2C2C" title="To be announced">TBA</span></small>','{{TableTBA}}');
		_template += "}}";
		
		copyContent(_template);
		alert("Copied! Now go to the editing page and paste over the raw code.");
		
		// Function: Remove reference
		function so_ref(cell,comment) {
			if (comment) {
				if (cell.innerHTML.indexOf("<sup") < 0) return '';
				else return "<!--Be sure to restore the reference that existed here!-->";
			} else {
				if (cell.innerHTML.indexOf("<sup") < 0) return cell.innerHTML;
				else return cell.innerHTML.replace(/<sup(.*)\/sup\>/g,"<!--Be sure to restore the reference that existed here!-->");
			}
		}
		
		// Function: Raw link to wiki link
		function so_link(link) {
			if (link === undefined || link.href === undefined) return link;
			var nwlink = link.href.replace("https://en.wikipedia.org/wiki/","").replace("_", " ");
			return "[["+(link.innerHTML==nwlink?"":nwlink+"|")+link.innerHTML+"]]";
		}
		
		// Function: Remove reference from data
		function so_dateref(cell) {
			return (cell.innerHTML.indexOf('<')>=0 ? cell.innerHTML.substr(0, cell.innerHTML.indexOf('<')) : cell.innerHTML).split('&nbsp;').join(' ');
		}
		
		// Function: Bold and italic text to wiki
		function so_wiki(text) {
			return text.replace(/<i>(.*)<\/i>/g, "''$1''").replace(/<b>(.*)<\/b>/g, "'''$1'''");
		}
		
		// Function: Dates to wiki templates
		function so_startend(cell,se,df) {
			var monthNumber = new Date(Date.parse(cell[1]+" 1, 2005")).getMonth()+1;
			return "{{"+se+" date|"+cell[2]+
					(!isNaN(monthNumber) && cell[1] !== undefined ? "|"+monthNumber : "")+
					(!isNaN(cell[0]) && cell[0] !== undefined ? "|"+cell[0] : "")+
					(df ? "|df=y" : "")+"}}";
		}
		
		// Function: Chceck if classname contains single class
		function so_tableIndexOf(className,content) {
			return (className.indexOf(content) >= 0);
		}
		
		// Function: Check if text contains TBA, TBD, N/A
		function so_tba(text) {
			text = text.toLowerCase();
			return text.indexOf("tba") < 0 &&  text.indexOf("tbd") < 0 &&  text.indexOf("n/a") < 0;
		}
		
		// Function: Get value of ThisKey
		function so_ThisKey(_i,SpecialSplit) {
			var ThisKey = _i+SpecialSplit[1]+SpecialSplit[0];
			if (ThisKey.indexOf(' ') != -1) {
				var spaces = ThisKey.length-ThisKey.replace(/\s/g,'').length;
				ThisKey = ThisKey.replace(/\s/g,'');
				for (a = 0; a < spaces; a++) ThisKey += ' ';
			}
			return ThisKey;
		}
	});
});