Справица:Calculator.js — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
(Spravica za računanje matematičkih izraza sa zadatim unosom)
 
м (Dodaj upozorenja pri neuspelim evaluacijama izraza)
 
(Једна међуизмена истог корисника није приказана)
Ред 31: Ред 31:
     function resolveVariable(calc, variable) {
     function resolveVariable(calc, variable) {
         if (OPERATORS[variable]) {
         if (OPERATORS[variable]) {
        console.warn('[Calculator] Attempting to use operator', variable, 'as a variable');
             // You cannot name a variable the same as an operator.
             // You cannot name a variable the same as an operator.
             return null;
             return null;
Ред 36: Ред 37:
         var num = Number(variable);
         var num = Number(variable);
         if (!Number.isNaN(num)) {
         if (!Number.isNaN(num)) {
        // This is a constant.
             return num;
             return num;
         }
         }
         return variables[calc][variable];
         if (variables[calc] && typeof variables[calc][variable] === 'number') {
        // This is a variable.
        return variables[calc][variable];
        }
        console.warn('[Calculator] Variable', variable, 'undefined for calculator', calc);
     }
     }
     function updateCalculator($calc, id) {
     function updateCalculator($calc, id) {
        // TODO: Multiple expressions, which are also variables.
         $calc.find('[data-expression]').each(function(_, el) {
         $calc.find('[data-expression]').each(function(_, el) {
             var $result = $(el);
             var $result = $(el);
Ред 50: Ред 55:
                 if (OPERATORS[item]) {
                 if (OPERATORS[item]) {
                     if (SINGLE_OPERAND.includes(item)) {
                     if (SINGLE_OPERAND.includes(item)) {
                    if (stack.length < 1) {
                    console.warn('[Calculator] Popping from an empty stack during a unary operation!');
                    continue;
                    }
                         stack.push(OPERATORS[item](stack.pop()));
                         stack.push(OPERATORS[item](stack.pop()));
                     } else {
                     } else {
                    if (stack.length < 2) {
                    console.warn('[Calculator] Popping from an empty stack during a binary operation!');
                    continue;
                    }
                         var arg1 = stack.pop();
                         var arg1 = stack.pop();
                         var arg2 = stack.pop();
                         var arg2 = stack.pop();
Ред 59: Ред 72:
                     stack.push(resolveVariable(id, item));
                     stack.push(resolveVariable(id, item));
                 }
                 }
            }
            if (stack.length === 0) {
            console.warn('[Calculator] There is no result on the stack!');
            return;
            } else if (stack.length > 1) {
            console.warn('[Calculator] There are multiple results on the stack!');
             }
             }
             var result = stack.pop();
             var result = stack.pop();
Ред 70: Ред 89:
     function changedVariable(event) {
     function changedVariable(event) {
         var $var = $(event.target);
         var $var = $(event.target);
        var min = Number($var.attr('min'));
        var max = Number($var.attr('max'));
         var varName = $var.parent().attr('data-variable');
         var varName = $var.parent().attr('data-variable');
         var $calc = $var.closest('.calculator');
         var $calc = $var.closest('.calculator');
         var calc = Number($calc.attr('data-id'));
         var calc = Number($calc.attr('data-id'));
         variables[calc][varName] = Number($var.val().trim());
         var value = Number($var.val().trim());
        if (value < min) {
            value = min;
            $var.val(value);
        } else if (value > max) {
            value = max;
            $var.val(value);
        }
        variables[calc][varName] = value;
         updateCalculator($calc, calc);
         updateCalculator($calc, calc);
     }
     }

Тренутна верзија на датум 7. фебруар 2022. у 12:21

(function() {
    'use strict';
    var OPERATORS = {
        '+': function(a, b) {
            return a + b;
        },
        '-': function(a, b) {
            return a - b;
        },
        '*': function(a, b) {
            return a * b;
        },
        '/': function(a, b) {
            return a / b;
        },
        '%': function(a, b) {
            return a % b;
        },
        '^': function(a, b) {
            return Math.pow(a, b);
        },
        'max': Math.max,
        'min': Math.min,
        'floor': Math.floor,
        'ceil': Math.ceil,
        'round': Math.round
    };
    var SINGLE_OPERAND = ['floor', 'ceil', 'round'];
    var staticId = 0;
    var variables = {};
    function resolveVariable(calc, variable) {
        if (OPERATORS[variable]) {
        	console.warn('[Calculator] Attempting to use operator', variable, 'as a variable');
            // You cannot name a variable the same as an operator.
            return null;
        }
        var num = Number(variable);
        if (!Number.isNaN(num)) {
        	// This is a constant.
            return num;
        }
        if (variables[calc] && typeof variables[calc][variable] === 'number') {
        	// This is a variable.
        	return variables[calc][variable];
        }
        console.warn('[Calculator] Variable', variable, 'undefined for calculator', calc);
    }
    function updateCalculator($calc, id) {
        $calc.find('[data-expression]').each(function(_, el) {
            var $result = $(el);
            var stack = [];
            var expression = $result.attr('data-expression').split(' ').reverse();
            while (expression.length) {
                var item = expression.pop();
                if (OPERATORS[item]) {
                    if (SINGLE_OPERAND.includes(item)) {
                    	if (stack.length < 1) {
                    		console.warn('[Calculator] Popping from an empty stack during a unary operation!');
                    		continue;
                    	}
                        stack.push(OPERATORS[item](stack.pop()));
                    } else {
                    	if (stack.length < 2) {
                    		console.warn('[Calculator] Popping from an empty stack during a binary operation!');
                    		continue;
                    	}
                        var arg1 = stack.pop();
                        var arg2 = stack.pop();
                        stack.push(OPERATORS[item](arg2, arg1));
                    }
                } else {
                    stack.push(resolveVariable(id, item));
                }
            }
            if (stack.length === 0) {
            	console.warn('[Calculator] There is no result on the stack!');
            	return;
            } else if (stack.length > 1) {
            	console.warn('[Calculator] There are multiple results on the stack!');
            }
            var result = stack.pop();
            $result.text(result);
            var varName = $result.attr('data-variable');
            if (varName) {
                variables[id][varName] = result;
            }
        });
    }
    function changedVariable(event) {
        var $var = $(event.target);
        var min = Number($var.attr('min'));
        var max = Number($var.attr('max'));
        var varName = $var.parent().attr('data-variable');
        var $calc = $var.closest('.calculator');
        var calc = Number($calc.attr('data-id'));
        var value = Number($var.val().trim());
        if (value < min) {
            value = min;
            $var.val(value);
        } else if (value > max) {
            value = max;
            $var.val(value);
        }
        variables[calc][varName] = value;
        updateCalculator($calc, calc);
    }
    function hook($content) {
        $content.find('.calculator:not(.loaded)').each(function(_, el) {
            var $calc = $(el).addClass('loaded');
            var id = staticId++;
            variables[id] = {};
            $calc
                .attr('data-id', id)
                .find('[data-variable]')
                .each(function(__, el2) {
                    var $var = $(el2);
                    var varName = $var.attr('data-variable');
                    var defaultValue = $var.text().trim() || '0';
                    variables[id][varName] = Number(defaultValue);
                    if (Number.isNaN(variables[id][varName])) {
                        variables[id][varName] = 0;
                    }
                    if (!$var.attr('data-expression')) {
                        $var.html($('<input>', {
                            change: changedVariable,
                            max: $var.attr('data-max') || '100',
                            min: $var.attr('data-min') || '0',
                            step: $var.attr('data-step') || '0.001',
                            type: 'number',
                            value: defaultValue
                        }));
                    }
                });
            updateCalculator($calc, id);
        });
    }
    mw.hook('wikipage.content').add(hook);
})();