# Copyright (c) 2025 Martin Kayser (tebarius) # Licensed under the MIT License. See LICENSE file in the project root. import streamlit as st import base64 import tools standard_output = ('#### Um den HILFE-Text zu einzelnen Funktionen aufzurufen bitte die Funktion mit leerem' ' Eingabefeld aufrufen.') st.set_page_config( # we do also patching static-files of streamlit in the docker-container so bookmarks will have # the same favicon and if posting links for example in whatsapp they will have the same title page_title="tebarius Mysteryhelfer (web)", page_icon="images/favicon.ico", layout="wide", menu_items={ 'About': '### tebarius Mysteryhelfer (web)\n' 'Dies ist die Umsetzung der [Desktop-App Mysteryhelfer](https://mysteryhelfer.tebarius.duckdns.org/) ' '([Source](https://gitea.tebarius.duckdns.org/tebarius/Mysteryhelfer)) als Web-App. \n \n' 'Für die Umsetzung kommt das Python-Framework [Streamlit](https://streamlit.io/) zum Einsatz. \n \n' '_Der Sourcecode und Docker-Images zum selbst hosten sind auf_ ' '_https://gitea.tebarius.duckdns.org/tebarius/Mysteryhelfer-web verfügbar._ \n \n' 'Anregungen, Hinweise, Fehlerreports gerne an: ' '[tba@gmx.li](mailto:tba@gmx.li?subject=Mysteryhelfer-web) oder über einen Logeintrag beim ' '[App-TB](https://www.geocaching.com/track/details.aspx?tracker=arx57k) ' '(trackbar auf geocaching.com).', } ) st.logo('images/logo.png', size='large', link='https://gitea.tebarius.duckdns.org/tebarius/Mysteryhelfer-web') logo_col, title_col = st.columns([1,4]) with logo_col: st.markdown(f'' f'' f'', unsafe_allow_html=True) with title_col: st.write('### tebarius Mysteryhelfer (web)') # Callback-Funktion zur Verarbeitung der Auswahl def auswahl_verarbeiten(): text = st.session_state.input_text auswahl = st.session_state.option if auswahl == "Wähle eine Funktion": st.session_state.output_text = standard_output st.session_state.map_data = None elif "Cesarchiffre (all)" in auswahl: st.session_state.output_text = tools.cesar_all(text) st.session_state.map_data = None elif "BW,BWW,... ermitteln" in auswahl: st.session_state.output_text = tools.buchstabenwortwert(text) st.session_state.map_data = None elif "Buchstabenwert -> Text" in auswahl: st.session_state.output_text = tools.buchstabenwert_zu_text(text) st.session_state.map_data = None elif "Zeichenzählen" in auswahl: st.session_state.output_text = tools.zeichenanzahl(text) st.session_state.map_data = None elif "Text rückwärts" in auswahl: st.session_state.output_text = tools.zeichenkette_reverse(text) st.session_state.map_data = None elif "Quersumme(n)" in auswahl: st.session_state.output_text = tools.quersummen(text) st.session_state.map_data = None elif "Einschlüsse zählen" in auswahl: st.session_state.output_text = tools.einschluss_count(text) st.session_state.map_data = None elif "ABC -> Morse" in auswahl: st.session_state.output_text = tools.abc_to_morse(text) st.session_state.map_data = None elif "Morse -> ABC" in auswahl: st.session_state.output_text = tools.morse_to_abc(text) st.session_state.map_data = None elif "ROT5" in auswahl: st.session_state.output_text = tools.rot5(text) st.session_state.map_data = None elif "ROT13" in auswahl: st.session_state.output_text = tools.rot13(text) st.session_state.map_data = None elif "ROT18" in auswahl: st.session_state.output_text = tools.rot18(text) st.session_state.map_data = None elif "ROT47" in auswahl: st.session_state.output_text = tools.rot47(text) st.session_state.map_data = None elif "ASCII-Text -> HEX" in auswahl: st.session_state.output_text = tools.ascii_to_hex(text) st.session_state.map_data = None elif "ASCII-Text -> DEZ" in auswahl: st.session_state.output_text = tools.ascii_to_dez(text) st.session_state.map_data = None elif "ASCII-Text -> Octal" in auswahl: st.session_state.output_text = tools.ascii_to_octal(text) st.session_state.map_data = None elif "ASCII-Text -> BIN (16bit)" in auswahl: st.session_state.output_text = tools.ascii_to_bin16(text) st.session_state.map_data = None elif "ASCII-Text -> BIN (8bit)" in auswahl: st.session_state.output_text = tools.ascii_to_bin8(text) st.session_state.map_data = None elif "HEX -> ASCII-Text" in auswahl: st.session_state.output_text = tools.hex_to_ascii(text) st.session_state.map_data = None elif "DEZ -> ASCII-Text" in auswahl: st.session_state.output_text = tools.dez_to_ascii(text) st.session_state.map_data = None elif "Octal -> ASCII-Text" in auswahl: st.session_state.output_text = tools.octal_to_ascii(text) st.session_state.map_data = None elif "BIN -> ASCII-Text" in auswahl: st.session_state.output_text = tools.bin_to_ascii(text) st.session_state.map_data = None elif "Zahlwortsuche-DE (0-12)" in auswahl: st.session_state.output_text = tools.zahlwortsuche_de(text) st.session_state.map_data = None elif "Zahlwortsuche-EN (0-15)" in auswahl: st.session_state.output_text = tools.zahlwortsuche_en(text) st.session_state.map_data = None elif "KENNYspeak kodieren" in auswahl: st.session_state.output_text = tools.kenny_kodieren(text) st.session_state.map_data = None elif "KENNYspeak dekodieren" in auswahl: st.session_state.output_text = tools.kenny_dekodieren(text) st.session_state.map_data = None elif "KENNYspeak raten" in auswahl: st.session_state.output_text = tools.kenny_raten(text) st.session_state.map_data = None elif "Primz.Alpha dekodieren" in auswahl: st.session_state.output_text = tools.primzahlalphabet_dekodieren(text) st.session_state.map_data = None elif "ist (n.te) Primzahl?" in auswahl: st.session_state.output_text = tools.primzahlpruefen(text) st.session_state.map_data = None elif "zeige n.te Primzahl" in auswahl: st.session_state.output_text = tools.nte_primzahl(text) st.session_state.map_data = None elif "Primfaktorenzerlegung" in auswahl: st.session_state.output_text = tools.primfaktoren(text) st.session_state.map_data = None elif "HEX -> DEZ,OCT,BIN" in auswahl: st.session_state.output_text = tools.hex_to_dez_oct_bin(text) st.session_state.map_data = None elif "DEZ -> HEX,OCT,BIN" in auswahl: st.session_state.output_text = tools.dez_to_hex_oct_bin(text) st.session_state.map_data = None elif "OCT -> HEX,DEZ,BIN" in auswahl: st.session_state.output_text = tools.oct_to_hex_dez_bin(text) st.session_state.map_data = None elif "BIN -> HEX,DEZ,OCT" in auswahl: st.session_state.output_text = tools.bin_to_hex_dez_oct(text) st.session_state.map_data = None elif "Text -> Tomtom" in auswahl: st.session_state.output_text = tools.abc_to_tomtom(text) st.session_state.map_data = None elif "Tomtom -> Text" in auswahl: st.session_state.output_text = tools.tomtom_to_abc(text) st.session_state.map_data = None elif "Text -> Slash and Pipe" in auswahl: st.session_state.output_text = tools.text_to_slashpipe(text) st.session_state.map_data = None elif "Slash and Pipe -> Text" in auswahl: st.session_state.output_text = tools.slashpipe_to_text(text) st.session_state.map_data = None elif "PSE: O.zahl <-> Symbol" in auswahl: st.session_state.output_text = tools.periodensystem(text) st.session_state.map_data = None elif "Nak-Nak -> Text" in auswahl: st.session_state.output_text = tools.naknak_to_text(text) st.session_state.map_data = None elif "Navajo -> Text" in auswahl: st.session_state.output_text = tools.navajo_to_text(text) st.session_state.map_data = None elif "Kreiszahl PI" in auswahl: st.session_state.output_text = tools.pi_suche(text) st.session_state.map_data = None elif "Eulersche Zahl" in auswahl: st.session_state.output_text = tools.euler_suche(text) st.session_state.map_data = None elif "phi (goldener Schnitt)" in auswahl: st.session_state.output_text = tools.goldener_schnitt_suche(text) st.session_state.map_data = None elif "Anagrammsuche-DE" in auswahl: st.session_state.output_text = tools.anagramm_suche_de(text) st.session_state.map_data = None elif "Anagrammsuche-EN" in auswahl: st.session_state.output_text = tools.anagramm_suche_en(text) st.session_state.map_data = None elif "Wortsuche-DE" in auswahl: st.session_state.output_text = tools.wortsuche_de(text) st.session_state.map_data = None elif "Wortsuche-EN" in auswahl: st.session_state.output_text = tools.wortsuche_en(text) st.session_state.map_data = None elif "Re-Morse-DE" in auswahl: st.session_state.output_text = tools.remorse_de(text) st.session_state.map_data = None elif "Re-Morse-EN" in auswahl: st.session_state.output_text = tools.remorse_en(text) st.session_state.map_data = None elif "T9-DE dekodieren" in auswahl: st.session_state.output_text = tools.t9_de(text) st.session_state.map_data = None elif "T9-EN dekodieren" in auswahl: st.session_state.output_text = tools.t9_en(text) st.session_state.map_data = None elif "Vigenere-Chiffre" in auswahl: st.session_state.output_text = tools.vigenere(text, additional_parameter) st.session_state.map_data = None elif "Wolseley-Chiffre" in auswahl: st.session_state.output_text = tools.wolseley(text, additional_parameter) st.session_state.map_data = None elif "Mono.-Substitution" in auswahl: st.session_state.output_text = tools.monoalphasubstitution(text, additional_parameter) st.session_state.map_data = None elif "Autokey-Chiffre" in auswahl: st.session_state.output_text = tools.autokey(text, additional_parameter) st.session_state.map_data = None elif "Polybios kodieren" in auswahl: st.session_state.output_text = tools.polybios_encode(text, additional_parameter) st.session_state.map_data = None elif "Polybios dekodieren" in auswahl: st.session_state.output_text = tools.polybios_decode(text, additional_parameter) st.session_state.map_data = None elif "Klopfcode kodieren" in auswahl: st.session_state.output_text = tools.klopfcode_encode(text) st.session_state.map_data = None elif "Klopfcode dekodieren" in auswahl: st.session_state.output_text = tools.klopfcode_decode(text) st.session_state.map_data = None elif "Maptiles/Kachelkoord." in auswahl: output, mapd = tools.maptiles_kachelkoordinaten(text) st.session_state.output_text = output st.session_state.map_data = mapd elif "Quadtree/Quadkey" in auswahl: output, mapd = tools.quadtree_koordinaten(text) st.session_state.output_text = output st.session_state.map_data = mapd elif "Chronogramm" in auswahl: st.session_state.output_text = tools.chronogramm(text) st.session_state.map_data = None elif "Zahl röm. <-> arabisch" in auswahl: st.session_state.output_text = tools.zahlen_roemisch_arabisch_umwandeln(text) st.session_state.map_data = None elif "URL decode" in auswahl: st.session_state.output_text = tools.url_decode(text) st.session_state.map_data = None elif "Reverse-Wherigo" in auswahl: output, mapd = tools.reversewig(text) st.session_state.output_text = output st.session_state.map_data = mapd elif "Base64 <-> ASCII" in auswahl: st.session_state.output_text = tools.base64_ascii(text) st.session_state.map_data = None elif "Jägerzaun kodieren" in auswahl: st.session_state.output_text = tools.jaegerzaun_encrypt(text, additional_parameter) st.session_state.map_data = None elif "Jägerzaun dekodieren" in auswahl: st.session_state.output_text = tools.jaegerzaun_decrypt(text, additional_parameter) st.session_state.map_data = None elif "ADFGX kodieren" in auswahl: st.session_state.output_text = tools.adfgx_kodieren(text, additional_parameter) st.session_state.map_data = None elif "ADFGX dekodieren" in auswahl: st.session_state.output_text = tools.adfgx_dekodieren(text, additional_parameter) st.session_state.map_data = None elif "ADFGVX kodieren" in auswahl: st.session_state.output_text = tools.adfgvx_kodieren(text, additional_parameter) st.session_state.map_data = None elif "ADFGVX dekodieren" in auswahl: st.session_state.output_text = tools.adfgvx_dekodieren(text, additional_parameter) st.session_state.map_data = None # Standardwerte im Session State initialisieren if 'option' not in st.session_state: st.session_state.option = "Wähle eine Funktion" if 'input_text' not in st.session_state: st.session_state.input_text = "" if 'output_text' not in st.session_state: st.session_state.output_text = standard_output if 'map_data' not in st.session_state: st.session_state.map_data = None # Eingabefeld im Hauptbereich input_text = st.text_area('Gib deinen Text hier ein und wähle eine Funktion im Menü auf der linken Seite:', key='input_text', height=150) # --- Sidebar: Buttons selektieren und Aktion setzen --- option = st.sidebar.radio("hidden_label", # :color[text to be colored] -> ex.: blue[my text] # supported colors: blue, green, orange, red, violet, gray/grey, rainbow, or primary # :color-badge[text in the badge] -> ex.: blue-badge[my text] # blue, green, orange, red, violet, gray/grey, or primary options=("Wähle eine Funktion", ":orange[Cesarchiffre (all)]", ":orange[BW,BWW,... ermitteln]", ":blue[Buchstabenwert -> Text]", ":orange[Zeichenzählen]", ":orange[Text rückwärts]", ":blue[Quersumme(n)]", ":orange[Einschlüsse zählen]", ":green[ABC -> Morse]", ":green[Morse -> ABC]", ":green[ROT5]", ":green[ROT13]", ":green[ROT18]", ":green[ROT47]", ":orange[ASCII-Text -> HEX]", ":orange[ASCII-Text -> DEZ]", ":orange[ASCII-Text -> Octal]", ":orange[ASCII-Text -> BIN (16bit)]", ":orange[ASCII-Text -> BIN (8bit)]", ":blue[HEX -> ASCII-Text]", ":blue[DEZ -> ASCII-Text]", ":blue[Octal -> ASCII-Text]", ":orange-badge[Zahlwortsuche-DE (0-12)]", ":orange-badge[Zahlwortsuche-EN (0-15)]", ":green[KENNYspeak kodieren]", ":green[KENNYspeak dekodieren]", ":green-badge[KENNYspeak raten]", ":green[Primz.Alpha dekodieren]", ":blue[ist (n.te) Primzahl?]", ":blue[zeige n.te Primzahl]", ":blue[Primfaktorenzerlegung]", ":blue[HEX -> DEZ,OCT,BIN]", ":blue[DEZ -> HEX,OCT,BIN]", ":blue[OCT -> HEX,DEZ,BIN]", ":blue[BIN -> HEX,DEZ,OCT]", ":green[Text -> Tomtom]", ":green[Tomtom -> Text]", ":green[Text -> Slash and Pipe]", ":green[Slash and Pipe -> Text]", ":green[PSE: O.zahl <-> Symbol]", ":green[Nak-Nak -> Text]", ":green[Navajo -> Text]", ":blue[Kreiszahl PI]", ":blue[Eulersche Zahl]", ":blue[phi (goldener Schnitt)]", ":orange-badge[Anagrammsuche-DE]", ":orange-badge[Anagrammsuche-EN]", ":orange-badge[Wortsuche-DE]", ":orange-badge[Wortsuche-EN]", ":green-badge[Re-Morse-DE]", ":green-badge[Re-Morse-EN]", ":green-badge[T9-DE dekodieren]", ":green-badge[T9-EN dekodieren]", ":green[Vigenere-Chiffre]", ":green[Wolseley-Chiffre]", ":green[Mono.-Substitution]", ":green[Autokey-Chiffre]", ":green[Polybios kodieren]", ":green[Polybios dekodieren]", ":green[Klopfcode kodieren]", ":green[Klopfcode dekodieren]", ":violet[Maptiles/Kachelkoord.]", ":violet[Quadtree/Quadkey]", ":orange[Chronogramm]", ":blue[Zahl röm. <-> arabisch]", ":orange[URL decode]", ":violet[Reverse-Wherigo]", ":green[Base64 <-> ASCII]", ":green[Jägerzaun kodieren]", ":green[Jägerzaun dekodieren]", ":green[ADFGX kodieren]", ":green[ADFGX dekodieren]", ":green[ADFGVX kodieren]", ":green[ADFGVX dekodieren]", ), key='option', on_change=auswahl_verarbeiten, label_visibility='collapsed' ) # Optionales einzeiliges Eingabefeld nur für bestimmte Funktionen additional_parameter = None if option in ["Vigenere-Chiffre", "Wolseley-Chiffre", "Autokey-Chiffre", "Polybios kodieren", "Polybios dekodieren"]: additional_parameter = st.text_input( "Schlüsselwort:", placeholder="Schlüsselwort hier eingeben" ) elif option in ["Mono.-Substitution"]: additional_parameter = st.text_input( "Schlüsselwort/Schlüsselalphabet:", placeholder="Schlüsselwort/Schlüsselalphabet hier eingeben" ) elif option in ["Jägerzaun kodieren", "Jägerzaun dekodieren"]: additional_parameter = st.text_input( "Schlüsselfeld:", placeholder="Schlüsselzahl hier eingeben" ) elif option in ["ADFGX kodieren", "ADFGX dekodieren", "ADFGVX kodieren", "ADFGVX dekodieren"]: additional_parameter = st.text_input( "Passwörter:", placeholder="PasswortEins, PasswortZwei" ) # Button zum manuellen Ausführen der Verarbeitungsfunktion if st.button(f"{st.session_state.option}"): auswahl_verarbeiten() # Ausgabefeld st.markdown(st.session_state.output_text) # Karte anzeigen, falls aktiviert if st.session_state.map_data is not None: st.subheader("Kartenansicht") st.map(st.session_state.map_data)