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