aboutsummaryrefslogtreecommitdiff
path: root/time2tex.py
diff options
context:
space:
mode:
authorLoek Le Blansch <loek@pipeframe.xyz>2024-09-05 17:25:24 +0200
committerLoek Le Blansch <loek@pipeframe.xyz>2024-09-05 17:25:24 +0200
commitecf5a0fa969f37185de925e7607c7f6e7c6e1d51 (patch)
tree04f9a6f76d9be0e76bfef7fcd011dba0f70762b5 /time2tex.py
parentc129df28338644c43b0a202ff71e1ff61107e765 (diff)
kinda working time overview script
Diffstat (limited to 'time2tex.py')
-rwxr-xr-xtime2tex.py119
1 files changed, 114 insertions, 5 deletions
diff --git a/time2tex.py b/time2tex.py
index 3244b8f..6c8b097 100755
--- a/time2tex.py
+++ b/time2tex.py
@@ -1,17 +1,126 @@
#!/bin/python3
import sys
+from datetime import datetime
+def fmt_duration(sec):
+ mins = (sec + 59) // 60 # integer divide, round up
+ out = []
-if __name__ == "__main__":
- if len(sys.argv) != 2:
- print("usage: time2tex <input>")
- exit(1)
+ if mins == 0:
+ return "--"
+
+ hour = mins // 60
+ if hour > 0:
+ out.append("%02dh" % (hour, ))
+ mins = mins % 60
+
+ out.append("%02dm" % (mins, ))
+
+ return "\\,".join(out)
+
+def fmt_member_overview(times):
+ members = {}
+ total_time = 0
+ for time in times:
+ if not time["name"] in members:
+ members[time["name"]] = 0
+ members[time["name"]] += time["duration"]
+ total_time += time["duration"]
+ print("""\\section{Member overview}\n
+\\begin{table}
+\\centering
+\\begin{tabular}{lr}
+\\toprule
+\\textbf{Member} & \\textbf{Tracked}\\\\
+\\midrule""")
+ for name, tracked in members.items():
+ print(f"{name} & {fmt_duration(tracked)}\\\\")
+ print("\\midrule")
+ print(f"& sum\\quad {fmt_duration(total_time)}\\\\")
+ print("""\\bottomrule
+\\end{tabular}
+\\caption{Tracked time per group member}
+\\label{tab:time-member}
+\\end{table}""")
+
+def duration2secs(duration):
+ out = 0 # output (seconds)
+ cur = 0 # current figure (unknown)
+ for c in duration:
+ if c.isdigit():
+ cur = cur * 10 + int(c)
+ continue
+ if c == "h":
+ out += cur * 3600
+ cur = 0
+ continue
+ if c == "m":
+ out += cur * 60
+ cur = 0
+ continue
+ if c == "s":
+ out += cur * 1
+ cur = 0
+ continue
+
+ raise Exception("invalid duration format")
+ if cur != 0: raise Exception("invalid duration format")
+ return out
+
+def line2data(line):
+ # parse fields from input string
+ data = {}
+ next = line.find(':')
+ data["name"] = line[0:next].strip()
+ line = line[next+1:].strip()
+ next = line.find(' ')
+ data["date"] = line[0:next].strip()
+ line = line[next+1:].strip()
+ next = line.find(' ')
+ data["duration"] = line[0:next].strip()
+ line = line[next+1:].strip()
+ data["description"] = line
+ # deserialize parsed fields
+ data["name"] = data["name"].title()
+ data["date"] = datetime.strptime(data["date"], '%Y-%m-%d')
+ data["duration"] = duration2secs(data["duration"])
+ data["description"] = [el.strip() for el in data["description"].split("::")]
+
+ return data
+
+def parse(content):
+ # split content at newlines
+ lines = content.split("\n")
+ out = []
+ for i, line in enumerate(lines):
+ line = line.strip()
+ if line.startswith("#"): continue
+ if len(line) == 0: continue
+
+ try: out.append(line2data(line))
+ except Exception as e: raise Exception(f"line {i+1}: {e}")
+ return out
+
+def fmt(times):
+ fmt_member_overview(times)
+
+def main():
input_file = sys.argv[1]
content = ""
with open(input_file, "r") as file:
content = file.read()
- parsed = parse(content)
+ try: parsed = parse(content)
+ except Exception as e:
+ print(f"{input_file}: {e}")
+ exit(1)
+ fmt(parsed)
+
+if __name__ == "__main__":
+ if len(sys.argv) != 2:
+ print("usage: time2tex <input>")
+ exit(1)
+ main()