def filename_parse()

in atr/analysis.py [0:0]


def filename_parse(filename: str, elements: dict[str, str | None]) -> tuple[str, dict[str, list[str]]]:
    substitutions: dict[str, list[str]] = {
        "sub": [],
        "core": [],
        "version": [],
        "variant": [],
        "tag": [],
        "arch": [],
        "ext": [],
        "label": [],
    }

    def sub(pattern: str, name: str, replacement: str, filename: str) -> str:
        matches = re.findall(pattern, filename)
        if matches:
            substitutions[name] = matches if isinstance(matches[0], str) else [m[0] for m in matches]
        else:
            substitutions[name] = []
        return re.sub(pattern, replacement, filename)

    filename = sub(r"apache(?=[_.-])", "core", "α", filename)
    # TODO: -incubating
    # There is no standard position for -incubating
    if elements["sub"]:
        # Replace SUB before CORE because CORE may contain SUB
        filename = sub(elements["sub"] + r"(?=[_.-])", "sub", "σ", filename)
    if elements["core"]:
        filename = sub(elements["core"] + r"(?=[_.-])", "core", "κ", filename)
    if elements["version"]:
        filename = sub(elements["version"] + r"(?=[_.-])", "version", "β", filename)
    filename = sub(variant_pattern(), "variant", "ρ", filename)
    filename = sub(r"[0-9]+[.][0-9]+(?:[.][0-9]+(?:[.][0-9]+)?)?(?=[_.-])", "tag", "τ", filename)
    filename = sub(architecture_pattern(), "arch", "ι", filename)
    filename = sub(extension_pattern(), "ext", ".ε", filename)
    if "LABEL_MODE" in os.environ:
        filename = sub(r"(?<=-)[a-z]+[0-9]*(?:-[a-z]+[0-9]*)*(?=-)", "label", "λ", filename)

    filename = filename.replace("α", "ASF")
    filename = filename.replace("σ", "SUB")
    filename = filename.replace("β", "VERSION")
    filename = filename.replace("κ", "CORE")
    filename = filename.replace("ρ", "VARIANT")
    filename = filename.replace("τ", "TAG")
    filename = filename.replace("ι", "ARCH")
    filename = filename.replace("ε", "EXT")
    if "LABEL_MODE" in os.environ:
        filename = filename.replace("λ", "LABEL")
    return filename, substitutions