Initial commit

This commit is contained in:
Robert Miles 2018-07-13 08:34:01 -04:00
commit 4ca6b1c7a0
4 changed files with 164 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
__pycache__/

45
README.md Normal file
View File

@ -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__
```

3
__init__.py Normal file
View File

@ -0,0 +1,3 @@
from .preprocessor import Cart, LuaCode
__all__ = ['Cart','LuaCode']

115
preprocessor.py Normal file
View File

@ -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)