import { BLANK } from '@scrabble-solver/constants'; import { type Config, type Locale } from '@scrabble-solver/types'; import { localeTransliterate } from './localeTransliterate'; interface Options { upperCaseDigraphsOnly?: boolean; } export const extractCharacters = (config: Config, value: string, options?: Options): string[] => { let index = 0; const characters: string[] = []; const finalValue = localeTransliterate(config.locale, value); while (index < finalValue.length) { const character = finalValue[index]; const characterLowercase = character.toLocaleLowerCase(config.locale); const nextCharacter = finalValue[index + 1]; const digraph = `${character}${nextCharacter}`; const digraphLowercase = digraph.toLocaleLowerCase(config.locale); const isValidDigraph = options?.upperCaseDigraphsOnly ? config.twoCharacterTiles.includes(digraphLowercase) && isUpperCase(config.locale, digraph) : config.twoCharacterTiles.includes(digraphLowercase); if (isValidDigraph) { characters.push(digraphLowercase); index += digraphLowercase.length; } else if (config.hasCharacter(characterLowercase) || characterLowercase === BLANK) { characters.push(characterLowercase); ++index; } else { ++index; } } return characters; }; const isUpperCase = (locale: Locale, value: string): boolean => { return value === value.toLocaleUpperCase(locale); };