User:LOL/mmarecmethod.js

var mma = mma || {}; mma.getFights = function(src) { var fights = []; var srcLeft = src.indexOf(''); if (srcLeft === -1) { window.alert('Invalid page'); return; }   var srcRight = src.indexOf(' ', srcLeft); if (srcRight === -1) { window.alert('Invalid page'); return; }   var i = srcLeft; while ((i = src.indexOf(' -1) { var row = []; var k = i;       for (var j = 0; j < 7; j++) { k = src.indexOf('', k); k = src.indexOf(' ', l); row[j] = mma.removeTags(src.substring(l + 1, k)) .replace(/(^\s+|\s+$)/g, ''); }       fights.push({opponent: row[1], date: row[4], data: row}); }   return fights; }; mma.recmethod = function { var columns = [ {name: 'Method', sherdogIndex: 2, templateIndex: 3}, {name: 'Round', sherdogIndex: 5, templateIndex: 6}, {name: 'Time', sherdogIndex: 6, templateIndex: 7} ];   for (var i in columns) { columns[i].index = -1; columns[i].regex = new RegExp('.+?\\b' + columns[i].name                   + '\\b'); }   var tb = document.getElementById('wpTextbox1'); var tableStart = tb.value.indexOf('\n{|'); var tableEnd = tb.value.indexOf('\n|}', tableStart); if (tableStart === -1 || tableEnd === -1) { tableStart = tb.value.indexOf('-start}}'); tableEnd = tb.value.indexOf('-end}}'); if (tableStart === -1 || tableEnd === -1) { tableStart = tb.value.indexOf('', tableStart); if (tableStart === -1 || tableEnd === -1) { window.alert('Record table not found.'); } else { for (var i in columns) { columns[i].index = columns[i].templateIndex; }           }        }    }    var i = tableStart; if (columns[0].index === -1) { // Find the lines that look like a column heading var count = 0; // Number of cells seen in this row so far while (i > -1) { var i1 = tb.value.indexOf('\n|', i + 1); var i2 = tb.value.indexOf('\n!', i + 1); if (i1 === -1) { i1 = tableEnd; }           if (i2 === -1) { i2 = tableEnd; if (i1 === i2) { // No more cells found in source break; }           }            i = Math.min(i1, i2); if (tb.value[i + 2] === '-') { count = 0; } else { for (var j = 0; j < columns.length; j++) { if (columns[j].regex.test(tb.value.substring(i, tb.value.indexOf('\n', i + 1)))) { columns[j].index = count; break; }               }                count++; }       }    }    for (var i in columns) { if (columns[i].index === -1) { window.alert('"' + columns[i].name + '" column not found.'); return; }   }    window.alert('Debug: Found Method/Round/Time at index ' + columns[0].index            + '/' + columns[1].index + '/' + columns[2].index); var xmlhttp; if (window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest; } else { xmlhttp = new ActiveXObject('Microsoft.XMLHTTP'); }   xmlhttp.onreadystatechange = function { if (xmlhttp.readyState === 4 && xmlhttp.status === 200) { // Get fight data from external site var src = xmlhttp.responseText; var fights = mma.getFights(src); var fightIndex = 0; var count = 0; var i = tableStart; while ((i = tb.value.indexOf('\n|', i + 1)) > -1 && i < tableEnd) { if (tb.value[i + 2] === '-') { count = 0; } else { for (var j = 0; j < columns.length; j++) { if (count === columns[j].index) { var contentStart = i + 2; // Immediately after pipe var endLine = tb.value.indexOf('\n', i + 1); var content = tb.value.substring(contentStart, endLine); if (/^[^\|\[\{\n]+\|/.test(content)) { // Evil hack for "align=center|" contentStart = tb.value.indexOf('|',                                       contentStart) + 1; content = tb.value.substring(contentStart, endLine); }                           content = content.replace(/(^\s+|\s+$)/g, ''); if (fightIndex > 0 || content.length > 0                                   && !/\{\{ *[Nn]\/A *\}\}/.test(content)) { // Ignore empty cell -- probably future fight= if (mma.removeWikilinks(content).toLowerCase                                       !== fights[fightIndex].data[columns[j]                                        .sherdogIndex].toLowerCase) { if (window.confirm('For the ' + columns[j].name + ' of the bout vs. ' + fights[fightIndex].opponent + ' on ' + fights[fightIndex].date + ':\nChange "' + content + '" to "'                                           + fights[fightIndex].data[columns[j].sherdogIndex]                                            + '"?')) { tb.value = tb.value.substring(0, contentStart) + ' ' + fights[fightIndex].data[columns[j].sherdogIndex] + tb.value.substring(endLine); }                               }                                if (j + 1 === columns.length) { fightIndex++; }                           }                            break; }                   }                    count++; }           }            window.alert('MMA record method script finished.'); }   };    var url = window.prompt('Enter the URL of the fighter\'s Sherdog profile',            'http://www.sherdog.com/fighter/'); xmlhttp.open('GET', url, true); xmlhttp.send; }; mma.removeTags = function(s) { return s.replace(/<[^>]+>/g, ''); }; mma.removeWikilinks = function(s) { return s.replace(/\[\[([^\[\]\|]+)\]\]/g, '$1') .replace(/\[\[[^\[\]\|]+\|([^\[\]\|]+)\]\]/g, '$1'); }; addOnloadHook(function {   if (document.forms.editform) {        mw.util.addPortletLink('p-tb', 'javascript:mma.recmethod', 'MMA record method', 't-mmarecmethod', 'Synchronize method column with Sherdog in record tables', , );    } });