Source code for meavis.markup

"""Read and write MeaVis markup language."""
import itertools
import logging


[docs]def visit_instruments(meavis_instruments, tag_name, meavis_name): """Visit an instrument hierarchy and return corresponding items.""" logging.getLogger("meavis").debug( "Markup looking for {} @ {}.".format(meavis_name, tag_name) ) meavis_name_split = [ part.lower().strip() for part in meavis_name.split(".") ] if meavis_name_split[0] == "*": current_items = { instrument_name: instrument for instrument_name, instrument in meavis_instruments.items() } else: for instrument_name in [ part.lower().strip() for part in meavis_name_split[0].split("|") ]: if instrument_name not in meavis_instruments: logging.getLogger("meavis").info( "Add instrument {} in the markup structure.".format( instrument_name ) ) meavis_instruments[instrument_name] = {"usages": {}} current_items = { instrument_name.lower().strip(): meavis_instruments[ instrument_name.lower().strip() ] for instrument_name in meavis_name_split[0].split("|") } if len(meavis_name_split) == 1: return current_items tag_name_strip = tag_name.lower().strip() if meavis_name_split[1] == "*": current_items = { "{}.{}".format(instrument_name, usage_name): usage for instrument_name, instrument in current_items.items() for usage_name, usage in instrument["usages"].items() } elif meavis_name_split[1] == "~": pass else: for usage_name, instrument in itertools.product( [part.lower().strip() for part in meavis_name_split[1].split("|")], current_items.values(), ): if usage_name not in instrument["usages"]: logging.getLogger("meavis").info( "Add usage {} in the markup structure.".format(usage_name) ) instrument["usages"][usage_name] = {} current_items = { "{}.{}".format(instrument_name, usage_name): instrument["usages"][ usage_name.lower().strip() ] for instrument_name, instrument in current_items.items() for usage_name in meavis_name_split[1].split("|") } for item in current_items.values(): if tag_name_strip not in item: item[tag_name_strip] = {} if len(meavis_name_split) == 2: return { "{}.{}".format(item_name, tag_name_strip): item[tag_name_strip] for item_name, item in current_items.items() } if meavis_name_split[2] == "*": current_items = { "{}.{}".format(usage_name, item_name): item for usage_name, usage in current_items.items() for item_name, item in usage[tag_name_strip].items() } else: for item_name, usage in itertools.product( [part.lower().strip() for part in meavis_name_split[2].split("|")], current_items.values(), ): if item_name not in usage[tag_name_strip]: usage[tag_name_strip][item_name] = {} current_items = { "{}.{}".format(usage_name, item_name): usage[tag_name_strip][ item_name.lower().strip() ] for usage_name, usage in current_items.items() for item_name in meavis_name_split[2].split("|") } return current_items