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 == null ? token : qstr)
|
21 | + ':m[' + group + '])'
|
22 | return '(?=(?:"[^"]*"|[^,])*;\\s*' + key + '(=|\\*=utf-8\'\\w*\')("([^"]*)"|[^\\s,;]+)|)'
|
23 | }
|
24 | if (rule == ',') {
|
25 | return ')|('
|
26 | }
|
27 | fnStr += (offset ? '}:m[' : 'm[') + (++group) + ']?{rule:"' + rule + '",match:m[' + group + ']'
|
28 | if (choices !== rules) {
|
29 | fnStr += ',o:c[R[' + (ruleSeq++) + ']]'
|
30 | }
|
31 |
|
32 | key = rule.match(/^(.+?)\/(.+?)(?:\+(.+))?$/)
|
33 | rule = rule.replace(escapeRe, '\\$&')
|
34 | if (key) {
|
35 |
|
36 | fnStr += ',type:' + capture(1, /(.*)\\\
|
37 | + ',subtype:' + capture(2, /\/(.+?)(?=\\\+|$)/, '/($1)')
|
38 | + ',suffix:' + capture(3, /\+(.+)/, '+($1)')
|
39 | } else if (key = priority == 'lang' && rule.match(/^..(?=\-)/i)) {
|
40 |
|
41 |
|
42 | if (!RegExp(key + '(?!-)', 'i').test(all)) {
|
43 | rule = '(?:' + rule + '|' + key + '(?!.+' + rule + '))'
|
44 | }
|
45 | }
|
46 | rule = rule.replace(/\*/g, '[^,;\\s\\/+]+?')
|
47 |
|
48 | return (offset ? rule : '(?:' + rule + '|[*\\/]+)') + add(0, 'q', 1)
|
49 |
|
50 | function capture(j, re, to) {
|
51 | return /\*/.test(key[j]) ?
|
52 | ((rule = rule.replace(re, to)), 'm[' + (++group) + ']') :
|
53 | '"' + (key[j] || '') + '"'
|
54 | }
|
55 | }) +
|
56 | '))\\s*(?=,|;|$)(?:"[^"]*"|[^,])*/gi;return function(i){var m,t,l={q:null};' +
|
57 | (
|
58 | group ?
|
59 | fnStr.replace(/m\[\d+\]\?(?!.*m\[\d+\]\?)/, '') +
|
60 | '});){t=1*m.q;if((m.q=t>=0&&t<1?t:1)>l.q' +
|
61 | (priority && priority !== 'lang' ? priority : '') +
|
62 | ')l=m}' : ''
|
63 | ) +
|
64 | 'return l}'
|
65 | )(choices, rules, function(op, str) {
|
66 | try {
|
67 | str = decodeURIComponent(str)
|
68 | } catch (e) {}
|
69 | return str
|
70 | })
|
71 | }
|
72 |
|