@@ -4,9 +4,12 @@ import * as _ from 'lodash';
44import { StoreSync } from '../store/store-sync' ;
55import { Store } from '../store/types' ;
66
7+ export type NgramMode = 'ngrams' | 'collocates' ;
8+
79export interface NgramSettings {
10+ mode : NgramMode ,
811 size : number ;
9- positions : string ;
12+ positions ? : string ;
1013 freqCompensation : boolean ;
1114 analysis : string ;
1215 maxDocuments : number ;
@@ -23,38 +26,41 @@ export class NgramParameters extends StoreSync<NgramSettings> {
2326 }
2427
2528 stringifyNgramSettings ( state : NgramSettings ) : string {
26- return [ `s:${ state . size } ` , `p:${ state . positions } ` , `c:${ state . freqCompensation } ` ,
27- `a:${ state . analysis } ` , `m:${ state . maxDocuments } ` , `n:${ state . numberOfNgrams } ` ] . join ( ',' )
29+ return [
30+ `o:${ state . mode == 'collocates' ? 'c' : 'n' } ` ,
31+ `s:${ state . size } ` ,
32+ `p:${ state . positions } ` ,
33+ `c:${ state . freqCompensation } ` ,
34+ `a:${ state . analysis } ` ,
35+ `m:${ state . maxDocuments } ` ,
36+ `n:${ state . numberOfNgrams } `
37+ ] . join ( ',' )
2838 }
2939
3040 stateToStore ( state : NgramSettings ) : Params {
3141 return { ngramSettings : this . stringifyNgramSettings ( state ) }
3242 }
3343
3444 storeToState ( params : Params ) : NgramSettings {
35- if ( _ . has ( params , 'ngramSettings' ) ) {
36- const stringComponents = params [ 'ngramSettings' ] . split ( ',' ) ;
37- return {
38- size : parseInt ( this . findSetting ( 's' , stringComponents ) , 10 ) ,
39- positions : this . findSetting ( 'p' , stringComponents ) ,
40- freqCompensation : this . findSetting ( 'c' , stringComponents ) === 'true' ,
41- analysis : this . findSetting ( 'a' , stringComponents ) ,
42- maxDocuments : parseInt ( this . findSetting ( 'm' , stringComponents ) , 10 ) ,
43- numberOfNgrams : parseInt ( this . findSetting ( 'n' , stringComponents ) , 10 ) ,
44- }
45- }
45+ const parsed = this . parseParamString ( _ . get ( params , 'ngramSettings' , '' ) ) ;
4646 return {
47- size : 2 ,
48- positions : 'any' ,
49- freqCompensation : false ,
50- analysis : 'none' ,
51- maxDocuments : 50 ,
52- numberOfNgrams : 10 ,
53- } as NgramSettings ;
47+ mode : _ . get ( parsed , 'o' ) === 'c' ? 'collocates' : 'ngrams' ,
48+ size : this . parseInt ( _ . get ( parsed , 's' ) , 2 ) ,
49+ positions : _ . get ( parsed , 'p' , 'any' ) ,
50+ freqCompensation : _ . get ( parsed , 'c' ) === 'true' ,
51+ analysis : _ . get ( parsed , 'a' , 'none' ) ,
52+ maxDocuments : this . parseInt ( _ . get ( parsed , 'm' ) , 50 ) ,
53+ numberOfNgrams : this . parseInt ( _ . get ( parsed , 'n' ) , 10 ) ,
54+ }
55+ }
56+
57+ private parseParamString ( value : string ) : Record < string , string > {
58+ const pairs = value . split ( ',' ) . map ( part => part . split ( ':' , 2 ) )
59+ return _ . fromPairs ( pairs ) ;
5460 }
5561
56- findSetting ( abbreviation : string , stringComponents : string [ ] ) : string | undefined {
57- const setting = stringComponents . find ( s => s [ 0 ] === abbreviation ) ;
58- return setting . split ( ':' ) [ 1 ] ;
62+ private parseInt ( value : string | undefined , defaultValue : number ) : number {
63+ const parsed = parseInt ( value , 10 ) ;
64+ return _ . isNaN ( parsed ) ? defaultValue : parsed ;
5965 }
6066}
0 commit comments