MediaWiki:Gadget-patrolCount.js
外观
注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的更改的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
- Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
- Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5。
/* <pre> */
/**
* -------------------------------------------------------------------------
* !!! DON'T MODIFY THIS PAGE MANUALLY, YOUR CHANGES WILL BE OVERWRITTEN !!!
* -------------------------------------------------------------------------
*/
var _addText = '{{GHIACode|page=GHIA:MoegirlPediaInterfaceCodes/blob/master/src/gadgets/patrolCount/MediaWiki:Gadget-patrolCount.js|user=[[U:AnnAngela]]|longId=ce13c202dcc17282c237f263ba777e2112fdbcb5|shortId=ce13c20|message=refactor(patrolCount): stop using deprecated `rctoken`}}';
"use strict";
$(function () {
if (mw.config.get("wgAction") !== "view") {
return;
}
var namespaceWatched = [
"(main)",
"template",
];
var apiPrefix = "".concat(mw.config.get("wgServer")).concat(mw.config.get("wgScriptPath"), "/api.php");
var newPageMax = 50;
var writeCountNum = function (pages, plus) {
var strCount = "";
var page;
if (pages.length !== 0) {
var vNum = Math.round(Math.random() * (pages.length - 1));
page = pages[vNum];
var link = "".concat(encodeURIComponent(page.title), "&redirect=no&rcid=").concat(page.rcid);
strCount = pages.length.toString();
if (plus) {
strCount += "+";
}
var title = page.title;
if (!page.confidence) {
title += '" class="patrollListNotConfident';
}
strCount = "(<a id=\"unpatrollArticle\" href=\"".concat(mw.config.get("wgServer")).concat(mw.config.get("wgScriptPath"), "/index.php?title=").concat(link, "\" title=\"").concat(title, "\">").concat(strCount, "</a>)");
ptPatrollLink.attr("href", "".concat(mw.config.get("wgServer")).concat(mw.config.get("wgScriptPath"), "/index.php?title=Special:\u6700\u65B0\u9875\u9762&hidepatrolled=1"));
}
else {
ptPatrollLink.attr("href", "".concat(mw.config.get("wgServer")).concat(mw.config.get("wgScriptPath"), "/index.php?title=Special:\u6700\u65B0\u9875\u9762&hidepatrolled=0"));
}
$("span#not-patrolled-count").html(strCount);
generateList(pages);
return page;
};
var showAllUnbind = [];
var showAll = false;
var prepareList = function (pages, countMax) {
var $list = $("#patrollTooltipList").empty();
var addItem = function (istart, iend) {
for (var idx = istart; idx < iend; ++idx) {
var page = pages[idx];
var link = "".concat(encodeURIComponent(page.title), "&redirect=no&rcid=").concat(page.rcid);
var shortTitle = page.title;
if (shortTitle.length > 8) {
shortTitle = "".concat(shortTitle.slice(0, 7), "...");
}
var item = $("<li></li>").html("<a href=\"".concat(mw.config.get("wgServer")).concat(mw.config.get("wgScriptPath"), "/index.php?title=").concat(link, "\" title=\"").concat(page.title, "\">").concat(shortTitle, "</a>")).appendTo($list);
if (!page.confidence) {
item.addClass("patrollListNotConfident");
}
}
};
var length = pages.length;
if (length > countMax && !showAll) {
addItem(0, countMax);
var $showAll_1 = $("#patrollListShowAll");
if ($showAll_1.length === 0) {
$showAll_1 = $("<div></div>", {
id: "patrollListShowAll"
}).css({
"text-align": "right",
"font-weight": "bold",
"margin-bottom": "10px"
}).append($("<a></a>", {
text: "more...",
href: "#patrollListShowAll",
title: "Show all unpatrolled articles"
}));
$list.after($showAll_1);
}
else {
$showAll_1.show();
}
$showAll_1.off("click");
$showAll_1.on("click", function () {
addItem(countMax, length);
$showAll_1.hide();
for (var idx = 0; idx < showAllUnbind.length; ++idx) {
showAllUnbind[idx].off("mouseover.autohide mouseout");
}
showAll = true;
});
}
else {
addItem(0, pages.length);
}
};
var loadCvtooltip = function () {
$("body").append($("<div></div>", {
id: "patrollTooltip",
style: "display: none;"
}).css({
"font-size": "0.75em",
"margin-right": "30px"
}).append($("<ul></ul>", {
id: "patrollTooltipList"
})));
(function ($) {
$.fn.cvtooltip = function (options) {
var self = $(this);
var defaults = {
panel: "body",
selector: "",
width: 0,
left: 0,
top: 0,
delay: -1,
speed: 600,
close: true,
callback: function () {
$.noop();
}
};
var param = $.extend({}, defaults, options || {});
var controlID = self.attr("ID");
var cvToolTipCssBtm = "position: absolute; border-color: transparent transparent #A7D7F9 transparent; border-style: dashed dashed solid dashed; border-width: 7px 7px 7px 7px; width: 0; overflow: hidden; right:40px; top:-17px;";
var cvToolTipCssTop = "position: absolute; border-color: transparent transparent #A7D7F9 transparent; border-style: dashed dashed solid dashed; border-width: 7px 7px 7px 7px; width: 0; overflow: hidden; right:40px; top:-17px;";
var cvToolTipCss = "z-index:713; display:none; position: absolute; border: 3px solid #A7D7F9; background-color: #F3F3F3; line-height:14px; border-radius: 10px; right:".concat(param.left, "px; top:").concat(param.top, "px;");
if (param.width !== 0) {
cvToolTipCss += "width: ".concat(param.width, "px;");
}
if (!document.getElementById("".concat(controlID, "Body"))) {
var cvTipsElement = $("<div>");
cvTipsElement.attr({
id: "".concat(controlID, "Body"),
"class": "cvToolTip",
style: cvToolTipCss
});
var cvTipsElementBtm = $("<span>");
cvTipsElementBtm.attr("style", cvToolTipCssBtm);
cvTipsElement.append(cvTipsElementBtm);
var cvTipsElementTop = $("<span>");
cvTipsElementTop.attr("style", cvToolTipCssTop);
cvTipsElement.append(cvTipsElementTop);
var cvTipsElementContent = $("<span>");
cvTipsElementContent.attr("id", "".concat(controlID, "Content"));
cvTipsElementContent.css("float", "left");
cvTipsElement.append(cvTipsElementContent);
if (param.close) {
var cvTipsElementClose = $("<a>");
cvTipsElementClose.attr("id", "".concat(controlID, "Close"));
cvTipsElementClose.css("display", "none");
cvTipsElementClose.html('<span style="float:right; font-family:verdana; position: absolute; top:1px; right:5px; font-size:12px; cursor:pointer;">x</span>');
cvTipsElement.append(cvTipsElementClose);
}
$(param.panel).append(cvTipsElement);
}
var cttBody = $(document.getElementById("".concat(controlID, "Body")));
var cttContent = $(document.getElementById("".concat(controlID, "Content")));
var cttClose = $(document.getElementById("".concat(controlID, "Close")));
cttBody.show();
var ctt = {
body: cttBody,
content: function () {
self.show();
return self;
},
position: function () {
var p = $(param.selector).position();
cttBody.css({
top: p.top + param.top,
left: p.left + param.left
});
},
hide: function () {
cttClose.hide();
cttBody.off();
cttContent.slideUp(param.speed, function () {
ctt.content().hide().appendTo($(param.panel));
cttBody.remove();
});
param.callback();
},
timer: null,
show: function () {
if (cttContent.html() === "") {
cttContent.append(ctt.content()).css("height", "".concat(cttContent[0].scrollHeight, "px")).hide().slideDown(param.speed, function () {
cttContent.css("height", "");
cttBody.on({
mouseover: function () {
cttClose.show();
},
mouseout: function () {
cttClose.hide();
}
});
});
}
if (param.selector !== "") {
ctt.position();
}
if (param.delay >= 0) {
setTimeout(ctt.hide, param.delay);
}
}
};
ctt.show();
cttClose.on("click", ctt.hide);
return ctt;
};
})(jQuery);
};
var ttListShow = false;
var generateList = function (pages) {
if (ttListShow) {
prepareList(pages, 10);
}
else {
var timer_1 = null;
var $ptPatroll_1 = $("#pt-patroll").off("mouseover.autohide mouseout");
$ptPatroll_1.on("mouseover", function () {
if (timer_1) {
return;
}
timer_1 = setTimeout(function () {
timer_1 = null;
if (pages.length !== 0 && !ttListShow) {
if (typeof $.fn.cvtooltip === "undefined") {
loadCvtooltip();
}
prepareList(pages, 10);
ttListShow = true;
var ctt_1 = $("#patrollTooltip").cvtooltip({
left: $(window).width() - ($("#pt-patroll").offset().left + $("#pt-patroll").outerWidth()),
top: $("#pt-patroll").offset().top + $("#pt-patroll").height() + 10,
callback: function () {
ttListShow = false;
showAll = false;
$ptPatroll_1.off("mouseover.autohide mouseout");
}
});
var tipCloseTimer_1;
var clearHideTimer = function () {
if (tipCloseTimer_1) {
clearTimeout(tipCloseTimer_1);
tipCloseTimer_1 = null;
}
};
ctt_1.body.on("mouseover.autohide", clearHideTimer);
$ptPatroll_1.on("mouseover.autohide", clearHideTimer);
var setHideTimer = function () {
if (!tipCloseTimer_1) {
tipCloseTimer_1 = setTimeout(ctt_1.hide, 1000);
}
};
ctt_1.body.on("mouseout", setHideTimer);
$ptPatroll_1.on("mouseout", setHideTimer);
showAllUnbind = [ctt_1.body, $ptPatroll_1];
}
}, 500);
$ptPatroll_1.on("mouseout", function () {
if (timer_1) {
clearTimeout(timer_1);
timer_1 = null;
}
});
});
}
};
var missingPage = {};
var checkMissing = function (pages, plus) {
var missingQuery = [];
for (var idx = 0; idx < pages.length; ++idx) {
var title = pages[idx].title;
if (typeof title === "undefined") {
continue;
}
var isMissing = missingPage[title];
if (typeof isMissing === "undefined") {
missingQuery.push(title);
}
else if (isMissing) {
pages.splice(idx, 1);
}
}
if (missingQuery.length !== 0) {
var pagesStr = missingQuery.join("|");
var checkMissingURI = "".concat(apiPrefix, "?action=query&format=xml&prop=info");
$.post(checkMissingURI, {
titles: pagesStr
}, function (result) {
var regenerate = false;
$(result).find("pages page").each(function () {
var $this = $(this);
var isMissing = typeof $this.attr("missing") !== "undefined";
var title = $this.attr("title");
missingPage[title] = isMissing;
if (isMissing) {
for (var idx = 0; idx < pages.length; ++idx) {
if (pages[idx].title === title) {
pages.splice(idx, 1);
break;
}
}
if (title === $("#unpatrollArticle").attr("title")) {
regenerate = true;
}
}
});
if (regenerate) {
writeCountNum(pages, plus);
}
});
}
};
var addPatrollLink = (function () {
var checked = false;
var addlink = function (page) {
var $patrollinks = $("<a></a>", {
href: "index.php?title=".concat(encodeURIComponent(page.title), "&rcid=").concat(encodeURIComponent(page.rcid)),
text: "标记此页面为已巡查"
});
var $divPatrolllink = $("<div></div>", {
"class": "patrollink"
}).append("[").append($patrollinks).append("]");
$("div.printfooter").before($divPatrolllink);
var markAsPatrol = function (e) {
e.preventDefault();
var data = {
rcid: page.rcid,
token: page.rctoken
};
var uri = "".concat(apiPrefix, "?format=xml&action=patrol");
$patrollinks.text("Marking as patrolled...");
$patrollinks = $patrollinks.parent();
$.post(uri, data, function (data, status) {
if (status === "success") {
$patrollinks.html('<span style="color:green">Marked as patrolled</span>');
if (typeof kAjaxPatrolLinks_closeafter !== "undefined" && window.kAjaxPatrolLinks_closeafter === true) {
window.close();
window.open("http://toolserver.org/~krinkle/close.html", "_self");
}
}
else {
$patrollinks.html('<span style="color:red">Cannot mark as patrolled</span>');
}
});
};
$patrollinks.on("click", markAsPatrol);
};
return function (pages) {
if (!checked && $("div.patrollink").length === 0) {
var pageName = mw.config.get("wgPageName");
for (var idx = 0; idx < pages.length; ++idx) {
var page = pages[idx];
if (page.title === pageName) {
addlink(page);
break;
}
}
checked = true;
}
};
})();
var namespaceList = mw.config.get("wgNamespaceIds");
var namespaceWatchList = namespaceWatched.map(function (i) {
return namespaceList[i === "(main)" ? "" : i];
});
var lastRequest = 0;
var updateUnpatrolled = function () {
var d = new Date();
if (d - lastRequest < 10000) {
return;
}
lastRequest = d;
var requestid = d.getTime();
var newPages = "".concat(apiPrefix, "?action=query&format=xml&list=recentchanges&rctype=new&rcnamespace=").concat(namespaceWatchList.join("|"), "&rcshow=!redirect|!patrolled&meta=tokens&type=patrol&rcprop=title|ids|user|tags");
$.get(newPages, {
rclimit: newPageMax,
requestid: requestid
}, function (result) {
var pages = [];
var jqResult = $(result);
jqResult.find("rc").each(function () {
var $self = $(this);
var confidence = typeof $self.attr("anon") === "undefined" && $self.find("tag").length === 0;
var t = {
title: $self.attr("title"),
rcid: $self.attr("rcid"),
rctoken: jqResult.find("tokens"),
confidence: confidence
};
pages.push(t);
});
addPatrollLink(pages);
var plus = jqResult.find("query-continue").length !== 0;
if (pages.length !== 0) {
checkMissing(pages, plus);
}
writeCountNum(pages, plus);
});
};
updateUnpatrolled();
var ptPatrollLink = $("<a></a>", {
href: "Special:最新页面?hidepatrolled=1",
title: wgULS("最新页面", "最新頁面"),
text: wgULS("最新页面", "最新頁面")
});
$("body #p-personal ul li#pt-watchlist").after($("<li></li>", {
id: "pt-patroll"
}).append(ptPatrollLink).append($("<span></span>", {
id: "not-patrolled-count"
})));
$("#pt-patroll").on("mouseover", updateUnpatrolled);
});
/* </pre> */