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