Initial commit
This commit is contained in:
commit
4ca6b1c7a0
|
@ -0,0 +1 @@
|
|||
__pycache__/
|
|
@ -0,0 +1,45 @@
|
|||
# p8btools - Build tools for PICO-8
|
||||
|
||||
Submodule in, and you can use the submodule as a python module.
|
||||
|
||||
Use a Makefile like so:
|
||||
```
|
||||
NAME:=blazzle
|
||||
SRC:=$(wildcard *.lua)
|
||||
$(NAME).p8: $(SRC)
|
||||
python combine.py $(NAME).p8 base.p8 $(SRC)
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm $(NAME).p8
|
||||
```
|
||||
|
||||
A combine.py file like so:
|
||||
```python
|
||||
import p8btools,argparse,io
|
||||
|
||||
parser = argparse.ArgumentParser(prog="python combine.py",description="Combines a lua file into a .p8 cart.")
|
||||
parser.add_argument("result",help="The filename for the resulting cart.")
|
||||
parser.add_argument("p8cart",help="A .p8 cart.")
|
||||
parser.add_argument("luafile",help="The lua file to inject into the .p8 cart.",nargs="+")
|
||||
args = parser.parse_args()
|
||||
|
||||
cart = p8btools.Cart(args.p8cart)
|
||||
t = ""
|
||||
for luafile in args.luafile:
|
||||
lua = p8btools.LuaCode(luafile)
|
||||
lua.parse()
|
||||
t += lua.text
|
||||
t += "\n"
|
||||
cart.lua = t.rstrip()
|
||||
with io.open(args.result,"w",encoding="utf-8") as f:
|
||||
f.write(cart.fulltext)
|
||||
```
|
||||
|
||||
and a base.p8 like so:
|
||||
```
|
||||
pico-8 cartridge // http://www.pico-8.com
|
||||
version 16
|
||||
__lua__
|
||||
|
||||
```
|
|
@ -0,0 +1,3 @@
|
|||
from .preprocessor import Cart, LuaCode
|
||||
|
||||
__all__ = ['Cart','LuaCode']
|
|
@ -0,0 +1,115 @@
|
|||
import io
|
||||
class Cart:
|
||||
def __init__(self,basecart):
|
||||
contents = ""
|
||||
with io.open(basecart,encoding="utf-8") as f:
|
||||
contents = f.read()
|
||||
lines = contents.split("\n")
|
||||
if "__gfx__" not in lines:
|
||||
lines.append("__gfx__")
|
||||
self.header = "\n".join(lines[:3])
|
||||
self.rest = "\n".join(lines[lines.index("__gfx__"):])
|
||||
self.lua = "\n".join(lines[3:lines.index("__gfx__")])
|
||||
|
||||
@property
|
||||
def fulltext(self):
|
||||
return "\n".join(getattr(self,k) for k in ("header","lua","rest"))
|
||||
|
||||
class LuaCode:
|
||||
def __init__(self,filename):
|
||||
lines = []
|
||||
with io.open(filename,encoding="utf-8") as f:
|
||||
lines = [l.rstrip() for l in f if l]
|
||||
self.lines = []
|
||||
i=0
|
||||
while i<len(lines):
|
||||
if lines[i]:
|
||||
self.lines.append(lines[i])
|
||||
i+=1
|
||||
self.c = 0
|
||||
self.defines = dict()
|
||||
|
||||
def parseDefines(self):
|
||||
if self.c!=0:
|
||||
raise Exception("Parsing out of order")
|
||||
self.c=1
|
||||
l = []
|
||||
for i in self.lines:
|
||||
if i.startswith("--!define"):
|
||||
p=i.split(" ",2)
|
||||
self.defines[p[1]]=p[2]
|
||||
else:
|
||||
l.append(i)
|
||||
self.lines = l
|
||||
|
||||
def parseIfdef(self):
|
||||
if self.c!=1:
|
||||
raise Exception("Parsing out of order")
|
||||
self.c=2
|
||||
l = []
|
||||
i = 0
|
||||
while i<len(self.lines):
|
||||
if self.lines[i].startswith("--!ifdef"):
|
||||
if not self.defines.get(self.lines[i].split(" ",2)[1]):
|
||||
while i<len(self.lines) and self.lines[i]!="--!endif":
|
||||
i+=1
|
||||
elif self.lines[i].startswith("--!ifndef"):
|
||||
if self.defines.get(self.lines[i].split(" ",2)[1]):
|
||||
while i<len(self.lines) and self.lines[i]!="--!endif":
|
||||
i+=1
|
||||
elif self.lines[i]=="--!endif":
|
||||
pass # don't include endifs
|
||||
else:
|
||||
l.append(self.lines[i])
|
||||
i+=1
|
||||
self.lines = l
|
||||
|
||||
def useDefines(self):
|
||||
if self.c!=2:
|
||||
raise Exception("Parsing out of order")
|
||||
self.c=3
|
||||
l = []
|
||||
for i in self.lines:
|
||||
for define in self.defines:
|
||||
i = i.replace(define,self.defines[define])
|
||||
l.append(i)
|
||||
self.lines = l
|
||||
|
||||
def parseIncludes(self):
|
||||
if self.c!=3:
|
||||
raise Exception("Parsing out of order")
|
||||
self.c=4
|
||||
l = []
|
||||
for i in self.lines:
|
||||
if i.startswith("--!include"):
|
||||
lua = self.__class__(i.split(" ",1)[1])
|
||||
lua.parse()
|
||||
for line in lua.lines:
|
||||
l.append(line)
|
||||
else:
|
||||
l.append(i)
|
||||
self.lines=l
|
||||
|
||||
def parse(self):
|
||||
if self.c!=0:
|
||||
raise Exception("Parsing out of order")
|
||||
self.parseDefines()
|
||||
self.parseIfdef()
|
||||
self.useDefines()
|
||||
self.parseIncludes()
|
||||
|
||||
@property
|
||||
def text(self):
|
||||
return "\n".join(self.lines)
|
||||
|
||||
def findall(s,p):
|
||||
o=0
|
||||
while len(s)>0 and (p in s):
|
||||
yield o+s.find(p)
|
||||
o+=s.find(p)+len(p)
|
||||
s = s[s.find(p)+len(p):]
|
||||
|
||||
if __name__=="__main__":
|
||||
l=LuaCode("test.lua")
|
||||
l.parse()
|
||||
print(l.text)
|
Loading…
Reference in New Issue