Skip to content

Commit 25f9694

Browse files
Merge pull request #13 from SGG-Modding/sjsonsearch
SJSON search + fix modfile comments
2 parents 1718a9a + 8f4eae3 commit 25f9694

1 file changed

Lines changed: 64 additions & 41 deletions

File tree

modimporter.py

Lines changed: 64 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@
9595
reserved_append = "_append"
9696
reserved_replace = "_replace"
9797
reserved_delete = "_delete"
98+
reserved_search = "_search"
9899

99100
## Data Functionality
100101

@@ -116,6 +117,14 @@ def safeget(data,key):
116117
return data.get(key,DNE)
117118
return DNE
118119

120+
def safepairs(data):
121+
it = DNE
122+
if isinstance(data,list):
123+
it = enumerate(data)
124+
if isinstance(data,OrderedDict):
125+
it = data.items()
126+
return it
127+
119128
def clearDNE(data):
120129
if isinstance(data,OrderedDict):
121130
for k,v in data.copy().items():
@@ -330,12 +339,23 @@ def writesjson(filename,content):
330339
with open(filename,'w',encoding='utf-8') as f:
331340
f.write(content)
332341

342+
def sjsonsearch(indata,queries):
343+
def pred(dat,mat):
344+
if (it := safepairs(mat)) is not DNE:
345+
return all(pred(dat[k],v) for k,v in it)
346+
return dat == mat
347+
for matdata,mapdata in queries:
348+
for k,v in ((k,v) for k,v in safepairs(indata) if pred(v,matdata)):
349+
indata[k] = sjsonmap(v,mapdata)
350+
return indata
351+
352+
333353
def sjsonmap(indata,mapdata):
334354
if mapdata is DNE:
335355
return indata
336-
if mapdata==reserved_delete:
356+
elif mapdata==reserved_delete:
337357
return DNE
338-
if safeget(mapdata,reserved_sequence):
358+
elif safeget(mapdata,reserved_sequence):
339359
S = []
340360
for k,v in mapdata.items():
341361
try:
@@ -347,31 +367,28 @@ def sjsonmap(indata,mapdata):
347367
continue
348368
mapdata = S
349369
if type(indata)==type(mapdata):
350-
if safeget(mapdata,0)!=reserved_append or isinstance(mapdata,OrderedDict):
351-
if isinstance(mapdata,list):
352-
if safeget(mapdata,0)==reserved_delete:
353-
return DNE
354-
if safeget(mapdata,0)==reserved_replace:
355-
del mapdata[0]
356-
return mapdata
357-
indata.extend([DNE]*(len(mapdata)-len(indata)))
358-
for k,v in enumerate(mapdata):
359-
indata[k] = sjsonmap(safeget(indata,k),v)
360-
elif isinstance(mapdata,dict):
361-
if safeget(mapdata,reserved_delete):
362-
return DNE
363-
if safeget(mapdata,reserved_replace):
364-
del mapdata[reserved_replace]
365-
return mapdata
366-
for k,v in mapdata.items():
367-
indata[k] = sjsonmap(safeget(indata,k),v)
368-
return indata
369-
elif isinstance(mapdata,list):
370+
if isinstance(mapdata,list) and safeget(mapdata,0) == reserved_append:
370371
for i in range(1,len(mapdata)):
371372
indata.append(mapdata[i])
372373
return indata
373-
else:
374-
return mapdata
374+
if isinstance(mapdata,list):
375+
if safeget(mapdata,0)==reserved_search:
376+
search = mapdata[1]
377+
return sjsonsearch(indata,zip(search[::2],search[1::2]))
378+
if safeget(mapdata,0)==reserved_replace:
379+
del mapdata[0]
380+
return mapdata
381+
indata.extend([DNE]*(len(mapdata)-len(indata)))
382+
elif isinstance(mapdata,dict):
383+
if search := safeget(mapdata,reserved_search):
384+
return sjsonsearch(indata,zip(search[::2],search[1::2]))
385+
if safeget(mapdata,reserved_replace):
386+
del mapdata[reserved_replace]
387+
return mapdata
388+
if (it := safepairs(mapdata)) is not DNE:
389+
for k,v in it:
390+
indata[k] = sjsonmap(safeget(indata,k),v)
391+
return indata
375392
return mapdata
376393

377394
def mergesjson(infile,mapfile):
@@ -435,36 +452,42 @@ def splitlines(body):
435452
lines = []
436453
li = -1
437454
mlcom = False
438-
def gp(group,lines,li,mlcom,even):
455+
def gp(group,lines,li,mlcom,even,lcom):
439456
if mlcom:
440457
tgroup = group.split(mlcom_end,1)
441458
if len(tgroup)==1: #still commented, carry on
442459
even = not even
443-
return (lines,li,mlcom,even)
460+
return (lines,li,mlcom,even,lcom)
444461
else: #comment ends, if a quote, even is disrupted
445462
even = False
446463
mlcom = False
447464
group = tgroup[1]
448-
if even:
449-
lines[li]+="\""+group+"\""
450-
else:
451-
tgroup = group.split(comment,1)
452-
tline = tgroup[0].split(mlcom_start,1)
453-
tgroup = tline[0].split(linebreak)
454-
lines[li]+=tgroup[0] #uncommented line
455-
for g in tgroup[1:]: #new uncommented lines
456-
lines.append(g)
457-
li+=1
458-
if len(tline)>1: #comment begins
459-
mlcom = True
460-
lines,li,mlcom,even = gp(tline[1],lines,li,mlcom,even)
461-
return (lines,li,mlcom,even)
465+
if not mlcom:
466+
if even:
467+
lines[li]+="\""+group+"\""
468+
else:
469+
tgroup = group.split(comment,1)
470+
if len(tgroup) == 2:
471+
lcom = True
472+
tline = tgroup[0].split(mlcom_start,1)
473+
tgroup = tline[0].split(linebreak)
474+
lines[li]+=tgroup[0] #uncommented line
475+
for g in tgroup[1:]: #new uncommented lines
476+
lines.append(g)
477+
li+=1
478+
if len(tline)>1: #comment begins
479+
mlcom = True
480+
lines,li,mlcom,even,lcom = gp(tline[1],lines,li,mlcom,even,lcom)
481+
return (lines,li,mlcom,even,lcom)
462482
for groups in glines:
483+
lcom = False
463484
even = False
464485
li += 1
465486
lines.append("")
466487
for group in groups:
467-
lines,li,mlcom,even = gp(group,lines,li,mlcom,even)
488+
lines,li,mlcom,even,lcom = gp(group,lines,li,mlcom,even,lcom)
489+
if lcom:
490+
break
468491
even = not even
469492
return lines
470493

0 commit comments

Comments
 (0)