From 7bc33d8713c3df209605184e33e09f1de86b2662 Mon Sep 17 00:00:00 2001 From: Gregory Leeman Date: Wed, 25 Sep 2024 14:08:45 +0100 Subject: [PATCH] lazygit --- wf/script.py | 334 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 255 insertions(+), 79 deletions(-) diff --git a/wf/script.py b/wf/script.py index 8031805..253562f 100755 --- a/wf/script.py +++ b/wf/script.py @@ -12,12 +12,41 @@ from rich.console import Console from rich.theme import Theme STORAGE_FILE = os.path.join(os.path.expanduser('~'), '.workflowy_data.json') + INBOX_ID = "f5cf6b0b-2931-4a59-9301-0a52813e51e3" -PLANNER_ID = "d0162605-db2d-7f97-f451-4408da2bb5df" +TASKS_ID = "4f5fca00-8141-3f33-ac7a-b732f37515f4" +PLANNER_IDS = { + "life": "d0162605-db2d-7f97-f451-4408da2bb5df", + "admin": "3af78fcf-71d1-c020-26f1-a230b2403683", + "art": "d33c5cd2-6183-776f-33e8-c0714c8c5d63", + "health": "ab0ed672-7868-f38d-06c1-86c6464cd85b", + "mind": "09e9a2c7-954d-9178-7bca-de54d6f6680d", + "social": "2be5c4e5-ebfe-a462-3389-5b83aa86d016", + "church": "c69aa1a1-26a3-2ab7-a125-fe6b61d108bd", + "work": "f6306ec9-9243-a249-3af7-aa7d64963e2b" +} solarized_theme = Theme({ - "orange": "#cb4b16", - "violet": "#6c71c4", + "base03": "bright_black", + "base02": "black", + "base01": "bright_green", + "base00": "bright_yellow", + "base0": "bright_blue", + "base1": "bright_cyan", + "base2": "white", + "base3": "bright_white", + "orange": "bright_red", + "violet": "bright_magenta", + "underline base03": "underline bright_black", + "underline base02": "underline black", + "underline base01": "underline bright_green", + "underline base00": "underline bright_yellow", + "underline base0": "underline bright_blue", + "underline base1": "underline bright_cyan", + "underline base2": "underline white", + "underline base3": "underline bright_white", + "underline orange": "bright_red underline", + "underline violet": "bright_magenta underline", }) console = Console(highlight=False, theme=solarized_theme) @@ -239,16 +268,36 @@ def clip_to_workflowy(name, description, parent_id): # {{{ # }}} -def simplify_project(project_data): # {{{ - simplified_project = { - "name": project_data.get("nm", ""), - "description": project_data.get("no", ""), # Assuming 'no' contains description/URL if present - "children": [] - } - children = project_data.get("ch", []) - for child in children: - simplified_project["children"].append(simplify_project(child)) - return simplified_project +def simplify_project(project_data, full_data, follow_mirrors=False): # {{{ + if project_data.get("metadata", {}).get("mirror", {}).get("originalId"): + if follow_mirrors: + originalId = project_data["metadata"]["mirror"]["originalId"] + project_data, full_data = find_project_by_id(full_data, full_data, originalId) + else: + return None, full_data + if project_data.get("metadata", {}).get("isReferencesRoot"): + if project_data.get("ch"): + if len(project_data["ch"]) > 0: + project_data["nm"] = "backlinks" + project_data["metadata"]["layoutMode"] = "h1" + else: + return None, full_data + else: + return None, full_data + if project_data: + simplified_project = { + "name": project_data.get("nm", ""), + "id": project_data.get("id", ""), + "children": [], + "format": project_data.get("metadata", {}).get("layoutMode", None) + } + children = project_data.get("ch", []) + for child in children: + simplified_child, full_data = simplify_project(child, full_data, follow_mirrors=follow_mirrors) + if simplified_child: + simplified_project["children"].append(simplified_child) + return simplified_project, full_data + return None, full_data # }}} @@ -256,8 +305,14 @@ def simplify_project(project_data): # {{{ def flatten(children): # {{{ flattened = [] for child in children: + try: + grand_children = child.get("children", []) + except Exception as e: + print(f"child: {child} {e}") + grand_children = [] + child["children"] = [] flattened.append(child) - flattened.extend(flatten(child.get("children", []))) + flattened.extend(flatten(grand_children)) return flattened # }}} @@ -269,32 +324,90 @@ def flatten_project(project_data): # {{{ # }}} -def filter_project_any(project_data, filters): # {{{ - filtered_project = { - "name": project_data["name"], - "children": [] - } - children = project_data.get("children", []) - for child in children: - include = False - for filter_text in filters: - if filter_text.lower() in child["name"].lower(): - include = True - break - if include: - filtered_project["children"].append(filter_project_any(child, filters)) - return filtered_project +# def filter_project_any(project_data, filters): # {{{ +# filtered_project = { +# "name": project_data["name"], +# "id": project_data.get("id", ""), +# # "description": project_data["description"], +# "children": [], +# "format": project_data["format"] +# } +# children = project_data.get("children", []) +# for child in children: +# include = False +# for filter_text in filters: +# if filter_text.lower() in child["name"].lower(): +# include = True +# break +# if include: +# filtered_project["children"].append(filter_project_any(child, filters)) +# return filtered_project + +def filter_project_any(project_data, filters, include_headers=False): + include = False + if include_headers: + if project_data["format"] == "h1" or project_data["format"] == "h2": + include = True + for filter_text in filters: + if filter_text in project_data["name"]: + include = True + break + + children = [] + for child in project_data.get("children", []): + child = filter_project_any(child, filters, include_headers=include_headers) + if child: + children.append(child) + project_data["children"] = children + + if include or children: + return project_data + else: + return None # }}} +def filter_project_all(project_data, filters): # {{{ + include = True + for filter_text in filters: + if filter_text not in project_data["name"]: + include = False + break + + children = [] + for child in project_data.get("children", []): + child = filter_project_all(child, filters) + if child: + children.append(child) + + project_data["children"] = children + + if include or children: + return project_data + else: + return None + + + def strip(project_data, regex): # {{{ project_data["name"] = re.sub(regex, "", project_data["name"]) children = project_data.get("children", []) for child in children: strip(child, regex) return project_data + +# }}} + + +def rstrip(project_data): # {{{ + project_data["name"] = project_data["name"].rstrip() + children = project_data.get("children", []) + for child in children: + rstrip(child) + return project_data + # }}} @@ -311,7 +424,16 @@ highlights = { "@a": "red", "@b": "blue", "@c": "green", - "@d": "violet" + "@d": "violet", + "@done": "green", + "@missed": "red", + "@na": "blue", + "@one": "base01", + "@two": "base01", + "@three": "base01", + "@five": "base01", + "@eight": "base01", + "@thirteen": "base01", } @@ -326,45 +448,108 @@ def highlight(project_data): # {{{ # }}} +colors1 = { + "xnext": "blue", + "xtimed": "orange", + "xwhenever": "orange", + "xwaiting": "cyan", + "xmaybe": "violet", + "xrepeat": "green", + "xscheduled": "red", + "xblocked": "red", + "xvisualisation": "red", + "xactive": "underline magenta", + "xhold": "underline orange", + "xsprint": "violet", + "xstory": "cyan", + "xfuture": "yellow", + "xarchive": "underline base01", + "xsomeday": "underline violet" +} + +colors2 = { + "@done": "strike base01", + "@missed": "strike base01", + "@na": "strike base01", +} + +colors3 = { + # "xactive": "underline", + # "xhold": "underline", + # "xarchive": "underline", + # "xsomeday": "underline", + # "@done": "strike", + # "@missed": "strike", + # "@na": "strike", +} + + +def recolor(project_data, colors): + for key, value in colors.items(): + if key in project_data["name"]: + if key.startswith("x"): + project_data["name"] = f"[{value}]{project_data['name']} [/][base01]{key}[/]" + else: + project_data["name"] = f"[{value}]{project_data['name']}[/]" + break + children = project_data.get("children", []) + for child in children: + recolor(child, colors) + return project_data +# }}} + + def print_pretty(data, indent=0, color="grey"): # {{{ - for item in data["children"]: - console.print(" " * indent + f"[white]•[/] [{color}]{item['name']}[/]") - if item["children"]: - print_pretty(item["children"], indent + 1) + try: + # href = f"https://workflowy.com/#/{data['id'].split('-')[4]}" + for item in data["children"]: + if item["format"] == "h1" or item["format"] == "h2": + console.print("") + console.print(" " * indent + f"[base3]•[/] [base3][underline]{item['name']}[/][/]") + else: + console.print(" " * indent + f"[base3]•[/] [{color}]{item['name']}[/]") + if item["children"]: + print_pretty(item, indent + 1, color) + except Exception as e: + console.log(f"data: {data} {e}") # }}} -def find_project_by_id(project_data, target_id): # {{{ +def find_project_by_id(project_data, full_data, target_id): # {{{ if project_data.get("id") == target_id: - return project_data + return project_data, full_data for child in project_data.get("ch", []): - result = find_project_by_id(child, target_id) + result, full_data = find_project_by_id(child, full_data, target_id) if result: - return result - return None + return result, full_data + return None, full_data # }}} -def show(parent_id, flat=False, filter_all=None, filter_any=None, color="grey"): # {{{ +def show(parent_id, flat=False, filter_all=None, filter_any=None, color="grey", follow_mirrors=False, include_headers=False): # {{{ root_data = load_from_storage("root") - project_data = find_project_by_id(root_data, parent_id) - project_data = simplify_project(project_data) + project_data, root_data = find_project_by_id(root_data, root_data, parent_id) + project_data, root_data = simplify_project(project_data, root_data, follow_mirrors=follow_mirrors) if flat: project_data = flatten_project(project_data) if filter_all is not None: pass if filter_any is not None: - project_data = filter_project_any(project_data, filter_any) + project_data = filter_project_any(project_data, filter_any, include_headers=include_headers) + project_data = rstrip(project_data) + project_data = recolor(project_data, colors2) + project_data = recolor(project_data, colors3) + project_data = recolor(project_data, colors1) project_data = strip(project_data, r".*") project_data = strip(project_data, r"