UNPKG

wikibase-sdk

Version:

utils functions to query a Wikibase instance and simplify its results

106 lines 4.28 kB
import { fixedEncodeURIComponent, isAKey, isOfType, rejectObsoleteInterface, replaceSpaceByUnderscores } from '../utils/utils.js'; import { specialSites, sites } from './wikimedia_constants.js'; const wikidataBase = 'https://www.wikidata.org/wiki/'; export function getSitelinkUrl({ site, title }) { rejectObsoleteInterface(arguments); if (!site) throw new Error('missing a site'); if (!title) throw new Error('missing a title'); if (isAKey(siteUrlBuilders, site)) { return siteUrlBuilders[site](title); } const shortSiteKey = site.replace(/wiki$/, ''); if (isAKey(siteUrlBuilders, shortSiteKey)) { return siteUrlBuilders[shortSiteKey](title); } const { lang, project } = getSitelinkData(site); title = fixedEncodeURIComponent(replaceSpaceByUnderscores(title)); return `https://${lang}.${project}.org/wiki/${title}`; } const wikimediaSite = (subdomain) => (title) => `https://${subdomain}.wikimedia.org/wiki/${title}`; const siteUrlBuilders = { commons: wikimediaSite('commons'), foundation: wikimediaSite('foundation'), mediawiki: title => `https://www.mediawiki.org/wiki/${title}`, meta: wikimediaSite('meta'), outreach: wikimediaSite('outreach'), sources: title => `https://wikisource.org/wiki/${title}`, species: wikimediaSite('species'), wikidata: entityId => { const prefix = prefixByEntityLetter[entityId[0]]; let title = prefix ? `${prefix}:${entityId}` : entityId; // Required for forms and senses title = title.replace('-', '#'); return `${wikidataBase}${title}`; }, wikifunctions: wikimediaSite('wikifunctions'), wikimania: wikimediaSite('wikimania'), }; const prefixByEntityLetter = { E: 'EntitySchema', L: 'Lexeme', P: 'Property', }; const sitelinkUrlPattern = /^https?:\/\/([\w-]{2,10})\.(\w+)\.org\/\w+\/(.*)/; export function getSitelinkData(site) { if (site.startsWith('http')) { const url = site; const matchData = url.match(sitelinkUrlPattern); if (!matchData) throw new Error(`invalid sitelink url: ${url}`); let [lang, project, title] = matchData.slice(1); title = decodeURIComponent(title); if (lang === 'commons') { return { lang: 'en', project: 'commons', key: 'commons', title, url }; } if (!isOfType(projectNames, project)) { throw new Error(`project is unknown: ${project}`); } // Known case: wikidata, mediawiki if (lang === 'www') { return { lang: 'en', project, key: project, title, url }; } // Support multi-parts language codes, such as be_x_old const sitelang = lang.replace(/-/g, '_'); const key = `${sitelang}${project}`.replace('wikipedia', 'wiki'); return { lang, project, key, title, url }; } else { if (isAKey(specialSites, site)) { const project = specialSites[site]; return { lang: 'en', project, key: site }; } if (!isOfType(sites, site)) { throw new Error(`site not found: ${site}. Updating wikibase-sdk to a more recent version might fix the issue.`); } let [lang, projectSuffix, rest] = site.split('wik'); // Detecting cases like 'frwikiwiki' that would return [ 'fr', 'i', 'i' ] if (rest != null) throw new Error(`invalid sitelink key: ${site}`); // Support keys such as be_x_oldwiki, which refers to be-x-old.wikipedia.org lang = lang.replace(/_/g, '-'); const project = projectsBySuffix[projectSuffix]; if (!project) throw new Error(`sitelink project not found: ${project}`); return { lang, project, key: site }; } } export const isSite = (site) => isOfType(sites, site); /** @deprecated use isSite */ export const isSitelinkKey = isSite; const projectsBySuffix = { i: 'wikipedia', isource: 'wikisource', iquote: 'wikiquote', tionary: 'wiktionary', ibooks: 'wikibooks', iversity: 'wikiversity', ivoyage: 'wikivoyage', inews: 'wikinews', }; const projectNames = [ ...Object.values(projectsBySuffix), ...Object.values(specialSites), ]; //# sourceMappingURL=sitelinks.js.map