@@ -194,7 +194,8 @@ var icons = document.querySelectorAll('#result icon > *');
194194var button = document . querySelector ( '#calc button' ) ;
195195var errors = {
196196 char : 'Only numbers or +-*/(). characters are allowed.' ,
197- par : 'Some parentheses are missing.'
197+ par : 'Some parentheses are missing.' ,
198+ syntax : 'Syntax error detected.'
198199}
199200
200201
@@ -235,14 +236,32 @@ editor.addEventListener('keyup', function (event) {
235236textfield . addEventListener ( 'input' , checkErrors ) ;
236237
237238function checkErrors ( event ) {
238- var inp = event . target . value . toString ( ) . split ( '' ) ;
239+ // convert the input to string, split in an array, remove spaces
240+ var inp = event . target . value . toString ( ) . split ( '' ) . filter ( x => x != " " ) ;
239241 // check if every character is allowed => 0123456789.+-*/()
240242 var charTest = inp . every ( char => char . match ( / [ 0 - 9 | \+ | \- | \* | \/ | ( | ) | \. ] / ) ) ;
241243 // check if parentheses match
242244 var parTest = inp . filter ( char => char == '(' ) . length == inp . filter ( char => char == ')' ) . length ;
243-
245+
246+ // preview result
247+ var validExpression = true ;
248+ try {
249+ eval ( inp . join ( '' ) ) ;
250+ } catch ( e ) {
251+ if ( e instanceof SyntaxError ) validExpression = false ;
252+ } finally {
253+ if ( validExpression && charTest && parTest ) result . innerText = eval ( inp . join ( '' ) ) ;
254+ }
255+
256+ // update warning tooltip
257+ var tooltip = [ ] ;
258+ if ( ! charTest ) tooltip . push ( errors . char ) ;
259+ if ( ! parTest ) tooltip . push ( errors . par ) ;
260+ if ( ! validExpression ) tooltip . push ( errors . syntax ) ;
261+ icons [ 1 ] . querySelector ( 'span' ) . innerText = tooltip . join ( '\n' ) ;
262+
244263 // update icon and button
245- if ( charTest && parTest ) {
264+ if ( charTest && parTest && validExpression ) {
246265 button . disabled = false ;
247266 showIcon ( 0 ) ;
248267 } else {
@@ -254,12 +273,5 @@ function checkErrors(event) {
254273 icons . forEach ( e => e . classList . add ( 'invisible' ) ) ;
255274 icons [ index ] . classList . remove ( 'invisible' ) ;
256275 }
257-
258- // update warning tooltip
259- var tooltip = [ ] ;
260- if ( ! charTest ) tooltip . push ( errors . char ) ;
261- if ( ! parTest ) tooltip . push ( errors . par ) ;
262- console . log ( tooltip )
263- icons [ 1 ] . querySelector ( 'span' ) . innerText = tooltip . join ( '\n' ) ;
264276}
265277
0 commit comments