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.
89 lines (71 loc) • 2.62 kB
text/typescript
import { type Cheerio, type CheerioAPI, load } from 'cheerio';
import type { Element } from 'domhandler';
import { request } from '../lib';
import type { ParsingResult } from '../types';
export const crawl = (word: string): Promise<string> => {
return request({
protocol: 'https',
hostname: 'www.dwds.de',
path: `/wb/${encodeURIComponent(word)}`,
});
};
export const parse = (html: string): ParsingResult => {
const $ = load(html);
const definitions = [parseBedeutungsubersicht, parseBedeutungen, parseBedeutung].reduce<string[]>(
(results, parseDefinition) => (results.length === 0 ? parseDefinition($) : results),
[],
);
const exists = Array.from($('.label-danger')).every((label) => $(label).text() !== 'Hinweis');
return { definitions, exists };
};
const parseBedeutungsubersicht = ($: CheerioAPI): string[] => {
Array.from($('.bedeutungsuebersicht ol > li > a')).forEach((item) => {
$(item).text($(item).text().replace(/\n/g, ''));
});
Array.from($('.bedeutungsuebersicht ol > li > ol > li')).forEach((item) => {
const text = `\n${$(item).text().replace(/\n/g, '')}`;
const $text = $(`<div>${text}</div>`);
$(item).replaceWith($text);
});
Array.from($('.bedeutungsuebersicht ol > li > ol')).forEach((list) => {
const $list = $(list);
const html = $list.html() || '';
const $html = $(`<div>${html}</div>`);
const $prev = $list.prev('a');
if ($prev) {
$prev.append($html);
$(list).remove();
} else {
$(list).replaceWith($html);
}
});
return parseDefinitions($, $('.bedeutungsuebersicht ol > li'));
};
const parseBedeutung = ($: CheerioAPI): string[] => {
return parseDefinitions($, $('.dwdswb-lesart .dwdswb-definition-spezifizierung'));
};
const parseBedeutungen = ($: CheerioAPI): string[] => {
const definitions = parseDefinitions($, $('.dwdswb-lesart .dwdswb-definition'));
if (definitions.length > 0) {
return definitions;
}
const $references = $('.dwdswb-lesart .dwdswb-verweis');
const references = Array.from($references).reduce<string[]>((result, reference) => {
const html = reference.attribs['data-content'] || '<span />';
const values = $(html)
.text()
.split(';')
.map((value) => value.trim());
return result.concat(values);
}, []);
return references;
};
const parseDefinitions = ($: CheerioAPI, $definitions: Cheerio<Element>) => {
return Array.from($definitions).map((definition) =>
$(definition)
.text()
.replace(/[ ]+/g, ' ')
.replace(/[ ]\n/g, '\n')
.replace(/^[0-9]+\.\s/g, ''),
);
};