import gradio as gr import base64 import markdown import urllib.parse import binascii # --- Logic --- MAX_INPUT_LENGTH = 100000 # Limit input size to prevent freezing def validate_input(text): if not text: return False, "Input cannot be empty." if len(text) > MAX_INPUT_LENGTH: return False, f"Input too long (max {MAX_INPUT_LENGTH} characters)." return True, "" # Leet leet_map = { 'A': '4', 'B': '8', 'E': '3', 'G': '6', 'L': '1', 'O': '0', 'S': '5', 'T': '7', 'Z': '2' } reverse_leet_map = {v: k for k, v in leet_map.items()} def to_leet(text): valid, msg = validate_input(text) if not valid: return msg return "".join(leet_map.get(c.upper(), c) for c in text) def from_leet(text): valid, msg = validate_input(text) if not valid: return msg return "".join(reverse_leet_map.get(c.upper(), c) for c in text) # Morse morse_code_map = { 'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.', 'F': '..-.', 'G': '--.', 'H': '....', 'I': '..', 'J': '.---', 'K': '-.-', 'L': '.-..', 'M': '--', 'N': '-.', 'O': '---', 'P': '.--.', 'Q': '--.-', 'R': '.-.', 'S': '...', 'T': '-', 'U': '..-', 'V': '...-', 'W': '.--', 'X': '-..-', 'Y': '-.--', 'Z': '--..', '1': '.----', '2': '..---', '3': '...--', '4': '....-', '5': '.....', '6': '-....', '7': '--...', '8': '---..', '9': '----.', '0': '-----', ' ': '/' } reverse_morse_map = {v: k for k, v in morse_code_map.items()} def to_morse(text): valid, msg = validate_input(text) if not valid: return msg morse = [] for char in text.upper(): morse.append(morse_code_map.get(char, '?')) return " ".join(morse) def from_morse(text): valid, msg = validate_input(text) if not valid: return msg decoded = [] for code in text.split(' '): if code == '/': decoded.append(' ') else: decoded.append(reverse_morse_map.get(code, '')) return "".join(decoded) # Binary def to_binary(text): valid, msg = validate_input(text) if not valid: return msg return " ".join(format(ord(char), '08b') for char in text) def from_binary(text): valid, msg = validate_input(text) if not valid: return msg try: # Remove spaces and validate binary chars clean_text = text.replace(" ", "") if not all(c in '01' for c in clean_text): return "Error: Input contains non-binary characters." # Ensure 8-bit chunks if possible, or just parse what we have # If separated by spaces, process each chunk if " " in text: return "".join(chr(int(b, 2)) for b in text.split()) else: # Process as stream of 8 bits chars = [] for i in range(0, len(clean_text), 8): byte = clean_text[i:i+8] if len(byte) == 8: chars.append(chr(int(byte, 2))) return "".join(chars) except ValueError: return "Error: Invalid Binary input." # Base64 def to_base64(text): valid, msg = validate_input(text) if not valid: return msg return base64.b64encode(text.encode('utf-8')).decode('utf-8') def from_base64(text): valid, msg = validate_input(text) if not valid: return msg try: # Check for valid base64 chars if not all(c.isalnum() or c in '+/=' for c in text.strip()): return "Error: Input contains invalid Base64 characters." return base64.b64decode(text).decode('utf-8') except (binascii.Error, UnicodeDecodeError): return "Error: Invalid Base64 input or padding." # Hex def to_hex(text): valid, msg = validate_input(text) if not valid: return msg return " ".join(format(ord(char), 'x') for char in text) def from_hex(text): valid, msg = validate_input(text) if not valid: return msg try: clean_text = text.replace(" ", "") # Validate hex chars if not all(c.lower() in '0123456789abcdef' for c in clean_text): return "Error: Input contains non-hex characters." return binascii.unhexlify(clean_text).decode('utf-8') except (binascii.Error, ValueError): return "Error: Invalid Hex input." # Markdown def to_markdown_html(text): valid, msg = validate_input(text) if not valid: return msg return markdown.markdown(text) # URL def to_url_encoded(text): valid, msg = validate_input(text) if not valid: return msg return urllib.parse.quote(text) def from_url_encoded(text): valid, msg = validate_input(text) if not valid: return msg try: return urllib.parse.unquote(text) except Exception: return "Error: Invalid URL encoded input." # --- Interface --- with gr.Blocks(theme=gr.themes.Soft(), title="T3XT TR4N5F0RM3R") as demo: gr.Markdown( """ # T3XT TR4N5F0RM3R ⚡ Your one-stop tool for text conversions. """ ) with gr.Tabs(): # Morse Code Tab with gr.TabItem("Morse Code"): with gr.Row(): morse_input = gr.Textbox(label="Input", placeholder="Enter text or Morse code...", lines=5) morse_output = gr.Textbox(label="Output", lines=5) with gr.Row(): btn_to_morse = gr.Button("Text -> Morse") btn_from_morse = gr.Button("Morse -> Text") btn_to_morse.click(to_morse, inputs=morse_input, outputs=morse_output) btn_from_morse.click(from_morse, inputs=morse_input, outputs=morse_output) # Leet Speak Tab with gr.TabItem("Leet Speak"): with gr.Row(): leet_input = gr.Textbox(label="Input", placeholder="Enter text...", lines=5) leet_output = gr.Textbox(label="Output", lines=5) with gr.Row(): btn_to_leet = gr.Button("Text -> Leet") btn_from_leet = gr.Button("Leet -> Text") btn_to_leet.click(to_leet, inputs=leet_input, outputs=leet_output) btn_from_leet.click(from_leet, inputs=leet_input, outputs=leet_output) # Binary Tab with gr.TabItem("Binary"): with gr.Row(): binary_input = gr.Textbox(label="Input", placeholder="Enter text...", lines=5) binary_output = gr.Textbox(label="Output", lines=5) with gr.Row(): btn_to_binary = gr.Button("Text -> Binary") btn_from_binary = gr.Button("Binary -> Text") btn_to_binary.click(to_binary, inputs=binary_input, outputs=binary_output) btn_from_binary.click(from_binary, inputs=binary_input, outputs=binary_output) # Base64 Tab with gr.TabItem("Base64"): with gr.Row(): b64_input = gr.Textbox(label="Input", placeholder="Enter text...", lines=5) b64_output = gr.Textbox(label="Output", lines=5) with gr.Row(): btn_to_b64 = gr.Button("Text -> Base64") btn_from_b64 = gr.Button("Base64 -> Text") btn_to_b64.click(to_base64, inputs=b64_input, outputs=b64_output) btn_from_b64.click(from_base64, inputs=b64_input, outputs=b64_output) # Hex Tab with gr.TabItem("Hex"): with gr.Row(): hex_input = gr.Textbox(label="Input", placeholder="Enter text...", lines=5) hex_output = gr.Textbox(label="Output", lines=5) with gr.Row(): btn_to_hex = gr.Button("Text -> Hex") btn_from_hex = gr.Button("Hex -> Text") btn_to_hex.click(to_hex, inputs=hex_input, outputs=hex_output) btn_from_hex.click(from_hex, inputs=hex_input, outputs=hex_output) # Markdown Tab with gr.TabItem("Markdown"): with gr.Row(): md_input = gr.Textbox(label="Markdown Input", placeholder="# Hello World...", lines=10) md_output = gr.Textbox(label="HTML Output", lines=10) btn_to_html = gr.Button("Convert to HTML") btn_to_html.click(to_markdown_html, inputs=md_input, outputs=md_output) # URL Encoding Tab with gr.TabItem("URL Encode"): with gr.Row(): url_input = gr.Textbox(label="Input", placeholder="https://example.com/foo bar", lines=5) url_output = gr.Textbox(label="Output", lines=5) with gr.Row(): btn_url_enc = gr.Button("Encode") btn_url_dec = gr.Button("Decode") btn_url_enc.click(to_url_encoded, inputs=url_input, outputs=url_output) btn_url_dec.click(from_url_encoded, inputs=url_input, outputs=url_output) if __name__ == "__main__": demo.launch()