Участник:KPu3uC B Poccuu/template doc cat.js

Материал из Википедии — свободной энциклопедии
//<nowiki>
var tdc_cinfo='';//,tdc_pages=new Array(500),tdc_batchSize;//batch of 500 pages to process & size of batch if less than 500
var tdc_docpattern=new RegExp('(?:<noinclude>)?\s*{{(?:docpage|Documentation subpage|Template navigation)}}\s*(?:<\/noinclude>)','i');
var tdc_doctemp='<noinclude>{{docpage}}</noinclude>';//prepends the content of page not matching above RegExp
var editToken='+\\';//fill out later
var tdc_inputdiv,tdc_outputdiv,tdc_togglebutt,tdc_emptylog=true,tdc_stopped=true,tdc_actions=0;
var tdc_maxactions=0;//means unlimited

function tdc_init()
{
	editToken=mw.user.tokens.get('editToken');
	tdc_inputdiv=document.getElementById('contentSub');
	tdc_inputdiv.innerHTML=tdc_inputdiv.innerHTML+'<div style="color:black;font-size:medium"><fieldset>\
<legend>Настройка скрипта категоризации</legend>\
<span style="white-space: nowrap"><label for="tdc_maxactions" title="Остановиться после этого количества действий">Остановиться после:</label>&#160;<input type="text" name="tdc_maxactions" id="tdc_maxactions" title="Остановиться после этого количества действий"/></span><p>\
<input type="submit" value="Пуск"/ id="tdc_toggle" onClick="tdc_toggle()"></fieldset></div>';
	tdc_togglebutt=document.getElementById('tdc_toggle');
	document.getElementById('mw-content-text').innerHTML='<span id="tdc_nodata" style="color:gray">Нет данных для отображения.</span>\
<table style="width:100%"><tr style="vertical-align:top"><td width="50%"><b>Консоль:</b><ol id="tdc_log"></ol></td><td width="50%"><b>Список страниц</b><ol id="tdc_pages"></ol></td></tr></table>';
	tdc_outputdiv=document.getElementById('tdc_pages');
}

$(tdc_init);

function padTime(time)
{
	if(time<10)return '0'+time;else return time;
}

function tdc_logerror(error)
{
	function logline()
	{
		var date=new Date();
		return '<li>['+padTime(date.getHours())+':'+padTime(date.getMinutes())+':'+padTime(date.getSeconds())+']: <span class="error">'+error+'</span></li>';
	}
	if(!tdc_emptylog)$('#tdc_log').append(logline());else document.getElementById('tdc_log').innerHTML=logline();
	tdc_emptylog=false;
}

function tdc_logwarning(warning)
{
	function logline()
	{
		var date=new Date();
		return '<li>['+padTime(date.getHours())+':'+padTime(date.getMinutes())+':'+padTime(date.getSeconds())+']: <strong>'+warning+'</strong></li>';
	}
	if(!tdc_emptylog)$('#tdc_log').append(logline());else document.getElementById('tdc_log').innerHTML=logline();
	tdc_emptylog=false;
}

function tdc_editpage(page,summary,content,section,timestamp,recreate,nocreate,onSuccess,OnAPIerror,OnRequestError)
{
	var data=
	{
		format:'json',action:'edit',title:page,text:content,token:editToken,minor:'1',bot:'1',watchlist:'nochange'
	};
	if(summary)data.summary=summary;
	if(section)data.section=section;
	if(recreate)data.recreate="";
	if(nocreate)data.nocreate="";
	if(timestamp)
		{
			data.basetimestamp=timestamp;
			data.starttimestamp=timestamp;
		}
	$.ajax(
	{
		url:mw.util.wikiScript('api'),data:data,dataType:'json',type:'POST',async:false,success:function(data)
		{
			if(data&&data.edit&&data.edit.result=='Success')onSuccess(data);else if(data&&data.error)OnAPIerror(data);
		},error:function(xhr)
		{
			OnRequestError(xhr);
		}
	});
}

function tdc_processpage(page)
{
	var basepageRE=/^([\S\s]+?)\/doc$/i.exec(page);
	var basepage=basepageRE[1];
	$.ajax(
	{
		url:mw.util.wikiScript('api'),data:
		{
			format:'json',action:'query',prop:'info|revisions',titles:page+'|'+basepage,rvprop:'content',rvsection:'0'
		},datatype:'json',async:false,success:function(data)
		{
			if(data&&data.query&&data.query.pages)
			{
				var basepageID=-1;
				var pageID=-1;
				for(var ID in data.query.pages)
				{
					if(data.query.pages[ID].title=basepage)basepageID=ID;
					else pageID=ID||-1;
				}
				//tdc_logwarning('[debug] basepageID='+basepageID+', pageid='+pageID+'.');
				if(!data.query.pages[basepageID].missing)//base page exists, process doc page
				{
					$('#tdc_nodata').hide('fast');
					$('#tdc_pages').append('<li title="'+page+'"><img alt="?"  src="//upload.wikimedia.org/wikipedia/commons/thumb/5/5b/Pictogram_voting_question.svg/15px-Pictogram_voting_question.svg.png" width="15" height="15"/>&#160;<a href="'+mw.util.getUrl(page)+'" class="internal" target="_blank">'+page+'</a> (в процессе).</li>');
					var content=data.query.pages[pageID].revisions[0]['*'];
					//console.log(content);
					if(!tdc_docpattern.test(content))//no docpage template, fixing
					{
						var onSuccess=function(data)
						{
							$('li[title|="'+page+'"]').html('<img alt="?"  src="//upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Yes_check.svg/15px-Yes_check.svg.png" width="15" height="15"/>&#160;<a href="'+mw.util.getUrl(page)+'" class="internal" target="_blank">'+page+'</a> (исправлено).</li>');
							tdc_actions++;
							tdc_stopped=tdc_maxactions&&tdc_actions>=tdc_maxactions;
							if(tdc_stopped)tdc_logwarning('совершено '+tdc_actions+' правок. Остановлено.');
						};
						var onAPIError=function(data)
						{
							tdc_logerror('ошибка API «'+data.error.code+'»: '+data.error.info+'.');
							$('li[title|="'+page+'"]').html('<img alt="?" src="//upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Pictogram_voting_oppose.svg/15px-Pictogram_voting_oppose.svg.png" width="15" height="15"/>&#160;<a href="'+mw.util.getUrl(page)+'" class="internal" target="_blank">'+page+'</a> (ошибка, обратитесь к консоли).</li>');
						};
						var onRequestError=function(xhr)
						{
							tdc_logerror('ошибка HTTP-запроса.');
							$('li[title|="'+page+'"]').html('<img alt="?" src="//upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Pictogram_voting_oppose.svg/15px-Pictogram_voting_oppose.svg.png" width="15" height="15"/>&#160;<a href="'+mw.util.getUrl(page)+'" class="internal" target="_blank">'+page+'</a> (ошибка, обратитесь к консоли).</li>');
						};
						content=(tdc_doctemp+'\n'+content).replace(/<\/(includeonly|noinclude)>\s+<(includeonly|noinclude)>/ig,'</$1><$2>');
						//alert(content);
						//tdc_actions++;
						//tdc_stopped=tdc_maxactions>0&&tdc_actions>=tdc_maxactions;
						//if(tdc_stopped)tdc_logwarning('совершено '+tdc_actions+' правок. Остановлено.');
						tdc_editpage(page,'Робот: оформление страницы документации',content,'0',data.query.pages[pageID].timestamp,false,true,onSuccess,onAPIError,onRequestError);
					}else $('li[title|="'+page+'"]').html('<img alt="?"  src="//upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Yes_check.svg/15px-Yes_check.svg.png" width="15" height="15"/>&#160;<a href="'+mw.util.getUrl(page)+'" class="internal" target="_blank">'+page+'</a> (уже было исправлено).</li>');
				}else//no basepage, doc page is abandoned and needs to be moved following the basepage or deleted, if basepage deleted
				{
					
				}
			}
		}
	});
}

function tdc_toggle()
{
	tdc_stopped=!tdc_stopped;
	if(tdc_stopped)
	{
		tdc_logwarning('скрипт остановлен.');
		tdc_togglebutt.value='Пуск';
	}else
	{
		$('#tdc_toggle').attr('disabled','disabled');
		tdc_logwarning('скрипт запущен.');
		tdc_togglebutt.value='запущен…';
		tdc_maxactions=+$('#tdc_maxactions').val();
		tdc_actions=0;
		while(!tdc_stopped)
		{
			var data=
			{
				format:'json',action:'query',list:'querypage',qppage:'Uncategorizedtemplates',qplimit:'500'
			};
			if(tdc_cinfo>0)data.qpoffset=tdc_cinfo;
			$.ajax(
			{
				url:mw.util.wikiScript('api'),data:data,dataType:'json',async:false,success:function(data)
				{
					if(data&&data.query&&data.query.querypage&&data.query.querypage.results)
					{
						for(var id in data.query.querypage.results)
						{
							if(tdc_stopped)break;
							if(/^[\S\s]*?\/doc$/i.test(data.query.querypage.results[id].title))tdc_processpage(data.query.querypage.results[id].title);
						}
						//tdc_logwarning('[debug] continue info='+tdc_cinfo+', actions='+tdc_actions+', max actions='+tdc_maxactions+'.');
						if(data['query-continue']&&data['query-continue'].querypage)tdc_cinfo=+data['query-continue'].querypage.qpoffset;
						else
						{
							tdc_stopped=true;
							tdc_logwarning('нет больше данных для работы. Остановлено.');
						}
					}else if(data&&data.error)
					{
						tdc_logerror('ошибка API «'+data.error.code+'»: '+data.error.info+'.');
						tdc_togglebutt.value='Пуск';
						tdc_stopped=true;
					}else
					{
						tdc_logerror('ошибка: неизвестный ответ API.');
						tdc_togglebutt.value='Пуск';
						tdc_stopped=true;
					}
				},error:function(xhr)
				{
					tdc_logerror('ошибка  HTTP-запроса.');
					tdc_togglebutt.value='Пуск';
					tdc_stopped=true;
				}
			});
		}
		tdc_logwarning('остановлено.');
	}
}//</nowiki>