Jump to content

User:DannyS712/SectionMover.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// Originaly by User:Flooded with them hundreds
// Copied to [[User:DannyS712/SectionMover.js]] after FWTH retired, who took over as maintainer
// Install with:
// <code><nowiki>		{{subst:Iusc|User:DannyS712/SectionMover.js}}																</nowiki></code>
// or with
// <code><nowiki>		importScript( 'User:DannyS712/SectionMover.js' ); // Backlink: [[User:DannyS712/SectionMover.js]]			</nowiki></code> 
//
// 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(
		'<style>a.arxylink { font-weight:bold } .arxyhighlight { background-color:#aef9fc }</style>'
	);

	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 [[User:DannyS712/SectionMover.js|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 [[User:DannyS712/SectionMover.js|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 <h2>not a real section</h2>
							sectionNumber = undefined;
						}
					}
					if ( validSections.hasOwnProperty( sectionNumber ) ) {
						editSection[ 0 ].innerHTML += '&nbsp;'
							+ '<span class=arxy style=display:none>'
							+ '<span class=mw-editsection-bracket>[</span>'
							+ '<a data-section=' + sectionNumber + ' '
							+ 'onclick=$(this).closest(\':header\').toggleClass(\'arxyhighlight\');$(this).toggleClass(\'arxylink\');>'
							+ 'move section</a>'
							+ '<span class=mw-editsection-bracket>]</span>'
							+ '</span>';
					}
				} );
		} );
} );