您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Learn in the order you want to.
// ==UserScript== // @name Wanikani Reorder Ultimate 2 BETA // @namespace https://www.wanikani.com // @description Learn in the order you want to. // @version 2.0.201 // @include *://www.wanikani.com/lesson/session* // @include *://www.wanikani.com/review/session* // @grant none // ==/UserScript== (function ($) {$.each(['hide', 'addClass'], function (i, ev) { var el = $.fn[ev]; $.fn[ev] = function () { this.trigger(ev); return el.apply(this, arguments); }; }); })(jQuery);/* * HTML5 Sortable jQuery Plugin * http://farhadi.ir/projects/html5sortable * * Copyright 2012, Ali Farhadi * Released under the MIT license. */ (function(e){var t,n=e();e.fn.sortable=function(r){var i=String(r);r=e.extend({connectWith:false},r);return this.each(function(){if(/^enable|disable|destroy$/.test(i)){var s=e(this).children(e(this).data("items")).attr("draggable",i=="enable");if(i=="destroy"){s.add(this).removeData("connectWith items").off("dragstart.h5s dragend.h5s selectstart.h5s dragover.h5s dragenter.h5s drop.h5s")}return}var o,u,s=e(this).children(r.items);var a=e("<"+(/^ul|ol$/i.test(this.tagName)?"li":"div")+' class="sortable-placeholder">');s.find(r.handle).mousedown(function(){o=true}).mouseup(function(){o=false});e(this).data("items",r.items);n=n.add(a);if(r.connectWith){e(r.connectWith).add(this).data("connectWith",r.connectWith)}s.attr("draggable","true").on("dragstart.h5s",function(n){if(r.handle&&!o){return false}o=false;var i=n.originalEvent.dataTransfer;i.effectAllowed="move";i.setData("Text","dummy");u=(t=e(this)).addClass("sortable-dragging").index()}).on("dragend.h5s",function(){if(!t){return}t.removeClass("sortable-dragging").show();n.detach();if(u!=t.index()){t.parent().trigger("sortupdate",{item:t})}t=null}).not("a[href], img").on("selectstart.h5s",function(){this.dragDrop&&this.dragDrop();return false}).end().add([this,a]).on("dragover.h5s dragenter.h5s drop.h5s",function(i){if(!s.is(t)&&r.connectWith!==e(t).parent().data("connectWith")){return true}if(i.type=="drop"){i.stopPropagation();n.filter(":visible").after(t);t.trigger("dragend.h5s");return false}i.preventDefault();i.originalEvent.dataTransfer.dropEffect="move";if(s.is(this)){if(r.forcePlaceholderSize){a.height(t.outerHeight())}t.hide();e(this)[a.index()<e(this).index()?"after":"before"](a);n.not(a).detach()}else if(!n.is(this)&&!e(this).children(r.items).length){n.detach();e(this).append(a)}return false})})}})(jQuery); var activeLevels = []; var dataset = {}; var lastUpdate = new Date().getTime(); var lessonset = { quick: 'l', queue: 'l/lessonQueue', active: 'l/activeQueue', updateVisual: function() { $('li[data-index="0"]').click(); var items = $.jStorage.get(dataset.queue).concat($.jStorage.get(dataset.active)); $.jStorage.set('l/count/rad', sorter.filterType("rad", items).length); $.jStorage.set('l/count/kan', sorter.filterType("kan", items).length); $.jStorage.set('l/count/voc', sorter.filterType("voc", items).length); } }; var reviewset = { quick: 'r', queue: 'reviewQueue', active: 'activeQueue', updateVisual: function() { var item = $.jStorage.get(dataset.active)[Math.floor(window.Math.random(true))]; if (item) { $.jStorage.set('currentItem', item); } var count = $.jStorage.get(dataset.queue).length + $.jStorage.get(dataset.active).length; $("#available-count").html(count); // to stop the double-up bug. } }; var ordered = false; var settings = { data: { sorttypes: !0, sortlevels: !0, onebyone: !1, quickNext: !1, priority: { 'rad': 1, 'kan': 2, 'voc': 3, }, questionTypeMode: "0", typePriorityMode: "0" }, load: function() { var a = $.jStorage.get('WKU/' + dataset.quick + '/settings'); if (a === null) { settings.save(); return settings.load(); } utilities.log("Loading settings..."); for (var s in settings.data) { if (a[s] !== null) settings.data[s] = a[s]; } $('#types item').sort(function(a, b) { return sorter.getHTMLElementPriority(a) - sorter.getHTMLElementPriority(b); }).appendTo('#types'); $('#sort-types').prop('checked', settings.data.sorttypes).change(); $('#sort-levels').prop('checked', settings.data.sortlevels).change(); $('#priority').removeClass().addClass(utilities.settingsValueToClass('priority', settings.data.typePriorityMode)); $('#quick-next').toggleClass('active', settings.data.quickNext); if (dataset.quick === 'r') { $('#mode').prop('checked', settings.data.onebyone).change(); $('#priority2').removeClass().addClass(utilities.settingsValueToClass('priority2', settings.data.questionTypeMode)); } utilities.log(settings.data); }, save: function() { $.jStorage.set('WKU/' + dataset.quick + '/settings', settings.data); } }; var setup = { init: function() { try { $('div[id*="loading"]').off('hide'); console.dlog = []; utilities.log("WKU Init()"); if (!setup.update.check()) { setup.update.patch(); } else { setup.ui.create(); } } catch (err) { $('#supplement-info, #information').first().after('<div id="error" style="text-align:center;">An error has occurred within WaniKani Reorder Ultimate. Please post the error below on the forum thread.<br><a href="https://www.wanikani.com/chat/api-and-third-party-apps/8471" target="_blank">https://www.wanikani.com/chat/api-and-third-party-apps/8471</a><br><br>' + err + '<br>' + err.stack + '<br><br>Logs:<br>' + console.dlog.join('<br>') + '</div>'); } }, update: { apply: function() { try { utilities.log("Applying UID levels"); var queue = $.jStorage.get(dataset.active).concat($.jStorage.get(dataset.queue)); var current = $.jStorage.get('currentItem'); var list = $.jStorage.get('uids') || []; $.each(queue, function() { this.level = list[utilities.toUID(this)] || 0; if (current && utilities.toUID(this) === utilities.toUID(current)) { $.jStorage.set('currentItem', this); } if (activeLevels.indexOf(this.level) == -1) { activeLevels.push(this.level); } }); activeLevels.sort(function(a, b) { return a - b; }); var review = queue.splice((dataset.quick === 'r' ? 10 : $.jStorage.get('l/batchSize'))); $.jStorage.set(dataset.active, queue); $.jStorage.set(dataset.queue, review); dataset.updateVisual(); } catch (err) { $('#supplement-info, #information').first().after('<div id="error" style="text-align:center;">An error has occurred within WaniKani Reorder Ultimate. Please post the error below on the forum thread.<br><a href="https://www.wanikani.com/chat/api-and-third-party-apps/8471" target="_blank">https://www.wanikani.com/chat/api-and-third-party-apps/8471</a><br><br>' + err + '<br>' + err.stack + '<br><br>Logs:<br>' + console.dlog.join('<br>') + '</div>'); } }, check: function() { try { utilities.log("Checking for UID updates"); var all = $.jStorage.get(dataset.queue).concat($.jStorage.get(dataset.active)); var list = $.jStorage.get('uids') || []; return list && all.every(function(ele) { return ele && list[utilities.toUID(ele)]; }); } catch (err) { $('#supplement-info, #information').first().after('<div id="error" style="text-align:center;">An error has occurred within WaniKani Reorder Ultimate. Please post the error below on the forum thread.<br><a href="https://www.wanikani.com/chat/api-and-third-party-apps/8471" target="_blank">https://www.wanikani.com/chat/api-and-third-party-apps/8471</a><br><br>' + err + '<br>' + err.stack + '<br><br>Logs:<br>' + console.dlog.join('<br>') + '</div>'); } }, patch: function() { try { utilities.log("Gathering data for patch"); var count = 0; var all = {}; $('#information, #supplement-info').first().after('<div id="updateUID" style="text-align:center;">WKU::Please Wait::Currently updating UID list... <span id="id-percent">0%</span></div>'); ["radicals", "kanji", "vocabulary"].forEach(function(ele1, ind1, arr1) { ["PLEASANT", "PAINFUL", "DEATH", "HELL", "PARADISE", "REALITY"].forEach(function(ele2, ind2, arr2) { $.get('https://www.wanikani.com/' + ele1 + '?difficulty=' + ele2, function(resp) { $('#id-percent').text(Math.round((++count / (arr1.length * arr2.length)) * 100) + "%"); $(resp).find('section[id^=level-]').each(function() { var level = $(this).attr('id').replace(/[^\d]/g, ""); $(this).find('.character-item').each(function() { var a = $(this).attr('id'); a = a.substr(0, 1) + a.replace(/[^\d]/g, ""); all[a] = level; }); }); if (count >= (arr1.length * arr2.length)) { $.jStorage.set('uids', all); utilities.log("DONE!"); $('#updateUID').remove(); setup.ui.create(); } }).fail(function() { $('#supplement-info, #information').first().after('<div id="error" style="text-align:center;">WaniKani Reorder Ultimate has failed to load [' + ele2 + ' level ' + ele1 + ']<br>Please reload the page.</div>'); }); }); }); } catch (err) { $('#supplement-info, #information').first().after('<div id="error" style="text-align:center;">An error has occurred within WaniKani Reorder Ultimate. Please post the error below on the forum thread.<br><a href="https://www.wanikani.com/chat/api-and-third-party-apps/8471" target="_blank">https://www.wanikani.com/chat/api-and-third-party-apps/8471</a><br><br>' + err + '<br>' + err.stack + '<br><br>Logs:<br>' + console.dlog.join('<br>') + '</div>'); } } }, ui: { create: function() { setup.update.apply(); $('head').append('<link rel="stylesheet" href="https://cdn.rawgit.com/xMunch/866bd26bf87579087976/raw/126960bed6b964fb71e98cd0df54789ebdc0d1e7/style.min.css">'); $.get('https://gist.githubusercontent.com/xMunch/a448f5999a682f114d61/raw/UI.HTML', function(data) { utilities.log("Creating UI..."); var info = $('#supplement-info, #information').first(); info.after(data); $('#version').text("v" + GM_info.script.version); if (dataset.quick === 'l') { $('.ui').find('#r-only').remove(); } if (!setup.update.check()) { $('.ui-small').first().before('<div id="updateUID-failed" style="text-align:center; display:none;">Failed to update UIDs.<br>Complain here <a href="https://www.wanikani.com/chat/api-and-third-party-apps/8471" target="_blank">https://www.wanikani.com/chat/api-and-third-party-apps/8471</a><div>'); $('#updateUID-failed').fadeIn(500).delay(7500).fadeOut(500); } $('fieldset').on('addClass', function(evt) { if (settings.data.quickNext) { setTimeout(function() { if ($('fieldset').hasClass('correct')) { $('fieldset button').click(); } }, 25); } }); $('#quick-next').click(function() { $(this).toggleClass('active'); settings.data.quickNext = $(this).hasClass('active'); settings.save(); }); $('#priority, #priority2').click(function(e) { var offset = $(this).offset(); var x = (e.pageX - offset.left); var y = (e.pageY - offset.top); var id = $(this).attr('id'); if (y > 50) { if (x < 75) { if (id === "priority") { $(this).removeClass().addClass("level-heavy"); settings.data.typePriorityMode = "1"; sorter.reorder(); } else { $(this).removeClass().addClass("reading-heavy"); settings.data.questionTypeMode = "1"; utilities.forceQuestionTypeUpdate(); } } else { if (id === "priority") { $(this).removeClass().addClass("type-heavy"); settings.data.typePriorityMode = "2"; sorter.reorder(); } else { $(this).removeClass().addClass("meaning-heavy"); settings.data.questionTypeMode = "2"; utilities.forceQuestionTypeUpdate(); } } } else { if (id === "priority") { $(this).removeClass().addClass("balance"); settings.data.typePriorityMode = "0"; sorter.reorder(); } else { $(this).removeClass().addClass("balance2"); settings.data.questionTypeMode = "0"; utilities.forceQuestionTypeUpdate(); } } settings.save(); }).mousemove(function(e) { var offset = $(this).offset(); var x = (e.pageX - offset.left); var y = (e.pageY - offset.top); var ele = $(this).find('#overlay'); if (y > 50) { if (x < 75) { ele.removeClass().addClass('left'); } else { ele.removeClass().addClass('right'); } } else { ele.removeClass().addClass('top'); } }).mouseleave(function(e) { $(this).find('#overlay').removeClass(); }); activeLevels.forEach(function(ele) { $('.ui #levels').append('<item id="level-' + ele + '">' + ele + '</item>'); }); $('span#reverse').click(function() { var parent = $(this).parents('.sortable'); var items = parent.children('item'); parent.append(items.get().reverse()); sorter.reorder(); settings.save(); }); $('.icon-minus, .icon-plus').click(function() { $('.ui, .ui-small').toggleClass('hidden'); }); $('#sort-types, #sort-levels').change(function() { $(this).parents('.sortable').find('item').toggleClass('unsorted', !this.checked); settings.data[$(this).attr('id').replace("-", "")] = this.checked; settings.save(); }); if (dataset.quick === 'r') { $('#mode').on('change', function() { settings.data.onebyone = this.checked; if (settings.data.questionTypeMode > 0) { utilities.forceQuestionTypeUpdate(); } settings.save(); }); $('#option-wrap-up').click(function() { if ($(this).attr('class') === 'wrap-up-selected') { var fullQueue = $.jStorage.get(dataset.active).concat($.jStorage.get(dataset.queue)); $.jStorage.set(dataset.active, fullQueue.splice(0, 10)); $.jStorage.set(dataset.queue, fullQueue); } else { if (ordered) { sorter.reorder(); } } }); } settings.load(); setup.ui.toggler(); $('#reorder').click(function() { sorter.reorder(); }); $('body').on('contextmenu', '.ui', function(e) { e.preventDefault(); }); $('item').mousedown(function(event) { if (event.which === 3) { var ele = $(this).addClass('hidden'); if (ele.attr('id')) { sorter.removeLevel(parseInt(ele.text())); } else { sorter.removeType(ele.attr('class')); } } }); $('.sortable').sortable({ items: ':not(div, button)' }).bind('sortupdate', function() { sorter.reorder(); settings.save(); }); }); }, toggler: function() { if ($('.sortable').length) { var fq = $.jStorage.get(dataset.queue).concat($.jStorage.get(dataset.active)); if (!fq.length) { utilities.log("There are no options available... Removing UI."); $('.ui').remove(); } else { $('#types .radical').toggleClass('hidden', !sorter.filterType("rad", fq).length).prop('title', function() { var filtered = sorter.filterType("rad", fq); var text = "Total: " + filtered.length; $.each(activeLevels, function() { var amount = sorter.filterLevel(this, filtered).length; if (amount) { text += "\nLevel " + this + ": " + amount + ""; } }); return text; }); $('#types .kanji').toggleClass('hidden', !sorter.filterType("kan", fq).length).prop('title', function() { var filtered = sorter.filterType("kan", fq); var text = "Total: " + filtered.length; $.each(activeLevels, function() { var amount = sorter.filterLevel(this, filtered).length; if (amount) { text += "\nLevel " + this + ": " + amount + ""; } }); return text; }); $('#types .vocabulary').toggleClass('hidden', !sorter.filterType("voc", fq).length).prop('title', function() { var filtered = sorter.filterType("voc", fq); var text = "Total: " + filtered.length; $.each(activeLevels, function() { var amount = sorter.filterLevel(this, filtered).length; if (amount) { text += "\nLevel " + this + ": " + amount + ""; } }); return text; }); activeLevels.forEach(function(level) { $('#level-' + level).toggleClass('hidden', !sorter.filterLevel(level, fq).length).prop('title', function() { var filtered = sorter.filterLevel(level, fq); var rad = sorter.filterType("rad", filtered).length; var kan = sorter.filterType("kan", filtered).length; var voc = sorter.filterType("voc", filtered).length; var text = "Total: " + filtered.length; if (rad) { text += "\nRadicals: " + rad; } if (kan) { text += "\nKanji: " + kan; } if (voc) { text += "\nVocabulary: " + voc; } return text; }); }); $('input[type="checkbox"]:disabled').removeAttr('disabled'); } } } }, listeners: function() { var lastCount = $.jStorage.get(dataset.active).length + $.jStorage.get(dataset.queue).length; $.jStorage.listenKeyChange('currentItem', function() { if (lastCount < ($.jStorage.get(dataset.active).length + $.jStorage.get(dataset.queue).length)) { lastCount = $.jStorage.get(dataset.active).length + $.jStorage.get(dataset.queue).length; // will infinitely trigger if not here. setup.init(); } lastCount = $.jStorage.get(dataset.active).length + $.jStorage.get(dataset.queue).length; }); $.jStorage.listenKeyChange('currentItem', utilities.forceQuestionTypeUpdate); $.jStorage.listenKeyChange(dataset.active, setup.ui.toggler); } }; var sorter = { filterLevel: function(level, list) { if (!list) { return []; } return list.filter(function(ele, ind) { return ele.level == level; }); }, filterType: function(type, list) { if (!list) { return []; } return list.filter(function(ele, ind) { return ele[type.substr(0, 3)]; }); }, getHTMLElementPriority: function(a) { return a.className === 'radical' ? settings.data.priority.rad : a.className === 'kanji' ? settings.data.priority.kan : settings.data.priority.voc; }, getPriority: function(a) { return a.rad ? settings.data.priority.rad : a.kan ? settings.data.priority.kan : settings.data.priority.voc; }, randomize: function(list) { return list.sort(function() { return 0.5 - window.Math.randomB(); }); }, reorder: function() { ordered = true; sorter.setPriorities(); var fullQueue = $.jStorage.get(dataset.queue).concat($.jStorage.get(dataset.active)); fullQueue = sorter.randomize(fullQueue); if (parseInt(settings.data.typePriorityMode) == 1) { if (settings.data.sortlevels) { $('#levels > item').each(function() { var level = parseInt(this.innerHTML); var sorted = sorter.filterLevel(level, fullQueue); if (settings.data.sorttypes) { sorted = sorter.sortByType(sorted); } else { sorted = sorter.randomize(sorted); } fullQueue = sorter.removeLevel(level, fullQueue); fullQueue = fullQueue.concat(sorted); }); } } if (parseInt(settings.data.typePriorityMode) == 2) { if (settings.data.sorttypes) { $('#types > item').each(function() { var typeFilter = sorter.filterType(this.className, fullQueue); if (settings.data.sortlevels) { $('#levels > item').each(function() { var level = parseInt(this.innerHTML); var sorted = sorter.filterLevel(level, typeFilter); typeFilter = sorter.removeLevel(level, typeFilter); typeFilter = typeFilter.concat(sorted); }); } else { typeFilter = sorter.randomize(typeFilter); } fullQueue = sorter.removeType(this.className, fullQueue); fullQueue = fullQueue.concat(typeFilter); }); } } $.jStorage.set(dataset.active, (dataset.quick === 'r' ? fullQueue : fullQueue.splice(0, $.jStorage.get('l/batchSize')))); $.jStorage.set(dataset.queue, (dataset.quick === 'r' ? [] : fullQueue)); dataset.updateVisual(); }, removeLevel: function(level, list) { if (!list) { var fullQueue = sorter.removeLevel(level, $.jStorage.get(dataset.queue)); var activeQueue = sorter.removeLevel(level, $.jStorage.get(dataset.active)); $.jStorage.set(dataset.queue, fullQueue); $.jStorage.set(dataset.active, activeQueue); sorter.reorder(); return; } return list.filter(function(ele, ind) { return ele.level != level; }); }, removeType: function(type, list) { if (!list) { var fullQueue = sorter.removeType(type, $.jStorage.get(dataset.queue)); var activeQueue = sorter.removeType(type, $.jStorage.get(dataset.active)); $.jStorage.set(dataset.queue, fullQueue); $.jStorage.set(dataset.active, activeQueue); sorter.reorder(); return; } return list.filter(function(ele, ind) { return !ele[type.substr(0, 3)]; }); }, sortByType: function(list) { return list.sort(function(a, b) { return (sorter.getPriority(a) - sorter.getPriority(b)); }); }, setPriorities: function() { settings.data.priority.rad = $('#types .radical').index(); settings.data.priority.kan = $('#types .kanji').index(); settings.data.priority.voc = $('#types .vocabulary').index(); } }; var utilities = { forceQuestionTypeUpdate: function() { var current = $.jStorage.get("currentItem"); if (!current) { return; } var type = $.jStorage.get("questionType"); if (current.rad) { if (type !== "meaning") { $.jStorage.set("questionType", "meaning"); $.jStorage.set("currentItem", current); } return; } var typeMethod = parseInt(settings.data.questionTypeMode); var data = $.jStorage.get(utilities.toUID(current)); if (!typeMethod && (!data || (!data.mc && !data.rc))) { if ((new Date().getTime() - lastUpdate) > 500) { lastUpdate = new Date().getTime(); var nextRandType = ["reading", "meaning"][Math.round(window.Math.randomB())]; console.log(type, nextRandType); if (type != nextRandType) { $.jStorage.set('questionType', nextRandType); $.jStorage.set("currentItem", current); } } } if (typeMethod === 1) { if (!data || !data.rc) { if (type !== "reading") { $.jStorage.set("questionType", "reading"); $.jStorage.set("currentItem", current); } } else { if (type !== "meaning") { $.jStorage.set("questionType", "meaning"); $.jStorage.set("currentItem", current); } } } if (typeMethod === 2) { if (!data || !data.mc) { if (type !== "meaning") { $.jStorage.set("questionType", "meaning"); $.jStorage.set("currentItem", current); } } else { if (type !== "reading") { $.jStorage.set("questionType", "reading"); $.jStorage.set("currentItem", current); } } } }, highestPriorityType: function() { return $('#types item').not('.hidden').first().attr('class'); }, highestPriorityLevel: function() { return parseInt($('#levels item').not('.hidden').first().text()); }, log: function(msg) { console.dlog.push(msg); console.debug(msg); }, newRandom: function(fullVal) { if (!settings.data.onebyone && ordered) { var fullQueue = $.jStorage.get(dataset.active).concat($.jStorage.get(dataset.queue)); var fullLength = fullQueue.length; if (settings.data.sortlevels && parseInt(settings.data.typePriorityMode) == 1) { fullQueue = sorter.filterLevel(utilities.highestPriorityLevel(), fullQueue); if (settings.data.sorttypes) { fullQueue = sorter.filterType(utilities.toType(fullQueue[0]), fullQueue); } } if (settings.data.sorttypes && parseInt(settings.data.typePriorityMode) == 2) { fullQueue = sorter.filterType(utilities.highestPriorityType(), fullQueue); if (settings.data.sortlevels) { fullQueue = sorter.filterLevel(fullQueue[0].level, fullQueue); } } return Math.floor(window.Math.randomB() * Math.min(10, fullQueue.length)) / (fullVal ? 1 : Math.max(fullLength, 1)); } return settings.data.onebyone ? 0 : window.Math.randomB(); }, toType: function(item) { return (item && item.rad) ? 'rad' : item.kan ? 'kan' : 'voc' || "-1"; }, toUID: function(item) { return ((item && item.rad) ? 'r' : item.kan ? 'k' : 'v') + item.id || "-1"; }, settingsValueToClass: function(id, val) { val = parseInt(val); if (id === "priority") { switch (val) { case 0: return "balance"; case 1: return "level-heavy"; case 2: return "type-heavy"; } } else { switch (val) { case 0: return "balance2"; case 1: return "reading-heavy"; case 2: return "meaning-heavy"; } } } }; $('div[id*="loading"]:visible').on('hide', function() { dataset = (location.pathname.match('review') ? reviewset : lessonset); window.Math.randomB = window.Math.random; if (dataset.quick === 'r') { window.Math.random = utilities.newRandom; } setup.init(); setup.listeners(); });
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址