User:Magiczocker/Multiwikifinder.js
Jump to navigation
Jump to search
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
/* jshint esversion: 6 */
( function ( mw ) {
'use strict';
var config = mw.config.get( [
'wgUserLanguage',
'wgPageName'
] ),
paused = false,
title = '',
length = 0,
elements = {},
count = 0,
found = 0,
input,
button,
widget,
i18n,
wikis,
host;
if ( config.wgPageName !== 'User:Magiczocker/Multiwikifinder' ) {
return;
}
function log( msg ) {
console.log( '[Multiwikifinder]', msg );
}
function updateCount() {
count++;
if ( count === length ) {
widget.setNotices( [] );
widget.setSuccess( [ mw.format(i18n['wikis-found'], mw.language.convertNumber(found), mw.language.convertNumber(length)) ] );
input.setReadOnly(false);
button.setDisabled(false);
} else {
widget.setNotices( [ mw.format(i18n['wikis-checking'], mw.language.convertNumber(count), mw.language.convertNumber(length)) ] );
}
}
function unpause() {
paused = false;
process();
}
function pause() {
paused = true;
setTimeout( unpause, 5000 );
}
function process() {
if ( paused ) {
return;
}
host = wikis[ count ];
if ( host ) {
fetch( host + '/api.php?' + new URLSearchParams( {
action: 'query',
format: 'json',
titles: title,
prop: 'info',
formatversion: 2,
origin: '*'
} ), {
method: 'GET'
} ).then( function ( response ) {
return response.json();
} ).then( function ( data ) {
const page = data.query.pages[ 0 ];
if ( !page.missing ) {
found++;
var link = host + mw.util.getUrl(page.title);
if ( page.redirect ) link += '?redirect=no';
var liEle = document.createElement( 'li' );
liEle.innerHTML = '<a href="' + link + '">' + link + '</a>';
elements.output.append( liEle );
}
updateCount();
process();
} ).catch( function ( error ) {
pause();
log( error );
} );
} else {
log( 'Done' );
}
}
function getWikis() {
fetch( 'https://support.wiki.gg/wiki/User:Magiczocker/list.json?action=raw', {
method: 'GET'
} ).then( function ( response ) {
return response.json();
} ).then( function ( data ) {
wikis = data.flatMap( function ( wiki ) {
return wiki.lang.map( function ( lang ) {
// [name].wiki.gg/en redirects to [name].wiki.gg
return 'https://' + wiki.name + '.wiki.gg' + ( lang === 'en' ? '' : '/' + lang );
} );
} );
length = wikis.length;
process();
} ).catch( log );
}
function start() {
if (input.isReadOnly() || button.isDisabled()) return;
input.setReadOnly(true);
button.setDisabled(true);
count = 0;
found = 0;
elements.output.innerHTML = '';
widget.setSuccess( [] );
widget.setNotices( [ i18n['main-loading'] ] );
title = input.getValue();
if ( wikis ) {
process();
} else {
getWikis();
}
}
function init( $content ) {
var main = $content.find( '#globalTracker:not(.loaded)' )[ 0 ];
if ( !main ) {
return;
}
main.classList.add( 'loaded' );
main.innerHTML = '';
input = new OO.ui.TextInputWidget( {
required: true,
placeholder: i18n['main-header']
} );
button = new OO.ui.ButtonWidget( {
label: i18n['main-button'],
flags: ['primary', 'progressive']
} );
widget = new OO.ui.ActionFieldLayout(
input, button, {
id: 'multiwikifinder',
label: i18n['main-label'],
align: 'top'
}
);
$content.append(
widget.$element,
$('<ol>').attr('id', 'multiwikifinder-output')
);
elements = {
output: $content.find('#multiwikifinder-output')[0]
};
input.on('enter', start);
button.on('click', start);
}
mw.loader.using( [
'oojs-ui-widgets',
'mediawiki.widgets',
'mediawiki.util',
'mediawiki.language'
] ).then( function () {
/* Load i18n */
fetch( 'https://support.wiki.gg/wiki/User:Magiczocker/Multiwikifinder-i18n.json?action=raw', {
method: 'GET'
} ).then( function ( response ) {
return response.json();
} ).then( function ( i18no ) {
i18n = i18no[ config.wgUserLanguage ] || i18no.en;
mw.hook( 'wikipage.content' ).add( init );
} ).catch( log );
} );
}( window.mediaWiki ) );