magnobiet
1/22/2015 - 9:29 PM

Favicons from Emoji

Favicons from Emoji

(function() {
  var FavEmoji = function(unicode) {
    'use strict';
    var
      canvas = document.createElement('canvas'),
      getContext = function(w) {
        canvas.width = canvas.height = w;
        context = canvas.getContext('2d');
        context.font = 'normal normal normal 32px/' + w + 'px sans';
        context.textBaseline = 'middle';
        return context;
      },
      hex2char = function(hex) {
        var
          result = '',
          n = parseInt(hex, 16);
        if(n <= 0xFFFF)
          result += String.fromCharCode(n);
        else if(n <= 0x10FFFF) {
          n -= 0x10000
          result += String.fromCharCode(0xD800 | (n >> 10)) + String.fromCharCode(0xDC00 | (n & 0x3FF));
        }
        return result;
      },
      context = getContext(32),
      content = unicode.replace(/[Uu]\+10([A-Fa-f0-9]{4})/g, function(str, match) {
        return hex2char('10' + matches);
      }).replace(/[Uu]\+([A-Fa-f0-9]{1,5})/g, function(str, match) {
        return hex2char(match);
      }),
      iconWidth,
      link = document.createElement('link');
    if(!canvas.toDataURL || !document.querySelectorAll)
      return;
    iconWidth = context.measureText(content).width;
    if(iconWidth > canvas.width)
      context = getContext(iconWidth);
    context.fillText(content, (canvas.width - iconWidth) / 2, canvas.height / 2);
    link.setAttribute('rel', 'icon');
    link.setAttribute('type', 'image/png');
    link.setAttribute('href', canvas.toDataURL('image/png'));
    for(var icons = document.querySelectorAll('link[rel*=icon]'), i = 0, l = icons.length; i < l; i++)
      icons[i].parentNode.removeChild(icons[i]);
    document.getElementsByTagName('head')[0].appendChild(link);
  };
  if(typeof define !== 'undefined' && define.amd)
    define([], function() {
      return FavEmoji;
    });
  else if(typeof module !== 'undefined' && module.exports)
    module.exports = FavEmoji;
  else
    this.FavEmoji = FavEmoji;
})();