Module:Module sandbox
Appearance
local p = {}
-- Get the display formula for the calculator
local function getDisplay()
return 'iffinite(ifzero(displayY,x,y),ifzero(displayY,x,y),nan)'
end
-- Create button logic for numbers
local function pressNumber(n)
return {
{'x', 'ifequal(decimal,0,not(displayY)*x*10+(ifpositive(not(displayY)*x,1,-1))*' .. n .. ',x+(ifpositive(x,1,-1))*(' .. n .. '/pow(10,decimal)))'},
{'decimal', 'ifzero(decimal,0,decimal+1)'},
{'y', 'ifzero(equalFlag,y,0)'},
{'op', 'ifzero(equalFlag,op,0)'},
{'equalFlag', 0},
{'displayY', '0'}
}
end
-- Handle special operations
local function compute(op)
return {
{'x', 'ifequal(percentFlag, 1, x*y/100, x)'},
{'y', 'switch(op,0,x+y,1,y-x,2,x*y,3,y/x,4,sqrt(x),5,pow(x,y),6,log(x),7,sin(x),8,cos(x),9,tan(x))'},
{'decimal', '0'},
{'displayY', '1'},
{'percentFlag', 0},
{'op', tostring(op)},
{'equalFlag', 0}
}
end
-- Handle the "=" button
local function computeEqual()
return {
{'x', 'ifequal(percentFlag, 1, x*y/100, x)'},
{'y', 'switch(op,0,x+y,1,y-x,2,x*y,3,y/x,4,sqrt(x),5,pow(x,y),6,log(x),7,sin(x),8,cos(x),9,tan(x))'},
{'decimal', '0'},
{'displayY', '1'},
{'percentFlag', 0},
{'equalFlag', 1}
}
end
-- Button for clearing all fields
local function getClear()
return {
{'x', '0'},
{'y', '0'},
{'op', '0'},
{'decimal', '0'},
{'percentFlag', '0'},
{'equalFlag', '0'},
{'displayY', '0'}
}
end
-- Generate the calculator widget
function p.getWidget(frame)
local buttons = {
{"C", getClear()},
{"±", {{'x', '0-x'}}},
{"%", {{'percentFlag', '1'}}},
{"√", compute(4)},
{"7", pressNumber(7)},
{"8", pressNumber(8)},
{"9", pressNumber(9)},
{"÷", compute(3)},
{"4", pressNumber(4)},
{"5", pressNumber(5)},
{"6", pressNumber(6)},
{"×", compute(2)},
{"1", pressNumber(1)},
{"2", pressNumber(2)},
{"3", pressNumber(3)},
{"−", compute(1)},
{"0", pressNumber(0)},
{".", {{'decimal', 'ifequal(decimal,0,1,decimal)'}}},
{"=", computeEqual()},
{"+", compute(0)},
{"xʸ", compute(5)},
{"log", compute(6)},
{"sin", compute(7)},
{"cos", compute(8)},
{"tan", compute(9)}
}
-- Create calculator layout
local calc = '<div class="calculatorwidget calculator-container" style="display:grid;grid-template-columns:repeat(5, 1fr);grid-gap:5px;min-width:320px;width:25ch;border:thin solid gray;padding: 5px;">'
calc = calc .. '<div style="grid-column:1/6;text-align:right;font-weight:bold;">'
calc = calc .. '{{Calculator codex text|default=0|id=ans|formula=' .. getDisplay() .. '|readonly=1|NaN-text=Error}}</div>'
for _, button in ipairs(buttons) do
calc = calc .. '{{calculator button|type=default|weight=normal|for='
local forVars, formulas = '', ''
for _, var in ipairs(button[2]) do
forVars = forVars .. ';' .. var[1]
formulas = formulas .. ';' .. var[2]
end
calc = calc .. string.sub(forVars, 2) .. '|formula=' .. string.sub(formulas, 2) .. '|contents=' .. button[1] .. '}}'
end
calc = calc .. '{{calculator|type=hidden|id=x|default=0}}'
calc = calc .. '{{calculator|type=hidden|id=y|default=0}}'
calc = calc .. '{{calculator|type=hidden|id=op|default=0}}'
calc = calc .. '{{calculator|type=hidden|id=decimal|default=0}}'
calc = calc .. '{{calculator|type=hidden|id=percentFlag|default=0}}'
calc = calc .. '{{calculator|type=hidden|id=equalFlag|default=0}}'
calc = calc .. '</div>'
return frame:preprocess(calc)
end
return p