9595reserved_append = "_append"
9696reserved_replace = "_replace"
9797reserved_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+
119128def 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