Pengguna:MRZQ/SectionMover.js
Catatan: Setelah menyimpan, Anda harus memintas tembolok (cache) peramban Anda untuk melihat perubahannya. Google Chrome, Firefox, Microsoft Edge dan Safari: Tahan tombol ⇧ Shift dan klik Muat ulang (Reload) di tombol bilah alat. Untuk detail dan instruksi tentang peramban lain, lihat halaman menghapus singgahan (Inggris).
// 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 [[:en:User:DannyS712/SectionMover|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 [[:en:User:DannyS712/SectionMover|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( /§ion=(\d+)/ );
if ( sectionNumber ) {
sectionNumber = sectionNumber[ 1 ];
} else {
// eg <h2>not a real section</h2>
sectionNumber = undefined;
}
}
if ( validSections.hasOwnProperty( sectionNumber ) ) {
editSection[ 0 ].innerHTML += ' '
+ '<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>';
}
} );
} );
} );