diff --git a/rechnung.py b/rechnung.py index 34695e0..7f9a7e2 100755 --- a/rechnung.py +++ b/rechnung.py @@ -15,13 +15,11 @@ import subprocess from datetime import date, timedelta -# Diverse Variablen -# ----------------- - - - class DISPLAY(): ''' + Die Klasse für die Ausgabe von Logmeldungen im Terminal. Schaut, ob und + worauf die Environment Variable "COLORTERM" gesetzt ist, und gibt + entsprechend dem Ergebnis farbige Ausgabem. ''' def __init__(self): self.red = '\x1B[31m' @@ -68,7 +66,7 @@ class DISPLAY(): param 2: string ''' if self.colorify == True: - print(f"{self.green}[+]{self.reset} {msg}", end=end) + print(f"{self.green}[+]{self.reset} {msg}", end=end, flush=True) else: print(f"[+] {msg}", end=end) def WARN(self, msg, end='\n'): @@ -90,6 +88,8 @@ class DISPLAY(): class KUNDE(): ''' + Die Klasse dient lediglich zum Halten der Informationen zu einem + Rechnungskunden. ''' def __init__(self): self.kunde = "" @@ -111,6 +111,7 @@ class RECHNUNG(): self.programm_version = "0.0.1" self.rechnungsfile = "rechnung.ini" self.templatefile = "template.ltx" + self.texhome = "/".join((os.environ["HOME"], "texmf")) self.compiler = "" self.D = DISPLAY() @@ -130,7 +131,7 @@ class RECHNUNG(): ''' param 1: string ''' - self.D.INFO("Teste, ob {} ist lesbar ... ".format(filename), end="") + self.D.INFO("Teste, ob {} lesbar ist ... ".format(filename), end="") response = os.access(filename, os.R_OK) if response == True: self.D.TRUE() @@ -148,7 +149,6 @@ class RECHNUNG(): if response.returncode == 0: self.D.TRUE() self.compiler = program - self.D.INFO(f"Setze {program} als Compiler.") return True else: self.D.FALSE() @@ -345,21 +345,113 @@ class RECHNUNG(): fd.close() return buffer + def check_sty(self): + ''' + Rechnung.sty steht nicht als Paket zur Verfügung. Es muß folglich + von Hand in den Suchpfad von Latex kopiert werden. Die Suche erfolgt + im aktuelle Verzeichnis und in ~/texmf/latex/tex/. + + Achtung: Sollte das Programm später in einem Temporärem Verzeichnis + arbeiten, nutzt das Paket im aktuellen Verzeichnis nichts! + + Achtung: Bei einer Installation wird eine vorhandene Datei + rechnung.sty ohne Nachfrage überschrieben! + + returns: boolean + ''' + package = "rechnung.sty" + + self.D.INFO(f"Teste, ob rechnung.sty installiert ist ... ", end="") + if package in os.listdir(): + self.D.TRUE() + return True + for (dirpath, dirnames, filenames) in os.walk(self.texhome): + if package in filenames: + self.D.TRUE() + return True + self.D.FALSE() + return False + + def install_sty(self): + ''' + Installiert auf Anfrage das Paket rechnung.sty. + ''' + url= "https://github.com/tomka/rechnung" + rechnung_sty_dir = "/".join((self.texhome, "tex/latex/rechnung/")) + + response = input(" Paket 'rechnung' installieren? (y/N): ") + if response not in ("y", "Y", "j", "J"): + self.D.INFO("Breche das Programm ab") + sys.exit(6) + + self.D.INFO("Versuche das Paket 'rechnung' zu installieren.") + self.D.INFO("Nötige Programme: git, latex.") + for program in ("git", "latex"): + if self.check_program(program) is False: + self.D.ERROR(f"Kann {program} nicht finden. Breche ab.") + sys.exit(1) + + self.D.INFO("Klone Repo ... ", end="") + response = subprocess.run(["git", "clone", url], + capture_output=True, + timeout=180) + if response.returncode != 0: + self.D.FALSE() + self.D.ERROR(f"Fehler beim Klonen des Repos") + sys.exit(1) + else: self.D.TRUE() + + old_pwd = os.environ["PWD"] + os.chdir("rechnung") + self.D.INFO("Versuche 'rechnung.sty' zu bauen ... ", end="") + response = subprocess.run(["latex", "rechnung.ins"], capture_output=True) + if response.returncode != 0: + self.D.FALSE() + sys.exit(1) + else: self.D.TRUE() + self.D.INFO(f"Lege Verzeichnis '{rechnung_sty_dir}' an ... ", end="") + response = subprocess.run(["mkdir", "-p", rechnung_sty_dir]) + if response.returncode != 0: + self.D.FALSE() + sys.exit(1) + else: self.D.TRUE() + self.D.INFO(f"Kopiere 'rechnung.sty' nach '{rechnung_sty_dir}' ... ", end="") + response = subprocess.run(["cp", "rechnung.sty", rechnung_sty_dir]) + if response.returncode != 0: + self.D.FALSE() + else: self.D.TRUE() + + def preup(self): + ''' + Führt einige Prüfungen durch. + - Kundendatei und Latex-Template müssen lesbar sein. + - Rechnung.sty muß installiert sein. Ist dies nicht der Fall, + sollte es von Github heruntergeladen und gebaut werden. Dafür + sind die Programme Git und latex nötig. + - Es wird ein Latex-Compiler gebraucht. + ''' + + for i in (self.rechnungsfile, self.templatefile): + self.check_readable(i) + + for program in ('pdflatex', 'xelatex', 'luatex', 'latex'): + if self.check_program(program) == True: + break + + if self.check_sty() is False: + self.install_sty() + + if self.compiler == "": + self.D.ERROR("Kann keinen Compiler finden. Exit") + sys.exit(2) + + def run(self): ''' ''' self.print_header() - - for i in (self.rechnungsfile, self.templatefile): - self.check_readable(i) - - for program in ('pdflatex', 'xelatex', 'luatex'): - if self.check_program(program) == True: - break - if self.compiler == "": - self.D.ERROR("Kann keinen Compiler finden. Exit") - sys.exit(2) + self.preup() buffer = self.get_file_content(self.rechnungsfile) if buffer is None: