Compare commits
2 Commits
8598e9ff57
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| cc8cce8787 | |||
| 990aee8168 |
22
luash
22
luash
@@ -223,11 +223,31 @@ function start_repl()
|
||||
end
|
||||
|
||||
-- 1. Check for an input file or REPL mode
|
||||
local debug_mode = false -- legacy alias for highlight compile
|
||||
local compile_mode = false
|
||||
local highlight_mode = false
|
||||
local filename = arg[1]
|
||||
if filename == "-d" or filename == "--debug" then
|
||||
debug_mode = true
|
||||
compile_mode = false
|
||||
highlight_mode = true
|
||||
filename = arg[2]
|
||||
elseif filename == "-c" or filename == "--compile" then
|
||||
compile_mode = true
|
||||
highlight_mode = false
|
||||
filename = arg[2]
|
||||
elseif filename == "-C" or filename == "--compile-highlight" then
|
||||
compile_mode = true
|
||||
highlight_mode = true
|
||||
filename = arg[2]
|
||||
end
|
||||
|
||||
if filename == "-h" or filename == "--help" then
|
||||
print("Usage: luash <script.luash>")
|
||||
print(" luash -i # Interactive mode")
|
||||
print(" luash -c <file> # COMPILE MODE: print Lua and exit (no colors)")
|
||||
print(" luash -C <file> # COMPILE MODE: print Lua with highlighting and exit")
|
||||
print(" luash -d <file> # Print generated Lua (highlighted) then run")
|
||||
print(" luash -h # Show this help")
|
||||
return
|
||||
elseif not filename or filename == "-i" or filename == "--interactive" then
|
||||
@@ -236,5 +256,5 @@ elseif not filename or filename == "-i" or filename == "--interactive" then
|
||||
end
|
||||
-- Delegate to runner for file execution
|
||||
local runner = require('runner')
|
||||
runner.run_file(filename)
|
||||
runner.run_file(filename, { debug = debug_mode, compile = compile_mode, highlight = highlight_mode })
|
||||
|
||||
|
||||
22
src/main.lua
22
src/main.lua
@@ -3,10 +3,30 @@ local runner = require('runner')
|
||||
local M = {}
|
||||
|
||||
function M.run(argv)
|
||||
local debug_mode = false -- legacy: maps to compile-highlight
|
||||
local compile_mode = false
|
||||
local highlight_mode = false
|
||||
local filename = argv[1]
|
||||
if filename == "-d" or filename == "--debug" then
|
||||
debug_mode = true
|
||||
highlight_mode = true
|
||||
compile_mode = false
|
||||
filename = argv[2]
|
||||
elseif filename == "-c" or filename == "--compile" then
|
||||
compile_mode = true
|
||||
highlight_mode = false
|
||||
filename = argv[2]
|
||||
elseif filename == "-C" or filename == "--compile-highlight" then
|
||||
compile_mode = true
|
||||
highlight_mode = true
|
||||
filename = argv[2]
|
||||
end
|
||||
if filename == "-h" or filename == "--help" then
|
||||
print("Usage: luash <script.luash>")
|
||||
print(" luash -i # Interactive mode")
|
||||
print(" luash -c <file> # COMPILE MODE: print Lua and exit (no colors)")
|
||||
print(" luash -C <file> # COMPILE MODE: print Lua with highlighting and exit")
|
||||
print(" luash -d <file> # Print generated Lua (highlighted) then run")
|
||||
print(" luash -h # Show this help")
|
||||
return
|
||||
elseif not filename or filename == "-i" or filename == "--interactive" then
|
||||
@@ -26,7 +46,7 @@ function M.run(argv)
|
||||
entry.start(preprocess_luash_repl, load_injected_lib)
|
||||
return
|
||||
else
|
||||
runner.run_file(filename)
|
||||
runner.run_file(filename, { debug = debug_mode, compile = compile_mode, highlight = highlight_mode })
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -49,7 +49,10 @@ local function detect_tty() return util.is_tty() end
|
||||
local line
|
||||
if raw_mode_enabled then
|
||||
line = raw_read_line(prompt)
|
||||
if line == "__CTRL_C__" then print("\nInterrupted (Ctrl+C)"); break end
|
||||
if line == "__CTRL_C__" then
|
||||
io.write("\r\27[K")
|
||||
goto continue
|
||||
end
|
||||
else
|
||||
io.write(prompt); io.flush()
|
||||
local ok, l = pcall(io.read, "*line")
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
local preprocess = require('preprocess')
|
||||
local injected = require('injected')
|
||||
local util = require('util')
|
||||
|
||||
local M = {}
|
||||
|
||||
function M.run_file(filename)
|
||||
function M.run_file(filename, opts)
|
||||
local file = io.open(filename, "r")
|
||||
if not file then
|
||||
print("Error: Cannot open file '" .. filename .. "'")
|
||||
@@ -20,6 +21,62 @@ function M.run_file(filename)
|
||||
-- Load injected helpers into global scope (not prepended to source)
|
||||
injected.load()
|
||||
|
||||
-- Optional compile output of generated Lua
|
||||
local dbg_env = os.getenv("LUASH_DEBUG")
|
||||
local dbg_flag = opts and opts.debug == true
|
||||
local compile_flag = opts and opts.compile == true
|
||||
local highlight_flag = opts and opts.highlight == true
|
||||
if dbg_flag or compile_flag or (dbg_env == "1" or dbg_env == "true" or dbg_env == "yes") then
|
||||
-- If env var triggered, prefer highlighting
|
||||
if not highlight_flag and (dbg_flag or (dbg_env == "1" or dbg_env == "true" or dbg_env == "yes")) then
|
||||
highlight_flag = true
|
||||
end
|
||||
-- Try to read injected library source for holistic view
|
||||
local injected_src = nil
|
||||
do
|
||||
local base = debug.getinfo(1, "S").source:match("@(.*/)") or "./"
|
||||
base = base:gsub("/src/?$", "/")
|
||||
local lib_path = base .. "src/lib/injected_lib.lua"
|
||||
local f = io.open(lib_path, "r")
|
||||
if f then
|
||||
injected_src = f:read("*a")
|
||||
f:close()
|
||||
end
|
||||
end
|
||||
if injected_src and injected_src ~= "" then
|
||||
print("--- Luash COMPILE MODE: injected library ---")
|
||||
if highlight_flag then
|
||||
local highlighted_inj = util.highlight_lua_ansi(injected_src)
|
||||
if highlighted_inj then
|
||||
io.write(highlighted_inj)
|
||||
if not highlighted_inj:match("\n$") then io.write("\n") end
|
||||
else
|
||||
print(injected_src)
|
||||
end
|
||||
else
|
||||
print(injected_src)
|
||||
end
|
||||
print("--- end injected library ---")
|
||||
end
|
||||
|
||||
print("--- Luash COMPILE MODE: generated Lua (" .. filename .. ") ---")
|
||||
if highlight_flag then
|
||||
local highlighted = util.highlight_lua_ansi(source_code)
|
||||
if highlighted then
|
||||
io.write(highlighted)
|
||||
if not highlighted:match("\n$") then io.write("\n") end
|
||||
else
|
||||
print(source_code)
|
||||
end
|
||||
else
|
||||
print(source_code)
|
||||
end
|
||||
print("--- end generated Lua ---")
|
||||
|
||||
-- Only skip execution in explicit compile mode
|
||||
if compile_flag then return end
|
||||
end
|
||||
|
||||
-- Execute
|
||||
local func, err = load(source_code, "@" .. filename)
|
||||
if not func then
|
||||
|
||||
28
src/util.lua
28
src/util.lua
@@ -10,6 +10,12 @@ function M.is_tty()
|
||||
return r == true
|
||||
end
|
||||
|
||||
function M.is_stdout_tty()
|
||||
local r = os.execute("test -t 1 >/dev/null 2>&1")
|
||||
if type(r) == "number" then return r == 0 end
|
||||
return r == true
|
||||
end
|
||||
|
||||
function M.set_raw_mode(enable)
|
||||
if enable then
|
||||
os.execute("stty -echo -icanon -isig min 1 time 0")
|
||||
@@ -18,6 +24,28 @@ function M.set_raw_mode(enable)
|
||||
end
|
||||
end
|
||||
|
||||
function M.has_command(cmd)
|
||||
local r = os.execute("command -v " .. cmd .. " >/dev/null 2>&1")
|
||||
if type(r) == "number" then return r == 0 end
|
||||
return r == true
|
||||
end
|
||||
|
||||
function M.highlight_lua_ansi(code)
|
||||
if not M.has_command("highlight") then return nil end
|
||||
local tmpin = os.tmpname()
|
||||
local f = io.open(tmpin, "w")
|
||||
if not f then return nil end
|
||||
f:write(code)
|
||||
f:close()
|
||||
local handle = io.popen("highlight -O ansi -S lua " .. tmpin .. " 2>/dev/null")
|
||||
if not handle then os.remove(tmpin); return nil end
|
||||
local out = handle:read("*a") or ""
|
||||
handle:close()
|
||||
os.remove(tmpin)
|
||||
if out == "" then return nil end
|
||||
return out
|
||||
end
|
||||
|
||||
function M.script_dir()
|
||||
return (debug.getinfo(2, "S").source:match("@(.*/)") or "./")
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user