UNPKG

wordreference

Version:

A Node solution for retrieving wordreference translations

216 lines (215 loc) 11 kB
"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()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.defineWord = exports.formRequestURL = exports.deltaParity = exports.isEmptyWord = void 0; var axios_1 = __importDefault(require("axios")); var cheerio_1 = require("cheerio"); var dictionaries_1 = require("./dictionaries"); var URL = 'https://www.wordreference.com'; var isEmptyWord = function (word) { if (word.word && word.word !== '') return false; if (word.pos && word.pos !== '') return false; if (word.sense && word.sense !== '') return false; return true; }; exports.isEmptyWord = isEmptyWord; var deltaParity = function ($row, lastRowSelector, onChange) { var current = $row.hasClass('odd') ? 'odd' : 'even'; if (!lastRowSelector || current !== lastRowSelector) { onChange(current); } }; exports.deltaParity = deltaParity; var formRequestURL = function (dictionary, word) { if (/enes/.test(dictionary)) { return URL + "/es/translation.asp?tranword=" + word; } if (/enes|esen/.test(dictionary)) { return URL + "/es/en/translation.asp?spen=" + word; } return URL + '/' + dictionary + '/' + word; }; exports.formRequestURL = formRequestURL; var defineWord = function (word, dictionary) { return __awaiter(void 0, void 0, void 0, function () { var dictionaryLookup, entry, requestURL, page, $, results, sections, section, currentTranslation, example, rowInCurrent, lastRowSelector, resetCatchers, audioWidget, audioMatch, audioLinks; return __generator(this, function (_a) { switch (_a.label) { case 0: dictionaryLookup = Object.entries(dictionaries_1.wrDictionaryLookup); if (dictionaryLookup.some(function (_a) { var _key = _a[0], value = _a[1]; return value === dictionary; })) { entry = dictionaryLookup.find(function (_a) { var _key = _a[0], value = _a[1]; return value === dictionary; })[0]; dictionary = entry; } else if (!dictionaryLookup.some(function (_a) { var key = _a[0]; return key === dictionary; })) { throw new Error('Improper dictionary reference given'); } requestURL = (0, exports.formRequestURL)(dictionary, word); return [4 /*yield*/, axios_1.default.get(requestURL)]; case 1: page = _a.sent(); if (page.data === undefined) throw new Error("Failed to fetch page at ".concat(requestURL)); $ = (0, cheerio_1.load)(page.data); results = $('tr.wrtopsection, tr.odd, tr.even').not('.more').toArray(); sections = []; example = {}; rowInCurrent = 0; resetCatchers = function () { if (example && JSON.stringify(example) !== '{}' && currentTranslation) currentTranslation.examples.push(example); if (currentTranslation) section.translations.push(currentTranslation); currentTranslation = null; example = {}; }; results.forEach(function (row) { var $row = $(row); rowInCurrent++; if ($row.hasClass('wrtopsection')) { if (section) { resetCatchers(); lastRowSelector = null; sections.push(section); } section = { title: $row.find('.ph').text(), translations: [], }; return; } (0, exports.deltaParity)($row, lastRowSelector, function (rowSelector) { lastRowSelector = rowSelector; resetCatchers(); rowInCurrent = 1; }); if (!currentTranslation) { currentTranslation = { word: { word: '', pos: '' }, definition: '', meanings: [], examples: [], }; } var $examples = $row.find('.FrEx, .ToEx').first(); if ($examples.length) { if ($examples.hasClass('FrEx')) { if (example.phrase) { currentTranslation.examples.push(example); example = {}; } example.phrase = $examples.text(); } else if ($examples.hasClass('ToEx')) { if (!example.translations) example.translations = []; example.translations.push($examples.text()); } return; } var columns = $row.children().toArray(); var currentMeaning = { word: '', pos: '', }; for (var _i = 0, columns_1 = columns; _i < columns_1.length; _i++) { var col = columns_1[_i]; var $col = $(col); if ($col.hasClass('FrWrd')) { currentTranslation.word.word = $col.find('strong').text().trim().replace('⇒', ''); currentTranslation.word.pos = $col.find('.POS2').text().trim(); } else if ($col.hasClass('ToWrd')) { currentMeaning.pos = $col.find('.POS2').text().trim(); $col.find('.POS2').remove(); currentMeaning.word = $col.text().trim().replace('⇒', ''); } else { var meaningSense = $col .find('.dsense') .text() .trim() .replace(/[\(\)]/g, ''); $col.find('.dsense').remove(); if (meaningSense !== '') currentMeaning.sense = meaningSense; var sense = $col.find('.Fr2').text().trim(); $col.find('.Fr2').remove(); if (sense !== '') currentTranslation.word.sense = sense; var note = $col.hasClass('notePubl') ? $col.text().trim() : ''; if (note !== '') currentTranslation.note = note; if (rowInCurrent === 1) currentTranslation.definition = $col .text() .trim() .replace(/[\(\)]/g, ''); } } if (!(0, exports.isEmptyWord)(currentMeaning)) currentTranslation.meanings.push(currentMeaning); }); resetCatchers(); if (section) sections.push(section); audioWidget = $('#listen_widget'); audioMatch = audioWidget .find('script') .toString() .match(/'([\w\/\.]*)'/g) || []; audioLinks = audioMatch.map(function (filePath) { return URL + filePath.replace(/'(.*)'/, '$1'); }); return [2 /*return*/, { inputWord: word, sections: sections, audioLinks: audioLinks }]; } }); }); }; exports.defineWord = defineWord;