116 lines
2.5 KiB
Python
116 lines
2.5 KiB
Python
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)
|