import json, re # get rid of white space in comma or colon-separated strings def strip_list(stIn, separator): stOut = '' stIn = stIn.strip() liIn = stIn.split(separator) length = len(liIn) - 1 for item in liIn: if length > 0: stOut = stOut + item.strip() + separator length -= 1 else: stOut = stOut + item.strip() return(stOut) def syntax(): print('Syntax: find [-o] [|field,value| field,value,...]') exit(1) #Matches if pattern string is contained in target string. #Except for instrument and key fields. def match(query, diSetting): if query[0] == "liEnsemble": liInsts = query[1] if fOr: fMatch = False for inst in liInsts: if inst in diSetting["liEnsemble"]: fMatch = True else: fMatch = True for inst in liInsts: if not inst in diSetting["liEnsemble"]: fMatch = False elif query[0] == "mkey": liKeys = query[1] if fOr: fMatch = False for key in liKeys: if key in diSetting["mKey"]: fMatch = True else: fMatch = True for key in liKeys: if not key in diSetting["mKey"]: fMatch = False else: target = diSetting[query[0].lower()].lower() pattern = query[1].lower() fMatch = target.find(pattern) != -1 return fMatch def unabbreviate(query, liSettings): # only to unabbreviate sample = liSettings[0] for key in sample.keys(): if key.find(query[0]) != -1: query[0] = key.strip() return query print(query[0], " is an invalid key") exit(2) def find(liQueries, fOr, liSettings): liSets = [] seOut = set() for query in liQueries: query = unabbreviate(query, liSettings) seHits = set() n = 0 for diSetting in liSettings: if match(query, diSetting): seHits.add(n) n += 1 liSets.append(seHits) if fOr: for myset in liSets: seOut = seOut | myset else: seOut = liSets[0] n = 1 while n < len(liSets): seOut = seOut & liSets[n] n += 1 return seOut def display(setting): #it's a MS if re.search('^[A-Z]+-[A-Z]+[a-z]+', setting["source"]): source = setting["source"].split(":")[0] else: # It's a book, so the author or publisher is the source liSource = setting["source"].split(" ") if len(liSource) > 1: source = liSource[len(liSource) -1] + liSource[0][0] else: source = liSource[0] document = setting["document"].split(":")[0] if setting["volume"] != '': document = document + ',v.' + setting["volume"] page = setting["page"] title = setting["title"][0:25] liComposer = setting["composer"].split(" ") if len(liComposer) > 1: composer = liComposer[len(liComposer) -1] + liComposer[0][0] else: composer = liComposer[0] stOut = title + " " + composer + " " + source + " " + document + "," + page print(stOut) def main(): with open("settings.json", "r") as flSettings: liSettings = json.load(flSettings) #fOr = input("OR values?") == 'y' fOr = False print("Fields: Title, subtitle, composer, orig_comp, source, document") print("volume, date, page, difficulty, mKey, liEnsemble") print("Input field, value pairs (comma between each field and value):") liQueries = [] while True: stIn = input() if stIn == '': break if stIn.find(',') == -1: print(stIn, "; Missing comma") continue stIn = strip_list(stIn, ',') stIn = stIn.lower() liQueries.append(stIn.split(',')) seHits = find(liQueries, fOr, liSettings) for hit in seHits: display(liSettings[hit]) print("") print(str(len(seHits)), " hits.") # end main if __name__ == "__main__": main()