from streamlit_ace import st_ace import streamlit as st class CodeEditor: def detect_language(self, filename: str) -> str: mapping = { ".py": "python", ".js": "javascript", ".html": "html", ".css": "css", ".json": "json", ".md": "markdown", } for ext, lang in mapping.items(): if filename.endswith(ext): return lang return "text" def display_code(self, code_content: str, filename: str = "") -> tuple: """ Renders a toolbar row (Apply is built into st_ace, Run is next to it) then the ACE editor below. Returns (new_value, run_clicked) where new_value is None until Apply is hit. """ language = self.detect_language(filename) # --- Toolbar: filename label + Run button aligned right --- label_col, run_col = st.columns([6, 1]) with label_col: st.caption(f" {filename.split('/')[-1] or filename}" if filename else "") with run_col: run_clicked = st.button( "▶ RUN CODE", key=f"run_{filename}", type="primary", use_container_width=True ) new_value = st_ace( value=code_content, language=language, theme="chrome", key=f"ace_{filename}", font_size=14, tab_size=4, wrap=False, auto_update=False, show_gutter=True, show_print_margin=False, ) return new_value, run_clicked