User:A2569875/Scripts/DYKChecker.js
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google Chrome、Firefox、Microsoft Edge及Safari:按住⇧ 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();