1+ module . exports = ( data , fileInfo ) => {
2+ const charRegex = new RegExp ( / \d | \n | \s | \- | \. | \, | \: | \; | \? | \! | \< | \> | \[ | \] | \{ | \} | \& | \= | \| / , "g" ) ;
3+ const totalCharacters = data . content . replace ( charRegex , "" ) . length ;
4+ const langArr = data . languageArr ;
5+ const pos = data . pos ;
6+ const testFilePath = data . testFilePath ;
7+
8+ const secondLanguage = langArr . reduce ( ( acc , val ) => {
9+ if ( acc . name === fileInfo . language ) return val ;
10+ if ( val . name === fileInfo . language ) return acc ;
11+
12+ return acc . count >= val . count ? acc : val ;
13+ } ) ;
14+
15+ const languageRatio = langArr [ pos ] . count / ( secondLanguage . count + langArr [ pos ] . count ) ;
16+ const characterWordRatio = langArr [ pos ] . count / totalCharacters ;
17+
18+ let lowerLimit = null ;
19+ let upperLimit = null ;
20+ const multiplier = 0.8 ;
21+
22+ if ( data . utf8 ) {
23+ lowerLimit = langArr [ pos ] . utfFrequency ? langArr [ pos ] . utfFrequency . low * multiplier : null ;
24+ upperLimit = langArr [ pos ] . utfFrequency ? ( langArr [ pos ] . utfFrequency . low + langArr [ pos ] . utfFrequency . high ) / 2 : null ;
25+
26+ } else {
27+ lowerLimit = langArr [ pos ] . isoFrequency ? langArr [ pos ] . isoFrequency . low * multiplier : null ;
28+ upperLimit = langArr [ pos ] . isoFrequency ? ( langArr [ pos ] . isoFrequency . low + langArr [ pos ] . isoFrequency . high ) / 2 : null ;
29+ }
30+
31+ let confidenceScore ;
32+
33+ if ( ! lowerLimit || ! upperLimit ) {
34+ confidenceScore = null ;
35+
36+ } else if ( characterWordRatio >= upperLimit ) {
37+ confidenceScore = 1 ;
38+
39+ } else if ( characterWordRatio > lowerLimit ) {
40+ const range = upperLimit - lowerLimit ;
41+ const surplus = characterWordRatio - lowerLimit ;
42+ const confidenceRaisePercentage = surplus / range ;
43+ const confidenceRaise = ( 1 - languageRatio ) * confidenceRaisePercentage ;
44+ confidenceScore = Number ( ( languageRatio + confidenceRaise ) . toFixed ( 2 ) ) ;
45+
46+ } else {
47+ confidenceScore = Number ( ( languageRatio * ( characterWordRatio / lowerLimit ) ) . toFixed ( 2 ) ) ;
48+ }
49+
50+ // If the test script is running
51+ if ( testFilePath ) {
52+ return {
53+ name : testFilePath . substr ( testFilePath . lastIndexOf ( '/' ) + 1 ) ,
54+ path : testFilePath ,
55+ language : fileInfo . language ,
56+ utf8 : data . utf8 ,
57+ confidence : confidenceScore ,
58+ ratio : Number ( languageRatio . toFixed ( 2 ) ) ,
59+ count : langArr [ pos ] . count ,
60+ totalCharacters : totalCharacters ,
61+ characterWordRatio : characterWordRatio . toFixed ( 6 ) ,
62+ secondLanguage : {
63+ name : secondLanguage . name ,
64+ count : secondLanguage . count
65+ }
66+ } ;
67+ }
68+
69+ return confidenceScore ;
70+ } ;
0 commit comments