1- import { FunboxWordsFrequency , WordsetPick , Wordset } from "../wordset" ;
1+ import {
2+ FunboxWordsFrequency ,
3+ WordsetPick ,
4+ Wordset ,
5+ IWordset ,
6+ } from "../wordset" ;
27import * as GetText from "../../utils/generate" ;
38import { Config } from "../../config/store" ;
49import { setConfig , toggleFunbox } from "../../config/setters" ;
@@ -30,9 +35,9 @@ import { Language, LanguageObject } from "@monkeytype/schemas/languages";
3035import { qs } from "../../utils/dom" ;
3136
3237export type FunboxFunctions = {
33- getWord ?: ( wordset ?: Wordset , wordIndex ?: number ) => string ;
38+ getWord ?: ( wordset ?: IWordset , wordIndex ?: number ) => string ;
3439 punctuateWord ?: ( word : string ) => string ;
35- withWords ?: ( words ?: string [ ] ) => Promise < Wordset | PolyglotWordset > ;
40+ withWords ?: ( words ?: string [ ] ) => Promise < IWordset > ;
3641 alterText ?: ( word : string , wordIndex : number , wordsBound : number ) => string ;
3742 applyConfig ?: ( ) => void ;
3843 applyGlobalCSS ?: ( ) => void ;
@@ -149,25 +154,34 @@ class PseudolangWordGenerator extends Wordset {
149154 }
150155}
151156
152- export class PolyglotWordset extends Wordset {
157+ export class PolyglotWordset implements IWordset {
153158 readonly wordsetMap : Map < Language , Wordset > ;
154159 readonly languageProperties : Map < Language , JSONData . LanguageProperties > ;
155160 readonly langs : Language [ ] ;
156-
157- constructor (
158- words : string [ ] ,
159- wordsetMap : Map < Language , Wordset > ,
160- languageProperties : Map < Language , JSONData . LanguageProperties > ,
161- ) {
162- super ( words ) ;
163- this . languageProperties = languageProperties ;
164- this . langs = Array . from ( languageProperties . keys ( ) ) ;
165- this . wordsetMap = wordsetMap ;
161+ length : number ;
162+
163+ constructor ( languages : LanguageObject [ ] ) {
164+ this . languageProperties = new Map < Language , JSONData . LanguageProperties > ( ) ;
165+ this . wordsetMap = new Map < Language , Wordset > ( ) ;
166+ this . length = 0 ;
167+ this . langs = [ ] ;
168+
169+ for ( const lang of languages ) {
170+ const count = lang . words . length ;
171+ this . length += count ;
172+ this . langs . push ( lang . name ) ;
173+ this . languageProperties . set ( lang . name , {
174+ noLazyMode : lang . noLazyMode ,
175+ ligatures : lang . ligatures ,
176+ rightToLeft : lang . rightToLeft ,
177+ additionalAccents : lang . additionalAccents ,
178+ } ) ;
179+ this . wordsetMap . set ( lang . name , new Wordset ( lang . words ) ) ;
180+ }
166181 this . resetIndexes ( ) ;
167- this . length = words . length ;
168182 }
169183
170- override resetIndexes ( ) : void {
184+ resetIndexes ( ) : void {
171185 this . wordsetMap . forEach ( ( ws ) => {
172186 ws . resetIndexes ( ) ;
173187 } ) ;
@@ -183,20 +197,36 @@ export class PolyglotWordset extends Wordset {
183197 return { wordset : this . wordsetMap . get ( language ) as Wordset , language } ;
184198 }
185199
186- override randomWord ( mode : FunboxWordsFrequency ) : WordsetPick {
200+ randomWord ( mode : FunboxWordsFrequency ) : WordsetPick {
187201 const { wordset, language } = this . getWordsetAndLang ( ) ;
188202 return { word : wordset . randomWord ( mode ) . word , language } ;
189203 }
190204
191- override shuffledWord ( ) : WordsetPick {
205+ shuffledWord ( ) : WordsetPick {
192206 const { wordset, language } = this . getWordsetAndLang ( ) ;
193207 return { word : wordset . shuffledWord ( ) . word , language } ;
194208 }
195209
196- override nextWord ( ) : WordsetPick {
210+ nextWord ( ) : WordsetPick {
197211 const { wordset, language } = this . getWordsetAndLang ( ) ;
198212 return { word : wordset . nextWord ( ) . word , language } ;
199213 }
214+
215+ hasLigatures ( ) : boolean {
216+ for ( const props of this . languageProperties . values ( ) ) {
217+ if ( props . ligatures ) return true ;
218+ }
219+ return false ;
220+ }
221+
222+ hasChar ( char : string ) : boolean {
223+ for ( const wordset of this . wordsetMap . values ( ) ) {
224+ if ( wordset . hasChar ( char ) ) {
225+ return true ;
226+ }
227+ }
228+ return false ;
229+ }
200230}
201231
202232const list : Partial < Record < FunboxName , FunboxFunctions > > = {
@@ -580,9 +610,9 @@ const list: Partial<Record<FunboxName, FunboxFunctions>> = {
580610 } ,
581611 } ,
582612 weakspot : {
583- getWord ( wordset ?: Wordset ) : string {
613+ getWord ( wordset ?: IWordset ) : string {
584614 if ( wordset !== undefined ) return WeakSpot . getWord ( wordset ) ;
585- else return "" ;
615+ return "" ;
586616 } ,
587617 } ,
588618 pseudolang : {
@@ -713,7 +743,7 @@ const list: Partial<Record<FunboxName, FunboxFunctions>> = {
713743 } ,
714744 } ,
715745 polyglot : {
716- async withWords ( _words ) {
746+ async withWords ( _words ) : Promise < PolyglotWordset > {
717747 const promises = Config . customPolyglot . map ( async ( language ) =>
718748 JSONData . getLanguage ( language ) . catch ( ( ) => {
719749 showNoticeNotification (
@@ -772,30 +802,7 @@ const list: Partial<Record<FunboxName, FunboxFunctions>> = {
772802 throw new WordGenError ( "" ) ;
773803 }
774804
775- // build languageProperties
776- const languageProperties : Map < Language , JSONData . LanguageProperties > =
777- new Map (
778- languages . map ( ( lang ) => [
779- lang . name ,
780- {
781- noLazyMode : lang . noLazyMode ,
782- ligatures : lang . ligatures ,
783- rightToLeft : lang . rightToLeft ,
784- additionalAccents : lang . additionalAccents ,
785- } ,
786- ] ) ,
787- ) ;
788- // build wordsetMap and words
789- const wordsetMap = new Map < Language , Wordset > ( ) ;
790- let end = 0 ;
791- const words : string [ ] = [ ] ;
792- for ( const lang of languages ) {
793- const start = end ;
794- end += lang . words . length ;
795- words . push ( ...lang . words ) ;
796- wordsetMap . set ( lang . name , new Wordset ( words . slice ( start , end ) ) ) ;
797- }
798- return new PolyglotWordset ( words , wordsetMap , languageProperties ) ;
805+ return new PolyglotWordset ( languages ) ;
799806 } ,
800807 } ,
801808} ;
0 commit comments