generate-asset-list.py 3.5 KB
#!/usr/bin/env python3

"""
This file assumes that
  assets:
is the last line in ./pubspec.yaml

It reads the file names of all files from the ./assets folder
and turns them as assets and writes them into ./pubspec.yaml
"""

import os

def main():
    target = "./assets/"
    space = "    "
    subfolders = []
    patterns_to_skip = ["1.5x", "2.x", "3.x", "4.x"]
    for root, dirs, files in os.walk(target):
        for d in dirs:
            path = os.path.join(root, d).replace("\\", "/")
            if os.listdir(path):
                path = path.lstrip('./')
                if any(path.endswith(pattern) for pattern in patterns_to_skip):
                    continue
                subfolders.append("{space}- {path}/".format(space=space, path=path))

    assert subfolders, "The subfolders list is empty."

    subfolders = sorted(subfolders)

    loc_of_flutter = -1
    loc_of_flutter_asset = -1
    loc_of_end_flutter_asset = -1
    loc_of_end_flutter = -1

    with open("./pubspec.yaml", encoding="utf-8") as f:
        lines = f.readlines()
        for index, line in enumerate(lines):
            if line == "flutter:\n":
                loc_of_flutter = index + 1
                if index == len(lines) - 1:
                    loc_of_end_flutter = index + 2
                continue
            if loc_of_flutter >= 0 and loc_of_flutter_asset < 0 and line == "  assets:\n":
                loc_of_flutter_asset = index + 1
                continue

    with open("./pubspec.yaml", encoding="utf-8") as f:
        lines = f.readlines()
        for index, line in enumerate(lines):
            if index < loc_of_flutter:
                continue
            if loc_of_flutter_asset >= 0:
                if line.startswith("    - assets/"):
                    loc_of_end_flutter_asset = index + 1
                    continue
                else:
                    loc_of_end_flutter = index + 1
                    continue
            else:
                if line.startswith("  ") is False:
                    loc_of_end_flutter = index + 1
                    continue
                else:
                    loc_of_end_flutter = index + 2
                    break

    assert loc_of_flutter >= 0, "The 'flutter:' section is missing in the pubspec.yaml file."

    with open("./pubspec.yaml", "w", encoding="utf-8") as f:
        for index, line in enumerate(lines):
            if loc_of_end_flutter_asset >= 0:
                if index + 1 < loc_of_flutter_asset or index + 1 > loc_of_end_flutter_asset:
                    f.write(line)
                if index + 1 == loc_of_flutter_asset:
                    f.write("  assets:\n")
                    for folder in subfolders:
                        f.write("{folder}\n".format(folder=folder))
            else:
                if index + 1 < loc_of_end_flutter or index + 1 > loc_of_end_flutter:
                    f.write(line)
                if index + 1 == loc_of_end_flutter:
                    f.write("  assets:\n")
                    for indexOfFolder, folder in enumerate(subfolders):
                        f.write("{folder}\n".format(folder=folder))
                        if indexOfFolder == len(subfolders) - 1:
                            f.write("\n")
                            break

        if loc_of_end_flutter == len(lines) + 1:
            f.write("\n")
            f.write("  assets:\n")
            for folder in subfolders:
                f.write("{folder}\n".format(folder=folder))

if __name__ == "__main__":
    main()