Jump to content

User:DannyS712/SectionMover.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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>';
					}
				} );
		} );
} );