arnaucube
arnaucube/socketioMEANseedPublic Self-hosted repository
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}