fullfiller
Version:
Feature-rich filler text generator.
789 lines (768 loc) • 309 kB
JavaScript
'use strict';
class CustomError extends Error {
/**
* Create a `CustomError` (same as `Error` but with an extra property called `library`).
* @param message Argument to be passed to base constructor (`Error()`).
* @param library Name of the library in which error will be thrown.
*/
constructor(message, library) {
super(message);
this.library = library;
}
toString() {
return `Error in \`${this.library}\` library:\n\t${this.message}`;
}
}
/*
max must be at least `min * 2 - 1`
otherwise, min & max couldn't be used to break down any number inside range `max to (min * 2)`
e.g. if min is 7, max can't be anything less than 13
- range 7 - 12 = couldn't break down 13
- range 7 - 11 = couldn't break down 12, 13
- range 7 - 10 = couldn't break down 11, 12, 13
- so on...
*/
const sentencesPerParagraphDefault = {
min: 4,
max: 8
};
//
const wordsPerSentenceDefault = {
min: 7,
max: 13
};
// all languages in which Wikipedia is available
// script used to fetch languages object is at `./languages.js`
/* cSpell:disable */
const wikipediaLanguages = {
aa: 'Afar',
ab: 'Abkhazian',
ace: 'Achinese',
ady: 'Adyghe',
af: 'Afrikaans',
ak: 'Akan',
als: 'Alemannisch',
alt: 'Southern Altai',
am: 'Amharic',
ami: 'Amis',
an: 'Aragonese',
ang: 'Old English',
anp: 'Angika',
ar: 'Arabic',
arc: 'Aramaic',
ary: 'Moroccan Arabic',
arz: 'Egyptian Arabic',
as: 'Assamese',
ast: 'Asturian',
atj: 'Atikamekw',
av: 'Avaric',
avk: 'Kotava',
awa: 'Awadhi',
ay: 'Aymara',
az: 'Azerbaijani',
azb: 'South Azerbaijani',
ba: 'Bashkir',
ban: 'Balinese',
bar: 'Bavarian',
'bat-smg': 'Samogitian',
bcl: 'Central Bikol',
be: 'Belarusian',
'be-x-old': 'Belarusian (Taraškievica orthography)',
bg: 'Bulgarian',
bh: 'Bhojpuri',
bi: 'Bislama',
bjn: 'Banjar',
blk: "Pa'O",
bm: 'Bambara',
bn: 'Bangla',
bo: 'Tibetan',
bpy: 'Bishnupriya',
br: 'Breton',
bs: 'Bosnian',
bug: 'Buginese',
bxr: 'Russia Buriat',
ca: 'Catalan',
'cbk-zam': 'Chavacano',
cdo: 'Min Dong Chinese',
ce: 'Chechen',
ceb: 'Cebuano',
ch: 'Chamorro',
cho: 'Choctaw',
chr: 'Cherokee',
chy: 'Cheyenne',
ckb: 'Central Kurdish',
co: 'Corsican',
cr: 'Cree',
crh: 'Crimean Tatar',
cs: 'Czech',
csb: 'Kashubian',
cu: 'Church Slavic',
cv: 'Chuvash',
cy: 'Welsh',
da: 'Danish',
dag: 'Dagbani',
de: 'German',
din: 'Dinka',
diq: 'Zazaki',
dsb: 'Lower Sorbian',
dty: 'Doteli',
dv: 'Divehi',
dz: 'Dzongkha',
ee: 'Ewe',
el: 'Greek',
eml: 'Emiliano-Romagnolo',
en: 'English',
eo: 'Esperanto',
es: 'Spanish',
et: 'Estonian',
eu: 'Basque',
ext: 'Extremaduran',
fa: 'Persian',
ff: 'Fula',
fi: 'Finnish',
'fiu-vro': 'võro',
fj: 'Fijian',
fo: 'Faroese',
fr: 'French',
frp: 'Arpitan',
frr: 'Northern Frisian',
fur: 'Friulian',
fy: 'Western Frisian',
ga: 'Irish',
gag: 'Gagauz',
gan: 'Gan Chinese',
gcr: 'Guianan Creole',
gd: 'Scottish Gaelic',
gl: 'Galician',
glk: 'Gilaki',
gn: 'Guarani',
gom: 'Goan Konkani',
gor: 'Gorontalo',
got: 'Gothic',
gu: 'Gujarati',
guc: 'Wayuu',
gur: 'Frafra',
guw: 'Gun',
gv: 'Manx',
ha: 'Hausa',
hak: 'Hakka Chinese',
haw: 'Hawaiian',
he: 'Hebrew',
hi: 'Hindi',
hif: 'Fiji Hindi',
ho: 'Hiri Motu',
hr: 'Croatian',
hsb: 'Upper Sorbian',
ht: 'Haitian Creole',
hu: 'Hungarian',
hy: 'Armenian',
hyw: 'Western Armenian',
hz: 'Herero',
ia: 'Interlingua',
id: 'Indonesian',
ie: 'Interlingue',
ig: 'Igbo',
ii: 'Sichuan Yi',
ik: 'Inupiaq',
ilo: 'Iloko',
inh: 'Ingush',
io: 'Ido',
is: 'Icelandic',
it: 'Italian',
iu: 'Inuktitut',
ja: 'Japanese',
jam: 'Jamaican Creole English',
jbo: 'Lojban',
jv: 'Javanese',
ka: 'Georgian',
kaa: 'Kara-Kalpak',
kab: 'Kabyle',
kbd: 'Kabardian',
kbp: 'Kabiye',
kcg: 'Tyap',
kg: 'Kongo',
ki: 'Kikuyu',
kj: 'Kuanyama',
kk: 'Kazakh',
kl: 'Kalaallisut',
km: 'Khmer',
kn: 'Kannada',
ko: 'Korean',
koi: 'Komi-Permyak',
kr: 'Kanuri',
krc: 'Karachay-Balkar',
ks: 'Kashmiri',
ksh: 'Colognian',
ku: 'Kurdish',
kv: 'Komi',
kw: 'Cornish',
ky: 'Kyrgyz',
la: 'Latin',
lad: 'Ladino',
lb: 'Luxembourgish',
lbe: 'Lak',
lez: 'Lezghian',
lfn: 'Lingua Franca Nova',
lg: 'Ganda',
li: 'Limburgish',
lij: 'Ligurian',
lld: 'Ladin',
lmo: 'Lombard',
ln: 'Lingala',
lo: 'Lao',
lrc: 'Northern Luri',
lt: 'Lithuanian',
ltg: 'Latgalian',
lv: 'Latvian',
mad: 'Madurese',
mai: 'Maithili',
'map-bms': 'Basa Banyumasan',
mdf: 'Moksha',
mg: 'Malagasy',
mh: 'Marshallese',
mhr: 'Eastern Mari',
mi: 'Māori',
min: 'Minangkabau',
mk: 'Macedonian',
ml: 'Malayalam',
mn: 'Mongolian',
mni: 'Manipuri',
mnw: 'Mon',
mr: 'Marathi',
mrj: 'Western Mari',
ms: 'Malay',
mt: 'Maltese',
mus: 'Muscogee',
mwl: 'Mirandese',
my: 'Burmese',
myv: 'Erzya',
mzn: 'Mazanderani',
na: 'Nauru',
nah: 'Nāhuatl',
nap: 'Neapolitan',
nds: 'Low German',
'nds-nl': 'Low Saxon',
ne: 'Nepali',
new: 'Newari',
ng: 'Ndonga',
nia: 'Nias',
nl: 'Dutch',
nn: 'Norwegian Nynorsk',
no: 'Norwegian',
nov: 'Novial',
nqo: 'N’Ko',
nrm: 'Norman',
nso: 'Northern Sotho',
nv: 'Navajo',
ny: 'Nyanja',
oc: 'Occitan',
olo: 'Livvi-Karelian',
om: 'Oromo',
or: 'Odia',
os: 'Ossetic',
pa: 'Punjabi',
pag: 'Pangasinan',
pam: 'Pampanga',
pap: 'Papiamento',
pcd: 'Picard',
pcm: 'Nigerian Pidgin',
pdc: 'Pennsylvania German',
pfl: 'Palatine German',
pi: 'Pali',
pih: 'Norfuk / Pitkern',
pl: 'Polish',
pms: 'Piedmontese',
pnb: 'Western Punjabi',
pnt: 'Pontic',
ps: 'Pashto',
pt: 'Portuguese',
pwn: 'Paiwan',
qu: 'Quechua',
rm: 'Romansh',
rmy: 'Vlax Romani',
rn: 'Rundi',
ro: 'Romanian',
'roa-rup': 'Aromanian',
'roa-tara': 'Tarantino',
ru: 'Russian',
rue: 'Rusyn',
rw: 'Kinyarwanda',
sa: 'Sanskrit',
sah: 'Yakut',
sat: 'Santali',
sc: 'Sardinian',
scn: 'Sicilian',
sco: 'Scots',
sd: 'Sindhi',
se: 'Northern Sami',
sg: 'Sango',
sh: 'Serbo-Croatian',
shi: 'Tachelhit',
shn: 'Shan',
si: 'Sinhala',
simple: 'Simple English',
sk: 'Slovak',
skr: 'Saraiki',
sl: 'Slovenian',
sm: 'Samoan',
smn: 'Inari Sami',
sn: 'Shona',
so: 'Somali',
sq: 'Albanian',
sr: 'Serbian',
srn: 'Sranan Tongo',
ss: 'Swati',
st: 'Southern Sotho',
stq: 'Saterland Frisian',
su: 'Sundanese',
sv: 'Swedish',
sw: 'Swahili',
szl: 'Silesian',
szy: 'Sakizaya',
ta: 'Tamil',
tay: 'Tayal',
tcy: 'Tulu',
te: 'Telugu',
tet: 'Tetum',
tg: 'Tajik',
th: 'Thai',
ti: 'Tigrinya',
tk: 'Turkmen',
tl: 'Tagalog',
tn: 'Tswana',
to: 'Tongan',
tpi: 'Tok Pisin',
tr: 'Turkish',
trv: 'Taroko',
ts: 'Tsonga',
tt: 'Tatar',
tum: 'Tumbuka',
tw: 'Twi',
ty: 'Tahitian',
tyv: 'Tuvinian',
udm: 'Udmurt',
ug: 'Uyghur',
uk: 'Ukrainian',
ur: 'Urdu',
uz: 'Uzbek',
ve: 'Venda',
vec: 'Venetian',
vep: 'Veps',
vi: 'Vietnamese',
vls: 'West Flemish',
vo: 'Volapük',
wa: 'Walloon',
war: 'Waray',
wo: 'Wolof',
wuu: 'Wu Chinese',
xal: 'Kalmyk',
xh: 'Xhosa',
xmf: 'Mingrelian',
yi: 'Yiddish',
yo: 'Yoruba',
za: 'Zhuang',
zea: 'Zeelandic',
zh: 'Chinese',
'zh-classical': 'Classical Chinese',
'zh-min-nan': 'Chinese (Min Nan)',
'zh-yue': 'Cantonese',
zu: 'Zulu'
};
/* cSpell:enable */
// messages aren't inside an object because
// tree-shaking isn't possible when exporting an object
// https://medium.com/@rauschma/note-that-default-exporting-objects-is-usually-an-anti-pattern-if-you-want-to-export-the-cf674423ac38#.nibatprx3
// used at `fullfiller/src/validate`
const invalidInput = 'Expected `input` argument to be one of the valid types (query string, text, words array or frequency map).';
const emptyQueryString = 'Expected non-empty query string at `input` argument.';
const textTooShort = 'Expected given text (in `input.body` argument) to have at least 150 words.';
//
const invalidLanguage = (language, languages) => `Expected \`language\` argument to be one of the supported languages (${languages.join(', ')}).`;
//
const invalidUnit = 'Expected `unit` argument to be `words` or `paragraphs`.';
//
const quantityNotNumber = 'Expected `quantity` argument to be a number.';
const quantityTooSmall = wordsMinimum => `Expected \`quantity\` argument to be greater than 1 paragraph / ${wordsMinimum} words.`;
//
const invalidFormat = 'Expected `format` argument to be `plain` or `html`.';
//
const invalidStringify = 'Expected `stringify` argument to be a boolean (`true` or `false`).';
//
const invalidSentencesPerParagraph = 'Expected `sentencesPerParagraph` argument to be an object (`{ min: number, max: number }`).';
const sentencesPerParagraphMinTooSmall = 'Expected `sentencesPerParagraph.min` argument to be at least 3.';
const sentencesPerParagraphMaxTooSmall = 'Expected `sentencesPerParagraph.max` argument to be at least 3.';
const invalidSentencesPerParagraphMax = 'Expected `sentencesPerParagraph.max` to be at least `sentencesPerParagraph.min * 2 - 1`.';
//
const invalidWordsPerSentence = 'Expected `wordsPerSentence` argument to be an object (`{ min: number, max: number }`).';
const wordsPerSentenceMinTooSmall = 'Expected `wordsPerSentence.min` argument to be at least 3.';
const wordsPerSentenceMaxTooSmall = 'Expected `wordsPerSentence.max` argument to be at least 3.';
const invalidWordsPerSentenceMax = 'Expected `wordsPerSentence.max` to be at least `wordsPerSentence.min * 2 - 1`.';
const articleNotFound = 'Wikipedia does not have an article with this exact title. Try again using a different query.';
const articleIsDisambiguation = suggestions => `This query points to a Wikipedia disambiguation page. You've got to be more specific.${suggestions.length > 0 ? ` Query suggestions:\n- ${suggestions.splice(0, 10).join('\n- ')}.` : ` No query suggestions were found.`}`;
const notEnoughWordsInWordsArray = (minimum, received) => `Given \`text\` doesn't have enough keywords to construct \`wordsArray\` containing the minimum quantity of words required. Minimum number of words required: ${minimum}. Number of words received: ${received}.`;
const notEnoughWordsInFreqMap = (minimum, received) => `Given \`wordsArray\` doesn't have enough words to construct \`freqMap\` containing the minimum quantity of words required. Minimum number of words required: ${minimum}. Number of words received: ${received}.`;
/**
* Every freqMap's word in `wordsToEmphasize` will have their weight multiplied by `emphasizeBy`.
*/
function emphasize(freqMapWordAsKey, wordsToEmphasize, emphasizeBy) {
return wordsToEmphasize.reduce((freqMap, word) => freqMap[word] === undefined ? freqMap : {
...freqMap,
[word]: Math.round(freqMap[word] * emphasizeBy)
}, freqMapWordAsKey);
}
/** **freqMapWeightAsKey** example: `{ 1: ['foo', 'bar'], 3: ['baz'] }` */
function generateFreqMapWeightAsKey(freqMapWordAsKey) {
return Object.keys(freqMapWordAsKey).reduce((freqMap, word) => {
const weight = freqMapWordAsKey[word];
return {
...freqMap,
[weight]: (freqMap[weight] || []).concat(word)
};
}, {});
}
/** **freqMapWordAsKey** example: `{ foo: 1, bar: 3 }` */
function generateFreqMapWordAsKey(wordsArray, caseInsensitive) {
return wordsArray.reduce((freqMap, word) => {
const w = caseInsensitive ? word.toLowerCase() : word;
return {
...freqMap,
// using hasOwnProperty instead of check if undefined, otherwise
// if `word` is a built-in object property (e.g. `constructor`)
// would append 1 to this property (which would results in `NaN`)
// instead of creating a new property
[w]: Object.prototype.hasOwnProperty.call(freqMap, w) ? freqMap[w] + 1 : 1
};
}, {});
}
function getFreqMapWordsQuantity(freqMap) {
const wordsQuantity = Object.values(freqMap).reduce((acc, cur) => acc + cur.length, 0);
return wordsQuantity;
}
/** If required by `options`, reduce the quantity of tiers in `freqMap`. */
function shortenFreqMap(freqMap, tierWeightMin, tierWeightMax, mergePosteriorTiersAt) {
return Object.entries(freqMap).reduce((shortened, entry) => {
const weight = Number(entry[0]);
const tier = entry[1];
// if current weight is less than min or more than max, filter out current tier
if (weight < tierWeightMin || tierWeightMax !== -1 &&
// -1 would indicate that `tierWeightMax` functionality is disabled
weight > tierWeightMax) {
return shortened;
}
// if current weight is more than mergePosteriorTiersAt
// merge current tier into mergePosteriorTiersAt tier
if (mergePosteriorTiersAt !== -1 &&
// -1 would indicate that `mergePosteriorTiersAt` functionality is disabled
weight > mergePosteriorTiersAt) {
return {
...shortened,
[mergePosteriorTiersAt]: (shortened[mergePosteriorTiersAt] || []).concat(freqMap[weight])
};
}
return {
...shortened,
[weight]: tier
};
}, {});
}
const optionsDefault$1 = {
emphasizeBy: 2,
wordsQuantityMin: 0,
tierWeightMin: 1,
tierWeightMax: -1,
mergePosteriorTiersAt: -1,
caseInsensitive: false
};
/**
* Generate `freqMap` from `wordsArray`.
* @param wordsArray
* @param wordsToEmphasize Subset of `wordsArray` to emphasize.
* @param optionsArg Miscellaneous options.
* @throws Error if `freqMap` has less words than required by `options.wordsQuantityMin`.
* @returns freqMap.
*/
function generateFreqMap(wordsArray, wordsToEmphasize, optionsArg) {
const options = {
...optionsDefault$1,
...optionsArg
};
const freqMapWordAsKey = emphasize(generateFreqMapWordAsKey(wordsArray, options.caseInsensitive), wordsToEmphasize || [], options.emphasizeBy);
const freqMap = shortenFreqMap(generateFreqMapWeightAsKey(freqMapWordAsKey), options.tierWeightMin, options.tierWeightMax, options.mergePosteriorTiersAt);
const freqMapWordsQuantity = getFreqMapWordsQuantity(freqMap);
if (freqMapWordsQuantity < options.wordsQuantityMin) {
throw new CustomError(notEnoughWordsInFreqMap(options.wordsQuantityMin, freqMapWordsQuantity), 'generate-words-freqmap');
}
return freqMap;
}
/**
* Summary is the initial chunk of text, everything before the first subtitle.
* It's possible to get it with API `&action=query&prop=extracts&exintro`.
* But the entire article was fetched already, so there's no need to make another API call.
*
* @summary Extract summary from article body.
* @param body Wikipedia article body.
* @param format Article format.
* @returns Wikipedia article summary.
*/
function extractSummaryFromBody(body, format) {
const plaintextRE = /^[\s\S]*?(?=\n\n\n==)/;
const htmlRE = /^[\s\S]*?(?=\n\n<h2>)/;
const RE = format === 'plain' ? plaintextRE : htmlRE;
const summary = RE.exec(body)?.[0];
return summary;
}
/**
* Join Wikipedia API base URL and `queries`.
* @param queries Object to be converted to query string.
* @returns URL to make API call.
*/
function generateRequestURL(language, queries) {
const baseAPI = `https://${language}.wikipedia.org/w/api.php?&format=json&origin=*&`;
const queryString = Object.entries(queries).map(([key, value]) => value === undefined ? key : `${key}=${value.toString()}`).join('&');
const requestURL = baseAPI + queryString;
return requestURL;
}
/**
* @summary Fetch response from Wikipedia API.
* @param queries Object containing query string parameters.
* @returns Object containing json.query.pages[pageID] and json.continue (if it exists) contents.
*/
async function fetchResource(language, queries) {
const url = generateRequestURL(language, queries);
const json = await (await fetch(url)).json();
// API's response isn't returned in its entirety by this function.
// That's because the main part of the response is nested 3 layers deep.
// As shown in the `response` interface.
const {
pages
} = json.query;
const pagesID = Object.keys(pages)[0];
const resp = {
...pages[pagesID],
// some resources responses (e.g. links) include `continue` when there's more to fetch
...(json.continue && json.continue)
};
return resp;
}
/**
* Fetch Wikipedia article body.
* @param title Wikipedia article title.
* @param format Which one of the 2 formats available in the Wikipedia API.
* @param related Wikipedia related articles titles (to recommend in case of error).
* @returns Wikipedia article body.
*/
async function getArticleBody(language, title, format) {
const queries = {
action: 'query',
prop: 'extracts',
...(format === 'plain' && {
explaintext: undefined
}),
redirects: undefined,
titles: encodeURIComponent(title)
};
const resp = await fetchResource(language, queries);
const body = resp.extract;
return body;
}
/**
* Fetch all Wikipedia categories the given article belongs to.
* @param title Wikipedia article title.
* @returns Array of Wikipedia categories names.
*/
async function getArticleCategories(language, title) {
const queries = {
action: 'query',
prop: 'categories',
redirects: undefined,
cllimit: 'max',
clshow: '!hidden',
titles: encodeURIComponent(title)
};
// There's no reason to use a recursive function like in getArticleLinks,
// even the articles containing the most categories don't have more than 500 categories
// (https://en.wikipedia.org/wiki/Special:MostCategories);
// request below will fetch at most 500 normal (not hidden) categories
const resp = await fetchResource(language, queries);
const categories = resp.categories.map(obj => obj.title.replace(/^Category:/, ''));
return categories;
}
async function getLinksRecursively(language, queries) {
const resp = await fetchResource(language, queries);
const links = resp.links.map(obj => obj.title);
return !('plcontinue' in resp) ? links : links.concat(await getLinksRecursively(language, {
...queries,
plcontinue: encodeURIComponent(resp.plcontinue)
}));
}
/**
* Fetch all Wikipedia articles that are linked in the given article.
* @param title Wikipedia article title.
* @returns Array of Wikipedia articles titles.
*/
async function getArticleLinks(language, title) {
const queries = {
action: 'query',
prop: 'links',
redirects: undefined,
pllimit: 'max',
plnamespace: '0',
titles: encodeURIComponent(title)
};
const links = await getLinksRecursively(language, queries);
return links;
}
/**
* Fetch Wikipedia article summary.
* @param title Wikipedia article title.
* @param format Which one of the 2 formats available in the Wikipedia API.
* @param related Wikipedia related articles titles (to recommend in case of error).
* @returns Wikipedia article body.
*/
async function getArticleSummary(language, title, format) {
const queries = {
action: 'query',
prop: 'extracts',
exintro: undefined,
redirects: undefined,
...(format === 'plain' && {
explaintext: undefined
}),
titles: encodeURIComponent(title)
};
const resp = await fetchResource(language, queries);
const summary = resp.extract;
return summary;
}
/**
* Fetch Wikipedia article terms.
* @param title Wikipedia article title.
* @param include Which terms to fetch (alias, description and/or label).
* @returns Array of Wikipedia article terms.
*/
async function getArticleTerms(language, title, include) {
const queries = {
action: 'query',
prop: 'pageterms',
redirects: undefined,
wbptlanguage: 'en',
wbptterms: include.join('|'),
titles: encodeURIComponent(title)
};
const resp = await fetchResource(language, queries);
const {
terms
} = resp;
// if (include.length !== Object.keys(terms).length) {
// const print = (array: string[]) => array.sort().join(', ');
// console.warn(
// `Article lacks some of the terms requested. Requested: ${print(
// include
// )}. Fetched: ${print(Object.keys(terms))}.`
// );
// }
return terms;
}
/**
* Fetch Wikipedia article(s) title(s) that match query.
* @param query Search string.
* @param single Fetch only a single result.
* @throws Error if no results were found.
* @returns Array of title(s).
*/
async function getMatchingArticlesTitles(language, query, single = false) {
const requestURL = generateRequestURL(language, {
action: 'opensearch',
limit: single ? 1 : 'max',
// `redirects=resolve` is required otherwise response may contain the name of a redirect
// instead of the target page; page and redirect have slight different titles
// e.g. query `lord of the rings` would return `Lord of the rings`
// which is the redirect for `The Lord of the Rings`
redirects: 'resolve',
search: encodeURIComponent(query)
});
const resp = await fetch(requestURL);
const json = await resp.json();
const titles = json[1];
if (titles.length === 0) throw new CustomError(articleNotFound, 'get-wikipedia-article');
return titles;
}
async function queryPointsToADisambiguationPage(language, title) {
const queries = {
action: 'query',
prop: 'pageprops',
ppprop: 'disambiguation',
redirects: undefined,
titles: encodeURIComponent(title)
};
const resp = await fetchResource(language, queries);
const pointsToDisambiguation = resp.pageprops?.disambiguation !== undefined;
return pointsToDisambiguation;
}
const includeDefault = ['title', 'body'];
/**
* Fetch Wikipedia article's resources (e.g. title, body, links...).
* @param query Search string.
* @param options Miscellaneous options.
* @throws Error if `query` doesn't return any results.
* @throws Error if `article.title` points to a disambiguation page.
* @returns Object containing requested resources.
*/
async function getWikipediaArticle(query, {
language = 'en',
include = includeDefault,
format = 'plain'
} = {}) {
if (!Object.keys(wikipediaLanguages).includes(language)) {
throw new CustomError(invalidLanguage(language, Object.keys(wikipediaLanguages)), 'get-wikipedia-article');
}
if (include.length === 0) include.push(...includeDefault);
const article = {};
// fetch title, related
if (include.includes('title') && include.includes('related')) {
// first result will be selected as the article to be fetched
const [title, ...related] = await getMatchingArticlesTitles(language, query);
article.title = title;
article.related = related;
} else if (include.includes('title')) {
const [title] = await getMatchingArticlesTitles(language, query);
article.title = title;
} else if (include.includes('related')) {
const [, ...related] = await getMatchingArticlesTitles(language, query);
article.related = related;
}
// API calls to `action=query` using `query` instead of `article.title`
// are allowed because `redirects` parameter is being used
const titleQuery = article.title || query;
// the only option other than to make a separate request at main function checking if page is
// disambiguation, would be to check if page is disambiguation at every resource request
if (await queryPointsToADisambiguationPage(language, titleQuery)) {
throw new CustomError(articleIsDisambiguation(article.related || [] /* suggestions */), 'get-wikipedia-article');
}
// fetch body
if (include.includes('body')) {
article.body = await getArticleBody(language, titleQuery, format);
}
// fetch summary
if (include.includes('summary')) {
article.summary = article.body ? extractSummaryFromBody(article.body, format) : await getArticleSummary(language, titleQuery, format);
}
// fetch categories
if (include.includes('categories')) {
article.categories = await getArticleCategories(language, titleQuery);
}
// fetch links
if (include.includes('links')) {
article.links = await getArticleLinks(language, titleQuery);
}
// fetch terms
const termsToInclude = ['alias', 'label', 'description'].filter(term => include.includes(term));
if (termsToInclude.length > 0) {
const terms = await getArticleTerms(language, titleQuery, termsToInclude);
Object.keys(terms).forEach(term => {
article[term] = terms[term];
});
}
return article;
}
var af$1=["'n","aan","af","al","as","baie","by","daar","dag","dat","die","dit","een","ek","en","gaan","gesê","haar","het","hom","hulle","hy","in","is","jou","jy","kan","kom","ma","maar","met","my","na","nie","om","ons","op","saam","sal","se","sien","so","sy","te","toe","uit","van","vir","was","wat","ʼn"];var ha$1=["a","amma","ba","ban","ce","cikin","da","don","ga","in","ina","ita","ji","ka","ko","kuma","lokacin","ma","mai","na","ne","ni","sai","shi","su","suka","sun","ta","tafi","take","tana","wani","wannan","wata","ya","yake","yana","yi","za"];var so$1=["aad","albaabkii","atabo","ay","ayaa","ayee","ayuu","dhan","hadana","in","inuu","isku","jiray","jirtay","ka","kale","kasoo","ku","kuu","lakin","markii","oo","si","soo","uga","ugu","uu","waa","waxa","waxuu"];var st$1=["a","ba","bane","bona","e","ea","eaba","empa","ena","ha","hae","hape","ho","hore","ka","ke","la","le","li","me","mo","moo","ne","o","oa","re","sa","se","tloha","tsa","tse"];var sw$1=["akasema","alikuwa","alisema","baada","basi","bila","cha","chini","hadi","hapo","hata","hivyo","hiyo","huku","huo","ili","ilikuwa","juu","kama","karibu","katika","kila","kima","kisha","kubwa","kutoka","kuwa","kwa","kwamba","kwenda","kwenye","la","lakini","mara","mdogo","mimi","mkubwa","mmoja","moja","muda","mwenye","na","naye","ndani","ng","ni","nini","nonkungu","pamoja","pia","sana","sasa","sauti","tafadhali","tena","tu","vile","wa","wakati","wake","walikuwa","wao","watu","wengine","wote","ya","yake","yangu","yao","yeye","yule","za","zaidi","zake"];var yo$1=["a","an","bá","bí","bẹ̀rẹ̀","fún","fẹ́","gbogbo","inú","jù","jẹ","jẹ́","kan","kì","kí","kò","láti","lè","lọ","mi","mo","máa","mọ̀","ni","náà","ní","nígbà","nítorí","nǹkan","o","padà","pé","púpọ̀","pẹ̀lú","rẹ̀","sì","sí","sínú","ṣ","ti","tí","wà","wá","wọn","wọ́n","yìí","àti","àwọn","é","í","òun","ó","ń","ńlá","ṣe","ṣé","ṣùgbọ́n","ẹmọ́","ọjọ́","ọ̀pọ̀lọpọ̀"];var zu$1=["futhi","kahle","kakhulu","kanye","khona","kodwa","kungani","kusho","la","lakhe","lapho","mina","ngesikhathi","nje","phansi","phezulu","u","ukuba","ukuthi","ukuze","uma","wahamba","wakhe","wami","wase","wathi","yakhe","zakhe","zonke"];var da$1=["af","alle","andet","andre","at","begge","da","de","den","denne","der","deres","det","dette","dig","din","dog","du","ej","eller","en","end","ene","eneste","enhver","et","fem","fire","flere","fleste","for","fordi","forrige","fra","få","før","god","han","hans","har","hendes","her","hun","hvad","hvem","hver","hvilken","hvis","hvor","hvordan","hvorfor","hvornår","i","ikke","ind","ingen","intet","jeg","jeres","kan","kom","kommer","lav","lidt","lille","man","mand","mange","med","meget","men","mens","mere","mig","ned","ni","nogen","noget","ny","nyt","nær","næste","næsten","og","op","otte","over","på","se","seks","ses","som","stor","store","syv","ti","til","to","tre","ud","var"];var de$1=["Ernst","Ordnung","Schluss","a","ab","aber","ach","acht","achte","achten","achter","achtes","ag","alle","allein","allem","allen","aller","allerdings","alles","allgemeinen","als","also","am","an","andere","anderen","andern","anders","au","auch","auf","aus","ausser","ausserdem","außer","außerdem","b","bald","bei","beide","beiden","beim","beispiel","bekannt","bereits","besonders","besser","besten","bin","bis","bisher","bist","c","d","d.h","da","dabei","dadurch","dafür","dagegen","daher","dahin","dahinter","damals","damit","danach","daneben","dank","dann","daran","darauf","daraus","darf","darfst","darin","darum","darunter","darüber","das","dasein","daselbst","dass","dasselbe","davon","davor","dazu","dazwischen","daß","dein","deine","deinem","deiner","dem","dementsprechend","demgegenüber","demgemäss","demgemäß","demselben","demzufolge","den","denen","denn","denselben","der","deren","derjenige","derjenigen","dermassen","dermaßen","derselbe","derselben","des","deshalb","desselben","dessen","deswegen","dich","die","diejenige","diejenigen","dies","diese","dieselbe","dieselben","diesem","diesen","dieser","dieses","dir","doch","dort","drei","drin","dritte","dritten","dritter","drittes","du","durch","durchaus","durfte","durften","dürfen","dürft","e","eben","ebenso","ehrlich","ei","ei,","eigen","eigene","eigenen","eigener","eigenes","ein","einander","eine","einem","einen","einer","eines","einige","einigen","einiger","einiges","einmal","eins","elf","en","ende","endlich","entweder","er","erst","erste","ersten","erster","erstes","es","etwa","etwas","euch","euer","eure","f","folgende","früher","fünf","fünfte","fünften","fünfter","fünftes","für","g","gab","ganz","ganze","ganzen","ganzer","ganzes","gar","gedurft","gegen","gegenüber","gehabt","gehen","geht","gekannt","gekonnt","gemacht","gemocht","gemusst","genug","gerade","gern","gesagt","geschweige","gewesen","gewollt","geworden","gibt","ging","gleich","gott","gross","grosse","grossen","grosser","grosses","groß","große","großen","großer","großes","gut","gute","guter","gutes","h","habe","haben","habt","hast","hat","hatte","hatten","hattest","hattet","heisst","her","heute","hier","hin","hinter","hoch","hätte","hätten","i","ich","ihm","ihn","ihnen","ihr","ihre","ihrem","ihren","ihrer","ihres","im","immer","in","indem","infolgedessen","ins","irgend","ist","j","ja","jahr","jahre","jahren","je","jede","jedem","jeden","jeder","jedermann","jedermanns","jedes","jedoch","jemand","jemandem","jemanden","jene","jenem","jenen","jener","jenes","jetzt","k","kam","kann","kannst","kaum","kein","keine","keinem","keinen","keiner","kleine","kleinen","kleiner","kleines","kommen","kommt","konnte","konnten","kurz","können","könnt","könnte","l","lang","lange","leicht","leide","lieber","los","m","machen","macht","machte","mag","magst","mahn","mal","man","manche","manchem","manchen","mancher","manches","mann","mehr","mein","meine","meinem","meinen","meiner","meines","mensch","menschen","mich","mir","mit","mittel","mochte","mochten","morgen","muss","musst","musste","mussten","muß","mußt","möchte","mögen","möglich","mögt","müssen","müsst","müßt","n","na","nach","nachdem","nahm","natürlich","neben","nein","neue","neuen","neun","neunte","neunten","neunter","neuntes","nicht","nichts","nie","niemand","niemandem","niemanden","noch","nun","nur","o","ob","oben","oder","offen","oft","ohne","p","q","r","recht","rechte","rechten","rechter","rechtes","richtig","rund","s","sa","sache","sagt","sagte","sah","satt","schlecht","schon","sechs","sechste","sechsten","sechster","sechstes","sehr","sei","seid","seien","sein","seine","seinem","seinen","seiner","seines","seit","seitdem","selbst","sich","sie","sieben","siebente","siebenten","siebenter","siebentes","sind","so","solang","solche","solchem","solchen","solcher","solches","soll","sollen","sollst","sollt","sollte","sollten","sondern","sonst","soweit","sowie","später","startseite","statt","steht","suche","t","tag","tage","tagen","tat","teil","tel","tritt","trotzdem","tun","u","uhr","um","und","und?","uns","unser","unsere","unserer","unter","v","vergangenen","viel","viele","vielem","vielen","vielleicht","vier","vierte","vierten","vierter","viertes","vom","von","vor","w","wahr?","wann","war","waren","wart","warum","was","wegen","weil","weit","weiter","weitere","weiteren","weiteres","welche","welchem","welchen","welcher","welches","wem","wen","wenig","wenige","weniger","weniges","wenigstens","wenn","wer","werde","werden","werdet","weshalb","wessen","wie","wieder","wieso","will","willst","wir","wird","wirklich","wirst","wissen","wo","wohl","wollen","wollt","wollte","wollten","worden","wurde","wurden","während","währenddem","währenddessen","wäre","würde","würden","x","y","z","z.b","zehn","zehnte","zehnten","zehnter","zehntes","zeit","zu","zuerst","zugleich","zum","zunächst","zur","zurück","zusammen","zwanzig","zwar","zwei","zweite","zweiten","zweiter","zweites","zwischen","zwölf","über","überhaupt","übrigens"];var es$1=["a","actualmente","acuerdo","adelante","ademas","además","adrede","afirmó","agregó","ahi","ahora","ahí","al","algo","alguna","algunas","alguno","algunos","algún","alli","allí","alrededor","ambos","ampleamos","antano","antaño","ante","anterior","antes","apenas","aproximadamente","aquel","aquella","aquellas","aquello","aquellos","aqui","aquél","aquélla","aquéllas","aquéllos","aquí","arriba","arribaabajo","aseguró","asi","así","atras","aun","aunque","ayer","añadió","aún","b","bajo","bastante","bien","breve","buen","buena","buenas","bueno","buenos","c","cada","casi","cerca","cierta","ciertas","cierto","ciertos","cinco","claro","comentó","como","con","conmigo","conocer","conseguimos","conseguir","considera","consideró","consigo","consigue","consiguen","consigues","contigo","contra","cosas","creo","cual","cuales","cualquier","cuando","cuanta","cuantas","cuanto","cuantos","cuatro","cuenta","cuál","cuáles","cuándo","cuánta","cuántas","cuánto","cuántos","cómo","d","da","dado","dan","dar","de","debajo","debe","deben","debido","decir","dejó","del","delante","demasiado","demás","dentro","deprisa","desde","despacio","despues","después","detras","detrás","dia","dias","dice","dicen","dicho","dieron","diferente","diferentes","dijeron","dijo","dio","donde","dos","durante","día","días","dónde","e","ejemplo","el","ella","ellas","ello","ellos","embargo","empleais","emplean","emplear","empleas","empleo","en","encima","encuentra","enfrente","enseguida","entonces","entre","era","eramos","eran","eras","eres","es","esa","esas","ese","eso","esos","esta","estaba","estaban","estado","estados","estais","estamos","estan","estar","estará","estas","este","esto","estos","estoy","estuvo","está","están","ex","excepto","existe","existen","explicó","expresó","f","fin","final","fue","fuera","fueron","fui","fuimos","g","general","gran","grandes","gueno","h","ha","haber","habia","habla","hablan","habrá","había","habían","hace","haceis","hacemos","hacen","hacer","hacerlo","haces","hacia","haciendo","hago","han","hasta","hay","haya","he","hecho","hemos","hicieron","hizo","horas","hoy","hubo","i","igual","incluso","indicó","informo","informó","intenta","intentais","intentamos","intentan","intentar","intentas","intento","ir","j","junto","k","l","la","lado","largo","las","le","lejos","les","llegó","lleva","llevar","lo","los","luego","lugar","m","mal","manera","manifestó","mas","mayor","me","mediante","medio","mejor","mencionó","menos","menudo","mi","mia","mias","mientras","mio","mios","mis","misma","mismas","mismo","mismos","modo","momento","mucha","muchas","mucho","muchos","muy","más","mí","mía","mías","mío","míos","n","nada","nadie","ni","ninguna","ningunas","ninguno","ningunos","ningún","no","nos","nosotras","nosotros","nuestra","nuestras","nuestro","nuestros","nueva","nuevas","nuevo","nuevos","nunca","o","ocho","os","otra","otras","otro","otros","p","pais","para","parece","parte","partir","pasada","pasado","paìs","peor","pero","pesar","poca","pocas","poco","pocos","podeis","podemos","poder","podria","podriais","podriamos","podrian","podrias","podrá","podrán","podría","podrían","poner","por","porque","posible","primer","primera","primero","primeros","principalmente","pronto","propia","propias","propio","propios","proximo","próximo","próximos","pudo","pueda","puede","pueden","puedo","pues","q","qeu","que","quedó","queremos","quien","quienes","quiere","quiza","quizas","quizá","quizás","quién","quiénes","qué","r","raras","realizado","realizar","realizó","repente","respecto","s","sabe","sabeis","sabemos","saben","saber","sabes","salvo","se","sea","sean","segun","segunda","segundo","según","seis","ser","sera","será","serán","sería","señaló","si","sido","siempre","siendo","siete","sigue","siguiente","sin","sino","sobre","sois","sola","solamente","solas","solo","solos","somos","son","soy","soyos","su","supuesto","sus","suya","suyas","suyo","sé","sí","sólo","t","tal","tambien","también","tampoco","tan","tanto","tarde","te","temprano","tendrá","tendrán","teneis","tenemos","tener","tenga","tengo","tenido","tenía","tercera","ti","tiempo","tiene","tienen","toda","todas","todavia","todavía","todo","todos","total","trabaja","trabajais","trabajamos","trabajan","trabajar","trabajas","trabajo","tras","trata","través","tres","tu","tus","tuvo","tuya","tuyas","tuyo","tuyos","tú","u","ultimo","un","una","unas","uno","unos","usa","usais","usamos","usan","usar","usas","uso","usted","ustedes","v","va","vais","valor","vamos","van","varias","varios","vaya","veces","ver","verdad","verdadera","verdadero","vez","vosotras","vosotros","voy","vuestra","vuestras","vuestro","vuestros","w","x","y","ya","yo","z","él","ésa","ésas","ése","ésos","ésta","éstas","éste","éstos","última","últimas","último","últimos"];var et$1=["aga","ei","et","ja","jah","kas","kui","kõik","ma","me","mida","midagi","mind","minu","mis","mu","mul","mulle","nad","nii","oled","olen","oli","oma","on","pole","sa","seda","see","selle","siin","siis","ta","te","ära"];var fi$1=["aiemmin","aika","aikaa","aikaan","aikaisemmin","aikaisin","aikajen","aikana","aikoina","aikoo","aikovat","aina","ainakaan","ainakin","ainoa","ainoat","aiomme","aion","aiotte","aist","aivan","ajan","alas","alemmas","alkuisin","alkuun","alla","alle","aloitamme","aloitan","aloitat","aloitatte","aloitattivat","aloitettava","aloitettevaksi","aloitettu","aloitimme","aloitin","aloitit","aloititte","aloittaa","aloittamatta","aloitti","aloittivat","alta","aluksi","alussa","alusta","annettavaksi","annetteva","annettu","ansiosta","antaa","antamatta","antoi","aoua","apu","asia","asiaa","asian","asiasta","asiat","asioiden","asioihin","asioita","asti","avuksi","avulla","avun","avutta","edelle","edelleen","edellä","edeltä","edemmäs","edes","edessä","edestä","ehkä","ei","eikä","eilen","eivät","eli","ellei","elleivät","ellemme","ellen","ellet","ellette","emme","en","enemmän","eniten","ennen","ensi","ensimmäinen","ensimmäiseksi","ensimmäisen","ensimmäisenä","ensimmäiset","ensimmäisiksi","ensimmäisinä","ensimmäisiä","ensimmäistä","ensin","entinen","entisen","entisiä","entisten","entistä","enää","eri","erittäin","erityisesti","eräiden","eräs","eräät","esi","esiin","esillä","esimerkiksi","et","eteen","etenkin","etessa","ette","ettei","että","haikki","halua","haluaa","haluamatta","haluamme","haluan","haluat","haluatte","haluavat","halunnut","halusi","halusimme","halusin","halusit","halusitte","halusivat","halutessa","haluton","he","hei","heidän","heihin","heille","heiltä","heissä","heistä","heitä","helposti","heti","hetkellä","hieman","hitaasti","hoikein","huolimatta","huomenna","hyvien","hyviin","hyviksi","hyville","hyviltä","hyvin","hyvinä","hyvissä","hyvistä","hyviä","hyvä","hyvät","hyvää","hän","häneen","hänelle","hänellä","häneltä","hänen","hänessä","hänestä","hänet","ihan","ilman","ilmeisesti","itse","itsensä","itseään","ja","jo","johon","joiden","joihin","joiksi","joilla","joille","joilta","joissa","joista","joita","joka","jokainen","jokin","joko","joku","jolla","jolle","jolloin","jolta","jompikumpi","jonka","jonkin","jonne","joo","jopa","jos","joskus","jossa","josta","jota","jotain","joten","jotenkin","jotenkuten","jotka","jotta","jouduimme","jouduin","jouduit","jouduitte","joudumme","joudun","joudutte","joukkoon","joukossa","joukosta","joutua","joutui","joutuivat","joutumaan","joutuu","joutuvat","juuri","jälkeen","jälleen","jää","kahdeksan","kahdeksannen","kahdella","kahdelle","kahdelta","kahden","kahdessa","kahdesta","kahta","kahteen","kai","kaiken","kaikille","kaikilta","kaikkea","kaikki","kaikkia","kaikkiaan","kaikkialla","kaikkialle","kaikkialta","kaikkien","kaikkin","kaksi","kannalta","kannattaa","kanssa","kanssaan","kanssamme","kanssani","kanssanne","kanssasi","kauan","kauemmas","kaukana","kautta","kehen","keiden","keihin","keiksi","keille","keillä","keiltä","keinä","keissä","keistä","keitten","keittä","keitä","keneen","keneksi","kenelle","kenellä","keneltä","kenen","kenenä","kenessä","kenestä","kenet","kenettä","kennessästä","kenties","kerran","kerta","kertaa","keskellä","kesken","keskimäärin","ketkä","ketä","kiitos","kohti","koko","kokonaan","kolmas","kolme","kolmen","kolmesti","koska","koskaan","kovin","kuin","kuinka","kuinkan","kuitenkaan","kuitenkin","kuka","kukaan","kukin","kukka","kumpainen","kumpainenkaan","kumpi","kumpikaan","kumpikin","kun","kuten","kuuden","kuusi","kuutta","kylliksi","kyllä","kymmenen","kyse","liian","liki","lisäksi","lisää","lla","luo","luona","lähekkäin","lähelle","lähellä","läheltä","lähemmäs","lähes","lähinnä","lähtien","läpi","mahdollisimman","mahdollista","me","meidän","meille","meillä","melkein","melko","menee","meneet","menemme","menen","menet","menette","menevät","meni","menimme","menin","menit","menivät","mennessä","mennyt","menossa","mihin","mikin","miksi","mikä","mikäli","mikään","milloin","milloinkan","minne","minun","minut","minä","missä","mistä","miten","mitä","mitään","moi","molemmat","mones","monesti","monet","moni","moniaalla","moniaalle","moniaalta","monta","muassa","muiden","muita","muka","mukaan","mukaansa","mukana","mutta","muu","muualla","muualle","muualta","muuanne","muulloin","muun","muut","muuta","muutama","muutaman","muuten","myöhemmin","myös","myöskin","myöskään","myötä","ne","neljä","neljän","neljää","niiden","niin","niistä","niitä","noin","nopeammin","nopeasti","nopeiten","nro","nuo","nyt","näiden","näin","näissä","näissähin","näissälle","näissältä","näissästä","näitä","nämä","ohi","oikea","oikealla","oikein","ole","olemme","olen","olet","olette","oleva","olevan","olevat","oli","olimme","olin","olisi","olisimme","olisin","olisit","olisitte","olisivat","olit","olitte","olivat","olla","olleet","olli","ollut","oma","omaa","omaan","omaksi","omalle","omalta","oman","omassa","omat","omia","omien","omiin","omiksi","omille","omilta","omissa","omista","on","onkin","onko","ovat","paikoittain","paitsi","pakosti","paljon","paremmin","parempi","parhaillaan","parhaiten","perusteella","peräti","pian","pieneen","pieneksi","pienelle","pienellä","pieneltä","pienempi","pienestä","pieni","pienin","puolesta","puolestaan","päälle","runsaasti","saakka","sadam","sama","samaa","samaan","samalla","samallalta","samallassa","samallasta","saman","samat","samoin","sata","sataa","satojen","se","seitsemän","sekä","sen","seuraavat","siellä","sieltä","siihen","siinä","siis","siitä","sijaan","siksi","silloin","sillä","silti","sinne","sinua","sinulle","sinulta","sinun","sinussa","sinusta","sinut","sinä","sisäkkäin","sisällä","siten","sitten","sitä","ssa","sta","suoraan","suuntaan","suuren","suuret","suuri","suuria","suurin","suurten","taa","taas","taemmas","tahansa","tai","takaa","takaisin","takana","takia","tapauksessa","tarpeeksi","tavalla","tavoitteena","te","tietysti","todella","toinen","toisaalla","toisaalle","toisaalta","toiseen","toiseksi","toisella","toiselle","toiselta","toisemme","toisen","toisensa","toisessa","toisesta","toista","toistaiseksi","toki","tosin","tuhannen","tuhat","tule","tulee","tulemme","tulen","tulet","tulette","tulevat","tulimme","tulin","tulisi","tulisimme","tulisin","tulisit","tulisitte","tulisivat","tulit","tulitte","tulivat","tulla","tulleet","tullut","tuntuu","tuo","tuolla","tuolloin","tuolta","tuonne","tuskin","tykö","tähän","tällä","tällöin","tämä","tämän","tänne","tänä","tänään","tässä","tästä","täten","tätä","täysin","täytyvät","täytyy","täällä","täältä","ulkopuolella","usea","useasti","useimmiten","usein","useita","uudeksi","uudelleen","uuden","uudet","uusi","uusia","uusien","uusinta","uuteen","uutta","vaan","vahemmän","vai","vaiheessa","vaikea","vaikean","vaikeat","vaikeilla","vaikeille","vaikeilta","vaikeissa","vaikeista","vaikka","vain","varmasti","varsin","varsinkin","varten","vasen","vasenmalla","vasta","vastaan","vastakkain","vastan","verran","vielä","vierekkäin","vieressä","vieri","viiden","viime","viimeinen","viimeisen","viimeksi","viisi","voi","voidaan","voimme","voin","voisi","voit","voitte","voivat","vuoden","vuoksi","vuosi","vuosien","vuosina","vuotta","vähemmän","vähintään","vähiten","vähän","välillä","yhdeksän","yhden","yhdessä","yhteen","yhteensä","yhteydessä","yhteyteen","yhtä","yhtäälle","yhtäällä","yhtäältä","yhtään","yhä","yksi","yksin","yksittäin","yleensä","ylemmäs","yli","ylös","ympäri","älköön","älä"];var fr$1=["a","abord","absolument","afin","ah","ai","aie","ailleurs","ainsi","ait","allaient","allo","allons","allô","alors","anterieur","anterieure","anterieures","apres","après","as","assez","attendu","au","aucun","aucune","aujourd","aujourd'hui","aupres","auquel","aura","auraient","aurait","auront","aussi","autre","autrefois","autrement","autres","autrui","aux","auxquelles","auxquels","avaient","avais","avait","avant","avec","avoir","avons","ayant","b","bah","bas","basee","bat","beau","beaucoup","bien","bigre","boum","bravo","brrr","c","car","ce","ceci","cela","celle","celle-ci","celle-là","celles","celles-ci","celles-là","celui","celui-ci","celui-là","cent","cependant","certain","certaine","certaines","certains","certes","ces","cet","cette","ceux","ceux-ci","ceux-là","chacun","chacune","chaque","cher","chers","chez","chiche","chut","chère","chères","ci","cinq","cinquantaine","cinquante","cinquantième","cinquième","clac","clic","combien","comme","comment","comparable","comparables","compris","concernant","contre","couic","crac","d","da","dans","de","debout","dedans","dehors","deja","delà","depuis","dernier","derniere","derriere","derrière","des","desormais","desquelles","desquels","dessous","dessus","deux","deuxième","deuxièmement","devant","devers","devra","different","differentes","differents","différent","différente","différentes","différents","dire","directe","directement","dit","dite","dits","divers","diverse","diverses","dix","dix-huit","dix-neuf","dix-sept","dixième","doit","doivent","donc","dont","douze","douzième","dring","du","duquel","durant","dès","désormais","e","effet","egale","egalement","egales","eh","elle","elle-même","elles","elles-mêmes","en","encore","enfin","entre","envers","environ","es","est","et","etant","etc","etre","eu","euh","eux","eux-mêmes","exactement","excepté","extenso","exterieur","f","fais","faisaient","faisant","fait","façon","feront","fi","flac","floc","font","g","gens","h","ha","hein","hem","hep","hi","ho","holà","hop","hormis","hors","hou","houp","hue","hui","huit","huitième","hum","hurrah","hé","hélas","i","il","ils","importe","j","je","jusqu","jusque","juste","k","l","la","laisser","laquelle","las","le","lequel","les","lesquelles","lesquels","leur","leurs","longtemps","lors","lorsque","lui","lui-meme","lui-même","là","lès","m","ma","maint","maintenant","mais","malgre","malgré","maximale","me","meme","memes","merci","mes","mien","mienne","miennes","miens","mille","mince","minimale","moi","moi-meme","moi-même","moindres","moins","mon","moyennant","multiple","multiples","même","mêmes","n","na","naturel","naturelle","naturelles","ne","neanmoins","necessaire","necessairement","neuf","neuvième","ni","nombreuses","nombreux","non","nos","notamment","notre","nous","nous-mêmes","nouveau","nul","néanmoins","nôtre","nôtres","o","oh","ohé","ollé","olé","on","ont","onze","onzième","ore","ou","ouf","ouias","oust","ouste","outre","ouvert","ouverte","ouverts","o|","où","p","paf","pan","par","parce","parfois","parle","parlent","parler","parmi","parseme","partant","particulier","particulière","particulièrement","pas","passé","pendant","pense","permet","personne","peu","peut","peuvent","peux","pff","pfft","pfut","pif","pire","plein","plouf","plus","plusieurs","plutôt","possessif","possessifs","possible","possibles","pouah","pour","pourquoi","pourrais","pourrait","pouvait","prealable","precisement","premier","première","premièrement","pres","probable","probante","procedant","proche","près","psitt","pu","puis","puisque","pur","pure","q","qu","quand","quant","quant-à-soi","quanta","quarante","quatorze","quatre","quatre-vingt","quatrième","quatrièmement","que","quel","quelconque","quelle","quelles","quelqu'un","quelque","quelques","quels","qui","quiconque","quinze","quoi","quoique","r","rare","rarement","rares","relative","relativement","remarquable","rend","rendre","restant","reste","restent","restrictif","retour","revoici","revoilà","rien","s","sa","sacrebleu","sait","sans","sapristi","sauf","se","sein","seize","selon","semblable","semblaient","semble","semblent","sent","sept","septième","sera","seraient","serait","seront","ses","seul","seule","seulement","si","sien","sienne","siennes","siens","sinon","six","sixième","soi","soi-même","soit","soixante","son","sont","sous","souvent","specifique","specifiques","speculatif","stop","strictement","subtiles","suffisant","suffisante","suffit","suis","suit","suivant","suivante","suivantes","suivants","suivre","superpose","sur","surtout","t","ta","tac","tant","tardive","te","tel","telle","tellement","telles","tels","tenant","tend","tenir","tente","tes","tic","tien","tienne","tiennes","tiens","toc","toi","toi-même","ton","touchant","toujours","tous","tout","toute","toutefois","toutes","treize","trente","tres","trois","troisième","troisièmement","trop","très","tsoin","tsouin","tu","té","u","un","une","unes","uniformement","unique","uniques","uns","v","va","vais","vas","vers","via","vif","vifs","vingt","vivat","vive","vives","vlan","voici","voilà","vont","vos","votre","vous","vous-mêmes","vu","vé","vôtre","vôtres","w","x","y","z","zut","à","â","ça","ès","étaient","étais","était","étant","été","être","ô"];var hr$1=["a","ako","ali","bi","bih","bila","bili","bilo","bio","bismo","biste","biti","bumo","da","do","duž","ga","hoće","hoćemo","hoćete","hoćeš","hoću","i","iako","ih","ili","iz","ja","je","jedna","jedne","jedno","jer","jesam","jesi","jesmo","jest","jeste","jesu","jim","joj","još","ju","kada","kako","kao","koja","koje","koji","kojima","koju","kroz","li","me","mene","meni","mi","mimo","moj","moja","moje","mu","na","nad","nakon","nam","nama","nas","naš","naša","naše","našeg","ne","nego","neka","neki","nekog","neku","nema","netko","neće","nećemo","nećete","nećeš","neću","nešto","ni","nije","nikoga","nikoje","nikoju","nisam","nisi","nismo","niste","nisu","njega","njegov","n