User:DannyS712/SectionMover.js

// Originaly by User:Flooded with them hundreds // Copied to User:DannyS712/SectionMover.js after FWTH retired, who took over as maintainer // Install with: // // or with //  // // If forking this script, please give both of use credit $.when( mw.loader.using(['mediawiki.util','mediawiki.api']), $.ready).done( function {	var validSections = {},		fromTos = {},		wikiText = '',		revStamp, startMoveButton, overlay;

if ( mw.config.get( 'wgNamespaceNumber' ) == -1 ) { // is a special page return; }	$( 'head' ).append(		' a.arxylink { font-weight:bold } .arxyhighlight { background-color:#aef9fc } '	);

startMoveButton = mw.util.addPortletLink(		'p-cactions',		'#',		'Move section',		'pt-oeca',		'Enter/exit the process',		null,		null	); overlay = $( document.createElement( 'button' ) ); $( startMoveButton ).click( function ( e ) {		$( '.arxylink' ).click;		$( '.arxy' ).toggle;		$( '#Movebutton' ).toggle;	} ); overlay.html( 'move' ) .attr( 'id', 'Movebutton' ) .css( 'position', 'fixed' ) .css( 'bottom', '20px' ) .css( 'height', '50px' ) .css( 'width', '100%' ) .css( 'font-size', '200%' ); $( document.body ).append( overlay ); overlay.toggle; overlay.click( function ( e ) {		var numOfThreads, archiveTarget, sections, archiveThis, cutOffset,			revisedPage;		function cut( s, start, end ) {			return s.substr( 0, start ) + s.substring( end );		}		cutOffset = numOfThreads = 0;		revisedPage = wikiText;		sections = $( 'a.arxylink' ).map( function { return $( this ).attr( 'data-section' ); } );		if ( !( numOfThreads = sections.length ) ) {			return alert( 'No sections selected, aborting' );		}		archiveTarget = prompt( 'Moving' + numOfThreads + ' sections: where should we move them to?', mw.config.get( 'wgPageName' ) );		if ( !archiveTarget || archiveTarget == mw.config.get( 'wgPageName' ) ) {			return alert( 'No target selected, aborting' );		}		sections.each( function ( i, n ) { revisedPage = cut(				revisedPage,				fromTos[ n ][ 0 ] - cutOffset,				fromTos[ n ][ 1 ] - cutOffset			); cutOffset += fromTos[ n ][ 1 ] - fromTos[ n ][ 0 ]; } );		archiveThis = sections.map( function { return wikiText.substring( fromTos[ this ][ 0 ], fromTos[ this ][ 1 ] ); } ).toArray.join( '' );		console.log( 'archive this:' + archiveThis );		console.log( 'revised page:' + revisedPage );		if ( 1 ) {			new mw.Api.postWithToken( 'csrf', {					action: 'edit', title: mw.config.get( 'wgPageName' ), text: revisedPage, summary: 'Moved sections to ' + archiveTarget + ' using SectionMover', basetimestamp: revStamp, starttimestamp: revStamp }			).done( function ( res1 ) { alert( 'Successfully moved sections from page' ); console.log( res1 ); new mw.Api.postWithToken(					'csrf',					{						action: 'edit',						title: archiveTarget,						appendtext: '\n' + archiveThis,						summary: 'Moved sections from ' + mw.config.get( 'wgPageName' ) + ' using SectionMover'					}				).done( function ( res2 ) {					alert( 'Successfully added sections to page' );				} ).fail( function ( res2 ) {					alert( 'failed to add sections to page. manual inspection needed.' );				} ).always( function ( res2 ) {					console.log( res2 );					window.location.reload;				} ); } ).fail( function ( res1 ) { alert( 'failed to move sections from page. aborting process.' ); console.log( res1 ); window.location.reload; } );		}	} );	new mw.Api.get( {		action: 'parse',		page: mw.config.get( 'wgPageName' )	} ).done( function ( dataShit ) {			var i;			new mw.Api.get( { action: 'query', pageids: mw.config.get( 'wgArticleId' ), prop: [ 'revisions' ], rvprop: [ 'content', 'timestamp' ] } ).done( function ( shit ) { var rv; rv = shit.query.pages[ mw.config.get( 'wgArticleId' ) ].revisions[ 0 ]; wikiText = rv[ '*' ]; revStamp = rv.timestamp; } );			$( dataShit.parse.sections )				.filter( function ( i, s ) { return s.index == parseInt( s.index ) } )				.each( function ( i, s ) { validSections[ s.index ] = s } );			for ( i in validSections ) {				i = parseInt( i );				fromTos[ i ] = [					validSections[ i ].byteoffset,					validSections.hasOwnProperty( i + 1 ) ? validSections[ i + 1 ].byteoffset : Infinity				];			}			$( '#mw-content-text' )				.find( ':header' )				.find( 'span.mw-headline' )				.each( function ( i, title ) { var header, editSection, sectionNumber; header = $( this ).parent; editSection = header.find( '.mw-editsection' ); // 1st child sectionNumber = header.find( '.mw-editsection a:first' ); if ( sectionNumber[ 0 ] ) { sectionNumber = sectionNumber.attr( 'href' ).match( /&section=(\d+)/ ); if ( sectionNumber ) { sectionNumber = sectionNumber[ 1 ]; } else { // eg not a real section sectionNumber = undefined; }					}					if ( validSections.hasOwnProperty( sectionNumber ) ) { editSection[ 0 ].innerHTML += ' ' + ' '							+ ' [ '							+ '' + 'move section' + ' ] '							+ ' ';					}				} );		} ); } );