User:Dudemanfellabra/ReorderNRHPlist.js

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.
/*
This script will place a button at the top of any NRHP county/state list that when clicked on will check and automatically fix
the ordering of the numbers in the first column of the NRHP table. If no reordering is needed, a null edit will be performed.
This is useful when a property has been added to or removed from the list, causing all rows below it to be off by one.
*/
function RenumberButton() {
    if ((mw.config.get('wgPageName').search("National_Register_of_Historic_Places_listings_in")==-1 && mw.config.get('wgPageName').search("National_Historic_Landmarks_in")==-1) || mw.config.get('wgNamespaceNumber')!=0) {
        return
    }
    if (location.href.indexOf('action')!=-1||location.href.indexOf('Talk:')!=-1) return
    var button=document.createElement("input")
    button.setAttribute("type", "button");
    button.setAttribute("value", "Renumber list");
    button.setAttribute("id", "button");
    button.setAttribute("onclick", "RenumberClick()");
    var content=document.getElementById('mw-content-text')

    content.parentNode.insertBefore(button, content)
}

function RenumberClick() {
    var button = document.getElementById('button')
    button.value = "Working..."
    button.disabled = true
    getListWikitext(mw.config.get('wgPageName'))
}

function getListWikitext(title) {
    $.getJSON(
        mw.util.wikiScript('api'),
        {
            format: 'json',
            action: 'query',
            prop: 'revisions',
            rvprop: 'content',
            titles: title,
            indexpageids: true
        }
    )
        .done(function (data) {
            var page, wikitext;
            for (page in data.query.pages) {
                wikitext = data.query.pages[page].revisions[0]['*'];
                RenumberList(wikitext)
            }
        })
        .fail(function() {
            alert('Could not get wikitext; failure.');
        });
}

function RenumberList(wikitext) {
    var splittext = wikitext.split("|}")

    var newwikitext = ''
    for (var j=0; j<splittext.length-1; j++) {

        var StartIndex = 0
        var str = "|pos="
        var skip = str.length;
        var index, RowLocations = [];
        while ((index = splittext[j].indexOf(str, StartIndex)) > -1) {
            RowLocations.push(index);
            StartIndex = index + skip;
        }

        var stop=RowLocations.length+1
        var comments=splittext[j].match(/\<\!\-\-(.|[\r\n])*?\-\-\>/g)
        if (comments!=null) {
            for (var l=0; l<comments.length; l++) {
                if (comments[l].indexOf(str)==-1) {comments.splice(l,1);l--}    // remove comments that don't include a row
            }
        }
        var k = 0
        for (var i=1; i<stop; i++) {
            var StartIndex = RowLocations[i-1]+1
            if (comments!=null && k<comments.length) {
            if (StartIndex>splittext[j].indexOf(comments[k])&&StartIndex<splittext[j].indexOf(comments[k])+comments[k].length) {
                k++
                continue;
            }
            }
            var str="|"
            var NextParam = splittext[j].indexOf(str,StartIndex)
            var RowNum = i-k
            splittext[j] = splittext[j].substr(0,StartIndex-1)+"|pos="+RowNum+splittext[j].substr(NextParam-1,splittext[j].length-NextParam+1)

            var StartIndex = 0
            var str = "|pos="
            var skip = str.length;
            var index, RowLocations = [];
            while ((index = splittext[j].indexOf(str, StartIndex)) > -1) {
                RowLocations.push(index);
                StartIndex = index + skip;
            }
        }
        newwikitext+=splittext[j]+"|}"
    }
    newwikitext+=splittext[splittext.length-1]
    editNRHPPage({
        title: mw.config.get('wgPageName'),
        text: newwikitext,
        summary: '[[User:Dudemanfellabra/ReorderNRHPlist.js|Semi-automated]] renumbering of list items after addition/deletion.'
    });
}

function editNRHPPage(info) {
    $.ajax({
        url: mw.util.wikiScript( 'api' ),
        type: 'POST',
        dataType: 'json',
        async: false,
        data: {
            format: 'json',
            action: 'edit',
            title: info.title,
            text: info.text,
            summary: info.summary,
            token: mw.user.tokens.get( 'editToken' )
        }
    })
        .done (function( data ) {
            if (data && data.edit && data.edit.result && data.edit.result == 'Success') {
                alert("Success! Rows renumbered!")
            } else {
                alert("Error! Rows not renumbered! Refresh the page to try again")
            }
        })
        .fail (function() {
            alert('Ajax failure.');
        });
}

$(RenumberButton);