#!/usr/bin/env python3 import sys import time import argparse import re from datetime import datetime def to_neralie(h, m, s, ms=0): total_ms = (h * 3600 + m * 60 + s) * 1000 + ms nera = (total_ms * 5) // 432 return f"{nera // 1000:03d}:{nera % 1000:03d}" def count_mode(): sys.stdout.write("\033[?25l") try: while True: now = datetime.now() ms = now.microsecond // 1000 sys.stdout.write(f"\r{to_neralie(now.hour, now.minute, now.second, ms)}") sys.stdout.flush() time.sleep(0.0864) except KeyboardInterrupt: pass finally: sys.stdout.write("\033[?25h\n") sys.stdout.flush() def parse_time(time_str): clean = re.sub(r'\s+', '', time_str) h, m, s = 0, 0, 0 if ':' in clean: parts = clean.split(':') try: h = int(parts[0]) if len(parts) > 1: m = int(parts[1]) if len(parts) > 2: s = int(parts[2]) except (ValueError, IndexError): sys.stderr.write("Error: Invalid time format.\n") sys.exit(1) else: try: length = len(clean) if length == 6: h, m, s = int(clean[0:2]), int(clean[2:4]), int(clean[4:6]) elif length == 5: h, m, s = int(clean[0:1]), int(clean[1:3]), int(clean[3:5]) elif length == 4: h, m = int(clean[0:2]), int(clean[2:4]) elif length == 3: h, m = int(clean[0:1]), int(clean[1:3]) elif length == 2: h = int(clean) elif length == 1: h = int(clean) else: raise ValueError except ValueError: sys.stderr.write("Error: Invalid time format. Use HH:MM[:SS] or HHMM[SS].\n") sys.exit(1) if not (0 <= h <= 23 and 0 <= m <= 59 and 0 <= s <= 59): sys.stderr.write("Error: Invalid time values (Expected 00-23 for hours, 00-59 for min/sec).\n") sys.exit(1) return h, m, s def main(): parser = argparse.ArgumentParser( description="Convert standard time to Neralie, or run a continuous clock.", epilog="Examples:\n" " %(prog)s # Print current Neralie time\n" " %(prog)s -c # Run live Neralie clock\n" " %(prog)s 14:30 # Convert 14:30:00 to Neralie\n" " %(prog)s 143000 # Convert 14:30:00 to Neralie", formatter_class=argparse.RawDescriptionHelpFormatter ) parser.add_argument("-v", "--version", action="version", version="Neralie 1.0.0") parser.add_argument("-c", "--count", action="store_true", help="run in continuous count mode") parser.add_argument( "time", metavar="TIME", nargs="?", help="convert a specific time (formats: HH:MM:SS, HHMMSS, HH:MM, HHMM, HH)\n" "If omitted, prints the current local time." ) args = parser.parse_args() if args.count: count_mode() elif args.time: h, m, s = parse_time(args.time) print(to_neralie(h, m, s)) else: now = datetime.now() ms = now.microsecond // 1000 print(to_neralie(now.hour, now.minute, now.second, ms)) if __name__ == "__main__": main()