Wanikani Lesson Tab Transmutation

Change the order of lesson tabs

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        Wanikani Lesson Tab Transmutation
// @namespace   mempo
// @description Change the order of lesson tabs
// @include     https://www.wanikani.com/lesson/session
// @version     1.2
// @grant       none
// @run-at      document-end
// ==/UserScript==

var settingsKanji = "";
var settingsVocab = "";

var vocReorderReadingOption = false;

//ATTENTION: It's only possible to choose one of the options below.
//If you select multiple, only the last one will work
var kanReorderExamplesOption = true;
var kanReorderReadingOption  = false;
var kanReorderExamplesReadingOption  = false;

console.log('START OF WLTT');


var intervalFunction  = setInterval(function(){
  if($('#loading-screen').css('display') !== 'none'){
    console.log('WLTT loading...');
  }else{
    console.log("WLTT LOADED");
    clearInterval(intervalFunction);
  
    WLTTreorder();
    $.jStorage.listenKeyChange('l/currentLesson', WLTTreorder);
    
    addSettings();    
    addButtons();
    addStyle(cssModalWindow);
    fetchSettings();

  } 
},250);

var WLTTreorder = function(){
  
    if($.jStorage.get('l/currentLesson').kan){ //kanji
      //console.log('/// the current lesson is kanji');

      //radical examples meaning reading
      if(kanReorderExamplesOption){
         kanReorderExamples();
      }
      
      //radical reading meaning examples
      if(kanReorderReadingOption){
         kanReorderReading();
      }
      
      //radical examples reading meaning
      if(kanReorderExamplesReadingOption){
         kanReorderExamplesReading();
      }

    }else{//vocab
      //console.log('/// the current lesson is vocab');
      
      //breakdown reading meaning
      if(vocReorderReadingOption){
         vocReorderReading();
      }

    }
}



var kanReorderExamples = function(){
        $('#supplement-nav li:nth-child(2)')[0].innerHTML = "Examples";
        $('#supplement-nav li:nth-child(3)')[0].innerHTML = "Meaning";
        $('#supplement-nav li:nth-child(4)')[0].innerHTML = "Reading";
        $('#supplement-kan-meaning').appendTo('#supplement-kan');
        $('#supplement-kan-reading').appendTo('#supplement-kan');
}

var kanReorderReading = function(){
        $('#supplement-nav li:nth-child(2)')[0].innerHTML = "Reading";
        $('#supplement-nav li:nth-child(3)')[0].innerHTML = "Meaning";
        $('#supplement-kan-meaning').appendTo('#supplement-kan');
        $('#supplement-kan-related-vocabulary').appendTo('#supplement-kan');
}

var kanReorderExamplesReading = function(){
        $('#supplement-nav li:nth-child(2)')[0].innerHTML = "Examples";
        $('#supplement-nav li:nth-child(3)')[0].innerHTML = "Reading";
        $('#supplement-nav li:nth-child(4)')[0].innerHTML = "Meaning";
        $('#supplement-kan-reading').appendTo('#supplement-kan');
        $('#supplement-kan-meaning').appendTo('#supplement-kan');
}

var vocReorderReading = function(){
        $('#supplement-nav li:nth-child(2)')[0].innerHTML = "Reading";
        $('#supplement-nav li:nth-child(3)')[0].innerHTML = "Meaning";
        $('#supplement-voc-meaning').appendTo('#supplement-voc');
}

var cssModalWindow = ".white_content {" +
	                    "display: none;"+
                          "position: absolute; "+
                          "top: 25%;"+
                          "left: 25%;"+
                          "width: 50%;"+
                          "height: 75%;"+
                          "padding: 16px;"+
                          "background-color: white;"+
                          "z-index:9002;"+
                          "letter-spacing: 0;" +
                          "overflow: auto;";

var htmlModalWindow = '' +
  '<h1>Settings</h1>' +
  '<form action="#" method="get"> ' +
  '  <h2>Kanji</h2>' +
   ' <input id="k_option1" name="kanji_option" value="0" type="radio">' +
    '<label for="k_option1">None</label> <br>' +
    '<input id="k_option2" name="kanji_option" value="1" type="radio">' +
    '<label for="k_option2">Radical examples meaning reading (default) </label>  <br>' +
    '<input id="k_option3" name="kanji_option" value="2" type="radio">' +
    '<label for="k_option3">Radical reading meaning examples </label>  <br>' +
    '<input id="k_option4" name="kanji_option" value="3" type="radio">' +
    '<label for="k_option4">Radical examples reading meaning</label>  <br>' +
    '<h2>Vocab</h2>' +
    '<input id="v_option1" name="vocab_option" value="0" type="radio">' +
    '<label for="v_option1">None</label> <br>' +
    '<input id="v_option2" name="vocab_option" value="1" type="radio">' +
    '<label for="v_option2">Breakdown reading meaning</label> <br /> <br />' +
  '</form>'+
   ' <div id="btn_submit">Save Settings</div>'+
    '<div id="settings_saved" style="display: none; padding: 5px;">Settings saved!</div>';
    

var addButtons = function () {
    $("<div />", {
        id : "WLTT_button",
        title : "Settings: Wanikani Lesson Tab Transmutation",
    })  .text("WLTT Settings")
        .css({"background-color":"#738994"})
        .css({"opacity":"1"})
        .css({"display":"inline-block"})
        .css({"font-size":"0.8125em"})
        .css({"color":"#FFF"})
        .css({"cursor":"pointer"})
        .css({"padding":"10px"})
        .css({"vertical-align":"bottom"})
        .on("click", showSettings)
        .prependTo("footer");
};

var addSettings = function(){
      //<div id="light" class="white_content">This is the lightbox content. <a href = "javascript:void(0)" onclick = "document.getElementById('light').style.display='none';document.getElementById('fade').style.display='none'">Close</a></div>
      //<div id="fade" class="black_overlay"></div>
      
      $("<div />", {
        id : "light",
        class : "white_content",
      }).appendTo("#lessons");
      
      $("#light").html(htmlModalWindow);
      $("#btn_submit")
            .on("click", saveSettings)
            .css({"background-color":"#738994"})
            .css({"display":"inline"})
            .css({"color":"white"})
            .css({"padding":"5px"})
            .css({"border-radius":"5px"});
      
      $("<div />", {
        id : "fade",
        class : "black_overlay",
      })
        .css({"display":"none"})
        .css({"position":"fixed"})
        .css({"top":"0%"})
        .css({"left":"0%"})
        .css({"width":"100%"})
        .css({"height":"100%"})
        .css({"background-color":"black"})
        .css({"z-index":"9001"})
        .css({"opacity":"0.8"})
        .css({"-moz-opacity":"0.8"})
        .css({"filter":"alpha(opacity=80)"})
        .on("click", hideSettings)
        .appendTo("#lessons");
}

var showSettings = function () {
      document.getElementById('light').style.display='block';
      document.getElementById('fade').style.display='block';
}

var hideSettings = function () {
      document.getElementById('light').style.display='none';
      document.getElementById('fade').style.display='none';
      document.getElementById('settings_saved').style.display='none';

}

var fetchSettings = function() {
      settingsKanji = $.jStorage.get('WLTT_Settings_Kanji');
      settingsVocab = $.jStorage.get('WLTT_Settings_Vocab');
      
      refreshOrdering();
      
      if(settingsKanji){
            switch(settingsKanji){
                  case "0": $("#k_option1").prop("checked", true); break;
                  case "1": $("#k_option2").prop("checked", true); break;
                  case "2": $("#k_option3").prop("checked", true); break;
                  case "3": $("#k_option4").prop("checked", true); break;
            }
            switch(settingsVocab){
                  case "0": $("#v_option1").prop("checked", true); break;
                  case "1": $("#v_option2").prop("checked", true); break;
            }
            
      }else{ // init
           
           //Default option: KanjiOption1 && VocabOption0
           $.jStorage.set('WLTT_Settings_Kanji',"1");
           $.jStorage.set('WLTT_Settings_Vocab',"0");
           settingsKanji = "1";
           settingsVocab = "0";
           $("#k_option2").prop("checked", true); 
           $("#v_option1").prop("checked", true); 
           
      }
}

var saveSettings = function() {
      console.log('WLTT: Settings saved!');
      settingsKanji = $('input[name=kanji_option]:checked').val();
      settingsVocab = $('input[name=vocab_option]:checked').val();
      
      $.jStorage.set('WLTT_Settings_Kanji',settingsKanji);
      $.jStorage.set('WLTT_Settings_Vocab',settingsVocab);
      
      refreshOrdering();
      
      $("#settings_saved").css('display', "block");
}

var refreshOrdering = function() {
      switch(settingsKanji){
                  case "0":
                       kanReorderExamplesOption = false;
                       kanReorderReadingOption  = false;
                       kanReorderExamplesReadingOption  = false; break;
                  case "1": 
                       kanReorderExamplesOption = true;
                       kanReorderReadingOption  = false;
                       kanReorderExamplesReadingOption  = false; break;
                  case "2": 
                       kanReorderExamplesOption = false;
                       kanReorderReadingOption  = true;
                       kanReorderExamplesReadingOption  = false; break;
                  case "3": 
                       kanReorderExamplesOption = false;
                       kanReorderReadingOption  = false;
                       kanReorderExamplesReadingOption  = true; break;
            }
            switch(settingsVocab){
                  case "0": vocReorderReadingOption = false; break;
                  case "1": vocReorderReadingOption = true; break;
            }
      
      WLTTreorder();
}

function addStyle(aCss) {
  var head, style;
  head = document.getElementsByTagName('head')[0];
  if (head) {
    style = document.createElement('style');
    style.setAttribute('type', 'text/css');
    style.textContent = aCss;
    head.appendChild(style);
    return style;
  }
  return null;
}



// RESEARCH CODE - for educational purposes

//////////////// ATTEMPT #1
      //Moves content, but internal counter li.active.data(index) jumps to 2
      //Therefore, meaning is skipped altogether dispite index===1
      //Manually selecting tabs really fucks shit up.
      //$('#supplement-nav li:nth-child(3)').data("index",1);
      //$('#supplement-nav li:nth-child(2)').data("index",2);
//////////////// ATTEMPT #2
      /*
      //moves needle out of order
      //completes cycle
      //shows meaning -> reading
      $('#supplement-nav li:nth-child(3)').attr('data-index', 1); 
      $('#supplement-nav li:nth-child(2)').attr('data-index', 2);
      */
//////////////// ATTEMPT #3
      /* 
      //Works, but fucks up page content every other item
      //Cause unknown
      var meaning = $('#supplement-voc-meaning').html();
      var reading = $('#supplement-voc-reading').html();

      $('#supplement-voc-reading').html(meaning);
      $('#supplement-voc-meaning').html(reading);

      $('#supplement-nav li:nth-child(2)')[0].innerHTML = "Reading";
      $('#supplement-nav li:nth-child(3)')[0].innerHTML = "Meaning";
      */