User:Fumple/common.js: Difference between revisions

From Inkipedia, the Splatoon wiki
m (Fixed infinite loop)
m (Temporarly disabled code)
Line 52: Line 52:
$(".-context-menu-media-load-tab").click(function (e) { window.open("/wiki/" + e.target.previousSibling.previousSibling.innerHTML) })
$(".-context-menu-media-load-tab").click(function (e) { window.open("/wiki/" + e.target.previousSibling.previousSibling.innerHTML) })


/*
//Page-specific script
//Page-specific script
//Define vars
//Define vars

Revision as of 15:16, 23 August 2019

function resolveID(id) {
    var replaced = id.replaceAll(".26", "&");
    replaced = replaced.replaceAll(".21", "!");
    replaced = replaced.replaceAll(".28", "(");
    replaced = replaced.replaceAll(".29", ")");
    replaced = replaced.replaceAll(".CF.89", "ω");
    replaced = replaced.replaceAll(".7E", "~");
    replaced = replaced.replaceAll(".27", "'");
    replaced = replaced.replaceAll(".40", "@");
    replaced = replaced.replaceAll(".23", "#");
    replaced = replaced.replaceAll(".24", "$");
    replaced = replaced.replaceAll(".25", "%");
    return replaced;
}
String.prototype.replaceAll = function (search, replacement) {
    var target = this;
    return target.split(search).join(replacement);
};
//Had to do a one line string due to MediaWiki JS restrictions
var contextmenu = "<div class='-context-menu-media-load -context-menu' style='display:none;position: absolute;' name='-context-menu'><div class='-context-menu-text -context-menu-media-load-file'>File not set</div><div class='-context-menu-item -context-menu-media-load-open noselect'>Open file page</div><div class='-context-menu-item -context-menu-media-load-tab noselect'>Open file page in new tab</div></div>";
//I know I could avoid some lines but I don't really want to change how it is
var el = document.createElement("div");
el.innerHTML = contextmenu;
document.body.append(el);
$(".load-media").contextmenu(function (e) {
    if (e.target.tagName != "DIV") {
        return;
    }
    $(".-context-menu").css("display", "block")
        .css("top", e.pageY)
        .css("left", e.pageX);
    if (e.target.id == "") {
        $(".-context-menu-media-load-file").text(resolveID(e.target.parentElement.id.split("|")[0]));
    }
    else {
        $(".-context-menu-media-load-file").text(resolveID(e.target.id.split("|")[0]));
    }
    e.preventDefault();
    return false;
});
$(document).click(function (e) {
    var t = $(e.target);
    if (t.hasClass("-context-menu-text") || t.hasClass("-context-menu-item")) {
        return;
    }
    $(".-context-menu").css("display", "none")
})
$(document).contextmenu(function (e) {
    $(".-context-menu").css("display", "none")
})
$(".-context-menu-media-load-open").click(function (e) { window.location = "/wiki/" + e.target.previousSibling.innerHTML })
$(".-context-menu-media-load-tab").click(function (e) { window.open("/wiki/" + e.target.previousSibling.previousSibling.innerHTML) })

/*
//Page-specific script
//Define vars
var mwSkin = mw.config.get("skin")
var pageTypes = {};
pageTypes.globalJS = 'MediaWiki:Common.js/' + mw.config.get("wgPageName");
pageTypes.globalCSS = 'MediaWiki:Common.css/' + mw.config.get("wgPageName");
pageTypes.skinJS = 'MediaWiki:' + mwSkin + '.js/' + mw.config.get("wgPageName");
pageTypes.skinCSS = 'MediaWiki:' + mwSkin + '.css/' + mw.config.get("wgPageName");
pageTypes.userJS = 'User:' + mw.config.get("wgUserName") + '/common.js/' + mw.config.get("wgPageName");
pageTypes.userCSS = 'User:' + mw.config.get("wgUserName") + '/common.css/' + mw.config.get("wgPageName");
pageTypes.userSkinJS = 'User:' + mw.config.get("wgUserName") + '/' + mwSkin + '.js/' + mw.config.get("wgPageName");
pageTypes.userSkinCSS = 'User:' + mw.config.get("wgUserName") + '/' + mwSkin + '.css/' + mw.config.get("wgPageName");

function checkPage(type, exist) {
    if (exist == null) {
        new mw.Api().get({
            action: 'parse',
            page: type,
            prop: ""
        }).done(function (data) {
            checkPage(type, true)
        }).fail(function (data) {
            checkPage(type, false)
        });
    }
    else if (exist) {
        if (getTypeByValue(type).endsWith("JS")) {
            mw.loader.load('/w/index.php?title=' + pageEnc(type) + '&action=raw&ctype=text/javascript');
        }
        else {
            mw.loader.load('/w/index.php?title=' + pageEnc(type) + '&action=raw&ctype=text/css', 'text/css');
        }
        $("#p-namespaces ul").append('<li><span><a href="/w/index.php?title=' + pageEnc(type) + '">' + getTypeByValue(type) + '</a></span></li>');
        checkNextPage(type)
    }
    else if (!exist) {
        $("#p-namespaces ul").append('<li class="new"><span><a href="/w/index.php?title=' + pageEnc(type) + '&amp;action=edit&amp;redlink=1">' + getTypeByValue(type) + '</a></span></li>');
        checkNextPage(type)
    }
}

function checkNextPage(type) {
    switch (type) {
        case pageTypes.globalJS:
            checkPage(pageTypes.globalCSS);
            break;
        case pageTypes.globalCSS:
            checkPage(pageTypes.skinJS);
            break;
        case pageTypes.skinJS:
            checkPage(pageTypes.skinCSS);
            break;
        case pageTypes.skinCSS:
            if (mw.config.get("wgUserName") != null) {
                checkPage(pageTypes.userJS);
            }
            break;
        case pageTypes.userJS:
            if (mw.config.get("wgUserName") != null) {
                checkPage(pageTypes.userCSS);
            }
            break;
        case pageTypes.userCSS:
            if (mw.config.get("wgUserName") != null) {
                checkPage(pageTypes.userSkinJS);
            }
            break;
        case pageTypes.userSkinJS:
            if (mw.config.get("wgUserName") != null) {
                checkPage(pageTypes.userSkinCSS);
            }
            break;
    }
}

function pageEnc(string) {
    return encodeURIComponent(string);
}

function getTypeByValue(value) {
    return Object.keys(pageTypes).find(function (key) { return pageTypes[key] === value });
}

//Check page specific files
onApiReady(function () {
    checkPage(pageTypes.globalJS);
});

function onApiReady(callback) {
    if (mw.Api != null) {
        setTimeout(callback, 0);
    } else {
        setTimeout(onApiReady.bind(null, callback), 0);
    }
}


/*
Safety checklist:
- XSS - Done
- Only authorized people - Done
*/