/bookmarklets-twitter/expand-emoji.js

https://github.com/meklarian/MekScripts · JavaScript · 92 lines · 71 code · 13 blank · 8 comment · 26 complexity · 775b11a4f82471bd379e0820dee804e9 MD5 · raw file

  1. (function(){
  2. // NOTE: Known Emoji Ranges => 0xE001 - 0xE05A, 0xE101 - 0xE15A, 0xE201 - 0xE253, 0xE301 - 0xE34D, 0xE401 - 0xE44C, 0xE501 - 0xE537
  3. var isEmoji = function(v) {
  4. if(v <= 0xE000 || v > 0xE537){return false;}
  5. if(v >= 0xE001 && v <= 0xE05A){return true;}
  6. if(v >= 0xE101 && v <= 0xE15A){return true;}
  7. if(v >= 0xE201 && v <= 0xE253){return true;}
  8. if(v >= 0xE301 && v <= 0xE34D){return true;}
  9. if(v >= 0xE401 && v <= 0xE44C){return true;}
  10. if(v >= 0xE501 && v <= 0xE537){return true;}
  11. return false;
  12. };
  13. var createEmojiImage = function(v){
  14. var img = document.createElement('img');
  15. // NOTE: Please don't screw me on bandwidth.
  16. // NOTE: You can get your own copy of all images below.
  17. // NOTE: http://emoji.meklarian.com/grouped-images.zip
  18. // NOTE: Originals are from http://pukupi.com/post/1964/
  19. // NOTE: Thank you. <3
  20. img.src = "http://emoji.meklarian.com/AIPOTU/" + Number(v).toString(16) + ".png";
  21. return img;
  22. }
  23. var emojiReplace = function(node) {
  24. if(node.nodeType !== 3){return;}
  25. var frag = null;
  26. var changed = false;
  27. var val = node.nodeValue;
  28. var newval = "";
  29. var i = 0;
  30. for(;i<val.length;i++)
  31. {
  32. var cc = val.charCodeAt(i);
  33. if(isEmoji(cc))
  34. {
  35. if(frag == null){frag = document.createDocumentFragment();}
  36. changed = true;
  37. if(newval.length > 0)
  38. {
  39. frag.appendChild(document.createTextNode(newval));
  40. newval = "";
  41. }
  42. frag.appendChild(createEmojiImage(cc));
  43. }
  44. else
  45. {
  46. newval = newval + val.charAt(i);
  47. }
  48. }
  49. if(changed)
  50. {
  51. if(newval.length > 0)
  52. {
  53. frag.appendChild(document.createTextNode(newval));
  54. }
  55. node.nodeValue = '';
  56. node.parentNode.insertBefore(frag, node);
  57. }
  58. };
  59. // NOTE: lazy lookup.
  60. var ignoreNodes = ",textarea,input,style,link,meta,script,object,iframe,pre,head,html,title,";
  61. var replaceInTree = function(node, fnReplace) {
  62. if(node.nodeType !== 1){return;}
  63. var cns = node.childNodes;
  64. var len = cns.length;
  65. while(len--){
  66. var n = cns[len];
  67. if(n.nodeType === 1)
  68. {
  69. // NOTE: I know. I'm Lazy... - PS - 2010-07-31
  70. if(ignoreNodes.indexOf("," + n.nodeName.toLowerCase() + ",") === -1)
  71. {
  72. replaceInTree(n);
  73. }
  74. }
  75. if(n.nodeType === 3){emojiReplace(n);}
  76. };
  77. };
  78. replaceInTree(document.body, emojiReplace);
  79. }());