您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Show lesson breakdown by type on hover
// ==UserScript== // @name WaniKani Lesson Hover Details // @namespace https://www.wanikani.com // @description Show lesson breakdown by type on hover // @author seanblue // @version 1.2.1 // @include https://www.wanikani.com/* // @grant none // ==/UserScript== (function(wkof, $) { 'use strict'; if (!wkof) { var response = confirm('WaniKani Lesson Hover Details script 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; } const levelSettingOptions = { None: 0, CurrentLevel: 1, PriorLevels: 2 }; // USER SETTING: Change this to display current level data, prior level data, or no level data in parentheses. Use one of the options from "levelSettingOptions". const levelSetting = levelSettingOptions.CurrentLevel; const lessonMenuItemSelector = '.navigation .navigation-shortcut--lessons a'; const lessonDashboardItemSelector = 'a.lessons-and-reviews__lessons-button'; const popoverTemplate = '<div class="popover review-time"><div class="arrow"></div><div class="popover-inner"><div class="popover-content"><p></p></div></div></div>'; const popoverConfig = { html: true, animation: false, placement: 'bottom', trigger: 'hover', template: popoverTemplate }; const style = `<style> .popover { width: auto; } .lhd-table { display: table; margin: 0; padding: 0; } .lhd-row { display: table-row; margin: 0; padding: 0; } .lhd-cell { display: table-cell; margin: 0; font-size: 0.875rem; } .lhd-cell-title { font-weight: bold; padding: 0 5px 0 0; text-align: right; } .lhd-cell-value { padding: 0 0 0 5px; text-align: left; } </style>`; $('head').append(style); wkof.include('Apiv2'); wkof.ready('Apiv2').then(fetchData); function fetchData() { let promises = []; promises.push(wkof.Apiv2.get_endpoint('user')); promises.push(wkof.Apiv2.get_endpoint('summary')); promises.push(wkof.Apiv2.get_endpoint('subjects')); Promise.all(promises).then(processData); } function processData(results) { let lessonCounts = getLessonCount(results); setupMenuPopover(lessonCounts); setupDashboardPopover(lessonCounts); } function getLessonCount(results) { let currentLevel = results[0].level; let summary = results[1]; let subjects = results[2]; let lessonCounts = { radical: 0, kanji: 0, vocabulary: 0, kana_vocabulary: 0, currentLevel : { radical: 0, kanji: 0, vocabulary: 0, kana_vocabulary: 0 } }; // Pull the list of subject_ids from the lesson list in 'summary'. let lessonSubjectIds = summary.lessons[0].subject_ids; lessonSubjectIds.forEach(function(subjectId) { let item = subjects[subjectId]; lessonCounts[item.object]++; if (item.data.level === currentLevel) { lessonCounts.currentLevel[item.object]++; } }); return lessonCounts; } function setupMenuPopover(lessonCounts) { let lessonMenuItem = $(lessonMenuItemSelector); if (lessonMenuItem.length === 0) { return; } lessonMenuItem.attr('data-content', getPopoverHtml(lessonCounts)).popover(popoverConfig); } function setupDashboardPopover(lessonCounts) { let lessonDashboardItem = $(lessonDashboardItemSelector); if (lessonDashboardItem.length === 0) { return; } lessonDashboardItem.attr('data-content', getPopoverHtml(lessonCounts)).popover(popoverConfig); } function getPopoverHtml(lessonCounts) { return `<div class="lhd-table"> ${getPopoverSectionHtml(lessonCounts, 'Radicals', 'radical')} ${getPopoverSectionHtml(lessonCounts, 'Kanji', 'kanji')} ${getPopoverSectionHtml(lessonCounts, 'Vocab', 'vocabulary')} ${getPopoverSectionHtml(lessonCounts, 'Kana Vocab', 'kana_vocabulary')} </div>`; } function getPopoverSectionHtml(lessonCounts, sectionHeader, sectionKey) { let rowOpen = '<div class="lhd-row">'; let headerCell = `<div class="lhd-cell lhd-cell-title">${sectionHeader}</div>`; let lessonCountCell = `<div class="lhd-cell lhd-cell-value">${lessonCounts[sectionKey]}</div>`; let lessonLevelCountCell = ''; if (levelSetting === levelSettingOptions.CurrentLevel) { lessonLevelCountCell = `<div class="lhd-cell lhd-cell-value">(${lessonCounts.currentLevel[sectionKey]} current level)</div>`; } else if (levelSetting === levelSettingOptions.PriorLevels) { lessonLevelCountCell = `<div class="lhd-cell lhd-cell-value">(${lessonCounts[sectionKey] - lessonCounts.currentLevel[sectionKey]} prior levels)</div>`; } let rowClose = '</div>'; return `${rowOpen}${headerCell}${lessonCountCell}${lessonLevelCountCell}${rowClose}`; } })(window.wkof, window.jQuery);
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址