用戶:Zhangjintao/新頁面巡查入門指南/巡查員工具集

建議在巡查過程中使用這些工具,在後文的介紹中,我們會提到這些工具的用法。

安裝好工具了嗎?點擊右邊的箭頭了解開始巡查第一個頁面的方法

工具介紹

編輯
  • Twinkle,增加快速提報速刪、存廢、請求保護,標記維護性模板,回退破壞等實用功能,推薦使用。
  • New Page Patroller,在左邊欄加入一個表格,顯示最新創建的10個頁面。代碼使用AJAX每5秒更新一次。
  • patrollCount,右上角增加顯示目前未巡查條目數量,懸停時顯示未巡查條目名單。使用AJAX每10秒更新一次。
  • HotCat是一個以JavaScript編寫的工具,幫助已註冊用戶增加、移除及修改頁面分類,並具備分類名稱聯想功能,讓用戶能直接選取現有的頁面分類。這個工具引入自維基共享資源的HotCat原始版本。

當然,也可以考慮使用最近更改巡查的一些兵器:

武器選好了,接下來就是正式的巡查之旅了!

Twinkle

編輯
開始使用
在小工具中點選「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即可。

另一方法:

  1. 複製以下的文字並貼在您的monobook.js頁
    importScript('MediaWiki:Gadget-HotCat.js');
  2. 儲存您的monobook.js頁面
  3. 刷新頁面快取
  4. 完成!

這裏是Hotcat的幫助文檔

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);
}

繞過瀏覽器緩存

編輯