tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

Mac OSのUA(バージョン)からOSの名前(コードネーム)を出してみるjavascript

はじめに

自分はそんなにmacユーザってわけでもないので、
このmacについてからバージョン番号(10.9.4みたいの)を見てもOSの名前がすぐ出てきません。(コードネームっていうらしい)

なので、バージョンからMac OSの名前(コードネーム)を出すようなやつないかなーってことで、適当ですが書いてみました。こんな感じ
mac以外は全部名無しとかにしてますw

github

githubにもあげてあるので最初に晒しておきます
https://github.com/tweeeety/macos-identifier

こんな実装

概要

やってることはほんといたってアナログ的です。
uaからバージョンらしきものを抜き出して、用意しておいた'version'=>'codename'のhashから引いてきただけです。

ua

uaはjsであればwindow.navigator.userAgentでとれます

console.log(window.navigator.userAgent);

// こんな感じで表示される
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36 : Mavericks
version=>codenameのhash

下記のサイトを参考にさせて頂きました。
Mac OS X バージョンとコードネーム

これをもとに'10.7' => 'Lion'のような形で定義しただけです。

  • 一部抜粋
    this.hash = {
      '10.0' : 'Cheetah',
      '10.1' : 'Puma',
      '10.2' : 'Jaguar',
      '10.3' : 'Panther',
      '10.4' : 'Tiger',
      '10.5' : 'Leopard',
      '10.6' : 'Snow Leopard',
      '10.7' : 'Lion',
      '10.8' : 'Mountain Lion',
      '10.9' : 'Mavericks',
      '10.10' : 'Yosemite'
    }

本体ソース

githubにあげてあるのでそちらで見れますがこんな感じ。
おもいっきし強引に正規表現ってます。いけてないw

var MacOSIdentifier = (function() {
  var constructor = function() {
    this.hash = {
      '10.0' : 'Cheetah',
      '10.1' : 'Puma',
      '10.2' : 'Jaguar',
      '10.3' : 'Panther',
      '10.4' : 'Tiger',
      '10.5' : 'Leopard',
      '10.6' : 'Snow Leopard',
      '10.7' : 'Lion',
      '10.8' : 'Mountain Lion',
      '10.9' : 'Mavericks',
      '10.10' : 'Yosemite'
    }
  };
  constructor.prototype.judgeVer = function(ua){
  //var ua = window.navigator.userAgent;
  // 最小マッチ
  var osStr = ua.match(/.*\(.+((:?Mac).+?)\).*/);
  if( !osStr ) { return null };
  //console.log(osStr);
  var tmp = osStr[1];
  //console.log(ua);
  //console.log(tmp);

    var tmps = tmp.split(";");
    //console.log(tmps);

    var osVerStr = tmps[0];
  var osVer = osVerStr.match(/.*(\d{2}(:?[\.|\_]+)\d+)(:?[\.|\_]+.*)?/);

    if( !osVer ) { return null };
  
  return (osVer[1]? osVer[1] : null);
  }
  constructor.prototype.formatVer = function(str) {
    var newStr = str.replace('_', '.');
    var newStrs = newStr.split('.');
    return newStrs[0] + '.' + newStrs[1];
  } 
  constructor.prototype.ver2Name = function(ver) {
    //console.log(this.hash);
    return this.hash[ver] || null;
  }
  constructor.prototype.judge = function(ua) {
    var osVer = this.judgeVer(ua);
    //console.log(osVer);

    if( !osVer ) { return undefined };
    osVer = this.formatVer(osVer);
    //console.log(osVer);

    var codeName = this.ver2Name(osVer);
    return codeName || undefined;
  }
  return constructor;
})();

ほんの少しはテスト

申し訳程度ですが、こんな感じで確認してみました。
一部、usリストのOpera 10の扱いがよくわかりませんでした。

uaのサンプルは下記のサイトを参考にさせて頂きました。 →ユーザーエージェント

完成形

テストもろくにしてないし完成形というにはおこがましい出来ですが、
まぁ自分が使いたかっただけなのでw
こんな感じです。

まとめ

ってことで完全自分が後で使いたいだけのメモ記事\(^o^)/
とはいえ間違ってたら教えてください!