@syzlm/evaluator
Version:
javascript模版计算引擎
3 lines (2 loc) • 11.2 kB
JavaScript
function r(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 e(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 t(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 n(r){for(var n=1;n<arguments.length;n++){var a=null!=arguments[n]?arguments[n]:{};n%2?t(Object(a),!0).forEach((function(t){e(r,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(a)):t(Object(a)).forEach((function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(a,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,a,o,l,u=[],i=!0,c=!1;try{if(o=(t=t.call(r)).next,0===e){if(Object(t)!==t)return;i=!1}else for(;!(i=(n=o.call(t)).done)&&(u.push(n.value),u.length!==e);i=!0);}catch(r){c=!0,a=r}finally{try{if(!i&&null!=t.return&&(l=t.return(),Object(l)!==l))return}finally{if(c)throw a}}return u}}(r,e)||l(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 o(e){return function(e){if(Array.isArray(e))return r(e)}(e)||function(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}(e)||l(e)||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 l(e,t){if(e){if("string"==typeof e)return r(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}}var u={debug:!1},i=function(r){Object.assign(u,r)},c=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)},f=function(r,e,t,n){if(u.debug){var a;if(!n)return c(r,e),void console.log(t);c(r,t),(a=console).log.apply(a,o(n))}};var v=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];f("color: #fff;background:red;","Error:",r,t)},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];f("color: #fff;background:#1890ff;","Info:",r,t)},p=function(r){return new Array(r).fill(0).reduce((function(r,e){return"".concat(r).concat(e)}),"")},g=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"]},h=function(r){return r.replace(/.*\.(.*)$/,"$1").length},d=function(r){var e={decimalPlaces:0,value:""};if(!r||!r.length)return v("请输入参数"),n({},e);for(var t=e.decimalPlaces,a=e.value,o=0;o<r.length;o++){var l=String(r[o]);if(l.indexOf(".")>-1){var u=l.replace(/.*\.(.*)/,"$1").length;u>t&&(t=u,a=l)}}return e.decimalPlaces=t,e.value=a,n({},e)},m=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 a=t.length-1;a>=0;a--){if(t[a]>n[a])return 1;if(t[a]<n[a])return-1}return 0},y=function(r,e,t){if(!r)return"0";var n=o(r);e&&(n.length>e?n.splice(e,0,"."):(n=n.concat(p(e-n.length+1).split(""))).splice(e,0,".")),n.reverse();var a=n.reduce((function(r,e){return"".concat(r).concat(e)}),"");return a=(a=(a=a.replace(/(\.0+)$/,"")).replace(/^(0+\.)/,"0.")).replace(/^(0+([1-9]))/,"$2"),t&&-1===t&&(a="-".concat(a)),a.indexOf(".")>-1&&(a=a.replace(/(0+)$/,"")),a},b=function(r,e){if(!r||!r.length)return v("resolveAdd第一个参数不可为空"),[];if(!e||!e.length)return r;for(var t=[],n=r.length>e.length?r.length:e.length,a=0,o=0;o<n||a>0;o++)t[o]=(a+=Number(r[o]||0)+Number(e[o]||0))%10,a=Math.floor(a/10);return t},w=function(r,e){if(!r||!r.length)return v("resolveSubtract第一个参数不可为空"),[];if(!e||!e.length)return r;for(var t=[],n=r.length,a=0,o=0;o<n;o++)t[o]=r[o]-(Number(e[o]||0)+Number(a)),t[o]+=10*(a=t[o]>=0?0:1);return t},N=function(r,e){if(!r||!r.length)return v("resolveMultiply第一个参数不可为空"),[0];if(!e||!e.length)return r;for(var t=[],n=0,a=0;a<r.length;a++)for(var o=0;o<e.length||n>0;o++)t[a+o]=(n+=(t[a+o]||0)+Number(r[a]||0)*Number(e[o]||0))%10,n=Math.floor(n/10);return t},O=function(r,e,t){if(!r||!r.length)return v("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 a=[],o=t;r.length-e.length<30&&(a=new Array(n).fill("0"),o=t+n);for(var l=g(a.concat(r)),u=g(e),i=[],c=[0],f=l.length-1;f>=0;f--)for((c=N(c,[0,1]))[0]=Number(l[f]),c=g(c).map((function(r){return Number(r)})),i[f]=0;m(u,c)<=0;)i[f]++,c=w(c,u),c=g(c).map((function(r){return Number(r)}));return{result:i,decimalLength:o}},S=function(r,e){for(var t=d([r,e]),n=t.value,o=t.decimalPlaces,l=null,u=1,i=[r,e],c=0;c<i.length;c++){var f=i[c];if(n)if(f.indexOf(".")>-1){var v=h(f);v<o&&(f+=p(o-v))}else f+=p(o);var s=a(f.match(/^([-+])?(.*)/)||[],2)[1],g=(f=f.replace(/[\.\-\+]/g,"")).split("");g.reverse(),null!==l?-1===u||"-"===s?"-"===s&&-1===u?l=b(l,g):m(l,g)>=0?l=w(l,g):(-1===u&&(u=1),"-"===s&&(u=-1),l=w(g,l)):l=b(l,g):(l=g,"-"===s&&(u=-1))}return y(l,o,u)},j=function(r,e){for(var t=d([r,e]),n=t.value,o=t.decimalPlaces,l=[r,e],u=null,i=1,c=0;c<l.length;c++){var f=l[c];if(n)if(f.indexOf(".")>-1){var v=h(f);v<o&&(f+=p(o-v))}else f+=p(o);var s=a(f.match(/^([-+])?(.*)/)||[],2)[1],g=(f=f.replace(/[\.\-\+]/g,"")).split("");g.reverse(),null!==u?-1===i&&"-"!==s?u=b(g,u):m(u,g)>=0?u="-"===s&&1===i?b(u,g):w(u,g):"-"===s?1===i?u=b(g,u):(i=1,u=w(g,u)):(i=-1,u=w(g,u)):(u=g,"-"===s&&(i=-1))}return y(u,o,i)},A=function(r,e){for(var t=0,n=null,o=1,l=[r,e],u=0;u<l.length;u++){var i=l[u];if(u>0&&("-1"===String(i)||"1"===String(i)))"-1"===String(i)&&(o*=-1);else{i.indexOf(".")>-1&&(t+=h(i));var c=a(i.match(/^([-+])?(.*)/)||[],2)[1],f=(i=i.replace(/[\.\-\+]/g,"")).split("");f.reverse(),null!==n?("-"===c&&(o*=-1),n=N(n,f)):(n=f,"-"===c&&(o=-1))}}return y(n,t,o)},E=function(r,e){for(var t=0,n=null,o=1,l=[r,e],u=0;u<l.length;u++){var i=l[u];if(u>0&&("-1"===String(i)||"1"===String(i)))"-1"===String(i)&&(o*=-1);else{if(i.indexOf(".")>-1){var c=h(i);u>0&&(t-=c),0===u&&(t=h(i))}var f=a(i.match(/^([-+])?(.*)/)||[],2)[1],v=(i=i.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=O(n,v,t);n=s.result,t=s.decimalLength}else n=v,"-"===f&&(o=-1)}}return y(n,t,o)},P=function(r,e,t){var n=e||2,a=t,o=String(r).replace(/^-/,"");if(a&&a<n)return"".concat(r);var l=String(r).startsWith("-")?"-":"",u=o.indexOf(".");if(-1===u){for(var i=".",c=0;c<n;c++)i+="0";return o+i}for(var f=a||n,v=u+1,s="";s.length<f&&(s+=(o[v++]||"0")+"",o[v]||!(s.length>=n)););var p=o.substring(0,u)+"."+s,g=0;v<o.length&&(g=Number(o[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("")},x=function(r){var e,t,n,a;switch(s("evaluate.node:",r),r.type){case"NUMBER":return r.value;case"BINARY":var o=x(r.left),l=x(r.right);switch(s("node.operator:",r.operator),s("evaluate:_left:",o),s("evaluate:_right:",l),r.operator){case"+":return S(o,l);case"-":return j(o,l);case"*":return A(o,l);case"/":return E(o,l);case",":return"";default:throw new Error("Unknown operator")}case"FUNCTION":var u,i,c,f=(null===(u=r.args)||void 0===u?void 0:u.map((function(r){return x(r)})))||[],v=(null===(i=r.numArgs)||void 0===i?void 0:i.map((function(r){return x(r)})))||[];s("FUNCTION:",f),s("逗号后数值:",v);var p="";switch(null!==(c=f[0])&&void 0!==c&&c.startsWith("-")&&s("FUNCTION_prefix:",p="-"),r.name){case"sqrt":case"pow":return"".concat(Math.pow(Number(f[0]),Number((null==v?void 0:v[0])||1)));case"floor":return p?"".concat(j(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 p?null===(n=f[0])||void 0===n?void 0:n.split(".")[0]:"".concat(S(null===(a=f[0])||void 0===a||null===(a=a.split(".")[0])||void 0===a?void 0:a.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")}},U={"+":1,"-":1,"*":2,"/":2,"^":3,"(":0,")":0},I=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"]);s("计算源模版:",r),s("计算源数据:",e);var l,u=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()]})),i="operator",c=["+","-","*","/","%"];for(s("计算模版转化:",u);null!==(l=n.exec(u));){var f=a(l,5),p=f[1],g=f[2],h=f[3],d=f[4];if(p){var m=("-"===i?i:"")+p+(g||"");t.push({type:"NUMBER",value:m}),i="number"}else h?(t.push({type:"FUNCTION",value:h.toLowerCase()}),i="func"):d&&("("===d||")"===d||","===d?(t.push({type:d}),i=d):c.includes(d)&&"operator"!==i?(t.push({type:d}),i="operator"):i=d)}return t}v("请输入计算模板以及参数")}(r,e);if(null!=t&&t.length){s("tokens:",t);var n=function(r){var e=0,t=function(){var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,o=n();r:for(;e<r.length;){var l=r[e];if(")"===l.type||U[l.type]<=a)break;if(","===l.type)break r;var u=l.type;e++,o={type:"BINARY",operator:u,left:o,right:t(U[u])}}return o},n=function(){var n=r[e++];if("NUMBER"===n.type)return{type:"NUMBER",value:n.value};if("FUNCTION"===n.type){var a=[],o=[];if("("!==r[e++].type)throw new Error("Expected (");for(;")"!==r[e].type;)","===r[e].type?(e++,o.push(t())):a.push(t());return e++,{type:"FUNCTION",numArgs:o,name:n.value,args:a}}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 s("ast:",n),x(n)}return""}catch(r){return v("error:",r),"Error: ".concat((null==r?void 0:r.message)||"")}};export{I as default,S as evaluatorAdd,E as evaluatorDivide,A as evaluatorMultiply,j as evaluatorSubtract,I as renderTemplate,i as setOptions,P as toFixeds};
//# sourceMappingURL=evaluator.min.js.map