UNPKG

1.79 kBJavaScriptView Raw
1
2
3/*! litejs.com/MIT-LICENSE.txt */
4
5module.exports = function(choices, priority) {
6 var group = 0
7 , ruleSeq = 0
8 , rules = choices.constructor === Object ? Object.keys(choices) : choices
9 , escapeRe = /[.+?^!:${}()|\[\]\/\\]/g
10 , fnStr = 'return function(i){for(var m,t,l={q:null};(m=r.exec(i))&&(m='
11 , reStr = 'var r=/(?:^|,\\s*)(?:('
12 + ('' + rules).replace(/[^,;]+|\s*;\s*(\w+)=("([^"]*)"|[^,;\s]*)|,/ig, function add(rule, key, token, qstr, offset) {
13 if (key) {
14 fnStr += ',' + key + ':unescape(m[' + (++group + 1) + ']!==void 0?m[' + (group + 1) + ']:m[' + (group++) + ']||"' + escape(qstr == null ? token : qstr ) + '")'
15 return '(?=(?:"[^"]*"|[^,])*;\\s*' + key + '(?:=|\\*=utf-8\'\\w*\')("([^"]*)"|[^\\s,;]+)|)'
16 }
17 if (rule === ',') {
18 return ')|('
19 }
20 fnStr += (offset ? '}:m[' : 'm[') + (++group) + ']?{rule:"' + rule + '",match:m[' + group + ']'
21 if (choices !== rules) {
22 fnStr += ',o:c[R[' + (ruleSeq++) + ']]'
23 }
24
25 function capture(j, re, to) {
26 return /\*/.test(key[j]) ?
27 ((rule = rule.replace(re, to)), 'm[' + (++group) + ']') :
28 '"' + (key[j] || '') + '"'
29 }
30
31 key = rule.match(/^(.+?)\/(.+?)(?:\+(.+))?$/)
32 rule = rule.replace(escapeRe, '\\$&')
33 if (key) {
34 // type / [ tree. ] subtype [ +suffix ] [ ; parameters ]
35 fnStr += ',type:' + capture(1, /(.*)\\\//, '($1)\\/')
36 + ',subtype:' + capture(2, /\/(.+?)(?=\\\+|$)/, '/($1)')
37 + ',suffix:' + capture(3, /\+(.+)/, '+($1)')
38 }
39 rule = rule.replace(/\*/g, '[^,;\\s\\/+]+?')
40
41 return (offset ? rule : '(?:' + rule + '|[*\\/]+)') + add(0, 'q', 1)
42 })
43 + '))\\s*(?=,|;|$)(?:"[^"]*"|[^,])*/gi;'
44
45 return Function(
46 'c,R',
47 reStr +
48 fnStr.replace(/m\[\d+\]\?(?!.*m\[\d+\]\?)/, '') +
49 '});){t=1*m.q;if((m.q=t>=0&&t<1?t:1)>l.q' + (priority || '') + ')l=m}return l}'
50 )(choices, rules)
51}
52