summaryrefslogtreecommitdiff
path: root/node_modules/ua-parser/js/lib/os.js
blob: f54b99abfc8bd99ff8f153146e15220369e96ddb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
var startsWithDigit = require('./helpers').startsWithDigit;

exports.OS = OS
function OS(family, major, minor, patch, patchMinor) {
  this.family = family || 'Other';
  this.major = major || null;
  this.minor = minor || null;
  this.patch = patch || null;
  this.patchMinor = patchMinor || null;
}

OS.prototype.toVersionString = function() {
  var output = '';
  if (this.major != null) {
    output += this.major;
    if (this.minor != null) {
      output += '.' + this.minor;
      if (this.patch != null) {
        if (startsWithDigit(this.patch)) { output += '.'; }
        output += this.patch;
        if (this.patchMinor != null) {
          if (startsWithDigit(this.patchMinor)) { output += '.'; }
          output += this.patchMinor;
        }
      }
    }
  }
  return output;
};

OS.prototype.toString = function() {
  var suffix = this.toVersionString();
  if (suffix) { suffix = ' ' + suffix; }
  return this.family + suffix;
};

function _makeParsers(obj) {
  var regexp = new RegExp(obj.regex),
      famRep = obj.os_replacement,
      majorRep = obj.os_v1_replacement,
      minorRep = obj.os_v2_replacement,
      patchRep = obj.os_v3_replacement,
      patchMinorRep = obj.os_v4_replacement;

  function parser(str) {
    var m = str.match(regexp);
    if (!m) { return null; }
    
    var family = famRep ? famRep.replace('$1', m[1]) : m[1],
        major = majorRep || m[2],
        minor = minorRep || m[3],
        patch = patchRep || m[4],
        patchMinor = patchMinorRep || m[5];

    return new OS(family, major, minor, patch, patchMinor);
  }

  return parser;
}

exports.makeParser = function(regexes) {
  var parsers = regexes.map(_makeParsers)

  function parser(str) {
    var obj;

    if (typeof str === 'string') {
      for (var i = 0, length = parsers.length; i < length; i++) {
        obj = parsers[i](str);
        if (obj) { return obj; }
      }
    }

    return obj || new OS();
  }

  return parser;
}