rst/ls_menu.py (55 lines of code) (raw):

import xml.etree.ElementTree as ET GROUPS = [ "Cheminformatics", "Bioinformatics", "Data processing", "Software development" ] GROUP_MAP = { "Bingo": "Cheminformatics", "Indigo Toolkit": "Cheminformatics", "Ketcher": "Cheminformatics", "Indigo ELN": "Cheminformatics", "Imago OCR": "Cheminformatics", "Parso": "Data processing", "Selenium Framework": "Software development", "Cloud Pipeline": "Bioinformatics", "MRI Viewer": "Bioinformatics", "Miew": "Bioinformatics", "NGB": "Bioinformatics" } def lifesciences_menu(s): # print(s) # with open ('menu.xml', 'w') as f: # f.write(s) ins = s.encode("utf-8") root = ET.fromstring(ins) group_products = dict() for k in GROUPS: group_products[k] = [] for elem in root: product_ref = elem.find('a') if product_ref.text in GROUP_MAP: g = GROUP_MAP[product_ref.text] else: g = "Software development" p = {"name": product_ref.text + " »", "href": product_ref.attrib["href"]} group_products[g].append(p) p_refs = elem.find('ul') if p_refs is None: continue p['refs'] = [] for elem_sub in p_refs: elem_sub_ref = elem_sub.find('a') p['refs'].append({"name": elem_sub_ref.text, "href": elem_sub_ref.attrib["href"]}) res_items = [] for group in GROUPS: res_items.append({"name": group, "products": group_products[group]}) return res_items def add_filters(app): app.builder.templates.environment.filters['lifesciences_menu'] = lifesciences_menu def setup(app): app.connect("builder-inited", add_filters) def local_test(): with open('menu.xml', 'r') as f: s = lifesciences_menu(f.read()) print(s) if __name__ == '__main__': local_test()