Преглед на файлове

Minor fix for ua-parser

Gerald преди 10 години
родител
ревизия
0f44c75bb8
променени са 7 файла, в които са добавени 139 реда и са изтрити 130 реда
  1. 1 1
      bower.json
  2. 1 1
      dist/duoshuo-ua-core.min.js
  3. 2 2
      dist/duoshuo-ua-parser-css.min.js
  4. 2 2
      dist/duoshuo-ua-parser.min.js
  5. 1 1
      package.json
  6. 125 121
      src/ua-parser.js
  7. 7 2
      test/tests.js

+ 1 - 1
bower.json

@@ -1,6 +1,6 @@
 {
   "name": "duoshuo-ua",
-  "version": "1.0.4",
+  "version": "1.0.5",
   "authors": [
     "Gerald <gera2ld@163.com>"
   ],

+ 1 - 1
dist/duoshuo-ua-core.min.js

@@ -1,7 +1,7 @@
 /**
  * Duoshuo UA Plugin - 精简版
  * 此版本不集成ua-parser,需要自行设置getUAString
- * @version v1.0.4
+ * @version v1.0.5
  * @license MIT
  * @author Gerald <gera2ld@163.com>
  */

Файловите разлики са ограничени, защото са твърде много
+ 2 - 2
dist/duoshuo-ua-parser-css.min.js


Файловите разлики са ограничени, защото са твърде много
+ 2 - 2
dist/duoshuo-ua-parser.min.js


+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "duoshuo-ua",
-  "version": "1.0.4",
+  "version": "1.0.5",
   "title": "Duoshuo UA Plugin",
   "description": "Plugin of duoshuo to show operating systems and browsers for duoshuo comments.",
   "author": "Gerald <gera2ld@163.com>",

+ 125 - 121
src/ua-parser.js

@@ -4,126 +4,130 @@
 */
 
 !function (window, undefined) {
-	var mapper = {
-		reg: function (str, maps) {
-			return str.replace(maps[0], maps[1]);
-		},
-		str: function (str, maps) {
-			return (str in maps) ? maps[str] : maps[''];
-		},
-		ieVer: function (str) {
-			return parseInt(str, 10) + 4;
-		},
-	};
-	var maps = {
-		winVer: {
-			'4.90': 'ME',
-			'NT3.51': 'NT 3.11',
-			'NT4.0': 'NT 4.0',
-			'NT 5.0': '2000',
-			'NT 5.1': 'XP',
-			'NT 5.2': 'XP',
-			'NT 6.0': 'Vista',
-			'NT 6.1': '7',
-			'NT 6.2': '8',
-			'NT 6.3': '8.1',
-			'NT 6.4': '10',
-			'NT 10.0': '10',
-			'ARM': 'RT',
-			'': '山寨版',
-		},
-	};
-	var NAME = 'name';
-	var VERSION = 'version';
-	var CLASS = 'cls';
-	var CLS_WIN = [CLASS, 'windows'];
-	var rules = {
-		os: [
-			// Windows
-			[/(Windows Phone)(?: OS)? ?([^; )]*)/i,
-				[NAME, VERSION, CLS_WIN]],
-			[/(Windows) ([^;)]*)/i,
-				[NAME, [VERSION, mapper.str, maps.winVer], CLS_WIN]],
-			[/\b(Windows)\b/i,
-				[NAME, [VERSION, '超级山寨版'], CLS_WIN]],
-			// Mac
-			[/(iPhone|iPod|iPad|Mac OS X)/i,
-				[NAME, [CLASS, 'mac']]],
-			// Android
-			[/(Android) ?([^; )]*)/i,
-				[NAME, VERSION, [CLASS, 'android']]],
-			// Linux
-			[/(Ubuntu|Linux)/i,
-				[NAME, [CLASS, 'linux']]],
-			[/()/i,
-				[[NAME, '山寨操作系统'], [CLASS, 'other']]],
-		],
-		browser: [
-			// Opera
-			[/(Opera Mini)\/(\d+)/i,
-				[NAME, VERSION]],
-			[[/(OPR)\/(\S+)/i, /(Presto)\/.*?Version\/(\S+)/i],
-				[[NAME, 'Opera'], VERSION]],
-			// Chromium based browsers
-			[/(Maxthon|Vivaldi|Chrome)\/(\S+)/i,
-				[NAME, VERSION]],
-			// UC/QQ
-			[/(UC|QQ)Browser\/(\S+)/i,
-				[[NAME, mapper.reg, [/$/, '浏览器']], VERSION]],
-			// Safari
-			[/Version\/(\S+) .*?(Safari)\//i,
-				[VERSION, NAME]],
-			// Firefox
-			[/(Firefox)\/(\S+)/i,
-				[NAME, VERSION]],
-			// IE
-			[/MS(IE) (\d+)\.0/i,
-				[[NAME, 'Internet Explorer'], VERSION]],
-			[/(Trident)\/(\d+)\.0/i,
-				[[NAME, 'Internet Explorer'], [VERSION, mapper.ieVer]]],
-			[/()/i,
-				[[NAME, '山寨浏览器']]],
-		],
-	};
-	function getResult(matches, keys) {
-		var res = {};
-		keys.forEach(function(key, i) {
-			var match = matches[i + 1];
-			if (Array.isArray(key)) {
-				if (typeof key[1] == 'function')
-					res[key[0]] = key[1](match, key[2]);
-				else res[key[0]] = key[1];
-			} else res[key] = match;
-		});
-		return res;
-	}
-	function getString(obj) {
-		var str = obj.name;
-		if (obj.version)
-			str += ' ' + obj.version;
-		return str;
-	}
-	function parse(agent) {
-		var result = {};
-		for (var key in rules)
-			rules[key].some(function (rule) {
-				var regex = rule[0];
-				var attrs = rule[1];
-				if (!Array.isArray(regex))
-					regex = [regex];
-				return regex.some(function(re) {
-					var matches = agent.match(re);
-					if (matches) {
-						result[key] = getResult(matches, attrs);
-						return true;
-					}
-				});
-			});
-		return result;
-	}
+  var mapper = {
+    reg: function (str, maps) {
+      return str.replace(maps[0], maps[1]);
+    },
+    str: function (str, maps) {
+      return (str in maps) ? maps[str] : maps[''];
+    },
+    ieVer: function (str) {
+      return parseInt(str, 10) + 4;
+    },
+  };
+  var maps = {
+    winVer: {
+      '4.90': 'ME',
+      'NT3.51': 'NT 3.11',
+      'NT4.0': 'NT 4.0',
+      'NT 5.0': '2000',
+      'NT 5.1': 'XP',
+      'NT 5.2': 'XP',
+      'NT 6.0': 'Vista',
+      'NT 6.1': '7',
+      'NT 6.2': '8',
+      'NT 6.3': '8.1',
+      'NT 6.4': '10',
+      'NT 10.0': '10',
+      'ARM': 'RT',
+      '': '山寨版',
+    },
+  };
+  var NAME = 'name';
+  var VERSION = 'version';
+  var CLASS = 'cls';
+  var CLS_WIN = [CLASS, 'windows'];
+  var rules = {
+    os: [
+      // Windows
+      [/(Windows Phone)(?: OS)? ?([^; )]*)/i,
+        [NAME, VERSION, CLS_WIN]],
+      [/(Windows) ([^;)]*)/i,
+        [NAME, [VERSION, mapper.str, maps.winVer], CLS_WIN]],
+      [/\b(Windows)\b/i,
+        [NAME, [VERSION, '超级山寨版'], CLS_WIN]],
+      // Mac
+      [/(iPhone|iPod|iPad|Mac OS X)/i,
+        [NAME, [CLASS, 'mac']]],
+      // Android
+      [/(Android) ?([^; )]*)/i,
+        [NAME, VERSION, [CLASS, 'android']]],
+      // Linux
+      [/(Ubuntu|Linux)/i,
+        [NAME, [CLASS, 'linux']]],
+      [/()/i,
+        [[NAME, '山寨操作系统'], [CLASS, 'other']]],
+    ],
+    browser: [
+      // Opera
+      [/(Opera Mini)\/(\d+)/i,
+        [NAME, VERSION]],
+      [[/(OPR)\/(\S+)/i, /(Presto)\/.*?Version\/(\S+)/i],
+        [[NAME, 'Opera'], VERSION]],
+      // Chromium based browsers
+      [/(Maxthon|Vivaldi)\/(\S+)/i,
+        [NAME, VERSION]],
+      // Chrome
+      // Chrome must be checked after other Chromium base browsers are checked
+      [/(Chrome)\/(\S+)/i,
+        [NAME, VERSION]],
+      // UC/QQ
+      [/(UC|QQ)Browser\/(\S+)/i,
+        [[NAME, mapper.reg, [/$/, '浏览器']], VERSION]],
+      // Safari
+      [/Version\/(\S+) .*?(Safari)\//i,
+        [VERSION, NAME]],
+      // Firefox
+      [/(Firefox)\/(\S+)/i,
+        [NAME, VERSION]],
+      // IE
+      [/MS(IE) (\d+)\.0/i,
+        [[NAME, 'Internet Explorer'], VERSION]],
+      [/(Trident)\/(\d+)\.0/i,
+        [[NAME, 'Internet Explorer'], [VERSION, mapper.ieVer]]],
+      [/()/i,
+        [[NAME, '山寨浏览器']]],
+    ],
+  };
+  function getResult(matches, keys) {
+    var res = {};
+    keys.forEach(function(key, i) {
+      var match = matches[i + 1];
+      if (Array.isArray(key)) {
+        if (typeof key[1] == 'function')
+          res[key[0]] = key[1](match, key[2]);
+        else res[key[0]] = key[1];
+      } else res[key] = match;
+    });
+    return res;
+  }
+  function getString(obj) {
+    var str = obj.name;
+    if (obj.version)
+      str += ' ' + obj.version;
+    return str;
+  }
+  function parse(agent) {
+    var result = {};
+    for (var key in rules)
+      rules[key].some(function (rule) {
+        var regex = rule[0];
+        var attrs = rule[1];
+        if (!Array.isArray(regex))
+          regex = [regex];
+        return regex.some(function(re) {
+          var matches = agent.match(re);
+          if (matches) {
+            result[key] = getResult(matches, attrs);
+            return true;
+          }
+        });
+      });
+    return result;
+  }
 
-	window.UAParser = {
-		parse: parse,
-		getString: getString,
-	};
+  window.UAParser = {
+    parse: parse,
+    getString: getString,
+  };
 }(this);

+ 7 - 2
test/tests.js

@@ -4,13 +4,18 @@ QUnit.test('User agent: Opera', function (assert) {
   assert.ok(UAParser.getString(res.browser) == 'Opera 28.0.1750.48', 'Browser passed.');
 });
 
-QUnit.test('User agent: Ubuntu Firefox', function(assert) {
+QUnit.test('User agent: Ubuntu Firefox', function (assert) {
 	var res = UAParser.parse('Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:38.0) Gecko/20100101 Firefox/38.0');
 	assert.ok(UAParser.getString(res.os) == 'Ubuntu', 'OS passed.');
 	assert.ok(UAParser.getString(res.browser) == 'Firefox 38.0', 'Browser passed.');
 });
 
-QUnit.test('User agent: Maxthon', function(assert) {
+QUnit.test('User agent: Maxthon', function (assert) {
 	var res = UAParser.parse('Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.5.3000 Chrome/30.0.1599.101 Safari/537.36');
 	assert.ok(UAParser.getString(res.browser) == 'Maxthon 4.4.5.3000', 'Browser passed.');
 });
+
+QUnit.test('User agent: Vivaldi', function (assert) {
+  var res = UAParser.parse('Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.43 Safari/537.36 Vivaldi/1.0.252.3');
+  assert.ok(UAParser.getString(res.browser) == 'Vivaldi 1.0.252.3', 'Browser passed.');
+});