Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Internet Explorer/Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Strg+F5
// Erlaubt das einfachere manuelle Archivieren von Diskussionsseiten

// Disabled due to  [[phab:T72470]]
if( false /* wgNamespaceNumber == 4 || wgNamespaceNumber % 2 == 1 */ ) {

importScript( 'Benutzer:P.Copp/scripts/wiki.js' ); // [[Benutzer:P.Copp/scripts/wiki.js]]
importScript( 'Benutzer:P.Copp/scripts/preprocessor.js' ); // [[Benutzer:P.Copp/scripts/preprocessor.js]] <nowiki>

var manualArchive = {
	init : function() {
		manualArchive.sel = {};
		var editlinks = getElementsByClassName( document, 'span', 'mw-editsection' );
		var parents = [];
		for( var i = 0; i < editlinks.length; i++ ) {
			var m = editlinks[i].childNodes[1].href.match( /&section=([^T0][^&]*)/ );
			if( !m ) continue;
			var level = editlinks[i].parentNode.nodeName.charAt( 1 );
			var sec = new manualArchive.Section( m[1], level );
			for( var j = level - 1; j > 0; j-- ) if( parents[j] ) parents[j].childs.push( sec );
			parents[level] = sec;
			for( var j = level + 1; j < 6; j++ ) parents[j] = false;
			editlinks[i].parentNode.appendChild( sec.checkbox );
		}
	},
	createBox : function() {
		this.box = document.createElement( 'div' );
		this.box.className = 'manualarchive-input';
		var targetlink = this.link( 'Ziel für alle ändern', function() {
			manualArchive.target = prompt( 'Ziel angeben:', manualArchive.target );
			for( var i in manualArchive.sel ) if( manualArchive.sel[i].target )
				delete manualArchive.sel[i].target;
			manualArchive.refreshBox();
		});
		var cancellink = this.link( 'Abbrechen', function() {
			for( var i in manualArchive.sel ) if( manualArchive.sel[i].num ) {
				manualArchive.sel[i].checkbox.checked = false;
				manualArchive.sel[i].onchange();
			}
		});
		var savelink = this.link( 'Archivieren', '#' );
		savelink.onclick = function() {
			manualArchive.box.removeChild( targetlink );
			manualArchive.box.removeChild( cancellink );
			manualArchive.box.replaceChild( document.createTextNode( 'Archiviere...' ), savelink );
			manualArchive.save();
			return false;
		};
		this.box.appendChild( savelink );
		this.box.appendChild( document.createTextNode( ' | ' ) );
		this.box.appendChild( targetlink );
		this.box.appendChild( document.createTextNode( ' | ' ) );
		this.box.appendChild( cancellink );
		document.body.appendChild( this.box );
	},
	load : function( query ) {
		this.loaded = true;
		var query = 'action=query&prop=info|revisions&intoken=edit&rvprop=user|timestamp|content' + query;
		this.callApi( query, '', function( res ) {
			if( !res.query || !res.query.pages ) return;
			for( var i in res.query.pages ) if( res.query.pages[i].edittoken ) {
				var p = res.query.pages[i];
				manualArchive.token = p.edittoken;
				manualArchive.timestamp = p.revisions[0].timestamp;
				manualArchive.user = p.revisions[0].user;
				manualArchive.dom = Wiki.preprocessToObject( p.revisions[0]['*'], false );
				break;
			}
			manualArchive.refreshBox();
		});
	},
	extractSections : function() {
		var pp = Wiki.ppFrame;
		this.remain = '';
		var sec = false;
		var target = false;
		for( var i = 0; i < this.dom.parts[0].length; i++ ) {
			var node = this.dom.parts[0][i];
			if( node.type == 'h' ) {
				if( this.sel[node.index] ) sec = this.sel[node.index];
				else if( sec && node.level <= sec.level ) sec = false;
			} else if( node.type == 'template' ) {
				var page = Wiki.getPage( pp.expandPart( node.parts[0] ).trim(), 10 );
				if( page && ( page.ptitle == 'Vorlage:Autoarchiv' || page.ptitle == 'Vorlage:Autoarchiv-Erledigt' ) ) {
					var params = pp.extractParams( node );
					var param = pp.getParam( params, 'Ziel' );
					if( param !== false ) target = param.replace( /^\s*'\s*|\s*'\s*$/g, '' );
					param = pp.getParam( params, 'Kopfvorlage' );
					if( param !== false ) this.headtpl = param;
				}
			}
			if( sec ) sec.newtext += pp.expand( node );
			else this.remain += pp.expand( node );
		}
		if( !this.target ) this.target = target || '((Lemma))/Archiv';
		//Check for conflicts
		for( var i in this.sel ) if( this.sel[i].num ) {
			var sec = this.sel[i];
			if( sec.text && sec.text != sec.newtext ) return true;
			sec.text = sec.newtext;
			sec.newtext = '';
		}
	},
	createList : function() {
		if( this.dom && this.extractSections() ) {
			alert( 'Abschnitt wurde zwischenzeitlich verändert, bitte neu laden und erneut versuchen.' );
			return false;
		}
		var ul = document.createElement( 'ul' );
		this.count = 0;
		var targets = {};
		this.targetlist = [];
		for( var i in this.sel ) if( this.sel[i].num ) {
			var parent = this.sel[i].checkbox.parentNode;
			var heading = getInnerText( getElementsByClassName( parent, 'span', 'mw-headline' )[0] );
			var target = this.sel[i].getTarget();
			var li = document.createElement( 'li' );			
			li.appendChild( document.createTextNode( heading + '  ' ) );
			li.appendChild( this.sel[i].targetChangeLink() );
			if( !targets[target] ) {
				var tgt = document.createElement( 'li' );
				targets[target] = document.createElement( 'ul' );
				tgt.appendChild( document.createTextNode( target.replace( /_/g, ' ' ) ) );
				tgt.appendChild( targets[target] );
				ul.appendChild( tgt );
				this.targetlist.push( target );
			}
			targets[target].appendChild( li );
			this.count++;
		}
		return this.count ? ul : false;
	},
	refreshBox : function() {
		if( !this.box ) this.createBox();
		if( !this.loaded ) this.load( '&revids=' + wgCurRevisionId );
		var ul = this.createList();
		if( ul ) {
			this.box.style.display = 'block';
			if( !this.list ) this.box.appendChild( ul );
			else this.box.replaceChild( ul, this.list );
			this.list = ul;
			if( this.disabled ) this.save();
		} else this.box.style.display = 'none';
	},
	save : function() {
		if( !this.disabled ) {
			this.disabled = true;
			appendCSS( '.manualarchive-check, .manualarchive-input li a {display:none;}' );
		}
		var summary = this.count + ' Abschnitt' + ( this.count > 1 ? 'e' : '' ) + ' nach [['
			+ this.targetlist.join( ']],[[' ) + ']] archiviert - letzte Bearbeitung: [[Benutzer:'
			+ this.user + '|' + this.user + ']] (' + this.timestamp + ')';
		var query = 'action=edit&nocreate&minor&title=' + this.enc( wgPageName )
			+ '&token=' + this.enc( this.token ) + '&summary=' + this.enc( summary )
			+ '&basetimestamp=' + this.enc( this.timestamp );
		this.callApi( query, 'text=' + this.enc( this.remain ), function( res ) {
			if( res.error && res.error.code == 'editconflict' )	manualArchive.load( '&pageids=' + wgArticleId );
			else if( res.edit && res.edit.nochange === '' ) alert( 'Abschnitt(e) wurde(n) bereits archiviert.' );
			else {
				if( res.edit && res.edit.result == 'Success' ) manualArchive.saveArchives();
				return true;
			}
		});
	},
	saveArchives : function() {
		for( var i = 0; i < this.targetlist.length; i++ ) {
			var text = '\n\n';
			var count = 0;
			for( var j in this.sel ) if( this.sel[j].target == this.targetlist[i] ) {
				text += this.sel[j].text;
				count++;
			}
			this.saveArchive( this.targetlist[i], text, count );
		}
	},
	saveArchive : function( title, text, count ) {
		var summary = count + ' Abschnitt' + ( count > 1 ? 'e' : '' ) + ' aus [['
			+ wgPageName.replace( /_/g, ' ' ) + ']] archiviert';
		var query = 'action=edit&nocreate&minor&title=' + this.enc( title )
			+ '&token=' + this.enc( this.token ) + '&summary=' + this.enc( summary );
		this.callApi( query, 'appendtext=' + this.enc( text ), function( res ) {
			if( res.error && res.error.code == 'missingtitle' )
				manualArchive.createArchive( title, text, summary );
			else return true;
		});
	},
	createArchive : function( title, text, summary ) {
		var query = 'action=edit&createonly&minor&title=' + this.enc( title )
			+ '&token=' + this.enc( this.token ) + '&summary=' + this.enc( summary );
		var prepend = '{{' + ( this.headtpl || 'Archiv' ) + '|' + wgPageName.replace( /_/g, ' ' ) + '}}';
		this.callApi( query, 'text=' + this.enc( prepend + text ), function() { return true; } );
	},
	callApi : function( query, data, cb ) {
		var method = data ? 'POST' : 'GET';
		var url = wgScriptPath + '/api.php?format=json&' + query;
		$.ajax({
			type: method,
			url: url,
			data: data || '',
			dataType: 'json',
			success: function( res ) {
				if( cb( res ) ) {
					if( res.edit && res.edit.result == 'Success' )
						manualArchive.createDifflink( res.edit );
					else if( res.error && confirm( 'Fehler beim Speichern der Seite: '
						+ res.error.info + '\nErneut versuchen?' ) ) manualArchive.callApi( query, data, cb );
				}
			}
		});
	},
	createDifflink : function( res ) {
		this.linknum = ( this.linknum || 0 ) + 1;
		var link = this.link( '[' + this.linknum + ']', wgArticlePath.replace( /\$1/g,
			'?oldid=' + ( res.oldrevid || res.newrevid ) + ( res.oldrevid ? '&diff=' + res.newrevid : '') ) );
		this.box.insertBefore( link, this.list );
		this.box.insertBefore( document.createTextNode( '  ' ), this.list );
		if( this.linknum == this.targetlist.length + 1 ) {
			this.box.firstChild.nodeValue = 'Fertig.';
			var closelink = this.link( 'Schließen', function() { manualArchive.box.style.display = 'none';} );
			this.box.insertBefore( closelink, this.list );
		}
	},
	link : function( text, href ) {
		var a = document.createElement( 'a' );
		a.appendChild( document.createTextNode( text ) );
		if( typeof href == 'string' ) a.href = href;
		else {
			a.href = '#';
			a.onclick = function() { href(); return false; };
		}
		return a;
	},
	enc : encodeURIComponent
};

manualArchive.Section = function( num, level ) {
	var self = this;
	this.num = num;
	this.level = level;
	this.text = '';
	this.newtext = '';
	this.checkbox = document.createElement( 'input' );
	this.checkbox.type = 'checkbox';
	this.checkbox.className = 'manualarchive-check';
	this.checkbox.title = 'Diesen Abschnitt inkl. aller Unterabschnitte archivieren';
	this.checkbox.onclick = function() { return self.onchange(); };
	this.childs = [];
};
manualArchive.Section.prototype.onchange = function() {
	if( manualArchive.disabled ) return false;
	if( this.checkbox.checked )	manualArchive.sel[this.num] = this;
	else delete manualArchive.sel[this.num];
	for( var i = 0; i < this.childs.length; i++ ) {
		this.childs[i].checkbox.checked = this.checkbox.checked;
		this.childs[i].checkbox.disabled = this.checkbox.checked;
		if( this.checkbox.checked ) delete manualArchive.sel[this.childs[i].num];
	}
	manualArchive.refreshBox();
};
manualArchive.Section.prototype.targetChangeLink = function() {
	var self = this;
	return manualArchive.link( 'Ziel ändern', function() {
		self.target = Wiki.getPage( prompt( 'Neues Ziel angeben:', self.target ) ).ptitle;
		manualArchive.refreshBox();
	});
};
manualArchive.Section.prototype.getTarget = function() {
	function sameCase( a, b ) {
		if( b.charAt( 0 ).match( /[a-z]/ ) ) return a;
		if( b.length>1 && b.charAt( 1 ).match( /[a-z]/ ) ) return a.charAt( 0 ).toUpperCase() + a.substr( 1 );
		return a.toUpperCase();
	}
	function getWeek( date ) {
		function thursday( date ) { return new Date(date.getTime() + (3-((date.getDay()+6) % 7)) * 86400000); }
		firstweek = thursday(new Date(thursday(date).getFullYear(),0,4));
		return Math.floor(1.5+(thursday(date).getTime()-firstweek.getTime())/604800000);
	}
	if( !this.text ) return '';
	if( this.target ) return this.target;	
	var m;
	var months = {'jan': 0,'feb': 1,'mar': 2,'mär': 2,'apr': 3,'may': 4,'mai': 4,'jun': 5,
	              'jul': 6,'aug': 7,'sep': 8,'oct': 9,'okt':10,'nov':10,'dec':11,'dez':11};
	var regex = /(\d\d?)\.?\s*([a-zäA-ZÄ]{3})[a-zäA-ZÄ]{0,6}\.?\s*(20\d\d)\s*\((?:CES?T|UTC|MES?Z)\)/g;
	var date = new Date().getTime();
	while( m = regex.exec( this.text ) ) {
		var month = months[m[2].toLowerCase()];
		if( typeof month == 'undefined' ) continue;
		date = Math.min( new Date( m[3], month, m[1] ).getTime(), date );
	}
	var date = new Date( date );
	var res = '';
	var index = 0;
	var regex = /\(\(\s*([^\):\s]*)\s*(?::\s*([^\)\s]*))?\s*\)\)/g;
	while( m = regex.exec( manualArchive.target ) ) {
		res += manualArchive.target.substring( index, m.index );
		index = m.index + m[0].length;
		var lc = m[2] ? m[2].toLowerCase() : '';
		switch( m[1].toLowerCase() ) {
			case 'tag':
				var ret = lc == 'kurz' || lc == 'lang'
					? ['sonntag','montag','dienstag','mittwoch','donnerstag','freitag','samstag'][date.getDay()]
					: date.getDate();
				if( lc == 'kurz' ) ret = ret.substr( 0, 2 );break;
			case 'monat':
				var ret = lc == 'kurz' || lc == 'lang'
					? ['januar','februar','märz','april','mai','juni','juli','august','september','oktober','november','dezember'][date.getMonth()]
					: date.getMonth() + 1;
				if( lc == 'kurz' ) ret = ret.substr( 0, 3 );break;
			case 'quartal':
				var ret = Math.floor( date.getMonth() / 3 ) + 1;
				if( lc == 'i' ) ret = ['','i','ii','iii','iv'][ret];		
				break;
			case 'halbjahr':
				var ret = Math.floor( date.getMonth() / 6 ) + 1;
				if( lc == 'i' ) ret = ['','i','ii'][ret];
				break;
			case 'woche':var ret = getWeek( date );break;
			case 'jahr':var ret = date.getFullYear();break;
			case 'lemma':var ret = wgPageName;break;
			default: var ret = m[0];
		}		
		if( lc == '##' && typeof ret == 'number' ) res += ret < 10 ? '0' + ret : ret;
		else if( lc ) res += sameCase( ret, m[2] );
		else res += ret;
	}
	return this.target = Wiki.getPage( res + manualArchive.target.substring( index ) ).ptitle;
};

$( manualArchive.init );
appendCSS('.manualarchive-input {position:fixed;left:0;bottom:0;z-index:100;background-color:#fff9ee;'
	+ 'font-size:115%;border:2px solid grey;padding:0.3em;width:40%;max-height:60%;overflow:auto;}\n'
	+ '.manualarchive-input li {font-weight: bold;}\n.manualarchive-input li li {font-weight: normal;}\n'
	+ '.manualarchive-check {float:right;}\n.manualarchive-input a {font-size:96%;}');
} //end if