UNPKG

scrabble-solver

Version:

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

43 lines (35 loc) 1.38 kB
import { load } from 'cheerio'; import fs from 'fs'; import { URL } from 'url'; import { downloadFile, downloadHtml, extractWords, getTempFilepath, unzip } from '../lib'; const PAGE_URL = 'https://sjp.pl/sl/growy/'; const FILE_TO_EXTRACT_FROM_ZIP = 'slowa.txt'; export const getWordList = async (): Promise<string[]> => { const tempFilepath = getTempFilepath(); const zipUrl = await fetchZipUrl(PAGE_URL); const zipTempFilename = await downloadFile(zipUrl); await unzip(zipTempFilename, FILE_TO_EXTRACT_FROM_ZIP, tempFilepath); fs.unlinkSync(zipTempFilename); const file = fs.readFileSync(tempFilepath, 'utf-8'); fs.unlinkSync(tempFilepath); const words = extractWords(file.toLocaleString(), 'pl-PL'); return words; }; const fetchZipUrl = async (url: string): Promise<string> => { const html = await downloadHtml(url); const filename = parseZipContainingPage(html); const { href } = new URL(filename, url); return href; }; const parseZipContainingPage = (html: string): string => { const $ = load(html); const $links = $('a'); const links = Array.from($links) .map((link) => $(link).attr('href')) .filter(Boolean) as string[]; 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; };