User:Zhangjintao/新页面巡查入门指南/巡查员工具集
建议在巡查过程中使用这些工具,在后文的介绍中,我们会提到这些工具的用法。
安装好工具了吗?点击右边的箭头了解开始巡查第一个页面的方法。 |
工具介绍
- Twinkle,增加快速提报速删、存废、请求保护,标记维护性模板,回退破坏等实用功能,推荐使用。
- New Page Patroller,在左边栏加入一个表格,显示最新创建的10个页面。代码使用AJAX每5秒更新一次。
- patrollCount,右上角增加显示目前未巡查条目数量,悬停时显示未巡查条目名单。使用AJAX每10秒更新一次。
- HotCat是一个以JavaScript编写的工具,帮助已注册用户增加、移除及修改页面分类,并具备分类名称联想功能,让用户能直接选取现有的页面分类。这个工具引入自维基共享资源的HotCat原始版本。
当然,也可以考虑使用最近更改巡查的一些兵器:
- Huggle ,可以非常迅速地处理破坏。
- 导航Popup ,利用弹出窗口可以更便捷地把页面回退至早期版本。
- 当然还有更给力的,直接用IRC监视每一筆修改
- Real Time Recent Changes , 一种能让您观察最新更改的工具。
武器选好了,接下来就是正式的巡查之旅了!
Twinkle
或如果您想仅在部分皮肤启用Twinkle:
- 把此下面的文本拷贝到您希望启用之皮肤的脚本頁面:
mw.loader.load(['ext.gadget.Twinkle']);
- 自定义Twinkle:
- 要更改Twinkle的参数设置,你可以访问Twinkle参数设置面板。作出更改并点击页面底部的“保存更改”。然后绕过缓存来使更改生效。
- 得到帮助:
- 文档页面有关于Twinkle的大量信息。如果那个页面没有回答你的问题,请在讨论页提问。IRC用户可以连接到#wikipedia-zhIRC频道。
- 注意:
-
- 中文维基百科的Twinkle拒绝运行在Internet Explorer上(英文版则支持9.0以上之IE)。您可以试用其它浏览器,Twinkle应在其他大部分现代浏览器中工作良好。(请参见Wikipedia:Twinkle/支持的浏览器列表)
- Twinkle设置不再以“FriendlyConfig”的形式保存在你的个人JavaScript文件中。如果你有使用任何旧的FriendlyConfig的配置,他们应该仍然有效。然而,如果你使用参数设置面板来修改你的配置,建议你移除你的皮肤JavaScript文件中所有旧的Friendly配置。
- 請别忘了,您對使用Twinkle的任何操作負上完全的責任。您必須了解維基百科的方針與指引,並遵照這些方針使用該工具,否則有可能導致被封禁的風險。反破坏工具如Twinkle不应该用于撤销对有编辑争议的内容的非破坏性编辑,除非将适当的理由填入编辑摘要。
- 另外,如果需要大量提删不同创建者的关于同一主题的页面,请关闭“通知页面创建者”一项。
New Page Patroller
把此下面的文本拷贝到您希望启用之皮肤的脚本頁面:
mw.loader.load('ext.gadget.npp');
Hotcat
若要安裝HotCat,只須到參數設置並到小工具的欄目裡勾選HotCat即可。
另一方法:
- 複製以下的文字並貼在您的monobook.js頁:
importScript('MediaWiki:Gadget-HotCat.js');
- 儲存您的monobook.js頁面
- 刷新頁面快取
- 完成!
patrollCount
把此下面的文本拷贝到您希望启用之皮肤的脚本頁面:
这里是脚本
/**
Author: ZUO Haocheng [[User:zuohaocheng]]
Email: Please feel free to email me via http://en.wikipedia.org/wiki/Special:EmailUser/Zuohaocheng
电邮: 请通过 http://zh.wikipedia.org/wiki/Special:EmailUser/Zuohaocheng 给我发送电邮
Date: 2011年11月21日 (一) 13:47 (UTC)
用途: 显示当前未巡查的条目数量, 并链接到随机未巡查页面.
Usage: Shows count of un-patrolled articles, and link to random one in them.
*/
$(document).ready(function() {
if (wgAction !== 'view') {
return;
}
var apiPrefix = '/w/api.php';
var newPageMax = 50;
var timeEvent;
var writeCountNum = function(pages, plus) {
var strCount = '';
if (pages.length !== 0) {
var vNum = Math.round( Math.random() * (pages.length-1));
var page = pages[vNum];
var link = '/wiki/' + page['title'] + '?redirect=no&rcid=' + page['rcid'];
strCount = pages.length.toString();
if (plus) {
strCount += '+';
}
var title = page.title;
if (!page.confidence) {
title += '" class="patrollListNotConfident';
}
strCount = '(<a id="unpatrollArticle" href="' + link + '" title="' + title + '">' + strCount + '</a>)';
ptPatrollLink.attr('href', '/wiki/Special:最新页面?hidepatrolled=1');
}
else {
ptPatrollLink.attr('href', '/wiki/Special:最新页面?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 = '/wiki/' + page.title + '?redirect=no&rcid=' + page.rcid;
var shortTitle = page.title;
if (shortTitle.length > 8) {
shortTitle = shortTitle.slice(0, 7) + '...';
}
var item = $("<li></li>").html('<a href="' + link + '" title="' + page.title + '">' + shortTitle + '</a>').appendTo($list);
if (!page.confidence) {
item.addClass('patrollListNotConfident');
}
}
};
var length = pages.length;
if (length > countMax && !showAll) {
addItem(0, countMax);
var $showAll = $("#patrollListShowAll");
if ($showAll.length === 0) {
$showAll = $("<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);
}
else {
$showAll.show();
}
$showAll.unbind("click");
$showAll.click(function() {
addItem(countMax, length);
$showAll.hide();
for (var idx = 0; idx< showAllUnbind.length; ++idx) {
showAllUnbind[idx].unbind("mouseover.autohide mouseout");
}
showAll = true;
});
}
else {
addItem(0, pages.length);
}
};
var ttListShow = false;
var generateList = function(pages) {
if (ttListShow) {
prepareList(pages, 10);
}
else {
var timer = null;
var $ptPatroll = $("#pt-patroll").unbind("mouseover mouseover.autohide mouseout");
$ptPatroll.mouseover(function() {
if (timer) {
return;
}
timer = setTimeout(function() {
timer = null;
if (pages.length !== 0 && !ttListShow) {
if (typeof($.fn.cvtooltip) === 'undefined') {
loadCvtooltip();
}
prepareList(pages, 10);
ttListShow = true;
var ctt = $("#patrollTooltip").cvtooltip({
left: 60,
top: 45,
callback: function() {
ttListShow = false;
showAll = false;
$ptPatroll.unbind("mouseover.autohide mouseout");
}
});
var tipCloseTimer;
var clearHideTimer = function() {
if (tipCloseTimer) {
clearTimeout(tipCloseTimer);
tipCloseTimer = null;
}
};
ctt.body.bind("mouseover.autohide", clearHideTimer);
$ptPatroll.bind("mouseover.autohide", clearHideTimer);
var setHideTimer = function() {
if (!tipCloseTimer) {
tipCloseTimer = setTimeout(ctt.hide, 1000);
}
};
ctt.body.mouseout(setHideTimer);
$ptPatroll.mouseout(setHideTimer);
showAllUnbind = [ctt.body, $ptPatroll];
}
}, 500);
$ptPatroll.mouseout(function() {
if (timer) {
clearTimeout(timer);
timer = 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 = apiPrefix + '?action=query&format=xml&prop=info';
$.post(checkMissingURI, {titles: pagesStr}, function(result) {
var regenerate = false;
$(result).find("pages page").each(function() {
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);
}
});
}
};
return (function(pages) {
if (!checked && ($("div.patrollink").length === 0)) {
var pageName = mediaWiki.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 updateUnpatrolled = function() {
var d = new Date();
var requestid = d.getTime();
var newPages = apiPrefix + '?action=query&format=xml&list=recentchanges&rctype=new&rcnamespace=0&rcshow=!redirect|!patrolled&rctoken=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': $self.attr('patroltoken'),
'confidence': confidence};
pages.push(t);
});
var plus = (jqResult.find('query-continue').length !== 0);
if (pages.length !== 0) {
checkMissing(pages, plus);
}
writeCountNum(pages, plus);
});
};
setInterval(updateUnpatrolled, 10000);
updateUnpatrolled();
//在"监视列表"右边加入"最新页面"以便巡查
var ptPatrollLink = $('<a></a>', {
'href': "/wiki/Special:最新页面?hidepatrolled=1",
'title': '最新页面',
'text': '最新页面'
});
$("body div#mw-head div#p-personal ul li#pt-watchlist").after($('<li></li>', {
'id': 'pt-patroll'
}).append(ptPatrollLink).append($('<span></span>', {
'id': "not-patrolled-count"
})));
});
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"
})));
/*
* JQuery.cvtooltip.js
* http://www.chinavalue.net
*
* J.Wang
* http://0417.cnblogs.ocm
*
* 2010.11.17
*/
(function($) {
$.fn.cvtooltip = function(options) {
var self = $(this);
var defaults = {
panel: "body", //该参数是加载气泡提示的容器,值不同可能会导致计算的位置不同,默认为添加至body容器
selector: "", //用于计算定位的控件
width: 0, //气泡提示宽度,完全手动设置
left: 0, //距离panel参数的左边距
top: 0, //距离panel参数的上边距
delay: -1, //延迟关闭,单位毫秒,值为0时表示立刻关闭
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 #F9E98E transparent; border-style: dashed dashed solid dashed; border-width: 12px 12px 12px 12px; width: 0; overflow: hidden; right:40px; top:-24px;';
var cvToolTipCssTop = 'position: absolute; border-color: transparent transparent #FBF7AA transparent; border-style: dashed dashed solid dashed; border-width: 12px 12px 12px 12px; width: 0; overflow: hidden; right:40px; top:-19px;';
var cvToolTipCss = 'z-index:99998; display:none; position: absolute; border: 3px solid #F9E98E; background-color: #FBF7AA; line-height:14px; border-radius: 10px; right:' + param.left + 'px; top:' + param.top + 'px;';
if (param.width !== 0) {
cvToolTipCss += 'width: ' + param.width + 'px;';
}
//气泡显示
var cvTipsElement = '';
cvTipsElement += '<div id="' + controlID + 'Body" class="cvToolTip" style="' + cvToolTipCss + '">';
cvTipsElement += '<span style="' + cvToolTipCssBtm + '"></span><span style="' + cvToolTipCssTop + '"></span>';
cvTipsElement += '<span id="' + controlID + 'Content" style="float:left;"></span>';
if(param.close){
cvTipsElement += '<a id="' + controlID + 'Close" style="display:none;"><span style="float:right; font-family:verdana; position: absolute; top:1px; right:5px; font-size:12px; cursor:pointer;">x</span></a>';
}
cvTipsElement += '</div>';
if ($("#" + controlID + "Body").length == 0) {
$(param.panel).append(cvTipsElement);
}
//气泡容器、装载内容的容器
var cttBody = $("#" + controlID + "Body");
var cttContent = $("#" + controlID + "Content");
var cttClose = $("#" + 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.unbind();
cttContent.slideUp(param.speed, function(){
ctt.content().hide().appendTo($(param.panel));
cttBody.remove();
});
param.callback();
},
timer: null,
show: function() {
var timer;
if (cttContent.html() == "") {
cttContent.append(ctt.content()).css("height",cttContent[0].scrollHeight + 'px').hide().slideDown(param.speed, function() {
cttContent.css("height", "");
cttBody.mouseover(function(){
cttClose.show();
});
cttBody.mouseout(function(){
cttClose.hide();
});
});
}
if(param.selector != ""){
ctt.position();
}
if (param.delay >= 0) {
timer = setTimeout(ctt.hide, param.delay);
}
}
};
ctt.show();
//关闭气泡
cttClose.click(ctt.hide);
return ctt;
}
})(jQuery);
}