Advertisement
Guest User

Untitled

a guest
Dec 9th, 2018
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name         Wanikani Add Context To Review
  3. // @namespace    http://wanikani.com
  4. // @version      0.1
  5. // @description  try to take over the world!
  6. // @author       You
  7. // @match        https://www.wanikani.com/review/session
  8. // @grant GM_xmlhttpRequest
  9. // ==/UserScript==
  10.  
  11. (function () {
  12.     'use strict';
  13.  
  14.     var Types = Object.freeze({ "kanji": "kanji", "vocab": "vocabulary", "radical": "radical"});
  15.     var Colors = Object.freeze({
  16.         vocab: "rgb(161, 0, 241)",
  17.         kanji: "rgb(241, 0, 161)",
  18.         radical: "rgb(0, 161, 241)"
  19.     })
  20.  
  21.     var ContextCache = (() => {
  22.         var cache = window.localStorage.wanikani;
  23.         window.localStorage.wanikani = window.localStorage.danh_wanikani || {};
  24.  
  25.         return {
  26.             get: (text, type) => {
  27.                 return cache[`${text}-${type}`];
  28.             },
  29.             set(text, type, contexts) {
  30.                
  31.                 //cache[`${text}-${type}`] = contexts;
  32.             }
  33.         }
  34.  
  35.     })();
  36.  
  37.     var ContextNode = function(text){
  38.         var node = document.createElement("span");
  39.         node.id = "context-info";
  40.         node.innerText = text;
  41.         node.style.fontSize = "20px";
  42.         return node;
  43.     }
  44.     var WaniKaniTestPage = (() => {
  45.         return {
  46.             updateWithContext: (contexts) => {
  47.                 let randomIndex = Math.floor(Math.random() * contexts.length);
  48.                 let context = contexts[randomIndex];
  49.                 let text =  document.getElementById("character").firstElementChild.innerText;
  50.                 let char = document.getElementById("character");
  51.                 debugger;
  52.                 let contextText =  context.replace(new RegExp(`${text}`, 'g'), `[[${text}]]`).trim().split(" ")[0].trim();
  53.                 let contextNode = document.getElementById("context-info");
  54.                 if(contextNode == null){
  55.                     contextNode = ContextNode(contextText);
  56.                     char.appendChild(ContextNode(contextText));
  57.                 } else {
  58.                     contextNode.innerText = contextText;
  59.                 }
  60.             },
  61.             getCharacterOnPage: () => {
  62.                 return document.getElementById("character");
  63.             },
  64.         }
  65.     })();
  66.  
  67.     var WaniKaniInfoPage = (item) => {
  68.         return {
  69.             getContext: function (item, cb) {
  70.                 let context = ContextCache.get(item.text, item.type);
  71.                
  72.                 GM_xmlhttpRequest({
  73.                     method: "GET",
  74.                     url: `https://www.wanikani.com/${item.type}/${item.text}`,
  75.                     onload: (event) => {
  76.                         let doc = event.response;
  77.                         let page = document.createElement("html");
  78.                        
  79.                         page.innerHTML = doc;
  80.                         const strats = {};
  81.                         strats[Types.vocab] = function (page) {
  82.                             return Array.from(page.getElementsByClassName("context-sentence-group"))
  83.                             .map((e) => { return e.innerText; })
  84.                         };
  85.  
  86.                         strats[Types.kanji] = function (page) {
  87.                             return Array.from(page.getElementsByClassName("character-item"))
  88.                                 .filter((e) => { return e.className.includes(Types.vocab) })
  89.                                 .map((e) => { return e.innerText; })
  90.                                 .filter((e)=>{
  91.                                    
  92.                                     return e.includes(item.text)}
  93.                                 )
  94.                         };
  95.                        
  96.                         let contexts = strats[item.type](page);
  97.                         console.log(contexts);
  98.                        
  99.                         ContextCache.set(item.text, item.type, contexts);
  100.                         cb(contexts);
  101.                     }
  102.                 })
  103.             }
  104.         }
  105.     }
  106.  
  107.  
  108.     function search(cb){
  109.         setTimeout(()=>{
  110.             let node = WaniKaniTestPage.getCharacterOnPage();
  111.             let testItem = {
  112.                 text: node.firstElementChild.innerText
  113.             };
  114.             let style = window.getComputedStyle(node).backgroundColor;
  115.            
  116.             switch (style) {
  117.                 case Colors.vocab:
  118.                     testItem.type = Types.vocab;
  119.                    
  120.                     break;
  121.                 case Colors.kanji:
  122.                     testItem.type =  Types.kanji;
  123.                    
  124.                     break;
  125.                 case Colors.radical:
  126.                     testItem.type = Types.radical;
  127.                    
  128.                     break;
  129.                 default: testItem.type = "";
  130.             }  
  131.             console.log(testItem);
  132.             if(testItem.text.trim() == "" || testItem.type == undefined ||testItem.type.trim() == ""){
  133.                 search(cb)
  134.             } else {
  135.                 if(testItem.type != Types.radical)
  136.                     cb(testItem)
  137.             }
  138.         }, 300)
  139.     }
  140.  
  141.  
  142.     let ContextObserver = (() => {
  143.         let watchMain = (mutationsList, observer)=>{
  144.             for(var mutation of mutationsList) {
  145.                 if (mutation.type == 'childList') {
  146.                     search((testItem)=>{
  147.                         debugger;
  148.                         let pageWithContext = WaniKaniInfoPage(testItem);
  149.                         let context = pageWithContext.getContext(testItem, (contexts) => {
  150.                             WaniKaniTestPage.updateWithContext(contexts);
  151.                         })
  152.                     })
  153.                 }
  154.             }
  155.             mutationsList.map((e)=>{ console.log(e.type); });
  156.         }
  157.  
  158.         let node = WaniKaniTestPage.getCharacterOnPage().firstElementChild;
  159.  
  160.         // Options for the observer (which mutations to observe)
  161.         let config = {
  162.             childList: true
  163.          };
  164.  
  165.         // Create an observer instance linked to the callback function
  166.         let observer = new MutationObserver(watchMain);
  167.  
  168.         observer.observe(node, config);
  169.     })();
  170.  
  171.  
  172. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement