WaniKani All Info Expander

Automatically click "Show All Information"

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name         WaniKani All Info Expander
// @namespace    http://www.wanikani.com
// @version      0.2.1
// @description  Automatically click "Show All Information"
// @author       polv
// @match        https://www.wanikani.com/*
// @match        https://preview.wanikani.com/*
// @license      MIT
// @icon         https://www.google.com/s2/favicons?sz=64&domain=wanikani.com
// @grant        none
// ==/UserScript==

// @ts-check
(function () {
  'use strict';

  /** @type {'meaning' | 'reading' | ''} question type */
  let qType = '';
  /** @type {'Vocabulary' | 'Radical' | 'Kanji' | ''} subject type  */
  let sType = '';

  const inputObserver = new MutationObserver((muts) => {
    // if (qType !== 'meaning') return;

    setTimeout(() => {
      for (const m of muts) {
        const target = /** @type {HTMLDivElement} */ (m.target);
        /**
         * @type {'true' | 'false'}
         * whether it is answered correctly. Must be non-empty string.
         */
        const attrCorrect = /** @type {'true' | 'false'} */ (
          target.getAttribute('correct')
        );

        if (attrCorrect) {
          const btn = document.querySelector(
            '.additional-content__item--item-info',
          );
          if (btn && !btn.className.includes('--open')) {
            // @ts-ignore
            btn.click();
          }
          return;
        }
      }
    }, 100);
  });

  /** @type {Element | null} */
  let inputContainer = null;

  window.addEventListener('willShowNextQuestion', (e) => {
    qType = '';

    if ('detail' in e) {
      const { subject, questionType } = /** @type {any} */ (e.detail);
      qType = questionType;
      sType = subject.type;
    }

    const newInput = document.querySelector('.quiz-input__input-container');
    if (newInput && newInput !== inputContainer) {
      inputContainer = newInput;
      inputObserver.observe(newInput, {
        attributes: true,
        attributeFilter: ['correct'],
      });
    }
  });
})();