UNPKG

2.31 kBJavaScriptView Raw
1
2
3/*! litejs.com/MIT-LICENSE.txt */
4
5this.accept = function(choices, priority) {
6 // jshint quotmark:single, -W064
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 // type / [ tree. ] subtype [ +suffix ] [ ; parameters ]
35 fnStr += ',type:' + capture(1, /(.*)\\\//, '($1)\\/') +
36 ',subtype:' + capture(2, /\/(.+?)(?=\\\+|$)/, '/($1)') +
37 ',suffix:' + capture(3, /\+(.+)/, '+($1)')
38 } else if (key = priority == 'lang' && rule.match(/^..(?=\-)/i)) {
39 // Basic Filtering
40 // https://tools.ietf.org/html/rfc4647#section-3.3.1
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