Browse Source

lazygit

main
Gregory Leeman 6 months ago
parent
commit
809f40c727
  1. 137
      wf/script.py

137
wf/script.py

@ -23,7 +23,9 @@ PLANNER_IDS = {
"mind": "09e9a2c7-954d-9178-7bca-de54d6f6680d", "mind": "09e9a2c7-954d-9178-7bca-de54d6f6680d",
"social": "2be5c4e5-ebfe-a462-3389-5b83aa86d016", "social": "2be5c4e5-ebfe-a462-3389-5b83aa86d016",
"church": "c69aa1a1-26a3-2ab7-a125-fe6b61d108bd", "church": "c69aa1a1-26a3-2ab7-a125-fe6b61d108bd",
"work": "f6306ec9-9243-a249-3af7-aa7d64963e2b" "work": "f6306ec9-9243-a249-3af7-aa7d64963e2b",
"affirm": "a1412d52-c72c-0612-f5b1-48874ef03943",
"tabs": "63aa4d3a-4db3-9b8c-cbae-a49fca975c1e",
} }
solarized_theme = Theme({ solarized_theme = Theme({
@ -289,6 +291,7 @@ def simplify_project(project_data, full_data, follow_mirrors=False): # {{{
"name": project_data.get("nm", ""), "name": project_data.get("nm", ""),
"id": project_data.get("id", ""), "id": project_data.get("id", ""),
"children": [], "children": [],
"description": project_data.get("no", ""),
"format": project_data.get("metadata", {}).get("layoutMode", None) "format": project_data.get("metadata", {}).get("layoutMode", None)
} }
children = project_data.get("ch", []) children = project_data.get("ch", [])
@ -369,16 +372,18 @@ def filter_project_any(project_data, filters, include_headers=False):
# }}} # }}}
def filter_project_all(project_data, filters): # {{{ def filter_project_all(project_data, filters, include_headers=False): # {{{
include = True include = True
for filter_text in filters: if include_headers and (project_data["format"] == "h1" or project_data["format"] == "h2"):
if filter_text not in project_data["name"]: pass
include = False else:
break for filter_text in filters:
if filter_text not in project_data["name"]:
include = False
break
children = [] children = []
for child in project_data.get("children", []): for child in project_data.get("children", []):
child = filter_project_all(child, filters) child = filter_project_all(child, filters, include_headers=include_headers)
if child: if child:
children.append(child) children.append(child)
@ -389,23 +394,24 @@ def filter_project_all(project_data, filters): # {{{
else: else:
return None return None
# }}}
def strip(project_data, regex): # {{{
project_data["name"] = re.sub(regex, "", project_data["name"])
def replace(project_data, regex, replacement): # {{{
project_data["name"] = re.sub(regex, replacement, project_data["name"])
children = project_data.get("children", []) children = project_data.get("children", [])
for child in children: for child in children:
strip(child, regex) replace(child, regex, replacement)
return project_data return project_data
# }}} # }}}
def rstrip(project_data): # {{{ def strip(project_data, regex): # {{{
project_data["name"] = project_data["name"].rstrip() project_data = replace(project_data, regex, "")
children = project_data.get("children", [])
for child in children:
rstrip(child)
return project_data return project_data
# }}} # }}}
@ -468,19 +474,9 @@ colors1 = {
} }
colors2 = { colors2 = {
"@done": "strike base01", "@done": "strike",
"@missed": "strike base01", "@missed": "strike",
"@na": "strike base01", "@na": "strike",
}
colors3 = {
# "xactive": "underline",
# "xhold": "underline",
# "xarchive": "underline",
# "xsomeday": "underline",
# "@done": "strike",
# "@missed": "strike",
# "@na": "strike",
} }
@ -488,9 +484,9 @@ def recolor(project_data, colors):
for key, value in colors.items(): for key, value in colors.items():
if key in project_data["name"]: if key in project_data["name"]:
if key.startswith("x"): if key.startswith("x"):
project_data["name"] = f"[{value}]{project_data['name']} [/][base01]{key}[/]" project_data["name"] = f"[{value}]{project_data['name'].strip(" ")}[/] [base01]{key}[/]"
else: else:
project_data["name"] = f"[{value}]{project_data['name']}[/]" project_data["name"] = f"[{value}]{project_data['name'].strip()}[/]"
break break
children = project_data.get("children", []) children = project_data.get("children", [])
for child in children: for child in children:
@ -499,27 +495,37 @@ def recolor(project_data, colors):
# }}} # }}}
def print_pretty(data, indent=0, color="grey"): # {{{ def print_pretty(data, indent=0, color="grey", show_description=True, show_id=False): # {{{
try: try:
# href = f"https://workflowy.com/#/{data['id'].split('-')[4]}" # href = f"https://workflowy.com/#/{data['id'].split('-')[4]}"
for item in data["children"]: for item in data["children"]:
if item["format"] == "h1" or item["format"] == "h2":
if item["format"] == "h1":
console.print("") console.print("")
console.print(" " * indent + f"[base3]•[/] [base3][underline]{item['name']}[/][/]") console.print(" " * indent + f"[base3]•[/] [base3][underline]{item['name']}[/][/][base01]{' ' + item['id'].split('-')[4] if show_id else ''}[/]")
elif item["format"] == "h2":
console.print(" " * indent + f"[base3]•[/] [base1][underline]{item['name']}[/][/][base01]{' ' + item['id'].split('-')[4] if show_id else ''}[/]")
else: else:
console.print(" " * indent + f"[base3]•[/] [{color}]{item['name']}[/]") console.print(" " * indent + f"[base3]•[/] [{color}]{item['name']}[/][base01]{' ' + item['id'].split('-')[4] if show_id else ''}[/]")
if item["description"] and show_description:
console.print(" " * (indent + 1) + f"[base01]{item['description'].replace('\n', '\n' + ' ' * (indent + 1))}[/]")
if item["children"]: if item["children"]:
print_pretty(item, indent + 1, color) print_pretty(item, indent + 1, color, show_description=show_description, show_id=show_id)
except Exception as e: except Exception as e:
console.log(f"data: {data} {e}") console.log(f"Error: {e}")
# }}} # }}}
def find_project_by_id(project_data, full_data, target_id): # {{{ def find_project_by_id(project_data, full_data, target_id): # {{{
if project_data.get("id") == target_id: if project_data.get("id"):
return project_data, full_data if target_id in project_data.get("id"):
return project_data, full_data
for child in project_data.get("ch", []): for child in project_data.get("ch", []):
result, full_data = find_project_by_id(child, full_data, target_id) result, full_data = find_project_by_id(child, full_data, target_id)
if result: if result:
@ -529,19 +535,17 @@ def find_project_by_id(project_data, full_data, target_id): # {{{
# }}} # }}}
def show(parent_id, flat=False, filter_all=None, filter_any=None, color="grey", follow_mirrors=False, include_headers=False): # {{{ def show(parent_id, flat=False, filters=None, color="grey", follow_mirrors=False, include_headers=False, show_description=True, show_id=False): # {{{
root_data = load_from_storage("root") root_data = load_from_storage("root")
project_data, root_data = find_project_by_id(root_data, root_data, parent_id) 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) project_data, root_data = simplify_project(project_data, root_data, follow_mirrors=follow_mirrors)
if flat: if flat:
project_data = flatten_project(project_data) project_data = flatten_project(project_data)
if filter_all is not None: if filters is not None:
pass project_data = filter_project_all(project_data, filters, include_headers=include_headers)
if filter_any is not None: project_data = replace(project_data, r" *<", "<")
project_data = filter_project_any(project_data, filter_any, include_headers=include_headers) project_data = replace(project_data, r" *$", "")
project_data = rstrip(project_data)
project_data = recolor(project_data, colors2) project_data = recolor(project_data, colors2)
project_data = recolor(project_data, colors3)
project_data = recolor(project_data, colors1) project_data = recolor(project_data, colors1)
project_data = strip(project_data, r"<a href=\".*\">.*</a>") project_data = strip(project_data, r"<a href=\".*\">.*</a>")
project_data = strip(project_data, r"<time .*</time>") project_data = strip(project_data, r"<time .*</time>")
@ -549,8 +553,10 @@ def show(parent_id, flat=False, filter_all=None, filter_any=None, color="grey",
project_data = strip(project_data, r"</[^>]*>") project_data = strip(project_data, r"</[^>]*>")
project_data = highlight(project_data) project_data = highlight(project_data)
project_data = remove_double_spaces(project_data) project_data = remove_double_spaces(project_data)
console.print(f"\n[base3][bold]{project_data['name']}[/][/]\n") console.print(f"\n[base3][bold]{project_data['name']}[/][/]")
print_pretty(project_data, color=color) if project_data.get("description") and show_description:
console.print(f"[base01]{project_data['description']}[/]")
print_pretty(project_data, color=color, show_description=show_description, show_id=show_id)
console.print("") console.print("")
return True return True
@ -567,11 +573,9 @@ def dump(): # {{{
def main(): # {{{ def main(): # {{{
import argparse import argparse
parser = argparse.ArgumentParser(description="Workdlowy CLI") parser = argparse.ArgumentParser(description="Workdlowy CLI")
parser.add_argument("--refresh", action="store_true", help="Refresh session cookie and Workflowy data")
subparsers = parser.add_subparsers(dest="command", required=True) subparsers = parser.add_subparsers(dest="command", required=True)
inbox_parser = subparsers.add_parser("inbox", help="Inbox commands") inbox_parser = subparsers.add_parser("inbox", help="Inbox commands")
inbox_parser.add_argument("name", help="Item text", nargs="*") inbox_parser.add_argument("name", help="Item text", nargs="*")
@ -579,14 +583,26 @@ def main(): # {{{
tasks_parser.add_argument("filter", help="Filter text", nargs="*", default=None) tasks_parser.add_argument("filter", help="Filter text", nargs="*", default=None)
subparsers.add_parser("dump", help="Dump storage") subparsers.add_parser("dump", help="Dump storage")
subparsers.add_parser("refresh", help="Refresh session cookie and Workflowy data")
for planner_name, planner_id in PLANNER_IDS.items(): for planner_name, planner_id in PLANNER_IDS.items():
planner_parser = subparsers.add_parser(planner_name, help=f"{planner_name.capitalize()} commands") planner_parser = subparsers.add_parser(planner_name, help=f"{planner_name.capitalize()} commands")
planner_parser.add_argument("filter", help="Filter text", nargs="*", default=None) planner_parser.add_argument("filter", help="Filter text", nargs="*", default=None)
planner_parser.add_argument("--hide-comments", action="store_true", help="Do not show comments")
planner_parser.add_argument("--flat", action="store_true", help="Show flat list")
planner_parser.add_argument("--hide-headers", action="store_true", help="Hide headers")
planner_parser.add_argument("--show-id", action="store_true", help="Show item id")
focus_parser = subparsers.add_parser("focus", help="Focus commands")
focus_parser.add_argument("id", help="Item id", nargs=1)
focus_parser.add_argument("--hide-comments", action="store_true", help="Do not show comments")
focus_parser.add_argument("--flat", action="store_true", help="Show flat list")
focus_parser.add_argument("--hide-headers", action="store_true", help="Hide headers")
focus_parser.add_argument("--show-id", action="store_true", help="Show item id")
args = parser.parse_args() args = parser.parse_args()
if args.refresh: if args.command == "refresh":
refresh_cookie() refresh_cookie()
refresh_workflowy_data() refresh_workflowy_data()
@ -602,19 +618,24 @@ def main(): # {{{
if args.command == "tasks": if args.command == "tasks":
if args.filter: if args.filter:
if args.filter == "today": if args.filter == ["today"]:
show(TASKS_ID, filter_any=[get_today()], flat=True, follow_mirrors=True, include_headers=True) t = get_today()
show(TASKS_ID, filters=[t], flat=True, follow_mirrors=True, include_headers=True, show_description=not args.hide_comments, show_id=args.show_id)
else: else:
show(TASKS_ID, filter_any=args.filter, flat=True, follow_mirrors=True, include_headers=True) show(TASKS_ID, filters=args.filter, flat=True, follow_mirrors=True, include_headers=True, show_description=not args.hide_comments, show_id=args.show_id)
else: else:
show(TASKS_ID, follow_mirrors=True) show(TASKS_ID, follow_mirrors=True, show_description=not args.hide_comments, show_id=args.show_id)
for planner_name, PLANNER_ID in PLANNER_IDS.items(): for planner_name, PLANNER_ID in PLANNER_IDS.items():
if args.command == planner_name: if args.command == planner_name:
if args.filter: if args.filter:
show(PLANNER_ID, filter_any=args.filter) show(PLANNER_ID, filters=args.filter, show_description=not args.hide_comments, flat=args.flat, include_headers=not args.hide_headers, show_id=args.show_id)
else: else:
show(PLANNER_ID) show(PLANNER_ID, show_description=not args.hide_comments, flat=args.flat, include_headers=not args.hide_headers, show_id=args.show_id)
if args.command == "focus":
show(args.id[0], follow_mirrors=True, show_description=not args.hide_comments, flat=args.flat, include_headers=not args.hide_headers, show_id=args.show_id)
# }}} # }}}

Loading…
Cancel
Save