User:Evad37/OneClickArchiver.js#L-40

/**

* Derived from Technical 13's version [1] of Equazcion's OneClickArchiver [2]

* [1] < https://en.wikipedia.org/wiki/User:Technical_13/Scripts/OneClickArchiver.js >

* [2] < https://en.wikipedia.org/wiki/User:Equazcion/OneClickArchiver.js >

*/

//

mw.loader.using(['mediawiki.util', 'mediawiki.api'], function() {

var config = mw.config.get([

'debug',

'wgAction',

'wgArticleId',

'wgCategories',

'wgMonthNames',

'wgNamespaceNumber',

'wgPageName',

'wgRelevantUserName'

]);

$( document ).ready( function () {

if ( ( $( '#ca-addsection' ).length > 0 ||

$.inArray( 'Non-talk pages that are automatically signed', config.wgCategories ) >= 0 ) &&

config.wgAction === 'view' &&

$.inArray( 'Pages that should not be manually archived', config.wgCategories ) === -1 ) {

var OCAstate = mw.user.options.get( 'userjs-OCA-enabled', 'true' );

var pageid = config.wgArticleId;

var errorLog = { errorCount: 0 };

new mw.Api().get( {

action: 'query',

prop: [ 'revisions', 'info' ],

rvsection: 0,

rvprop: 'content',

pageids: pageid,

indexpageids: 1,

rawcontinue: ''

} ).done( function ( response0 ) {

var thisMonthNum, thisMonthFullName, monthNamesShort, thisMonthShortName, thisYear, archiveNum;

var content0 = response0.query.pages[ pageid ].revisions[ 0 ][ '*' ];

/* archiveme */// Find out if there is already an {{Archive me}} request, and if it is between 1-2 months old

if ( config.wgNamespaceNumber === 3 ) {

thisMonthNum = new Date().getMonth();

thisMonthFullName = config.wgMonthNames[ thisMonthNum + 1 ];

monthNamesShort = [ "", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ];

thisMonthShortName = monthNamesShort[ thisMonthNum + 1 ];

thisYear = new Date().getFullYear();

var nowOcto = parseInt( ( ( thisYear * 12 ) + thisMonthNum + 1 ), 10 );

var archiveme = content0.match( /\{\{Archive ?me(\| *date *= *(January|February|March|April|May|June|July|August|September|October|November|December) ([\d]{4}))?\}\}/i );

if ( archiveme === null || archiveme === undefined ) {

errorLog.errorCount++;

errorLog.archiveme = '{{Archiveme}} not found.';

} else {

/* Archive me found - how old is it? */

var archivemeMonth = archiveme[ 2 ];

var archivemeMonthNum = 0;

if ( typeof archivemeMonth === 'number' ) {

archivemeMonthNum = parseInt( archivemeMonth, 10 );

} else {

for ( var i in config.wgMonthNames ) {

if ( archivemeMonth === config.wgMonthNames[ i ] ) {

archivemeMonthNum = parseInt( i, 10 );

} else if ( archivemeMonth === monthNamesShort[ i ] ) {

archivemeMonthNum = parseInt( i, 10 );

}

}

}

var archivemeYear = parseInt( archiveme[ 3 ], 10 );

var archivemeOcto = parseInt( ( ( archivemeYear * 12 ) + archivemeMonthNum ), 10 );

var archivemeSafe = parseInt( ( nowOcto - 2 ), 10 );

archiveme = archiveme[ 0 ];

}

}

/* counter */// Get the counter value

var counterRegEx = new RegExp( '\\| *counter *= *(\\d+)' );

var counter = counterRegEx.exec( content0 );

if ( counter === null || counter === undefined ) {

counter = 1;

errorLog.errorCount++;

errorLog.counter = counter;

} else {

counter = counter[ 1 ];

archiveNum = counter;

}

/* archiveName */// Get the archiveName value

var archiveNameRegEx = /\| *archive *= *(.*\%\(counter\)d.*) *(-->)?/;

var archiveName = archiveNameRegEx.exec( content0 );

var rootBase = config.wgPageName

.replace( /\/.*/g, '' )// Chop off the subpages

.replace( /_/g, ' ' );// Replace underscores with spaces

if ( archiveName === null || archiveName === undefined ) {

archiveName = rootBase + '/Archive ' + counter;

errorLog.errorCount++;

errorLog.archiveName = archiveName;

} else {

archiveName = archiveName[ 1 ]

.replace( /\| *archive *= */, '' )

.replace( /\%\(year\)d/g, thisYear )

.replace( /\%\(month\)d/g, thisMonthNum )

.replace( /\%\(monthname\)s/g, thisMonthFullName )

.replace( /\%\(monthnameshort\)s/g, thisMonthShortName )

.replace( /\%\(counter\)d/g, archiveNum );

var archiveBase = archiveName

.replace( /\/.*/, '' )// Chop off the subpages

.replace( /_/g, ' ' );// Replace underscores with spaces

var archiveSub = archiveName

.replace( /_/g, ' ' )// Replace underscores with spaces

.replace( archiveBase, '' );// Chop off the base pagename

if ( archiveBase != rootBase ) {

errorLog.errorCount++;

errorLog.archiveName = 'Archive name mismatch:

Found: ' + archiveName;

errorLog.archiveName += '
Expected: ' + rootBase.replace( '_', ' ' ) + archiveSub + '

';

}

}

/* archivepagesize */// Get the size of the destination archive from the API

new mw.Api().get( {

action: 'query',

prop: 'revisions',rvlimit: 1,

rvprop: [ 'size', 'content' ],

titles: archiveName,

list: 'usercontribs',

uclimit: 1,

ucprop: 'timestamp',

ucuser: ( ( config.wgRelevantUserName ) ?

config.wgRelevantUserName : 'Example' ),

rawcontinue: '',

} ).done( function ( archivePageData ) {

var archivePageSize = 0;

if ( archivePageData.query.pages[ -1 ] === undefined ) {

for ( var a in archivePageData.query.pages ) {

archivePageSize = parseInt( archivePageData.query.pages[ a ].revisions[ 0 ].size, 10 );

archiveName = archivePageData.query.pages[ a ].title;

}

} else {

archivePageSize = -1;

archiveName = archivePageData.query.pages[ archivePageSize ].title;

errorLog.errorCount++;

errorLog.archivePageSize = -1;

errorLog.archiveName = '' + archiveName + '';

}

/* maxarchivesize */// Get the defined max archive size from template

var maxArchiveSizeRegEx = new RegExp( '\\| *maxarchivesize *= *(\\d+K?)' );

var maxArchiveSize = maxArchiveSizeRegEx.exec( content0 );

if ( maxArchiveSize === null || maxArchiveSize[ 1 ] === undefined ) {

maxArchiveSize = parseInt( 153600, 10 );

errorLog.errorCount++;

errorLog.maxArchiveSize = maxArchiveSize;

} else if ( maxArchiveSize[ 1 ].slice( -1 ) === "K" && $.isNumeric( maxArchiveSize[ 1 ].slice( 0, maxArchiveSize[ 1 ].length-1 ) ) ) {

maxArchiveSize = parseInt( maxArchiveSize[ 1 ].slice( 0, maxArchiveSize[ 1 ].length - 1 ), 10 ) * 1024;

} else if ( $.isNumeric( maxArchiveSize[ 1 ].slice() ) ) {

maxArchiveSize = parseInt( maxArchiveSize[ 1 ].slice(), 10 );

}

/* pslimit */// If maxArchiveSize is defined, and archivePageSize >= maxArchiveSize increment counter and redfine page name.

if ( !errorLog.maxArchiveSize && archivePageSize >= maxArchiveSize ) {

counter++;

archiveName = archiveNameRegEx.exec( content0 );

archiveName = archiveName[ 1 ]

.replace( /\| *archive *= */, '' )

.replace( /\%\(year\)d/g, thisYear )

.replace( /\%\(month\)d/g, thisMonthNum )

.replace( /\%\(monthname\)s/g, thisMonthFullName )

.replace( /\%\(monthnameshort\)s/g, thisMonthShortName )

.replace( /\%\(counter\)d/g, counter );

var oldCounter = counterRegEx.exec( content0 );

var newCounter = '|counter=1';

if ( oldCounter !== null && oldCounter !== undefined ) {

newCounter = oldCounter[ 0 ].replace( oldCounter[ 1 ], counter );

oldCounter = oldCounter[ 0 ];

} else {

errorLog.errorCount++;

errorLog.newCounter = newCounter;

}

}

/* archiveheader */// Get the defined archive header to place on archive page if it doesn't exist

var archiveHeaderRegEx = new RegExp( '\\| *archiveheader *= *(\{\{[^\r\n]*\}\})' );

var archiveHeader = archiveHeaderRegEx.exec( content0 );

if ( archiveHeader === null || archiveHeader === undefined ) {

archiveHeader = "{{Aan}}";

errorLog.errorCount++;

errorLog.archiveHeader = archiveHeader;

} else {

archiveHeader = archiveHeader[ 1 ];

}

/* headerlevel */// Get the headerlevel value or default to '2'

var headerLevelRegEx = new RegExp( '\\| *headerlevel *= *(\\d+)' );

var headerLevel = headerLevelRegEx.exec( content0 );

if ( headerLevel === null || headerLevel === undefined ) {

headerLevel = 2;

errorLog.errorCount++;

errorLog.headerLevel = headerLevel;

} else {

headerLevel = parseInt( headerLevel[ 1 ] );

}

/* debug */// Table to report the values found.

if ( config.debug === true ) {

var OCAreport = '

';

OCAreport += '

configvalue
Counter' + errorLog.counter; }

else { OCAreport += '">' + counter; }

OCAreport += '

Archive name
' + errorLog.archiveName; }

else { OCAreport += '">' + archiveName; }

OCAreport += '

Header Level' + errorLog.headerLevel; }

else { OCAreport += '">' + headerLevel; }

OCAreport += '

Archive header' + errorLog.archiveHeader; }

else { OCAreport += '">' + archiveHeader; }

OCAreport += '

Max
archive size
' + errorLog.maxArchiveSize; }

else { OCAreport += '">' + maxArchiveSize; }

OCAreport += '

Current
archive size
' + archivePageSize; }

else if ( archivePageSize >= maxArchiveSize ) { OCAreport += ' background-color: #FFEEEE;">' + archivePageSize; }

else { OCAreport += '">' + archivePageSize; }

if ( !errorLog.archiveme && archiveme !== undefined ) {

OCAreport += '

Asked to archive '; }

if ( ( nowOcto - archivemeOcto ) === 0 ) { OCAreport += 'this month'; }

else if ( ( nowOcto - archivemeOcto ) === 1 ) { OCAreport += 'last month'; }

else { OCAreport += ' background-color: #FFEEEE;">Asked to archive ' + ( nowOcto - archivemeOcto ) + ' months ago'; }

}

if ( errorLog.archiveme || archiveme !== undefined ) { OCAreport += '

' + errorLog.archiveme; }

else if ( archiveme !== undefined ) { OCAreport += '">' + archiveme; }

OCAreport += '

Documentation
';

mw.notify( $( OCAreport ), { title: 'OneClickArchiver report!', tag: 'OCA', autoHide: false } );

}

var OCAerror = '

The following errors detected:
';

if ( errorLog.counter ) { OCAerror += ' Unable to find |counter=
     Default value: 1
'; }

if ( errorLog.archiveName && errorLog.archiveName.search( 'defaulted to' ) !== -1 ) { OCAerror += ' Unable to find |archive=
     Default value: ' + archiveName + '
'; }

if ( errorLog.archiveName && errorLog.archiveName.search( 'mismatch' ) !== -1 ) { OCAerror += ' Archive name mismatch detected.
'; }

if ( errorLog.headerLevel ) { OCAerror += '  Unable to find |headerlevel=
     Default value: 2
'; }

if ( errorLog.archiveHeader ) { OCAerror += '  Unable to find |archiveheader=
     Default value: "{{Aan}}"
'; }

if ( errorLog.maxArchiveSize ) { OCAerror += '  Unable to find |maxarchivesize=
     Default value: 153600
'; }

if ( errorLog.counter || errorLog.archiveName ) { OCAerror += '
 Causing the script to abort.
'; }

OCAerror += '
Please, see the documentation for details.

';

var archiverReport = mw.util.addPortletLink(

'p-cactions',

'#archiverNoLink',

'|Archive',

'pt-OCA-report',

'Report for why there are no |Archive links on this page',

null,

null

);

$( archiverReport ).click( function ( e ) {

e.preventDefault();

mw.notify( $( OCAerror ), { title: 'OneClickArchiver errors!', tag: 'OCAerr', autoHide: false } );

} );

if ( config.wgNamespaceNumber === 3 && ( errorLog.counter || errorLog.archiveName ) &&

config.debug === true && errorLog.archiveme ) {

if ( confirm( 'Click [OK] to post {{Archiveme|{{SUBST:DATE}}}} to the top of the page and abort or\n\t[Cancel] to attempt running with default values.' ) === true ) {

new mw.Api().postWithToken( 'edit', {

action: 'edit',

section: 0,

pageid: pageid,

text: '{{Archiveme|{{SUBST:DATE}}}}\n' + content0,

summary: '{{Archiveme}} posted with OneClickArchiver.'

} ).done( function () {

alert( 'Request for user to set up archiving posted.' );

location.reload();

} );

}

} else if ( config.wgNamespaceNumber === 3 && archivemeOcto >= archivemeSafe ) {

/* Archive me request was made, give the user a chance to comply */

} else if ( config.wgNamespaceNumber === 3 && ( errorLog.counter || errorLog.archiveName ) && config.debug === true && confirm( '{{Archiveme}} found on the top of the page:\n\n\t Click [OK] abort or\n\t[Cancel] to attempt running with default values.' ) === true ) {

/* User aborted script */

} else {

$( 'h' + headerLevel + ' span.mw-headline' ).each( function() {

var sectionName = $( this ).text();

var editSectionUrl = $( this ).parent().find('.mw-editsection a').not('.mw-editsection-visualeditor').first().attr( 'href' );

var sectionReg = /§ion=(.*)/;

var sectionRaw = sectionReg.exec( editSectionUrl );

if ( sectionRaw != null && sectionRaw[ 1 ].indexOf( 'T' ) < 0 ) {

var sectionNumber = parseInt( sectionRaw[ 1 ] );

if ( $( this ).parent().prop( 'tagName' ) === 'H' + headerLevel ) {

$( this ).parent( 'h' + headerLevel ).append(

'

| ' + 'Archive' + '
'

);

$(this).parent('h' + headerLevel).find('a.archiverLink').attr('title', 'Archive to: "'+archiveName+'"');

$( this ).parent( 'h' + headerLevel ).find( 'a.archiverLink' ).click( function() {

var mHeaders = 'Retrieving headers...';

var mSection = 'retrieving section content...';

var mPosting = 'Content retrieved, performing edits...';

var mPosted = 'Archive appended...';

var mCleared = 'Section cleared...';

var mReloading = 'All done! Reloading...';

$( 'body' ).append( '

' );

$( 'body' ).prepend( '

' );

$( '.arcProg' ).append( '

' + mHeaders + '
' );

$( '.arcProg' ).append( '

' + 'Archive name ' + archiveName + ' found, ' + mSection + ' (' + archivePageSize + 'b)
' );

new mw.Api().get( {

action: 'query',

pageids: pageid,

rvsection: sectionNumber,

prop: [ 'revisions', 'info' ],

rvprop: 'content',

indexpageids: 1,

rawcontinue: ''

} ).done( function ( responseSection ) {

var sectionContent = responseSection.query.pages[ pageid ].revisions[ 0 ][ '*' ];

$( '.arcProg' ).append( '

' + mPosting + '
' );

var dnau = sectionContent.match( // );

var dnauDate;

if ( dnau === null || dnau === undefined ) {

dnauDate = Date.now();

dnau = null;

} else {

dnau = dnau[ 1 ] + ':' + dnau[ 2 ] + ' ' + dnau[ 3 ] + ' ' + dnau[ 4 ] + ' ' + dnau[ 5 ];

dnauDate = new Date( dnau );

dnauDate = dnauDate.valueOf();

}

if ( dnauDate > Date.now() ) {

$( '.arcProg' ).remove();

$( '.overlay' ).remove();

var dnauAbortMsg = '

This section has been marked \"Do Not Archive Until\" ' + dnau + ', so archiving was aborted.

Please, see the documentation for details.

';

mw.notify( $( dnauAbortMsg ), { title: 'OneClickArchiver aborted!', tag: 'OCAdnau', autoHide: false } );

} else {

var archiveAction = 'adding section';

if ( archivePageSize <= 0 || ( archivePageSize >= maxArchiveSize && !errorLog.maxArchiveSize ) ) {

sectionContent = archiveHeader + '\n\n' + sectionContent;

archiveAction = 'creating';

mPosted = 'Archive created...';

} else {

sectionContent = '\n\n{{Clear}}\n' + sectionContent;

}

if ( dnau != null ) {

sectionContent = sectionContent.replace( //g, '' );

}

new mw.Api().postWithToken( 'edit', {

action: 'edit',

title: archiveName,

appendtext: sectionContent,

summary: '/* '+sectionName+' */ archived using OneClickArchiver)'

} ).done( function () {

$( '.arcProg' ).append( '

' + mPosted + '
' );

new mw.Api().postWithToken( 'edit', {

action: 'edit',

section: sectionNumber,

pageid: pageid,

text: '',

summary: 'OneClickArchived "' + sectionName + '" to ' + archiveName + ''

} ).done( function () {

$( '.arcProg' ).append( '

' + mCleared + '
' );

if ( archivePageSize >= maxArchiveSize && !errorLog.maxArchiveSize ) {

var mUpdated = 'Counter updated...';

new mw.Api().postWithToken( 'edit', {

action: 'edit',

section: 0,

pageid: pageid,

text: content0.replace( oldCounter, newCounter ),

summary: 'OneClickArchiver updating counter.'

} ).done( function () {

$( '.arcProg' ).append( '

' + mUpdated + '
' );

$( '.arcProg' ).append( '

' + mReloading + '
' );

location.reload();

} );

} else {

$( '.arcProg' ).append( '

' + mReloading + '
' );

location.reload();

}

} );

} );

}

} );

} );

}

}

} );

}

} );

} );

var linkTextD = '1CA is on', linkDescD = 'Disable OneClickArchiver';

var linkTextE = '1CA is off', linkDescE = 'Enable OneClickArchiver';

var linkText = linkTextD, linkDesc = linkDescD;

if ( OCAstate === 'false' ) {

linkText = linkTextE; linkDesc = linkDescE;

$( 'div.archiverDiv, li#pt-OCA-report' ).css( 'display', 'none' );

}

var archiverToggle = mw.util.addPortletLink(

'p-cactions',

'#archiverLink',

linkText,

'pt-OCA',

linkDesc,

'o',

null

);

$( archiverToggle ).click( function ( e ) {

e.preventDefault();

/* Toggle the archiveLinks */

$( 'div.archiverDiv' ).css( 'display', function ( _i, val ) {

return val === 'none' ? '' : 'none';

});

/* Toggle the toggle link */

$( 'li#pt-OCA a' ).html( function ( _i, val ) {

return val === linkTextD ? linkTextE : linkTextD;

});

/* Toggle the toggle description */

$( 'li#pt-OCA a' ).attr( 'title', function ( _i, val ) {

return val === linkDescD ? linkDescE : linkDescD;

});

/* Toggle the error report link */

if ( ( errorLog.counter || errorLog.archiveName ) ) {

$( 'li#pt-OCA-report' ).css( 'display', function ( _i, val ) {

return val === 'none' ? '' : 'none';

});

}

/* Toggle default state */

new mw.Api().postWithToken( 'options', {

action: 'options',

optionname: 'userjs-OCA-enabled',

optionvalue: OCAstate === 'true' ? 'false' : 'true'

} ).done( function() {

var resultMsg = 'OneClickArchiver is now ' + ( OCAstate === 'true' ? 'disabled' : 'enabled' ) + ' by default.';

mw.notify(resultMsg);

OCAstate = OCAstate === 'true' ? 'false' : 'true';

} );

} );

}

} );

});

//