@@ -19,8 +19,44 @@ export function checkDelegates(contents = fs.readFileSync('./delegates.txt', 'ut
1919    'VM' ,  'WH' ,  'YK' ,  'ZB' , 
2020  ] ) ; 
2121
22+   // list of abbreviations that are not ideal. 
23+   // most of these are here because they are grandfathered in. 
24+   // new elements should only be false positives. 
25+   const  NON_IDEAL_ABBRS  =  new  Set ( [ 
26+     'AVP' ,  'AC' ,  'AK' ,  'AEC' ,  'AS' ,  'AR' ,  'ASH' ,  'AWB' ,  'ARB' ,  'ACB' , 
27+     'AVK' ,  'ABU' ,  'ALH' ,  'AEH' ,  'AVC' ,  'AYS' ,  'BM' ,  'RTM' ,  'BZ' , 
28+     'BG' ,  'BB' ,  'BE' ,  'BRK' ,  'BT' ,  'BNG' ,  'CJT' ,  'CP' ,  'CZW' ,  'CM' , 
29+     'CHU' ,  'LCP' ,  'CJI' ,  'CF' ,  'CJR' ,  'CCN' ,  'DHC' ,  'DDC' ,  'DJF' , 
30+     'DLM' ,  'DAS' ,  'DE' ,  'DVE' ,  'DH' ,  'DMP' ,  'DEN' ,  'DTL' ,  'DJW' , 
31+     'DFS' ,  'DT' ,  'DFV' ,  'DL' ,  'DS' ,  'DD' ,  'DMM' ,  'EDB' ,  'EY' ,  'EF' , 
32+     'ET' ,  'EA' ,  'REK' ,  'FED' ,  'FP' ,  'FN' ,  'FRT' ,  'FYT' ,  'GI' ,  'GN' , 
33+     'GKZ' ,  'GY' ,  'GRS' ,  'GPT' ,  'GCW' ,  'LGY' ,  'GB' ,  'HUG' ,  'IH' ,  'IT' , 
34+     'IOA' ,  'IVH' ,  'IS' ,  'JBS' ,  'JPG' ,  'JH' ,  'JRB' ,  'JSL' ,  'JK' , 
35+     'JXF' ,  'JAN' ,  'JTO' ,  'JS' ,  'JFP' ,  'JHL' ,  'JSW' ,  'JZY' ,  'JAZ' , 
36+     'JMN' ,  'YJM' ,  'JN' ,  'JP' ,  'JDD' ,  'JT' ,  'JPB' ,  'KGO' ,  'KZM' ,  'KM' , 
37+     'KCD' ,  'KG' ,  'KR' ,  'KS' ,  'XAX' ,  'KHG' ,  'KOT' ,  'KBK' ,  'LB' ,  'LZH' , 
38+     'LM' ,  'LWT' ,  'LEO' ,  'LIU' ,  'LL' ,  'LCA' ,  'LFP' ,  'MJN' ,  'MHA' , 
39+     'MPC' ,  'MED' ,  'MH' ,  'MM' ,  'MJS' ,  'MWS' ,  'MAR' ,  'MS' ,  'MAG' ,  'MF' , 
40+     'MLS' ,  'MZG' ,  'MP' ,  'MCW' ,  'JXZ' ,  'MQW' ,  'WMM' ,  'MYC' ,  'MGR' , 
41+     'MCM' ,  'NH' ,  'SNS' ,  'NC' ,  'NLY' ,  'NM' ,  'NL' ,  'OH' ,  'PBO' ,  'PL' , 
42+     'PFM' ,  'PJ' ,  'PZE' ,  'PFC' ,  'PLH' ,  'PMD' ,  'RX' ,  'JHJ' ,  'RB' ,  'RH' , 
43+     'ROF' ,  'ZRJ' ,  'STH' ,  'SC' ,  'SM' ,  'SMK' ,  'SYH' ,  'SFC' ,  'SJY' , 
44+     'SRK' ,  'SYP' ,  'SP' ,  'SRL' ,  'SZH' ,  'SJL' ,  'SSA' ,  'SZT' ,  'TAB' , 
45+     'TEK' ,  'TS' ,  'TW' ,  'TOC' ,  'YTX' ,  'XTY' ,  'TJC' ,  'TD' ,  'TC' ,  'TVC' , 
46+     'VM' ,  'WH' ,  'XWC' ,  'LWW' ,  'WES' ,  'WWW' ,  'WXK' ,  'HUX' ,  'WYJ' , 
47+     'YKZ' ,  'YIY' ,  'YKL' ,  'YRL' ,  'YYC' ,  'LZM' ,  'ZYY' ,  'LZJ' ,  'ZB' , 
48+     'ZJL' , 
49+   ] ) ; 
50+ 
51+   // delegates with only one name. this list should be as close to zero as possible... 
52+   const  MONONYMOUS  =  new  Set ( [ 
53+     'Cuili' , 
54+     'Surma' , 
55+   ] ) ; 
56+ 
57+   const  allAbbrs  =  new  Set ( contents . match ( / (?< = \( ) [ ^ ) ] * (? = \) ) / g) ) ; 
2258
23-   const  re  =  / ^ (?< name > [ ^ ( ] + ) (?:   \( (?< abbr > [ ^ ) ] * ) \) ) ? $ / ; 
59+   const  re  =  / ^ (?< firstName > [ ^ (   ] + )   ? (?< lastName > [ ^ ( ] + ) ? (?:   \( (?< abbr > [ ^ ) ] * ) \) ) ? $ / ; 
2460  const  abbrs  =  new  Map ; 
2561  const  lines  =  contents . split ( '\n' ) ; 
2662
@@ -30,7 +66,7 @@ export function checkDelegates(contents = fs.readFileSync('./delegates.txt', 'ut
3066  for  ( const  line  of  lines )  { 
3167    if  ( line . length  ===  0 )  continue ; 
3268    const  match  =  re . exec ( line ) ; 
33-     const  {  abbr }  =  match . groups ; 
69+     const  {  abbr,  firstName ,  lastName  }  =  match . groups ; 
3470
3571    if  ( previousLine . localeCompare ( line ,  'en' )  >  0 )  { 
3672      throw  new  Error ( `Line ${ lineNumber }  : Not in lexicographic order.` ) ; 
@@ -57,9 +93,29 @@ export function checkDelegates(contents = fs.readFileSync('./delegates.txt', 'ut
5793    } 
5894    abbrs . set ( abbr ,  lineNumber ) ; 
5995
96+     const  idealTLA  =  getIdealTLA ( firstName ,  lastName ) ; 
97+ 
98+     if  ( idealTLA ) { 
99+       if  ( ! allAbbrs . has ( idealTLA )  &&  ! NON_IDEAL_ABBRS . has ( abbr ) ) { 
100+         throw  new  Error ( `Line ${ lineNumber }  : Should be using ideal TLA (${ idealTLA }  ).  Note: because code cannot distinguish between a middle name vs a two-part last name, this may be a false positive.` ) 
101+       } 
102+     }  else  if  ( ! MONONYMOUS . has ( firstName ) )  { 
103+       throw  new  Error ( `Line ${ lineNumber }  : Unexpected mononymous delegate.` ) 
104+     } 
105+ 
60106    previousLine  =  line ; 
61107    ++ lineNumber ; 
62108  } 
63109
64110  console . debug ( '...delegates are valid\n' ) ; 
65111} 
112+ 
113+ function  getIdealTLA ( firstName ,  lastName )  { 
114+ 
115+   if  ( lastName )  { 
116+     return  `${ firstName . slice ( 0 ,  1 ) } ${ lastName . slice ( 0 ,  1 ) } ${ lastName . slice ( lastName . length  -  1 ) }  ` . toUpperCase ( ) ; 
117+   } 
118+ 
119+   return  null ; 
120+ 
121+ } 
0 commit comments