1
module.exports = preferredLanguages;
2
preferredLanguages.preferredLanguages = preferredLanguages;
4
function parseAcceptLanguage(accept) {
5
return accept.split(',').map(function(e) {
6
return parseLanguage(e.trim());
7
}).filter(function(e) {
12
function parseLanguage(s) {
13
var match = s.match(/^\s*(\S+?)(?:-(\S+?))?\s*(?:;(.*))?$/);
14
if (!match) return null;
16
var prefix = match[1],
20
if (suffix) full += "-" + suffix;
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]);
39
function getLanguagePriority(language, accepted) {
40
var match = getClosestMatch(language, accepted);
41
return match ? match.q : 0;
44
function getClosestMatch(language, accepted) {
45
var parsed = parseLanguage(language);
47
var matches = accepted.filter(function(a) {
48
return a.full === parsed.full;
50
if (matches.length) return matches[0];
52
matches = accepted.filter(function(a) {
53
return a.prefix === parsed.prefix && !a.suffix;
55
if (matches.length) return matches[0];
57
matches = accepted.filter(function(a) {
58
return a.prefix === parsed.prefix;
60
if (matches.length) return matches[0];
62
matches = accepted.filter(function(a) {
63
return a.prefix === '*';
68
function preferredLanguages(accept, provided) {
69
accept = parseAcceptLanguage(accept || '');
72
var ret = provided.map(function(type) {
73
return [type, getLanguagePriority(type, accept)];
74
}).filter(function(pair) {
76
}).sort(function(a, b) {
78
return a[1] === b[1] ? 0 : a[1] > b[1] ? -1 : 1;
79
}).map(function(pair) {
85
return accept.sort(function (a, b) {
87
return a.q < b.q ? 1 : -1;
88
}).map(function(type) {