您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Automatically submits your answer once it's correct.
- // ==UserScript==
- // @name Bunpro: Auto Commit 2.0
- // @namespace http://tampermonkey.net/
- // @version 2.1.3
- // @description Automatically submits your answer once it's correct.
- // @author Kumirei
- // @include *bunpro.jp/*
- // @exclude *community.bunpro.jp*
- // @require https://greasyfork.org/scripts/370623-bunpro-helpful-events/code/Bunpro:%20Helpful%20Events.js?version=974369
- // @require https://greasyfork.org/scripts/370219-bunpro-buttons-bar/code/Bunpro:%20Buttons%20Bar.js?version=768992
- // @grant none
- // ==/UserScript==
- (function() {
- var $ = window.$;
- // ---------------------------------------------------------------SETTINGS--------------------------------------------------------------- //
- var settings = {
- bugReporting: false, // Get alerts when the script can't find the answer
- indicator: true, // Add an indicator for whether an answer was found to the stats bar
- prints: false // Print helpful debug information in the console
- };
- // -----------------------------------------------------------------MAIN----------------------------------------------------------------- //
- // Global variable
- var autocommit = {
- answer: "",
- on: true,
- id: 0,
- sentence: ""
- };
- // Update when a new item is loaded
- $('html')[0].addEventListener('new-review-item', function() {
- // Initialize if first item
- if (!$('#AutoCommit').length) initialise();
- // Reset
- autocommit.answer = "";
- updateIndicator();
- autocommit.id = findID();
- // Find the answer by matching the question to the example sentences
- matchExamples(parse);
- if (autocommit.answer == "") matchExamples((e)=>{return parse(e).replace(/です/g, "");}); // Try removing formalities if no answer was found
- if (autocommit.answer == "" && settings.bugReporting) alertNoAnswer();
- else updateIndicator();
- if (settings.prints) console.log(autocommit.id, 'Answer:', autocommit.answer);
- });
- // Set up the page for continued running
- function initialise() {
- addButton();
- addEventlistener();
- if (settings.indicator) addIndicator();
- }
- // Adds the on/off button to the buttons bar
- function addButton() {
- autocommit.on = (localStorage.getItem('BPautoCommit') == "false" ? false : true);
- buttonsBar.addButton('AutoCommit', 'Auto Commit ' + (autocommit.on == true ? "ON" : "OFF"), toggleAutoCommit);
- }
- // Add event listener that matches the answer to the input when the input changes
- function addEventlistener() {
- $('#study-answer-input').on('keyup', function(e) {
- if (autocommit.on) {
- var currentInput = $('#study-answer-input')[0].value;
- if (currentInput == autocommit.answer) {
- $('#submit-study-answer').click();
- }
- }
- });
- }
- // Adds a red/green cirle which indicates whether the answer has been found
- function addIndicator() {
- $('.in-review-stats').append('<div id="autocommit-indicator" class="review__stats" title="Indicator for whether Autocommit has found an answer for this question"></div>');
- $('head').append('<style id="AutocommitCSS">'+
- ' :root {--autocommit-indicator: red;}'+
- ' #autocommit-indicator {'+
- ' height: 15px;'+
- ' width: 15px;'+
- ' background-color: var(--autocommit-indicator);'+
- ' border-radius: 50%;'+
- ' margin: 13px 5px;'+
- ' }'+
- '</style>');
- }
- // Updates the indicator color depending on whether there is an answer
- function updateIndicator() {
- if (settings.indicator) {
- var newColor = (autocommit.answer == "" ? "red" : "green");
- if (!autocommit.on) newColor = "red";
- $('html')[0].style.setProperty('--autocommit-indicator', newColor);
- }
- }
- // Finds and returns the ID for the grammar point
- function findID() {
- return $('.level_lesson_info > a')[0].href.split("grammar_points/")[1];
- }
- // Matches the study question with the example sentences to find the answer
- function matchExamples(parser) {
- var questionElem = $('.study-question-japanese > div')[0];
- var sentence = parser(questionElem); // Study question with .* where the input should be
- autocommit.sentence = sentence;
- var examples = $('.examples .japanese-example-sentence');
- autocommit.answer = "";
- examples.each(function(i, e) {
- var example = parser(e);
- if (example.match(sentence) != null) {
- var startIndex = sentence.match(/\./).index;
- var sentenceEnd = sentence.slice(startIndex+2)+'$';
- var endIndex = example.match(sentenceEnd).index;
- autocommit.answer = example.slice(startIndex, endIndex); // Crop out the answer
- if (settings.prints) console.log(i, example);
- }
- });
- }
- // Parses the sentence then cleans it by removing punctuation and stuff. Add .* for study question input
- function parse(elem) {
- var text = parseSentence(elem);
- text = text.replace(/___/g, '.*').replace(/\[.*\]$/g, '').replace(/[、。\(\)\s\[\]]/g, '');
- return text;
- }
- // Extracts the sentence in kana from the sentence elements
- function parseSentence(sentenceElem) {
- var text = "";
- sentenceElem.childNodes.forEach((elem)=>{
- //console.log(elem.className==""?undefined:elem.className, elem.nodeName, elem.textContent);
- if (elem.className == "study-area-input") text += "___"; // Underscores to indicate input
- else if (elem.nodeName == "STRONG" || elem.nodeName == "SPAN"|| elem.nodeName == "chui") text += parseSentence(elem); // Need to go deeper for these
- else if (!elem.textContent.includes('(')) text += elem.textContent; // If no furigana is included, just grab the text
- else text += elem.textContent.split('(')[1].replace(')', ''); // Else grab the furigana?
- });
- return text;
- }
- // Alerts the user with info regarding why no answer was found
- function alertNoAnswer(id) {
- var examples = '';
- $('.examples .japanese-example-sentence').each(function(i, e) {examples += 'Example: ' + parse(e) +'\n';});
- var text = 'Bunpro: Autocommit could not find the answer to this question.'+
- '\nCopy the following and sent it to Kumi on the Bunpro forums.'+
- '\n\nIf you don\'t want to receive these bug alerts anymore, disable them by setting bugReporting = false at the top of the script.\n'+
- '\nGrammar ID: ' + autocommit.id +
- '\nSentence: ' + autocommit.sentence +
- '\n' + examples;
- alert(text);
- if (settings.prints) console.log(text);
- }
- // Toggles the running state of the script
- var toggleAutoCommit = function() {
- autocommit.on = !autocommit.on;
- var name = "Auto Commit " + (autocommit.on == true ? "ON" : "OFF");
- $('#AutoCommit')[0].value = name;
- updateIndicator();
- };
- })();