Bläddra i källkod

added QUnit tests

Signed-off-by: Gerald <gera2ld@163.com>
Gerald 10 år sedan
förälder
incheckning
49df7f1c6e
11 ändrade filer med 217 tillägg och 184 borttagningar
  1. 1 1
      dist/duoshuo-ua-with-css.min.js
  2. 1 1
      dist/duoshuo-ua.min.js
  3. 1 1
      examples/example.html
  4. 25 28
      gulpfile.js
  5. 0 1
      package.json
  6. 20 4
      src/duoshuo-ua.css
  7. 55 46
      src/duoshuo-ua.js
  8. 94 80
      src/ua-parser.js
  9. 15 0
      test/index.html
  10. 0 22
      test/test.js
  11. 5 0
      test/tests.js

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1 - 1
dist/duoshuo-ua-with-css.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1 - 1
dist/duoshuo-ua.min.js


+ 1 - 1
examples/example.html

@@ -10,7 +10,7 @@
 			};
 		</script>
 		<script src=../dist/duoshuo-ua-with-css.min.js></script>
-		<script src=http://static.duoshuo.com/embed.unstable.js></script>
+		<script src=http://static.duoshuo.com/embed.js></script>
 	</head>
 	<body>
 		<div class=ds-thread data-thread-key="5174f0a16a04594d4800590e"></div>

+ 25 - 28
gulpfile.js

@@ -1,30 +1,27 @@
-var
-	gulp=require('gulp'),
-	wrap=require('gulp-wrap'),
-	rename=require('gulp-rename'),
-	concat=require('gulp-concat'),
-	merge=require('gulp-merge'),
-	uglify=require('gulp-uglify'),
-	minifycss=require('gulp-minify-css'),
-	css2js=require('gulp-css2js');
+var gulp = require('gulp');
+var wrap = require('gulp-wrap');
+var rename = require('gulp-rename');
+var concat = require('gulp-concat');
+var merge = require('gulp-merge');
+var uglify = require('gulp-uglify');
+var minifycss = require('gulp-minify-css');
+var css2js = require('gulp-css2js');
 
-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}).call({});'))
-			.pipe(uglify())
-			.pipe(rename({suffix:'.min'}))
-			.pipe(gulp.dest('./dist'));
-	return merge(
-		gulp.src('./src/duoshuo-ua.css')
-			.pipe(minifycss())
-			.pipe(rename({suffix:'.min'}))
-			.pipe(gulp.dest('./dist'))
-			.pipe(css2js()),
-		js
-	).pipe(concat('duoshuo-ua-with-css.js'))
-	.pipe(uglify())
-	.pipe(rename({suffix:'.min'}))
-	.pipe(gulp.dest('./dist'));
+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}).call({});'))
+		.pipe(uglify())
+		.pipe(rename({suffix: '.min'}))
+		.pipe(gulp.dest('./dist'));
+	var css = gulp.src('./src/duoshuo-ua.css')
+		.pipe(minifycss())
+		.pipe(rename({suffix: '.min'}))
+		.pipe(gulp.dest('./dist'))
+		.pipe(css2js());
+	return merge(js, css)
+		.pipe(concat('duoshuo-ua-with-css.js'))
+		.pipe(uglify())
+		.pipe(rename({suffix: '.min'}))
+		.pipe(gulp.dest('./dist'));
 });

+ 0 - 1
package.json

@@ -12,7 +12,6 @@
     "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",

+ 20 - 4
src/duoshuo-ua.css

@@ -1,4 +1,20 @@
-#ds-reset .ds-os,#ds-reset .ds-br,#ds-reset .ds-webmaster{display:inline-block;border-radius:.3em;margin-left:.5em;padding:.3em;}
-#ds-reset .ds-os{color:white;background:dodgerblue;}
-#ds-reset .ds-br{color:yellow;background:green;}
-#ds-reset .ds-webmaster{border:1px solid red;color:red;}
+#ds-reset .ds-os,
+#ds-reset .ds-br,
+#ds-reset .ds-webmaster {
+	display: inline-block;
+	border-radius: .3em;
+	margin-left: .5em;
+	padding: .3em;
+}
+#ds-reset .ds-os {
+	color: white;
+	background: dodgerblue;
+}
+#ds-reset .ds-br {
+	color: yellow;
+	background: green;
+}
+#ds-reset .ds-webmaster {
+	border: 1px solid red;
+	color: red;
+}

+ 55 - 46
src/duoshuo-ua.js

@@ -2,67 +2,76 @@
  * 作者:Gerald <gera2ld@163.com>
  * @require ua-parser.js
  */
-var UAParser=this.UAParser;
-function getUAString(local){
-	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>':'');
+var UAParser = this.UAParser;
+
+function getUAString(local) {
+	var agent = UAParser.parse(local.agent);
+	return '<div class="ds-os">' + UAParser.getString(agent.os) + '</div>' +
+		'<div class="ds-br">' + UAParser.getString(agent.browser) + '</div>' +
+		(local.webmaster ? '<div class=ds-webmaster>站长</div>' : '');
 }
-function callBefore(local,args){
-	var e=args[0],id,myIds=duoshuoQuery.myIds||[];
-	if(args.length==1)	// embed.unstable.js
-		e=e.post;
-	local.agent=e.agent;
-	id=e.author_id;
-	if(!myIds.indexOf) myIds=[myIds];
-	local.webmaster=myIds.indexOf(id)<0?0:id;
+
+function callBefore(local, args) {
+	var myIds = duoshuoQuery.myIds || [];
+	var e = args[0];
+	if (args.length == 1)	// embed.unstable.js
+		e = e.post;
+	local.agent = e.agent;
+	var id = e.author_id;
+	if (!myIds.pop) myIds = [myIds];
+	local.webmaster = myIds.indexOf(id) < 0 ? 0 : id;
 }
-function callAfter(local,args){
-	var r=local.result,
-			i=r.indexOf('<div class="ds-comment-header">'),
-			j=r.indexOf('</div>',i),
-			func=duoshuoQuery.getUAString||getUAString;
-	local.result=r.slice(0,j)+func(local)+r.slice(j);
+
+function callAfter(local, args) {
+	var res = local.result;
+	var i = res.indexOf('<div class="ds-comment-header">');
+	var j = res.indexOf('</div>', i);
+	var func = duoshuoQuery.getUAString || getUAString;
+	local.result = res.slice(0, j) + func(local) + res.slice(j);
 }
-function init(){
-	var post=DUOSHUO.templates.post;
-	DUOSHUO.templates.post=function(){
-		var local={},args=arguments;
-		callBefore.call(this,local,args);
-		local.result=post.apply(this,args);
-		callAfter.call(this,local,args);
+
+function init() {
+	var post = DUOSHUO.templates.post;
+	DUOSHUO.templates.post = function () {
+		var local = {};
+		var args = arguments;
+		callBefore.call(this, local, args);
+		local.result = post.apply(this, args);
+		callAfter.call(this, local, args);
 		return local.result;
 	}
 }
-function observeProperty(item,key,callback){
-	function callbackOnce(){
-		var cb=callback;
-		if(cb) {
-			callback=null;
+
+function observeProperty(item, key, callback) {
+	function callbackOnce() {
+		var cb = callback;
+		if (cb) {
+			callback = null;
 			cb();
 		}
 	}
-	var value=undefined;
-	if(item[key]) callbackOnce();
-	else Object.defineProperty(item,key,{
-		get:function(){return value;},
-		set:function(val){
-			value=val;
+	var value;
+	if (item[key]) callbackOnce();
+	else Object.defineProperty(item, key, {
+		get: function () {return value;},
+		set: function (val) {
+			value = val;
 			callbackOnce();
 		},
-		configurable:true,
+		configurable: true,
 	});
 }
-function observePropertyChain(item,keys,callback){
-	function observe(){
-		observeProperty(item,key,function(){
-			item=item[key];
-			if(key=keys.shift()) observe();
+
+function observePropertyChain(item, keys, callback) {
+	function observe() {
+		observeProperty(item, key, function () {
+			item = item[key];
+			if(key = keys.shift()) observe();
 			else callback();
 		});
 	}
-	var key=keys.shift();
+	var key = keys.shift();
 	observe();
 }
-observePropertyChain(window,['DUOSHUO','templates','post'],init);
+
+observePropertyChain(window, ['DUOSHUO', 'templates', 'post'], init);

+ 94 - 80
src/ua-parser.js

@@ -2,57 +2,67 @@
 * User-Agent parser
 * @author Gerald <gera2ld@163.com>
 */
-!function(window, undefined){
-
-	var mapper={
-		reg:function(s,maps){
-			return s.replace(maps[0],maps[1]);
+!function (window, undefined) {
+	var mapper = {
+		reg: function (str, maps) {
+			return str.replace(maps[0], maps[1]);
 		},
-		str:function(s,maps){
-			return (s in maps)?maps[s]:maps[''];
+		str: function (str, maps) {
+			return (str in maps) ? maps[str] : maps[''];
 		},
-		ieVer:function(s){
-			return parseInt(s)+4;
+		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 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:[
+	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]],
+			[/(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']]],
+			[/(iPhone|iPod|iPad|Mac OS X)/i,
+				[NAME, [CLASS, 'mac']]],
 			// Android
-			[/(Android) ?([^; )]*)/i,[NAME,VERSION,[CLASS,'android']]],
+			[/(Android) ?([^; )]*)/i,
+				[NAME, VERSION, [CLASS, 'android']]],
 			// Linux
-			[/(Linux)/i,[NAME,[CLASS,'linux']]],
-			[/()/i,[[NAME,'山寨操作系统'],[CLASS,'other']]],
+			[/(Linux)/i,
+				[NAME, [CLASS, 'linux']]],
+			[/()/i,
+				[[NAME, '山寨操作系统'], [CLASS, 'other']]],
 		],
-		browser:[
+		browser: [
 			// Opera
-			[/(Opera Mini)\/(\d+)/i,[NAME,VERSION]],
-			[[/(OPR)\/(\S+)/i,/(Presto)\/.*?Version\/(\S+)/i],[[NAME,'Opera'],VERSION]],
+			[/(Opera Mini)\/(\d+)/i,
+				[NAME, VERSION]],
+			[[/(OPR)\/(\S+)/i, /(Presto)\/.*?Version\/(\S+)/i],
+				[[NAME, 'Opera'], VERSION]],
 			[[
 				// Maxthon
 				/(Maxthon)\/(\S+)/i,
@@ -60,60 +70,64 @@
 				/(Vivaldi)\/(\S+)/i,
 				// Chrome
 				/(Chrome)\/(\S+)/i,
-			],[NAME,VERSION]],
+			], [NAME, VERSION]],
 			// UC/QQ
-			[/(UC|QQ)Browser\/(\S+)/i,[[NAME,mapper.reg,[/$/,'浏览器']],VERSION]],
+			[/(UC|QQ)Browser\/(\S+)/i,
+				[[NAME, mapper.reg, [/$/, '浏览器']], VERSION]],
 			// Safari
-			[/Version\/(\S+) .*?(Safari)\//i,[VERSION,NAME]],
+			[/Version\/(\S+) .*?(Safari)\//i,
+				[VERSION, NAME]],
 			// Firefox
-			[/(Firefox)\/(\S+)/i,[NAME,VERSION]],
+			[/(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,'山寨浏览器']]],
+			[/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;
+	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 r;
+		return res;
 	}
-	function getString(o){
-		var s=o.name;
-		if(o.version) s+=' '+o.version;
-		return s;
+	function getString(obj) {
+		var str = obj.name;
+		if (obj.version)
+			str += ' ' + obj.version;
+		return str;
 	}
-	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;
+	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 UAParser={
+	window.UAParser = {
 		parse: parse,
 		getString: getString,
 	};
-
-	if(typeof exports!='undefined') {
-		exports=module.exports=UAParser;
-	} else {
-		window.UAParser=UAParser;
-	}
-
-}(this)
+}(this);

+ 15 - 0
test/index.html

@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>QUnit Test for duoshuo-ua</title>
+  <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.18.0.css">
+	<script src="../src/ua-parser.js"></script>
+</head>
+<body>
+  <div id="qunit"></div>
+  <div id="qunit-fixture"></div>
+  <script src="http://code.jquery.com/qunit/qunit-1.18.0.js"></script>
+  <script src="tests.js"></script>
+</body>
+</html>

+ 0 - 22
test/test.js

@@ -1,22 +0,0 @@
-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);
-    })
-  })
-});

+ 5 - 0
test/tests.js

@@ -0,0 +1,5 @@
+QUnit.test('User agent: Opera', function (assert) {
+	var res = UAParser.parse('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');
+	assert.ok(UAParser.getString(res.os) == 'Windows 8.1', 'OS passed.');
+  assert.ok(UAParser.getString(res.browser) == 'Opera 28.0.1750.48', 'Browser passed.');
+});