JSONedit: Lua

JSONedit has built-in Lua script engine, working in similar way as in tSIP softphone.

Lua is extended with following commands:

ShowMessage(text)
display standard modal Win32 message with specified text and "OK" button
InputQuery
direct equivalent of VCL function with the same name, displays modal dialog allowing to take text input from the user
  local caption = "Some dialog caption"
  local prompt = "Some dialog prompt"
  local defaultText = "Default text"
  local text, isAccepted = InputQuery(caption, prompt, defaultText)
  if isAccepted then
  	ShowMessage("Dialog accepted, text = " .. text)
  else
  	ShowMessage("Dialog was not accepted")
  end  
  
Sleep(ms)
pause execution for specified time in miliseconds; not recommended as UI is blocked but can be used in combination with Beep() to create audible feedback
text = GetClipboardText()
text from system clipboard
SetClipboardText(text)
set text in system clipboard
ret = ForceDirectories(dir)
Create directory structure if it does not exist; returns 0 on success
srcType, srcTypeIsSet = GetExecSourceType()
check what type of event was caused script execution; for script assigned to button srcType would be equal to 0, see ScriptExec.h for full list of event types
srcId, srcIdIsSet = GetExecSourceId()
get additional info for execution origin; depending on execution source
filename = GetExeName()
get application executable name with full path
CheckBreak
check if script was interrupted by the user, intended to be called periodically in loop
AddNodeAsSibling(json)
add new json node
SetJsonAsRoot(json)
load text as JSON
text = GetJson()
get current document as text from editor
filename = GetCurrentFileName()
get name of file currently edited

Few additional functions - equivalent to WinAPI functions with same names - were grouped into "jsonedit_winapi" module.

hWnd = FindWindow(className, windowName)
finds handle to window, see WinAPI
SendMessage(hWnd, msg, wParam, lParam)
sends message to window with specified handle, see WinAPI
Beep(frequency, time)
generate sound through PC speaker or (on 64-bit Windows) default sound output
ret = MessageBox(message, title, flags)
standard WinAPI dialog
      MessageBox("message with just [OK] button", "message title", 0)
      MessageBox("message with ICON_INFORMATION", "message title", 64)
      local res = MessageBox("message with MB_YESNO and question icon", "message title", 4+32)
      if res == 6 then
      	ShowMessage("\"Yes\" was pressed")
      else
      	ShowMessage("Result is other than \"Yes\"")
      end  
      
ret = ShellExecute(verb, file, parameters, directory)
execute another application
Example:
local winapi = require("jsonedit_winapi")
local hWnd = winapi.FindWindow(nil, "Opera Video Cache Player")
if hWnd ~= 0 then
	-- 16 = WM_CLOSE
	print("Sending WM_CLOSE\n")
	winapi.SendMessage(hWnd, 16, 0, 0) 
else
	print("Window not found\n")
end

Functions that allow passing data between different scripts or from one script execution to another are worth special mention. As scripts are running in GUI thread context they are intented to run to completion in short time (i.e. use of Sleep() should be limited even if it does not block GUI message processing) and they are mostly uninterruptible. As some uses require keeping some state data (e.g. original call target that was replaced in case of SIP originate function) following function were added:

SetVariable("name", "value")
set text "value" for variable with specified "name" (variables are holding text and are indexed by text)
value, isset = GetVariable("name")
read back variable value; function returns two variables (Lua can do this) and if variable was not set before then isset equals 0
ClearVariable("name")
"unset" variable (remove "name" from variables map)
ClearAllVariables()
clear ("unset") all variables

Back to JSONedit.