@syzlm/evaluator
Version:
javascript模版计算引擎
3 lines (2 loc) • 11.4 kB
JavaScript
!function(r,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((r="undefined"!=typeof globalThis?globalThis:r||self).Evaluator={})}(this,(function(r){"use strict";function e(r,e){(null==e||e>r.length)&&(e=r.length);for(var t=0,n=Array(e);t<e;t++)n[t]=r[t];return n}function t(r,e,t){return(e=function(r){var e=function(r,e){if("object"!=typeof r||!r)return r;var t=r[Symbol.toPrimitive];if(void 0!==t){var n=t.call(r,e);if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(r)}(r,"string");return"symbol"==typeof e?e:e+""}(e))in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}function n(r,e){var t=Object.keys(r);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(r);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),t.push.apply(t,n)}return t}function o(r){for(var e=1;e<arguments.length;e++){var o=null!=arguments[e]?arguments[e]:{};e%2?n(Object(o),!0).forEach((function(e){t(r,e,o[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(o)):n(Object(o)).forEach((function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(o,e))}))}return r}function a(r,e){return function(r){if(Array.isArray(r))return r}(r)||function(r,e){var t=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=t){var n,o,a,l,i=[],u=!0,c=!1;try{if(a=(t=t.call(r)).next,0===e){if(Object(t)!==t)return;u=!1}else for(;!(u=(n=a.call(t)).done)&&(i.push(n.value),i.length!==e);u=!0);}catch(r){c=!0,o=r}finally{try{if(!u&&null!=t.return&&(l=t.return(),Object(l)!==l))return}finally{if(c)throw o}}return i}}(r,e)||i(r,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function l(r){return function(r){if(Array.isArray(r))return e(r)}(r)||function(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}(r)||i(r)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function i(r,t){if(r){if("string"==typeof r)return e(r,t);var n={}.toString.call(r).slice(8,-1);return"Object"===n&&r.constructor&&(n=r.constructor.name),"Map"===n||"Set"===n?Array.from(r):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?e(r,t):void 0}}var u={debug:!1},c=function(r){Object.assign(u,r)},f=function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",e=arguments.length>1?arguments[1]:void 0;console.log("%c%s",r,e)},v=function(r,e,t,n){if(u.debug){var o;if(!n)return f(r,e),void console.log(t);f(r,t),(o=console).log.apply(o,l(n))}};var s=function(r){for(var e=arguments.length,t=new Array(e>1?e-1:0),n=1;n<e;n++)t[n-1]=arguments[n];v("color: #fff;background:red;","Error:",r,t)},p=function(r){for(var e=arguments.length,t=new Array(e>1?e-1:0),n=1;n<e;n++)t[n-1]=arguments[n];v("color: #fff;background:#1890ff;","Info:",r,t)},g=function(r){return new Array(r).fill(0).reduce((function(r,e){return"".concat(r).concat(e)}),"")},h=function(r){var e=r.reduce((function(r,e){return"".concat(r).concat(e)}),"");if("0"===e)return["0"];var t=e.replace(/(0+)$/,"");return t?t.split(""):["0"]},d=function(r){return r.replace(/.*\.(.*)$/,"$1").length},y=function(r){var e={decimalPlaces:0,value:""};if(!r||!r.length)return s("请输入参数"),o({},e);for(var t=e.decimalPlaces,n=e.value,a=0;a<r.length;a++){var l=String(r[a]);if(l.indexOf(".")>-1){var i=l.replace(/.*\.(.*)/,"$1").length;i>t&&(t=i,n=l)}}return e.decimalPlaces=t,e.value=n,o({},e)},b=function(r,e){var t=null!=r&&r.length?r:[],n=null!=e&&e.length?e:[];if(t.length>n.length)return 1;if(t.length<n.length)return-1;if(t.length===n.length)for(var o=t.length-1;o>=0;o--){if(t[o]>n[o])return 1;if(t[o]<n[o])return-1}return 0},m=function(r,e,t){if(!r)return"0";var n=l(r);e&&(n.length>e?n.splice(e,0,"."):(n=n.concat(g(e-n.length+1).split(""))).splice(e,0,".")),n.reverse();var o=n.reduce((function(r,e){return"".concat(r).concat(e)}),"");return o=(o=(o=o.replace(/(\.0+)$/,"")).replace(/^(0+\.)/,"0.")).replace(/^(0+([1-9]))/,"$2"),t&&-1===t&&(o="-".concat(o)),o.indexOf(".")>-1&&(o=o.replace(/(0+)$/,"")),o},w=function(r,e){if(!r||!r.length)return s("resolveAdd第一个参数不可为空"),[];if(!e||!e.length)return r;for(var t=[],n=r.length>e.length?r.length:e.length,o=0,a=0;a<n||o>0;a++)t[a]=(o+=Number(r[a]||0)+Number(e[a]||0))%10,o=Math.floor(o/10);return t},O=function(r,e){if(!r||!r.length)return s("resolveSubtract第一个参数不可为空"),[];if(!e||!e.length)return r;for(var t=[],n=r.length,o=0,a=0;a<n;a++)t[a]=r[a]-(Number(e[a]||0)+Number(o)),t[a]+=10*(o=t[a]>=0?0:1);return t},N=function(r,e){if(!r||!r.length)return s("resolveMultiply第一个参数不可为空"),[0];if(!e||!e.length)return r;for(var t=[],n=0,o=0;o<r.length;o++)for(var a=0;a<e.length||n>0;a++)t[o+a]=(n+=(t[o+a]||0)+Number(r[o]||0)*Number(e[a]||0))%10,n=Math.floor(n/10);return t},j=function(r,e,t){if(!r||!r.length)return s("resolveDivision"),{result:[0],decimalLength:t};if(!e||!e.length)return{result:r,decimalLength:t};var n=30;e.length>r.length&&(n+=e.length-r.length);var o=[],a=t;r.length-e.length<30&&(o=new Array(n).fill("0"),a=t+n);for(var l=h(o.concat(r)),i=h(e),u=[],c=[0],f=l.length-1;f>=0;f--)for((c=N(c,[0,1]))[0]=Number(l[f]),c=h(c).map((function(r){return Number(r)})),u[f]=0;b(i,c)<=0;)u[f]++,c=O(c,i),c=h(c).map((function(r){return Number(r)}));return{result:u,decimalLength:a}},S=function(r,e){for(var t=y([r,e]),n=t.value,o=t.decimalPlaces,l=null,i=1,u=[r,e],c=0;c<u.length;c++){var f=u[c];if(n)if(f.indexOf(".")>-1){var v=d(f);v<o&&(f+=g(o-v))}else f+=g(o);var s=a(f.match(/^([-+])?(.*)/)||[],2)[1],p=(f=f.replace(/[\.\-\+]/g,"")).split("");p.reverse(),null!==l?-1===i||"-"===s?"-"===s&&-1===i?l=w(l,p):b(l,p)>=0?l=O(l,p):(-1===i&&(i=1),"-"===s&&(i=-1),l=O(p,l)):l=w(l,p):(l=p,"-"===s&&(i=-1))}return m(l,o,i)},A=function(r,e){for(var t=y([r,e]),n=t.value,o=t.decimalPlaces,l=[r,e],i=null,u=1,c=0;c<l.length;c++){var f=l[c];if(n)if(f.indexOf(".")>-1){var v=d(f);v<o&&(f+=g(o-v))}else f+=g(o);var s=a(f.match(/^([-+])?(.*)/)||[],2)[1],p=(f=f.replace(/[\.\-\+]/g,"")).split("");p.reverse(),null!==i?-1===u&&"-"!==s?i=w(p,i):b(i,p)>=0?i="-"===s&&1===u?w(i,p):O(i,p):"-"===s?1===u?i=w(p,i):(u=1,i=O(p,i)):(u=-1,i=O(p,i)):(i=p,"-"===s&&(u=-1))}return m(i,o,u)},E=function(r,e){for(var t=0,n=null,o=1,l=[r,e],i=0;i<l.length;i++){var u=l[i];if(i>0&&("-1"===String(u)||"1"===String(u)))"-1"===String(u)&&(o*=-1);else{u.indexOf(".")>-1&&(t+=d(u));var c=a(u.match(/^([-+])?(.*)/)||[],2)[1],f=(u=u.replace(/[\.\-\+]/g,"")).split("");f.reverse(),null!==n?("-"===c&&(o*=-1),n=N(n,f)):(n=f,"-"===c&&(o=-1))}}return m(n,t,o)},x=function(r,e){for(var t=0,n=null,o=1,l=[r,e],i=0;i<l.length;i++){var u=l[i];if(i>0&&("-1"===String(u)||"1"===String(u)))"-1"===String(u)&&(o*=-1);else{if(u.indexOf(".")>-1){var c=d(u);i>0&&(t-=c),0===i&&(t=d(u))}var f=a(u.match(/^([-+])?(.*)/)||[],2)[1],v=(u=u.replace(/[\.\-\+]/g,"")).split("");if(v.reverse(),null!==n){"-"===f&&(o*=-1),t<0&&(n=new Array(Math.abs(t)).fill(0).concat(n),t=0);var s=j(n,v,t);n=s.result,t=s.decimalLength}else n=v,"-"===f&&(o=-1)}}return m(n,t,o)},P=function(r,e,t){var n=e||2,o=t,a=String(r).replace(/^-/,"");if(o&&o<n)return"".concat(r);var l=String(r).startsWith("-")?"-":"",i=a.indexOf(".");if(-1===i){for(var u=".",c=0;c<n;c++)u+="0";return a+u}for(var f=o||n,v=i+1,s="";s.length<f&&(s+=(a[v++]||"0")+"",a[v]||!(s.length>=n)););var p=a.substring(0,i)+"."+s,g=0;v<a.length&&(g=Number(a[v])>=5?1:0);var h=p.split("").map((function(r){return"."===r?".":Number(r)}));if(g>0)for(;v>0;)if("."!==h[--v]){var d=Number(h[v])+Number(g);if(h[v]=d%10,g=d>=10?1:0,0===v&&0===Number(h[v])&&h.splice(0,0,1),0===g)break}return"".concat(l)+h.join("")},U=function(r){var e,t,n,o;switch(p("evaluate.node:",r),r.type){case"NUMBER":return r.value;case"BINARY":var a=U(r.left),l=U(r.right);switch(p("node.operator:",r.operator),p("evaluate:_left:",a),p("evaluate:_right:",l),r.operator){case"+":return S(a,l);case"-":return A(a,l);case"*":return E(a,l);case"/":return x(a,l);case",":return"";default:throw new Error("Unknown operator")}case"FUNCTION":var i,u,c,f=(null===(i=r.args)||void 0===i?void 0:i.map((function(r){return U(r)})))||[],v=(null===(u=r.numArgs)||void 0===u?void 0:u.map((function(r){return U(r)})))||[];p("FUNCTION:",f),p("逗号后数值:",v);var s="";switch(null!==(c=f[0])&&void 0!==c&&c.startsWith("-")&&p("FUNCTION_prefix:",s="-"),r.name){case"sqrt":case"pow":return"".concat(Math.pow(Number(f[0]),Number((null==v?void 0:v[0])||1)));case"floor":return s?"".concat(A(null===(e=f[0])||void 0===e||null===(e=e.split(".")[0])||void 0===e?void 0:e.replace(/^-/,""),"1")):null===(t=f[0])||void 0===t?void 0:t.split(".")[0];case"ceil":return s?null===(n=f[0])||void 0===n?void 0:n.split(".")[0]:"".concat(S(null===(o=f[0])||void 0===o||null===(o=o.split(".")[0])||void 0===o?void 0:o.replace(/^-/,""),"1"));case"tofixeds":return P(f[0],Number((null==v?void 0:v[0])||2));default:throw new Error("Unsupported function: ".concat(r.name))}case"NUMARG":return"";default:throw new Error("Unknown node type")}},I={"+":1,"-":1,"*":2,"/":2,"^":3,"(":0,")":0},M=function(r,e){try{var t=function(r,e){var t=[],n=/(\d+\.?\d*|\.\d+)(e[+-]?\d+)?|([a-z]+)|([+\-*/^(),])/gi;if(r&&e){var o=Object.getOwnPropertyNames(Math).concat(["toFixeds"]);p("计算源模版:",r),p("计算源数据:",e);var l,i=r.replace(/(\b([a-zA-Z]+)\b)/g,(function(r,t){if(o.includes(t))return t.trim();var n=e[t.trim()];if(null==n||""===n)throw new Error("data is error: '".concat(t,"' value not find"));return e[t.trim()]})),u="operator",c=["+","-","*","/","%"];for(p("计算模版转化:",i);null!==(l=n.exec(i));){var f=a(l,5),v=f[1],g=f[2],h=f[3],d=f[4];if(v){var y=("-"===u?u:"")+v+(g||"");t.push({type:"NUMBER",value:y}),u="number"}else h?(t.push({type:"FUNCTION",value:h.toLowerCase()}),u="func"):d&&("("===d||")"===d||","===d?(t.push({type:d}),u=d):c.includes(d)&&"operator"!==u?(t.push({type:d}),u="operator"):u=d)}return t}s("请输入计算模板以及参数")}(r,e);if(null!=t&&t.length){p("tokens:",t);var n=function(r){var e=0,t=function(){var o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,a=n();r:for(;e<r.length;){var l=r[e];if(")"===l.type||I[l.type]<=o)break;if(","===l.type)break r;var i=l.type;e++,a={type:"BINARY",operator:i,left:a,right:t(I[i])}}return a},n=function(){var n=r[e++];if("NUMBER"===n.type)return{type:"NUMBER",value:n.value};if("FUNCTION"===n.type){var o=[],a=[];if("("!==r[e++].type)throw new Error("Expected (");for(;")"!==r[e].type;)","===r[e].type?(e++,a.push(t())):o.push(t());return e++,{type:"FUNCTION",numArgs:a,name:n.value,args:o}}if("("===n.type){var l=t();if(")"!==r[e++].type)throw new Error("Expected )");return l}throw new Error("Unexpected token")};return t()}(t);return p("ast:",n),U(n)}return""}catch(r){return s("error:",r),"Error: ".concat((null==r?void 0:r.message)||"")}};r.default=M,r.evaluatorAdd=S,r.evaluatorDivide=x,r.evaluatorMultiply=E,r.evaluatorSubtract=A,r.renderTemplate=M,r.setOptions=c,r.toFixeds=P,Object.defineProperty(r,"__esModule",{value:!0})}));
//# sourceMappingURL=evaluator.min.js.map