MediaWiki:ArchiveTool/code.js

var archiveListTemplate = window.archiveListTemplate || 'ArchiveList'; var archivePageTemplate = window.archivePageTemplate || 'ArchivePage';

if ( wgNamespaceNumber % 2 === 1 && wgAction === "view" ) { $(function {		function api(q, fn) {			q.format = 'json';			return $.post(wgScriptPath + '/api.php', q, fn, "json");		}		function token(page, fn) {			api({ action: 'query', query: 'prop', prop: 'info', titles: page, intoken: 'edit' }, function(q) { for ( var k in q.query.pages ) return fn(q.query.pages[k]); });		}		function startArchiving {			var c = archiveListTemplate.substr(0,1);			var archiveListRegex = '['+c.toUpperCase+c.toLowerCase+']'+archiveListTemplate.substr(1);			var bc = $('#bodyContent').addClass('archiving').empty;			$('')				.attr({src: stylepath+'/common/progress-wheel.gif'}).appendTo(bc);			api({ action: 'query', prop: 'revisions', titles: wgPageName, rvprop: 'timestamp|content' }, function(q) { bc.empty; var rev = q.query.pages[wgArticleId].revisions[0]; var time = rev.timestamp; var talkToken, tokenTime; var content = rev['*']; token(wgPageName, function(p) {					talkToken = p.edittoken;					tokenTime = p.starttimestamp;				}); var lines = content.split('\n'); var table = $(' ').appendTo(bc); var ul = $(' ').appendTo(table); for ( var l = 0; l < lines.length; l++ ) { var line = lines[l]; $(' ').toggleClass('noarchive', (new RegExp('^\\{\\{'+archiveListRegex+'\}\}')).test(line)) .attr({line:line}) .append( $(' ').text(line).append(' ') ).appendTo(ul); }				var sections = []; var sectionEnd = lines.length-1; for ( var l = lines.length-1; l >= 0; l-- ) { var line = lines[l]; if ( /^=.+?=/.test(line) || l === 0 ) { var section = { start: l, end: sectionEnd }; section.length = section.end - section.start + 1; sections.unshift(section); sectionEnd = l-1; }				}				var section; while( section = sections.shift ) { var tr = ul.children.eq(section.start); $(' ').attr({rowspan: section.length}).appendTo(tr); }				$(' ').append(					$('Archive all').click(function(e) { e.preventDefault; ul.children('tr').addClass('archive'); }), ' ',					$('Deselect all').click(function(e) { e.preventDefault; ul.children('tr').removeClass('archive'); }), ' ',					$('Finish archiving (save)').click(function(e) { archive; })				).prependTo(bc).clone(true).appendTo(bc); var click = false; var add; table.mousedown(function(e) {					e.preventDefault;					var $li = $(e.target).closest('tr');					if(!$li.length) return;					var $section = $(e.target).closest('.section');					if ( $section.length ) {						var slist = $li.nextAll(':lt('+(parseInt($section.attr('rowspan'),10)-1)+')').andSelf;						var sadd = slist.filter(function { return !$(this).hasClass('archive') }).length;						slist.toggleClass('archive', !!sadd);						return;					}					click = true;					add = !$li.hasClass('archive');					$li.toggleClass('archive', !!add);				}); table.mouseover(function(e) {					if (!click) return;					var $li = $(e.target).closest('tr');					if(!$li.length) return;					$li.toggleClass('archive', !!add);				}); $('body').mouseup(function(e) {					click = false;				}); function archive { var talkLines = []; var archiveLines = []; ul.children.each(function {						var arr = $(this).hasClass('noarchive') || !$(this).hasClass('archive')							? talkLines : archiveLines;						arr.push( $(this).attr('line') );					}); if ( !/^\{\{[Aa]rchiveList\}\}/.test(talkLines[0]) ) talkLines = [, ].concat(talkLines); archiveLines = [, ].concat(archiveLines); bc.empty; $('') .attr({src: stylepath+'/common/progress-wheel.gif'}).appendTo(bc); //$(' ').text(talkLines.join('\n')).appendTo(bc); //$(' ').text(archiveLines.join('\n')).appendTo(bc); runArchive(talkLines.join('\n'), archiveLines.join('\n')); }				var archiveTitle; function runArchive(talkContent, archiveContent) { var archiveNo; function findArchives { var m = $(' Finding archive id: ').appendTo(bc); api({							action: 'query',							list: 'allpages',							apnamespace: wgNamespaceNumber,							apprefix: wgTitle+'/Archive',							aplimit: 1,							apdir: 'descending'						}, function(q) {							archiveNo = q.query.allpages.length ?								parseInt(q.query.allpages[0].title.substr(wgPageName.length+"/Archive".length),10)+1 :								1;							archiveTitle = wgPageName+'/Archive '+archiveNo;							m.append('done... (using '+archiveNo+')');							saveArchive;						}); }					function saveArchive { var m = $(' Finding token for '+archiveTitle+': ').appendTo(bc); token(archiveTitle, function(p) {							m.append('done...');							m = $(' Saving archive page: ').appendTo(bc);							api({ action: 'edit', title: archiveTitle, text: archiveContent, token: p.edittoken, summary: "Archiving via the archive tool from "+wgPageName+".", minor: true, createonly: true }, function(q) { if ( q.error && q.error.code === "articleexists" ) { m.append('failed...'); bc.append(" The archive page we tried to create already exists. "); return abort; }								m.append('done...'); saveTalk; });						});					}					function saveTalk { var m = $(' Finding token for '+wgPageName+': ').appendTo(bc); m.append('done...'); m = $(' Updating talk page: ').appendTo(bc); api({							action: 'edit',							title: wgPageName,							text: talkContent,							token: talkToken,							summary: "Archiving via the archive tool -> "+archiveTitle+".",							minor: true,							basetimestamp: time,							starttimestamp: tokenTime						}, function(q) {							if ( q.edit.result === "Success" ) {								m.append('done...');								bc.find('.ajax').remove;								location.reload;							} else {								m.append('failed...');								bc.append(" Failed to update talkpage, you may wish to have the archive subpage we just created deleted. ");								return abort;							}						}); }					function abort { bc.find('.ajax').remove; bc.append(" Aborting... "); bc.append(' You may wan\'t to refresh and try again. '); }					// start findArchives; }			});		}		$(' Archive')			.click(startArchiving)			.appendTo('#page_controls');	}); }