User:Alex 21/script-episodetable.js
$(function($) {
setTimeout(function() {
$.when( mw.loader.using( ['mediawiki.util']), $.ready ).then(function() {
var portletlink = mw.util.addPortletLink('p-tv', '#', 'Episode table', '', 'CTRL+click to reset preset widths first');
$(portletlink).click( function(e) {
e.preventDefault();
// Parameters
var alltemplates = ''; var episodetables = []; var cellwidths = [];
var vevent = document.getElementsByClassName('vevent');
// Default widths noted by local consensus
var defaultwidths = [];
defaultwidths.overall = 5;
defaultwidths.season = 5;
defaultwidths.series = 5;
defaultwidths.prodcode = 7;
defaultwidths.viewers = 10;
// Find episode tables
for (var i = 0; i < vevent.length; i++) {
if (vevent[i].classList[0] == 'vevent' && episodetables.indexOf(vevent[i].parentElement.parentElement) == -1)
episodetables[episodetables.length] = vevent[i].parentElement.parentElement;
}
if (episodetables.length > 0) {
for (i = 0; i < episodetables.length; i++) {
// Particular episode table's header and its cells
var episodetablerow = episodetables[i].rows[0];
var hc = episodetablerow.cells;
// Reset cell widths if holding down the CTRL key to be able to calculate optimum values for already-preset widths
if (e.ctrlKey) {
for (j = 0; j < hc.length; j++) {
hc[j].style.width = '';
}
}
// Calculating the displayed widths as percentages of each of the cells
for (j = 0; j < hc.length; j++) {
if (cellwidths[j] === undefined) cellwidths[j] = 0;
var k_dw = false;
for (var k in defaultwidths) {
if (episodetable_cell(hc[j],k,1)) { cellwidths[j] += defaultwidths[k]; k_dw = true; }
}
if (!k_dw) cellwidths[j] += Math.round(100*hc[j].offsetWidth/episodetablerow.offsetWidth);
}
}
// Calculate average widths of every corresponding cells, and total widths to 100%
for (i = 0; i < cellwidths.length; i++) {
cellwidths[i] = Math.round(cellwidths[i]/episodetables.length);
}
cellwidths = episodetable_total100(cellwidths,0);
// Begin compiling template code
for (i = 0; i < episodetables.length; i++) {
var episodetable = episodetables[i];
hc = episodetable.rows[0].cells;
var template = "{{Episode table"; var templateT = ''; var templateR = '';
var j = 0; var jv = -1;
// Background colour
var bgcolor = (hc[j].bgColor?hc[j].bgColor:RGBSTRtoHEX(hc[j].style.background?hc[j].style.background:hc[j].style.backgroundColor));
var width = (episodetable.width?episodetable.width:episodetable.style.width);
// Width, colour, caption
if (width !== "" && width != "100%") template += " |total_width="+width.replace('%','');
if (bgcolor != "#NANNANNAN") template += " |background="+bgcolor;
if (episodetable.caption) template += " |caption="+episodetable_content(episodetable.caption,0);
// No. overall
if (episodetable_cell(hc[j],"title",0)) {
template += " |overall="+episodetable_width(hc,j,'overall');
templateT += " |overallT="+episodetable_content(hc[j],1);
if (episodetable_ref(hc[j])) templateR += " |overallR=";
j++;
}
// No. in series/season
if (episodetable_cell(hc[j],"title",0)) {
if (episodetable_cell(hc[j],"series",1)) {
template += " |series="+episodetable_width(hc,j,'series');
if (episodetable_ref(hc[j])) templateR += " |seriesR=";
} else {
template += " |season="+episodetable_width(hc,j,'season');
templateT += " |seasonT="+episodetable_content(hc[j],1);
if (episodetable_ref(hc[j])) templateR += " |seasonR=";
}
j++;
}
// Title
if (true) {
template += " |title="+episodetable_width(hc,j,0);
templateT += " |titleT="+episodetable_content(hc[j],1);
if (episodetable_ref(hc[j])) templateR += " |titleR=";
j++;
}
// Aux1
if (episodetable_cell(hc[j],"direct",0) && episodetable_cell(hc[j],"writ",0) && episodetable_cell(hc[j],"date",0)) {
template += " |aux1="+episodetable_width(hc,j,0);
templateT += " |aux1T="+episodetable_content(hc[j],1);
if (episodetable_ref(hc[j])) templateR += " |aux1R=";
j++;
}
// Director
if (episodetable_cell(hc[j],"direct",1)) {
template += " |director="+episodetable_width(hc,j,0);
templateT += " |directorT="+episodetable_content(hc[j],1);
if (episodetable_ref(hc[j])) templateR += " |directorR=";
j++;
}
// Writer
if (episodetable_cell(hc[j],"writ",1)) {
template += " |writer="+episodetable_width(hc,j,0);
templateT += " |writerT="+episodetable_content(hc[j],1);
if (episodetable_ref(hc[j])) templateR += " |writerR=";
j++;
}
// Aux2
if (episodetable_cell(hc[j],"date",0) && episodetable_cell(hc[j],"release",0)) {
template += " |aux2="+episodetable_width(hc,j,0);
templateT += " |aux2T="+episodetable_content(hc[j],1);
if (episodetable_ref(hc[j])) templateR += " |aux2R=";
j++;
}
// Aux3
if (episodetable_cell(hc[j],"date",0) && episodetable_cell(hc[j],"release",0)) {
template += " |aux3="+episodetable_width(hc,j,0);
templateT += " |aux3T="+episodetable_content(hc[j],1);
if (episodetable_ref(hc[j])) templateR += " |aux3R=";
j++;
}
// Air date
if (episodetable_cell(hc[j],"date",1) || episodetable_cell(hc[j],"release",1)) {
template += " |airdate="+episodetable_width(hc,j,0);
//if (episodetable_cell(hc[j],"release",1)) templateT += " |released=y";
//else
templateT += " |airdateT="+episodetable_content(hc[j],1);
if (episodetable_ref(hc[j])) templateR += " |airdateR=";
j++;
}
// Alternate date
if (episodetable_cell(hc[j],"date",1)) {
template += " |altdate="+episodetable_width(hc,j,0);
templateT += " |altdateT="+episodetable_content(hc[j],1);
if (episodetable_ref(hc[j])) templateR += " |altdateR=";
j++;
}
// Production code
if (episodetable_cell(hc[j],"code",1)) {
template += " |prodcode="+episodetable_width(hc,j,'prodcode');
templateT += " |prodcodeT="+episodetable_content(hc[j],1);
if (episodetable_ref(hc[j])) templateR += " |prodcodeR=";
j++;
}
// Viewers
if (episodetable_cell(hc[j],"viewers",1)) {
template += " |viewers="+episodetable_width(hc,j,'viewers'); jv = j;
if (episodetable_ref(hc[j])) templateR += " |viewersR=";
j++;
}
// Aux4
if (hc[j]) {
template += " |aux4="+episodetable_width(hc,j,0);
templateT += " |aux4T="+episodetable_content(hc[j],1);
if (episodetable_ref(hc[j])) templateR += " |aux4R=";
j++;
}
// Add comment to all reference parameters to restore the wikicode source
// templateR = templateR.replace(/(\|[^\|\=]+=)/g, "$1<!--Be sure to restore the reference that existed here!-->");
// Country of viewers
if (jv != -1) {
var country = episodetable_content(hc[jv],0).match(/(.*)\s*[V|v]iewers\s*(<br\ ?\/?>)?(\((.*)\))?/);
if (country) {
if (country[1]) template += " |country="+country[1].trim();
if (country[4] && country[4].indexOf("million") == -1) template += " |viewers_type="+(country[4].replace("in ",""));
}
}
// Compile template, template text, template references, and episodes
template = template+templateT+templateR;
template += " |episodes=";
// Remove common variations of text
var replace = ["|overallT=<br>overall", "|overallT=", "|overallT=No. in<br>series", "|seasonT=No. in<br>season", "|seasonT=in<br>season", "|seriesT=in<br>series", "|titleT=Title", "|directorT=Directed by", "|writerT=Written by", "|airdateT=Original air date", "|airdateT=Original release date", "|prodcodeT=<br>code", "|prodcodeT=Prod.<br>code", "|prodcodeT=Production<br>code"];
for (var k = 0; k < replace.length; k++) template = template.replace(replace[k]+' |','|');
// Done singular template
alltemplates += template+"\n";
}
// Done all, and alert
copyContent(alltemplates);
alert("Episode table headers copied. Go to the editing page and replace the raw code, making sure you replace the ending |} with }}.");
}
// Calculate width of cells
function episodetable_width(cells,j,type) {
// If there's only one table, do not set widths.
if (episodetables.length == 1) return "";
var cell = cells[j];
if (cell === undefined) return '';
if (type != 0) cellwidths[j] = defaultwidths[type];
cellwidths = episodetable_total100(cellwidths,j);
var thiswidth = cellwidths[j].toString();
cell.style.width = thiswidth+'%';
return thiswidth;
}
// Determine if cell contains reference
function episodetable_ref(cell) {
if (cell === undefined) return false;
return (cell.innerHTML.match(/<sup(.*)\/sup\>/g) ? true : false);
}
// Determine if cell innerHTML text contains text
function episodetable_cell(cell,search,typesearch) {
var io = episodetable_content(cell,0).toLowerCase().indexOf(search);
return (typesearch === 0 ? io < 0 : io >= 0);
}
// InnerHTML content text of cell
function episodetable_content(cell,stripall) {
if (cell === undefined) return '';
var reg = (stripall ? /<([^>]+?)([^>]*?)>(.*?)<\/\1>/ig : /<([^\>])*\>/g);
return cell.innerHTML.replace(reg, '').replace("\n",'').trim();
}
// Total the widths to 100% by adding 1% to random cells
function episodetable_total100(cellwidths,start) {
function add(a, b) { return a + b; }
var sum = cellwidths.reduce(add, 0);
while (sum != 100) {
var rand = Math.floor(Math.random()*(cellwidths.length-start)+start);
cellwidths[rand] += (sum > 100 ? -1 : 1);
sum = cellwidths.reduce(add, 0);
}
return cellwidths;
}
});
});
},100);
});
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.