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