diff --git a/README.md b/README.md index 09f268a..a74a8e7 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,12 @@ # LuaComp -A general purpose Lua preprocessor and minifier. +A general purpose preprocessor and postprocessor written in Lua. ## Building -To build, either execute `luapreproc` or `luacomp` on src/init.lua - -### luapreproc -Execute `luapreproc init.lua ../luacomp.lua` - -### luacomp -Execute `luacomp init.lua -xO ../luacomp.lua` - -***NOTE***: Do not use a minifier, it breaks argparse! +See manual/README.md ## How-To -### Merging Lua source files +### Merging source files ```lua -- myfile.lua local my_lib = {} diff --git a/examples/error.lua b/examples/error.lua new file mode 100644 index 0000000..b0cbf8d --- /dev/null +++ b/examples/error.lua @@ -0,0 +1,2 @@ +--#error "What a scam" +print("I never get printed.") \ No newline at end of file diff --git a/manual/README.md b/manual/README.md new file mode 100644 index 0000000..6084620 --- /dev/null +++ b/manual/README.md @@ -0,0 +1,120 @@ +# Building + +## Luapreproc +```sh +git clone https://github.com/Adorable-Catgirl/LuaComp.git +cd LuaComp +luapreproc src/init.lua /tmp/luacomp.part +echo "#!/usr/bin/env lua5.3" | cat - /tmp/luacomp.part > ~/bin/luacomp +chmod +x ~/bin/luacomp +``` + +## LuaComp +```sh +git clone https://github.com/Adorable-Catgirl/LuaComp.git +cd LuaComp +luacomp -xlua5.3 -mluamin -O ~/bin/luacomp src/init.lua +chmod +x ~/bin/luacomp +``` + +## By hand +Ha, no. + +# Usage +`luacomp -h` outputs: +``` +Usage: /tmp/luacomp [-h] [-O ] [-m ] + [--generator-code] [--verbose] [--post-processors] + [--directives] [-v] [-x []] + +LuaComp v1.2.0 +A preprocessor+postprocessor written in Lua. + +Arguments: + input Input file (- for STDIN) + +Options: + -h, --help Show this help message and exit. + -O , Output file. (- for STDOUT) (default: -) + --output + -m , + --minifier + Sets the minifier (default: none) + -x [], + --executable [] + Makes the script an executable (default: current lua version) + --generator-code Outputs only the code from the generator. + --verbose Verbose output. (Debugging) + --post-processors Lists postprocessors + --directives Lists directives + -v, --version Prints the version and exits +``` +# Directives +LuaComp currently ships with four built-in directives. More directives can be installed at `/usr/share/luacomp/directives` and `~/.local/share/luacomp/directives`. + +## include +Usage: `--#include "path"` +Include tells the preprocessor to include the file specified. The file included will also be preprocessed. + +## define +Usage `--#define "var" "value"` +Defines the env var for this session. + +## error +Usage `--#error "text"` +Throws an error and stops the preprocessor. + +## loadmod +**Note**: Depreciated, use the directive dirs. +Usage `--#loadmod "lua_file.lua"` +Loads a directive module. Don't use this. I just don't want to have to bump the major version number. + +# Postprocessors +LuaComp currently ships with built-in support for three postprocessors. More can be installed at `/usr/share/luacomp/postproc` and `~/.local/share/luacomp/postproc` + +## luamin +Language: Lua 5.1 to 5.3 +Minifies Lua. + +## uglify +Language: JavaScript +Minifies JS. Options are `--compress --mangle`. + +## bython(2) +Language: Bython (Python 3.x and 2.x) +Turns Bython into Python. + +# Syntax +The syntax was made for Lua, but it works well enough for some other languages. + +## Directives +Syntax: `--#directive "arguments"` + +## Lua code +Syntax: `@[[ code ]]` +Note that this can be used for macros. +See examples/macro.lua. + +## Lua variable +Syntax: `@[{ variable }]` +Puts the value of the variable in the code + +## Quoted shell variables +Syntax: `$(var)` +Puts the value of the variable in the code, quoted. + +## Unquoted shell variables +Syntax: `$[{var}]` +Puts the value of the variable in the code, not quoted. + +## Shell output +Syntax: `$[[code]]` +Puts the stdout of the script in the code. Note that you can't set variables from the shell script. + +# Debugging + +## Generator code +To output the code the generator executes, add the `--generator-code` flag. + +## Debug messages +To output debug messages, add the `--verbose` flag. \ No newline at end of file diff --git a/src/application.lua b/src/application.lua index 84a09c0..10ec2b3 100644 --- a/src/application.lua +++ b/src/application.lua @@ -15,13 +15,15 @@ end --#include "src/directive_provider.lua" --#include "src/cfg/minifier_providers.lua" -local parser = argparse(arg[0], "LuaComp v"..LUACOMP_VERSION.."\nA Lua preprocessor+postprocessor.") +local parser = argparse(arg[0], "LuaComp v"..LUACOMP_VERSION.."\nA preprocessor+postprocessor written in Lua.") parser:argument("input", "Input file (- for STDIN)") parser:option("-O --output", "Output file. (- for STDOUT)", "-") -parser:option("-m --minifier", "Sets the minifier", "none") +parser:option("-m --minifier", "Sets the postprocessor", "none") parser:option("-x --executable", "Makes the script an executable (default: current lua version)"):args "?" parser:flag("--generator-code", "Outputs only the code from the generator.") parser:flag("--verbose", "Verbose output. (Debugging)"):action(function() VERBOSE=true end) +parser:flag("--post-processors", "Lists postprocessors"):action(function() preload_providers() for k, v in pairs(providers) do print(k) end os.exit(0) end) +parser:flag("--directives", "Lists directives"):action(function() preload_directives() for k, v in pairs(directives) do print(k) end os.exit(0) end) parser:flag("-v --version", "Prints the version and exits"):action(function() print(LUACOMP_VERSION) os.exit(0) @@ -47,14 +49,14 @@ local ocode = generate(ast, args.generator_code) local minifier = providers[args.minifier] dprint("Minifier: "..args.minifier, minifier) if not minifier then - io.stderr:write("ERROR: Minifier `"..args.minifier.."' not found!\n") + io.stderr:write("ERROR: Postprocessor `"..args.minifier.."' not found!\n") os.exit(1) end dprint("Running...") local rcode, err = minifier(ocode) if (not rcode) then - io.stderr:write("ERROR: Error for minifier `"..args.minifier.."': \n") + io.stderr:write("ERROR: Error for postprocessor `"..args.minifier.."': \n") io.stderr:write(err) os.exit(1) end diff --git a/src/cfg/directive_providers.lua b/src/cfg/directive_providers.lua new file mode 100644 index 0000000..33c8726 --- /dev/null +++ b/src/cfg/directive_providers.lua @@ -0,0 +1,4 @@ +local directive_paths = { + "/usr/share/luacomp/directives", + os.getenv("HOME").."/.local/share/luacomp/directives" +} \ No newline at end of file diff --git a/src/cfg/minifier_providers.lua b/src/cfg/minifier_providers.lua index 1c03c45..a4172ca 100644 --- a/src/cfg/minifier_providers.lua +++ b/src/cfg/minifier_providers.lua @@ -16,6 +16,11 @@ limitations under the License. ]] +local postproc_paths = { + "/usr/share/luacomp/postproc", + os.getenv("HOME").."/.local/share/luacomp/postproc" +} + local providers = {} function providers.luamin(cin) @@ -92,4 +97,27 @@ end function providers.none(cin) return cin +end + +setmetatable(providers, {__index=function(t, i) + for i=1, #postproc_paths do + if (os.execute("stat "..postproc_paths[i].."/"..i..".lua 1>/dev/null 2>&1")) then + providers[i] = loadfile(postproc_paths[i].."/"..i..".lua")() + return providers[i] + end + end +end}) + +local function preload_providers() + --Do this in the best way possible + for i=1, #postproc_paths do + if (os.execute("stat "..postproc_paths[i].."1>/dev/null 2>&1")) then + local fh = io.popen("ls "..postproc_paths[i], "r") + for line in fh:lines() do + if (line:match("%.lua$")) then + providers[line:sub(1, #line-4)] = loadfile(postproc_paths[i].."/"..line)() + end + end + end + end end \ No newline at end of file diff --git a/src/directive_provider.lua b/src/directive_provider.lua index 3dcbec2..08fc285 100644 --- a/src/directive_provider.lua +++ b/src/directive_provider.lua @@ -16,7 +16,31 @@ limitations under the License. ]] +--#include "src/cfg/directive_providers.lua" --#include "src/directives/define.lua" --#include "src/directives/include.lua" --#include "src/directives/loadmod.lua" --#include "src/directives/error.lua" + +setmetatable(directives, {__index=function(t, i) + for i=1, #directive_paths do + if (os.execute("stat "..directive_paths[i].."/"..i..".lua 1>/dev/null 2>&1")) then + directives[i] = loadfile(directive_paths[i].."/"..i..".lua")() + return directives[i] + end + end +end}) + +local function preload_directives() + --Do this in the best way possible + for i=1, #directive_paths do + if (os.execute("stat "..directive_paths[i].." 1>/dev/null 2>&1")) then + local fh = io.popen("ls "..directive_paths[i], "r") + for line in fh:lines() do + if (line:match("%.lua$")) then + directives[line:sub(1, #line-4)] = loadfile(directive_paths[i].."/"..line)() + end + end + end + end +end \ No newline at end of file diff --git a/src/directives/loadmod.lua b/src/directives/loadmod.lua index d3eaaab..7fa74f4 100644 --- a/src/directives/loadmod.lua +++ b/src/directives/loadmod.lua @@ -1,7 +1,7 @@ local warned = false function directives.loadmod(env, mod) if not warned then - io.stderr:write("Warning: loadmod is depreciated and unsafe. The API differs from luapreproc.\n") + io.stderr:write("Warning: loadmod is depreciated and unsafe. The API differs from luapreproc. Use the include paths!\n") warned = true end if (not os.execute("stat "..file..">/dev/null")) then