This commit is contained in:
Er2 2022-05-04 04:48:42 +03:00
commit 8d306ab690
14 changed files with 703 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
build.lua

12
config.lua Normal file
View File

@ -0,0 +1,12 @@
return {
entry = 'main.lua',
output = {
name = 'build.lua'
},
plug = {
--require 'plug.switch' {},
require 'plug.arrow' {},
require 'plug.assigns' {},
require 'plug.num' {},
},
}

14
examples/config.lua Normal file
View File

@ -0,0 +1,14 @@
return {
entry = {
'main.lua',
},
output = {
name = '$hash.lua'
},
plug = {
--require 'plug.switch' {},
require 'plug.arrow' {},
require 'plug.assigns' {},
require 'plug.num' {},
},
}

29
examples/main.lua Normal file
View File

@ -0,0 +1,29 @@
local main = () ==>
emp = () =>
add = (a, b) => a + b
local a, b = 5, 8
add(a, b)
a += 0x10_10
--[[
switch(a) {
5, 8 => error 'cant',
300 => error 'trahtarista'
(() =>)()
,
_ => print 'can',
}
--]]
print 'hello world'
<==
main()
{
tst = true
}

BIN
img/luapack.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

104
img/luapack.svg Normal file
View File

@ -0,0 +1,104 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 14.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 43363) -->
<svg
version="1.0"
id="Ebene_1"
x="0px"
y="0px"
width="947px"
height="947px"
viewBox="0 0 947 947"
enable-background="new 0 0 947 947"
xml:space="preserve"
sodipodi:docname="luapack.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
inkscape:export-filename="/home/er2/Desktop/luapack.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs23"><inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 473.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="909.38991 : 908.67343 : 1"
inkscape:persp3d-origin="473.5 : 315.66667 : 1"
id="perspective1468" /></defs><sodipodi:namedview
id="namedview21"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="0.32"
inkscape:cx="512.5"
inkscape:cy="825"
inkscape:window-width="1920"
inkscape:window-height="1007"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g18" />
<path
id="rect1651-6"
style="display:inline;fill:#002a5f;fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-miterlimit:0;stroke-dasharray:none"
d="m 0,420 473,256 v 0 L 947,420 473,164 Z"
sodipodi:nodetypes="cccccc"
inkscape:label="boxc" /><path
id="rect7503"
style="display:inline;fill:#003b80;fill-opacity:1;stroke:#4646d7;stroke-width:8;stroke-linecap:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1"
d="M 186.55273,0 0,103.54688 V 420 L 473,164 Z M 760.44727,0 473,164 947,420 V 103.54688 Z"
sodipodi:nodetypes="cccccccccc"
inkscape:label="boxb" /><g
id="g18"
style="display:inline"
inkscape:label="logo">
<path
fill="#000080"
d="m 835.5,473.6 c 0,-199.8 -162.2,-362 -362,-362 -199.8,0 -362,162.2 -362,362 0,199.8 162.2,362 362,362 199.8,0 362,-162.2 362,-362"
id="path2"
style="display:inline" />
<path
fill="#ffffff"
d="m 729.5,323.6 c 0,-58.5 -47.5,-106 -106,-106 -58.5,0 -106,47.5 -106,106 0,58.5 47.5,106 106,106 58.5,0 106,-47.5 106,-106"
id="path4"
style="display:inline" />
<path
fill="#000080"
d="m 941.5,111.5 c 0,-58.5 -47.5,-106 -106,-106 -58.5,0 -106,47.5 -106,106 0,58.5 47.5,106 106,106 58.5,0 106,-47.4 106,-106"
id="path6"
style="display:inline" />
<path
fill="none"
stroke="#808080"
stroke-width="10.8612"
stroke-miterlimit="10"
stroke-dasharray="40.8475"
d="m 890.6,261 c 33.5,65.8 51,138.6 51,212.5 0,258.4 -209.7,468.1 -468.1,468.1 C 215.1,941.6 5.4,731.9 5.4,473.5 5.4,215.1 215.1,5.4 473.5,5.4 c 83.1,0 164.6,22.1 236.2,63.9"
id="path16" />
</g><path
id="rect1651"
style="display:inline;fill:#003b80;fill-opacity:1;stroke:#4646d7;stroke-width:8;stroke-linecap:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1"
d="M 0,420 V 947 H 473.49454 L 473,676 Z"
sodipodi:nodetypes="ccccc"
inkscape:label="boxtl" /><path
id="path8"
style="fill:#ffffff;stroke-width:0.822633"
d="M 23.675681,674.91644 V 870.29109 H 145.09508 V 848.32826 H 48.601807 V 674.91644 Z m 350.276829,50.92133 c -20.4013,0 -37.265,5.92205 -46.64302,16.36949 -6.41654,7.23917 -9.04988,15.30195 -9.62573,29.20444 h 22.54003 c 1.89206,-17.19302 12.094,-24.92612 32.98888,-24.92612 20.07225,0 31.34064,7.48682 31.34064,20.89574 v 5.92261 c 0,9.37801 -5.59324,13.4075 -23.27986,15.54635 -31.58911,4.03091 -36.44334,5.10158 -44.99873,8.55664 -16.3704,6.66332 -24.67819,19.24872 -24.67819,37.51117 0,25.50163 17.68697,41.54354 46.06781,41.54354 17.68661,0 31.91754,-6.16946 47.71211,-20.6478 1.563,14.23156 8.55555,20.6478 23.0339,20.6478 4.60674,0 8.06123,-0.49405 15.3004,-2.38611 v -16.86335 c -2.4679,0.57583 -3.53732,0.57519 -4.85352,0.57519 -7.81502,0 -12.09116,-4.02969 -12.09116,-11.02206 v -82.59321 c 0,-24.92579 -18.26297,-38.33432 -52.81356,-38.33432 z m -205.24634,4.0304 v 108.25916 c 0,23.36277 17.43938,38.3343 44.7508,38.3343 20.6481,0 33.72684,-7.24001 46.88897,-25.74927 v 19.57873 h 20.0726 V 729.86817 h -22.21077 v 79.63189 c 0,28.7099 -15.05379,47.46417 -38.33431,47.46417 -17.68661,0 -28.9565,-10.77552 -28.9565,-27.63949 v -99.45657 z m 235.84714,70.99393 v 25.17208 c 0,7.56823 -2.22058,12.09195 -8.88392,18.26169 -9.13123,8.3086 -20.07269,12.58705 -33.23483,12.58705 -17.43983,0 -27.6395,-8.30848 -27.6395,-22.54003 0,-14.72513 9.95367,-22.2942 33.81004,-25.74926 23.60957,-3.20827 28.46224,-4.27647 35.94821,-7.73153 z"
inkscape:label="lua" /><path
id="rect1651-3"
style="display:inline;fill:#003b80;fill-opacity:1;stroke:#4646d7;stroke-width:8;stroke-linecap:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1"
d="M 946,420 V 947 H 472.50546 L 473,676 Z"
sodipodi:nodetypes="ccccc"
inkscape:label="boxtr" /><path
id="path45551"
style="fill:#ffffff"
d="m 490.8125,747.75 c -4.2014,0.38195 -6.49305,2.6736 -6.875,6.875 v 114.58398 c 0.38195,4.2014 2.6736,6.49306 6.875,6.875 4.20139,-0.38194 6.49305,-2.6736 6.875,-6.875 v -34.375 h 34.375 c 12.41323,-0.38194 22.62954,-4.6788 30.65039,-12.89062 8.21183,-8.21183 12.50868,-18.42814 12.89063,-30.65039 -0.38195,-12.22225 -4.6788,-22.44052 -12.89063,-30.65235 C 554.50107,752.4288 544.28475,748.13195 532.0625,747.75 Z m 154.6875,0 c -35.34622,0 -64,28.65378 -64,64 0,35.34622 28.65378,64 64,64 14.56082,-0.0462 28.67059,-5.05633 40,-14.20312 V 863.75 c 0,6.648 5.352,12 12,12 6.648,0 12,-5.352 12,-12 0.1263,-17.12699 0,-52 0,-52 0,-35.34622 -28.65378,-64 -64,-64 z m 134.89062,0 c -13.17711,0.19097 -24.53925,3.43813 -34.08789,9.74023 -9.35766,6.49308 -16.51908,14.61001 -21.48437,24.34961 -5.15626,9.7396 -7.73438,19.85978 -7.73438,30.36328 0,10.5035 2.57812,20.5295 7.73438,30.07813 4.96529,9.73961 12.12671,17.7604 21.48437,24.0625 9.35766,6.3021 20.71981,9.54926 34.08789,9.74023 9.16669,-0.19097 17.28363,-1.81357 24.34961,-4.86914 6.87502,-3.05556 12.3177,-6.39886 16.32813,-10.02734 4.01043,-3.81945 6.01562,-6.77821 6.01562,-8.87891 -0.19097,-2.29167 -1.05033,-4.01041 -2.57812,-5.15625 -1.33681,-1.14584 -2.7691,-1.71875 -4.29688,-1.71875 -2.29167,0.38195 -4.86978,1.90841 -7.73437,4.58203 -2.86459,2.67362 -6.77885,5.34787 -11.74414,8.02149 -5.15627,2.67362 -11.93705,4.10591 -20.33985,4.29687 -15.65976,-0.57291 -27.78513,-6.01559 -36.3789,-16.32812 -8.59377,-10.12155 -12.98676,-21.4837 -13.17774,-34.08789 0.19098,-12.79517 4.58397,-24.25345 13.17774,-34.375 8.59377,-10.12155 20.71914,-15.47006 36.3789,-16.04297 8.4028,0.19097 15.18358,1.62326 20.33985,4.29688 4.96529,2.67362 8.87955,5.34787 11.74414,8.02148 2.86459,2.67362 5.4427,4.20204 7.73437,4.58398 2.48265,-0.19097 4.20139,-1.05034 5.15625,-2.57812 1.14584,-1.52779 1.71875,-2.96007 1.71875,-4.29688 0,-2.1007 -2.00519,-5.0614 -6.01562,-8.88086 -4.01043,-3.62848 -9.54924,-6.96983 -16.61524,-10.02539 -6.87501,-3.05556 -14.89581,-4.68012 -24.0625,-4.87109 z m 69.3086,0 c -4.2014,0.38195 -6.49305,2.6736 -6.875,6.875 v 114.58398 c 0.38195,4.2014 2.6736,6.49306 6.875,6.875 4.20139,-0.38194 6.49305,-2.6736 6.875,-6.875 v -33.51562 l 22.91601,-23.20313 42.39649,60.72852 c 1.52778,1.90973 3.43684,2.86523 5.72851,2.86523 1.33682,0 2.67492,-0.38259 4.01172,-1.14648 3.24654,-2.86459 3.81945,-6.10979 1.71875,-9.73828 l -43.82812,-61.875 -0.28711,-0.28711 43.25586,-43.54102 c 2.67361,-3.24653 2.67361,-6.4937 0,-9.74023 -3.24654,-2.67362 -6.4937,-2.67362 -9.74024,0 l -66.17187,66.45898 V 754.625 c -0.38195,-4.2014 -2.67361,-6.49305 -6.875,-6.875 z M 497.6875,761.5 h 34.375 c 8.4028,0.19097 15.37195,3.05554 20.91016,8.59375 5.72918,5.72918 8.68988,12.79643 8.88086,21.19922 -0.19098,8.4028 -3.05555,15.46808 -8.59375,21.19726 -5.72918,5.53821 -12.79447,8.40278 -21.19727,8.59375 h -34.375 z M 644.5,764.75 a 48,48 0 0 1 48,48 48,48 0 0 1 -48,48 48,48 0 0 1 -48,-48 48,48 0 0 1 48,-48 z"
inkscape:label="pack" /></svg>

After

Width:  |  Height:  |  Size: 8.1 KiB

19
license Normal file
View File

@ -0,0 +1,19 @@
Zlib License
Copyright (c) 2022 Er2 <er2@dismail.de>
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgement in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.

303
main.lua Normal file
View File

@ -0,0 +1,303 @@
lp = {
name = 'LuaPack',
version = '0.1',
copyright = '(c) Er2 2022, Zlib License',
path = {},
}
-- String interpolation
function lp.strf(str, env)
return str:gsub('%$([%w_]+)%]?', (n) ==>
if env[n]
then return tostring(env[n])
end
<==) .. ''
end
-- Helper function
function lp.insPath(t)
for _, v in pairs(t)
do table.insert(lp.path, v)
end
end
function lp.foreach(e, fn)
for _, v in pairs(e.plug)
do fn(v) end
end
function lp.reqf(file, opts)
if opts.ext[file]
then return opts.ext[file]
end
end
function lp.req(e, opts)
return lp.reqf(e.file, opts)
end
-- Polyfill
function table.contains(t, V)
for k, v in pairs(t) do
if v == V
then return k
end
end
end
-- Try to find file path
function lp.resolve(name, dir)
if path.absolute(name)
then return name
end
name = name:gsub('%.[%w_]+$', '')
for _, v in pairs(lp.path) do
v = v:gsub('%?', name)
v = path.join(dir, v)
local f = io.open(v)
if f then
f:close()
return v
end
end
end
-- Use this in plugins to get module
function lp.get(d, e, opts)
local f
for _, v in pairs(e.plug) do
f = lp.resolve(d, e.dir)
if f then break end
end
if not f then
print(lp.strf(' [WRN] Cannot find "$file"', {file = d}))
return nil
end
local c = lp.reqf(f, opts)
if not c
then c = lp.make(f, opts, f .. '.out.lua')
end
if not e.req[c.i]
then e.reqs = e.reqs + 1
end
e.req[c.i] = true
print(lp.strf(' [GOT] $file', c))
return c
end
-- Alias to makeEnt without entry flag
function lp.make(file, opts, out)
return lp.makeEnt(file, opts, out, false)
end
-- Make function
function lp.makeEnt(file, opts, out, entry)
local dir = path.abs(path.dir(file))
local ext = file:match '%.([%w_]+)$'
local oext = out:match '%.([%w_]+)$'
file = lp.resolve(file, dir, ext)
local e = lp.reqf(file, opts)
if e then return e end
local f, err = io.open(file)
assert(f, err)
local src = f:read '*a'
f:close()
e = {
i = #opts.ext + 1,
file = file,
dir = dir,
ext = ext,
src = src,
reqs = 0,
req = {},
entry = entry,
plug = opts.plug,
}
table.insert(opts.ext, file)
opts.ext[file] = e
if #e.plug == 0
then error(lp.strf('File "$file" cannot be loaded. Add plugins.', e))
end
lp.foreach(e, (v) ==>
v.load(e, ext, oext)
e.src = v.deps(e, opts) or e.src
e.src = v.transform(e, opts) or e.src
<==)
return e
end
local alp = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
function lp.randgen(n)
local g = ''
for i = 1, n do
local v = math.random(#alp)
g = g.. alp:sub(v, v)
end
return g
end
function lp.save(e, out)
out = lp.strf(out, {
name = path.base(e.file):gsub('%.[%w_]+$', ''),
hash = lp.randgen(6),
})
local f, err = io.open(out, 'w')
assert(f, err)
f:write(e.src)
f:close()
return out
end
function lp.config(conf, dir)
local cfg = {
-- defaults
entry = {},
output = {},
ext = {},
plug = {
require 'plug.lua' {}
},
}
for k, v in pairs(conf) do
if k == 'entry'
or k == 'output'
then
if type(v) == 'string'
then table.insert(cfg[k], path.abs(v, dir))
elseif type(v) == 'table' then
for _, v in pairs(v)
do table.insert(cfg[k], path.abs(tostring(v), dir))
end
else error(lp.strf('Unknown type $type in "$opt"', {type = type(v), opt = k}))
end
elseif k == 'plug'
then for _, v in pairs(v) do
if type(v) == 'table'
then table.insert(cfg[k], v)
v.load = v.load or function(e, ext, oext) end
v.deps = v.deps or function(e, opts) end
v.transform = v.transform or function(e, opts) end
v.postbuild = v.postbuild or function(e, opts) end
else error(lp.strf('Unknown type $type in "$opt"', {type = type(v), opt = k}))
end
end
else error(lp.strf('Unknown option "$opt"', {opt = k}))
end
end
return cfg
end
function lp.build(conf, dir)
local opts = lp.config(conf, dir)
for k, v in pairs(opts.entry) do
local out = opts.output[math.min(k, #opts.output)]
print(lp.strf('[BUILD] $file => $out', {file = v, out = out}))
local e = lp.makeEnt(v, opts, out, true)
lp.foreach(e, function(v)
v.postbuild(e, opts)
end)
local save = lp.save(e, out)
print(lp.strf('[BUILT] $o => $r', {o = e.file, r = save}))
end
end
function main(argv)
print(lp.name ..' '.. lp.version)
print(lp.copyright)
print ''
local int = (argv[0] or ''):match '^lua' -- started using interpreter
if #argv == 0
or (#argv == 1 and int) then
print(('Usage: %s config.lua'):format(int and (argv[0] ..' '.. argv[1]) or argv[0]))
return -1
end
local t = os.time()
local ent = path.abs(int and argv[2] or argv[1])
local dir = path.dir(ent)
local f, err = io.open(ent)
assert(f, err)
local conf = f:read '*a'
f:close()
f, err = load(conf, 'config')
if not f
then error(err)
else conf = f()
end
lp.build(conf, dir)
print(lp.strf('Built under $sec seconds.', {sec = os.time() - t}))
return 0
end
path = {
absolute = (f) ==>
f = f:sub(1, 1)
return f == '/' or f == '\\'
<==
, relative = (f) => not path.absolute(f)
, abs = (f, pwd) ==>
if path.absolute(f)
then return f end
pwd or= os.getenv 'PWD'
f = pwd .. '/'.. f
f = f:gsub('(.*)[\\/]+%.%.', path.dir)
f = f:gsub('%.[\\/]+', '/')
f = f:gsub('[\\/]+', '/')
return f
<==
, rel = (f) => f
, base = (f) => f:match '([^/\\]*)[/\\]*$'
, dir = (f) => f:match '^(.*)[\\/]+[^\\/]*[\\/]*$'
, file = (f) => f:match '([^\\/]+)[\\/]*$'
, join = function(base, add)
if path.absolute(add)
then return add end
if path.relative(base)
then base = path.abs(base)
end
local p = path.abs(base ..'/'.. add)
if path.relative(p)
then return add end
return p
end,
}
math.randomseed(os.time())
os.exit(main(arg))

17
plug/arrow.lua Normal file
View File

@ -0,0 +1,17 @@
-- Arrow functions in Lua
-- f = (n) => 2 + n
return function(op)
return {
name = 'Arrow functions',
transform = function(e, opts)
return e.src
-- multiple-line
:gsub('%(([^%(%)]*)%)%s*==>%s*(.-)%s<==',
'function(%1) %2 end')
-- single-line
:gsub('%(([^%(%)]*)%)%s*=>[ \t\v\f]*([^\n\r]*)',
'function(%1) return %2 end')
end,
}
end

16
plug/assigns.lua Normal file
View File

@ -0,0 +1,16 @@
local reg = '([%%w_%%.%%[%%]]+)%%s*(%s)=%%s*'
local regv = '%1 = %1 %2 '
return function(op)
return {
name = 'Assigments',
transform = function(e, opts)
return e.src
:gsub(reg:format '[%+%-%*%/%%^|&]', regv)
:gsub(reg:format '%.%.', regv)
:gsub(reg:format 'and', regv)
:gsub(reg:format 'or', regv)
end,
}
end

108
plug/lua.lua Normal file
View File

@ -0,0 +1,108 @@
lp.insPath {
'?.lua',
'?/init.lua',
}
local env = {
name = lp.name,
ver = lp.version,
copy = lp.copyright,
cache = '_c_',
req = '_r_',
mreq = '_m_', -- require by map
mtemp = ' function($req) -- $file\n$src\n end, -- $file\n',
pre = '--[=[=]=]',
regex = '([^\n]-)' .. 'require%s*%(?["\'](.-)["\']%)?%s*',
}
env.require = lp.strf('$req(%d)', env)
local base = lp.strf([[
$pre -- $name $ver
$pre -- $copy
$pre (function(m)
$pre -- Module cache
$pre local $cache = {}
%s$pre
$pre -- Load main module
$pre $require
$pre
$pre end) {
%s
$pre }
]], env)
local main = lp.strf([[
$pre
$pre -- Require function
$pre local function $req(i)
$pre -- Check in cache
$pre local c = $cache[i]
$pre if not c then
$pre -- Execute module function
$pre c = m[i]($req)
$pre
$pre -- And put it to cache
$pre $cache[i] = c
$pre end
$pre
$pre -- Return cached returned value
$pre return c
$pre end
]], env)
local mreq = lp.strf([[
$pre
$pre -- Require by map
$pre local function $mreq(m, r)
$pre -- Check if module exists
$pre if not m[r]
$pre then error('Cannot find module "'..r..'"')
$pre end
$pre
$pre -- Using default require
$pre return $req(m[r])
$pre end
]], env)
return function(op)
return {
name = 'Base Lua plugin',
load = function(e, ext, oext)
if ext == 'lua'
then return true -- load every lua file
end
end,
deps = function(e, opts)
return e.src:gsub(env.regex, function(bef, name)
name = name:gsub('%.', '/') -- lua.lua => lua/lua
if bef:match '%-%-'
then return '' end -- under comment
local d = lp.get(name, e, opts)
if d then
return bef.. env.require:format(d.i)
end
end)
end,
transform = function(e, opts)
if not e.entry then return end -- change only entry files
if e.reqs > 0 then
local m = ''
for i = 1, #opts.ext do
local v = opts.ext[opts.ext[i]] -- [i] => [file] => object
m = m.. lp.strf(lp.strf(env.mtemp, env), v)
end
return base:format(main, opts.ext[e.file].i, m)
end
end,
postbuild = function(e, opts)
local f, err = load(e.src, 'lint')
if err then
print(e.src)
error(err)
end
end,
}
end

28
plug/num.lua Normal file
View File

@ -0,0 +1,28 @@
return function(op)
return {
name = 'Better numbers',
transform = function(e, opts)
return e.src
:gsub('%.?%d[%._0-9A-Fa-fxboXBO]+', function(num)
local base = 10
local nnum = num
:gsub('_', '')
:gsub('^0([xboXBO])', function(m)
if m == 'x' or m == 'X'
then base = 16
elseif m == 'b' or m == 'B'
then base = 2
elseif m == 'o' or m == 'O'
then base = 8
end
return ''
end)
assert(not nnum:match '[xboXBO]', 'invalid number '..num)
nnum = tonumber(nnum, base)
assert(nnum, 'invalid number '..num)
return tostring(nnum)
end)
end,
}
end

31
plug/switch.lua Normal file
View File

@ -0,0 +1,31 @@
-- BROKEN
local reg = 'switch%s*%(([^{}]-)%)%s*{(.-)}'
local regv = '%s*([^=>]+)%s*=>%s*(.-);'
return function(op)
return {
name = 'Switch-case',
transform = function(e, opts)
return e.src:gsub(reg, function(case, code)
local st
return code:gsub(regv, function(when, c)
local code = st and 'elseif' or 'if'
st = true
if when == '_'
then code = 'else '
else local st
for v in when:gmatch '%s*([^,]+)' do
code = code .. (st and ' or' or '')
.. (' %s == %s'):format(case, v)
st = true
end
code = code .. ' then '
end
return code .. c
end) .. ' end'
end)
end,
}
end

21
readme.md Normal file
View File

@ -0,0 +1,21 @@
<div align="center">
[![Logo](img/luapack.svg)](https://gitdab.com/er2/luapack)
# LuaPack
LuaPack is a module bundler. It takes Lua, MoonScript etc. files, transforms and bundles (packing).
</div>
# Usage
Usage is very simple:
```lua build.lua config.lua```
# Installation
You can't use main.lua file directly, because it uses non-standard Lua features like arrow functions.
Download `build.lua` from releases.