--[[-------------------------------------------------
Exec.lua
Version: 1.2.2
Author: HSolo, mozers™
---------------------------------------------------
Расчет выделенного текста как математического выражения
или открытие в браузере выделенного URL
http://forum.ru-board.com/topic.cgi?forum=5&topic=3215&start=2020#3
--]]-------------------------------------------------

local function FindExpression(str)
	local patternNum = "([\-\+\*\/%b()%s]*%d+[\.\,]*%d*[\)]*)"
	local startPos, endPos, number, formula
	startPos = 1
	formula = ''
	while true do
		startPos, endPos, number = str:find(patternNum, startPos) -- Находим числа, знаки, скобки (т.е. все что можно принять за часть формулы)
		if startPos == nil then break end
		startPos = endPos + 1
		number = number:gsub('%s+', '')                           -- Убираем пробелы
		number = number:gsub('^([\(%d]+)', '+%1')                 -- Там, где перед числом нет знака, ставим "+" (т.е. пробелы и переводы строк заменяются на "+")
		number = number:gsub('^([\)]+)([%d]+)', '%1+%2')          -- Добавляем знак "+" (при его отсутствии) между числом и скобкой
		formula = formula..number                                 -- Склеиваем вновь преобразованную строку
	end
	formula = formula:gsub('^[\+]', '')                      -- В самом начале получился лишний "+" - убиваем его
	formula = formula:gsub("[\,]+",'.')                      -- Не будем строги к символу - разделителю десятичных чисел :)
	formula = formula:gsub("([\+])([\+]+)",'%1')             -- Удаляем сдвоенные знаки (++) = (+)
	formula = formula:gsub("([\-])([\+]+)",'%1')             -- Удаляем сдвоенные знаки (-+) = (-)
	formula = formula:gsub("([\+\-\*\/])([\*\/]+)",'%1')     -- Удаляем сдвоенные знаки перед * и / т.к. это явный косяк
	formula = formula:gsub("([\+\-\*\/])([\*\/]+)",'%1')     -- Для успокоения совести проделаем дважды
	formula = formula:gsub("([%d\)]+)([\+\*\/\-])",'%1 %2 ') -- Разделяем группы пробелами
	return formula
end

local str = ''
if editor.Focus then
	str = editor:GetSelText()
else
	str = props['CurrentSelection']
end
if (str == '') then
	str = editor:GetCurLine()
end
if (#str < 3) then return end

if str:find('https?://(.*)') then
	shell.exec(str)
else
	if str:find("(math\.%w+)") then  -- В случае сложных математических выражений форматирование оставляем на пользователя
		str = str:gsub("[=]",'')
	else
		str = FindExpression(str)
	end
	local result = loadstring('return '..str)()

	print('-> '..scite.GetTranslation("Calculate Expression")..': '..str)
	print('>> '..scite.GetTranslation("Result")..': '..result)

	--[[ -------- insert result to text ------
	editor:LineEnd() 
	local sel_start = editor.SelectionStart + 1
	local sel_end = sel_start + string.len(result)
	editor:AddText('\n= '..result)
	editor:SetSel(sel_start, sel_end+2)
	--]] -------------------------------------
end

--[[-------------------------------------------------
Тесты типа :)
1/2 56/4 - 56 (8-6)*4  4,5*(1+2)    66
3/6 6.4/2 6  (7-6)*4  45/4.1 66

dmfdmk v15*6dmd.ks skm4.37/3d(k)gm/sk+d skdmg(6,7+6)skdmgk

Колбаса = 24.5кг. * 120руб./кг
Бензин(ABC) = (2500км. / (11,5л./100км.)) * 18.4руб./л + Канистра =100руб.
Штукатурка = 22.4 м2 /80руб./100 м2

http://scite.net.ru
--]]-------------------------------------------------
