#!/usr/bin/env python3 """waybar custom module — the liturgical day in the bar. "custom/typikon": { "exec": "horologion-waybar", "return-type": "json", "interval": 1800, "on-click": "typikon --days 7" } The class is the fast level, so the bar can colour it: style `#custom-typikon.xerophagy` and the rest. `.obligatory` is added where a particular law actually binds. """ import argparse import json import subprocess import sys def run(jurisdiction, days): cmd = ["typikon", "--json", "--days", str(days)] if jurisdiction: cmd += ["--jurisdiction", jurisdiction] out = subprocess.run(cmd, capture_output=True, text=True, check=True).stdout parsed = json.loads(out) return parsed.get("days", [parsed]) def main(): ap = argparse.ArgumentParser() ap.add_argument("-j", "--jurisdiction", default=None) ap.add_argument("-n", "--days", type=int, default=7) ap.add_argument("--no-emoji", action="store_true") ap.add_argument("--format", default="{emoji} {title}", help="{emoji} {title} {feast} {fast} {fastLabel} " "{season} {weekday} {churchDate}") args = ap.parse_args() try: days = run(args.jurisdiction, args.days) except FileNotFoundError: print(json.dumps({"text": "typikon?", "tooltip": "typikon is not on PATH", "class": "error"})) return 1 except (subprocess.CalledProcessError, ValueError) as exc: print(json.dumps({"text": "⚠", "tooltip": str(exc), "class": "error"})) return 1 today = days[0] fields = dict(today) if args.no_emoji: fields["emoji"] = "" text = args.format.format(**{k: fields.get(k) or "" for k in fields}).strip() tip = [] head = today["title"] if today.get("churchDate") and today["churchDate"] not in head: head += f" ({today['churchDate']})" tip.append(f"{head}") if today.get("cycle"): tip.append(f"{today['cycle']}") tip.append("") line = today["fastLabel"] if today.get("obligation") == "obligatory": line += " — obligatory" tip.append(line) if today.get("reason"): tip.append(today["reason"]) if today.get("season"): tip.append(today["season"]) for c in today.get("commemorations", []): if c != today["title"]: tip.append(f"· {c}") if len(days) > 1: tip.append("") for d in days[1:]: tip.append(f"{d['emoji']} {d['weekday'][:3]} {d['title'][:46]}") tip.append("") tip.append(f"Pascha {today['pascha']}") classes = [today["fast"]] if today.get("obligation") == "obligatory": classes.append("obligatory") if today.get("rank"): classes.append(today["rank"]) print(json.dumps({ "text": text, "tooltip": "\n".join(tip), "class": classes, "alt": today["fast"], }, ensure_ascii=False)) return 0 if __name__ == "__main__": sys.exit(main())