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 02:13, 1 May 2017. 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($) {
	setTimeout(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 (linkCell && linkCell.tagName != "A") {
						if (typeof linkCell == "object") linkCell = linkCell.textContent ? linkCell.textContent : linkCell.innerText;
						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 = linkCellH.substr(linkCellH.lastIndexOf('wiki/')+5);
					}
					linkMain = decodeURIComponent(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;
			}
		});
	},600);
});