Procházet zdrojové kódy

added test files

Signed-off-by: Gerald <gera2ld@163.com>
Gerald před 10 roky
rodič
revize
71e6bbad2a

+ 2 - 2
.gitignore

@@ -1,3 +1,3 @@
-test/test.html
-test/ua-parser.min.js
+examples/test.html
+examples/ua-parser.min.js
 node_modules/

+ 3 - 0
.travis.yml

@@ -0,0 +1,3 @@
+language: node_js
+node_js:
+  - "0.12"

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1 - 1
dist/duoshuo-ua-with-css.min.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1 - 1
dist/duoshuo-ua.min.js


test/example.html → examples/example.html


test/faisalman.html → examples/faisalman.html


+ 1 - 1
gulpfile.js

@@ -12,7 +12,7 @@ gulp.task('default',function(){
 	var js=
 		gulp.src(['./src/ua-parser.js','./src/duoshuo-ua.js'])
 			.pipe(concat('duoshuo-ua.js'))
-			.pipe(wrap('(function(){\n<%=contents%>\n}());'))
+			.pipe(wrap('(function(){\n<%=contents%>\n}).call({});'))
 			.pipe(uglify())
 			.pipe(rename({suffix:'.min'}))
 			.pipe(gulp.dest('./dist'));

+ 1 - 0
package.json

@@ -12,6 +12,7 @@
     "url": "http://git.oschina.net/gerald/duoshuo-ua/issues"
   },
   "devDependencies": {
+    "coveralls": "^2.11.2",
     "gulp": "^3.8.11",
     "gulp-concat": "^2.5.2",
     "gulp-css2js": "^1.0.2",

+ 4 - 6
src/duoshuo-ua.js

@@ -2,13 +2,11 @@
  * 作者:Gerald <gera2ld@163.com>
  * @require ua-parser.js
  */
+var UAParser=this.UAParser;
 function getUAString(local){
-	var a=parseAgent(local.agent),toString=function(o){
-		var s=o.name;if(o.version) s+=' '+o.version;
-		return s;
-	};
-	return '<div class="ds-os">'+toString(a.os)+'</div>'+
-		'<div class="ds-br">'+toString(a.browser)+'</div>'+
+	var a=UAParser.parse(local.agent);
+	return '<div class="ds-os">'+UAParser.getString(a.os)+'</div>'+
+		'<div class="ds-br">'+UAParser.getString(a.browser)+'</div>'+
 		(local.webmaster?'<div class=ds-webmaster>站长</div>':'');
 }
 function callBefore(local,args){

+ 117 - 96
src/ua-parser.js

@@ -1,98 +1,119 @@
-/* User-Agent parser
- * @author Gerald <gera2ld@163.com>
- */
-var mapper={
-	reg:function(s,maps){
-		return s.replace(maps[0],maps[1]);
-	},
-	str:function(s,maps){
-		return (s in maps)?maps[s]:maps[''];
-	},
-	ieVer:function(s){
-		return parseInt(s)+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',VERSION='version',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
-		[/(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]],
-		[[
-			// Maxthon
-			/(Maxthon)\/(\S+)/i,
-			// Vivaldi
-			/(Vivaldi)\/(\S+)/i,
-			// Chrome
-			/(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 r={};
-	keys.forEach(function(k,i){
-		var m=matches[i+1];
-		if(Array.isArray(k)){
-			if(typeof k[1]=='function') r[k[0]]=k[1](m,k[2]);
-			else r[k[0]]=k[1];
-		} else r[k]=m;
-	});
-	return r;
-}
-function parseAgent(a){
-	var k,v,result={};
-	for(k in rules) {
-		v=rules[k];
-		v.some(function(rule){
-			var reg=rule[0],keys=rule[1],m=null;
-			if(Array.isArray(reg)) reg.some(function(reg){
-				return m=a.match(reg);
-			}); else m=a.match(reg);
-			if(m) result[k]=getResult(m,keys);
-			return m;
+/**
+* User-Agent parser
+* @author Gerald <gera2ld@163.com>
+*/
+!function(window, undefined){
+
+	var mapper={
+		reg:function(s,maps){
+			return s.replace(maps[0],maps[1]);
+		},
+		str:function(s,maps){
+			return (s in maps)?maps[s]:maps[''];
+		},
+		ieVer:function(s){
+			return parseInt(s)+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',VERSION='version',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
+			[/(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]],
+			[[
+				// Maxthon
+				/(Maxthon)\/(\S+)/i,
+				// Vivaldi
+				/(Vivaldi)\/(\S+)/i,
+				// Chrome
+				/(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 r={};
+		keys.forEach(function(k,i){
+			var m=matches[i+1];
+			if(Array.isArray(k)){
+				if(typeof k[1]=='function') r[k[0]]=k[1](m,k[2]);
+				else r[k[0]]=k[1];
+			} else r[k]=m;
 		});
+		return r;
 	}
-	return result;
-}
+	function getString(o){
+		var s=o.name;
+		if(o.version) s+=' '+o.version;
+		return s;
+	}
+	function parse(a){
+		var k,v,result={};
+		for(k in rules) {
+			v=rules[k];
+			v.some(function(rule){
+				var reg=rule[0],keys=rule[1],m=null;
+				if(Array.isArray(reg)) reg.some(function(reg){
+					return m=a.match(reg);
+				}); else m=a.match(reg);
+				if(m) result[k]=getResult(m,keys);
+				return m;
+			});
+		}
+		return result;
+	}
+
+	var UAParser={
+		parse: parse,
+		getString: getString,
+	};
+
+	if(typeof exports!='undefined') {
+		exports=module.exports=UAParser;
+	} else {
+		window.UAParser=UAParser;
+	}
+
+}(this)

+ 22 - 0
test/test.js

@@ -0,0 +1,22 @@
+var UAParser=require('../src/ua-parser.js');
+var assert=require('assert');
+
+describe('User-Agents', function(){
+  var UAs=[
+    {
+      ua: 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36 OPR/28.0.1750.48',
+      res: {
+        os: 'Windows 8.1',
+        browser: 'Opera 28.0.1750.48',
+      }
+    }
+  ];
+
+  it('Test User-Agents', function(){
+    UAs.forEach(function(item){
+      var res=UAParser.parse(item.ua);
+      assert.equal(UAParser.getString(res.os), item.res.os);
+      assert.equal(UAParser.getString(res.browser), item.res.browser);
+    })
+  })
+});