User:Fandyllic/langwikicheckerJS

// /* ==================================================================== */ /*                       Language wiki checker                         */ /* ==================================================================== */ /* NOTE: Seems to broken as of Feb 2017 */

/*jshint jquery:true browser:true laxbreak:true smarttabs:true */ /*global mediaWiki */ if (mediaWiki.config.get('wgCanonicalSpecialPageName') === 'Blankpage') { mediaWiki.loader.using(['mediawiki.util', 'mediawiki.api'], function { 'use strict'; if (mediaWiki.util.getParamValue('blankspecial') !== 'langscan') { return; } jQuery(function { (function(window, $, mw) {	var	MAX_JOBS = 1,		IFRAME_TIMEOUT = 30000,		langCodes = {"ab":"Abkhaz","aa":"Afar","af":"Afrikaans","ak":"Akan","sq":"Albanian","am":"Amharic","ar":"Arabic","an":"Aragonese","hy":"Armenian","as":"Assamese","av":"Avaric","ae":"Avestan","ay":"Aymara","az":"Azerbaijani","bm":"Bambara","ba":"Bashkir","eu":"Basque","be":"Belarusian","bn":"Bengali","bh":"Bihari","bi":"Bislama","bs":"Bosnian","br":"Breton","bg":"Bulgarian","my":"Burmese","ca":"Catalan; Valencian","ch":"Chamorro","ce":"Chechen","ny":"Chichewa; Chewa; Nyanja","zh":"Chinese","cv":"Chuvash","kw":"Cornish","co":"Corsican","cr":"Cree","hr":"Croatian","cs":"Czech","da":"Danish","dv":"Divehi; Dhivehi; Maldivian;","nl":"Dutch","dz":"Dzongkha","en":"English","eo":"Esperanto","et":"Estonian","ee":"Ewe","fo":"Faroese","fj":"Fijian","fi":"Finnish","fr":"French","ff":"Fula; Fulah; Pulaar; Pular","gl":"Galician","ka":"Georgian","de":"German","el":"Greek, Modern","gn":"Guaraní","gu":"Gujarati","ht":"Haitian; Haitian Creole","ha":"Hausa","he":"Hebrew (modern)","hz":"Herero","hi":"Hindi","ho":"Hiri Motu","hu":"Hungarian","ia":"Interlingua","id":"Indonesian","ie":"Interlingue","ga":"Irish","ig":"Igbo","ik":"Inupiaq","io":"Ido","is":"Icelandic","it":"Italian","iu":"Inuktitut","ja":"Japanese","jv":"Javanese","kl":"Kalaallisut, Greenlandic","kn":"Kannada","kr":"Kanuri","ks":"Kashmiri","kk":"Kazakh","km":"Khmer","ki":"Kikuyu, Gikuyu","rw":"Kinyarwanda","ky":"Kyrgyz","kv":"Komi","kg":"Kongo","ko":"Korean","ku":"Kurdish","kj":"Kwanyama, Kuanyama","la":"Latin","lb":"Luxembourgish, Letzeburgesch","lg":"Ganda","li":"Limburgish, Limburgan, Limburger","ln":"Lingala","lo":"Lao","lt":"Lithuanian","lu":"Luba-Katanga","lv":"Latvian","gv":"Manx","mk":"Macedonian","mg":"Malagasy","ms":"Malay","ml":"Malayalam","mt":"Maltese","mi":"Māori","mr":"Marathi (Marāṭhī)","mh":"Marshallese","mn":"Mongolian","na":"Nauru","nv":"Navajo, Navaho","nb":"Norwegian Bokmål","nd":"North Ndebele","ne":"Nepali","ng":"Ndonga","nn":"Norwegian Nynorsk","no":"Norwegian","ii":"Nuosu","nr":"South Ndebele","oc":"Occitan","oj":"Ojibwe, Ojibwa","cu":"Old Church Slavonic, Church Slavic, Church Slavonic, Old Bulgarian, Old Slavonic","om":"Oromo","or":"Oriya","os":"Ossetian, Ossetic","pa":"Panjabi, Punjabi","pi":"Pāli","fa":"Persian","pl":"Polish","ps":"Pashto, Pushto","pt":"Portuguese","qu":"Quechua","rm":"Romansh","rn":"Kirundi","ro":"Romanian, Moldavian(Romanian from Republic of Moldova)","ru":"Russian","sa":"Sanskrit (Saṁskṛta)","sc":"Sardinian","sd":"Sindhi","se":"Northern Sami","sm":"Samoan","sg":"Sango","sr":"Serbian","gd":"Scottish Gaelic; Gaelic","sn":"Shona","si":"Sinhala, Sinhalese","sk":"Slovak","sl":"Slovene","so":"Somali","st":"Southern Sotho","es":"Spanish; Castilian","su":"Sundanese","sw":"Swahili","ss":"Swati","sv":"Swedish","ta":"Tamil","te":"Telugu","tg":"Tajik","th":"Thai","ti":"Tigrinya","bo":"Tibetan Standard, Tibetan, Central","tk":"Turkmen","tl":"Tagalog","tn":"Tswana","to":"Tonga (Tonga Islands)","tr":"Turkish","ts":"Tsonga","tt":"Tatar","tw":"Twi","ty":"Tahitian","ug":"Uighur, Uyghur","uk":"Ukrainian","ur":"Urdu","uz":"Uzbek","ve":"Venda","vi":"Vietnamese","vo":"Volapük","wa":"Walloon","cy":"Welsh","wo":"Wolof","fy":"Western Frisian","xh":"Xhosa","yi":"Yiddish","yo":"Yoruba","za":"Zhuang, Chuang","zu":"Zulu"}, styles = { // Colors for different modes checking: { // Scan is in progress backgroundColor: 'yellow', color: 'black' },			failed: { // Probably doesn't exist backgroundColor: '#A00', color: 'white' },			found: { // Exists, not linked backgroundColor: '#13A', color: 'white' },			connected: { // Exists, linked backgroundColor: 'green', color: 'white' }		},		defaultMsg = { checking: 'Checking...', failed: 'Does not exist', found: 'Exists but is not connected', connected: 'Exists & Connected' };	// Retitle $('#WikiaPageHeader > h1').text('Interlanguage Scan').prop('title', 'JavaScript Program'); // DOM components var	$content = $('#WikiaArticle').empty, $topNotice = $(' Run Scan &mdash; WARNING: May use a ton of RAM, CPU and bandwidth. '), $scanTable = $(			' '		); // Prefill table (function {		var content = '';		for (var x in langCodes) {			if (langCodes.hasOwnProperty(x)) {				content +=					' ' +						' ' + langCodes[x] + ' ' +						' ' + x + ' ' +						'??? ' +					' ';			}		}		$scanTable.find('tbody').append(content);	}); $content.append($topNotice, $scanTable); // Change state of table rows when info is known function mark(langCode, mode, msg) { var $x = $scanTable.find('td[data-langcode="' + langCode + '"]') .css(styles[mode]) .html(msg || defaultMsg[mode]); if (mode === 'found' || mode === 'connected') { $x.attr('data-done', 'true'); }	}	// Look up the interwiki link table new mw.Api.get({		meta: 'siteinfo',		siprop: 'interwikimap',		sifilteriw: 'local'	}, {		ok: function(json) {			// Update the table			json = json.query.interwikimap;			for (var i = 0, l = json.length ; i < l ; ++i) {				if (!json[i].language) { continue; }				mark(json[i].prefix, 'connected', 'Connected');			}			// Enable scan			$topNotice				.find('button').click(function(ev) { ev.preventDefault; $topNotice.slideUp('fast'); runScan; }).end				.slideDown('fast');		},		err: function(textCode) {			$topNotice				.text('Could not access interwikimap for this wiki. Error: ' + textCode)				.addClass('error').removeClass('confirm')				.slideDown('fast');		}	}); // Create one iframe per sub-domain and wait for the site to load. // If it times out then it probably doesn't exist. // We rate limit this to avoid total insanity. function runScan { var map = {}; $(window).on('message.langscan', function(ev) {			var e = ev.originalEvent;			if (typeof(e.data) === 'string') {				var m = e.data.split('#');				if (m.length === 2 && map.hasOwnProperty(m[0])) {					map[m[0]](window.parseInt(m[1], 10));					delete map[m[0]];					ev.stopImmediatePropagation;				}			}		}); var jobs = $scanTable.find('td[data-langcode]').not('[data-done]').toArray, jobCount = (jobs.length < MAX_JOBS ? jobs.length : MAX_JOBS); for (var i = 0 ; i < jobCount ; ++i) { startJob(jobs.shift); }		function startJob(e) { var code = e.getAttribute('data-langcode'); mark(code, 'checking'); var $f = $('').prop({				src: '//' + code + '.' + window.location.host + '/wiki/LangScanLanding'			}).appendTo('body'); var timeout = window.setTimeout(function {				mark(code, 'failed', 'Timed out');				e.setAttribute('data-done', 'true');				$f.remove;				decJobCount;			}, IFRAME_TIMEOUT); $f.load(function {				map[code] = function(valid) {					window.clearTimeout(timeout);					if (valid) {						mark(code, 'found', 'Exists but not connected');					}					else {						mark(code, 'failed');					}					$f.remove;					decJobCount;				};				this.contentWindow.postMessage('langscan ' + code, '*');			}); }		function decJobCount { if (jobs.length) { startJob(jobs.shift); }			else if (--jobCount === 0) { // Last job cleans up				$('iframe.langscan-frame').remove; $topNotice .html(' Scan Completed. Hide Irrelevant Rows ') .slideDown('fast') .find('button').click(function(ev) {						ev.preventDefault;						$scanTable.find('td[data-langcode]').not('[data-done]').parent.toggle;					}); $(window).off('message.langscan'); }		}	} })(window, jQuery, mediaWiki); }); }); } // Enable cross-origin access between the scan page and a designated landing page on the wiki // NOTE: Landing page must NOT be a Special page as those have X-FRAME-OPTIONS: DENY which blocks //	loading them inside IFRAMEs. The landing page is not visibly altered by what we are doing to //	it so it doesn't matter if it exists. switch(mediaWiki.config.get('wgPageName')) { case 'LangScanLanding': case 'Community_Central:Not_a_valid_Wikia':	jQuery(window).on('message.langscan', function(ev) { 'use strict'; var e = ev.originalEvent; if (typeof(e.data) === 'string' && e.data.substr(0, 8) === 'langscan') { e.source.postMessage(e.data.substr(9) + '#' + (mediaWiki.config.get('wgDBname') !== 'wikia' ? 1 : 0), e.origin); ev.stopImmediatePropagation; }	}); } //