#!/bin/python3 import xml.etree.ElementTree as ET import argparse import re table_groups = "abcdefghi" table_group_sizes = [ 15, # a: a-o 20, # b: a-t 29, # c: a-z ä-ü 15, # d: a-o 19, # e: a-s 13, # f: a-m 19, # g: a-s 8, # h: a-h 6 # i: a-f ] table_num_to_char = list("abcdefghijklmnopqrstuvwxyz") + ["ae", "oe", "ue"] table_char_to_num = dict([(x, y) for (y, x) in list(enumerate("abcdefghijklmnopqrstuvwxyz"))] + [("ae", 26), ("oe", 27), ("ue", 28)]) list("abcdefghijklmnopqrstuvwxyz") + ["ae", "oe", "ue"] parser = argparse.ArgumentParser(description="Generate the static images of MensaarMapBot. The resulting map will include all tables specified by command flags (default: none).") parser.add_argument("--input", default="mensa.svg", help="Specify the output filename (default: mensa.svg)") parser.add_argument("--output", default="out.svg", help="Specify the output filename (default: out.svg)") parser_singles = parser.add_argument_group("Single Table Renders") parser_groups = parser.add_argument_group("Group Table Renders") parser_extra = parser.add_argument_group("Extra Table Renders") parser_extra.add_argument(f"--all", action = "store_true", help = f"Highlight all tables. This argument implies all other highlighting arguments.") for j in range(len(table_groups)): group = table_groups[j] parser_groups.add_argument(f"-{group.upper()}", action = "store_true", help = f"Highlight all tables of group {group}. This implies all highlighting arguments that match -{group}*.") for i in range(table_group_sizes[j]): parser_singles.add_argument(f"--{group}{table_num_to_char[i]}", action = "store_true", help = f"Highlight the table {group}{table_num_to_char[i]}.") # make parsed to namespace dictionary parsed = vars(parser.parse_args()) # The group arguments tell us which tables to ignore as they should be displayed disable_tables = [ list(range(size)) for size in table_group_sizes ] # open XML tree = ET.parse(parsed["input"]) root = tree.getroot() if parsed["all"]: disable_tables = [] else: # enable groups that got enabled by -A -B ... # and enable tables themselves for i in range(len(table_groups)): lower = table_groups[i].lower() upper = table_groups[i].upper() if parsed[upper]: disable_tables[i] = [] # we have disabled this entire group. no need to check the singletons continue for j in range(table_group_sizes[i]): thechar = table_num_to_char[j] tableid = f"{lower}{thechar}" if parsed[tableid]: disable_tables[i].remove(j) pattern_rect = re.compile("table_(.)(.*)") pattern_text = re.compile("label_(.)") # parse XML for the table rects rects = root.findall(".//{http://www.w3.org/2000/svg}rect") rects = list(filter(lambda rect: pattern_rect.match(rect.attrib["id"]), rects)) # parse XML for the text containers texts = root.findall(".//{http://www.w3.org/2000/svg}text") texts = list(filter(lambda text: pattern_text.match(text.attrib["id"]), texts)) for text in texts: # parse group of text match = pattern_text.match(text.attrib["id"]) group = ord(match.group(1)) - ord('a') # disable text if all of its childs are disabled all_childs_disabled = len(disable_tables[group]) == table_group_sizes[group] # no element removed if all_childs_disabled: span = list(text)[0] style_span="font-size:3.17499995px;fill:#ffffff;fill-opacity:1;stroke-width:0.26458332;" span.attrib["style"] = style_span # otherwise do nothing, we start with a full canvas for rect in rects: match = pattern_rect.match(rect.attrib["id"]) group, number = ord(match.group(1)) - ord('a'), table_char_to_num[match.group(2)] if number in disable_tables[group]: #other group, color grey rect.attrib["style"] = "fill:#808080;stroke-width:0.26458332" #groupstring = chr(ord('a') + group_id) tree.write(parsed["output"])