-
Notifications
You must be signed in to change notification settings - Fork 27
/
glosbe_word_search.js
99 lines (84 loc) · 2.96 KB
/
glosbe_word_search.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
'use strict'
const request = require('request-promise');
const DictionaryResponseData = require('./dictionary_response_data.js');
const WordMeaning = require('./word_meaning.js');
const DictionaryResult = require('./dictionary_result.js');
const PublicError = require('monochrome-bot').PublicError;
const prettyLanguageForLanguageCode = require('./language_code_maps.js').prettyLanguageForGlosbeLanguageCode;
const TRANSLATE_API = 'https://glosbe.com/gapi_v0_1/translate';
const RESPONSE_FORMAT = 'json';
const threeLetterLanguageCodeForTwoLetterLanguageCode = {
en: 'eng',
de: 'deu',
ja: 'jpn',
fr: 'fra',
es: 'spa',
ru: 'rus',
zh: 'zho',
it: 'ita',
ar: 'ara',
pl: 'pol',
jpn: 'jpn',
eng: 'eng'
};
function addMeaningsForLanguage(outMeanings, inMeanings, toLanguage) {
for (let meaning of inMeanings) {
if (meaning.language === toLanguage) {
outMeanings.push(new WordMeaning(meaning.text, []));
}
}
}
function parseGlosbeResponse(inData) {
let inResults = inData.tuc;
let fromLanguage = inData.from;
let toLanguage = inData.dest;
let phrase = inData.phrase;
let fromLanguagePretty = prettyLanguageForLanguageCode[fromLanguage];
let toLanguagePretty = prettyLanguageForLanguageCode[toLanguage];
let outResults = [];
if (inResults) {
for (let inResult of inResults) {
let inPhrase = inResult.phrase;
if (inPhrase && inPhrase.language === toLanguage) {
let resultWord = inPhrase.text;
let inMeanings = inResult.meanings;
let outMeanings = [];
if (inMeanings) {
addMeaningsForLanguage(outMeanings, inMeanings, fromLanguage);
addMeaningsForLanguage(outMeanings, inMeanings, toLanguage);
if (fromLanguage !== 'en' && toLanguage !== 'en') {
addMeaningsForLanguage(outMeanings, inMeanings, 'en');
}
outResults.push(new DictionaryResult([{word: resultWord, readings: []}], [], outMeanings));
}
}
}
}
return new DictionaryResponseData(phrase, fromLanguagePretty, toLanguagePretty, true, outResults, '');
}
module.exports.supportsLanguage = function(languageCode) {
return !!threeLetterLanguageCodeForTwoLetterLanguageCode[languageCode];
}
module.exports.search = function(fromLanguage, toLanguage, suffix) {
suffix = suffix.trim();
let requestFromLanguage = threeLetterLanguageCodeForTwoLetterLanguageCode[fromLanguage];
let requestToLanguage = threeLetterLanguageCodeForTwoLetterLanguageCode[toLanguage];
return request({
uri: TRANSLATE_API,
qs: {
from: requestFromLanguage,
dest: requestToLanguage,
format: RESPONSE_FORMAT,
phrase: suffix,
},
json: true,
timeout: 10000,
}).catch(err => {
throw new PublicError('Sorry, Glosbe dictionary is not responding. Please try again later.', 'Error', err);
}).then(data => {
if (data.result !== 'ok') {
throw new Error('Bad response code from Glosbe: ', data.result);
}
return parseGlosbeResponse(data);
});
};