User:A2569875/Scripts/DYKChecker.js

维基百科,自由的百科全书

注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。

var targetUser = "a2569875";
var DYK_String =`
*[[氯氧化鉲]]
*[[Minecraft]]
*[[八元數]]
*[[60面體]]
`;
const CREATE = "Create";
const DYK = "DYK";
var check_lists = [[],[]];
DYK_String.replace(/\*\s*\[\[([^\]\|]+)[\]\|]/ig,function(str, data){
	if(check_lists[0].indexOf(data) < 0) check_lists[0].push(data);
});
var title_list = {};
var title_list_calc = [[],[]];
var allArticleListMap = {};
var allArticleList = [];
const user_name_checker = new RegExp(targetUser.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'),'i');
var getItem = function(obj, key){
	if ( typeof (obj[key]) !== 'undefined' && obj[key] !== null ) return obj[key];
	var num_key = parseInt(key);
	if(!Number.isNaN(num_key))return obj[num_key];
	return undefined;
};
var createTable = function(){
	console.log(allArticleList);
	var body = 	"{| class=wikitable\n"+
				"! 序號 !! 條目 !! 事件 !! 日期\n|-\n";
	for(var i=0; i<allArticleList.length; ++i){
		var it = allArticleList[i];
		const type_display = {
			[CREATE]:"創建新條目",
			[DYK]:DYK,
		};
		var csses = "";
		if(it.events.length > 1){
			csses += `rowspan=${it.events.length} `
		}
		body += `! ${csses} | ${i+1}\n`;
		body += `! ${csses} | [[${it.title}]]\n`;
		for(var j=0; j<it.events.length; ++j){
			body += `|| ${type_display[it.events[j].type]} || ${it.events[j].time.toLocaleString()}\n|-\n`;
		}
	}
	body += "|}";
	console.log(body);
};
var readAllPage = function(){
	var article_map = {};
	const orderedAllArticleListMap = Object.keys(allArticleListMap).sort().reduce(
	  (obj, key) => { 
		obj[key] = allArticleListMap[key]; 
		return obj;
	  }, 
	  {}
	);
	for(var it in orderedAllArticleListMap){
		var this_time = parseInt(it);
		if(!Number.isNaN(this_time)){
			var article_data = orderedAllArticleListMap[it];
			article_data.time = new Date(this_time);
			if(typeof (article_data.title) !== 'undefined' && article_data.title != null){
				var article_title = article_data.title;
				var article_index = allArticleList.length;
				if (typeof (article_map[article_title]) !== 'undefined' && article_map[article_title] !== null){
					for (var i=0; i<allArticleList.length; ++i){
						if (allArticleList[i].title === article_data.title){
							article_index = i;
							break;
						}
					}
				}else{
					article_map[article_title] = true;
					allArticleList.push({
						title:article_data.title,
						events:[]
					});
				}
				allArticleList[article_index].events.push({
					type:article_data.type,
					time:article_data.time
				});
			}
		}
	}
	createTable();
};
var doCreateCheckerFlag = false;
var doCreateChecker = function(){
	if (doCreateCheckerFlag) return;
	doCreateCheckerFlag = true;

	var create_article_list = [];
	var create_article_list_queue = [];
	for(var it in title_list){
		if(getItem(title_list, it).types.indexOf(CREATE) >= 0 ){
			if(create_article_list.indexOf(it) < 0){
				create_article_list.push(it);
				create_article_list_queue.push(it);
			}
		}
	}
	var all_article_count = create_article_list.length;
	for(var i=0; i < create_article_list.length; ++i){
		var params = {
			"action": "query",
			"format": "json",
			"prop": "revisions|pageprops",
			"titles": create_article_list[i],
			"formatversion": "2",
			"rvprop": "timestamp|user|comment",
			"rvslots": "main",
			"rvlimit": "1",
			"rvdir": "newer",
			"ppprop": "disambiguation"
		};
		var api = new mw.Api();
		api.get(params).done(data => {
			var query = data.query || {};
			var pages = query.pages || [];
			var pagedata = pages[0] || pages['*'];
			var p_flag = !data || !query || !pagedata;
			if ( typeof (pagedata) !== 'undefined' && pagedata !== null ) {
				var pageprops = pagedata.pageprops || {};
				var revisions = (pagedata.revisions || [])[0] || {};
				var author_user_check = user_name_checker.exec(revisions.user || '');
				if(typeof (author_user_check) !== 'undefined' && author_user_check !== null && typeof (author_user_check[0]) !== 'undefined' && (typeof(pageprops.disambiguation) === 'undefined' || pageprops.disambiguation === null)
				){
					var time_data = new Date(revisions.timestamp).getTime();
					allArticleListMap[time_data] = {
						type:CREATE,
						title:pagedata.title,
					};
				}
				var progress = Math.round((1-create_article_list_queue.length/all_article_count)*100*1000)/1000;
				console.log(`loading page title "${pagedata.title}"...${progress}%`);
				const index = create_article_list_queue.indexOf(pagedata.title);
				if (index > -1) { // only splice array when item is found
				  create_article_list_queue.splice(index, 1); // 2nd parameter means remove one item only
				}
				if(create_article_list_queue.length <= 0){
					readAllPage();
				}
			}
		});
	}
};
var doDYKChecker = function(){
	var dyk_article_list = [];
	var dyk_article_list_queue = [];
	for(var it in title_list){
		if(getItem(title_list, it).types.indexOf(DYK) >= 0 ){
			if(dyk_article_list.indexOf(it) < 0){
				dyk_article_list.push(it);
				dyk_article_list_queue.push(it);
			}
		}
	}
	for(var i=0; i < dyk_article_list.length; ++i){
		new mw.Api().get({
			action: 'parse',
			page: 'Talk:' + dyk_article_list[i],
			prop: 'wikitext',
			format: 'json'
		}).done(data => {
			var data_list = [];
			var wikitext = data.parse.wikitext[0] || data.parse.wikitext['*'] || '';
			var wikititle_checker = /talk:(.*)$/i.exec(data.parse.title);
			var title = '';
			if (typeof (wikititle_checker) !== 'undefined' && wikititle_checker !== null && typeof (wikititle_checker[1]) !== 'undefined'){
				title = wikititle_checker[1];
			}
			if(title.trim()===''){return;}
			if(wikitext.trim()===''){return;}
			wikitext.replace(/\{\{\s*DYK.+((\s*\|.+)+)\s*\}\}/ig, function(str, data){data_list.push(data);});
			var check_flag = true;
			for(var j=0; j<data_list.length; ++j){
				var author_check = /\|\s*author\s*=\s*([^\|]+)/i.exec(data_list[j]);
				if (typeof (author_check) !== 'undefined' && author_check !== null && typeof (author_check[1]) !== 'undefined'){
					var curUser = author_check[1].trim();
					var author_user_check = user_name_checker.exec(curUser);
					
					if(typeof (author_user_check) !== 'undefined' && author_user_check !== null && typeof (author_user_check[0]) !== 'undefined'){
						var time_check = /\|\s*timestamp\s*=\s*([^\|]+)/i.exec(data_list[j]);
						var rvid_check = /\|\s*re?vid\s*=\s*([^\|]+)/i.exec(data_list[j]);
						if(typeof (time_check) !== 'undefined' && time_check !== null && typeof (time_check[1]) !== 'undefined'){
							var this_time = parseInt(time_check[1]);
							if(!Number.isNaN(this_time)){
								allArticleListMap[this_time*1000] = {
									type:DYK,
									title:title,
								};
							}
							console.log(`${title} at ${this_time}`);
							const index = dyk_article_list_queue.indexOf(title);
							if (index > -1) { // only splice array when item is found
							  dyk_article_list_queue.splice(index, 1); // 2nd parameter means remove one item only
							}
							if(dyk_article_list_queue.length <= 0){
								doCreateChecker();
							}
							check_flag = false;
						}else if(typeof (rvid_check) !== 'undefined' && rvid_check !== null && typeof (rvid_check[1]) !== 'undefined'){
							new mw.Api().get({
								"action": "query",
								"format": "json",
								"prop": "revisions",
								"revids": rvid_check[1],
								"formatversion": "2",
								"rvprop": "timestamp",
								"rvslots": "main"
							}).done((function(_title){
								return function(_data){
									var query_data = _data.query.pages[0] || _data.query.pages['*'] || {};
									var rv_data = query_data.revisions[0] || query_data.revisions['*'] || {};
									if(typeof (rv_data.timestamp) !== 'undefined' && rv_data.timestamp !== null){
										var this_time = parseInt(new Date(rv_data.timestamp).getTime());
										if(!Number.isNaN(this_time)){
											allArticleListMap[this_time] = {
												type:DYK,
												title:_title,
											};
										}
										console.log(`${_title} at ${this_time}`);
									}
									const index = dyk_article_list_queue.indexOf(_title);
									if (index > -1) { // only splice array when item is found
									  dyk_article_list_queue.splice(index, 1); // 2nd parameter means remove one item only
									}
									if(dyk_article_list_queue.length <= 0){
										doCreateChecker();
									}
								};
							})(title));
							check_flag = false;
						}
					}
				}
			}
			if(check_flag){
				console.log(`${title} at ${this_time} (not found)`);
				const index = dyk_article_list_queue.indexOf(title);
				if (index > -1) { // only splice array when item is found
				  dyk_article_list_queue.splice(index, 1); // 2nd parameter means remove one item only
				}
				if(dyk_article_list_queue.length <= 0){
					doCreateChecker();
				}
			}
		});
	}
};
var pageReq = new XMLHttpRequest();
pageReq.addEventListener("load", function() {
	var result_html = this.responseText;
	var result_tabledata = $(result_html).find('#pages-created').find("table").find("tr");
	for (var it=0; it<result_tabledata.length; ++it) {
		var $it = $(result_tabledata[it]);
		var data_cells = $it.find("td");
		var got_a = false;
		for (var jt=0; jt<data_cells.length; ++jt) {
			var $cell = $(data_cells[jt]);
			var find_a = $cell.find("a");
			if (find_a.length > 0){
				got_a = true;
				break;
			}
		}
		if (got_a && typeof (data_cells[1]) !== 'undefined' && data_cells[1] !== null) {
			var article_cell = $(data_cells[1]);
			var article_name = article_cell.attr("data-value");
			if(check_lists[1].indexOf(article_name) < 0) check_lists[1].push(article_name.replace("_"," "));
		}
	}
	for(var i=0; i<check_lists.length; ++i){
		for(var j=0; j<check_lists[i].length; ++j){
			var cur_title = check_lists[i][j];
			var oReq = new XMLHttpRequest();
			oReq.inputTitle = cur_title;
			oReq.articleType = ([DYK,CREATE])[i];
			oReq.index_i = i;
			oReq.index_j = j;
			oReq.addEventListener("load", function() {
				var check_title = /\"wgPageName\"\s*:\"(([^\\\"]|\\.)+)\"/.exec(this.responseText);
				if (typeof (check_title) !== 'undefined' && check_title !== null && typeof (check_title[1]) !== 'undefined'){
					var check_title_result = check_title[1].replace("_"," ");
					title_list[check_title_result] = title_list[check_title_result] || {types:[]};
					title_list[check_title_result].types.push(([DYK,CREATE])[this.index_i]);
					title_list_calc[this.index_i].push(check_title_result);
					const index = check_lists[this.index_i].indexOf(this.inputTitle);
					if (index > -1) { // only splice array when item is found
					  check_lists[this.index_i].splice(index, 1); // 2nd parameter means remove one item only
					}
				}
				var progress = Math.round((1-check_lists[this.index_i].length/(check_lists[this.index_i].length+title_list_calc[this.index_i].length))*100*1000)/1000;
				console.log(`loading ${this.articleType} page title "${this.inputTitle}"...${progress}%`);
				if(check_lists[1].length <= 0 && check_lists[0].length <= 0){
					doDYKChecker();
				}
			});
			oReq.open("GET", "https://zh.wikipedia.org/wiki/"+encodeURIComponent(cur_title));
			oReq.send();
		}
	}
});
pageReq.open("GET", "https://xtools.wmflabs.org/pages/zh.wikipedia.org/"+encodeURIComponent(targetUser)+"/0/noredirects/live");
pageReq.send();