LLWiki正在建设中,欢迎加入我们

MediaWiki:Gadget-patrolRevisions.js

来自LLWiki
跳转到导航 跳转到搜索

注意:在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5Ctrl-R(Mac为⌘-R
  • Google Chrome:Ctrl-Shift-R(Mac为⌘-Shift-R
  • Internet Explorer:按住Ctrl的同时单击刷新,或按Ctrl-F5
  • Opera:前往菜单 → 设置(Mac为Opera → Preferences),然后隐私和安全 → 清除浏览数据 → 缓存的图片和文件
// 引自[[metawikimedia:mediawiki:gadget-patrolRevisions.js]]
"use strict";
/*global mw, $, OO, wgULS*/
const page = mw.config.get( 'wgCanonicalSpecialPageName' ),
	action = mw.config.get('wgAction');
if (action == 'history' || ['History', 'Contributions', 'Recentchanges', 'Watchlist'].includes(page)) {
	mw.util.addCSS( '.row-unpatrolled { background-color: #fff0c2 !important; }' );
	var data = [];
	const api = new mw.Api(),
		text = {confirm: wgULS("您确定要将所有修订标记为为已巡查吗?", "您確定要將所有修訂標示為已巡查嗎?"),
		fail: wgULS('次修订标记失败!请刷新页面后重试。', '次修訂標示失敗!請刷新頁面後重試。'),
		success: wgULS('标记成功!', '標示成功!'), btn: wgULS('标记所有修订为已巡查', '標示所有修訂為已巡查'),
		apiFailure: wgULS('无法获得页面ID!错误原因:', '无法获得页面ID!错误原因:')
	},
		isDesktop = mw.config.get('skin') == 'vector',
		markAsPatrolled = function(revid) { return api.postWithToken('patrol', {action: 'patrol', revid: revid}); },
		process = function() {
		return Promise.allSettled( data.map(function(revid) { return markAsPatrolled( revid ); }) );
	},
		clickBtn = function(e) {
		e.preventDefault();
		OO.ui.confirm( text.confirm ).then(function(res) {
			if (!res) { return; }
			process().then(function(results) {
				const failure = results.filter(function(ele) { return ele.status == 'rejected'; });
				if (failure.length) {
					mw.notify('有' + failure.length + text.fail, {type: 'error'});
					return;
				}
				button.detach();
				$( '.patrolLink, abbr.unpatrolled' ).remove();
				$( '.row-unpatrolled' ).removeClass( 'row-unpatrolled' );
				mw.notify( text.success );
			});
		});
	},
		getRevid = function(ele) {
		const $ele = $(ele);
		return $ele.data( 'mw-revid' ) ||
			(isDesktop ? 0 : parseInt( ($ele.find('a').attr( 'href' ) || '').match(/\d+$/) ));
	},
		highlightUnpatrolled = function(obj, list) {
		const target = obj.filter(function() { return list.includes( getRevid(this) ); }).addClass('row-unpatrolled');
		return target.map(function() { return getRevid(this); }).toArray();
	},
		main = function(selector, param) {
		if ($(selector).length === 0) {
			data = [];
			return Promise.resolve();
		}
		console.log('API request: 开始查询未巡查的页面ID');
		const now = mw.now();
		return api.get( (param || {}).list ? param : $.extend({action: 'query', list: 'recentchanges', rclimit: 'max',
			rcprop: 'ids', rcshow: 'unpatrolled', rctype: ['edit', 'new'], formatversion: 2}, param) )
			.then(function(res) {
			console.log('End API request: 已获得未巡查的页面ID,用时 ' + (mw.now() - now) + ' ms');
			const list = (res.query.recentchanges || res.query.watchlist).map(function(info) { return info.revid; });
			if (list.length === 0) { return; }
			data = highlightUnpatrolled( $(selector), list );
		}, function(reason) { throw reason; });
	},
		main_alt = function(selector) {
		const obj = $('abbr.unpatrolled').parents( selector );
		data = highlightUnpatrolled(obj, obj.map(function() { return getRevid(this); }).toArray());
	},
		apiFailure = function(reason) { mw.notify( text.apiFailure + reason, {type: 'error'} ); },
		button = $('<div>', {html: [ '[', $('<a>', {href: '#', text: text.btn}).click( clickBtn ), ']' ]});
	
	$(function() {
		if (action == 'history') {
			main('#pagehistory > li', {rctitle: mw.config.get( 'wgPageName' )}).then(function() {
				if (data.length) { button.css('float', "right").appendTo( '.mw-checkbox-toggle-controls' ); }
			}, apiFailure);
		}
		else if (page == 'History') {
			main('li.page-summary', {rctitle: mw.config.get( 'wgRelevantPageName' )}).then(function() {
				if (data.length) { button.prependTo( '.content-unstyled' ); }
			}, apiFailure);
		}
		else if (page == 'Contributions') {
			const username = mw.config.get( 'wgRelevantUserName' ) || $('a.mw-mf-user span').text();
			main(isDesktop ? '.mw-contributions-list > li' : 'li.page-summary', {rcuser: username}).then(function() {
				if (data.length === 0) { return; }
				if (isDesktop) { button.css('text-align', 'right').insertAfter( '.mw-pager-navigation-bar' ); }
				else { button.prependTo( '.content-unstyled' ); }
			}, apiFailure);
		}
		else if (['Recentchanges', 'Watchlist'].includes( page )) {
			mw.hook( 'wikipage.content' ).add(function() {
				main_alt('.mw-changeslist table, .mw-changeslist tr, li.mw-changeslist-edit');
				if (data.length) { button.insertBefore( '.mw-changeslist' ); }
				else { button.detach(); }
			});
		}
	});
}