Suradnik:Ivi104/Skripte/Unlink-ivi.js

Napomena: Nakon objave možda ćete trebati očistiti međuspremnik svog preglednika kako biste vidjeli promjene.

  • Firefox / Safari: držite Shift i pritisnite Reload, ili pritisnite bilo Ctrl-F5 ili Ctrl-R (⌘-R na Macu)
  • Google Chrome: pritisnite Ctrl-Shift-R (⌘-Shift-R na Macu)
  • Internet Explorer / Edge: držite Ctrl i kliknite Refresh, ili pritisnite Ctrl-F5
  • Opera: pritisnite Ctrl-F5.
//unlink-ivi
$(document).ready(function() {
    if (location.href.includes('/Datoteka:') || location.href.includes('/File:')) {
        console.log("ivi-odlinkaj loaded.");
        mw.util.addPortletLink(
            'p-cactions', '#Poveznice',
            'ivi104-odlinkaj', 'ivi104-odlinkaj', 'odlinkaj', ''
        );
        document.getElementById('ivi104-odlinkaj').setAttribute('onclick', 'ivi104OdlinkajPrep()');
    }
});

function ivi104OdlinkajPrep() {
    console.log("Ivi-odlinkaj: prep");

    document.getElementById('filelinks').scrollIntoView();

    var odlinkajPopis = document.querySelectorAll('ul.mw-imagepage-linkstoimage>li');
    odlinkajPopis.forEach(function(izmjena, index) {
        var odlinkajCheckBox = document.createElement('input');
        odlinkajCheckBox.className = 'webfonts-changed';
        odlinkajCheckBox.type = 'checkbox';
        var odlinkajImeStranice = odlinkajPopis[index].innerText;
        odlinkajCheckBox.setAttribute('name', 'ivi104-odlinkaj-checkbox');
        odlinkajCheckBox.setAttribute('value', odlinkajImeStranice);

        odlinkajPopis[index].prepend(odlinkajCheckBox);
    });

    //onemogući ponovno klikanje poveznice za start
    document.getElementById('ivi104-odlinkaj').removeAttribute('onclick');


    var odlinkajGumbSubmit = document.createElement('input');
    odlinkajGumbSubmit.type = 'submit';
    odlinkajGumbSubmit.className = 'cdx-button webfonts-changed';
    odlinkajGumbSubmit.id = 'ivi104-odlinkaj-submit';
    odlinkajGumbSubmit.value = 'Ukloni datoteku iz članaka';
    odlinkajGumbSubmit.setAttribute('onclick', 'ivi104OdlinkajMain()');
    document.getElementsByClassName('mw-imagepage-linkstoimage')[0].append(odlinkajGumbSubmit);

    ////////// *** prepravi ***////////////
    var odlinkajStatusText = document.createElement('span');
    odlinkajStatusText.innerText = 'Čekam... : ';
    odlinkajStatusText.id = 'ivi104-odlinkaj-status';

    var odlinkajSuccessText = document.createElement('span');
    odlinkajSuccessText.innerText = '[Uspjelo: 0/';
    odlinkajSuccessText.id = 'ivi104-odlinkaj-success';

    var odlinkajFailText = document.createElement('span');
    odlinkajFailText.innerText = 'Neuspjelo: 0]';
    odlinkajFailText.id = 'ivi104-odlinkaj-fail';

    document.getElementById('ivi104-odlinkaj-submit').after(odlinkajFailText);
    document.getElementById('ivi104-odlinkaj-submit').after(odlinkajSuccessText);
    document.getElementById('ivi104-odlinkaj-submit').after(odlinkajStatusText);

}

function ivi104OdlinkajMain() {
    console.log("Ivi-odlinkaj: main");
    var odlinkajCheckedBoxes = document.querySelectorAll('input[name=ivi104-odlinkaj-checkbox]:checked');

    var odlinkajCheckedArray = [];
    if (odlinkajCheckedBoxes.length == 0) {
        alert("Ništa nije označeno, molim pokušajte ponovno!");
    } else if (odlinkajCheckedBoxes.length > 49) {
        alert("previše stavki označeno. Max 49.");
    } else {
        odlinkajCheckedBoxes.forEach(function(box, index) {
            odlinkajCheckedArray.push(box.getAttribute('value'));
        });
        console.log("odlinkajArray");
        console.log(odlinkajCheckedArray);


        var odlinkajRazlog = window.prompt("Unesite sažetak izmjene: ", "slika za brisanje uklonjena iz članka");
        if (odlinkajRazlog != null) {
            ivi104OdlinkajDohvati(odlinkajCheckedArray, odlinkajRazlog);
        } else {
            window.alert("Odustali ste. Ništa nije promjenjeno.");
        }


    }
}

function ivi104OdlinkajDohvati(odlinkajCheckedArray, odlinkajRazlog) {

    //get current content using MW
    var params = {
            "action": "query",
            "format": "json",
            "prop": "revisions",
            "titles": odlinkajCheckedArray.join('|'),
            "redirects": 1,
            "rvprop": "content",
            "rvslots": "main",
            "utf8": 1
        },
        api = new mw.Api();

    api.get(params).done(function(data) {
        //console.log(data);

        var pages = data.query.pages;
        odlinkajLoop(pages, odlinkajRazlog);

    });
}

function odlinkajLoop(pages, odlinkajRazlog) {

    var pagesArray = [];

    for (let i in pages) {
        for (let j in pages[i].revisions[0].slots.main) {
            if (j == "*") {
                pagesArray.push(i);
                pagesArray.push(pages[i].revisions[0].slots.main[j])
            }
        }
    }
    console.log("pagesArray");
    console.log(pagesArray);

    var
        api = new mw.Api(),
        successCount = 0,
        failCount = 0,
        failed = [],
        error = [],
        deferreds = [];

    var odlinkajFilename = mw.config.get("wgPageName");
    //console.log("name:  ", odlinkajFilename);

    var odlinkajFilenameSplit = odlinkajFilename.split('Datoteka:');
    odlinkajFilename = odlinkajFilenameSplit[1];
    console.log("Ime slike:  ", odlinkajFilename);



    function odlinkajAPI(pageid, pageContent, odlinkajRazlog) {
        console.log("apiPoziv: pageid ", pageid, "razlog: ", odlinkajRazlog);

        //console.log("before: ");
        //console.log(pageContent);

        var odlinkajRegexFull = new RegExp("\\[\\[(datoteka|slika|file):" + odlinkajFilename + "[\\w\\W]*?\\]\\]$\\n?", "im");
        //                         "\[\[(datoteka|slika|file):Test-slika.png[\w\W]*?\]\]$\n?"


        var odlinkajRegexInfobox = new RegExp("=\\s*?" + odlinkajFilename, "im");
        //                         "=\s*?Test-slika.png"

        var odlinkajRegexGallery = new RegExp("(datoteka|slika|file)?:?" + odlinkajFilename + "[\\w\\W]*?$\\n?(?=[\\w\\W]*?<\\/gallery>)")
            //                                 (datoteka|slika|file)?:?:Test-slika.png[\w\W]*?$\n?(?=[\w\W]*?<\/gallery>)


        pageContent = pageContent.replace(odlinkajRegexFull, '');
        pageContent = pageContent.replace(odlinkajRegexInfobox, '=');
        pageContent = pageContent.replace(odlinkajRegexGallery, '');

        // console.log("after: ");
        // console.log(pageContent);

        return function() {
            var params = {
                "action": "edit",
                "format": "json",
                "pageid": parseInt(pageid),
                "text": pageContent,
                "summary": odlinkajRazlog,
                "tags": "odlinkaj-ivi104",
                "minor": 1,
                "nocreate": 1
            };

            return $.Deferred(function(deferred) {
                var promise = api.postWithToken('csrf', params);
                console.log("params:");
                console.log(params);
                promise.done(function(data) {
                    successCount++;
                    document.getElementById("ivi104-odlinkaj-success").innerText = "[Uspjelo: " + successCount + "/";
                    // console.log("PromiseSuccess: ");
                    // console.log(data);
                });
                promise.fail(function(data) {
                    failCount++;
                    failed.push(pageid);
                    document.getElementById("ivi104-odlinkaj-fail").innerText = "Nije uspjelo: " + failCount + "]";
                    console.log("PromiseError: ");
                    console.log(data);
                    console.log(failed);
                });
                promise.always(function() {
                    deferred.resolve();
                });
            });
        };
    }

    // Make a chain of deferred objects. We chain them rather than execute them in
    // parallel so that we don't make 1000 simultaneous delete requests and bring the
    // site down. We use deferred objects rather than the promise objects returned
    // from the API request so that the chain continues even if some articles gave
    // errors.


    document.getElementById('ivi104-odlinkaj-status').innerText = 'Radim... ';
    var deferred = odlinkajAPI(pagesArray[0], pagesArray[1], odlinkajRazlog)();
    for (var i = 2; i < pagesArray.length; i++) {
        console.log("i: ", i);
        deferred = deferred.then(odlinkajAPI(pagesArray[i], pagesArray[i + 1], odlinkajRazlog));
        i++;
    }

    // Show the output and do cleanup once all the requests are done.
    $.when(deferred).then(function() {
        document.getElementById('ivi104-odlinkaj-status').innerText = 'Završeno! ';
        document.getElementById('ivi104-odlinkaj-status').style.backgroundColor = 'greenyellow';
        window.alert('Sakrivanje završeno! Molim osvježite stranicu.');
    });
}