#!/usr/bin/python3 from random import randint, random, choice greeting = """ Englisch version below. Hallo, Sie hatten ja um eine Liste der aktuell exmatrikulationsgefährdeten Studierenden gebeten. In der Datenbank sind zwei auf die weiteren Kriterien treffende Studierende zu finden, leider gibt es aber noch einen großen Bestand an nicht korrekt eingepflegten Prüfungsakten, die wir Ihnen zwar digital, aber nicht in einem einheitlichen Format zur Verfügung stellen können. Vielleicht können Sie den ja mit regulären Ausdrücken filtern. Viel Spaß === ENGLISCH VERSION === Hi, we have two students matching the criteria from the database and a certain amount of unstructured data. Maybe you can filter it with regular expressions? Good luck. """ def matriculation_number(): return randint(40_000_000, 55_000_000) # fünf Tatverdächtige # Uhrzeiten, siehe Infos von Verantwortlichen # Groß-Klein-Schreibung class Choice: def __init__(self, **data): """ stores a dict. the keys are strings that indicate the next state, the values are lists that store the possible emissions in transition to that new state. """ self.data = data self.new_states = list(self.data.keys()) def choose(self): new_state = choice(self.new_states) emission = choice(self.data[new_state]) return new_state, emission class SingleArgChoice: def __init__(self, kwarg): if len(kwarg) != 1: raise ValueError( f"{self.__class__.__name__} takes exactly one keyword argument!" ) for self.next_state, self.value in kwarg.items(): pass class RandInt(SingleArgChoice): def __init__(self, **kwarg): super().__init__(kwarg) assert len(self.value) == 2 assert type(self.value[0]) == int assert type(self.value[1]) == int self.minimum = self.value[0] self.maximum = self.value[1] def choose(self): number = randint(self.minimum, self.maximum) return self.next_state, f"{number} " class FixedText(SingleArgChoice): def __init__(self, **kwarg): super().__init__(kwarg) self.text = self.value def choose(self): return self.next_state, self.text class Network: def __init__(self, **choices): """ takes a dict, the keys are strings that name states, the values are the choices for new states and emissions possible in these states. the 'start' state and the 'stop' state have their respective special roles. """ self.choices = choices self.recursion_warning = 100 def choose(self): state = 'start' emissions = [] states = [state] while state != 'stop': state, emission = self.choices[state].choose() emissions.append(emission) states.append(states) if len(emissions) > self.recursion_warning: raise RecursionError( "there are over a hundred emissions. probably a bug!" ) return emissions, states network = Network( start = Choice( student = ["Student ", "Studentin ", "", "Studierende:r "], ), student = Choice( last_name = ["Anna ", "Anton ", "Amal "], matr_nr = [""], ), last_name = Choice( student_mit = ["Beier ", "Behar ", "Berger "], ), student_mit = Choice( matr_nr = ["mit "], ), matr_nr = Choice( matr_number = ["Matrikelnummer ", "Matrikel-Nummer ", "MatrNr. ", "Matrikel-Nr. "], ), matr_number = RandInt( hat_den = [ 40_000_000, 55_000_000, ] ), hat_den = FixedText( versuch = "hat den " ), versuch = Choice( nicht = ["Erstversuch ", "1. Versuch "], bestanden = ["Zweitversuch ", "2. Versuch "], ), nicht = Choice( bestanden = ["nicht ", ""], ), bestanden = FixedText( stop = "bestanden." ), ) def generate_text(number_of_lines = 100): result = "" for i in range(200): emissions, _ = network.choose() line = ''.join(emissions) result += line + "\n" return result def read_template(filename = "./template.html"): with open(filename, "r") as file: return file.read() def write_index(text, filename = "./deploy/index.html"): with open(filename, "w") as file: file.write(text) def main(): template = read_template() generated = generate_text() text = template.replace("", generated) write_index(text) if __name__ == "__main__": main()