Benutzer:P.Copp/scripts/manualarchive.js
< Benutzer:P.Copp | scripts
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
- Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
// 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( /§ion=([^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