[Pkg-javascript-commits] [tinycon.js] 01/04: New upstream version 0.6.5

Paolo Greppi paolog-guest at moszumanska.debian.org
Wed Dec 21 09:25:11 UTC 2016


This is an automated email from the git hooks/post-receive script.

paolog-guest pushed a commit to branch master
in repository tinycon.js.

commit 3175ea591cf0ada5f1f5c72ac5022e4904c147da
Author: Paolo Greppi <paolo.greppi at libpf.com>
Date:   Wed Dec 21 09:10:40 2016 +0000

    New upstream version 0.6.5
---
 .gitignore              |   2 +
 Gruntfile.js            |  16 +++
 LICENSE                 |  19 ++++
 README.md               |  99 ++++++++++++++++
 examples/favicon.ico    | Bin 0 -> 1150 bytes
 examples/index-amd.html |  17 +++
 examples/index.html     |  20 ++++
 examples/require.js     |  35 ++++++
 examples/screenshot.png | Bin 0 -> 26716 bytes
 package.json            |  14 +++
 tinycon.js              | 293 ++++++++++++++++++++++++++++++++++++++++++++++++
 tinycon.min.js          |   8 ++
 12 files changed, 523 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..646ac51
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+.DS_Store
+node_modules/
diff --git a/Gruntfile.js b/Gruntfile.js
new file mode 100644
index 0000000..33bd7e4
--- /dev/null
+++ b/Gruntfile.js
@@ -0,0 +1,16 @@
+module.exports = function(grunt) {
+  grunt.loadNpmTasks('grunt-contrib-uglify');
+  
+  grunt.initConfig({
+    uglify: {
+      all: {
+        options: {
+          preserveComments: 'some'
+        },
+        files: {
+          'tinycon.min.js': ['tinycon.js']
+        }
+      },
+    },
+  });
+};
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..e8a657b
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2015 Tom Moor
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e78ddcf
--- /dev/null
+++ b/README.md
@@ -0,0 +1,99 @@
+# Tinycon
+
+A small library for manipulating the favicon, in particular adding alert bubbles and changing images. Tinycon gracefully falls back to a number in title approach for browsers that don't support canvas or dynamic favicons.
+
+<img src="https://github.com/tommoor/tinycon/blob/master/examples/screenshot.png?raw=true" />
+
+<a href="http://tommoor.github.com/tinycon/">See the Live Demo here.</a>
+
+## Documentation
+
+Tinycon adds a single object to the global namespace and does not require initialisation.
+
+### Installation
+
+There are several versions of Tinycon published on NPM, unfortunately they are not controlled by me and do not track HEAD. The best idea is to install from github
+directly and cut out the middleman!
+
+```
+npm install tommoor/tinycon --save
+```
+
+### Basic Usage
+
+```javascript
+Tinycon.setBubble(6);
+```
+
+### Options
+
+Tinycon can take a range of options to customise the look
+
+* width: the width of the alert bubble
+* height: the height of the alert bubble
+* font: a css string to use for the fontface (recommended to leave this)
+* color: the foreground font color
+* background: the alert bubble background color
+* fallback: should we fallback to a number in brackets for browsers that don't support canvas/dynamic favicons? Boolean, or use the string 'force' to ensure a title update even in supported browsers.
+* abbreviate: should tinycon shrink large numbers such as 1000 to an abbreviated version (1k). Boolean, defaults to true
+
+```javascript
+Tinycon.setOptions({
+	width: 7,
+	height: 9,
+	font: '10px arial',
+	color: '#ffffff',
+	background: '#549A2F',
+	fallback: true
+});
+```
+
+### AMD support
+
+Tinycon can also be used as an asynchronous module.
+
+```javascript
+require([
+	'tinycon.js'
+], function (T) {
+
+	T.setOptions({
+		width: 7,
+		height: 9,
+		font: '10px arial',
+		color: '#ffffff',
+		background: '#549A2F',
+		fallback: true
+	});
+
+	T.setBubble(7);
+
+});
+```
+
+## Browser Support
+
+Tinycon has been tested to work completely in the following browsers. Older versions may be supported, but haven't been tested:
+
+* Chrome 15+
+* Firefox 9+
+* Opera 11+
+
+Currently the library degrades to title update:
+
+* Internet Explorer 9
+* Safari 5
+
+
+## License / Credits
+
+Tinycon is released under the MIT license. It is simple and easy to understand and places almost no restrictions on what you can do with Tinycon.
+[More Information](http://en.wikipedia.org/wiki/MIT_License)
+
+Tinycon was inspired by [Notificon](https://github.com/makeable/Notificon)
+
+
+## Download
+
+Releases are available for download from
+[GitHub](http://github.com/tommoor/tinycon/downloads).
diff --git a/examples/favicon.ico b/examples/favicon.ico
new file mode 100644
index 0000000..9db08f2
Binary files /dev/null and b/examples/favicon.ico differ
diff --git a/examples/index-amd.html b/examples/index-amd.html
new file mode 100644
index 0000000..34eef1f
--- /dev/null
+++ b/examples/index-amd.html
@@ -0,0 +1,17 @@
+<html>
+	<head>
+		<link rel="icon" href="favicon.ico">
+		<title>Tinycon</title>
+
+		<script src="require.js"></script>
+		<script>
+			require([
+				'../tinycon.min.js'
+			], function (T) {
+				T.setBubble(3);
+			});
+		</script>
+	</head>
+	<body>
+	</body>
+</html>
\ No newline at end of file
diff --git a/examples/index.html b/examples/index.html
new file mode 100644
index 0000000..7f4803e
--- /dev/null
+++ b/examples/index.html
@@ -0,0 +1,20 @@
+<html>
+	<head>
+		<link rel="icon" href="favicon.ico">
+		<title>Tinycon</title>
+		
+		<script src="../tinycon.js"></script>
+		<script>
+			(function(){
+				var count = 0;
+				setInterval(function(){
+					++count;
+					Tinycon.setBubble(count);
+
+				}, 1000);
+			})();
+		</script>
+	</head>
+	<body>
+	</body>
+</html>
\ No newline at end of file
diff --git a/examples/require.js b/examples/require.js
new file mode 100644
index 0000000..d08afe4
--- /dev/null
+++ b/examples/require.js
@@ -0,0 +1,35 @@
+/*
+ RequireJS 2.1.2 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
+ Available via the MIT or new BSD license.
+ see: http://github.com/jrburke/requirejs for details
+*/
+var requirejs,require,define;
+(function(Y){function H(b){return"[object Function]"===L.call(b)}function I(b){return"[object Array]"===L.call(b)}function x(b,c){if(b){var d;for(d=0;d<b.length&&(!b[d]||!c(b[d],d,b));d+=1);}}function M(b,c){if(b){var d;for(d=b.length-1;-1<d&&(!b[d]||!c(b[d],d,b));d-=1);}}function r(b,c){return da.call(b,c)}function i(b,c){return r(b,c)&&b[c]}function E(b,c){for(var d in b)if(r(b,d)&&c(b[d],d))break}function Q(b,c,d,i){c&&E(c,function(c,h){if(d||!r(b,h))i&&"string"!==typeof c?(b[h]||(b[h [...]
+c,d,i)):b[h]=c});return b}function t(b,c){return function(){return c.apply(b,arguments)}}function Z(b){if(!b)return b;var c=Y;x(b.split("."),function(b){c=c[b]});return c}function J(b,c,d,i){c=Error(c+"\nhttp://requirejs.org/docs/errors.html#"+b);c.requireType=b;c.requireModules=i;d&&(c.originalError=d);return c}function ea(b){function c(a,g,v){var e,n,b,c,d,j,f,h=g&&g.split("/");e=h;var l=m.map,k=l&&l["*"];if(a&&"."===a.charAt(0))if(g){e=i(m.pkgs,g)?h=[g]:h.slice(0,h.length-1);g=a=e.con [...]
+for(e=0;g[e];e+=1)if(n=g[e],"."===n)g.splice(e,1),e-=1;else if(".."===n)if(1===e&&(".."===g[2]||".."===g[0]))break;else 0<e&&(g.splice(e-1,2),e-=2);e=i(m.pkgs,g=a[0]);a=a.join("/");e&&a===g+"/"+e.main&&(a=g)}else 0===a.indexOf("./")&&(a=a.substring(2));if(v&&(h||k)&&l){g=a.split("/");for(e=g.length;0<e;e-=1){b=g.slice(0,e).join("/");if(h)for(n=h.length;0<n;n-=1)if(v=i(l,h.slice(0,n).join("/")))if(v=i(v,b)){c=v;d=e;break}if(c)break;!j&&(k&&i(k,b))&&(j=i(k,b),f=e)}!c&&j&&(c=j,d=f);c&&(g.sp [...]
+c),a=g.join("/"))}return a}function d(a){z&&x(document.getElementsByTagName("script"),function(g){if(g.getAttribute("data-requiremodule")===a&&g.getAttribute("data-requirecontext")===j.contextName)return g.parentNode.removeChild(g),!0})}function y(a){var g=i(m.paths,a);if(g&&I(g)&&1<g.length)return d(a),g.shift(),j.require.undef(a),j.require([a]),!0}function f(a){var g,b=a?a.indexOf("!"):-1;-1<b&&(g=a.substring(0,b),a=a.substring(b+1,a.length));return[g,a]}function h(a,g,b,e){var n,u,d=n [...]
+null,l=a,m=!0,k="";a||(m=!1,a="_ at r"+(L+=1));a=f(a);d=a[0];a=a[1];d&&(d=c(d,h,e),u=i(p,d));a&&(d?k=u&&u.normalize?u.normalize(a,function(a){return c(a,h,e)}):c(a,h,e):(k=c(a,h,e),a=f(k),d=a[0],k=a[1],b=!0,n=j.nameToUrl(k)));b=d&&!u&&!b?"_unnormalized"+(M+=1):"";return{prefix:d,name:k,parentMap:g,unnormalized:!!b,url:n,originalName:l,isDefine:m,id:(d?d+"!"+k:k)+b}}function q(a){var g=a.id,b=i(k,g);b||(b=k[g]=new j.Module(a));return b}function s(a,g,b){var e=a.id,n=i(k,e);if(r(p,e)&&(!n||n. [...]
+g&&b(p[e]);else q(a).on(g,b)}function C(a,g){var b=a.requireModules,e=!1;if(g)g(a);else if(x(b,function(g){if(g=i(k,g))g.error=a,g.events.error&&(e=!0,g.emit("error",a))}),!e)l.onError(a)}function w(){R.length&&(fa.apply(F,[F.length-1,0].concat(R)),R=[])}function A(a,g,b){var e=a.map.id;a.error?a.emit("error",a.error):(g[e]=!0,x(a.depMaps,function(e,c){var d=e.id,h=i(k,d);h&&(!a.depMatched[c]&&!b[d])&&(i(g,d)?(a.defineDep(c,p[d]),a.check()):A(h,g,b))}),b[e]=!0)}function B(){var a,g,b,e,n [...]
+j.startTime+b<(new Date).getTime(),c=[],h=[],f=!1,l=!0;if(!T){T=!0;E(k,function(b){a=b.map;g=a.id;if(b.enabled&&(a.isDefine||h.push(b),!b.error))if(!b.inited&&n)y(g)?f=e=!0:(c.push(g),d(g));else if(!b.inited&&(b.fetched&&a.isDefine)&&(f=!0,!a.prefix))return l=!1});if(n&&c.length)return b=J("timeout","Load timeout for modules: "+c,null,c),b.contextName=j.contextName,C(b);l&&x(h,function(a){A(a,{},{})});if((!n||e)&&f)if((z||$)&&!U)U=setTimeout(function(){U=0;B()},50);T=!1}}function D(a){r( [...]
+q(h(a[0],null,!0)).init(a[1],a[2])}function G(a){var a=a.currentTarget||a.srcElement,b=j.onScriptLoad;a.detachEvent&&!V?a.detachEvent("onreadystatechange",b):a.removeEventListener("load",b,!1);b=j.onScriptError;(!a.detachEvent||V)&&a.removeEventListener("error",b,!1);return{node:a,id:a&&a.getAttribute("data-requiremodule")}}function K(){var a;for(w();F.length;){a=F.shift();if(null===a[0])return C(J("mismatch","Mismatched anonymous define() module: "+a[a.length-1]));D(a)}}var T,W,j,N,U,m= [...]
+baseUrl:"./",paths:{},pkgs:{},shim:{},map:{},config:{}},k={},X={},F=[],p={},S={},L=1,M=1;N={require:function(a){return a.require?a.require:a.require=j.makeRequire(a.map)},exports:function(a){a.usingExports=!0;if(a.map.isDefine)return a.exports?a.exports:a.exports=p[a.map.id]={}},module:function(a){return a.module?a.module:a.module={id:a.map.id,uri:a.map.url,config:function(){return m.config&&i(m.config,a.map.id)||{}},exports:p[a.map.id]}}};W=function(a){this.events=i(X,a.id)||{};this.map [...]
+i(m.shim,a.id);this.depExports=[];this.depMaps=[];this.depMatched=[];this.pluginMaps={};this.depCount=0};W.prototype={init:function(a,b,c,e){e=e||{};if(!this.inited){this.factory=b;if(c)this.on("error",c);else this.events.error&&(c=t(this,function(a){this.emit("error",a)}));this.depMaps=a&&a.slice(0);this.errback=c;this.inited=!0;this.ignore=e.ignore;e.enabled||this.enabled?this.enable():this.check()}},defineDep:function(a,b){this.depMatched[a]||(this.depMatched[a]=!0,this.depCount-=1,th [...]
+b)},fetch:function(){if(!this.fetched){this.fetched=!0;j.startTime=(new Date).getTime();var a=this.map;if(this.shim)j.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],t(this,function(){return a.prefix?this.callPlugin():this.load()}));else return a.prefix?this.callPlugin():this.load()}},load:function(){var a=this.map.url;S[a]||(S[a]=!0,j.load(this.map.id,a))},check:function(){if(this.enabled&&!this.enabling){var a,b,c=this.map.id;b=this.depExports;var e=this.exports,n=thi [...]
+if(this.inited)if(this.error)this.emit("error",this.error);else{if(!this.defining){this.defining=!0;if(1>this.depCount&&!this.defined){if(H(n)){if(this.events.error)try{e=j.execCb(c,n,b,e)}catch(d){a=d}else e=j.execCb(c,n,b,e);this.map.isDefine&&((b=this.module)&&void 0!==b.exports&&b.exports!==this.exports?e=b.exports:void 0===e&&this.usingExports&&(e=this.exports));if(a)return a.requireMap=this.map,a.requireModules=[this.map.id],a.requireType="define",C(this.error=a)}else e=n;this.expo [...]
+!this.ignore&&(p[c]=e,l.onResourceLoad))l.onResourceLoad(j,this.map,this.depMaps);delete k[c];this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else this.fetch()}},callPlugin:function(){var a=this.map,b=a.id,d=h(a.prefix);this.depMaps.push(d);s(d,"defined",t(this,function(e){var n,d;d=this.map.name;var v=this.map.parentMap?this.map.parentMap.name:null,f=j.makeRequire(a.parentMap,{enabl [...]
+skipMap:!0});if(this.map.unnormalized){if(e.normalize&&(d=e.normalize(d,function(a){return c(a,v,!0)})||""),e=h(a.prefix+"!"+d,this.map.parentMap),s(e,"defined",t(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),d=i(k,e.id)){this.depMaps.push(e);if(this.events.error)d.on("error",t(this,function(a){this.emit("error",a)}));d.enable()}}else n=t(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),n.error=t(this,function(a){this.inited=!0; [...]
+a;a.requireModules=[b];E(k,function(a){0===a.map.id.indexOf(b+"_unnormalized")&&delete k[a.map.id]});C(a)}),n.fromText=t(this,function(e,c){var d=a.name,u=h(d),v=O;c&&(e=c);v&&(O=!1);q(u);r(m.config,b)&&(m.config[d]=m.config[b]);try{l.exec(e)}catch(k){throw Error("fromText eval for "+d+" failed: "+k);}v&&(O=!0);this.depMaps.push(u);j.completeLoad(d);f([d],n)}),e.load(a.name,f,n,m)}));j.enable(d,this);this.pluginMaps[d.id]=d},enable:function(){this.enabling=this.enabled=!0;x(this.depMaps, [...]
+b){var c,e;if("string"===typeof a){a=h(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=i(N,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;s(a,"defined",t(this,function(a){this.defineDep(b,a);this.check()}));this.errback&&s(a,"error",this.errback)}c=a.id;e=k[c];!r(N,c)&&(e&&!e.enabled)&&j.enable(a,this)}));E(this.pluginMaps,t(this,function(a){var b=i(k,a.id);b&&!b.enabled&&j.enable(a,this)}));this.enabling=!1;this.check()},on:function(a, [...]
+this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){x(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};j={config:m,contextName:b,registry:k,defined:p,urlFetched:S,defQueue:F,Module:W,makeModuleMap:h,nextTick:l.nextTick,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");var b=m.pkgs,c=m.shim,e={paths:!0,config:!0,map:!0};E(a,function(a,b){e[b]?"map"===b?Q(m[b],a,!0,!0):Q(m[b],a,!0):m[b]=a});a.shim&&(E(a.shi [...]
+b){I(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=j.makeShimExports(a);c[b]=a}),m.shim=c);a.packages&&(x(a.packages,function(a){a="string"===typeof a?{name:a}:a;b[a.name]={name:a.name,location:a.location||a.name,main:(a.main||"main").replace(ga,"").replace(aa,"")}}),m.pkgs=b);E(k,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=h(b))});if(a.deps||a.callback)j.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.app [...]
+return b||a.exports&&Z(a.exports)}},makeRequire:function(a,d){function f(e,c,u){var i,m;d.enableBuildCallback&&(c&&H(c))&&(c.__requireJsBuild=!0);if("string"===typeof e){if(H(c))return C(J("requireargs","Invalid require call"),u);if(a&&r(N,e))return N[e](k[a.id]);if(l.get)return l.get(j,e,a);i=h(e,a,!1,!0);i=i.id;return!r(p,i)?C(J("notloaded",'Module name "'+i+'" has not been loaded yet for context: '+b+(a?"":". Use require([])"))):p[i]}K();j.nextTick(function(){K();m=q(h(null,a));m.skip [...]
+m.init(e,c,u,{enabled:!0});B()});return f}d=d||{};Q(f,{isBrowser:z,toUrl:function(b){var d=b.lastIndexOf("."),g=null;-1!==d&&(g=b.substring(d,b.length),b=b.substring(0,d));return j.nameToUrl(c(b,a&&a.id,!0),g)},defined:function(b){return r(p,h(b,a,!1,!0).id)},specified:function(b){b=h(b,a,!1,!0).id;return r(p,b)||r(k,b)}});a||(f.undef=function(b){w();var c=h(b,a,!0),d=i(k,b);delete p[b];delete S[c.url];delete X[b];d&&(d.events.defined&&(X[b]=d.events),delete k[b])});return f},enable:func [...]
+a.id)&&q(a).enable()},completeLoad:function(a){var b,c,d=i(m.shim,a)||{},h=d.exports;for(w();F.length;){c=F.shift();if(null===c[0]){c[0]=a;if(b)break;b=!0}else c[0]===a&&(b=!0);D(c)}c=i(k,a);if(!b&&!r(p,a)&&c&&!c.inited){if(m.enforceDefine&&(!h||!Z(h)))return y(a)?void 0:C(J("nodefine","No define call for "+a,null,[a]));D([a,d.deps||[],d.exportsFn])}B()},nameToUrl:function(a,b){var c,d,h,f,j,k;if(l.jsExtRegExp.test(a))f=a+(b||"");else{c=m.paths;d=m.pkgs;f=a.split("/");for(j=f.length;0<j; [...]
+f.slice(0,j).join("/"),h=i(d,k),k=i(c,k)){I(k)&&(k=k[0]);f.splice(0,j,k);break}else if(h){c=a===h.name?h.location+"/"+h.main:h.location;f.splice(0,j,c);break}f=f.join("/");f+=b||(/\?/.test(f)?"":".js");f=("/"===f.charAt(0)||f.match(/^[\w\+\.\-]+:/)?"":m.baseUrl)+f}return m.urlArgs?f+((-1===f.indexOf("?")?"?":"&")+m.urlArgs):f},load:function(a,b){l.load(j,a,b)},execCb:function(a,b,c,d){return b.apply(d,c)},onScriptLoad:function(a){if("load"===a.type||ha.test((a.currentTarget||a.srcElement [...]
+null,a=G(a),j.completeLoad(a.id)},onScriptError:function(a){var b=G(a);if(!y(b.id))return C(J("scripterror","Script error",a,[b.id]))}};j.require=j.makeRequire();return j}var l,w,A,D,s,G,P,K,ba,ca,ia=/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,ja=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,aa=/\.js$/,ga=/^\.\//;w=Object.prototype;var L=w.toString,da=w.hasOwnProperty,fa=Array.prototype.splice,z=!!("undefined"!==typeof window&&navigator&&document),$=!z&&"undefined"!==typeof importScrip [...]
+"PLAYSTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/,V="undefined"!==typeof opera&&"[object Opera]"===opera.toString(),B={},q={},R=[],O=!1;if("undefined"===typeof define){if("undefined"!==typeof requirejs){if(H(requirejs))return;q=requirejs;requirejs=void 0}"undefined"!==typeof require&&!H(require)&&(q=require,require=void 0);l=requirejs=function(b,c,d,y){var f,h="_";!I(b)&&"string"!==typeof b&&(f=b,I(c)?(b=c,c=d,d=y):b=[]);f&&f.context&&(h=f.context);(y=i(B,h))||(y=B[ [...]
+f&&y.configure(f);return y.require(b,c,d)};l.config=function(b){return l(b)};l.nextTick="undefined"!==typeof setTimeout?function(b){setTimeout(b,4)}:function(b){b()};require||(require=l);l.version="2.1.2";l.jsExtRegExp=/^\/|:|\?|\.js$/;l.isBrowser=z;w=l.s={contexts:B,newContext:ea};l({});x(["toUrl","undef","defined","specified"],function(b){l[b]=function(){var c=B._;return c.require[b].apply(c,arguments)}});if(z&&(A=w.head=document.getElementsByTagName("head")[0],D=document.getElementsBy [...]
+w.head=D.parentNode;l.onError=function(b){throw b;};l.load=function(b,c,d){var i=b&&b.config||{},f;if(z)return f=i.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script"),f.type=i.scriptType||"text/javascript",f.charset="utf-8",f.async=!0,f.setAttribute("data-requirecontext",b.contextName),f.setAttribute("data-requiremodule",c),f.attachEvent&&!(f.attachEvent.toString&&0>f.attachEvent.toString().indexOf("[native code"))&&!V?(O=!0,f.att [...]
+b.onScriptLoad)):(f.addEventListener("load",b.onScriptLoad,!1),f.addEventListener("error",b.onScriptError,!1)),f.src=d,K=f,D?A.insertBefore(f,D):A.appendChild(f),K=null,f;$&&(importScripts(d),b.completeLoad(c))};z&&M(document.getElementsByTagName("script"),function(b){A||(A=b.parentNode);if(s=b.getAttribute("data-main"))return q.baseUrl||(G=s.split("/"),ba=G.pop(),ca=G.length?G.join("/")+"/":"./",q.baseUrl=ca,s=ba),s=s.replace(aa,""),q.deps=q.deps?q.deps.concat(s):[s],!0});define=functio [...]
+f;"string"!==typeof b&&(d=c,c=b,b=null);I(c)||(d=c,c=[]);!c.length&&H(d)&&d.length&&(d.toString().replace(ia,"").replace(ja,function(b,d){c.push(d)}),c=(1===d.length?["require"]:["require","exports","module"]).concat(c));if(O){if(!(i=K))P&&"interactive"===P.readyState||M(document.getElementsByTagName("script"),function(b){if("interactive"===b.readyState)return P=b}),i=P;i&&(b||(b=i.getAttribute("data-requiremodule")),f=B[i.getAttribute("data-requirecontext")])}(f?f.defQueue:R).push([b,c, [...]
+{jQuery:!0};l.exec=function(b){return eval(b)};l(q)}})(this);
\ No newline at end of file
diff --git a/examples/screenshot.png b/examples/screenshot.png
new file mode 100644
index 0000000..5238366
Binary files /dev/null and b/examples/screenshot.png differ
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..93d1e34
--- /dev/null
+++ b/package.json
@@ -0,0 +1,14 @@
+{
+  "name": "tinycon",
+  "version": "0.6.4",
+  "description": "Add notification bubbles in the favicon",
+  "author": "Tom Moor <tom.moor at gmail.com> (http://tommoor.com)",
+  "main" : "./tinycon.js",
+  "repository" : {
+    "type": "git",
+    "url": "git://github.com/tommoor/tinycon.git"
+  },
+  "devDependencies": {
+    "grunt": "~0.4.5"
+  }
+}
diff --git a/tinycon.js b/tinycon.js
new file mode 100644
index 0000000..19d2245
--- /dev/null
+++ b/tinycon.js
@@ -0,0 +1,293 @@
+/*!
+ * Tinycon - A small library for manipulating the Favicon
+ * Tom Moor, http://tommoor.com
+ * Copyright (c) 2015 Tom Moor
+ * @license MIT Licensed
+ * @version 0.6.4
+ */
+
+(function(){
+
+  var Tinycon = {};
+  var currentFavicon = null;
+  var originalFavicon = null;
+  var faviconImage = null;
+  var canvas = null;
+  var options = {};
+  var r = window.devicePixelRatio || 1;
+  var size = 16 * r;
+  var defaults = {
+    width: 7,
+    height: 9,
+    font: 10 * r + 'px arial',
+    color: '#ffffff',
+    background: '#F03D25',
+    fallback: true,
+    crossOrigin: true,
+    abbreviate: true
+  };
+
+  var ua = (function () {
+    var agent = navigator.userAgent.toLowerCase();
+    // New function has access to 'agent' via closure
+    return function (browser) {
+      return agent.indexOf(browser) !== -1;
+    };
+  }());
+
+  var browser = {
+    ie: ua('trident'),
+    chrome: ua('chrome'),
+    webkit: ua('chrome') || ua('safari'),
+    safari: ua('safari') && !ua('chrome'),
+    mozilla: ua('mozilla') && !ua('chrome') && !ua('safari')
+  };
+
+  // private methods
+  var getFaviconTag = function(){
+
+    var links = document.getElementsByTagName('link');
+
+    for(var i=0, len=links.length; i < len; i++) {
+      if ((links[i].getAttribute('rel') || '').match(/\bicon\b/i)) {
+        return links[i];
+      }
+    }
+
+    return false;
+  };
+
+  var removeFaviconTag = function(){
+
+    var links = document.getElementsByTagName('link');
+    var head = document.getElementsByTagName('head')[0];
+
+    for(var i=0, len=links.length; i < len; i++) {
+      var exists = (typeof(links[i]) !== 'undefined');
+      if (exists && (links[i].getAttribute('rel') || '').match(/\bicon\b/i)) {
+        head.removeChild(links[i]);
+      }
+    }
+  };
+
+  var getCurrentFavicon = function(){
+
+    if (!originalFavicon || !currentFavicon) {
+      var tag = getFaviconTag();
+      currentFavicon = tag ? tag.getAttribute('href') : '/favicon.ico';
+      if (!originalFavicon) {
+        originalFavicon = currentFavicon;
+      }
+    }
+
+    return currentFavicon;
+  };
+
+  var getCanvas = function (){
+
+    if (!canvas) {
+      canvas = document.createElement("canvas");
+      canvas.width = size;
+      canvas.height = size;
+    }
+
+    return canvas;
+  };
+
+  var setFaviconTag = function(url){
+    if(url){
+      removeFaviconTag();
+
+      var link = document.createElement('link');
+      link.type = 'image/x-icon';
+      link.rel = 'icon';
+      link.href = url;
+      document.getElementsByTagName('head')[0].appendChild(link);
+    }
+  };
+
+  var log = function(message){
+    if (window.console) window.console.log(message);
+  };
+
+  var drawFavicon = function(label, color) {
+
+    // fallback to updating the browser title if unsupported
+    if (!getCanvas().getContext || browser.ie || browser.safari || options.fallback === 'force') {
+      return updateTitle(label);
+    }
+
+    var context = getCanvas().getContext("2d");
+    var color = color || '#000000';
+    var src = getCurrentFavicon();
+
+    faviconImage = document.createElement('img');
+    faviconImage.onload = function() {
+
+      // clear canvas
+      context.clearRect(0, 0, size, size);
+
+      // draw the favicon
+      context.drawImage(faviconImage, 0, 0, faviconImage.width, faviconImage.height, 0, 0, size, size);
+
+      // draw bubble over the top
+      if ((label + '').length > 0) drawBubble(context, label, color);
+
+      // refresh tag in page
+      refreshFavicon();
+    };
+
+    // allow cross origin resource requests if the image is not a data:uri
+    // as detailed here: https://github.com/mrdoob/three.js/issues/1305
+    if (!src.match(/^data/) && options.crossOrigin) {
+      faviconImage.crossOrigin = 'anonymous';
+    }
+
+    faviconImage.src = src;
+  };
+
+  var updateTitle = function(label) {
+
+    if (options.fallback) {
+      // Grab the current title that we can prefix with the label
+      var originalTitle = document.title;
+
+      // Strip out the old label if there is one
+      if (originalTitle[0] === '(') {
+        originalTitle = originalTitle.slice(originalTitle.indexOf(' '));
+      }
+
+      if ((label + '').length > 0) {
+        document.title = '(' + label + ') ' + originalTitle;
+      } else {
+        document.title = originalTitle;
+      }
+    }
+  };
+
+  var drawBubble = function(context, label, color) {
+
+    // automatic abbreviation for long (>2 digits) numbers
+    if (typeof label == 'number' && label > 99 && options.abbreviate) {
+      label = abbreviateNumber(label);
+    }
+
+    // bubble needs to be larger for double digits
+    var len = (label + '').length-1;
+
+    var width = options.width * r + (6 * r * len),
+      height = options.height * r;
+
+    var top = size - height,
+            left = size - width - r,
+            bottom = 16 * r,
+            right = 16 * r,
+            radius = 2 * r;
+
+    // webkit seems to render fonts lighter than firefox
+    context.font = (browser.webkit ? 'bold ' : '') + options.font;
+    context.fillStyle = options.background;
+    context.strokeStyle = options.background;
+    context.lineWidth = r;
+
+    // bubble
+    context.beginPath();
+        context.moveTo(left + radius, top);
+    context.quadraticCurveTo(left, top, left, top + radius);
+    context.lineTo(left, bottom - radius);
+        context.quadraticCurveTo(left, bottom, left + radius, bottom);
+        context.lineTo(right - radius, bottom);
+        context.quadraticCurveTo(right, bottom, right, bottom - radius);
+        context.lineTo(right, top + radius);
+        context.quadraticCurveTo(right, top, right - radius, top);
+        context.closePath();
+        context.fill();
+
+    // bottom shadow
+    context.beginPath();
+    context.strokeStyle = "rgba(0,0,0,0.3)";
+    context.moveTo(left + radius / 2.0, bottom);
+    context.lineTo(right - radius / 2.0, bottom);
+    context.stroke();
+
+    // label
+    context.fillStyle = options.color;
+    context.textAlign = "right";
+    context.textBaseline = "top";
+
+    // unfortunately webkit/mozilla are a pixel different in text positioning
+    context.fillText(label, r === 2 ? 29 : 15, browser.mozilla ? 7*r : 6*r);
+  };
+
+  var refreshFavicon = function(){
+    // check support
+    if (!getCanvas().getContext) return;
+
+    setFaviconTag(getCanvas().toDataURL());
+  };
+
+  var abbreviateNumber = function(label) {
+    var metricPrefixes = [
+      ['G', 1000000000],
+      ['M',    1000000],
+      ['k',       1000]
+    ];
+
+    for(var i = 0; i < metricPrefixes.length; ++i) {
+      if (label >= metricPrefixes[i][1]) {
+        label = round(label / metricPrefixes[i][1]) + metricPrefixes[i][0];
+        break;
+      }
+    }
+
+    return label;
+  };
+
+  var round = function (value, precision) {
+    var number = new Number(value);
+    return number.toFixed(precision);
+  };
+
+  // public methods
+  Tinycon.setOptions = function(custom){
+    options = {};
+
+    // account for deprecated UK English spelling
+    if (custom.colour) {
+      custom.color = custom.colour;
+    }
+
+    for(var key in defaults){
+      options[key] = custom.hasOwnProperty(key) ? custom[key] : defaults[key];
+    }
+    return this;
+  };
+
+  Tinycon.setImage = function(url){
+    currentFavicon = url;
+    refreshFavicon();
+    return this;
+  };
+
+  Tinycon.setBubble = function(label, color) {
+    label = label || '';
+    drawFavicon(label, color);
+    return this;
+  };
+
+  Tinycon.reset = function(){
+    currentFavicon = originalFavicon;
+    setFaviconTag(originalFavicon);
+  };
+
+  Tinycon.setOptions(defaults);
+
+  if(typeof define === 'function' && define.amd) {
+    define(Tinycon);
+  } else if (typeof module !== 'undefined') {
+    module.exports = Tinycon;
+  } else {
+    window.Tinycon = Tinycon;
+  }
+
+})();
diff --git a/tinycon.min.js b/tinycon.min.js
new file mode 100644
index 0000000..dc796a3
--- /dev/null
+++ b/tinycon.min.js
@@ -0,0 +1,8 @@
+/*!
+ * Tinycon - A small library for manipulating the Favicon
+ * Tom Moor, http://tommoor.com
+ * Copyright (c) 2015 Tom Moor
+ * @license MIT Licensed
+ * @version 0.6.4
+ */
+!function(){var a={},b=null,c=null,d=null,e=null,f={},g=window.devicePixelRatio||1,h=16*g,i={width:7,height:9,font:10*g+"px arial",color:"#ffffff",background:"#F03D25",fallback:!0,crossOrigin:!0,abbreviate:!0},j=function(){var a=navigator.userAgent.toLowerCase();return function(b){return-1!==a.indexOf(b)}}(),k={ie:j("trident"),chrome:j("chrome"),webkit:j("chrome")||j("safari"),safari:j("safari")&&!j("chrome"),mozilla:j("mozilla")&&!j("chrome")&&!j("safari")},l=function(){for(var a=docume [...]
\ No newline at end of file

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/tinycon.js.git



More information about the Pkg-javascript-commits mailing list