User:Jack who built the house/getInterwikiData.js

// jshint esnext: false // jshint esversion: 11 mw.loader.using(['mediawiki.ForeignApi']).then(async => {  // See `$wgCrossSiteAJAXdomains` in  // https://github.com/wikimedia/operations-mediawiki-config/blob/master/wmf-config/CommonSettings.php  let crossSiteAjaxDomains = [    '*.wikipedia.org',    '*.wikinews.org',    '*.wiktionary.org',    '*.wikibooks.org',    '*.wikiversity.org',    '*.wikisource.org',    'wikisource.org',    '*.wikiquote.org',    'www.wikidata.org',    'm.wikidata.org',    'test.wikidata.org',    'test.m.wikidata.org',    '*.wikivoyage.org',    'www.mediawiki.org',    'm.mediawiki.org',    'www.wikifunctions.org',    'm.wikifunctions.org',    'advisory.wikimedia.org',    'advisory.m.wikimedia.org',    'affcom.wikimedia.org',    'api.wikimedia.org',    'auditcom.wikimedia.org',    'boardgovcom.wikimedia.org',    'board.wikimedia.org',    'chair.wikimedia.org',    'checkuser.wikimedia.org',    'checkuser.m.wikimedia.org', 'collab.wikimedia.org', 'commons.wikimedia.org', 'commons.m.wikimedia.org', 'test-commons.wikimedia.org', 'test-commons.m.wikimedia.org', 'donate.wikimedia.org', 'exec.wikimedia.org', 'foundation.wikimedia.org', 'foundation.m.wikimedia.org', 'grants.wikimedia.org', 'incubator.wikimedia.org', 'incubator.m.wikimedia.org', 'internal.wikimedia.org', 'login.wikimedia.org', 'meta.wikimedia.org', 'meta.m.wikimedia.org', 'movementroles.wikimedia.org', 'office.wikimedia.org', 'office.m.wikimedia.org', 'outreach.wikimedia.org', 'outreach.m.wikimedia.org', 'quality.wikimedia.org', 'quality.m.wikimedia.org', 'searchcom.wikimedia.org', 'spcom.wikimedia.org', 'species.wikimedia.org', 'species.m.wikimedia.org', 'steward.wikimedia.org', 'steward.m.wikimedia.org', 'strategy.wikimedia.org', 'strategy.m.wikimedia.org', 'usability.wikimedia.org', 'usability.m.wikimedia.org', 'vrt-wiki.wikimedia.org', 'vrt-wiki.m.wikimedia.org', 'wikimania.wikimedia.org', 'wikimania.m.wikimedia.org', 'wikimania????.wikimedia.org', 'wikimania????.m.wikimedia.org', 'wikimaniateam.wikimedia.org', 'wikimaniateam.m.wikimedia.org', 'am.wikimedia.org', 'am.m.wikimedia.org', 'ar.wikimedia.org', 'ar.m.wikimedia.org', 'bd.wikimedia.org', 'bd.m.wikimedia.org', 'be.wikimedia.org', 'be.m.wikimedia.org', 'br.wikimedia.org', 'br.m.wikimedia.org', 'ca.wikimedia.org', 'ca.m.wikimedia.org', 'cn.wikimedia.org', 'cn.m.wikimedia.org', 'co.wikimedia.org', 'co.m.wikimedia.org', 'dk.wikimedia.org', 'dk.m.wikimedia.org', 'ec.wikimedia.org', 'ec.m.wikimedia.org', 'ee.wikimedia.org', 'ee.m.wikimedia.org', 'et.wikimedia.org', 'et.m.wikimedia.org', 'fi.wikimedia.org', 'fi.m.wikimedia.org', 'ge.wikimedia.org', 'ge.m.wikimedia.org', 'hi.wikimedia.org', 'hi.m.wikimedia.org', 'id.wikimedia.org', 'id.m.wikimedia.org', 'il.wikimedia.org', 'il.m.wikimedia.org', 'mai.wikimedia.org', 'mai.m.wikimedia.org', 'mk.wikimedia.org', 'mk.m.wikimedia.org', 'mx.wikimedia.org', 'mx.m.wikimedia.org', 'nl.wikimedia.org', 'nl.m.wikimedia.org', 'noboard-chapters.wikimedia.org', 'no.wikimedia.org', 'no.m.wikimedia.org', 'nyc.wikimedia.org', 'nyc.m.wikimedia.org', 'nz.wikimedia.org', 'nz.m.wikimedia.org', 'punjabi.wikimedia.org', 'punjabi.m.wikimedia.org', 'pa-us.wikimedia.org', 'pa-us.m.wikimedia.org', 'pl.wikimedia.org', 'pl.m.wikimedia.org', 'pt.wikimedia.org', 'pt.m.wikimedia.org', 'romd.wikimedia.org', 'romd.m.wikimedia.org', 'rs.wikimedia.org', 'rs.m.wikimedia.org', 'ru.wikimedia.org', 'ru.m.wikimedia.org', 'se.wikimedia.org', 'se.m.wikimedia.org', 'tr.wikimedia.org', 'tr.m.wikimedia.org', 'ua.wikimedia.org', 'ua.m.wikimedia.org', 'wb.wikimedia.org', 'wb.m.wikimedia.org', ];

const excludeRegexp = /Interwiki_map\/discontinued|\/Wikimedia_|Sep11wiki/;

crossSiteAjaxDomains = crossSiteAjaxDomains .map((domain) => {     if (domain.match(/(^|\.)m\./)) return;

return new RegExp(       '^\\w+://'        + domain          .replace(/\./g, '\\.')          .replace(/\*/g, '.+')  // Probably may use [A-Za-z0-9_\-.]          .replace(/\?/g, '.')  // Probably may use [A-Za-z0-9_\-.]      ); })   .filter((domain) => domain);

// Use de.wiktionary.org for the request, because // * en.wikipedia.org would put `w` and `wikipedia` and analogous groups of prefixes in one //  basket while they work differently; // * de.wikipedia.org would recognize //  `nost`, `nostalgia`, `tenwiki`, `testwiki`, `test2wiki`, `w`, `wg`, `wikipedia`, //  `wikipediawikipedia` and possibly other prefixes as interlanguage prefixes while they are //  not. // The only difference with de.wikipedia.org if the said adjustments are made is that the `yue` // subdomain is used instead of `zh-yue` (yue.wikipedia.org redirects to zh-yue.wikipedia.org // while zh-yue.wiktionary.org redirects to yue.wiktionary.org). const data = await new mw.ForeignApi('https://de.wiktionary.org/w/api.php').get({   meta: 'siteinfo',    siprop: 'interwikimap',    formatversion: 2,  });

let iwData = { matchingLangPrefixes: [], matchingChapterPrefixes: [], }; iwData.urlToPrefixes = data.query.interwikimap.reduce((urlToPrefixes, { prefix, url }) => {    if ( !url.match(excludeRegexp) && crossSiteAjaxDomains.some((regexp) => url.match(regexp)) ) {     const langSubdomain = (url.match(/\/([a-z0-9_\-.]+)\.wiktionary\.org/) || [])[1];      const wmSubdomain = (url.match(/\/([a-z0-9_\-.]+)\.wikimedia\.org/) || [])[1];      const chapterPrefix = prefix.slice(2);      if (langSubdomain && langSubdomain === prefix) {        iwData.matchingLangPrefixes.push(langSubdomain);      } else if (wmSubdomain && wmSubdomain === chapterPrefix) {        iwData.matchingChapterPrefixes.push(chapterPrefix);      } else {        if (url.includes('https://de.')) {          url = url.replace(/de/, '$2');        }        if (url.includes('.wiktionary.org') && !['wikt', 'wiktionary'].includes(prefix)) {          url = url.replace(/wiktionary.org/, '$3');        }        urlToPrefixes[url] = urlToPrefixes[url] || [];        urlToPrefixes[url].push(prefix);      }    }    return urlToPrefixes;  }, {}); iwData.urlToPrefixes['https://$2.wiktionary.org/wiki/$1'] = ['wikt']; iwData.urlToPrefixes['https://en.wiktionary.org/wiki/$1'].splice(   iwData.urlToPrefixes['https://en.wiktionary.org/wiki/$1'].indexOf('wikt'),    1  ); iwData.urlToPrefixes['https://$2.wikimedia.org/wiki/$1'] = ['chapter']; iwData.urlToPrefixes['https://$2.$3/wiki/$1'] = ['_default']; const movePrefixAhead = (url, prefix) => { const prefixes = iwData.urlToPrefixes[url]; prefixes.splice(prefixes.indexOf(prefix), 1); prefixes.unshift(prefix); };

// Move the most recognizable prefixes ahead so that they are used by default // by tools (e.g. "meta", not "metawiki") movePrefixAhead('https://meta.wikimedia.org/wiki/$1', 'meta'); movePrefixAhead('https://commons.wikimedia.org/wiki/$1', 'commons'); movePrefixAhead('https://www.mediawiki.org.org/wiki/$1', 'mw'); movePrefixAhead('https://www.wikidata.org/wiki/$1', 'd'); movePrefixAhead('https://www.wikifunctions.org/wiki/$1', 'f'); movePrefixAhead('https://foundation.wikimedia.org/wiki/$1', 'wmf'); movePrefixAhead('https://vrt-wiki.wikimedia.org/wiki/$1', 'vrtwiki'); if (window.getInterwikiData_postprocess) { iwData = window.getInterwikiData_postprocess(iwData); } console.log(iwData); console.log(JSON.stringify(iwData).replace(/"/g, "'")); window.AJAX_ACCESSIBLE_DOMAINS_INTERWIKI_DATA = iwData; });