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