wikibase-edit
Version:
Edit Wikibase from NodeJS
35 lines • 1.59 kB
JavaScript
// A module that turns entity ids into full mediawiki page titles, by checking
// the Wikibase custom namespace configuration
// ex: P1 => Property:P1, Q1 => Q1 OR Item:Q1
import { isEntityId } from 'wikibase-sdk';
import { newError } from './error.js';
import { getJson } from './request/get_json.js';
let prefixesMapPromise;
export async function resolveTitle(title, instanceApiEndpoint) {
if (!isEntityId(title))
throw newError('expected entity id as title');
prefixesMapPromise = prefixesMapPromise || getPrefixesMap(instanceApiEndpoint);
const prefixesMap = await prefixesMapPromise;
const idFirstLetter = title[0];
const prefix = prefixesMap[idFirstLetter];
return (prefix === '' ? title : `${prefix}:${title}`);
}
async function getPrefixesMap(instanceApiEndpoint) {
const infoUrl = `${instanceApiEndpoint}?action=query&meta=siteinfo&siprop=namespaces&format=json`;
const res = await getJson(infoUrl);
return parsePrefixesMap(res);
}
function parsePrefixesMap(res) {
return Object.values(res.query.namespaces)
.filter(namespace => namespace.defaultcontentmodel)
.filter(namespace => namespace.defaultcontentmodel.startsWith('wikibase'))
.reduce(aggregatePrefixes, {});
}
function aggregatePrefixes(prefixesMap, namespace) {
const { defaultcontentmodel, '*': prefix } = namespace;
const type = defaultcontentmodel.split('-')[1];
const firstLetter = type === 'item' ? 'Q' : type[0].toUpperCase();
prefixesMap[firstLetter] = prefix;
return prefixesMap;
}
//# sourceMappingURL=resolve_title.js.map