From aaa83798831f8f30388c2e89648f9c553136c77b Mon Sep 17 00:00:00 2001 From: Jakob Heinemann Date: Wed, 26 Mar 2025 13:50:13 +0100 Subject: [PATCH 1/4] convert formatcheck to amd module --- amd/build/formatcheck.min.js | 12 + amd/build/formatcheck.min.js.map | 1 + {script => amd/src}/formatcheck.js | 645 ++++++++++++++++++++--------- edit_formulas_form.php | 4 +- renderer.php | 12 +- 5 files changed, 472 insertions(+), 202 deletions(-) create mode 100644 amd/build/formatcheck.min.js create mode 100644 amd/build/formatcheck.min.js.map rename {script => amd/src}/formatcheck.js (65%) diff --git a/amd/build/formatcheck.min.js b/amd/build/formatcheck.min.js new file mode 100644 index 00000000..1386364a --- /dev/null +++ b/amd/build/formatcheck.min.js @@ -0,0 +1,12 @@ +define("qtype_formulas/formatcheck",["exports"],(function(_exports){ +/** + * Check whether the format of input numbers, formulas and units are incorrect + * + * @copyright © 2010-2011 Hon Wai, Lau; 2024 Jakob Heinemann + * @author Hon Wai, Lau + * @author Jakob Heinemann + * @license http://www.gnu.org/copyleft/gpl.html GNU Public License version 3 + */ +function formulas_format_check(decimal_separator,inputtitle){const regexp_decsep="."==decimal_separator?".":decimal_separator;var use_format_check=!0,show_hinting_type=null,show_interpretation=null,show_warning=null,unittest_fail_show_icon=!1,unittest_fail_show_details=!1,types=[["unit",!0,!0,!0],["number",!0,!0,!0],["number_unit",!0,!0,!0],["numeric",!0,!0,!0],["numeric_unit",!0,!0,!0],["numerical_formula",!0,!0,!0],["numerical_formula_unit",!0,!0,!0],["algebraic_formula",!0,!0,!0],["editing_unit",!0,!0,!0]],constlist={pi:"3.14159265358979323846"},funclist={sin:1,cos:1,tan:1,asin:1,acos:1,atan:1,exp:1,log10:1,ln:1,sqrt:1,abs:1,ceil:1,floor:1,fact:1},evalreplacelist={ln:"log",log10:"(1./log(10.))*log",fact:"abs"},dispreplacelist={log10:"log10","3.14159265358979323846":"π"};if(use_format_check){for(var i=0;i128&&(self.input.value=self.input.value.substr(0,128)),common.ready&&common.pass&&(self.cur_value=common.fn.trim(self.input.value),null===self.last_value||self.last_value!=self.cur_value)){self.last_value=self.cur_value,self.answered=""!=self.input.value;var info=self.answered?common.fn[self.func](common.fn,self.cur_value):"";self.correct=null!==info,info=null!==info?common.fn.trim(info):"",self.warning.style.display=self.show_sign&&self.answered&&!self.correct?"block":"none",self.correct?(self.interpretation.innerHTML=info,self.interpretation.style.display=self.show_interpretation&&self.cur_value!=info?"block":"none",self.interpretation.className="formulas_input_info_interpretation"):self.interpretation.className="formulas_input_info_interpretation_incorrect"}},check_unit:function(fn,value){var base_units=null;try{base_units=fn.parse_unit(fn,value)}catch(e){}return null===base_units?null:fn.format_unit(base_units)},check_number:function(fn,value){var v=fn.get_formula_information(fn,value);return null===v||0==/^[-+]?@0$/.test(v.sub)||1!=v.lengths.n||0!=v.lengths.f||0!=v.lengths.v?null:fn.format_number(value)},check_number_unit:function(fn,value){var splitted=fn.split_formula_unit(fn,value),n=fn.check_number(fn,splitted[0]),u=fn.check_unit(fn,splitted[1]);return null===n||null===u?null:n+" "+u},check_numeric:function(fn,value){var v=fn.get_formula_information(fn,value);if(null===v)return null;if(0==/^[ )(^\/*+-]*$/.test(v.remaining))return null;if(0!=v.lengths.f||0!=v.lengths.v)return null;if(null===fn.test_evaluation(fn,v,v.sub))return null;var n=fn.check_number(fn,value);return null!==n?n:fn.replace_display_formula(fn,v,v.sub)},check_numeric_unit:function(fn,value){var splitted=fn.split_formula_unit(fn,value),n=fn.check_numeric(fn,splitted[0]),u=fn.check_unit(fn,splitted[1]);return null===n||null===u?null:n+" "+u},check_numerical_formula:function(fn,value){var v=fn.get_formula_information(fn,value);if(null===v)return null;if(0==/^[ )(^\/*+-]*$/.test(v.remaining))return null;if(0!=v.lengths.v)return null;if(null===fn.test_evaluation(fn,v,v.sub))return null;var n=fn.check_number(fn,value);return null!==n?n:fn.replace_display_formula(fn,v,v.sub)},check_numerical_formula_unit:function(fn,value){var splitted=fn.split_formula_unit(fn,value),n=fn.check_numerical_formula(fn,splitted[0]),u=fn.check_unit(fn,splitted[1]);return null===n||null===u?null:n+" "+u},check_algebraic_formula:function(fn,value){var v=fn.get_formula_information(fn,value);if(null===v)return null;if(0==/^[ )(^\/*+-]*$/.test(v.remaining))return null;var variables={};for(var key in v.all)variables[key]=v.all[key];for(var key in v.all)null!==v.all[key]&&"v"==v.all[key].type&&(v.all[key]={type:"n",value:"1."});var result=fn.test_evaluation(fn,v,v.sub);for(var key in v.all)v.all[key]=variables[key];return null===result?result:fn.replace_display_formula(fn,v,v.sub)},check_editing_unit:function(fn,value){for(var unit_lists=value.split("="),correct=!0,formatted=[],i=0;i<=~!|&%^\/*+-])(([0-9]+\.?[0-9]*|[0-9]*\.?[0-9]+)([eE][-+]?[0-9]+)?)/.source;numPattern=new RegExp(numPattern.replaceAll("\\.",regexp_decsep),"g");for(var splitted=text.replace(numPattern,"$1`$2`").split("`"),i=1;i"+vstack.all[key].value+""),"n"==vstack.all[key].type&&(vstack.all[key].value=fn.format_number(vstack.all[key].value,!0)));for(text=fn.substitute_placeholders_in_text(fn,vstack,text);;){var loc=text.lastIndexOf("pow");if(loc<0)break;var b=fn.get_expressions_in_bracket(text,loc+1,"(",{"(":")"}),base=fn.trim(b.expressions[0]);"("!=base[0]&&base.indexOf("(")>=0&&(base="("+base+")");var expo=fn.trim(b.expressions[1]);"("==expo[0]&&")"==expo[expo.length-1]&&(expo=expo.substr(1,expo.length-2)),text=text.substr(0,loc)+base+""+expo+""+text.substr(b.closeloc+1)}return text},get_expressions_in_bracket:function(text,start,open,bset){var bflip={};for(var b in bset)bflip[bset[b]]=b;for(var ostack=[],i=start;i0));i++);if(0==ostack.length)return null;var firstopenloc=i,expressions=[],ploc=i+1;for(i=ploc;i=0){if(no_divisor||0==pos||pos>=str.length-1)return null;var left=fn.trim(str.substr(0,pos)),right=fn.trim(str.substr(pos+1));"("==right[0]&&")"==right[right.length-1]&&(right=right.substr(1,right.length-2));var uleft=fn.parse_unit(fn,left,!0),uright=fn.parse_unit(fn,right,!0);if(null===uleft||null===uright)return null;for(var unit=uleft,unit_set={},i=0;i1&&(0==name.length||0==ex[1].length))return null;if(0!=name.length){if(0==/^[^\]\[)(}{><0-9.,:;`~!@#^&*\/?|_=+ -]+$/.test(name))return null;exponent=null;if(ex.length>1){var matches=/(.*)([0-9]+)(.*)/.exec(ex[1]);if(0==matches.length)return null;if(""==matches[1]&&""==matches[3]&&(exponent=parseInt(matches[2])),"-"==matches[1]&&""==matches[3]&&(exponent=-parseInt(matches[2])),"(-"==matches[1]&&")"==matches[3]&&(exponent=-parseInt(matches[2])),null===exponent)return null}else exponent=1;if(name in unit_set)return null;unit.push([name,exponent]),unit_set[name]=exponent}}return unit},format_number:function(number,is_original){try{if(null===is_original&&(is_original=!1),is_original){if(null===/[eE]/.exec(number))return number;var standardform=number,symbol=""}else{var value=parseFloat(number.replace(decimal_separator,".")),absnum=Math.abs(value);if(0==absnum)return number;var loc=number.search(/[eE]/),newvalue=(standardform=value.toExponential(),parseFloat(standardform));if(standardform=standardform.replace(".",decimal_separator),value==newvalue&&-1==loc&&absnum>=Math.pow(10,-2)&&absnum<=Math.pow(10,6))return number;symbol=""}var s=standardform.split(/[eE]/),regexp=new RegExp("("+regexp_decsep+")?0*$"),decimal=s[0].replace(regexp,""),exponent="+"==s[1][0]?s[1].substr(1):"-"==s[1][0]?"−"+s[1].substr(1):s[1];return symbol+(decimal+(0==exponent?"":"×10"+exponent+""))}catch(e){return""}},format_unit:function(base_units){try{for(var res=[],i=0;i"+exponent+"")}return res.join("·")}catch(e){return""}},trim:function(str){return str.replace(/^\s+|\s+$/g,"")}},common={};common.fn=fn,common.ready=!1,common.testresult=unittest(),common.pass=common.testresult.numcorrect==common.testresult.numcase,common.pass||signal_fail(common),common.others=init(common,types),common.ready=!0;for(var i=0;i'+(unittest_fail_show_details?common.testresult.failcases.join("
"):"")+''),document.body.insertBefore(warning,null)}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0;const init=(decimal_separator,inputtitle)=>{"complete"===!document.readyState?document.addEventListener("DOMContentLoaded",(()=>{formulas_format_check(decimal_separator,inputtitle)})):formulas_format_check(decimal_separator,inputtitle)};_exports.init=init})); + +//# sourceMappingURL=formatcheck.min.js.map \ No newline at end of file diff --git a/amd/build/formatcheck.min.js.map b/amd/build/formatcheck.min.js.map new file mode 100644 index 00000000..84e0f406 --- /dev/null +++ b/amd/build/formatcheck.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"formatcheck.min.js","sources":["../src/formatcheck.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Check whether the format of input numbers, formulas and units are incorrect\n *\n * @copyright © 2010-2011 Hon Wai, Lau; 2024 Jakob Heinemann\n * @author Hon Wai, Lau \n * @author Jakob Heinemann \n * @license http://www.gnu.org/copyleft/gpl.html GNU Public License version 3\n */\n\n/**\n * This function will be called to initialize the format check for input boxes, after the page is fully loaded.\n * @param {*} decimal_separator\n * @param {*} inputtitle\n * @return\n */\nfunction formulas_format_check(decimal_separator, inputtitle) {\n const regexp_decsep = decimal_separator == '.' ? '\\.' : decimal_separator;\n // If use_format_check is set to false, no format check will be used and initialized.\n var use_format_check = true;\n // Show the type hinting under the input box, such as 'Number', 'Unit'.\n // null means use the individual setting in variable types below.\n var show_hinting_type = null;\n // Show the interpretation of the formula under the input box.\n // null means use the individual setting in variable types below.\n var show_interpretation = null;\n // Show the warning sign if the input is wrong/not interpretable.\n // null means use the individual setting in variable types below.\n var show_warning = null;\n // Show an icon at the low right corner if the format check testing fails\n var unittest_fail_show_icon = false;\n // Show the detail test case that it fails.\n var unittest_fail_show_details = false;\n\n // The following variable can fine control the information for each type in addition to the variable defined above\n // So, if the type name is commented out here, the corresponding format checking will be disabled\n // For each type record, it contains the input type name (say 'unit')\n // and whether to show the type name (true/false), interpretation (true/false) and warning sign (true/false) respectively\n var types = [\n ['unit', true, true, true], // For the unit input box.\n ['number', true, true, true], // For the number input box.\n ['number_unit', true, true, true], // Input box with number and unit together.\n ['numeric', true, true, true], // Allow the combination of numbers and operators + - * / ^ ( ).\n ['numeric_unit', true, true, true], // Input box with numeric and unit together.\n ['numerical_formula', true, true, true], // Allow the combination of numbers, operators and functions.\n ['numerical_formula_unit', true, true, true], // Input box with numerical formula and unit together.\n ['algebraic_formula', true, true, true], // Allow the combination of numbers, operators, functions and variables.\n ['editing_unit', true, true, true] // Used for the unit in editing interface.\n ];\n\n // The list of constant that will be replaced by the corresponding number.\n var constlist = {'pi': '3.14159265358979323846'};\n\n // The list of allowable (single parameter) function and their evaluation replacement.\n var funclist = {'sin': 1, 'cos': 1, 'tan': 1, 'asin': 1, 'acos': 1, 'atan': 1, 'exp': 1,\n 'log10': 1, 'ln': 1, 'sqrt': 1, 'abs': 1, 'ceil': 1, 'floor': 1, 'fact': 1};\n\n /**\n * The replacement list used when preform trial evaluation, note it is not the same as dispreplacelist\n * Replace 'fact' (factorial) by 'abs', because JS does not have a factorial function and\n * therefore, an expression containing fact() will always be considered as invalid. We use abs(),\n * because we just need some replacement function and are not interested in the actual result.\n */\n\n // Natural log and log with base 10, no log allowed to avoid ambiguity.\n var evalreplacelist = {'ln': 'log', 'log10': '(1./log(10.))*log', 'fact': 'abs'};\n\n // The replacement list used when the formula is displayed on the screen.\n var dispreplacelist = {'log10': 'log10', '3.14159265358979323846': 'π'};\n\n // Perform the action specified by the above global variables.\n if (!use_format_check) {\n return;\n }\n for (var i=0; i 128) {\n self.input.value = self.input.value.substr(0,128);\n }\n if (!common.ready || !common.pass) {\n return;\n }\n self.cur_value = common.fn.trim(self.input.value);\n if (self.last_value !== null && self.last_value == self.cur_value) {\n return;\n }\n self.last_value = self.cur_value;\n self.answered = self.input.value == '' ? false : true;\n\n // Call the corresponding function for this particular input box if the value is not empty.\n var info = self.answered ? common.fn[self.func](common.fn, self.cur_value) : '';\n self.correct = (info !== null); // the function returns a string if correct, otherwise null\n info = (info !== null) ? common.fn.trim(info) : '';\n\n // Update the information shown on the screen.\n self.warning.style.display = (self.show_sign && self.answered && !self.correct) ? 'block' : 'none';\n if (self.correct) {\n self.interpretation.innerHTML = info;\n self.interpretation.style.display = (self.show_interpretation && self.cur_value != info) ? 'block' : 'none';\n self.interpretation.className = 'formulas_input_info_interpretation';\n }\n else {\n // Dim the text color and keep the background text unchanged, until the next correct.\n self.interpretation.className = 'formulas_input_info_interpretation_incorrect';\n }\n },\n\n check_unit : function(fn, value) {\n var base_units = null;\n try {\n base_units = fn.parse_unit(fn, value);\n } catch(e) {}\n if (base_units === null) {\n return null;\n }\n return fn.format_unit(base_units);\n },\n\n check_number : function(fn, value) {\n var v = fn.get_formula_information(fn, value);\n if (v === null) {\n return null;\n }\n if (/^[-+]?@0$/.test(v.sub) == false) {\n return null; // It must be a positive number, with an optional '-' sign.\n }\n if (!((v.lengths['n'] == 1) && (v.lengths['f'] == 0) && (v.lengths['v'] == 0))) {\n return null;\n }\n return fn.format_number(value);\n },\n\n check_number_unit : function(fn, value) {\n var splitted = fn.split_formula_unit(fn, value);\n var n = fn.check_number(fn, splitted[0]);\n var u = fn.check_unit(fn, splitted[1]);\n if (n === null || u === null) {\n return null; // both part must correct simultaneously\n }\n return n + ' ' + u;\n },\n\n check_numeric : function(fn, value) {\n var v = fn.get_formula_information(fn, value);\n if (v === null) {\n return null;\n }\n if (/^[ )(^\\/*+-]*$/.test(v.remaining) == false) {\n return null; // it must contain only the operators +-*/^()\n }\n if (!((v.lengths['f'] == 0) && (v.lengths['v'] == 0))) {\n return null;\n }\n if (fn.test_evaluation(fn, v, v.sub) === null) {\n return null;\n }\n var n = fn.check_number(fn, value); // If it is a simple number, show a better format.\n return n !== null ? n : fn.replace_display_formula(fn, v, v.sub);\n },\n\n check_numeric_unit : function(fn, value) {\n var splitted = fn.split_formula_unit(fn, value);\n var n = fn.check_numeric(fn, splitted[0]);\n var u = fn.check_unit(fn, splitted[1]);\n if (n === null || u === null) {\n return null; // Both part must be correct simultaneously.\n }\n return n + ' ' + u;\n },\n\n check_numerical_formula : function(fn, value) {\n var v = fn.get_formula_information(fn, value);\n if (v === null) {\n return null;\n }\n if (/^[ )(^\\/*+-]*$/.test(v.remaining) == false) {\n return null; // It must contain only the operators +-*/^().\n }\n if (!((v.lengths['v'] == 0))) {\n return null;\n }\n if (fn.test_evaluation(fn, v, v.sub) === null) {\n return null;\n }\n var n = fn.check_number(fn, value); // If it is a simple number, show a better format.\n return n !== null ? n : fn.replace_display_formula(fn, v, v.sub);\n },\n\n check_numerical_formula_unit : function(fn, value) {\n var splitted = fn.split_formula_unit(fn, value);\n var n = fn.check_numerical_formula(fn, splitted[0]);\n var u = fn.check_unit(fn, splitted[1]);\n if (n === null || u === null) {\n return null; // Both part must be correct simultaneously.\n }\n return n + ' ' + u;\n },\n\n check_algebraic_formula : function(fn, value) {\n var v = fn.get_formula_information(fn, value);\n if (v === null) {\n return null;\n }\n if (/^[ )(^\\/*+-]*$/.test(v.remaining) == false) {\n return null; // It must only contain the +-*/^() operators.\n }\n // Replace all variables symbols by a number before the evaluation test.\n var variables = {}; // replace all variables in v.all by 1 and then attempt the evaluation.\n for (var key in v.all) {\n variables[key] = v.all[key]; // clone the v.all\n }\n for (var key in v.all) {\n if (v.all[key] !== null && v.all[key].type == 'v') {\n v.all[key] = {'type': 'n', 'value': \"1.\"};\n }\n }\n var result = fn.test_evaluation(fn, v, v.sub);\n for (var key in v.all) {\n v.all[key] = variables[key]; // Put the variables back, it will be used in the display formula.\n }\n if(result === null) {\n return result;\n }\n return fn.replace_display_formula(fn, v, v.sub);\n },\n\n check_editing_unit : function(fn, value) {\n var unit_lists = value.split('=');\n var correct = true;\n var formatted = [];\n for (var i=0; i<=~!|&%^\\/*+-])(([0-9]+\\.?[0-9]*|[0-9]*\\.?[0-9]+)([eE][-+]?[0-9]+)?)/.source;\n numPattern = new RegExp(numPattern.replaceAll(\"\\\\.\", regexp_decsep), \"g\");\n var splitted = text.replace(numPattern, '$1`$2`').split('`');\n\n // The length will always be odd, and the numbers are stored in odd index\n for (var i=1; i';\n }\n if (vstack.all[key].type=='n') {\n vstack.all[key].value = fn.format_number(vstack.all[key].value, true);\n }\n }\n }\n text = fn.substitute_placeholders_in_text(fn, vstack, text);\n\n // replace the pow(a,b) into the form superscript format: ab\n /* eslint-disable no-constant-condition */\n while (true){\n /* eslint-enable no-constant-condition */\n var loc = text.lastIndexOf('pow'); // from right to left\n if (loc < 0) {\n break;\n }\n var b = fn.get_expressions_in_bracket(text, loc+1, '(', {'(': ')'});\n var base = fn.trim(b.expressions[0]);\n if (base[0]!='(' && base.indexOf('(')>=0) {\n base = '('+base+')'; // probably a function, add brackets for less ambiguous\n }\n var expo = fn.trim(b.expressions[1]);\n if (expo[0]=='(' && expo[expo.length-1]==')') {\n expo = expo.substr(1,expo.length-2); // remove extra brackets\n }\n text = text.substr(0,loc) + base + '' + expo + '' + text.substr(b.closeloc+1);\n }\n return text;\n },\n\n // return the list of expression inside the open '(' and close ')' bracket, otherwise null\n get_expressions_in_bracket : function(text, start, open, bset) {\n var bflip = {};\n for (var b in bset) {\n bflip[bset[b]] = b;\n }\n var ostack = []; // stack of open bracket\n for (var i=start; i 0) {\n break; // when the first open bracket is found\n }\n }\n if (ostack.length == 0) {\n return null;\n }\n var firstopenloc = i;\n var expressions = [];\n var ploc = i+1;\n for (var i=ploc; i= 0) {\n if (no_divisor || pos == 0 || pos >= str.length-1) {\n return null;\n }\n var left = fn.trim(str.substr(0, pos));\n var right = fn.trim(str.substr(pos+1));\n if (right[0] == '(' && right[right.length-1] == ')') {\n right = right.substr(1, right.length-2);\n }\n var uleft = fn.parse_unit(fn, left, true);\n var uright = fn.parse_unit(fn, right, true);\n if (uleft === null || uright === null) {\n return null; // if either part contains error\n }\n var unit = uleft;\n var unit_set = {};\n for (var i=0; i 1 && (name.length == 0 || ex[1].length == 0)) {\n return null;\n }\n if (name.length == 0) {\n continue; // if it is an empty space\n }\n if (/^[^\\]\\[)(}{><0-9.,:;`~!@#^&*\\/?|_=+ -]+$/.test(name) == false) {\n return null; // it cannot contain some characters\n }\n var exponent = null;\n if (ex.length > 1) {\n var matches = /(.*)([0-9]+)(.*)/.exec(ex[1]);\n if (matches.length == 0) {\n return null; // the '^' must be followed by something, should it be matches == null???\n }\n if (matches[1] == '' && matches[3] == '') {\n exponent = parseInt(matches[2]);\n }\n if (matches[1] == '-' && matches[3] == '') {\n exponent = -parseInt(matches[2]);\n }\n if (matches[1] == '(-' && matches[3] == ')') {\n exponent = -parseInt(matches[2]);\n }\n if (exponent === null) {\n return null; // no one pattern matched\n }\n }\n else {\n exponent = 1;\n }\n if (name in unit_set) {\n return null;\n }\n unit.push([name, exponent]);\n unit_set[name] = exponent;\n }\n return unit;\n },\n\n // return the formatted number in scientific notation, if necessary\n format_number : function(number, is_original) {\n try {\n if (is_original === null) {\n is_original = false;\n }\n if (is_original) {\n if (/[eE]/.exec(number) === null) {\n return number;\n }\n var standardform = number;\n var symbol = '';\n }\n else {\n var value = parseFloat(number.replace(decimal_separator, '.'));\n var absnum = Math.abs(value);\n if (absnum == 0) {\n return number;\n }\n var loc = number.search(/[eE]/); // if there is e, always show the reformatted scientific notation\n var standardform = value.toExponential();\n var newvalue = parseFloat(standardform);\n standardform = standardform.replace('.', decimal_separator);\n var is_equal = value == newvalue;\n if (is_equal && loc == -1 && absnum >= Math.pow(10,-2) && absnum <= Math.pow(10,6)) {\n return number;\n }\n var symbol = ''; //is_equal ? ' ' : '\\u2248 '; // if they are not equal, show approx sign\n }\n var s = standardform.split(/[eE]/);\n var regexp = new RegExp(\"(\" + regexp_decsep + \")?0*$\");\n var decimal = s[0].replace(regexp,'');\n var exponent = (s[1][0] == '+' ? s[1].substr(1) : s[1][0] == '-' ? '\\u2212'+s[1].substr(1) : s[1]);\n var newform = decimal + (exponent == 0 ? '' : '\\u00D7'+'10'+exponent+'');\n return symbol + newform;\n }catch(e) { return ''; }\n },\n\n // return the formatted unit into a standard format\n format_unit : function(base_units) {\n try {\n var res = [];\n for (var i=0; i' + exponent + '');\n }\n return res.join('\\u00b7'); // · (middle dot), s^−2, ✗\n }catch(e) { return ''; }\n },\n\n // return the string with space trimmed\n trim : function(str) {\n return str.replace(/^\\s+|\\s+$/g, '');\n }\n };\n\n /**\n * Initialization: Append the display blocks around the input and the data in the input node.\n * @param {*} common\n * @param {*} types\n * @returns\n */\n function init(common, types) {\n var others = [];\n var count = 0;\n var inputs = document.getElementsByTagName('input');\n for (i=0; i') : '')\n +''\n +'';\n }\n document.body.insertBefore(warning, null);\n }\n\n var common = {};\n\n // Define a set of function that is used to manipulate the input\n common.fn = fn;\n\n // set the state to not ready\n common.ready = false;\n\n // check whether the javascript can produce the correct response\n common.testresult = unittest();\n common.pass = common.testresult.numcorrect == common.testresult.numcase;\n if (!common.pass) {\n signal_fail(common);\n }\n\n // get the set of\n common.others = init(common, types);\n\n // set the state to ready, now we can use the functions\n common.ready = true;\n\n // update the initial value\n for (var i=0; i {\n if(!document.readyState === 'complete') {\n document.addEventListener('DOMContentLoaded', () => {\n formulas_format_check(decimal_separator, inputtitle);\n });\n } else {\n formulas_format_check(decimal_separator, inputtitle);\n }\n};\n"],"names":["formulas_format_check","decimal_separator","inputtitle","regexp_decsep","use_format_check","show_hinting_type","show_interpretation","show_warning","unittest_fail_show_icon","unittest_fail_show_details","types","constlist","funclist","evalreplacelist","dispreplacelist","i","length","fn","stop","common","self","ready","pass","info","style","display","update","monitor","show_info","input","value","substr","cur_value","trim","last_value","answered","func","correct","warning","show_sign","interpretation","innerHTML","className","check_unit","base_units","parse_unit","e","format_unit","check_number","v","get_formula_information","test","sub","lengths","format_number","check_number_unit","splitted","split_formula_unit","n","u","check_numeric","remaining","test_evaluation","replace_display_formula","check_numeric_unit","check_numerical_formula","check_numerical_formula_unit","check_algebraic_formula","variables","key","all","type","result","check_editing_unit","unit_lists","split","formatted","push","join","vstack","formula","replace_vstack_variables","replaceAll","expr","replace_evaluation_formula","substitute_placeholders_in_text","res","eval","vstack_create","idcounter","vstack_get_variable","name","vstack_add_temporary_variable","text","replace","substitute_numbers_by_placeholders","numPattern","source","RegExp","substitute_functions_by_placeholders","substitute_constants_by_placeholders","preserve","constnumber","substitute_variables_by_placeholders","str","data","original","loc","search","num","unit","replacementlist","tmp","insert_multiplication_for_juxtaposition","op","replace_caret_by_power","lastIndexOf","oplen","rloc","r","get_next_variable","endloc","variable","rtmp","get_expressions_in_bracket","openloc","closeloc","lloc","l","get_previous_variable","startloc","reverse","ltmp","lfunc","left","right","b","base","expressions","indexOf","expo","start","open","bset","bflip","ostack","firstopenloc","ploc","pop","m","exec","no_divisor","pos","uleft","uright","unit_set","exponent","candidates","ex","matches","parseInt","number","is_original","standardform","symbol","parseFloat","absnum","Math","abs","newvalue","toExponential","pow","s","regexp","decimal","testresult","unittest","numcorrect","numcase","signal_fail","others","init","count","inputs","document","getElementsByTagName","classList","add","title","classify","which","show_type","warning_inner","createElement","src","M","util","image_url","appendChild","parentNode","insertBefore","nextSibling","info_inner","width","max","clientWidth","clientLeft","info_inner_title","info_inner_interpretation","formulas","onblur","this","onfocus","onkeyup","classes","j","parsingtestcases","failcases","tc","id","body","readyState","addEventListener"],"mappings":"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"} \ No newline at end of file diff --git a/script/formatcheck.js b/amd/src/formatcheck.js similarity index 65% rename from script/formatcheck.js rename to amd/src/formatcheck.js index 02671f12..a6594ef4 100644 --- a/script/formatcheck.js +++ b/amd/src/formatcheck.js @@ -16,19 +16,35 @@ /** * Check whether the format of input numbers, formulas and units are incorrect * - * @copyright © 2010-2011 Hon Wai, Lau + * @copyright © 2010-2011 Hon Wai, Lau; 2024 Jakob Heinemann * @author Hon Wai, Lau + * @author Jakob Heinemann * @license http://www.gnu.org/copyleft/gpl.html GNU Public License version 3 */ -// This function will be called to initialize the format check for input boxes, after the page is fully loaded. -function formulas_format_check() { - var use_format_check = true; // If it is set to false, no format check will be used and initialized. - var show_hinting_type = null; // Show the type hinting under the input box, such as 'Number', 'Unit'. null means use the individual setting in variable types below. - var show_interpretation = null; // Show the interpretation of the formula under the input box. null means use the individual setting in variable types below. - var show_warning = null; // Show the warning sign if the input is wrong/not interpretable. null means use the individual setting in variable types below. - var unittest_fail_show_icon = false; // Show an icon at the low right corner if the format check testing fails - var unittest_fail_show_details = false; // Show the detail test case that it fails. +/** + * This function will be called to initialize the format check for input boxes, after the page is fully loaded. + * @param {*} decimal_separator + * @param {*} inputtitle + * @return + */ +function formulas_format_check(decimal_separator, inputtitle) { + const regexp_decsep = decimal_separator == '.' ? '\.' : decimal_separator; + // If use_format_check is set to false, no format check will be used and initialized. + var use_format_check = true; + // Show the type hinting under the input box, such as 'Number', 'Unit'. + // null means use the individual setting in variable types below. + var show_hinting_type = null; + // Show the interpretation of the formula under the input box. + // null means use the individual setting in variable types below. + var show_interpretation = null; + // Show the warning sign if the input is wrong/not interpretable. + // null means use the individual setting in variable types below. + var show_warning = null; + // Show an icon at the low right corner if the format check testing fails + var unittest_fail_show_icon = false; + // Show the detail test case that it fails. + var unittest_fail_show_details = false; // The following variable can fine control the information for each type in addition to the variable defined above // So, if the type name is commented out here, the corresponding format checking will be disabled @@ -53,35 +69,51 @@ function formulas_format_check() { var funclist = {'sin': 1, 'cos': 1, 'tan': 1, 'asin': 1, 'acos': 1, 'atan': 1, 'exp': 1, 'log10': 1, 'ln': 1, 'sqrt': 1, 'abs': 1, 'ceil': 1, 'floor': 1, 'fact': 1}; - // The replacement list used when preform trial evaluation, note it is not the same as dispreplacelist - // Replace 'fact' (factorial) by 'abs', because JS does not have a factorial function and - // therefore, an expression containing fact() will always be considered as invalid. We use abs(), - // because we just need some replacement function and are not interested in the actual result. - var evalreplacelist = {'ln': 'log', 'log10': '(1./log(10.))*log', 'fact': 'abs'}; // Natural log and log with base 10, no log allowed to avoid ambiguity. + /** + * The replacement list used when preform trial evaluation, note it is not the same as dispreplacelist + * Replace 'fact' (factorial) by 'abs', because JS does not have a factorial function and + * therefore, an expression containing fact() will always be considered as invalid. We use abs(), + * because we just need some replacement function and are not interested in the actual result. + */ + + // Natural log and log with base 10, no log allowed to avoid ambiguity. + var evalreplacelist = {'ln': 'log', 'log10': '(1./log(10.))*log', 'fact': 'abs'}; // The replacement list used when the formula is displayed on the screen. var dispreplacelist = {'log10': 'log10', '3.14159265358979323846': 'π'}; // Perform the action specified by the above global variables. - if (!use_format_check) return; + if (!use_format_check) { + return; + } for (var i=0; i 128) self.input.value = self.input.value.substr(0,128); - if (!common.ready || !common.pass) return; + if (self.input.value.length > 128) { + self.input.value = self.input.value.substr(0,128); + } + if (!common.ready || !common.pass) { + return; + } self.cur_value = common.fn.trim(self.input.value); - if (self.last_value != null && self.last_value == self.cur_value) return; + if (self.last_value !== null && self.last_value == self.cur_value) { + return; + } self.last_value = self.cur_value; self.answered = self.input.value == '' ? false : true; // Call the corresponding function for this particular input box if the value is not empty. var info = self.answered ? common.fn[self.func](common.fn, self.cur_value) : ''; - self.correct = (info != null); // the function returns a string if correct, otherwise null - info = (info != null) ? common.fn.trim(info) : ''; + self.correct = (info !== null); // the function returns a string if correct, otherwise null + info = (info !== null) ? common.fn.trim(info) : ''; // Update the information shown on the screen. self.warning.style.display = (self.show_sign && self.answered && !self.correct) ? 'block' : 'none'; @@ -108,8 +146,10 @@ function formulas_format_check() { self.interpretation.style.display = (self.show_interpretation && self.cur_value != info) ? 'block' : 'none'; self.interpretation.className = 'formulas_input_info_interpretation'; } - else // Dim the text color and keep the background text unchanged, until the next correct. + else { + // Dim the text color and keep the background text unchanged, until the next correct. self.interpretation.className = 'formulas_input_info_interpretation_incorrect'; + } }, check_unit : function(fn, value) { @@ -117,15 +157,23 @@ function formulas_format_check() { try { base_units = fn.parse_unit(fn, value); } catch(e) {} - if (base_units == null) return null; + if (base_units === null) { + return null; + } return fn.format_unit(base_units); }, check_number : function(fn, value) { var v = fn.get_formula_information(fn, value); - if (v == null) return null; - if (/^[-+]?@0$/.test(v.sub) == false) return null; // It must be a positive number, with an optional '-' sign. - if (!((v.lengths['n'] == 1) && (v.lengths['f'] == 0) && (v.lengths['v'] == 0))) return null; + if (v === null) { + return null; + } + if (/^[-+]?@0$/.test(v.sub) == false) { + return null; // It must be a positive number, with an optional '-' sign. + } + if (!((v.lengths['n'] == 1) && (v.lengths['f'] == 0) && (v.lengths['v'] == 0))) { + return null; + } return fn.format_number(value); }, @@ -133,56 +181,93 @@ function formulas_format_check() { var splitted = fn.split_formula_unit(fn, value); var n = fn.check_number(fn, splitted[0]); var u = fn.check_unit(fn, splitted[1]); - if (n == null || u == null) return null; // both part must correct simultaneously + if (n === null || u === null) { + return null; // both part must correct simultaneously + } return n + ' ' + u; }, check_numeric : function(fn, value) { var v = fn.get_formula_information(fn, value); - if (v == null) return null; - if (/^[ )(^\/*+-]*$/.test(v.remaining) == false) return null; // it must contain only the operators +-*/^() - if (!((v.lengths['f'] == 0) && (v.lengths['v'] == 0))) return null; - if (fn.test_evaluation(fn, v, v.sub) == null) return null; + if (v === null) { + return null; + } + if (/^[ )(^\/*+-]*$/.test(v.remaining) == false) { + return null; // it must contain only the operators +-*/^() + } + if (!((v.lengths['f'] == 0) && (v.lengths['v'] == 0))) { + return null; + } + if (fn.test_evaluation(fn, v, v.sub) === null) { + return null; + } var n = fn.check_number(fn, value); // If it is a simple number, show a better format. - return n != null ? n : fn.replace_display_formula(fn, v, v.sub); + return n !== null ? n : fn.replace_display_formula(fn, v, v.sub); }, check_numeric_unit : function(fn, value) { var splitted = fn.split_formula_unit(fn, value); var n = fn.check_numeric(fn, splitted[0]); var u = fn.check_unit(fn, splitted[1]); - if (n == null || u == null) return null; // Both part must be correct simultaneously. + if (n === null || u === null) { + return null; // Both part must be correct simultaneously. + } return n + ' ' + u; }, check_numerical_formula : function(fn, value) { var v = fn.get_formula_information(fn, value); - if (v == null) return null; - if (/^[ )(^\/*+-]*$/.test(v.remaining) == false) return null; // It must contain only the operators +-*/^(). - if (!((v.lengths['v'] == 0))) return null; - if (fn.test_evaluation(fn, v, v.sub) == null) return null; + if (v === null) { + return null; + } + if (/^[ )(^\/*+-]*$/.test(v.remaining) == false) { + return null; // It must contain only the operators +-*/^(). + } + if (!((v.lengths['v'] == 0))) { + return null; + } + if (fn.test_evaluation(fn, v, v.sub) === null) { + return null; + } var n = fn.check_number(fn, value); // If it is a simple number, show a better format. - return n != null ? n : fn.replace_display_formula(fn, v, v.sub); + return n !== null ? n : fn.replace_display_formula(fn, v, v.sub); }, check_numerical_formula_unit : function(fn, value) { var splitted = fn.split_formula_unit(fn, value); var n = fn.check_numerical_formula(fn, splitted[0]); var u = fn.check_unit(fn, splitted[1]); - if (n == null || u == null) return null; // Both part must be correct simultaneously. + if (n === null || u === null) { + return null; // Both part must be correct simultaneously. + } return n + ' ' + u; }, check_algebraic_formula : function(fn, value) { var v = fn.get_formula_information(fn, value); - if (v == null) return null; - if (/^[ )(^\/*+-]*$/.test(v.remaining) == false) return null; // It must only contain the +-*/^() operators. + if (v === null) { + return null; + } + if (/^[ )(^\/*+-]*$/.test(v.remaining) == false) { + return null; // It must only contain the +-*/^() operators. + } // Replace all variables symbols by a number before the evaluation test. var variables = {}; // replace all variables in v.all by 1 and then attempt the evaluation. - for (var key in v.all) variables[key] = v.all[key]; // clone the v.all - for (var key in v.all) if (v.all[key]!=null && v.all[key].type=='v') v.all[key] = {'type': 'n', 'value': 1.}; - if (fn.test_evaluation(fn, v, v.sub) == null) return null; - for (var key in v.all) v.all[key] = variables[key]; // Put the variables back, it will be used in the display formula. + for (var key in v.all) { + variables[key] = v.all[key]; // clone the v.all + } + for (var key in v.all) { + if (v.all[key] !== null && v.all[key].type == 'v') { + v.all[key] = {'type': 'n', 'value': "1."}; + } + } + var result = fn.test_evaluation(fn, v, v.sub); + for (var key in v.all) { + v.all[key] = variables[key]; // Put the variables back, it will be used in the display formula. + } + if(result === null) { + return result; + } return fn.replace_display_formula(fn, v, v.sub); }, @@ -190,12 +275,14 @@ function formulas_format_check() { var unit_lists = value.split('='); var correct = true; var formatted = []; - for (var i=0; i<=~!|&%^\/*+-])(([0-9]+\.?[0-9]*|[0-9]*\.?[0-9]+)([eE][-+]?[0-9]+)?)/g; + var numPattern = /(^|[\]\[)(}, ?:><=~!|&%^\/*+-])(([0-9]+\.?[0-9]*|[0-9]*\.?[0-9]+)([eE][-+]?[0-9]+)?)/.source; + numPattern = new RegExp(numPattern.replaceAll("\\.", regexp_decsep), "g"); var splitted = text.replace(numPattern, '$1`$2`').split('`'); - for (var i=1; i'; - if (vstack.all[key].type=='n') vstack.all[key].value = fn.format_number(vstack.all[key].value, true); + for (var key in vstack.all) { + if (vstack.all[key] !== null) { + if (vstack.all[key].type=='v') { + vstack.all[key].value = ''+vstack.all[key].value+''; + } + if (vstack.all[key].type=='n') { + vstack.all[key].value = fn.format_number(vstack.all[key].value, true); + } + } } text = fn.substitute_placeholders_in_text(fn, vstack, text); // replace the pow(a,b) into the form superscript format: ab + /* eslint-disable no-constant-condition */ while (true){ + /* eslint-enable no-constant-condition */ var loc = text.lastIndexOf('pow'); // from right to left - if (loc < 0) break; + if (loc < 0) { + break; + } var b = fn.get_expressions_in_bracket(text, loc+1, '(', {'(': ')'}); var base = fn.trim(b.expressions[0]); - if (base[0]!='(' && base.indexOf('(')>=0) base = '('+base+')'; // probably a function, add brackets for less ambiguous + if (base[0]!='(' && base.indexOf('(')>=0) { + base = '('+base+')'; // probably a function, add brackets for less ambiguous + } var expo = fn.trim(b.expressions[1]); - if (expo[0]=='(' && expo[expo.length-1]==')') expo = expo.substr(1,expo.length-2); // remove extra brackets + if (expo[0]=='(' && expo[expo.length-1]==')') { + expo = expo.substr(1,expo.length-2); // remove extra brackets + } text = text.substr(0,loc) + base + '' + expo + '' + text.substr(b.closeloc+1); } return text; @@ -435,23 +590,37 @@ function formulas_format_check() { // return the list of expression inside the open '(' and close ')' bracket, otherwise null get_expressions_in_bracket : function(text, start, open, bset) { var bflip = {}; - for (var b in bset) bflip[bset[b]] = b; + for (var b in bset) { + bflip[bset[b]] = b; + } var ostack = []; // stack of open bracket for (var i=start; i 0) break; // when the first open bracket is found + if (text[i] == open) { + ostack.push(open); + } + if (ostack.length > 0) { + break; // when the first open bracket is found + } + } + if (ostack.length == 0) { + return null; } - if (ostack.length == 0) { return null; } var firstopenloc = i; var expressions = []; var ploc = i+1; for (var i=ploc; i= 0) { - if (no_divisor!=null || pos==0 || pos>=str.length-1) return null; - //alert([no_divisor,no_divisor!=null || pos==0 || pos>=str.length-1, no_divisor!=null, pos==0 || pos>=str.length-1]); + if (no_divisor || pos == 0 || pos >= str.length-1) { + return null; + } var left = fn.trim(str.substr(0, pos)); var right = fn.trim(str.substr(pos+1)); - if (right[0] == '(' && right[right.length-1] == ')') right = right.substr(1, right.length-2); + if (right[0] == '(' && right[right.length-1] == ')') { + right = right.substr(1, right.length-2); + } var uleft = fn.parse_unit(fn, left, true); var uright = fn.parse_unit(fn, right, true); - if (uleft==null || uright==null) return null; // if either part contains error + if (uleft === null || uright === null) { + return null; // if either part contains error + } var unit = uleft; var unit_set = {}; - for (var i=0; i 1 && (name.length == 0 || ex[1].length == 0)) return null; - if (name.length == 0) continue; // if it is an empty space - if (/^[^\]\[)(}{><0-9.,:;`~!@#^&*\/?|_=+ -]+$/.test(name) == false) return null; // it cannot contain some characters + if (ex.length > 1 && (name.length == 0 || ex[1].length == 0)) { + return null; + } + if (name.length == 0) { + continue; // if it is an empty space + } + if (/^[^\]\[)(}{><0-9.,:;`~!@#^&*\/?|_=+ -]+$/.test(name) == false) { + return null; // it cannot contain some characters + } var exponent = null; if (ex.length > 1) { var matches = /(.*)([0-9]+)(.*)/.exec(ex[1]); - if (matches.length == 0) return null; // the '^' must be followed by something, should it be matches == null??? - if (matches[1] == '' && matches[3] == '') exponent = parseInt(matches[2]); - if (matches[1] == '-' && matches[3] == '') exponent = -parseInt(matches[2]); - if (matches[1] == '(-' && matches[3] == ')') exponent = -parseInt(matches[2]); - if (exponent == null) return null; // no one pattern matched + if (matches.length == 0) { + return null; // the '^' must be followed by something, should it be matches == null??? + } + if (matches[1] == '' && matches[3] == '') { + exponent = parseInt(matches[2]); + } + if (matches[1] == '-' && matches[3] == '') { + exponent = -parseInt(matches[2]); + } + if (matches[1] == '(-' && matches[3] == ')') { + exponent = -parseInt(matches[2]); + } + if (exponent === null) { + return null; // no one pattern matched + } } - else + else { exponent = 1; - if (name in unit_set) return null; + } + if (name in unit_set) { + return null; + } unit.push([name, exponent]); unit_set[name] = exponent; } @@ -535,31 +741,40 @@ function formulas_format_check() { // return the formatted number in scientific notation, if necessary format_number : function(number, is_original) { - try { - if (is_original == null) is_original = false; - if (is_original) { - if (/[eE]/.exec(number) == null) return number; - var standardform = number; - var symbol = ''; - } - else { - var value = parseFloat(number); - var absnum = Math.abs(value); - if (absnum == 0) return number; - var loc = number.search(/[eE]/); // if there is e, always show the reformatted scientific notation - var standardform = value.toExponential(); - var newvalue = parseFloat(standardform); - var is_equal = value == newvalue; - if (is_equal && loc == -1 && absnum >= Math.pow(10.,-2) && absnum <= Math.pow(10.,6)) - return number; - var symbol = ''; //is_equal ? ' ' : '\u2248 '; // if they are not equal, show approx sign - } - var s = standardform.split(/[eE]/); - var decimal = s[0].replace(/(\.)?0*$/,''); - var exponent = (s[1][0] == '+' ? s[1].substr(1) : s[1][0] == '-' ? '\u2212'+s[1].substr(1) : s[1]); - var newform = decimal + (exponent == 0 ? '' : '\u00D7'+'10'+exponent+''); - return symbol + newform; - }catch(e) { return ''; } + try { + if (is_original === null) { + is_original = false; + } + if (is_original) { + if (/[eE]/.exec(number) === null) { + return number; + } + var standardform = number; + var symbol = ''; + } + else { + var value = parseFloat(number.replace(decimal_separator, '.')); + var absnum = Math.abs(value); + if (absnum == 0) { + return number; + } + var loc = number.search(/[eE]/); // if there is e, always show the reformatted scientific notation + var standardform = value.toExponential(); + var newvalue = parseFloat(standardform); + standardform = standardform.replace('.', decimal_separator); + var is_equal = value == newvalue; + if (is_equal && loc == -1 && absnum >= Math.pow(10,-2) && absnum <= Math.pow(10,6)) { + return number; + } + var symbol = ''; //is_equal ? ' ' : '\u2248 '; // if they are not equal, show approx sign + } + var s = standardform.split(/[eE]/); + var regexp = new RegExp("(" + regexp_decsep + ")?0*$"); + var decimal = s[0].replace(regexp,''); + var exponent = (s[1][0] == '+' ? s[1].substr(1) : s[1][0] == '-' ? '\u2212'+s[1].substr(1) : s[1]); + var newform = decimal + (exponent == 0 ? '' : '\u00D7'+'10'+exponent+''); + return symbol + newform; + }catch(e) { return ''; } }, // return the formatted unit into a standard format @@ -580,23 +795,32 @@ function formulas_format_check() { } }; - // Initialization: Append the display blocks around the input and the data in the input node. + /** + * Initialization: Append the display blocks around the input and the data in the input node. + * @param {*} common + * @param {*} types + * @returns + */ function init(common, types) { var others = []; var count = 0; var inputs = document.getElementsByTagName('input'); - for (i=0; i') : '') - +'' + +'' +''; } document.body.insertBefore(warning, null); @@ -931,7 +1174,9 @@ function formulas_format_check() { // check whether the javascript can produce the correct response common.testresult = unittest(); common.pass = common.testresult.numcorrect == common.testresult.numcase; - if (!common.pass) signal_fail(common); + if (!common.pass) { + signal_fail(common); + } // get the set of common.others = init(common, types); @@ -940,15 +1185,19 @@ function formulas_format_check() { common.ready = true; // update the initial value - for (var i=0; i { + if(!document.readyState === 'complete') { + document.addEventListener('DOMContentLoaded', () => { + formulas_format_check(decimal_separator, inputtitle); + }); } else { - return newfunc; + formulas_format_check(decimal_separator, inputtitle); } -})(window.onload, function() { formulas_format_check(); }); +}; diff --git a/edit_formulas_form.php b/edit_formulas_form.php index 8a477438..3e52066a 100644 --- a/edit_formulas_form.php +++ b/edit_formulas_form.php @@ -43,11 +43,9 @@ protected function definition_inner($mform) { global $PAGE; $config = get_config('qtype_formulas'); $PAGE->requires->js_call_amd('qtype_formulas/editform', 'init', [get_config('qtype_formulas')->defaultcorrectness]); - $PAGE->requires->js('/question/type/formulas/script/formatcheck.js'); + $PAGE->requires->js_call_amd('qtype_formulas/formatcheck', 'init', [get_string('decsep', 'langconfig'), get_string('unit', 'qtype_formulas')]); $PAGE->requires->css('/question/type/formulas/styles.css'); $PAGE->requires->css('/question/type/formulas/tabulator.css'); - // Legacy, needed until formatcheck.js is refactored. - $PAGE->requires->string_for_js('unit', 'qtype_formulas'); // Hide the unused form fields. $mform->removeElement('defaultmark'); $mform->addElement('hidden', 'defaultmark'); diff --git a/renderer.php b/renderer.php index 5386f931..30833c06 100644 --- a/renderer.php +++ b/renderer.php @@ -31,6 +31,11 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class qtype_formulas_renderer extends qtype_with_combined_feedback_renderer { + + // there currently is an error in Moodle in mod/quiz/attempt.php (line 130and 139) + // to call this twice, so check this + static $headerjsadded = false; + /** * Generate the display of the formulation part of the question. This is the * area that contains the question text, and the controls for students to @@ -88,7 +93,12 @@ public function formulation_and_controls(question_attempt $qa, } public function head_code(question_attempt $qa) { - $this->page->requires->js('/question/type/formulas/script/formatcheck.js'); + // there currently is an error in Moodle in mod/quiz/attempt.php (line 130and 139) + // to call this twice, so check this + if(!self::$headerjsadded) { + $this->page->requires->js_call_amd('qtype_formulas/formatcheck', 'init', [get_string('decsep', 'langconfig'), get_string('unit', 'qtype_formulas')]); + self::$headerjsadded = true; + } } // Return the part text, controls, grading details and feedbacks. From 2d9c252714006785d5b0bd3aaf18d596001c838a Mon Sep 17 00:00:00 2001 From: Jakob Heinemann Date: Wed, 26 Mar 2025 13:51:07 +0100 Subject: [PATCH 2/4] handle decimal separator --- question.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/question.php b/question.php index 22e66c62..0fc0ffdf 100644 --- a/question.php +++ b/question.php @@ -206,6 +206,13 @@ public function apply_attempt_state(question_attempt_step $step) { */ public function formulas_format_text($vars, $text, $format, $qa, $component, $filearea, $itemid, $clean = false) { + $vars = clone $vars; + foreach($vars->all as $key => $var) { + if($var->type == 'n') { + $vars->all[$key] = clone $var; + $vars->all[$key]->value = str_replace('.', get_string('decsep', 'langconfig'), $var->value); + } + } return $this->format_text($this->qv->substitute_variables_in_text($vars, $text), $format, $qa, $component, $filearea, $itemid, $clean); } @@ -639,6 +646,7 @@ public function compute_response_difference(&$vars, &$a, &$r, $cfactor, $grading if (!$res->is_number) { // Unit has no meaning for algebraic format, so do nothing for it. $res->diff = $this->qv->compute_algebraic_formula_difference($vars, $a, $r); } else { + $r = str_replace(get_string('decsep', 'langconfig'), '.', $r); $res->diff = $this->qv->compute_numerical_formula_difference($a, $r, $cfactor, $gradingtype); } } catch (Exception $e) { // @codingStandardsIgnoreLine From 5693af01f4ec938ebbcf9401279ae885ce39fdd3 Mon Sep 17 00:00:00 2001 From: Jakob Heinemann Date: Thu, 27 Mar 2025 10:25:04 +0100 Subject: [PATCH 3/4] correct quotes --- amd/build/formatcheck.min.js | 2 +- amd/build/formatcheck.min.js.map | 2 +- amd/src/formatcheck.js | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/amd/build/formatcheck.min.js b/amd/build/formatcheck.min.js index 1386364a..bb45163f 100644 --- a/amd/build/formatcheck.min.js +++ b/amd/build/formatcheck.min.js @@ -7,6 +7,6 @@ define("qtype_formulas/formatcheck",["exports"],(function(_exports){ * @author Jakob Heinemann * @license http://www.gnu.org/copyleft/gpl.html GNU Public License version 3 */ -function formulas_format_check(decimal_separator,inputtitle){const regexp_decsep="."==decimal_separator?".":decimal_separator;var use_format_check=!0,show_hinting_type=null,show_interpretation=null,show_warning=null,unittest_fail_show_icon=!1,unittest_fail_show_details=!1,types=[["unit",!0,!0,!0],["number",!0,!0,!0],["number_unit",!0,!0,!0],["numeric",!0,!0,!0],["numeric_unit",!0,!0,!0],["numerical_formula",!0,!0,!0],["numerical_formula_unit",!0,!0,!0],["algebraic_formula",!0,!0,!0],["editing_unit",!0,!0,!0]],constlist={pi:"3.14159265358979323846"},funclist={sin:1,cos:1,tan:1,asin:1,acos:1,atan:1,exp:1,log10:1,ln:1,sqrt:1,abs:1,ceil:1,floor:1,fact:1},evalreplacelist={ln:"log",log10:"(1./log(10.))*log",fact:"abs"},dispreplacelist={log10:"log10","3.14159265358979323846":"π"};if(use_format_check){for(var i=0;i128&&(self.input.value=self.input.value.substr(0,128)),common.ready&&common.pass&&(self.cur_value=common.fn.trim(self.input.value),null===self.last_value||self.last_value!=self.cur_value)){self.last_value=self.cur_value,self.answered=""!=self.input.value;var info=self.answered?common.fn[self.func](common.fn,self.cur_value):"";self.correct=null!==info,info=null!==info?common.fn.trim(info):"",self.warning.style.display=self.show_sign&&self.answered&&!self.correct?"block":"none",self.correct?(self.interpretation.innerHTML=info,self.interpretation.style.display=self.show_interpretation&&self.cur_value!=info?"block":"none",self.interpretation.className="formulas_input_info_interpretation"):self.interpretation.className="formulas_input_info_interpretation_incorrect"}},check_unit:function(fn,value){var base_units=null;try{base_units=fn.parse_unit(fn,value)}catch(e){}return null===base_units?null:fn.format_unit(base_units)},check_number:function(fn,value){var v=fn.get_formula_information(fn,value);return null===v||0==/^[-+]?@0$/.test(v.sub)||1!=v.lengths.n||0!=v.lengths.f||0!=v.lengths.v?null:fn.format_number(value)},check_number_unit:function(fn,value){var splitted=fn.split_formula_unit(fn,value),n=fn.check_number(fn,splitted[0]),u=fn.check_unit(fn,splitted[1]);return null===n||null===u?null:n+" "+u},check_numeric:function(fn,value){var v=fn.get_formula_information(fn,value);if(null===v)return null;if(0==/^[ )(^\/*+-]*$/.test(v.remaining))return null;if(0!=v.lengths.f||0!=v.lengths.v)return null;if(null===fn.test_evaluation(fn,v,v.sub))return null;var n=fn.check_number(fn,value);return null!==n?n:fn.replace_display_formula(fn,v,v.sub)},check_numeric_unit:function(fn,value){var splitted=fn.split_formula_unit(fn,value),n=fn.check_numeric(fn,splitted[0]),u=fn.check_unit(fn,splitted[1]);return null===n||null===u?null:n+" "+u},check_numerical_formula:function(fn,value){var v=fn.get_formula_information(fn,value);if(null===v)return null;if(0==/^[ )(^\/*+-]*$/.test(v.remaining))return null;if(0!=v.lengths.v)return null;if(null===fn.test_evaluation(fn,v,v.sub))return null;var n=fn.check_number(fn,value);return null!==n?n:fn.replace_display_formula(fn,v,v.sub)},check_numerical_formula_unit:function(fn,value){var splitted=fn.split_formula_unit(fn,value),n=fn.check_numerical_formula(fn,splitted[0]),u=fn.check_unit(fn,splitted[1]);return null===n||null===u?null:n+" "+u},check_algebraic_formula:function(fn,value){var v=fn.get_formula_information(fn,value);if(null===v)return null;if(0==/^[ )(^\/*+-]*$/.test(v.remaining))return null;var variables={};for(var key in v.all)variables[key]=v.all[key];for(var key in v.all)null!==v.all[key]&&"v"==v.all[key].type&&(v.all[key]={type:"n",value:"1."});var result=fn.test_evaluation(fn,v,v.sub);for(var key in v.all)v.all[key]=variables[key];return null===result?result:fn.replace_display_formula(fn,v,v.sub)},check_editing_unit:function(fn,value){for(var unit_lists=value.split("="),correct=!0,formatted=[],i=0;i<=~!|&%^\/*+-])(([0-9]+\.?[0-9]*|[0-9]*\.?[0-9]+)([eE][-+]?[0-9]+)?)/.source;numPattern=new RegExp(numPattern.replaceAll("\\.",regexp_decsep),"g");for(var splitted=text.replace(numPattern,"$1`$2`").split("`"),i=1;i"+vstack.all[key].value+""),"n"==vstack.all[key].type&&(vstack.all[key].value=fn.format_number(vstack.all[key].value,!0)));for(text=fn.substitute_placeholders_in_text(fn,vstack,text);;){var loc=text.lastIndexOf("pow");if(loc<0)break;var b=fn.get_expressions_in_bracket(text,loc+1,"(",{"(":")"}),base=fn.trim(b.expressions[0]);"("!=base[0]&&base.indexOf("(")>=0&&(base="("+base+")");var expo=fn.trim(b.expressions[1]);"("==expo[0]&&")"==expo[expo.length-1]&&(expo=expo.substr(1,expo.length-2)),text=text.substr(0,loc)+base+""+expo+""+text.substr(b.closeloc+1)}return text},get_expressions_in_bracket:function(text,start,open,bset){var bflip={};for(var b in bset)bflip[bset[b]]=b;for(var ostack=[],i=start;i0));i++);if(0==ostack.length)return null;var firstopenloc=i,expressions=[],ploc=i+1;for(i=ploc;i=0){if(no_divisor||0==pos||pos>=str.length-1)return null;var left=fn.trim(str.substr(0,pos)),right=fn.trim(str.substr(pos+1));"("==right[0]&&")"==right[right.length-1]&&(right=right.substr(1,right.length-2));var uleft=fn.parse_unit(fn,left,!0),uright=fn.parse_unit(fn,right,!0);if(null===uleft||null===uright)return null;for(var unit=uleft,unit_set={},i=0;i1&&(0==name.length||0==ex[1].length))return null;if(0!=name.length){if(0==/^[^\]\[)(}{><0-9.,:;`~!@#^&*\/?|_=+ -]+$/.test(name))return null;exponent=null;if(ex.length>1){var matches=/(.*)([0-9]+)(.*)/.exec(ex[1]);if(0==matches.length)return null;if(""==matches[1]&&""==matches[3]&&(exponent=parseInt(matches[2])),"-"==matches[1]&&""==matches[3]&&(exponent=-parseInt(matches[2])),"(-"==matches[1]&&")"==matches[3]&&(exponent=-parseInt(matches[2])),null===exponent)return null}else exponent=1;if(name in unit_set)return null;unit.push([name,exponent]),unit_set[name]=exponent}}return unit},format_number:function(number,is_original){try{if(null===is_original&&(is_original=!1),is_original){if(null===/[eE]/.exec(number))return number;var standardform=number,symbol=""}else{var value=parseFloat(number.replace(decimal_separator,".")),absnum=Math.abs(value);if(0==absnum)return number;var loc=number.search(/[eE]/),newvalue=(standardform=value.toExponential(),parseFloat(standardform));if(standardform=standardform.replace(".",decimal_separator),value==newvalue&&-1==loc&&absnum>=Math.pow(10,-2)&&absnum<=Math.pow(10,6))return number;symbol=""}var s=standardform.split(/[eE]/),regexp=new RegExp("("+regexp_decsep+")?0*$"),decimal=s[0].replace(regexp,""),exponent="+"==s[1][0]?s[1].substr(1):"-"==s[1][0]?"−"+s[1].substr(1):s[1];return symbol+(decimal+(0==exponent?"":"×10"+exponent+""))}catch(e){return""}},format_unit:function(base_units){try{for(var res=[],i=0;i"+exponent+"")}return res.join("·")}catch(e){return""}},trim:function(str){return str.replace(/^\s+|\s+$/g,"")}},common={};common.fn=fn,common.ready=!1,common.testresult=unittest(),common.pass=common.testresult.numcorrect==common.testresult.numcase,common.pass||signal_fail(common),common.others=init(common,types),common.ready=!0;for(var i=0;i'+(unittest_fail_show_details?common.testresult.failcases.join("
"):"")+''),document.body.insertBefore(warning,null)}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0;const init=(decimal_separator,inputtitle)=>{"complete"===!document.readyState?document.addEventListener("DOMContentLoaded",(()=>{formulas_format_check(decimal_separator,inputtitle)})):formulas_format_check(decimal_separator,inputtitle)};_exports.init=init})); +function formulas_format_check(decimal_separator,inputtitle){const regexp_decsep="."==decimal_separator?"\\.":decimal_separator;var use_format_check=!0,show_hinting_type=null,show_interpretation=null,show_warning=null,unittest_fail_show_icon=!1,unittest_fail_show_details=!1,types=[["unit",!0,!0,!0],["number",!0,!0,!0],["number_unit",!0,!0,!0],["numeric",!0,!0,!0],["numeric_unit",!0,!0,!0],["numerical_formula",!0,!0,!0],["numerical_formula_unit",!0,!0,!0],["algebraic_formula",!0,!0,!0],["editing_unit",!0,!0,!0]],constlist={pi:"3.14159265358979323846"},funclist={sin:1,cos:1,tan:1,asin:1,acos:1,atan:1,exp:1,log10:1,ln:1,sqrt:1,abs:1,ceil:1,floor:1,fact:1},evalreplacelist={ln:"log",log10:"(1./log(10.))*log",fact:"abs"},dispreplacelist={log10:"log10","3.14159265358979323846":"π"};if(use_format_check){for(var i=0;i128&&(self.input.value=self.input.value.substr(0,128)),common.ready&&common.pass&&(self.cur_value=common.fn.trim(self.input.value),null===self.last_value||self.last_value!=self.cur_value)){self.last_value=self.cur_value,self.answered=""!=self.input.value;var info=self.answered?common.fn[self.func](common.fn,self.cur_value):"";self.correct=null!==info,info=null!==info?common.fn.trim(info):"",self.warning.style.display=self.show_sign&&self.answered&&!self.correct?"block":"none",self.correct?(self.interpretation.innerHTML=info,self.interpretation.style.display=self.show_interpretation&&self.cur_value!=info?"block":"none",self.interpretation.className="formulas_input_info_interpretation"):self.interpretation.className="formulas_input_info_interpretation_incorrect"}},check_unit:function(fn,value){var base_units=null;try{base_units=fn.parse_unit(fn,value)}catch(e){}return null===base_units?null:fn.format_unit(base_units)},check_number:function(fn,value){var v=fn.get_formula_information(fn,value);return null===v||0==/^[-+]?@0$/.test(v.sub)||1!=v.lengths.n||0!=v.lengths.f||0!=v.lengths.v?null:fn.format_number(value)},check_number_unit:function(fn,value){var splitted=fn.split_formula_unit(fn,value),n=fn.check_number(fn,splitted[0]),u=fn.check_unit(fn,splitted[1]);return null===n||null===u?null:n+" "+u},check_numeric:function(fn,value){var v=fn.get_formula_information(fn,value);if(null===v)return null;if(0==/^[ )(^\/*+-]*$/.test(v.remaining))return null;if(0!=v.lengths.f||0!=v.lengths.v)return null;if(null===fn.test_evaluation(fn,v,v.sub))return null;var n=fn.check_number(fn,value);return null!==n?n:fn.replace_display_formula(fn,v,v.sub)},check_numeric_unit:function(fn,value){var splitted=fn.split_formula_unit(fn,value),n=fn.check_numeric(fn,splitted[0]),u=fn.check_unit(fn,splitted[1]);return null===n||null===u?null:n+" "+u},check_numerical_formula:function(fn,value){var v=fn.get_formula_information(fn,value);if(null===v)return null;if(0==/^[ )(^\/*+-]*$/.test(v.remaining))return null;if(0!=v.lengths.v)return null;if(null===fn.test_evaluation(fn,v,v.sub))return null;var n=fn.check_number(fn,value);return null!==n?n:fn.replace_display_formula(fn,v,v.sub)},check_numerical_formula_unit:function(fn,value){var splitted=fn.split_formula_unit(fn,value),n=fn.check_numerical_formula(fn,splitted[0]),u=fn.check_unit(fn,splitted[1]);return null===n||null===u?null:n+" "+u},check_algebraic_formula:function(fn,value){var v=fn.get_formula_information(fn,value);if(null===v)return null;if(0==/^[ )(^\/*+-]*$/.test(v.remaining))return null;var variables={};for(var key in v.all)variables[key]=v.all[key];for(var key in v.all)null!==v.all[key]&&"v"==v.all[key].type&&(v.all[key]={type:"n",value:"1."});var result=fn.test_evaluation(fn,v,v.sub);for(var key in v.all)v.all[key]=variables[key];return null===result?result:fn.replace_display_formula(fn,v,v.sub)},check_editing_unit:function(fn,value){for(var unit_lists=value.split("="),correct=!0,formatted=[],i=0;i<=~!|&%^\/*+-])(([0-9]+\.?[0-9]*|[0-9]*\.?[0-9]+)([eE][-+]?[0-9]+)?)/.source;numPattern=new RegExp(numPattern.replaceAll("\\.",regexp_decsep),"g");for(var splitted=text.replace(numPattern,"$1`$2`").split("`"),i=1;i"+vstack.all[key].value+""),"n"==vstack.all[key].type&&(vstack.all[key].value=fn.format_number(vstack.all[key].value,!0)));for(text=fn.substitute_placeholders_in_text(fn,vstack,text);;){var loc=text.lastIndexOf("pow");if(loc<0)break;var b=fn.get_expressions_in_bracket(text,loc+1,"(",{"(":")"}),base=fn.trim(b.expressions[0]);"("!=base[0]&&base.indexOf("(")>=0&&(base="("+base+")");var expo=fn.trim(b.expressions[1]);"("==expo[0]&&")"==expo[expo.length-1]&&(expo=expo.substr(1,expo.length-2)),text=text.substr(0,loc)+base+""+expo+""+text.substr(b.closeloc+1)}return text},get_expressions_in_bracket:function(text,start,open,bset){var bflip={};for(var b in bset)bflip[bset[b]]=b;for(var ostack=[],i=start;i0));i++);if(0==ostack.length)return null;var firstopenloc=i,expressions=[],ploc=i+1;for(i=ploc;i=0){if(no_divisor||0==pos||pos>=str.length-1)return null;var left=fn.trim(str.substr(0,pos)),right=fn.trim(str.substr(pos+1));"("==right[0]&&")"==right[right.length-1]&&(right=right.substr(1,right.length-2));var uleft=fn.parse_unit(fn,left,!0),uright=fn.parse_unit(fn,right,!0);if(null===uleft||null===uright)return null;for(var unit=uleft,unit_set={},i=0;i1&&(0==name.length||0==ex[1].length))return null;if(0!=name.length){if(0==/^[^\]\[)(}{><0-9.,:;`~!@#^&*\/?|_=+ -]+$/.test(name))return null;exponent=null;if(ex.length>1){var matches=/(.*)([0-9]+)(.*)/.exec(ex[1]);if(0==matches.length)return null;if(""==matches[1]&&""==matches[3]&&(exponent=parseInt(matches[2])),"-"==matches[1]&&""==matches[3]&&(exponent=-parseInt(matches[2])),"(-"==matches[1]&&")"==matches[3]&&(exponent=-parseInt(matches[2])),null===exponent)return null}else exponent=1;if(name in unit_set)return null;unit.push([name,exponent]),unit_set[name]=exponent}}return unit},format_number:function(number,is_original){try{if(null===is_original&&(is_original=!1),is_original){if(null===/[eE]/.exec(number))return number;var standardform=number,symbol=""}else{var value=parseFloat(number.replace(decimal_separator,".")),absnum=Math.abs(value);if(0==absnum)return number;var loc=number.search(/[eE]/),newvalue=(standardform=value.toExponential(),parseFloat(standardform));if(standardform=standardform.replace(".",decimal_separator),value==newvalue&&-1==loc&&absnum>=Math.pow(10,-2)&&absnum<=Math.pow(10,6))return number;symbol=""}var s=standardform.split(/[eE]/),regexp=new RegExp("("+regexp_decsep+")?0*$"),decimal=s[0].replace(regexp,""),exponent="+"==s[1][0]?s[1].substr(1):"-"==s[1][0]?"−"+s[1].substr(1):s[1];return symbol+(decimal+(0==exponent?"":"×10"+exponent+""))}catch(e){return""}},format_unit:function(base_units){try{for(var res=[],i=0;i"+exponent+"")}return res.join("·")}catch(e){return""}},trim:function(str){return str.replace(/^\s+|\s+$/g,"")}},common={};common.fn=fn,common.ready=!1,common.testresult=unittest(),common.pass=common.testresult.numcorrect==common.testresult.numcase,common.pass||signal_fail(common),common.others=init(common,types),common.ready=!0;for(var i=0;i'+(unittest_fail_show_details?common.testresult.failcases.join("
"):"")+''),document.body.insertBefore(warning,null)}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0;const init=(decimal_separator,inputtitle)=>{"complete"===!document.readyState?document.addEventListener("DOMContentLoaded",(()=>{formulas_format_check(decimal_separator,inputtitle)})):formulas_format_check(decimal_separator,inputtitle)};_exports.init=init})); //# sourceMappingURL=formatcheck.min.js.map \ No newline at end of file diff --git a/amd/build/formatcheck.min.js.map b/amd/build/formatcheck.min.js.map index 84e0f406..4aa536c6 100644 --- a/amd/build/formatcheck.min.js.map +++ b/amd/build/formatcheck.min.js.map @@ -1 +1 @@ -{"version":3,"file":"formatcheck.min.js","sources":["../src/formatcheck.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Check whether the format of input numbers, formulas and units are incorrect\n *\n * @copyright © 2010-2011 Hon Wai, Lau; 2024 Jakob Heinemann\n * @author Hon Wai, Lau \n * @author Jakob Heinemann \n * @license http://www.gnu.org/copyleft/gpl.html GNU Public License version 3\n */\n\n/**\n * This function will be called to initialize the format check for input boxes, after the page is fully loaded.\n * @param {*} decimal_separator\n * @param {*} inputtitle\n * @return\n */\nfunction formulas_format_check(decimal_separator, inputtitle) {\n const regexp_decsep = decimal_separator == '.' ? '\\.' : decimal_separator;\n // If use_format_check is set to false, no format check will be used and initialized.\n var use_format_check = true;\n // Show the type hinting under the input box, such as 'Number', 'Unit'.\n // null means use the individual setting in variable types below.\n var show_hinting_type = null;\n // Show the interpretation of the formula under the input box.\n // null means use the individual setting in variable types below.\n var show_interpretation = null;\n // Show the warning sign if the input is wrong/not interpretable.\n // null means use the individual setting in variable types below.\n var show_warning = null;\n // Show an icon at the low right corner if the format check testing fails\n var unittest_fail_show_icon = false;\n // Show the detail test case that it fails.\n var unittest_fail_show_details = false;\n\n // The following variable can fine control the information for each type in addition to the variable defined above\n // So, if the type name is commented out here, the corresponding format checking will be disabled\n // For each type record, it contains the input type name (say 'unit')\n // and whether to show the type name (true/false), interpretation (true/false) and warning sign (true/false) respectively\n var types = [\n ['unit', true, true, true], // For the unit input box.\n ['number', true, true, true], // For the number input box.\n ['number_unit', true, true, true], // Input box with number and unit together.\n ['numeric', true, true, true], // Allow the combination of numbers and operators + - * / ^ ( ).\n ['numeric_unit', true, true, true], // Input box with numeric and unit together.\n ['numerical_formula', true, true, true], // Allow the combination of numbers, operators and functions.\n ['numerical_formula_unit', true, true, true], // Input box with numerical formula and unit together.\n ['algebraic_formula', true, true, true], // Allow the combination of numbers, operators, functions and variables.\n ['editing_unit', true, true, true] // Used for the unit in editing interface.\n ];\n\n // The list of constant that will be replaced by the corresponding number.\n var constlist = {'pi': '3.14159265358979323846'};\n\n // The list of allowable (single parameter) function and their evaluation replacement.\n var funclist = {'sin': 1, 'cos': 1, 'tan': 1, 'asin': 1, 'acos': 1, 'atan': 1, 'exp': 1,\n 'log10': 1, 'ln': 1, 'sqrt': 1, 'abs': 1, 'ceil': 1, 'floor': 1, 'fact': 1};\n\n /**\n * The replacement list used when preform trial evaluation, note it is not the same as dispreplacelist\n * Replace 'fact' (factorial) by 'abs', because JS does not have a factorial function and\n * therefore, an expression containing fact() will always be considered as invalid. We use abs(),\n * because we just need some replacement function and are not interested in the actual result.\n */\n\n // Natural log and log with base 10, no log allowed to avoid ambiguity.\n var evalreplacelist = {'ln': 'log', 'log10': '(1./log(10.))*log', 'fact': 'abs'};\n\n // The replacement list used when the formula is displayed on the screen.\n var dispreplacelist = {'log10': 'log10', '3.14159265358979323846': 'π'};\n\n // Perform the action specified by the above global variables.\n if (!use_format_check) {\n return;\n }\n for (var i=0; i 128) {\n self.input.value = self.input.value.substr(0,128);\n }\n if (!common.ready || !common.pass) {\n return;\n }\n self.cur_value = common.fn.trim(self.input.value);\n if (self.last_value !== null && self.last_value == self.cur_value) {\n return;\n }\n self.last_value = self.cur_value;\n self.answered = self.input.value == '' ? false : true;\n\n // Call the corresponding function for this particular input box if the value is not empty.\n var info = self.answered ? common.fn[self.func](common.fn, self.cur_value) : '';\n self.correct = (info !== null); // the function returns a string if correct, otherwise null\n info = (info !== null) ? common.fn.trim(info) : '';\n\n // Update the information shown on the screen.\n self.warning.style.display = (self.show_sign && self.answered && !self.correct) ? 'block' : 'none';\n if (self.correct) {\n self.interpretation.innerHTML = info;\n self.interpretation.style.display = (self.show_interpretation && self.cur_value != info) ? 'block' : 'none';\n self.interpretation.className = 'formulas_input_info_interpretation';\n }\n else {\n // Dim the text color and keep the background text unchanged, until the next correct.\n self.interpretation.className = 'formulas_input_info_interpretation_incorrect';\n }\n },\n\n check_unit : function(fn, value) {\n var base_units = null;\n try {\n base_units = fn.parse_unit(fn, value);\n } catch(e) {}\n if (base_units === null) {\n return null;\n }\n return fn.format_unit(base_units);\n },\n\n check_number : function(fn, value) {\n var v = fn.get_formula_information(fn, value);\n if (v === null) {\n return null;\n }\n if (/^[-+]?@0$/.test(v.sub) == false) {\n return null; // It must be a positive number, with an optional '-' sign.\n }\n if (!((v.lengths['n'] == 1) && (v.lengths['f'] == 0) && (v.lengths['v'] == 0))) {\n return null;\n }\n return fn.format_number(value);\n },\n\n check_number_unit : function(fn, value) {\n var splitted = fn.split_formula_unit(fn, value);\n var n = fn.check_number(fn, splitted[0]);\n var u = fn.check_unit(fn, splitted[1]);\n if (n === null || u === null) {\n return null; // both part must correct simultaneously\n }\n return n + ' ' + u;\n },\n\n check_numeric : function(fn, value) {\n var v = fn.get_formula_information(fn, value);\n if (v === null) {\n return null;\n }\n if (/^[ )(^\\/*+-]*$/.test(v.remaining) == false) {\n return null; // it must contain only the operators +-*/^()\n }\n if (!((v.lengths['f'] == 0) && (v.lengths['v'] == 0))) {\n return null;\n }\n if (fn.test_evaluation(fn, v, v.sub) === null) {\n return null;\n }\n var n = fn.check_number(fn, value); // If it is a simple number, show a better format.\n return n !== null ? n : fn.replace_display_formula(fn, v, v.sub);\n },\n\n check_numeric_unit : function(fn, value) {\n var splitted = fn.split_formula_unit(fn, value);\n var n = fn.check_numeric(fn, splitted[0]);\n var u = fn.check_unit(fn, splitted[1]);\n if (n === null || u === null) {\n return null; // Both part must be correct simultaneously.\n }\n return n + ' ' + u;\n },\n\n check_numerical_formula : function(fn, value) {\n var v = fn.get_formula_information(fn, value);\n if (v === null) {\n return null;\n }\n if (/^[ )(^\\/*+-]*$/.test(v.remaining) == false) {\n return null; // It must contain only the operators +-*/^().\n }\n if (!((v.lengths['v'] == 0))) {\n return null;\n }\n if (fn.test_evaluation(fn, v, v.sub) === null) {\n return null;\n }\n var n = fn.check_number(fn, value); // If it is a simple number, show a better format.\n return n !== null ? n : fn.replace_display_formula(fn, v, v.sub);\n },\n\n check_numerical_formula_unit : function(fn, value) {\n var splitted = fn.split_formula_unit(fn, value);\n var n = fn.check_numerical_formula(fn, splitted[0]);\n var u = fn.check_unit(fn, splitted[1]);\n if (n === null || u === null) {\n return null; // Both part must be correct simultaneously.\n }\n return n + ' ' + u;\n },\n\n check_algebraic_formula : function(fn, value) {\n var v = fn.get_formula_information(fn, value);\n if (v === null) {\n return null;\n }\n if (/^[ )(^\\/*+-]*$/.test(v.remaining) == false) {\n return null; // It must only contain the +-*/^() operators.\n }\n // Replace all variables symbols by a number before the evaluation test.\n var variables = {}; // replace all variables in v.all by 1 and then attempt the evaluation.\n for (var key in v.all) {\n variables[key] = v.all[key]; // clone the v.all\n }\n for (var key in v.all) {\n if (v.all[key] !== null && v.all[key].type == 'v') {\n v.all[key] = {'type': 'n', 'value': \"1.\"};\n }\n }\n var result = fn.test_evaluation(fn, v, v.sub);\n for (var key in v.all) {\n v.all[key] = variables[key]; // Put the variables back, it will be used in the display formula.\n }\n if(result === null) {\n return result;\n }\n return fn.replace_display_formula(fn, v, v.sub);\n },\n\n check_editing_unit : function(fn, value) {\n var unit_lists = value.split('=');\n var correct = true;\n var formatted = [];\n for (var i=0; i<=~!|&%^\\/*+-])(([0-9]+\\.?[0-9]*|[0-9]*\\.?[0-9]+)([eE][-+]?[0-9]+)?)/.source;\n numPattern = new RegExp(numPattern.replaceAll(\"\\\\.\", regexp_decsep), \"g\");\n var splitted = text.replace(numPattern, '$1`$2`').split('`');\n\n // The length will always be odd, and the numbers are stored in odd index\n for (var i=1; i';\n }\n if (vstack.all[key].type=='n') {\n vstack.all[key].value = fn.format_number(vstack.all[key].value, true);\n }\n }\n }\n text = fn.substitute_placeholders_in_text(fn, vstack, text);\n\n // replace the pow(a,b) into the form superscript format: ab\n /* eslint-disable no-constant-condition */\n while (true){\n /* eslint-enable no-constant-condition */\n var loc = text.lastIndexOf('pow'); // from right to left\n if (loc < 0) {\n break;\n }\n var b = fn.get_expressions_in_bracket(text, loc+1, '(', {'(': ')'});\n var base = fn.trim(b.expressions[0]);\n if (base[0]!='(' && base.indexOf('(')>=0) {\n base = '('+base+')'; // probably a function, add brackets for less ambiguous\n }\n var expo = fn.trim(b.expressions[1]);\n if (expo[0]=='(' && expo[expo.length-1]==')') {\n expo = expo.substr(1,expo.length-2); // remove extra brackets\n }\n text = text.substr(0,loc) + base + '' + expo + '' + text.substr(b.closeloc+1);\n }\n return text;\n },\n\n // return the list of expression inside the open '(' and close ')' bracket, otherwise null\n get_expressions_in_bracket : function(text, start, open, bset) {\n var bflip = {};\n for (var b in bset) {\n bflip[bset[b]] = b;\n }\n var ostack = []; // stack of open bracket\n for (var i=start; i 0) {\n break; // when the first open bracket is found\n }\n }\n if (ostack.length == 0) {\n return null;\n }\n var firstopenloc = i;\n var expressions = [];\n var ploc = i+1;\n for (var i=ploc; i= 0) {\n if (no_divisor || pos == 0 || pos >= str.length-1) {\n return null;\n }\n var left = fn.trim(str.substr(0, pos));\n var right = fn.trim(str.substr(pos+1));\n if (right[0] == '(' && right[right.length-1] == ')') {\n right = right.substr(1, right.length-2);\n }\n var uleft = fn.parse_unit(fn, left, true);\n var uright = fn.parse_unit(fn, right, true);\n if (uleft === null || uright === null) {\n return null; // if either part contains error\n }\n var unit = uleft;\n var unit_set = {};\n for (var i=0; i 1 && (name.length == 0 || ex[1].length == 0)) {\n return null;\n }\n if (name.length == 0) {\n continue; // if it is an empty space\n }\n if (/^[^\\]\\[)(}{><0-9.,:;`~!@#^&*\\/?|_=+ -]+$/.test(name) == false) {\n return null; // it cannot contain some characters\n }\n var exponent = null;\n if (ex.length > 1) {\n var matches = /(.*)([0-9]+)(.*)/.exec(ex[1]);\n if (matches.length == 0) {\n return null; // the '^' must be followed by something, should it be matches == null???\n }\n if (matches[1] == '' && matches[3] == '') {\n exponent = parseInt(matches[2]);\n }\n if (matches[1] == '-' && matches[3] == '') {\n exponent = -parseInt(matches[2]);\n }\n if (matches[1] == '(-' && matches[3] == ')') {\n exponent = -parseInt(matches[2]);\n }\n if (exponent === null) {\n return null; // no one pattern matched\n }\n }\n else {\n exponent = 1;\n }\n if (name in unit_set) {\n return null;\n }\n unit.push([name, exponent]);\n unit_set[name] = exponent;\n }\n return unit;\n },\n\n // return the formatted number in scientific notation, if necessary\n format_number : function(number, is_original) {\n try {\n if (is_original === null) {\n is_original = false;\n }\n if (is_original) {\n if (/[eE]/.exec(number) === null) {\n return number;\n }\n var standardform = number;\n var symbol = '';\n }\n else {\n var value = parseFloat(number.replace(decimal_separator, '.'));\n var absnum = Math.abs(value);\n if (absnum == 0) {\n return number;\n }\n var loc = number.search(/[eE]/); // if there is e, always show the reformatted scientific notation\n var standardform = value.toExponential();\n var newvalue = parseFloat(standardform);\n standardform = standardform.replace('.', decimal_separator);\n var is_equal = value == newvalue;\n if (is_equal && loc == -1 && absnum >= Math.pow(10,-2) && absnum <= Math.pow(10,6)) {\n return number;\n }\n var symbol = ''; //is_equal ? ' ' : '\\u2248 '; // if they are not equal, show approx sign\n }\n var s = standardform.split(/[eE]/);\n var regexp = new RegExp(\"(\" + regexp_decsep + \")?0*$\");\n var decimal = s[0].replace(regexp,'');\n var exponent = (s[1][0] == '+' ? s[1].substr(1) : s[1][0] == '-' ? '\\u2212'+s[1].substr(1) : s[1]);\n var newform = decimal + (exponent == 0 ? '' : '\\u00D7'+'10'+exponent+'');\n return symbol + newform;\n }catch(e) { return ''; }\n },\n\n // return the formatted unit into a standard format\n format_unit : function(base_units) {\n try {\n var res = [];\n for (var i=0; i' + exponent + '');\n }\n return res.join('\\u00b7'); // · (middle dot), s^−2, ✗\n }catch(e) { return ''; }\n },\n\n // return the string with space trimmed\n trim : function(str) {\n return str.replace(/^\\s+|\\s+$/g, '');\n }\n };\n\n /**\n * Initialization: Append the display blocks around the input and the data in the input node.\n * @param {*} common\n * @param {*} types\n * @returns\n */\n function init(common, types) {\n var others = [];\n var count = 0;\n var inputs = document.getElementsByTagName('input');\n for (i=0; i') : '')\n +''\n +'';\n }\n document.body.insertBefore(warning, null);\n }\n\n var common = {};\n\n // Define a set of function that is used to manipulate the input\n common.fn = fn;\n\n // set the state to not ready\n common.ready = false;\n\n // check whether the javascript can produce the correct response\n common.testresult = unittest();\n common.pass = common.testresult.numcorrect == common.testresult.numcase;\n if (!common.pass) {\n signal_fail(common);\n }\n\n // get the set of\n common.others = init(common, types);\n\n // set the state to ready, now we can use the functions\n common.ready = true;\n\n // update the initial value\n for (var i=0; i {\n if(!document.readyState === 'complete') {\n document.addEventListener('DOMContentLoaded', () => {\n formulas_format_check(decimal_separator, inputtitle);\n });\n } else {\n formulas_format_check(decimal_separator, inputtitle);\n }\n};\n"],"names":["formulas_format_check","decimal_separator","inputtitle","regexp_decsep","use_format_check","show_hinting_type","show_interpretation","show_warning","unittest_fail_show_icon","unittest_fail_show_details","types","constlist","funclist","evalreplacelist","dispreplacelist","i","length","fn","stop","common","self","ready","pass","info","style","display","update","monitor","show_info","input","value","substr","cur_value","trim","last_value","answered","func","correct","warning","show_sign","interpretation","innerHTML","className","check_unit","base_units","parse_unit","e","format_unit","check_number","v","get_formula_information","test","sub","lengths","format_number","check_number_unit","splitted","split_formula_unit","n","u","check_numeric","remaining","test_evaluation","replace_display_formula","check_numeric_unit","check_numerical_formula","check_numerical_formula_unit","check_algebraic_formula","variables","key","all","type","result","check_editing_unit","unit_lists","split","formatted","push","join","vstack","formula","replace_vstack_variables","replaceAll","expr","replace_evaluation_formula","substitute_placeholders_in_text","res","eval","vstack_create","idcounter","vstack_get_variable","name","vstack_add_temporary_variable","text","replace","substitute_numbers_by_placeholders","numPattern","source","RegExp","substitute_functions_by_placeholders","substitute_constants_by_placeholders","preserve","constnumber","substitute_variables_by_placeholders","str","data","original","loc","search","num","unit","replacementlist","tmp","insert_multiplication_for_juxtaposition","op","replace_caret_by_power","lastIndexOf","oplen","rloc","r","get_next_variable","endloc","variable","rtmp","get_expressions_in_bracket","openloc","closeloc","lloc","l","get_previous_variable","startloc","reverse","ltmp","lfunc","left","right","b","base","expressions","indexOf","expo","start","open","bset","bflip","ostack","firstopenloc","ploc","pop","m","exec","no_divisor","pos","uleft","uright","unit_set","exponent","candidates","ex","matches","parseInt","number","is_original","standardform","symbol","parseFloat","absnum","Math","abs","newvalue","toExponential","pow","s","regexp","decimal","testresult","unittest","numcorrect","numcase","signal_fail","others","init","count","inputs","document","getElementsByTagName","classList","add","title","classify","which","show_type","warning_inner","createElement","src","M","util","image_url","appendChild","parentNode","insertBefore","nextSibling","info_inner","width","max","clientWidth","clientLeft","info_inner_title","info_inner_interpretation","formulas","onblur","this","onfocus","onkeyup","classes","j","parsingtestcases","failcases","tc","id","body","readyState","addEventListener"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"formatcheck.min.js","sources":["../src/formatcheck.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Check whether the format of input numbers, formulas and units are incorrect\n *\n * @copyright © 2010-2011 Hon Wai, Lau; 2024 Jakob Heinemann\n * @author Hon Wai, Lau \n * @author Jakob Heinemann \n * @license http://www.gnu.org/copyleft/gpl.html GNU Public License version 3\n */\n\n/**\n * This function will be called to initialize the format check for input boxes, after the page is fully loaded.\n * @param {*} decimal_separator\n * @param {*} inputtitle\n * @return\n */\nfunction formulas_format_check(decimal_separator, inputtitle) {\n const regexp_decsep = decimal_separator == \".\" ? \"\\\\.\" : decimal_separator;\n // If use_format_check is set to false, no format check will be used and initialized.\n var use_format_check = true;\n // Show the type hinting under the input box, such as 'Number', 'Unit'.\n // null means use the individual setting in variable types below.\n var show_hinting_type = null;\n // Show the interpretation of the formula under the input box.\n // null means use the individual setting in variable types below.\n var show_interpretation = null;\n // Show the warning sign if the input is wrong/not interpretable.\n // null means use the individual setting in variable types below.\n var show_warning = null;\n // Show an icon at the low right corner if the format check testing fails\n var unittest_fail_show_icon = false;\n // Show the detail test case that it fails.\n var unittest_fail_show_details = false;\n\n // The following variable can fine control the information for each type in addition to the variable defined above\n // So, if the type name is commented out here, the corresponding format checking will be disabled\n // For each type record, it contains the input type name (say 'unit')\n // and whether to show the type name (true/false), interpretation (true/false) and warning sign (true/false) respectively\n var types = [\n ['unit', true, true, true], // For the unit input box.\n ['number', true, true, true], // For the number input box.\n ['number_unit', true, true, true], // Input box with number and unit together.\n ['numeric', true, true, true], // Allow the combination of numbers and operators + - * / ^ ( ).\n ['numeric_unit', true, true, true], // Input box with numeric and unit together.\n ['numerical_formula', true, true, true], // Allow the combination of numbers, operators and functions.\n ['numerical_formula_unit', true, true, true], // Input box with numerical formula and unit together.\n ['algebraic_formula', true, true, true], // Allow the combination of numbers, operators, functions and variables.\n ['editing_unit', true, true, true] // Used for the unit in editing interface.\n ];\n\n // The list of constant that will be replaced by the corresponding number.\n var constlist = {'pi': '3.14159265358979323846'};\n\n // The list of allowable (single parameter) function and their evaluation replacement.\n var funclist = {'sin': 1, 'cos': 1, 'tan': 1, 'asin': 1, 'acos': 1, 'atan': 1, 'exp': 1,\n 'log10': 1, 'ln': 1, 'sqrt': 1, 'abs': 1, 'ceil': 1, 'floor': 1, 'fact': 1};\n\n /**\n * The replacement list used when preform trial evaluation, note it is not the same as dispreplacelist\n * Replace 'fact' (factorial) by 'abs', because JS does not have a factorial function and\n * therefore, an expression containing fact() will always be considered as invalid. We use abs(),\n * because we just need some replacement function and are not interested in the actual result.\n */\n\n // Natural log and log with base 10, no log allowed to avoid ambiguity.\n var evalreplacelist = {'ln': 'log', 'log10': '(1./log(10.))*log', 'fact': 'abs'};\n\n // The replacement list used when the formula is displayed on the screen.\n var dispreplacelist = {'log10': 'log10', '3.14159265358979323846': 'π'};\n\n // Perform the action specified by the above global variables.\n if (!use_format_check) {\n return;\n }\n for (var i=0; i 128) {\n self.input.value = self.input.value.substr(0,128);\n }\n if (!common.ready || !common.pass) {\n return;\n }\n self.cur_value = common.fn.trim(self.input.value);\n if (self.last_value !== null && self.last_value == self.cur_value) {\n return;\n }\n self.last_value = self.cur_value;\n self.answered = self.input.value == '' ? false : true;\n\n // Call the corresponding function for this particular input box if the value is not empty.\n var info = self.answered ? common.fn[self.func](common.fn, self.cur_value) : '';\n self.correct = (info !== null); // the function returns a string if correct, otherwise null\n info = (info !== null) ? common.fn.trim(info) : '';\n\n // Update the information shown on the screen.\n self.warning.style.display = (self.show_sign && self.answered && !self.correct) ? 'block' : 'none';\n if (self.correct) {\n self.interpretation.innerHTML = info;\n self.interpretation.style.display = (self.show_interpretation && self.cur_value != info) ? 'block' : 'none';\n self.interpretation.className = 'formulas_input_info_interpretation';\n }\n else {\n // Dim the text color and keep the background text unchanged, until the next correct.\n self.interpretation.className = 'formulas_input_info_interpretation_incorrect';\n }\n },\n\n check_unit : function(fn, value) {\n var base_units = null;\n try {\n base_units = fn.parse_unit(fn, value);\n } catch(e) {}\n if (base_units === null) {\n return null;\n }\n return fn.format_unit(base_units);\n },\n\n check_number : function(fn, value) {\n var v = fn.get_formula_information(fn, value);\n if (v === null) {\n return null;\n }\n if (/^[-+]?@0$/.test(v.sub) == false) {\n return null; // It must be a positive number, with an optional '-' sign.\n }\n if (!((v.lengths['n'] == 1) && (v.lengths['f'] == 0) && (v.lengths['v'] == 0))) {\n return null;\n }\n return fn.format_number(value);\n },\n\n check_number_unit : function(fn, value) {\n var splitted = fn.split_formula_unit(fn, value);\n var n = fn.check_number(fn, splitted[0]);\n var u = fn.check_unit(fn, splitted[1]);\n if (n === null || u === null) {\n return null; // both part must correct simultaneously\n }\n return n + ' ' + u;\n },\n\n check_numeric : function(fn, value) {\n var v = fn.get_formula_information(fn, value);\n if (v === null) {\n return null;\n }\n if (/^[ )(^\\/*+-]*$/.test(v.remaining) == false) {\n return null; // it must contain only the operators +-*/^()\n }\n if (!((v.lengths['f'] == 0) && (v.lengths['v'] == 0))) {\n return null;\n }\n if (fn.test_evaluation(fn, v, v.sub) === null) {\n return null;\n }\n var n = fn.check_number(fn, value); // If it is a simple number, show a better format.\n return n !== null ? n : fn.replace_display_formula(fn, v, v.sub);\n },\n\n check_numeric_unit : function(fn, value) {\n var splitted = fn.split_formula_unit(fn, value);\n var n = fn.check_numeric(fn, splitted[0]);\n var u = fn.check_unit(fn, splitted[1]);\n if (n === null || u === null) {\n return null; // Both part must be correct simultaneously.\n }\n return n + ' ' + u;\n },\n\n check_numerical_formula : function(fn, value) {\n var v = fn.get_formula_information(fn, value);\n if (v === null) {\n return null;\n }\n if (/^[ )(^\\/*+-]*$/.test(v.remaining) == false) {\n return null; // It must contain only the operators +-*/^().\n }\n if (!((v.lengths['v'] == 0))) {\n return null;\n }\n if (fn.test_evaluation(fn, v, v.sub) === null) {\n return null;\n }\n var n = fn.check_number(fn, value); // If it is a simple number, show a better format.\n return n !== null ? n : fn.replace_display_formula(fn, v, v.sub);\n },\n\n check_numerical_formula_unit : function(fn, value) {\n var splitted = fn.split_formula_unit(fn, value);\n var n = fn.check_numerical_formula(fn, splitted[0]);\n var u = fn.check_unit(fn, splitted[1]);\n if (n === null || u === null) {\n return null; // Both part must be correct simultaneously.\n }\n return n + ' ' + u;\n },\n\n check_algebraic_formula : function(fn, value) {\n var v = fn.get_formula_information(fn, value);\n if (v === null) {\n return null;\n }\n if (/^[ )(^\\/*+-]*$/.test(v.remaining) == false) {\n return null; // It must only contain the +-*/^() operators.\n }\n // Replace all variables symbols by a number before the evaluation test.\n var variables = {}; // replace all variables in v.all by 1 and then attempt the evaluation.\n for (var key in v.all) {\n variables[key] = v.all[key]; // clone the v.all\n }\n for (var key in v.all) {\n if (v.all[key] !== null && v.all[key].type == 'v') {\n v.all[key] = {'type': 'n', 'value': \"1.\"};\n }\n }\n var result = fn.test_evaluation(fn, v, v.sub);\n for (var key in v.all) {\n v.all[key] = variables[key]; // Put the variables back, it will be used in the display formula.\n }\n if(result === null) {\n return result;\n }\n return fn.replace_display_formula(fn, v, v.sub);\n },\n\n check_editing_unit : function(fn, value) {\n var unit_lists = value.split('=');\n var correct = true;\n var formatted = [];\n for (var i=0; i<=~!|&%^\\/*+-])(([0-9]+\\.?[0-9]*|[0-9]*\\.?[0-9]+)([eE][-+]?[0-9]+)?)/.source;\n numPattern = new RegExp(numPattern.replaceAll(\"\\\\.\", regexp_decsep), \"g\");\n var splitted = text.replace(numPattern, '$1`$2`').split('`');\n\n // The length will always be odd, and the numbers are stored in odd index\n for (var i=1; i';\n }\n if (vstack.all[key].type=='n') {\n vstack.all[key].value = fn.format_number(vstack.all[key].value, true);\n }\n }\n }\n text = fn.substitute_placeholders_in_text(fn, vstack, text);\n\n // replace the pow(a,b) into the form superscript format: ab\n /* eslint-disable no-constant-condition */\n while (true){\n /* eslint-enable no-constant-condition */\n var loc = text.lastIndexOf('pow'); // from right to left\n if (loc < 0) {\n break;\n }\n var b = fn.get_expressions_in_bracket(text, loc+1, '(', {'(': ')'});\n var base = fn.trim(b.expressions[0]);\n if (base[0]!='(' && base.indexOf('(')>=0) {\n base = '('+base+')'; // probably a function, add brackets for less ambiguous\n }\n var expo = fn.trim(b.expressions[1]);\n if (expo[0]=='(' && expo[expo.length-1]==')') {\n expo = expo.substr(1,expo.length-2); // remove extra brackets\n }\n text = text.substr(0,loc) + base + '' + expo + '' + text.substr(b.closeloc+1);\n }\n return text;\n },\n\n // return the list of expression inside the open '(' and close ')' bracket, otherwise null\n get_expressions_in_bracket : function(text, start, open, bset) {\n var bflip = {};\n for (var b in bset) {\n bflip[bset[b]] = b;\n }\n var ostack = []; // stack of open bracket\n for (var i=start; i 0) {\n break; // when the first open bracket is found\n }\n }\n if (ostack.length == 0) {\n return null;\n }\n var firstopenloc = i;\n var expressions = [];\n var ploc = i+1;\n for (var i=ploc; i= 0) {\n if (no_divisor || pos == 0 || pos >= str.length-1) {\n return null;\n }\n var left = fn.trim(str.substr(0, pos));\n var right = fn.trim(str.substr(pos+1));\n if (right[0] == '(' && right[right.length-1] == ')') {\n right = right.substr(1, right.length-2);\n }\n var uleft = fn.parse_unit(fn, left, true);\n var uright = fn.parse_unit(fn, right, true);\n if (uleft === null || uright === null) {\n return null; // if either part contains error\n }\n var unit = uleft;\n var unit_set = {};\n for (var i=0; i 1 && (name.length == 0 || ex[1].length == 0)) {\n return null;\n }\n if (name.length == 0) {\n continue; // if it is an empty space\n }\n if (/^[^\\]\\[)(}{><0-9.,:;`~!@#^&*\\/?|_=+ -]+$/.test(name) == false) {\n return null; // it cannot contain some characters\n }\n var exponent = null;\n if (ex.length > 1) {\n var matches = /(.*)([0-9]+)(.*)/.exec(ex[1]);\n if (matches.length == 0) {\n return null; // the '^' must be followed by something, should it be matches == null???\n }\n if (matches[1] == '' && matches[3] == '') {\n exponent = parseInt(matches[2]);\n }\n if (matches[1] == '-' && matches[3] == '') {\n exponent = -parseInt(matches[2]);\n }\n if (matches[1] == '(-' && matches[3] == ')') {\n exponent = -parseInt(matches[2]);\n }\n if (exponent === null) {\n return null; // no one pattern matched\n }\n }\n else {\n exponent = 1;\n }\n if (name in unit_set) {\n return null;\n }\n unit.push([name, exponent]);\n unit_set[name] = exponent;\n }\n return unit;\n },\n\n // return the formatted number in scientific notation, if necessary\n format_number : function(number, is_original) {\n try {\n if (is_original === null) {\n is_original = false;\n }\n if (is_original) {\n if (/[eE]/.exec(number) === null) {\n return number;\n }\n var standardform = number;\n var symbol = '';\n }\n else {\n var value = parseFloat(number.replace(decimal_separator, '.'));\n var absnum = Math.abs(value);\n if (absnum == 0) {\n return number;\n }\n var loc = number.search(/[eE]/); // if there is e, always show the reformatted scientific notation\n var standardform = value.toExponential();\n var newvalue = parseFloat(standardform);\n standardform = standardform.replace('.', decimal_separator);\n var is_equal = value == newvalue;\n if (is_equal && loc == -1 && absnum >= Math.pow(10,-2) && absnum <= Math.pow(10,6)) {\n return number;\n }\n var symbol = ''; //is_equal ? ' ' : '\\u2248 '; // if they are not equal, show approx sign\n }\n var s = standardform.split(/[eE]/);\n var regexp = new RegExp(\"(\" + regexp_decsep + \")?0*$\");\n var decimal = s[0].replace(regexp,'');\n var exponent = (s[1][0] == '+' ? s[1].substr(1) : s[1][0] == '-' ? '\\u2212'+s[1].substr(1) : s[1]);\n var newform = decimal + (exponent == 0 ? '' : '\\u00D7'+'10'+exponent+'');\n return symbol + newform;\n }catch(e) { return ''; }\n },\n\n // return the formatted unit into a standard format\n format_unit : function(base_units) {\n try {\n var res = [];\n for (var i=0; i' + exponent + '');\n }\n return res.join('\\u00b7'); // · (middle dot), s^−2, ✗\n }catch(e) { return ''; }\n },\n\n // return the string with space trimmed\n trim : function(str) {\n return str.replace(/^\\s+|\\s+$/g, '');\n }\n };\n\n /**\n * Initialization: Append the display blocks around the input and the data in the input node.\n * @param {*} common\n * @param {*} types\n * @returns\n */\n function init(common, types) {\n var others = [];\n var count = 0;\n var inputs = document.getElementsByTagName('input');\n for (i=0; i') : '')\n +''\n +'';\n }\n document.body.insertBefore(warning, null);\n }\n\n var common = {};\n\n // Define a set of function that is used to manipulate the input\n common.fn = fn;\n\n // set the state to not ready\n common.ready = false;\n\n // check whether the javascript can produce the correct response\n common.testresult = unittest();\n common.pass = common.testresult.numcorrect == common.testresult.numcase;\n if (!common.pass) {\n signal_fail(common);\n }\n\n // get the set of\n common.others = init(common, types);\n\n // set the state to ready, now we can use the functions\n common.ready = true;\n\n // update the initial value\n for (var i=0; i {\n if(!document.readyState === 'complete') {\n document.addEventListener('DOMContentLoaded', () => {\n formulas_format_check(decimal_separator, inputtitle);\n });\n } else {\n formulas_format_check(decimal_separator, inputtitle);\n }\n};\n"],"names":["formulas_format_check","decimal_separator","inputtitle","regexp_decsep","use_format_check","show_hinting_type","show_interpretation","show_warning","unittest_fail_show_icon","unittest_fail_show_details","types","constlist","funclist","evalreplacelist","dispreplacelist","i","length","fn","stop","common","self","ready","pass","info","style","display","update","monitor","show_info","input","value","substr","cur_value","trim","last_value","answered","func","correct","warning","show_sign","interpretation","innerHTML","className","check_unit","base_units","parse_unit","e","format_unit","check_number","v","get_formula_information","test","sub","lengths","format_number","check_number_unit","splitted","split_formula_unit","n","u","check_numeric","remaining","test_evaluation","replace_display_formula","check_numeric_unit","check_numerical_formula","check_numerical_formula_unit","check_algebraic_formula","variables","key","all","type","result","check_editing_unit","unit_lists","split","formatted","push","join","vstack","formula","replace_vstack_variables","replaceAll","expr","replace_evaluation_formula","substitute_placeholders_in_text","res","eval","vstack_create","idcounter","vstack_get_variable","name","vstack_add_temporary_variable","text","replace","substitute_numbers_by_placeholders","numPattern","source","RegExp","substitute_functions_by_placeholders","substitute_constants_by_placeholders","preserve","constnumber","substitute_variables_by_placeholders","str","data","original","loc","search","num","unit","replacementlist","tmp","insert_multiplication_for_juxtaposition","op","replace_caret_by_power","lastIndexOf","oplen","rloc","r","get_next_variable","endloc","variable","rtmp","get_expressions_in_bracket","openloc","closeloc","lloc","l","get_previous_variable","startloc","reverse","ltmp","lfunc","left","right","b","base","expressions","indexOf","expo","start","open","bset","bflip","ostack","firstopenloc","ploc","pop","m","exec","no_divisor","pos","uleft","uright","unit_set","exponent","candidates","ex","matches","parseInt","number","is_original","standardform","symbol","parseFloat","absnum","Math","abs","newvalue","toExponential","pow","s","regexp","decimal","testresult","unittest","numcorrect","numcase","signal_fail","others","init","count","inputs","document","getElementsByTagName","classList","add","title","classify","which","show_type","warning_inner","createElement","src","M","util","image_url","appendChild","parentNode","insertBefore","nextSibling","info_inner","width","max","clientWidth","clientLeft","info_inner_title","info_inner_interpretation","formulas","onblur","this","onfocus","onkeyup","classes","j","parsingtestcases","failcases","tc","id","body","readyState","addEventListener"],"mappings":"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"} \ No newline at end of file diff --git a/amd/src/formatcheck.js b/amd/src/formatcheck.js index a6594ef4..706ed4c2 100644 --- a/amd/src/formatcheck.js +++ b/amd/src/formatcheck.js @@ -29,7 +29,7 @@ * @return */ function formulas_format_check(decimal_separator, inputtitle) { - const regexp_decsep = decimal_separator == '.' ? '\.' : decimal_separator; + const regexp_decsep = decimal_separator == "." ? "\\." : decimal_separator; // If use_format_check is set to false, no format check will be used and initialized. var use_format_check = true; // Show the type hinting under the input box, such as 'Number', 'Unit'. @@ -394,7 +394,7 @@ function formulas_format_check(decimal_separator, inputtitle) { // return the information of the formula by substituting numbers, variables and functions. get_formula_information : function(fn, str) { - var regexp = new RegExp("^[A-Za-z0-9" + regexp_decsep + "_ )(^\/*+-]*$"); + var regexp = new RegExp("^[A-Za-z0-9" + decimal_separator + "_ )(^\/*+-]*$"); if (regexp.test(str) == false) { return null; // formula can only contains these characters } @@ -918,6 +918,7 @@ function formulas_format_check(decimal_separator, inputtitle) { var numcorrect = 0; var parsingtestcases = [ // check for simple number + ['number', true, '-3' + decimal_separator + 'e10'], ['number', true, '3'], ['number', true, '3' + decimal_separator], ['number', true, decimal_separator + '3'], From 577281a1a160fec7deee0284b4977eeddf8acb44 Mon Sep 17 00:00:00 2001 From: Jakob Heinemann Date: Thu, 27 Mar 2025 11:07:03 +0100 Subject: [PATCH 4/4] replace decimal separator in given answer --- renderer.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/renderer.php b/renderer.php index 30833c06..4e8e97c6 100644 --- a/renderer.php +++ b/renderer.php @@ -275,6 +275,9 @@ public function get_part_formulation(question_attempt $qa, question_display_opti $placeholder = ($j == $part->numbox) ? "_u" : "_$j"; // The last one is unit. $variablename = "{$i}_$j"; $currentanswer = $qa->get_last_qt_var($variablename); + if(!empty($currentanswer)) { + $currentanswer = str_replace('.', get_string('decsep', 'langconfig'), $currentanswer); + } $inputname = $qa->get_qt_field_name($variablename); $inputattributes = array( 'name' => $inputname,