Ugrás a tartalomhoz

Szerkesztő:Nyenyec/userfilter.js

A Wikipédiából, a szabad enciklopédiából

Megjegyzés: közzététel után frissítened kell a böngésződ gyorsítótárát, hogy lásd a változásokat.

  • Firefox / Safari: tartsd lenyomva a Shift gombot és kattints a Frissítés gombra a címsorban, vagy használd a Ctrl–F5 vagy Ctrl–R (Macen ⌘–R) billentyűkombinációt
  • Google Chrome: használd a Ctrl–Shift–R (Macen ⌘–Shift–R) billentyűkombinációt
  • Internet Explorer / Edge: tartsd nyomva a Ctrl-t, és kattints a Frissítés gombra, vagy nyomj Ctrl–F5-öt
  • Opera: Nyomj Ctrl–F5-öt
// This script requires jquery


var userFilter = {
    whitelist: ["Peda", "Nullextrakadémia", "Loldi", "Weiner", "FiRG"],
    blacklist: [],
    // TODO: don't match anchors ( User:XXX#YYY )
    usernameRes : [new RegExp("^http://hu.wikipedia.org/wiki/User:([^/]+)$"),
        new RegExp("^http://hu.wikipedia.org/w/index.php\\?title=User:([^/]+)&action=edit$"),
        new RegExp("^http://hu.wikipedia.org/w/index.php\\?title=User:([^/]+)&action=editredlink$"),
        // new RegExp("^http://hu.wikipedia.org/wiki/User_vita:([^/]+)$")
        ],
    
    showConfig: function showConfig() {
        alert("showConfig");
    },
    
    showConfigLink: function showConfigLink() {
        $("#pt-logout").after("<li id='pt-userfilter'><a href='javascript:userFilter.showConfig()'>User Filter</a></li>");
    }
         
};


function markSignatureLink(index) {
    if (!this.href || !this.title) return;
    // if (this.title.substring(0, 5) != "User:") return;
    
    var user = null;
    var res = userFilter.usernameRes;
    for (var i = 0; i < res.length; i++) {
        var match =res[i](this.href);
        // console.log("" + res[i].source + " for " + this.gref + " -> " + match);
        if (match) {
            user = match[1];
            break;
        }
    }
    if(user) {
        // console.log(this.title);
        setUser(this, user);
        jQuery(this).css("background", "blue");
    }
}

function isSectionHeader(el) {
    return el.nodeName.charAt(0).toLowerCase() == "h";
}

function notSectionHeader(index) { 
    return !isSectionHeader(this);
}

function setUser(el, user) {
    if (!el) return;
    el["signedByUser"] = user;
}

function getUser(el) {
    return el["signedByUser"];
}

function setMixedUser(el) {
    setUser(el, null);
    el["mixedUser"] = true;
}

// Mark the ancestry of the specified element as having mixed signatures.
// This way, subtrees signed by different users won't end up in the same div. 
function markAncestorsAsMixed(elem) {
    if (elem.length > 0) {
        setMixedUser(elem.get());
        markAncestorsAsMixed(elem.parent().not("#bodyContent"));
    }   
}

// Based on marked hrefs set the subtree before and above signature
// as signed by the signee of thre href.
function markParentAndPredecessors(index) {
    var node = jQuery(this);
    var user = this["signedByUser"];
    if (!user) return;
        
    // Contains all elements marked by the current user's signature
    var marked = [];
    traverse:
    while (true) {                
        // Mark predecessors until we find one that is signed by another user
        // or is a section header.
        // Moving upwards on the page.
        var preds = node.prevAll().get();
        for (var i = 0; i < preds.length; i++) {
            var el = preds[i];
            var otherUser = el["signedByUser"]; 
            if (isSectionHeader(el)) {
                break traverse;
            }
            if (otherUser === undefined) {
                // Unsigned
                setUser(el, user);
                marked.unshift(el);
            } else if (otherUser == user) {
                // Signed by the same user
                continue;
            } else {
                // Signed by different user
                markAncestorsAsMixed(node.parent().not("#bodyContent"));
                break traverse;
            }
        }
        
        // See if we can proceed to parent            
        var parent = node.parent().filter(unknownUser).filter(notSectionHeader).not("#bodyContent").get();
        if (parent.length > 0) {
            setUser(parent[0], user);
            marked = [parent[0]];
            // Proceed to next level
            node = jQuery(parent);
        } else {
            break;
        }
    }
}

function isUserKnownEl(elem) {
    return elem["signedByUser"] !== undefined && (!elem["mixedUser"]);
}
function isUserKnown(index) {
    return isUserKnownEl(this);
}

function unknownUser(index) {
    return this["signedByUser"] === undefined;
}

// Wraps subsequent children of the specified element if they
// were signed by the same user.
// If the children are unsigned or mixed, calls itself recursively on them.
function wrapSignedChildren(elem) {
    console.log("Checking " + elem.nodeName);
    var childrenToWrap = [];
    var children = elem.childNodes;
    if (!children) return;
    for (var i = 0; i < children.length; i++) {
        var child = children[i];
        // FIXME: just a test
        if (isUserKnownEl(child)) {
            jQuery(child).wrapAll("<div style='border : 1px dashed blue'></div>");    
        } else {
            wrapSignedChildren(child);
        }
    }
}

function filterUsersFromTalkPage() {
    if (wgCanonicalNamespace != "User_talk") return;
    // First pass: mark signature links only
    $("div#bodyContent a").each(markSignatureLink);
    // Second pass: mark parents and predecessors of signatures
    $("a").filter(isUserKnown).each(markParentAndPredecessors);
    
    // TODO: BFS 
    wrapSignedChildren(document.getElementById("bodyContent"));
    
    // wrapAll("<div style='border : 1px dashed blue'></div>").eq(0).parent().get(0);
    // setUser(newDiv, user);       
}

// TODO: rewrite using jQuery
function filterUserFromWatchlist() {
    if (wgCanonicalSpecialPageName != "Watchlist") return;
    
    var wl = userFilter.whitelist;
    if (wl.length == 0) return;
    
    var lis = document.getElementsByTagName("li");
    
    for (var i = 0; i < lis.length; i++) {       
    	var li = lis[i];				
    	var a = li.getElementsByTagName("a")[3];
    	if (a == undefined) continue;
    	if (a.title.indexOf("User:") == -1) continue;        
    	for (var j = 0; j < wl.length; j++) {
            if (wl[j] == a.title.substring(5)) {
                li.setAttribute("style", "display: none");
                // li.setAttribute("style", "background: yellow;");
            } else {
                // console.log("'" + a.title.substring(5) + "' did not match: " + "'" + wl[j] + "'");
            }
    	}
    }
}

$(function() {
    filterUserFromWatchlist(); 
    filterUsersFromTalkPage();
    userFilter.showConfigLink();
})