🏠 Home 

Escapist webcomics viewer

Allows navigation to next picture (chronologically) on The Escapist webcomics


Install this script?
  1. // ==UserScript==
  2. // @name Escapist webcomics viewer
  3. // @namespace None
  4. // @description Allows navigation to next picture (chronologically) on The Escapist webcomics
  5. // @require https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js
  6. // @include /^http://www\.escapistmagazine\.com/articles/view/comicsandcosplay/comics/.*/.*$/
  7. // @grant none
  8. // @author iceman94
  9. // @version 0.01
  10. // @copyright 2015+, iceman94
  11. // ==/UserScript==
  12. //=======================================================================================================
  13. // Cross-browsers load function
  14. // Tests in this order :
  15. // -support for jQuery API
  16. // |-uses $(window).load method if available
  17. // |-uses $(window).ready method if available
  18. // -support for DOMContentLoaded event (compatible only with the following browsers :
  19. // Chrome >= 0.2; Firefox >= 1.0; IE >= 9.0; Opera >= 9.0; Safari >= 3.1)
  20. // -support for document.attachEvent
  21. // -uses setTimeout w/ 5000ms delay
  22. //=======================================================================================================
  23. function XBLoad (func, verbose)
  24. {
  25. verbose = verbose || false;
  26. if (window.jQuery)
  27. {
  28. if ($(window).load)
  29. {
  30. if (verbose == true) { console.log('Javascript loaded using $(window).load method'); };
  31. return $(window).load(function() { func(); });
  32. }
  33. else if ($(window).ready)
  34. {
  35. if (verbose == true) { console.log('Javascript loaded using $(window).ready method'); };
  36. return $(window).ready(function() { func(); });
  37. };
  38. }
  39. else if (document.addEventListener)
  40. {
  41. if (verbose == true) { console.log('Javascript loaded using document.addEventListener method'); };
  42. document.addEventListener('DOMContentLoaded', function(event)
  43. {
  44. return func();
  45. });
  46. }
  47. else if (document.attachEvent)
  48. {
  49. if (verbose == true) { console.log('Javascript loaded using document.attachEvent method'); };
  50. document.attachEvent('load', function()
  51. {
  52. return func();
  53. });
  54. }
  55. else
  56. {
  57. if (verbose == true) { console.log('Javascript loaded using setTimeout method'); };
  58. return setTimeout(function() { func(); }, 5000);
  59. };
  60. };
  61. //=======================================================================================================
  62. // Miscellaneous functions
  63. //=======================================================================================================
  64. // Function to search a string in an array and, if it matches, returns the according string
  65. function searchStringInArray (str, strArray)
  66. {
  67. for (var j=0; j<strArray.length; j++) {
  68. if (strArray[j].match(str)) return strArray[j];
  69. }
  70. return -1;
  71. };
  72. // Locates field to be modified by its ID, Tag or Class and sets its CSS (optional)
  73. function locateTgt (tgtType, tgtVal, tgtCSS, tgtIdx)
  74. {
  75. tgtType = tgtType || 'id';
  76. tgtVal = tgtVal;
  77. tgtCSS = tgtCSS || '';
  78. tgtIdx = tgtIdx || '';
  79. switch (tgtType)
  80. {
  81. case 'id':
  82. var tgt = document.getElementById(tgtVal);
  83. break;
  84. case 'tag' :
  85. var tgt = document.getElementsByTagName(tgtVal)[tgtIdx];
  86. break;
  87. case 'class':
  88. var tgt = document.getElementsByClassName(tgtVal)[tgtIdx];
  89. break;
  90. };
  91. if (tgtCSS !== '')
  92. {
  93. setAttr(tgt, 'style', tgtCSS);
  94. };
  95. return tgt;
  96. };
  97. // Locates main picture (i.e. comic picture) in a collection of images based on its 'src' attribute
  98. function locatePic (rgx)
  99. {
  100. var imgColl = document.getElementsByTagName('img');
  101. for(var i=0; i<imgColl.length; i++)
  102. {
  103. if(imgColl[i] && imgColl[i].src.match(rgx) && imgColl[i].height > 120)
  104. {
  105. return imgColl[i];
  106. };
  107. };
  108. }
  109. // Converts base64 code to HTMLImageElement ('<img>' node)
  110. function base64ToImage (b64Code, nodeId)
  111. {
  112. nodeId = nodeId || '';
  113. var image = new Image();
  114. image.src = b64Code;
  115. image.id = nodeId;
  116. return image;
  117. }
  118. //=======================================================================================================
  119. // Allows navigation to next picture as specified by the 'Next' node
  120. // on any comic page just by clicking on the main picture
  121. //=======================================================================================================
  122. function showtime ()
  123. {
  124. //Arrow pointer converted to base64
  125. //Src : https://openclipart.org/image/36px/svg_to_png/191324/cyberscooty-fleche-verte.png
  126. var picB64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAMAAAClZq98AAAACXBIWXMAAAsTAAALEwEAmpwYAAABI1BMVEUAAAAzgAA5cQA2eQA1dQszego5cQk3dgk1cgk3dQc1ggY9egY7gQQ/gQQ8gwQ9gQRAhgdAhQY7gQg/hghCjQU+hQdAiAdBhglAiQhBighDjAlCigdBighBiwhBiQdBiwdBjAdCjAdDjAdAhwdBiwhCiwZCiAdCiQdBiQdDjgdHlAhJlwhJlwlHlghHlghHlghLnghMoQhFkQhMoAlRpgpPpglPqAlVqxBcshdSrwlXuApXuApjvxdvxStavwpexgttziCE1kFhzAthzQtk0wxm1wxn2Qxo2wxv3RZx3Rtz2iCB4TSC2D+I4EGM202O5EqQ5EyQ5U2T3VmV5FWX5lia512b32We6GOe6GSf6GWg6Gav7H6+8Je/8JjJ8qjO87D////03ckAAAAAQ3RSTlMAChITGBkbHB0lKy5BQURHTFhfYWVvb3Z7hZWbpKmtra2tr7PDyM7S1NnZ2trb3ODg4OHh4+Xl5ufr8PHz9fb7/P3+7RRtNQAAAAFiS0dEYMW3fBAAAAD###RBVCjPjdPVDgIxEEDR4u7u7u6ui7u7/P9fsMACISk73LdJTtKknSKESyVEcI6YHEb2UV4PItvmWrFAyLq4Xho+3ntm8TG5JufzaRmWvZAnhCkxPpKtczoKRbb7V7tP+8O9VdlModn8d9O6l/1AQ9oGQfEd9enrpTUk6kIVjX+gjBpEnagEPK7p5yAIVZ3Pe6IzBQP1LBFMqfbDxBXUszC5mFwESVoBEf2qkKjmZiAIlUzg0hFZLbi+1qQU/ghKwdd4A8oUdYndVNudAAAAAElFTkSuQmCC';
  127. // Creates hidden node w/ mouse cursor picture converted from base64 to remove external dependencies
  128. var hiddenDiv = base64ToImage(picB64);
  129. // Regex to match main picture node 'src'
  130. var rgx = /^.*\/media\/global\/images\/library\/.*(jpg|png|gif)$/;
  131. // Locates 'Next' node
  132. var next = locateTgt('class', 'folder_nav_next', null, '0');
  133. // Locates main picture node
  134. var pic = locatePic(rgx);
  135. if (next && next.href && pic && pic.src && pic.src.match(rgx))
  136. {
  137. pic.style.cursor = "url('" + hiddenDiv.src + "'), auto";
  138. pic.setAttribute('onclick', "javascript:window.location='" + next.href + "';");
  139. // Makes sure there is no event or link for parent node
  140. if (pic.parentNode && pic.parentNode.onclick)
  141. {
  142. pic.parentNode.removeAttribute('onclick');
  143. };
  144. if (pic.parentNode && pic.parentNode.href)
  145. {
  146. pic.parentNode.removeAttribute('href');
  147. };
  148. };
  149. };
  150. //=======================================================================================================
  151. // Showtime !
  152. //=======================================================================================================
  153. XBLoad(showtime);