Ver Fonte

improved ua-parser

Signed-off-by: Gerald <gera2ld@163.com>
Gerald há 10 anos atrás
pai
commit
471f9305c6
6 ficheiros alterados com 101 adições e 102 exclusões
  1. 1 1
      dist/duoshuo-ua-with-css.min.js
  2. 1 1
      dist/duoshuo-ua.min.js
  3. 2 1
      gulpfile.js
  4. 6 3
      src/duoshuo-ua.js
  5. 89 94
      src/ua-parser.js
  6. 2 2
      test/example.html

Diff do ficheiro suprimidas por serem muito extensas
+ 1 - 1
dist/duoshuo-ua-with-css.min.js


Diff do ficheiro suprimidas por serem muito extensas
+ 1 - 1
dist/duoshuo-ua.min.js


+ 2 - 1
gulpfile.js

@@ -7,6 +7,7 @@ var
 	uglify=require('gulp-uglify'),
 	minifycss=require('gulp-minify-css'),
 	css2js=require('gulp-css2js');
+
 gulp.task('default',function(){
 	var js=
 		gulp.src(['./src/ua-parser.js','./src/duoshuo-ua.js'])
@@ -15,7 +16,7 @@ gulp.task('default',function(){
 			.pipe(uglify())
 			.pipe(rename({suffix:'.min'}))
 			.pipe(gulp.dest('./dist'));
-	merge(
+	return merge(
 		gulp.src('./src/duoshuo-ua.css')
 			.pipe(minifycss())
 			.pipe(rename({suffix:'.min'}))

+ 6 - 3
src/duoshuo-ua.js

@@ -3,9 +3,12 @@
  * @require ua-parser.js
  */
 function getUAString(local){
-	var a=local.agent;
-	return '<div class="ds-os ds-os-'+a.os_cls+'">'+a.os+'</div>'+
-		'<div class="ds-br ds-br-'+a.br_cls+'">'+a.br+'</div>'+
+	var a=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>'+
 		(local.webmaster?'<div class=ds-webmaster>站长</div>':'');
 }
 function callBefore(local,args){

+ 89 - 94
src/ua-parser.js

@@ -1,102 +1,97 @@
 /* User-Agent parser
  * @author Gerald <gera2ld@163.com>
  */
-function getRule(str,rules){
-	var res=null,cls=null;
-	rules.some(function(rule){
-		return rule[1].some(function(r){
-			var m;
-			if(r[0].slice) r[0].some(function(r){
-				m=str.match(r);
-				return !!m;
-			}); else m=str.match(r[0]);
-			if(m) {
-				if(r[1]) res=r[1](m);
-				else res=m[0];
-				cls=rule[0];
-				return true;
-			} else return false;
-		});
+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',
+		'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 [res,cls];
-}
-function getBrower(m){
-	return m[0].replace('/',' ');
+	return r;
 }
 function parseAgent(a){
-	var rules_os=[
-		['windows',[
-			[/Windows Phone(?: OS)? ?([^; )]*)/i],
-			[/Windows ([^;)]*)/i,function(m){
-				var ver={
-					'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',
-					'ARM':'RT',
-				}[m[1]];
-				return 'Windows'+(ver?' '+ver:'山寨版');
-			}],
-			[/\bWindows\b/i,function(m){
-				return m[0]+'超级山寨版';
-			}],
-		]],
-		['mac',[
-			[/iPhone|iPod|iPad/i],
-			[/Mac OS X/i],
-		]],
-		['android',[
-			[/Android ?([^; )]*)/i],
-		]],
-		['linux',[
-			[/Linux/i],
-		]],
-	],rules_br=[
-		['opera',[
-			[/Opera Mini\/\d+/i,getBrower],
-			[[/OPR\/(\S+)/i,/Presto\/.*?Version\/(\S+)/i],function(m){
-				return 'Opera '+m[1];
-			}],
-		]],
-		['maxthon',[
-			[/Maxthon\/(\S+)/i,getBrower],
-		]],
-		['vivaldi',[
-			[/Vivaldi\/(\S+)/i,getBrower],
-		]],
-		['chrome',[
-			[/Chrome\/(\S+)/i,getBrower],
-		]],
-		['uc',[
-			[/UCBrowser\/(\S+)/i,function(m){
-				return 'UC '+m[1];
-			}],
-		]],
-		['safari',[
-			[/Version\/(\S+) .*?Safari\//i,function(m){
-				return 'Safari '+m[1];
-			}],
-		]],
-		['firefox',[
-			[/Firefox\/(\S+)/i,getBrower],
-		]],
-		['ie',[
-			[/MSIE (\d+)\.0/i,function(m){
-				return 'Internet Explorer '+m[1];
-			}],
-			[/Trident\/(\d+)\.0/i,function(m){
-				return 'Internet Explorer '+(parseInt(m[1])+4);
-			}],
-		]],
-	],result={os:'山寨系统',os_cls:'other',br:'山寨浏览器',br_cls:'other'},r;
-	r=getRule(a,rules_os);if(r[0]) {result.os=r[0];result.os_cls=r[1];}
-	r=getRule(a,rules_br);if(r[0]) {result.br=r[0];result.br_cls=r[1];}
+	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;
 }

+ 2 - 2
test/example.html

@@ -3,11 +3,11 @@
 	<head>
 		<meta charset=utf-8 />
 		<title>Test DUOSHUO</title>
-		<script>var duoshuoQuery={short_name:'your_short_name',myIds:[1234567]};</script>
+		<script>var duoshuoQuery={short_name:'official',myIds:[1234567]};</script>
 		<script src=../dist/duoshuo-ua-with-css.min.js></script>
 		<script src=http://static.duoshuo.com/embed.unstable.js></script>
 	</head>
 	<body>
-		<div class=ds-thread data-thread-key="your_key"></div>
+		<div class=ds-thread data-thread-key="5174f0a16a04594d4800590e"></div>
 	</body>
 </html>