Scite Inplace Calculator

lua-users home
wiki

A simple calculator based on the user formula. It requires luawin.dll. The formula is a string that includes "<>" as a place holder for the number.

Script to execute an existing formula

If there is a selection (line or rectangular selection), the operation will occur in the selection; otherwise, the next number to the right will be updated. It only supports very simple number format.

function executeFormula()
    editor:BeginUndoAction()
    if not formula or formula =="" then 
        print('Please set formula first by ALT+SHIFT+F.')
        return
    end

    local expr = editor:GetSelText()
    local ss = editor.CurrentPos
    local se = editor.Anchor  
    if not expr or expr == "" then
        ss, se = editor:findtext("\-*[0-9]+[.0-9]*", SCFIND_REGEXP, ss)
    end
    
    if ss > se then ss,se = se, ss end
    local cs, ce
    if editor.SelectionIsRectangle then
        cs = editor.Column[ss]
        ce = editor.Column[se] 
        -- print (cs..' '..ce)
    end
    -- print (ss..' '..se)
      
    for m in editor:match("\-*[0-9]+[.0-9]*", SCFIND_REGEXP, ss) do
        local c = m.pos
        if c > se then break end
          
        local width = m.len
        local col = editor.Column[c]
        local chFlag
        -- print(col .. ' ' ..width ..'|'..cs..' '..ce)
        if not editor.SelectionIsRectangle or 
            (col >= cs and (col + width -1) <= ce) then 
            chFlag = true
        else
            chFlag = false      
        end
          
         if chFlag then
            expr = m.text
            local pt = string.find(expr, '.', 1, true)
            local acc, fmt
            if pt then
                acc = width - pt
                if acc < 0 then acc = 0 end
                fmt = "%"..width.."."..acc.."f"
            else
                fmt = "%"..width.."i"
            end
            -- print (expr .. "|" .. fmt.."|"..pt)
            expr = string.gsub(formula, '<>', expr)
            local f, msg = loadstring("return "..expr)
            if f then
                m:replace(string.format(fmt, f()))
            else
                print(">Execute Formula: cannot evaluate the formula")
            end
        end
    end
    editor:EndUndoAction()
end
--JRN

Script to prompt for a formula and then execute the operation

It requires the luawin.dll to ask for a formula.

local formula
local Init =loadlib('C:\\Program Files\\Scintilla Text Editor\\luawin.dll', 'Init')
Init()

function setFormula()
    local flag, msg = win.InputBox('Formula: <> as the place holder. e.g. <>*10')
    if flag and string.find(msg,'<>',1,true) then
        formula = msg
    end
    
    if formula then msg = formula else msg = "NONE" end
    print("FORMULA: "..msg)
    
    executeFormula()
end
--JRN
RecentChanges · preferences
edit · history
Last edited August 31, 2006 6:32 pm GMT (diff)