var jsPsychCloze = (function (jspsych) { 'use strict'; const info = { name: "cloze", parameters: { /** The cloze text to be displayed. Blanks are indicated by %% signs and automatically replaced by input fields. If there is a correct answer you want the system to check against, it must be typed between the two percentage signs (i.e. %solution%). */ text: { type: jspsych.ParameterType.HTML_STRING, pretty_name: "Cloze text", default: undefined, }, /** Text of the button participants have to press for finishing the cloze test. */ button_text: { type: jspsych.ParameterType.STRING, pretty_name: "Button text", default: "OK", }, /** Boolean value indicating if the answers given by participants should be compared against a correct solution given in the text (between % signs) after the button was clicked. */ check_answers: { type: jspsych.ParameterType.BOOL, pretty_name: "Check answers", default: false, }, /** Function called if check_answers is set to TRUE and there is a difference between the participants answers and the correct solution provided in the text. */ mistake_fn: { type: jspsych.ParameterType.FUNCTION, pretty_name: "Mistake function", default: () => { }, }, }, }; /** * **cloze** * * jsPsych plugin for displaying a cloze test and checking participants answers against a correct solution * * @author Philipp Sprengholz * @see {@link https://www.jspsych.org/plugins/jspsych-cloze/ cloze plugin documentation on jspsych.org} */ class ClozePlugin { constructor(jsPsych) { this.jsPsych = jsPsych; } trial(display_element, trial) { var html = '
'; var elements = trial.text.split("%"); const solutions = this.getSolutions(trial.text); let solution_counter = 0; for (var i = 0; i < elements.length; i++) { if (i % 2 === 0) { html += elements[i]; } else { html += ``; solution_counter++; } } html += "
"; display_element.innerHTML = html; const check = () => { var answers = []; var answers_correct = true; for (var i = 0; i < solutions.length; i++) { var field = document.getElementById("input" + i); answers.push(field.value.trim()); if (trial.check_answers) { if (answers[i] !== solutions[i]) { field.style.color = "red"; answers_correct = false; } else { field.style.color = "black"; } } } if (!trial.check_answers || (trial.check_answers && answers_correct)) { var trial_data = { response: answers, }; display_element.innerHTML = ""; this.jsPsych.finishTrial(trial_data); } else { trial.mistake_fn(); } }; display_element.innerHTML += '
"; display_element.querySelector("#finish_cloze_button").addEventListener("click", check); } getSolutions(text) { const solutions = []; const elements = text.split("%"); for (let i = 0; i < elements.length; i++) { if (i % 2 == 1) { solutions.push(elements[i].trim()); } } return solutions; } simulate(trial, simulation_mode, simulation_options, load_callback) { if (simulation_mode == "data-only") { load_callback(); this.simulate_data_only(trial, simulation_options); } if (simulation_mode == "visual") { this.simulate_visual(trial, simulation_options, load_callback); } } create_simulation_data(trial, simulation_options) { const solutions = this.getSolutions(trial.text); const responses = []; for (const word of solutions) { if (word == "") { responses.push(this.jsPsych.randomization.randomWords({ exactly: 1 })); } else { responses.push(word); } } const default_data = { response: responses, }; const data = this.jsPsych.pluginAPI.mergeSimulationData(default_data, simulation_options); //this.jsPsych.pluginAPI.ensureSimulationDataConsistency(trial, data); return data; } simulate_data_only(trial, simulation_options) { const data = this.create_simulation_data(trial, simulation_options); this.jsPsych.finishTrial(data); } simulate_visual(trial, simulation_options, load_callback) { const data = this.create_simulation_data(trial, simulation_options); const display_element = this.jsPsych.getDisplayElement(); this.trial(display_element, trial); load_callback(); const inputs = display_element.querySelectorAll('input[type="text"]'); let rt = this.jsPsych.randomization.sampleExGaussian(750, 200, 0.01, true); for (let i = 0; i < data.response.length; i++) { this.jsPsych.pluginAPI.fillTextInput(inputs[i], data.response[i], rt); rt += this.jsPsych.randomization.sampleExGaussian(750, 200, 0.01, true); } this.jsPsych.pluginAPI.clickTarget(display_element.querySelector("#finish_cloze_button"), rt); } } ClozePlugin.info = info; return ClozePlugin; })(jsPsychModule);