diff --git a/enterer.py b/enterer.py new file mode 100644 index 0000000..04fc476 --- /dev/null +++ b/enterer.py @@ -0,0 +1,241 @@ +import curses +import logging +import json +import sys + +# logging.basicConfig(filename="enterer.log", level=logging.DEBUG) + +attrtable = { +# attr, sel[i] + "a": 0, + "c": 0, + "m": 0, + "f": 0, + "u/o": 0, + "h": 0, + "nh": 0, + "ai/an": 1, + "as": 1, + "b/aa": 1, + "nh/opi": 3, + "wh": 0, + "1+": 0, + "unk": 2, +} + +age = ["a", "c"] +gender = ["m", "f", "u/o"] +ethnicity = ["h", "nh"] +race = ["ai/an", "as", "b/aa", "nh/opi", "wh", "1+", "unk"] + +def serialize_finalsels_to_json(finalsels, filename): + json_wrapper = {"payload": []} + json_objs = [] +# logging.debug("lllllllllllll {}".format(finalsels)) + for i in finalsels: + new_json_obj = {"age": None, "gender": None, "ethnicity": None, "race": None} + for j in i[1]: + if j in age: + new_json_obj["age"] = j + + if j in gender: + new_json_obj["gender"] = j + + if j in ethnicity: + new_json_obj["ethnicity"] = j + + if j in race: + new_json_obj["race"] = j + + for _ in range(i[0]): + json_objs.append(new_json_obj) + + json_wrapper["payload"] = json_objs +# logging.debug((json_objs, json_wrapper)) + with open(filename, "w", encoding="utf-8") as f: + f.write(json.dumps(json_wrapper, indent=4)) + +## TODO: add padding for window elements +## TODO: add exportation +def pad_out_rest_of_line(window): + window.refresh() + height, width = window.getmaxyx() + y, x = window.getyx() + diff = width - x +# logging.debug("lakfdjalskfjalskdfjalkfjsd {}".format(str(diff))) + window.addstr(y, x, " " * diff, curses.A_REVERSE) + +def check_if_attr_selected(attr, sel): +# logging.debug(attrtable[attr]) +# logging.debug((attrtable[attr], attr[attrtable[attr]], sel)) + if attr[attrtable[attr]] == sel: + return True + return False + +def equality_sel_check(attr, sel): + return attr == sel + +def generate_outstring_format_values(sels): + output = [] + for i in attrtable.keys(): # will always be sorted, in order + for j in sels: + if check_if_attr_selected(i, j): + output.append("[{}]".format(i)) + break + if not "[{}]".format(i) in output: + output.append("{}".format(i)) + + return output + +def convert_sels_arr_to_attrs(sels): + output = [] + for i in attrtable.keys(): # will always be sorted, in order + for j in sels: +# logging.debug(str((i, j))) + if check_if_attr_selected(i, j): + output.append(i) + break + return output + +def get_attr_cata_counts(sels): + ages = 0 + genders = 0 + ethnicities = 0 + races = 0 + for i in sels: + if i in age: + ages += 1 + if i in gender: + genders += 1 + if i in ethnicity: + ethnicities += 1 + if i in race: + races += 1 + + return (ages, genders, ethnicities, races) + +def resolve_sel_conflict(sels): + final = convert_sels_arr_to_attrs(sels) + ages, genders, ethnicities, races = get_attr_cata_counts(final) + +# logging.debug(final) +# logging.debug((ages, genders, ethnicities, races)) + + if ages > 1: + for i in final: + if i in age: + final.remove(i) + + if genders > 1: + for i in final: + if i in gender: + final.remove(i) + + if ethnicities > 1: + for i in final: + if i in ethnicity: + final.remove(i) + + if races > 1: + for i in final: + if i in race: + final.remove(i) + + finalfinal = [] + for i in final: + finalfinal.append(i[attrtable[i]]) + + return finalfinal + +def main(stdscr): + stdscr.clear() + outputsels = [] + currentsels = [] + previoussels = [] + lines = 1 + count = "" + errstring = "" + status = "" + outfile = sys.argv[1] + + while True: + stdscr.addstr(0, 0, "enterer - normal mode - {}".format(status), curses.A_REVERSE) + pad_out_rest_of_line(stdscr) + stdscr.move(lines, 0) + stdscr.clrtoeol() + stdscr.addstr(lines, 0, "{}{} | {} {} | {} {} {} | {} {} | {} {} {} {} {} {} {}".format( + errstring, + count, + *generate_outstring_format_values(currentsels) + )) + newsel = stdscr.getkey() + + if errstring != "": + errstring = "" + + if status != "": + status = "" + + if newsel == '\\': + currentsels, previoussels = previoussels, currentsels + continue + + if newsel in [str(i) for i in range(10)]: + count += newsel + continue + + + if newsel in ('KEY_BACKSPACE', '\b', '\x7f'): + count = count[:-1] + continue + + if newsel == ']': + final_output = [] + for i in outputsels: + temp = convert_sels_arr_to_attrs(i[1]) + final_output.append([i[0], temp]) + +# logging.debug("selsconverter" + str(final_output)) + try: + serialize_finalsels_to_json(final_output, outfile) + except FileNotFoundError: + status = "failed to write. changing outfile to __RESCUE_OUTFILE.json. write again" + outfile = "__RESCUE_OUTFILE.json" + + status = "written to {}".format(outfile) + continue + + if newsel == ' ': + catagories_data = get_attr_cata_counts(convert_sels_arr_to_attrs(currentsels)) + not_all_one = False + for i in catagories_data: + if not i == 1: + not_all_one = True + break + + if not_all_one: + errstring += "!" + continue + + if count == "": + count = 1 + + outputsels.append((int(count), currentsels)) + count = "" + previoussels = currentsels + currentsels = [] + lines += 1 + continue + + if not newsel in currentsels: + currentsels.append(newsel) + else: + currentsels.remove(newsel) + + currentsels = resolve_sel_conflict(currentsels) + + + stdscr.refresh() + stdscr.getkey() + +curses.wrapper(main)