Szerkesztő:Nyenyec/userfilter.js
Megjelenés
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();
})