Check that the okurigana matches the answer
当前为
// ==UserScript==
// @name WaniKani Even Kana? (ModAnswerChecker)
// @namespace http://www.wanikani.com
// @version 1.2.0
// @description Check that the okurigana matches the answer
// @author polv
// @match https://www.wanikani.com/extra_study/session*
// @match https://www.wanikani.com/review/session*
// @match https://www.wanikani.com/subjects/*
// @match https://preview.wanikani.com/extra_study/session*
// @match https://preview.wanikani.com/review/session*
// @match https://preview.wanikani.com/subjects/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=wanikani.com
// @license MIT
// @require https://greasyfork.org/scripts/470201-wanikani-answer-checker/code/WaniKani%20Answer%20Checker.js?version=1215595
// @supportURL https://community.wanikani.com/t/do-you-even-kana-okurigana-matcher/8440/56
// @source https://github.com/patarapolw/wanikani-userscript/blob/master/userscripts/even-kana.user.js
// @grant none
// ==/UserScript==
// @ts-check
/// <reference path="./types/answer-checker.d.ts" />
(function () {
'use strict';
window.modAnswerChecker.register((e) => {
if (e.questionType === 'reading' && e.item.type === 'Vocabulary') {
if (!matchOkurigana(e.item.characters, e.response.trim())) {
return {
action: 'retry',
message: {
text: 'Bro, Do you even Kana?',
type: 'answerException',
},
};
}
}
return null;
});
const CP_KATA_A = 'ア'.charCodeAt(0);
const CP_HIRA_A = 'あ'.charCodeAt(0);
/**
* @param {string} s
* @returns {string}
*/
function toHiragana(s) {
return s.replace(/\p{sc=Katakana}/gu, (c) =>
['ヶ'].includes(c)
? c
: String.fromCharCode(c.charCodeAt(0) - CP_KATA_A + CP_HIRA_A),
);
}
/**
*
* @param {string} key
* @param {string} userAnswer
* @returns {boolean}
*/
function matchOkurigana(key, userAnswer) {
return new RegExp(
'^' + toHiragana(key).replace(/[^\p{sc=Hiragana}ー]+/gu, '.+') + '$',
).test(toHiragana(userAnswer));
}
})();