diff --git a/web/src/components/Suggestion.tsx b/web/src/components/Suggestion.tsx index b016792..720ac0e 100644 --- a/web/src/components/Suggestion.tsx +++ b/web/src/components/Suggestion.tsx @@ -14,111 +14,127 @@ type Modifier = (word: string) => string; const maximumCount = 3; const modifiers: Modifier[] = [ (word): string => `${capitalize(germanify(word))}`, - (word): string => `${capitalize(stem(word))}able`, - (word): string => `${capitalize(stem(word))}al`, - (word): string => `${capitalize(stem(word))}el`, - (word): string => `${capitalize(stem(word))}em`, - (word): string => `${capitalize(stem(word))}en`, - (word): string => `${capitalize(stem(word))}er`, - (word): string => `${capitalize(stem(word))}ery`, - (word): string => `${capitalize(stem(word))}ia`, - (word): string => `${capitalize(stem(word))}ible`, - (word): string => `${capitalize(stem(word))}ics`, - (word): string => `${capitalize(stem(word))}ifier`, - (word): string => `${capitalize(stem(word))}ify`, - (word): string => `${capitalize(stem(word))}ii`, - (word): string => `${capitalize(stem(word))}ist`, - (word): string => `${capitalize(stem(word))}in`, - (word): string => `${capitalize(stem(word))}io`, - (word): string => `${capitalize(stem(word))}iverse`, - (word): string => `${capitalize(stem(word))}ium`, - (word): string => `${capitalize(stem(word))}um`, - (word): string => `${capitalize(stem(word))}ory`, - (word): string => njoin(capitalize(stem(word)), 'y'), (word): string => `${capitalize(word)}`, - (word): string => `${capitalize(word)}AI`, - (word): string => `${capitalize(word)}API`, - (word): string => `${capitalize(word)}base`, - (word): string => `${capitalize(word)}book`, - (word): string => `${capitalize(word)}Bot`, - (word): string => `${capitalize(word)}butler`, - (word): string => `${capitalize(word)}cast`, - (word): string => `${capitalize(word)}CDN`, - (word): string => `${capitalize(word)}Club`, - (word): string => `${capitalize(word)}DB`, - (word): string => `${capitalize(word)}feed`, - (word): string => `${capitalize(word)}Finder`, - (word): string => `${capitalize(word)}flow`, - (word): string => `${capitalize(word)}form`, - (word): string => njoin(capitalize(word), 'ful'), - (word): string => `${capitalize(word)}Go`, - (word): string => `${capitalize(word)}gram`, - (word): string => `${capitalize(word)}Hero`, - (word): string => `${capitalize(word)}Hub`, - (word): string => `${capitalize(word)}Hunt`, - (word): string => `${capitalize(word)}It`, - (word): string => `${capitalize(word)}Kit`, - (word): string => `${capitalize(word)}Lab`, - (word): string => njoin(capitalize(word), 'let'), - (word): string => `${capitalize(word)}Link`, - (word): string => `${capitalize(word)}list`, - (word): string => `${capitalize(word)}mind`, - (word): string => njoin(capitalize(word), 'note'), - (word): string => `${capitalize(word)}Notes`, - (word): string => `${capitalize(word)}Pod`, - (word): string => `${capitalize(word)}Pro`, - (word): string => `${capitalize(word)}Scan`, - (word): string => njoin(capitalize(word), 'shot'), - (word): string => njoin(capitalize(word), 'space'), - (word): string => `${capitalize(word)}Stack`, - (word): string => `${capitalize(word)}Studio`, - (word): string => njoin(capitalize(word), 'time'), - (word): string => njoin(capitalize(word), 'way'), - (word): string => `${capitalize(word)}x`, - (word): string => `${lower(word)}-IO`, - (word): string => `${lower(word)}check`, - (word): string => `${lower(word)}lint`, - (word): string => `${lower(word)}ly`, - (word): string => `Air${capitalize(word)}`, - (word): string => `All${capitalize(word)}`, - (word): string => `Cloud${capitalize(word)}`, - (word): string => `Co${lower(word)}`, - (word): string => `Deep${capitalize(word)}`, - (word): string => `Easy${capitalize(word)}`, - (word): string => `Fast${lower(word)}`, - (word): string => `Fusion${capitalize(word)}`, - (word): string => `Git${capitalize(word)}`, - (word): string => `Go${capitalize(word)}`, - (word): string => `Hyper${capitalize(word)}`, - (word): string => `In${capitalize(word)}`, - (word): string => `Insta${lower(word)}`, - (word): string => `Lead${lower(word)}`, - (word): string => `lib${lower(word)}`, - (word): string => `Max${upper(word)}`, - (word): string => `Micro${lower(word)}`, - (word): string => `Native${capitalize(word)}`, - (word): string => `nano${lower(word)}`, - (word): string => `No${upper(word)}`, - (word): string => `Omni${capitalize(word)}`, - (word): string => `One${capitalize(word)}`, - (word): string => `Open${capitalize(word)}`, - (word): string => njoin('Octo', capitalize(word)), - (word): string => `Pro${capitalize(word)}`, - (word): string => `quick${lower(word)}`, - (word): string => `Smart${capitalize(word)}`, - (word): string => `Snap${capitalize(word)}`, - (word): string => `Super${lower(word)}`, - (word): string => `Semantic${capitalize(word)}`, - (word): string => `Up${lower(word)}`, - (word): string => `Un${lower(word)}`, - (word): string => `Wunder${lower(germanify(word))}`, - (word): string => `Zen${capitalize(word)}`, + (word): string => njoin('Air', capitalize(word), {elision: false}), + (word): string => njoin('All', capitalize(word), {elision: false}), + (word): string => njoin('Cloud', capitalize(word), {elision: false}), + (word): string => njoin('Co', lower(word), {elision: false}), + (word): string => njoin('Deep', capitalize(word), {elision: false}), + (word): string => njoin('Easy', capitalize(word), {elision: false}), + (word): string => njoin('Fast', lower(word), {elision: false}), + (word): string => njoin('Fire', lower(word), {elision: false}), + (word): string => njoin('Fusion', capitalize(word), {elision: false}), + (word): string => njoin('Git', capitalize(word), {elision: false}), + (word): string => njoin('Go', capitalize(word), {elision: false}), + (word): string => njoin('Hyper', capitalize(word), {elision: false}), + (word): string => njoin('In', capitalize(word), {elision: false}), + (word): string => njoin('Infini', lower(word)), + (word): string => njoin('Insta', lower(word), {elision: false}), + (word): string => njoin('i', capitalize(word)), + (word): string => njoin('Lead', lower(word), {elision: false}), + (word): string => njoin('Less', lower(word)), + (word): string => njoin('lib', lower(word), {elision: false}), (word): string => njoin('Many', lower(word)), + (word): string => njoin('Max', upper(word), {elision: false}), + (word): string => njoin('Micro', lower(word), {elision: false}), (word): string => njoin('mini', lower(word)), (word): string => njoin('Mono', lower(word)), + (word): string => njoin('Meta', lower(word)), + (word): string => njoin('nano', lower(word), {elision: false}), + (word): string => njoin('Native', capitalize(word), {elision: false}), (word): string => njoin('Next', lower(word)), + (word): string => njoin('No', upper(word), {elision: false}), + (word): string => njoin('Octo', capitalize(word)), + (word): string => njoin('Omni', capitalize(word), {elision: false}), + (word): string => njoin('One', capitalize(word), {elision: false}), + (word): string => njoin('Open', capitalize(word), {elision: false}), + (word): string => njoin('Pro', capitalize(word), {elision: false}), + (word): string => njoin('quick', lower(word), {elision: false}), + (word): string => njoin('Semantic', capitalize(word), {elision: false}), + (word): string => njoin('Smart', capitalize(word), {elision: false}), + (word): string => njoin('Snap', capitalize(word), {elision: false}), + (word): string => njoin('Super', lower(word), {elision: false}), + (word): string => njoin('Ultra', lower(word), {elision: false}), + (word): string => njoin('Un', lower(word), {elision: false}), (word): string => njoin('Uni', lower(word)), - (word): string => njoin(lower(word), 'joy'), + (word): string => njoin('Up', lower(word), {elision: false}), + (word): string => njoin('Wunder', lower(germanify(word)), {elision: false}), + (word): string => njoin('Zen', capitalize(word), {elision: false}), + (word): string => njoin('Zero', capitalize(word), {elision: false}), + (word): string => njoin(capitalize(stem(word)), 'able', {elision: false}), + (word): string => njoin(capitalize(stem(word)), 'al', {elision: false}), + (word): string => njoin(capitalize(stem(word)), 'el', {elision: false}), + (word): string => njoin(capitalize(stem(word)), 'em', {elision: false}), + (word): string => njoin(capitalize(stem(word)), 'en', {elision: false}), + (word): string => njoin(capitalize(stem(word)), 'er', {elision: false}), + (word): string => njoin(capitalize(stem(word)), 'ery', {elision: false}), + (word): string => njoin(capitalize(stem(word)), 'ia', {elision: false}), + (word): string => njoin(capitalize(stem(word)), 'ible', {elision: false}), + (word): string => njoin(capitalize(stem(word)), 'ics', {elision: false}), + (word): string => njoin(capitalize(stem(word)), 'ifier', {elision: false}), + (word): string => njoin(capitalize(stem(word)), 'ify', {elision: false}), + (word): string => njoin(capitalize(stem(word)), 'ii', {elision: false}), + (word): string => njoin(capitalize(stem(word)), 'in', {elision: false}), + (word): string => njoin(capitalize(stem(word)), 'io', {elision: false}), + (word): string => njoin(capitalize(stem(word)), 'ist', {elision: false}), + (word): string => njoin(capitalize(stem(word)), 'ity', {elision: false}), + (word): string => njoin(capitalize(stem(word)), 'ium', {elision: false}), + (word): string => njoin(capitalize(stem(word)), 'iverse', {elision: false}), + (word): string => njoin(capitalize(stem(word)), 'ory', {elision: false}), + (word): string => njoin(capitalize(stem(word)), 'um', {elision: false}), + (word): string => njoin(capitalize(stem(word)), 'y'), + (word): string => njoin(capitalize(word), 'AI', {elision: false}), + (word): string => njoin(capitalize(word), 'API', {elision: false}), + (word): string => njoin(capitalize(word), 'App'), + (word): string => njoin(capitalize(word), 'base', {elision: false}), + (word): string => njoin(capitalize(word), 'book', {elision: false}), + (word): string => njoin(capitalize(word), 'Bot', {elision: false}), + (word): string => njoin(capitalize(word), 'butler', {elision: false}), + (word): string => njoin(capitalize(word), 'byte', {elision: false}), + (word): string => njoin(capitalize(word), 'cast', {elision: false}), + (word): string => njoin(capitalize(word), 'CDN', {elision: false}), + (word): string => njoin(capitalize(word), 'CI', {elision: false}), + (word): string => njoin(capitalize(word), 'Club', {elision: false}), + (word): string => njoin(capitalize(word), 'DB', {elision: false}), + (word): string => njoin(capitalize(word), 'Express', {elision: false}), + (word): string => njoin(capitalize(word), 'feed', {elision: false}), + (word): string => njoin(capitalize(word), 'Finder', {elision: false}), + (word): string => njoin(capitalize(word), 'flow', {elision: false}), + (word): string => njoin(capitalize(word), 'form', {elision: false}), + (word): string => njoin(capitalize(word), 'ful'), + (word): string => njoin(capitalize(word), 'Go', {elision: false}), + (word): string => njoin(capitalize(word), 'gram', {elision: false}), + (word): string => njoin(capitalize(word), 'Hero', {elision: false}), + (word): string => njoin(capitalize(word), 'Hub', {elision: false}), + (word): string => njoin(capitalize(word), 'Hunt', {elision: false}), + (word): string => njoin(capitalize(word), 'IO', {elision: false}), + (word): string => njoin(capitalize(word), 'It', {elision: false}), + (word): string => njoin(capitalize(word), 'Kit', {elision: false}), + (word): string => njoin(capitalize(word), 'Lab', {elision: false}), + (word): string => njoin(capitalize(word), 'let'), + (word): string => njoin(capitalize(word), 'less'), + (word): string => njoin(capitalize(word), 'Link', {elision: false}), + (word): string => njoin(capitalize(word), 'list', {elision: false}), + (word): string => njoin(capitalize(word), 'list', {elision: false}), + (word): string => njoin(capitalize(word), 'lit', {elision: false}), + (word): string => njoin(capitalize(word), 'mind', {elision: false}), + (word): string => njoin(capitalize(word), 'ML', {elision: false}), + (word): string => njoin(capitalize(word), 'note', {elision: false}), + (word): string => njoin(capitalize(word), 'Notes', {elision: false}), + (word): string => njoin(capitalize(word), 'Pod', {elision: false}), + (word): string => njoin(capitalize(word), 'Pro', {elision: false}), + (word): string => njoin(capitalize(word), 'Scan', {elision: false}), + (word): string => njoin(capitalize(word), 'shot'), + (word): string => njoin(capitalize(word), 'space'), + (word): string => njoin(capitalize(word), 'Stack', {elision: false}), + (word): string => njoin(capitalize(word), 'Studio', {elision: false}), + (word): string => njoin(capitalize(word), 'time'), + (word): string => njoin(capitalize(word), 'way'), + (word): string => njoin(capitalize(word), 'x', {elision: false}), + (word): string => njoin(capitalize(word), 'check', {elision: false}), + (word): string => njoin(capitalize(word), 'joy'), + (word): string => njoin(lower(word), 'lint', {elision: false}), + (word): string => njoin(lower(word), 'ly', {elision: false}), ]; function modifyWord(word: string): string { @@ -180,13 +196,8 @@ const Suggestion: React.FC<{ if (!isEffective) { return; } - synonymRef.current = synonyms; - const best = fillArray( - sampleFromArray(synonyms, maximumCount), - query, - maximumCount, - ).map((word) => modifyWord(word)); - setBestWords(best); + synonymRef.current = [query, ...synonyms]; + shuffle(); } }; fn(); @@ -257,7 +268,7 @@ const Item = styled.div` margin: 10px 12px 0; cursor: pointer; font-weight: bold; - font-family: monospace; + font-family: inherit; font-size: 1.5rem; line-height: 1em; border-bottom: 1px dashed black; diff --git a/web/src/util/text.ts b/web/src/util/text.ts index b965e50..6b3fdbc 100644 --- a/web/src/util/text.ts +++ b/web/src/util/text.ts @@ -26,6 +26,12 @@ export function germanify(word: string): string { return word.replace('c', 'k').replace('C', 'K'); } -export function njoin(lhs: string, rhs: string): string { - return lhs + rhs.replace(new RegExp(`^${lhs[-1]}`, 'i'), ''); +export function njoin( + lhs: string, + rhs: string, + {elision = true}: {elision?: boolean} = {}, +): string { + return elision + ? lhs + rhs.replace(new RegExp(`^${lhs[-1]}`, 'i'), '') + : lhs + rhs; } diff --git a/web/src/util/zones.ts b/web/src/util/zones.ts index c0aaeab..6e9a82a 100644 --- a/web/src/util/zones.ts +++ b/web/src/util/zones.ts @@ -1380,7 +1380,6 @@ export const zones = [ 'teva', 'tf', 'tg', - 'th', 'thai', 'thd', 'theater',