User:OsamaK/nfurbacklink.js

From Wikipedia, the free encyclopedia

Note: After saving, you have to bypass your browser's cache to see the changes. In Internet Explorer and Firefox, hold down the Ctrl key and click the Refresh or Reload button. Opera users have to clear their caches through Tools→Preferences, see the instructions for Opera. Konqueror and Safari users can just click the Reload button.

// This is auto save version of [[User:Ilmari Karonen/nfurbacklink.js]]
// Copyright holder is [[User:Ilmari Karonen]]
 
if (wgCanonicalNamespace == "Image" && wgAction == "edit" && /[&?]nfurbacklink=/.test(window.location.search)) {
    addOnloadHook(function () {
        var editform = document.editform;
        if (!editform) return;
        var textbox = editform.wpTextbox1;
        if (!textbox) return;
 
        var previewDiv = document.getElementById("wikiPreview");
 
        var backlink = decodeURIComponent(/[&?]nfurbacklink=([^&]*)/.exec(window.location.search)[1]);
 
        var nfur_tag = " *(:? *[Tt]emplate: *)?([Nn]on-free ((fair )?use|media) r|[Ff]air use r|[Rr])ationale";
        nfur_tag = nfur_tag.replace(/ /g, "[_\\s]").replace(/\(/g, "(?:");
 
        // bonus feature: automatically change "ResolutionReduced" to "Low_resolution"
        textbox.value = textbox.value.replace(new RegExp ("(\\|\s*)ResolutionReduced(\s*=)", "g"), "$1Low_resolution$2");
 
        var new_value = textbox.value.replace(new RegExp ("\\{\\{(" + nfur_tag + "[_ ]*)\n?(\\s*\\|\\s*)"), "{"+"{$1\n$2Article="+backlink+"\n$2");
        var safety_re = new RegExp ("\\{\\{" + nfur_tag + "[_\\s]*(?:\\|[\\s\\S]*)?(?:\\{\\{" + nfur_tag + "[_\\s]*\\||\\|\\s*Article\\s*=)");
 
        if (new_value != textbox.value && !safety_re.test(textbox.value)) {
            textbox.value = new_value;
            if (editform.wpSummary) editform.wpSummary.value = "Adding [[Template:Non-free use rationale|NFUR]] backlink to ["+"["+backlink+"]"+"] with [[User:OsamaK/nfurbacklink.js|javascript assistance]]";
            if (editform.wpMinoredit) editform.wpMinoredit.checked = true;
            if (editform.wpSave) editform.wpSave.click();
        }
        else if (previewDiv) {
            var errorMsg = document.createElement("div");
            errorMsg.style.padding = "4px";
            errorMsg.style.border = "2px solid red";
            errorMsg.style.margin = "1em 0";
            errorMsg.appendChild(document.createTextNode("Unable to fix backlink, please add \""));
            errorMsg.appendChild(document.createElement("code"));
            errorMsg.lastChild.appendChild(document.createTextNode("|Article=" + backlink));
            errorMsg.appendChild(document.createTextNode("\" manually."));
            previewDiv.appendChild(errorMsg);
        }
    });
}
else if (wgCanonicalNamespace == "Image" && wgAction == "view") {
    addOnloadHook(function () {
        var linkList = document.getElementById("filelinks");
        while (linkList && (!linkList.tagName || linkList.tagName.toLowerCase() != "ul")) linkList = linkList.nextSibling;
        if (!linkList) return;
 
        var rationale = false;
        var tables = document.getElementsByTagName("table");
        for (var i = 0; i < tables.length; i++) {
            var summary = tables[i].getAttribute("summary");
            if (summary != "The fair use rationale of this image.") continue;
            if (rationale) return; // more than one rationale
            rationale = tables[i];
        }
        if (!rationale) return;
        tables = null;  // free DOM NodeList object
 
        var links = linkList.getElementsByTagName("a");
        var title = links[0].getAttribute("title");
        if (links.length != 1) title = "";  // should have exactly one link here
        if (/^(Talk|User|Wikipedia|Image|MediaWiki|Template|Help|Category|Portal)( talk)?:/.test(title)) title = "";  // wrong ns
        links = null;  // free DOM NodeList object
 
        var cells = rationale.getElementsByTagName("td");
        for (var j = 0; j < cells.length; j++) {
            if (/^\s*\[\[\{\{\{Article\}\}\}\]\]\s*$/.test(cells[j].textContent)) {
                var cellContent = cells[j].getElementsByTagName("p")[0]; 
                if (!cellContent) cellContent = cells[j];  // fallback, in case markup changes
 
                var fixLink = document.createElement("a");
                fixLink.className = "external";
                fixLink.href = wgScript + "?title=" + encodeURIComponent(wgPageName) + "&action=edit";
                if (title) {
                    fixLink.href += "&nfurbacklink=" + encodeURIComponent(title);
                    fixLink.appendChild(document.createTextNode("set to "));
                    fixLink.appendChild(document.createElement("i"));
                    fixLink.lastChild.appendChild(document.createTextNode(title));
                } else {
                    fixLink.appendChild(document.createTextNode("please fix manually"));
                }
                var fixSpan = document.createElement("span");
                fixSpan.className = "plainlinks";
                fixSpan.appendChild(document.createTextNode(" ["));
                fixSpan.appendChild(fixLink);
                fixSpan.appendChild(document.createTextNode("] "));
                cellContent.appendChild(fixSpan);
            }
        }
    });
}