Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2019
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.99 KB | None | 0 0
  1. const SUBS_MARK = "OwO";
  2. const UNSB_MARK = "XwX";
  3. const SUBS_TITLE = "Subscribe to this tag";
  4. const UNSB_TITLE = "Unsubscribe from this tag";
  5. const IS_CHROME = true;
  6. const TAG_PER_QUERY_LIMIT = 6;
  7. const DEBUG_LOGGING = false;
  8. const MERGE_LOGGING = false;
  9. const ERROR_LOGGING = true;
  10.  
  11. /////////////////////////////////////////////////////////////////////////////////////
  12. //Init
  13.  
  14. var storedTags = [];
  15. document.head.addEventListener("toggleSubscription", toggleSubscription);
  16. document.head.addEventListener("viewWatched", viewWatched);
  17.  
  18. if (IS_CHROME)
  19. chrome.storage.local.get("subscriptions", loadedSubscriptions);
  20. else
  21. browser.storage.local.get("subscriptions").then(loadedSubscriptions, errorCallback);
  22.  
  23. function loadedSubscriptions(result){
  24. if (result != null && result.hasOwnProperty("subscriptions")){
  25. storedTags = result.subscriptions;
  26. }
  27. linkify();
  28. onPageLoad();
  29. }
  30.  
  31. /////////////////////////////////////////////////////////////////////////////////////
  32. //Default page processor
  33.  
  34.  
  35. function toggleSubscription(event){
  36. var sender = event.detail.sender;
  37. var tag = event.detail.tag;
  38.  
  39. if (!storedTags.includes(tag)){
  40. // sender.style.backgroundColor = "#822828";
  41. sender.textContent = UNSB_MARK;
  42. sender.title = UNSB_TITLE;
  43. storedTags.push(tag);
  44. save({subscriptions: storedTags});
  45. if (DEBUG_LOGGING)
  46. console.log("Added successfully");
  47. } else {
  48. var i = storedTags.indexOf(tag);
  49. if (i > -1){
  50. if (DEBUG_LOGGING)
  51. console.log("Removed");
  52. // sender.style.backgroundColor = "green";
  53. sender.textContent = SUBS_MARK;
  54. sender.title = SUBS_TITLE;
  55. storedTags.splice(i, 1);
  56. save({subscriptions: storedTags});
  57. } else if (ERROR_LOGGING){
  58. console.log("E621E: Everything goes wrong");
  59. }
  60. }
  61. if (DEBUG_LOGGING)
  62. console.log(storedTags);
  63. }
  64.  
  65. function linkify(){
  66. //Linkify tags
  67. linkifyTags(document.getElementById("tag-sidebar"));
  68.  
  69. //Then linkify navbar
  70. var ul = document.getElementById("navbar");
  71. var watchTower = document.createElement("li");
  72. var poneWithFleshlight = document.createElement("a");
  73. poneWithFleshlight.href = "javascript:void(0)";
  74. poneWithFleshlight.setAttribute("onclick", generateWatchedEventCode(1));
  75. poneWithFleshlight.textContent = "Watched";
  76.  
  77. watchTower.append(poneWithFleshlight);
  78. ul.insertBefore(watchTower, ul.childNodes[2]);
  79. }
  80.  
  81. /////////////////////////////////////////////////////////////////////////////////////
  82. //Watched Page processor
  83.  
  84. var masterPreviews;
  85. //Event listener for Watched button (and paginator)
  86. function viewWatched(event){
  87. var qurl = generateURL(event.detail.page, generateQueries()[0]);
  88. save({watchTower: {url: qurl, page: event.detail.page}});
  89. window.location.href = qurl;
  90. //(storedTags.length > TAG_PER_QUERY_LIMIT)
  91. }
  92.  
  93. //Called every time page and storedTags loaded
  94. function onPageLoad(){
  95. load("watchTower", onPageLoadPartTwo);
  96. }
  97. function onPageLoadPartTwo(cumLoad){
  98. if (window.location.href == cumLoad.watchTower.url){
  99. //save({watchTower: "Undef URL"});
  100. if (storedTags.length > TAG_PER_QUERY_LIMIT){
  101. getDirty(cumLoad.watchTower.page);
  102. }
  103. }
  104. }
  105.  
  106. //Called when tag query exceeds limit
  107. function getDirty(page){
  108. masterPreviews = getPreviewList(document);
  109. var queryQueue = generateQueries();
  110. for (var i = 1; i < queryQueue.length; ++i){
  111. var request = new XMLHttpRequest();
  112. request.addEventListener("load", onSlavePageLoad);
  113. request.open("GET", generateURL(page, queryQueue[i]));
  114. request.send();
  115. }
  116. processPaginator();
  117. overwriteSearchInput();
  118. }
  119.  
  120. function onSlavePageLoad() {
  121. if (DEBUG_LOGGING)
  122. console.log("Finished request to " + this.responseURL);
  123. if (this.status != 200){
  124. if (ERROR_LOGGING)
  125. console.log("Error occured while loading additional query: " + this.status);
  126. return;
  127. }
  128. var slave = new DOMParser().parseFromString(this.responseText, "text/html");
  129.  
  130. //Embed pictures
  131. var previews = getPreviewList(slave);
  132.  
  133. if (previews == null){
  134. if (ERROR_LOGGING)
  135. console.log("Error occured while parsing slavePage");
  136. return;
  137. }
  138.  
  139. for (var i = 0; i < previews.length; ++i)
  140. for (var j = 0; j < masterPreviews.length; ++j){
  141. var nodeIsValid = previews[i].nodeType == 1 && masterPreviews[j].nodeType == 1;
  142. var override = j == (masterPreviews.length - 1);
  143.  
  144. if (nodeIsValid && tryEmbedPreview(previews[i], masterPreviews[j], override))
  145. break;
  146. }
  147.  
  148. //Embed trendingtags
  149. embedTrendingTags(slave.getElementById("tag-sidebar"));
  150. }
  151.  
  152. /////////////////////////////////////////////////////////////////////////////////////
  153. //Page modifiers
  154.  
  155. //Insert slave preview node into page near master node
  156. function tryEmbedPreview(slave, master, override){
  157. var slaveId = getId(slave);
  158. var masterId = getId(master);
  159.  
  160. if (slaveId == masterId){
  161. if (MERGE_LOGGING)
  162. console.log("ignored:" + slaveId);
  163. return true;
  164. } else if (slaveId > masterId){
  165. if (MERGE_LOGGING)
  166. console.log("insert:" + slaveId);
  167.  
  168. master.parentNode.insertBefore(slave, master);
  169. return true;
  170. } else if (override){
  171. if (MERGE_LOGGING)
  172. console.log("end:" + slaveId);
  173.  
  174. master.parentNode.append(slave);
  175. return true;
  176. }
  177. return false;
  178. }
  179.  
  180. //Append list of trending tags from slave queries
  181. function embedTrendingTags(node){
  182. linkifyTags(node);
  183. /*var slaveTags = node.getElementsByTagName("li");
  184. for (var i = 0; i < slaveTags.length; ++i){
  185. document.getElementById("tag-sidebar").append(slaveTags[i]);
  186. }*/
  187. document.getElementById("tag-sidebar").parentNode.append(node);
  188. }
  189.  
  190. //Add event dispatching to inform processor that page is changed
  191. function processPaginator(){
  192. var pageLinks = document.getElementById("paginator").getElementsByTagName("a");
  193.  
  194. for (var i = 0; i < pageLinks.length; ++i){
  195. if (pageLinks[i].href.includes("/post/index/")){
  196. pageLinks[i].setAttribute("onclick", generateWatchedEventCode(parsePageId(pageLinks[i].href)));
  197. }
  198. }
  199. }
  200.  
  201. //Replace text in search field with actual query
  202. function overwriteSearchInput(){
  203. document.getElementById("tags").value = decodeURI(generateQueries().join(""));
  204. }
  205.  
  206. /////////////////////////////////////////////////////////////////////////////////////
  207. //Utils
  208.  
  209. //Add subscription buttons to tag list
  210. function linkifyTags(ul){
  211. if (ul){
  212. var tagList = ul.getElementsByTagName("li");
  213. for (var i = 0; i < tagList.length; ++i){
  214. if (tagList[i].className.startsWith("tag-type")){
  215. var tagLinks = tagList[i].getElementsByTagName("a");
  216. var tag = null;
  217. for (var j = 0; j < tagLinks.length; ++j){
  218. if (!tagLinks[j].hasAttribute("style")){
  219. tag = tagLinks[j].textContent.trim();
  220. break;
  221. }
  222. }
  223.  
  224. if (!tag){
  225. continue;
  226. } else {
  227. tagList[i].insertBefore(generateSubscriptionButton(tag), tagList[i].childNodes[0]);
  228. }
  229. }
  230. }
  231. }
  232. }
  233.  
  234. //Get list of preview nodes from page
  235. function getPreviewList(node){
  236. var divContainer = node.getElementsByClassName("content-post")[0];
  237.  
  238. //Get child node with no id containing all previews
  239. for (var i = 0; i < divContainer.childNodes.length; ++i){
  240. if (divContainer.childNodes[i].nodeType == 1 &&
  241. !divContainer.childNodes[i].hasAttribute("id")){
  242. return divContainer.childNodes[i].childNodes;
  243. }
  244. }
  245. return null;
  246. }
  247.  
  248. //Retrieve page number from page link
  249. function parsePageId(url){
  250. var signature = "/post/index/";
  251. var startIndex = url.indexOf(signature) + signature.length;
  252. var endIndex = url.indexOf("/", startIndex);
  253. return parseInt(url.substring(startIndex, endIndex));
  254. }
  255.  
  256. //Retrieve publication id from preview node
  257. function getId(preview){
  258. return parseInt(preview.id.substring(1), 10);
  259. }
  260.  
  261. //Generate URL for search query
  262. function generateURL(page, q){
  263. return "https://e621.net/post/index/" + page + "/" + q;
  264. }
  265.  
  266. //Generate array of search queries
  267. function generateQueries(){
  268. var query = [""];
  269. for (var i = 0; i < storedTags.length; ++i){
  270. var ti = Math.floor(i / TAG_PER_QUERY_LIMIT);
  271. if (ti >= query.length)
  272. query[ti] = "";
  273. query[ti] += encodeURI("~" + storedTags[i].split(" ").join("_") + " ");
  274. }
  275. return query;
  276. }
  277.  
  278. function generateWatchedEventCode(page){
  279. return "document.head.dispatchEvent(new CustomEvent('viewWatched', {detail:{page: " + page + "}}));";
  280. }
  281.  
  282. function generateSubscriptionButton(tag){
  283. var subscribed = storedTags.includes(tag);
  284. var mark = document.createElement("a");
  285. mark.setAttribute("href", "javascript:void(0)");
  286. mark.setAttribute("onclick", "document.head.dispatchEvent(new CustomEvent('toggleSubscription', {detail:{tag: '" + tag + "', sender: this}}));");
  287. mark.style.margin = "2px";
  288. mark.textContent = subscribed ? UNSB_MARK : SUBS_MARK;
  289. mark.title = subscribed ? UNSB_TITLE : SUBS_TITLE;
  290.  
  291. return mark;
  292. }
  293.  
  294. function errorCallback(){
  295. if (ERROR_LOGGING)
  296. console.log("Error occured while loading from storage");
  297. }
  298.  
  299. function save(json){
  300. if (IS_CHROME)
  301. chrome.storage.local.set(json);
  302. else
  303. browser.storage.local.set(json);
  304. }
  305.  
  306. function load(key, callback){
  307. if (IS_CHROME)
  308. chrome.storage.local.get(key, callback);
  309. else
  310. browser.storage.local.get(key).then(callback, errorCallback);
  311. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement