@@ -215,21 +215,31 @@ async function analyse(input?: string | string[], opts: T.Options = {}): Promise
215215 }
216216 // Search each language
217217 let skipExts = false ;
218+ // Check if filename is a match
218219 for ( const lang in langData ) {
219- // Check if filename is a match
220220 const matchesName = langData [ lang ] . filenames ?. some ( name => paths . basename ( file . toLowerCase ( ) ) === name . toLowerCase ( ) ) ;
221221 if ( matchesName ) {
222222 addResult ( file , lang ) ;
223223 skipExts = true ;
224224 }
225225 }
226+ // Check if extension is a match
227+ const possibleExts : { ext : string , lang : T . Language } [ ] = [ ] ;
226228 if ( ! skipExts ) for ( const lang in langData ) {
227- // Check if extension is a match
228- const matchesExt = langData [ lang ] . extensions ?. some ( ext => file . toLowerCase ( ) . endsWith ( ext . toLowerCase ( ) ) ) ;
229- if ( matchesExt ) {
230- addResult ( file , lang ) ;
229+ const extMatches = langData [ lang ] . extensions ?. filter ( ext => file . toLowerCase ( ) . endsWith ( ext . toLowerCase ( ) ) ) ;
230+ if ( extMatches ?. length ) {
231+ for ( const ext of extMatches )
232+ possibleExts . push ( { ext , lang } ) ;
231233 }
232234 }
235+ // Apply more specific extension if available
236+ const isComplexExt = ( ext : string ) => / \. .+ \. / . test ( ext ) ;
237+ const hasComplexExt = possibleExts . some ( data => isComplexExt ( data . ext ) ) ;
238+ for ( const { ext, lang } of possibleExts ) {
239+ if ( hasComplexExt && ! isComplexExt ( ext ) ) continue ;
240+ if ( ! hasComplexExt && isComplexExt ( ext ) ) continue ;
241+ addResult ( file , lang ) ;
242+ }
233243 // Fallback to null if no language matches
234244 if ( ! fileAssociations [ file ] ) {
235245 addResult ( file , null ) ;
0 commit comments