wiki-entity
Version:
Wiki entity fetcher
147 lines (146 loc) • 5.38 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getRedirects = exports.getExtract = exports.getExtracts = exports.Api = void 0;
const request_1 = require("../request");
const API_URL = "https://$lang.wikipedia.org/w/api.php";
class Api {
constructor(qs = { action: "query", format: "json" }, httpTimeout) {
this.qs = qs;
this.httpTimeout = httpTimeout;
this.qs.action = this.qs.action || "query";
this.qs.format = "json";
this.httpTimeout = httpTimeout || 10 * 1000;
}
query(lang, qs) {
return __awaiter(this, void 0, void 0, function* () {
if (qs)
this.qs = Object.assign({}, this.qs, qs);
const data = yield (0, request_1.default)(API_URL.replace("$lang", lang), {
params: this.qs,
timeout: this.httpTimeout
});
if (hasError(data))
throw getError(data);
if (data && data.query && data.query.pages) {
return Object.keys(data.query.pages)
.map((id) => data.query.pages[id])
.map((page) => {
const item = {
pageid: page.pageid,
title: page.title
};
if (page["categories"]) {
item.categories = page["categories"].map((it) => it.title);
}
if (page["redirects"]) {
item.redirects = page["redirects"].map((it) => it.title);
}
if (page["extract"]) {
item.extract = page["extract"];
}
return item;
});
}
return [];
});
}
redirects() {
this.qs["rdlimit"] = "max";
this.addField("prop", "redirects");
return this;
}
categories() {
this.qs["cllimit"] = "max";
this.qs["clshow"] = "!hidden";
this.addField("prop", "categories");
return this;
}
extract(sentences = 3) {
this.qs["exsentences"] = sentences.toString();
this.qs["explaintext"] = "true";
this.addField("prop", "extracts");
return this;
}
addField(name, value) {
const vals = (this.qs[name] || "").split("|").filter((item) => !!item);
vals.push(value);
this.qs[name] = vals.join("|");
return this;
}
}
exports.Api = Api;
function getExtracts(params) {
return __awaiter(this, void 0, void 0, function* () {
const qs = {
action: "query",
titles: params.titles && params.titles.join("|"),
exsentences: params.sentences || 3,
prop: "extracts",
explaintext: true,
exintro: true,
exlimit: "max",
exsectionformat: "plain",
format: "json"
};
const data = yield (0, request_1.default)(API_URL.replace("$lang", params.lang), {
params: qs
});
if (hasError(data))
throw getError(data);
if (data && data.query && data.query.pages) {
return Object.keys(data.query.pages).map((id) => data.query.pages[id]);
}
return [];
});
}
exports.getExtracts = getExtracts;
const getExtract = (lang, title, sentences) => getExtracts({
lang: lang,
titles: [title],
sentences: sentences
}).then(function (extracts) {
if (extracts.length) {
return extracts[0];
}
return null;
});
exports.getExtract = getExtract;
function getRedirects(lang, title) {
return __awaiter(this, void 0, void 0, function* () {
const qs = {
action: "query",
generator: "redirects",
titles: title,
grdlimit: "max",
format: "json"
};
const data = yield (0, request_1.default)(API_URL.replace("$lang", lang), {
params: qs
});
if (hasError(data))
throw getError(data);
if (data && data.query && data.query.pages) {
return Object.keys(data.query.pages).map((id) => data.query.pages[id].title);
}
return [];
});
}
exports.getRedirects = getRedirects;
function getError(data) {
return ((data &&
data.error &&
new Error(data.error.info || "Wikidata Api Error")) ||
new Error("NO error"));
}
function hasError(data) {
return !!data.error;
}