from panflute import Doc import os class Context: def __init__(self, doc: Doc, path: str, parent: 'Context'=None): self.parent = parent self._commands = {} self.doc = doc self.path = path self.dir = os.path.dirname(path) if os.path.dirname(path) != "" else "." self.filename = os.path.basename(path) if self.get_metadata("flags", immediate=True) is None: self.set_metadata("flags", {}) def get_command(self, command: str): if command in self._commands: return self._commands[command] elif self.parent: return self.parent.get_command(command) else: return None def set_command(self, command: str, val): self._commands[command] = val def unset_command(self, command: str): del self._commands[command] def is_flag_set(self, flag: str): if self.get_metadata("flags."+flag): if self.get_metadata("flags."+flag): return True else: return False elif self.parent: return self.parent.is_flag_set(flag) else: return False def set_flag(self, flag: str, val: bool): self.set_metadata("flags."+flag, val) def unset_flag(self, flag): self.unset_metadata("flags."+flag) def get_metadata(self, key, simple=True, immediate=False): value = self.doc.get_metadata(key, None, simple) if value is not None: return value elif self.parent and not immediate: return self.parent.get_metadata(key) else: return None def set_metadata(self, key, value): if key == "language": print("WARN: Setting language this way doesn't propagate to TeX. Either use the Front Matter or specify it additionally using the \\languagexx macro.") meta = self.doc.metadata key = key.split(".") for k in key[:-1]: meta = meta[k] meta[key[-1]] = value def unset_metadata(self, key): meta = self.doc.metadata key = key.split(".") for k in key[:-1]: meta = meta[k] del meta.content[key[-1]] # A hack because MetaMap doesn't have a __delitem__