63 lines
2.0 KiB
Lua
63 lines
2.0 KiB
Lua
-- name = "Калькулятор"
|
||
-- description = "Работает с математическими, строковыми и логическими операторами и функциями"
|
||
-- type = "widget"
|
||
-- author = "Andrey Gavrilov"
|
||
-- version = "1.0"
|
||
|
||
local maths = {"abs", "acos", "asin", "atan", "ceil", "cos", "cos", "deg", "exp", "floor", "fmod", "frexp", "huge", "ldexp", "log", "max", "min", "modf", "pi", "pow", "rad", "random", "sin", "sqrt", "tan"}
|
||
local strings = {"byte", "char", "dump", "find", "format", "len", "lower", "match", "rep", "reverse", "sub", "upper"}
|
||
local types = {"nil", "function", "table", "userdata", "thread"}
|
||
|
||
function on_alarm()
|
||
ui:show_text("Введите выражение")
|
||
end
|
||
|
||
function on_click()
|
||
ui:show_edit_dialog("Введите выражение")
|
||
end
|
||
|
||
function on_dialog_action(text)
|
||
if text == "" or text == -1 then
|
||
on_alarm()
|
||
else
|
||
ui:show_text("Результат: "..calculate_string(text))
|
||
end
|
||
end
|
||
|
||
function calculate_string(text)
|
||
local str = format_str(text)
|
||
local f = load("return "..str)
|
||
local status, result = pcall(f)
|
||
if get_index(types, type(result)) > 0 or not status then
|
||
result = "неопределён"
|
||
else
|
||
result = tostring(result)
|
||
system:copy_to_clipboard(result)
|
||
end
|
||
return result
|
||
end
|
||
|
||
function format_str(text)
|
||
text = text:gsub("pi", "math.pi")
|
||
text = text:gsub("π", "math.pi")
|
||
text = text:gsub("math%.math", "math")
|
||
local pattern = "(√) ?(%d+%.?%d*)"
|
||
local oper, first = text:match(pattern)
|
||
if oper == "√" then
|
||
return "math.sqrt("..first..")"
|
||
end
|
||
local pattern = "(%d+%.?%d*) ?([+-*/%^]) ?(%d+%.?%d*)"
|
||
local first, oper, last = text:match(pattern)
|
||
if oper == "^" then
|
||
return "math.pow("..first..", "..last..")"
|
||
end
|
||
func = text:match("^%a+")
|
||
if get_index(maths, func) > 0 then
|
||
return "math."..text
|
||
end
|
||
if get_index(strings, func) > 0 then
|
||
return "string.".. text
|
||
end
|
||
return text
|
||
end
|