Wanikani: Review Queue Sizer

Lets you choose the size of your review session

当前为 2021-02-17 提交的版本,查看 最新版本

// ==UserScript==
// @name         Wanikani: Review Queue Sizer
// @namespace    http://tampermonkey.net/
// @version      1.0.2
// @description  Lets you choose the size of your review session
// @author       Kumirei
// @include      /^https://(www|preview).wanikani.com/(lesson|review)/session$/
// @grant        none
// ==/UserScript==

(function(wkof, $) {
  let script_name = "Wanikani: Review Queue Sizer";
  let script_title = "Review Queue Sizer";
  let script_id = "review_queue_sizer";

  // Make sure WKOF is installed
  if (!wkof) {
    let response = confirm(
      script_name +
        ' requires WaniKani Open Framework.\n Click "OK" to be forwarded to installation instructions.'
    );
    if (response) {
      window.location.href =
        "https://community.wanikani.com/t/instructions-installing-wanikani-open-framework/28549";
    }
    return;
  }

  wkof.include("Menu,Settings,ItemData");
  wkof
    .ready("Menu,Settings")
    .then(load_settings)
    .then(install_menu)
    .then(start);

  function start() {
    // Run once items have loaded, and only once
    let stop = false;
    $.jStorage.listenKeyChange("reviewQueue", () => {
      if (!stop) {
        stop = true;
        run();
      }
    });
  }

  // Load WKOF settings
  function load_settings() {
    let defaults = { qsize: 0 };
    return wkof.Settings.load(script_id, defaults);
  }

  // Installs the options button in the menu
  function install_menu() {
    let config = {
      name: script_id,
      submenu: "Settings",
      title: script_title,
      on_click: open_settings
    };
    wkof.Menu.insert_script_link(config);
  }

  function open_settings() {
    var config = {
      script_id: script_id,
      title: script_title,
      pre_open: settings_pre_open,
      on_save: settings_on_save,
      on_close: run,
      content: {
        qsize: {
          type: "number",
          label: "Queue size",
          default: 0,
          hover_tip: "0 means unlimited"
        }
      }
    };
    let dialog = new wkof.Settings(config);
    dialog.open();
  }

  function settings_on_save(settings) {
    run();
  }

  function settings_pre_open(settings) {
    const target = settings[0].querySelector("#review_queue_sizer_qsize");
    target.addEventListener("keydown", e => {
      if (e.target.nodeName == "INPUT" && e.keyCode == 8) {
        e.target.value = e.target.value.slice(0, -1);
        fire_event(target, "change");
      }
    });
  }

  // Retrieves the current review queue
  function get_queue() {
    const items = [
      ...($.jStorage.get("activeQueue") ?? []) ,
      ...$.jStorage.get("reviewQueue")
    ];
    return items;
  }

  // Create new queue
  function run() {
    let items = get_queue();
    const limit = wkof.settings[script_id].qsize || items.length;
    const done = $.jStorage.get("completedCount");
    $("#bar").width((done / limit) * 100 + "%");
    const truncated = items.slice(0, limit - done);
    $.jStorage.set("reviewQueue", truncated.slice(10));
    $.jStorage.set("activeQueue", truncated.slice(0, 10));
    $.jStorage.set("currentItem", truncated[0]);
  }

  function fire_event(elem, event) {
    let e = document.createEvent("HTMLEvents");
    e.initEvent(event, true, true); // Type, bubbling, cancelable
    return !elem.dispatchEvent(e);
  }
})(window.wkof, window.jQuery);