Advertisement
Guest User

WizardRunes.js

a guest
Jun 6th, 2016
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //======================================================================
  2. // Author: 'Anonymous' fom 8 /pol/
  3. //======================================================================
  4. //       DO WHATEVER THE FUCK YOU WANT WITH IT PUBLIC LICENSE
  5. //
  6. // Everyone is permitted to copy and distribute verbatim or modified
  7. // copies of this license document, and changing it is allowed as long
  8. // as the name is changed.
  9. //
  10. // This program is distributed in the hope that it will be useful,
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  13. //
  14. //      DO WHATEVER THE FUCK YOU WANT WANT WITH IT PUBLIC LICENSE
  15. //   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
  16. //
  17. //  0. This is released into the PUBLIC DOMAIN.
  18. //  1. You just DO WHATEVER THE FUCK YOU WANT WITH IT.
  19. //======================================================================  
  20.  
  21. // CLASS NAMES
  22. //================================================================
  23. var TWEETCONTAINTERNODE_CLASSNAME    = "js-tweet-text-container";
  24. var TWEETSTREAMITEMFOOTER            = "stream-item-footer";
  25. var TWEETSTREAMITEMHEADER            = "stream-item-header";
  26.  
  27. var TWEETBOXTOOLBAR_CLASSNAME        = "TweetBoxToolbar";
  28. var TWEETBOXEXTRASITEM_CLASSNAME     = "TweetBoxExtras-item";
  29. var TWEETBOXEXTRASDIV_CLASSNAME      = "WizardRuneMagicButton";
  30. var TWEETREPLYBOXROOT_CLASSNAME      = "RichEditor-scrollContainer";
  31.  
  32.  
  33. // STRINGS
  34. //=================================================================
  35. var ICONTWITTER_PATH                = "icons/icon_twitter.png";
  36.  
  37. // INDICES
  38. //================================================================
  39. var TWEETBOXTOOLBAREXTRAS_INDEX         = 0;
  40. var TWEETBOXTOOLBAREXTRAS_INSERT_INDEX  = 4;
  41.  
  42. // INTERVALS
  43. //================================================================
  44. var REFRESH_INTERVAL_TIMER          = 550;
  45.  
  46. // LOOKUP
  47. //================================================================
  48. var LOOKUP_ALPHA_LOWER = [ "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
  49. var LOOKUP_ALPHA_UPPER = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"];
  50. var LOOKUP_SYMBOLS_ALPHA_32_64 = [ "\u0020","\u0021","\u0022","\u0023","\u0024","\u0025","\u0026","\u0027","\u0028","\u0029","\u002A","\u002B","\u002C","\u002D","\u002E","\u002F","\u0030","\u0031","\u0032","\u0033","\u0034","\u0035","\u0036","\u0037","\u0038","\u0039","\u003A","\u003B","\u003C","\u003D","\u003E","\u003F","\u0040"];
  51. var LOOKUP_SYMBOLS_ALPHA_91_96 = [ "\u005B","\u005C","\u005D","\u005E","\u005F","\u0060" ];
  52. var LOOKUP_SYMBOLS_ALPHA_123_126 = [ "\u007B","\u007C","\u007D","\u007E" ];
  53. var LOOKUP_RUNES = [ "\u05D0", "\u05D1", "\u05D2", "\u05D3", "\u05D4", "\u05D5", "\u05D6", "\u05D7", "\u05D8","\u05D9", "\u05DA", "\u05DB", "\u05DC", "\u05DD", "\u05DE", "\u05DF", "\u05E0","\u05E1", "\u05E2", "\u05E3", "\u05E4", "\u05E5", "\u05E6", "\u05E7", "\u05E8", "\u05E9" ];
  54. var LOOKUP_RUNES_SYMBOLS_32_64 = ["\u0020","\u0461","\u0462","\u0463","\u0464","\u0465","\u0466","\u0467","\u0468","\u0469","\u046A","\u046B","\u046C","\u046D","\u046E","\u046F","\u0470","\u0471","\u0472","\u0473","\u0474","\u0475","\u0476","\u0477","\u0478","\u0479","\u047A","\u047B","\u047C","\u047D","\u047E","\u047F","\u0480"]; //1120-1152
  55. var LOOKUP_RUNES_SYMBOLS_91_96 = ["\u03E2","\u03E3","\u03E4","\u03E5","\u03E6","\u03E7"]; //994-999
  56. var LOOKUP_RUNES_SYMBOLS_123_126 = ["\u0447","\u0448","\u0449","\u044A"]; //1095-1098
  57.  
  58. var LOOKUP_RUNIC_ACCENT             = "\u059f";
  59. var RUNIC_ACCENT_CODEPOINT          = 1439;
  60. var ALPHA_MONEY_CODEPOINT           = 36;
  61. var RUNIC_MONEY_CODEPOINT           = 8362;
  62. var ALPHA_SPECIAL_NUMBER_CODEPOINT  = 54;
  63. var RUNIC_SPECIAL_NUMBER_CODEPOINT  = 1161;
  64. var RUNIC_CODEPOINT_OFFSET          = (2976 / 2);
  65.  
  66. // STATE
  67. //================================================================
  68. var bIsLogicTimerSet        = false;
  69.    
  70. // ENCRYPT / DECRYPT
  71. //================================================================
  72. function alphaToRunes(sValue)
  73. {
  74.     var sResult = "";
  75.     for(it = 0; it < sValue.length; ++it)
  76.     {
  77.         var codePoint = (sValue.codePointAt(it));
  78.         if((codePoint >= 65) && (codePoint <= 90))
  79.         {
  80.             sResult = sResult + LOOKUP_RUNES[codePoint - 65] + LOOKUP_RUNIC_ACCENT;
  81.         }
  82.         else if((codePoint >= 97) && (codePoint <= 122))
  83.         {
  84.             sResult = sResult + LOOKUP_RUNES[codePoint - 97];
  85.         }
  86.         else if(codePoint == ALPHA_MONEY_CODEPOINT)
  87.         {
  88.             sResult = sResult + String.fromCodePoint(RUNIC_MONEY_CODEPOINT);
  89.         }
  90.         else if(codePoint == ALPHA_SPECIAL_NUMBER_CODEPOINT)
  91.         {
  92.             sResult = sResult + String.fromCodePoint(RUNIC_SPECIAL_NUMBER_CODEPOINT);
  93.         }
  94.         else if((codePoint >= 32) && (codePoint <= 64))
  95.         {
  96.             sResult = sResult + LOOKUP_RUNES_SYMBOLS_32_64[(codePoint - 32)];
  97.         }
  98.         else if((codePoint >= 91) && (codePoint <= 96))
  99.         {
  100.             sResult = sResult + LOOKUP_RUNES_SYMBOLS_91_96[(codePoint - 91)];
  101.         }
  102.         else if((codePoint >= 123) && (codePoint <= 126))
  103.         {
  104.             sResult = sResult + LOOKUP_RUNES_SYMBOLS_123_126[(codePoint - 123)];
  105.         }
  106.         else
  107.         {
  108.             sResult = sResult + String.fromCodePoint(codePoint);
  109.         }
  110.     }
  111.     return sResult;
  112. }
  113. function runesToAlpha(sValue)
  114. {
  115.     var sResult = "";
  116.     var codePoint = 0;
  117.     for(it = 0; it < sValue.length; ++it)
  118.     {
  119.         codePoint = sValue.codePointAt(it);
  120.         if(((codePoint - RUNIC_CODEPOINT_OFFSET) >= 0) && ((codePoint - RUNIC_CODEPOINT_OFFSET) <= 25))
  121.         {
  122.             if(((it + 1) < sValue.length) && (sValue.codePointAt(it + 1) == RUNIC_ACCENT_CODEPOINT))
  123.             {
  124.                 sResult = sResult + LOOKUP_ALPHA_UPPER[codePoint - RUNIC_CODEPOINT_OFFSET];
  125.                 it = it + 1;
  126.             }
  127.             else
  128.             {
  129.                 sResult = sResult + LOOKUP_ALPHA_LOWER[codePoint - RUNIC_CODEPOINT_OFFSET];
  130.             }
  131.         }
  132.         else if(codePoint == RUNIC_MONEY_CODEPOINT)
  133.         {
  134.             sResult = sResult + String.fromCodePoint(ALPHA_MONEY_CODEPOINT);
  135.         }
  136.         else if(codePoint == RUNIC_SPECIAL_NUMBER_CODEPOINT)
  137.         {
  138.             sResult = sResult + String.fromCodePoint(ALPHA_SPECIAL_NUMBER_CODEPOINT);
  139.         }//1120-1152
  140.         else if ((codePoint >= 1120) && (codePoint <= 1152))
  141.         {
  142.             sResult = sResult + LOOKUP_SYMBOLS_ALPHA_32_64[(codePoint - 1120)];
  143.         }//994-999
  144.         else if((codePoint >= 994) && (codePoint <= 999))
  145.         {
  146.             sResult = sResult + LOOKUP_SYMBOLS_ALPHA_91_96[(codePoint - 994)];
  147.         }//1095-1098
  148.         else if((codePoint >= 1095) && (codePoint <= 1098))
  149.         {
  150.             sResult = sResult + LOOKUP_SYMBOLS_ALPHA_123_126[(codePoint - 1095)];
  151.         }
  152.         else
  153.         {
  154.             if(codePoint != 10)
  155.             {
  156.                 sResult = sResult + String.fromCodePoint(codePoint);
  157.             }
  158.         }
  159.     }
  160.     return sResult + " ";
  161. }  
  162. function summonMagicRunes()
  163. {
  164.     var tweetBoxList = document.getElementsByClassName(TWEETREPLYBOXROOT_CLASSNAME);
  165.     var tbl = 0;
  166.     while(tbl < tweetBoxList.length)
  167.     {
  168.         var nodeList = tweetBoxList[tbl].children[0].childNodes;
  169.         var current = null;
  170.         var it = 0;
  171.         while(it < nodeList.length)
  172.         {
  173.             current = nodeList[it];
  174.             if((current.nodeType == Node.TEXT_NODE) && (current.data !== "undefined"))
  175.             {
  176.                 current.data = alphaToRunes(current.data);
  177.             }
  178.            
  179.             it = it + 1;
  180.         }
  181.         tbl = tbl + 1;
  182.     }
  183. }
  184.  
  185. // WRUIHandler
  186. //======================================================================================================
  187. function WRUIHandler(ttbNode)
  188. {
  189.     this.tbExtras   = null;
  190.     this.tbItem     = null;
  191.     this.tbDiv      = null;
  192.     this.tbImage    = null;
  193.    
  194.     this.tbExtras = ttbNode.firstElementChild;
  195.    
  196.     this.tbItem = document.createElement('span');
  197.     this.tbItem.setAttribute("class", TWEETBOXEXTRASITEM_CLASSNAME);
  198.     this.tbExtras.insertBefore(this.tbItem, this.tbExtras.children[TWEETBOXTOOLBAREXTRAS_INSERT_INDEX]);
  199.    
  200.     this.tbDiv = document.createElement('div');
  201.     this.tbDiv.setAttribute("class", TWEETBOXEXTRASDIV_CLASSNAME);
  202.     this.tbDiv.style.backgroundImage = 'url(' + chrome.extension.getURL(ICONTWITTER_PATH) + ')';
  203.     this.tbDiv.style.width = "32px";
  204.     this.tbDiv.style.height = "32px";
  205.     this.tbDiv.addEventListener("click", summonMagicRunes);
  206.     this.tbItem.appendChild(this.tbDiv);
  207.    
  208.     this.shutDown = (function()
  209.     {
  210.         this.tbExtras.removeChild(this.tbItem);
  211.     }).bind(this);
  212. }
  213.  
  214. // CORE LOGIC
  215. //=================================================================
  216.  
  217. function appendWizardUI()
  218. {
  219.     var tweetToolBar = document.getElementsByClassName(TWEETBOXTOOLBAR_CLASSNAME);
  220.     if(tweetToolBar.length > 0)
  221.     {
  222.         for(it = 0; it < tweetToolBar.length; ++it)
  223.         {
  224.             var current = tweetToolBar[it];
  225.             if(current.hasOwnProperty("wrUIHandler") === true)
  226.             {
  227.                 current.wrUIHandler.shutDown();
  228.                 current.wrUIHandler = null;
  229.             }
  230.            
  231.             current.wrUIHandler = new WRUIHandler(current);
  232.         }
  233.     }
  234. }
  235.    
  236. function scanAndDecodeRunes()  
  237. {
  238.     var listContent = document.getElementsByClassName(TWEETCONTAINTERNODE_CLASSNAME);
  239.     if(listContent.length > 0)
  240.     {
  241.         var cContent        = null;
  242.         var decryptState    = null;
  243.         var it = 0;
  244.        
  245.         var cNodeList       = null;
  246.         var cNode           = null;
  247.         var nt = 0;
  248.         while(it < listContent.length)
  249.         {
  250.             cContent = listContent[it];
  251.             if(cContent !== "undefined")
  252.             {
  253.                 if(cContent.hasOwnProperty("wrIsDecrypted"))
  254.                 {
  255.                     decryptState = cContent.wrIsDecrypted;
  256.                 }
  257.                 else
  258.                 {
  259.                     decryptState = false;
  260.                 }
  261.  
  262.                 if(decryptState === false)
  263.                 {
  264.                     cContent.children[0].setAttribute("lang", "en");
  265.                     cNodeList = cContent.children[0].childNodes;
  266.                     nt = 0;
  267.                     while(nt < cNodeList.length)
  268.                     {
  269.                         cNode = cNodeList[nt];
  270.                         if((cNode.nodeType == Node.TEXT_NODE) && (cNode.data !== "undefined"))
  271.                         {
  272.                             cNode.data = runesToAlpha(cNode.data);
  273.                         }
  274.                        
  275.                         nt = nt + 1;
  276.                     }
  277.                     cContent.wrIsDecrypted = true;
  278.                 }
  279.             }
  280.             it = it + 1;
  281.         }
  282.     }
  283. }
  284.  
  285. // STATE MANAGEMENT
  286. //=================================================================
  287. function onLogicTimer()
  288. {
  289.     if(bIsLogicTimerSet === true)
  290.     {
  291.         bIsLogicTimerSet = false;
  292.         scanAndDecodeRunes();
  293.         appendWizardUI();
  294.     }
  295. }
  296.  
  297. function trySetLogicTimer()
  298. {
  299.     if(bIsLogicTimerSet === false)
  300.     {
  301.         bIsLogicTimerSet = true;
  302.         window.setTimeout(onLogicTimer, Math.floor((Math.random() * REFRESH_INTERVAL_TIMER) + REFRESH_INTERVAL_TIMER));
  303.     }
  304. }
  305.  
  306. function isElementRelevantForUpdate(element)
  307. {
  308.     if(element !== null)
  309.     {
  310.         var klass = element.getAttribute("class");
  311.        
  312.         if(TWEETCONTAINTERNODE_CLASSNAME == klass)
  313.         {
  314.             return true;
  315.         }
  316.        
  317.         if(TWEETSTREAMITEMFOOTER == klass)
  318.         {
  319.             return true;
  320.         }
  321.        
  322.         if(TWEETSTREAMITEMHEADER == klass)
  323.         {
  324.             return true;
  325.         }
  326.        
  327.         if(TWEETREPLYBOXROOT_CLASSNAME  == klass)
  328.         {
  329.             return true;
  330.         }
  331.        
  332.         if(element.parentElement !== null)
  333.         {
  334.             klass = element.parentElement.getAttribute("class");
  335.            
  336.             if(TWEETCONTAINTERNODE_CLASSNAME == klass)
  337.             {
  338.                 return true;
  339.             }
  340.            
  341.             if(TWEETSTREAMITEMFOOTER == klass)
  342.             {
  343.                 return true;
  344.             }
  345.            
  346.             if(TWEETSTREAMITEMHEADER == klass)
  347.             {
  348.                 return true;
  349.             }
  350.            
  351.             if(TWEETREPLYBOXROOT_CLASSNAME  == klass)
  352.             {
  353.                 return true;
  354.             }
  355.         }
  356.     }
  357.    
  358.     return false;
  359. }
  360.  
  361. function onClick(e)
  362. {
  363.     if((e.target === null) || (e.target.parentElement === null))
  364.     {
  365.         return;
  366.     }
  367.    
  368.     if(isElementRelevantForUpdate(e.target))
  369.     {
  370.         trySetLogicTimer();
  371.     }
  372. }
  373.  
  374. function initialize()
  375. {
  376.     // CLASS NAMES
  377.     //================================================================
  378.     TWEETCONTAINTERNODE_CLASSNAME    = "js-tweet-text-container";
  379.     TWEETSTREAMITEMFOOTER            = "stream-item-footer";
  380.     TWEETSTREAMITEMHEADER            = "stream-item-header";
  381.  
  382.     TWEETBOXTOOLBAR_CLASSNAME        = "TweetBoxToolbar";
  383.     TWEETBOXEXTRASITEM_CLASSNAME     = "TweetBoxExtras-item";
  384.     TWEETBOXEXTRASDIV_CLASSNAME      = "WizardRuneMagicButton";
  385.     TWEETREPLYBOXROOT_CLASSNAME      = "RichEditor-scrollContainer";
  386.  
  387.  
  388.     // STRINGS
  389.     //=================================================================
  390.     ICONTWITTER_PATH                = "icons/icon_twitter.png";
  391.  
  392.     // INDICES
  393.     //================================================================
  394.     TWEETBOXTOOLBAREXTRAS_INDEX         = 0;
  395.     TWEETBOXTOOLBAREXTRAS_INSERT_INDEX  = 4;
  396.  
  397.     // INTERVALS
  398.     //================================================================
  399.     REFRESH_INTERVAL_TIMER          = 550;
  400.  
  401.     // LOOKUP
  402.     //================================================================
  403.     LOOKUP_ALPHA_LOWER = [ "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
  404.     LOOKUP_ALPHA_UPPER = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"];
  405.     LOOKUP_SYMBOLS_ALPHA_32_64 = [ "\u0020","\u0021","\u0022","\u0023","\u0024","\u0025","\u0026","\u0027","\u0028","\u0029","\u002A","\u002B","\u002C","\u002D","\u002E","\u002F","\u0030","\u0031","\u0032","\u0033","\u0034","\u0035","\u0036","\u0037","\u0038","\u0039","\u003A","\u003B","\u003C","\u003D","\u003E","\u003F","\u0040"];
  406.     LOOKUP_SYMBOLS_ALPHA_91_96 = [ "\u005B","\u005C","\u005D","\u005E","\u005F","\u0060" ];
  407.     LOOKUP_SYMBOLS_ALPHA_123_126 = [ "\u007B","\u007C","\u007D","\u007E" ];
  408.     LOOKUP_RUNES = [ "\u05D0", "\u05D1", "\u05D2", "\u05D3", "\u05D4", "\u05D5", "\u05D6", "\u05D7", "\u05D8","\u05D9", "\u05DA", "\u05DB", "\u05DC", "\u05DD", "\u05DE", "\u05DF", "\u05E0","\u05E1", "\u05E2", "\u05E3", "\u05E4", "\u05E5", "\u05E6", "\u05E7", "\u05E8", "\u05E9" ];
  409.     LOOKUP_RUNES_SYMBOLS_32_64 = ["\u0020","\u0461","\u0462","\u0463","\u0464","\u0465","\u0466","\u0467","\u0468","\u0469","\u046A","\u046B","\u046C","\u046D","\u046E","\u046F","\u0470","\u0471","\u0472","\u0473","\u0474","\u0475","\u0476","\u0477","\u0478","\u0479","\u047A","\u047B","\u047C","\u047D","\u047E","\u047F","\u0480"];
  410.     LOOKUP_RUNES_SYMBOLS_91_96 = ["\u03E2","\u03E3","\u03E4","\u03E5","\u03E6","\u03E7"];
  411.     LOOKUP_RUNES_SYMBOLS_123_126 = ["\u0447","\u0448","\u0449","\u044A"];
  412.  
  413.     LOOKUP_RUNIC_ACCENT             = "\u059f";
  414.     RUNIC_ACCENT_CODEPOINT          = 1439;
  415.     ALPHA_MONEY_CODEPOINT           = 36;
  416.     RUNIC_MONEY_CODEPOINT           = 8362;
  417.     ALPHA_SPECIAL_NUMBER_CODEPOINT  = 54;
  418.     RUNIC_SPECIAL_NUMBER_CODEPOINT  = 1161;
  419.     RUNIC_CODEPOINT_OFFSET          = (2976 / 2);
  420.    
  421.     document.addEventListener("wheel", trySetLogicTimer);
  422.     document.addEventListener("scroll", trySetLogicTimer);
  423.     window.addEventListener("click", onClick);
  424.     window.addEventListener("focus", trySetLogicTimer);
  425.    
  426.     window.addEventListener("pageshow", initialize);
  427.     window.addEventListener("hashchange", initialize);
  428.     trySetLogicTimer();
  429. }
  430.  
  431. initialize();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement