# Chris Xiong 2024 # License: Expat (MIT) import os from os import path def stripped_str(x): return str(x).strip() def s2bool(x): return str(x).strip() in ["True", "true", "TRUE"] # "CONFIG_ITEM_NAME": (default value, parse function) CONFIG_ITEMS = { "LOCAL_DATA_ROOT": ("", stripped_str), # e.g. https://chrisoft.org/notekins/ "SERVED_DATA_ROOT": ("", stripped_str), # e.g. chrisoft@10.24.1.1:/home/chrisoft/notedir/ "SYNC_TARGET": ("", stripped_str), "POSTS_PER_PAGE": (20, int), "THUMBNAIL_DIM": (1280, int), "DISPLAY_TIMEZONE": ("UTC", stripped_str), # only used by backend # atom generator stuff "ATOM_ENABLED": (False, s2bool), "VERSION_STRING": ("1.0", stripped_str), "ATOM_TITLE": ("", stripped_str), "ATOM_ROOT": ("", stripped_str), "ATOM_SUBTITLE": ("", stripped_str), "ATOM_ICON": ("", stripped_str), "ATOM_AUTHOR": ("", stripped_str), "ATOM_NPOSTS": (20, int) } class config: def __init__(self): self.d = dict([(name, prop[0]) for name, prop in CONFIG_ITEMS.items()]) p = os.getcwd() self.f = None try: while not path.isfile(path.join(p, "notekins.conf")): if p == path.dirname(p): raise FileNotFoundError("Cannot locate configuration file.") p = path.dirname(p) fn = path.join(p, "notekins.conf") self.f = fn print(f"Using configuration file {fn}") with open(fn, "r") as f: for l in f: try: n, v = l.split('=') if n not in CONFIG_ITEMS: continue self.d[n] = CONFIG_ITEMS[n][1](v) except ValueError: pass except FileNotFoundError: pass def __getattr__(self, k): return self.d[k] def require(self): if self.f is None: print("This operation requires a configuration file, but none was found.") exit(1) conf = config()