UNPKG

scrabble-solver

Version:

Scrabble Solver 2 - Free, open-source, cross-platform, multi-language analysis tool for Scrabble, Scrabble Duel, Super Scrabble, Letter League, Crossplay, Literaki, and Kelimelik. Quickly find the top-scoring words using the given board and tiles.

57 lines (56 loc) 2.32 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getWordList = void 0; const types_1 = require("@scrabble-solver/types"); const cheerio_1 = require("cheerio"); const fs_1 = __importDefault(require("fs")); const url_1 = require("url"); const lib_1 = require("../lib"); const PAGE_URL = 'https://sjp.pl/sl/growy/'; const FILE_TO_EXTRACT_FROM_ZIP = 'slowa.txt'; const REASONABLE_VALID_WORD_COUNT_TRESHOLD = 2_000_000; // more like 3M, but just to be safe const SECONDARY_FILE_URL = 'https://raw.githubusercontent.com/kamilmielnik/scrabble-dictionaries/refs/heads/master/polish/sjp.txt'; const getWordList = async () => { try { const tempFilepath = (0, lib_1.getTempFilepath)(); const zipUrl = await fetchZipUrl(PAGE_URL); const zipTempFilename = await (0, lib_1.downloadFile)(zipUrl); await (0, lib_1.unzip)(zipTempFilename, FILE_TO_EXTRACT_FROM_ZIP, tempFilepath); fs_1.default.unlinkSync(zipTempFilename); const file = fs_1.default.readFileSync(tempFilepath, 'utf-8'); fs_1.default.unlinkSync(tempFilepath); const words = (0, lib_1.extractWords)(file.toLocaleString(), 'pl-PL'); if (words.length < REASONABLE_VALID_WORD_COUNT_TRESHOLD) { return getBackupWordList(); } return words; } catch { return getBackupWordList(); } }; exports.getWordList = getWordList; const fetchZipUrl = async (url) => { const html = await (0, lib_1.downloadHtml)(url); const filename = parseZipContainingPage(html); const { href } = new url_1.URL(filename, url); return href; }; const parseZipContainingPage = (html) => { const $ = (0, cheerio_1.load)(html); const $links = $('a'); const links = Array.from($links) .map((link) => $(link).attr('href')) .filter(Boolean); const zipFilename = links.find((link) => link.endsWith('.zip')); if (typeof zipFilename === 'undefined') { throw new Error('Cannot find link to zip file on the page'); } return zipFilename; }; const getBackupWordList = () => { return (0, lib_1.getTxtWordList)(SECONDARY_FILE_URL, types_1.Locale.PL_PL); };