IP.Chat - Convert Smilies to Text

Like it says on the tin.

  1. // ==UserScript==
  2. // @name IP.Chat - Convert Smilies to Text
  3. // @namespace Makaze
  4. // @include *
  5. // @grant none
  6. // @version 1.0
  7. // @description Like it says on the tin.
  8. // ==/UserScript==
  9.  
  10. var opts,
  11. keep_colons,
  12. show_small_smilies,
  13. style,
  14. smilies,
  15. rows,
  16. text,
  17. image,
  18. i = 0;
  19.  
  20. // Classes constructor
  21.  
  22. function ClassHandler() {
  23. var self = this;
  24.  
  25. this.classList = function(elem) {
  26. return elem.className.trim().split(/[\b\s]/);
  27. };
  28.  
  29. this.hasClass = function(elem, className) {
  30. var classes = self.classList(elem),
  31. has = false,
  32. i = 0;
  33.  
  34. for (i = 0; i < classes.length; i++) {
  35. if (classes[i] === className) {
  36. has = true;
  37. break;
  38. }
  39. }
  40.  
  41. return (has);
  42. };
  43.  
  44. this.addClass = function(elem, className) {
  45. var classes;
  46.  
  47. if (!self.hasClass(elem, className)) {
  48. classes = self.classList(elem);
  49. classes.push(className);
  50. elem.className = classes.join(' ').trim();
  51. }
  52.  
  53. return self;
  54. };
  55.  
  56. this.removeClass = function(elem, className) {
  57. var classes = self.classList(elem),
  58. i = 0;
  59.  
  60. for (i = 0; i < classes.length; i++) {
  61. if (classes[i] === className) {
  62. classes.splice(i, 1);
  63. }
  64. }
  65.  
  66. elem.className = classes.join(' ').trim();
  67.  
  68. return self;
  69. };
  70.  
  71. this.toggleClass = function(elem, className) {
  72. var classes;
  73.  
  74. if (self.hasClass(elem, className)) {
  75. self.removeClass(elem, className);
  76. } else {
  77. classes = self.classList(elem);
  78. classes.push(className);
  79. elem.className = classes.join(' ').trim();
  80. }
  81.  
  82. return self;
  83. };
  84. }
  85.  
  86. // Initialize
  87.  
  88. var Classes = new ClassHandler();
  89.  
  90. // End Classes constructor
  91.  
  92. function createElement(type, callback) {
  93. var element = document.createElement(type);
  94.  
  95. callback(element);
  96.  
  97. return element;
  98. }
  99.  
  100. function replaceImage(img, alt) {
  101. img.parentNode.insertBefore(createElement('span', function(text) {
  102. if (style) {
  103. text.setAttribute('style', style);
  104. }
  105. text.appendChild(document.createTextNode(alt));
  106. }), img);
  107. img.style.display = 'none';
  108. }
  109.  
  110. if (document.body.id === 'ipboard_body' && document.getElementById('storage_chatroom') != null) {
  111. opts = (localStorage.getItem('MakazeScriptOptions')) ? JSON.parse(localStorage.getItem('MakazeScriptOptions')) : {};
  112. keep_colons = (opts.hasOwnProperty('ipc_replace_smilies_keep_colons')) ? opts.ipc_replace_smilies_keep_colons : true;
  113. show_small_smilies = (opts.hasOwnProperty('ipc_replace_smilies_show_small_smilies')) ? opts.ipc_replace_smilies_show_small_smilies : true;
  114. style = (opts.hasOwnProperty('ipc_replace_smilies_style')) ? opts.ipc_replace_smilies_style : false;
  115. smilies = {};
  116.  
  117. if (document.getElementById('emoticons_custom_menu_menucontent').childNodes[0] != null) {
  118. for (i = 0, rows = document.getElementById('emoticons_custom_menu_menucontent').getElementsByTagName('tr'); i < rows.length; i++) {
  119. text = rows[i].getElementsByTagName('td')[0].textContent.trim();
  120. image = rows[i].getElementsByTagName('td')[1].getElementsByTagName('img')[0].src;
  121.  
  122. smilies[image] = (keep_colons) ? text : text.replace(/^:/, '').replace(/:$/, '');
  123. }
  124. } else {
  125. document.getElementById('emoticons_custom_menu').click();
  126. var checkForSmilies = setInterval(function() {
  127. if (document.getElementById('emoticons_custom_menu_menucontent').getElementsByTagName('img')[0] != null) {
  128. document.getElementById('emoticons_custom_menu').click();
  129.  
  130. for (i = 0, rows = document.getElementById('emoticons_custom_menu_menucontent').getElementsByTagName('tr'); i < rows.length; i++) {
  131. text = rows[i].getElementsByTagName('td')[0].textContent.trim();
  132. image = rows[i].getElementsByTagName('td')[1].getElementsByTagName('img')[0].src;
  133.  
  134. smilies[image] = (keep_colons) ? text : text.replace(/^:/, '').replace(/:$/, '');
  135. }
  136.  
  137. clearTimeout(checkForSmilies);
  138. }
  139. }, 1);
  140. }
  141.  
  142. document.addEventListener('DOMNodeInserted', function(event) {
  143. var latestMessage,
  144. images,
  145. image,
  146. fontSize,
  147. i = 0;
  148.  
  149. if (event.target.nodeType !== 1 || event.target.id !== 'storage_chatroom') {
  150. return false;
  151. }
  152.  
  153. latestMessage = event.target.parentNode.getElementsByTagName('div')[event.target.parentNode.getElementsByTagName('div').length - 1];
  154. fontSize = Number(window.getComputedStyle(latestMessage).fontSize.split('px')[0]);
  155.  
  156. if (!Classes.hasClass(latestMessage.parentNode, 'post')) {
  157. return false;
  158. }
  159.  
  160. if (latestMessage.getElementsByTagName('img')[0] == null) {
  161. return false;
  162. }
  163.  
  164. for (i = 0, images = latestMessage.getElementsByTagName('img'); i < images.length; i++) {
  165. image = images[i];
  166. smiley = (smilies.hasOwnProperty(image.src)) ? smilies[image.src] : image.src.split('/')[image.src.split('/').length - 1];
  167.  
  168. if (!show_small_smilies || image.height > fontSize) {
  169. replaceImage(image, smiley);
  170. }
  171. }
  172. }, false);
  173. }

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址