@@ -3,6 +3,7 @@ var path = require('path')
33var _ = require ( 'lodash' )
44var useragent = require ( 'useragent' )
55var Promise = require ( 'bluebird' )
6+ var mm = require ( 'minimatch' )
67
78exports . browserFullNameToShort = function ( fullName ) {
89 var agent = useragent . parse ( fullName )
@@ -13,6 +14,67 @@ exports.browserFullNameToShort = function (fullName) {
1314exports . isDefined = function ( value ) {
1415 return ! _ . isUndefined ( value )
1516}
17+ var parser = function ( pattern , out ) {
18+ if ( pattern . length === 0 ) return out
19+ var p = / ^ ( \[ [ ^ \] ] * \] | [ \* \+ @ \? ] \( ( .+ ?) \) ) / g
20+ var matches = p . exec ( pattern )
21+ if ( ! matches ) {
22+ var c = pattern [ 0 ]
23+ var t = 'word'
24+ if ( c === '*' ) {
25+ t = 'star'
26+ } else if ( c === '?' ) {
27+ t = 'optional'
28+ }
29+ out [ t ] ++
30+ return parser ( pattern . substring ( 1 ) , out )
31+ }
32+ if ( matches [ 2 ] !== undefined ) {
33+ out . ext_glob ++
34+ parser ( matches [ 2 ] , out )
35+ return parser ( pattern . substring ( matches [ 0 ] . length ) , out )
36+ }
37+ out . range ++
38+ return parser ( pattern . substring ( matches [ 0 ] . length ) , out )
39+ }
40+
41+ var gs_parser = function ( pattern , out ) {
42+ if ( pattern === '**' ) {
43+ out . glob_star ++
44+ return out
45+ }
46+ return parser ( pattern , out )
47+ }
48+
49+ var compare_weight_object = function ( w1 , w2 ) {
50+ return exports . mmComparePatternWeights (
51+ [ w1 . glob_star , w1 . star , w1 . ext_glob , w1 . range , w1 . optional ] ,
52+ [ w2 . glob_star , w2 . star , w2 . ext_glob , w2 . range , w2 . optional ]
53+ )
54+ }
55+
56+ exports . mmPatternWeight = function ( pattern ) {
57+ var m = new mm . Minimatch ( pattern )
58+ if ( ! m . globParts ) return [ 0 , 0 , 0 , 0 , 0 , 0 ]
59+ var result = m . globParts . reduce ( function ( prev , p ) {
60+ var r = p . reduce ( function ( prev , p ) {
61+ return gs_parser ( p , prev )
62+ } , { glob_star : 0 , ext_glob : 0 , word : 0 , star : 0 , optional : 0 , range : 0 } )
63+ if ( prev === undefined ) return r
64+ return compare_weight_object ( r , prev ) > 0 ? r : prev
65+ } , undefined )
66+ result . glob_sets = m . set . length
67+ return [ result . glob_sets , result . glob_star , result . star , result . ext_glob , result . range , result . optional ]
68+ }
69+
70+ exports . mmComparePatternWeights = function ( weight1 , weight2 ) {
71+ var n1 , n2 , diff
72+ n1 = weight1 [ 0 ]
73+ n2 = weight2 [ 0 ]
74+ diff = n1 - n2
75+ if ( diff !== 0 ) return diff / Math . abs ( diff )
76+ return weight1 . length > 1 ? exports . mmComparePatternWeights ( weight1 . slice ( 1 ) , weight2 . slice ( 1 ) ) : 0
77+ }
1678
1779exports . isFunction = _ . isFunction
1880exports . isString = _ . isString
0 commit comments