socketioMEANseed/server/node_modules/negotiator/lib/charset.js
server/node_modules/negotiator/lib/charset.jsRaw
1module.exports = preferredCharsets;
2preferredCharsets.preferredCharsets = preferredCharsets;
3
4function parseAcceptCharset(accept) {
5 return accept.split(',').map(function(e, i) {
6 return parseCharset(e.trim(), i);
7 }).filter(function(e) {
8 return e;
9 });
10}
11
12function parseCharset(s, i) {
13 var match = s.match(/^\s*(\S+?)\s*(?:;(.*))?$/);
14 if (!match) return null;
15
16 var charset = match[1];
17 var q = 1;
18 if (match[2]) {
19 var params = match[2].split(';')
20 for (var i = 0; i < params.length; i ++) {
21 var p = params[i].trim().split('=');
22 if (p[0] === 'q') {
23 q = parseFloat(p[1]);
24 break;
25 }
26 }
27 }
28
29 return {
30 charset: charset,
31 q: q,
32 i: i
33 };
34}
35
36function getCharsetPriority(charset, accepted) {
37 return (accepted.map(function(a) {
38 return specify(charset, a);
39 }).filter(Boolean).sort(function (a, b) {
40 if(a.s == b.s) {
41 return a.q > b.q ? -1 : 1;
42 } else {
43 return a.s > b.s ? -1 : 1;
44 }
45 })[0] || {s: 0, q:0});
46}
47
48function specify(charset, spec) {
49 var s = 0;
50 if(spec.charset.toLowerCase() === charset.toLowerCase()){
51 s |= 1;
52 } else if (spec.charset !== '*' ) {
53 return null
54 }
55
56 return {
57 s: s,
58 q: spec.q,
59 }
60}
61
62function preferredCharsets(accept, provided) {
63 // RFC 2616 sec 14.2: no header = *
64 accept = parseAcceptCharset(accept === undefined ? '*' : accept || '');
65 if (provided) {
66 return provided.map(function(type) {
67 return [type, getCharsetPriority(type, accept)];
68 }).filter(function(pair) {
69 return pair[1].q > 0;
70 }).sort(function(a, b) {
71 var pa = a[1];
72 var pb = b[1];
73 return (pb.q - pa.q) || (pb.s - pa.s) || (pa.i - pb.i);
74 }).map(function(pair) {
75 return pair[0];
76 });
77 } else {
78 return accept.sort(function (a, b) {
79 // revsort
80 return (b.q - a.q) || (a.i - b.i);
81 }).filter(function(type) {
82 return type.q > 0;
83 }).map(function(type) {
84 return type.charset;
85 });
86 }
87}