diff --git a/markdown_parser.py b/markdown_parser.py new file mode 100644 index 0000000..eba27db --- /dev/null +++ b/markdown_parser.py @@ -0,0 +1,62 @@ +""" +Module: markdown_parser.py +---------------------------- +Jednoduchý Markdown parser pro curses. +Rozpozná základní značky: + - **tučně** › curses.A_BOLD + - *kurzíva* › curses.A_UNDERLINE + - `kód` › curses.A_REVERSE (pro zvýraznění kódu) +Vrací seznam segmentů ve tvaru (text, atribut), které lze postupně vypsat pomocí curses. +""" + +import re +import curses + +def parse_markdown(text): + """ + Rozparsuje zadaný text obsahující jednoduché Markdown značky a vrátí seznam + dvojic (segment_text, attribute). Nepodporuje vnořené značky. + + Podporované značky: + **text** › tučně (A_BOLD) + *text* › kurzíva (A_UNDERLINE) + `text` › kód (A_REVERSE) + + Pokud se značky nepárují, vrací zbytek textu s atributem 0. + """ + segments = [] + pos = 0 + pattern = re.compile(r'(\*\*.*?\*\*|\*.*?\*|`.*?`)') + for match in pattern.finditer(text): + start, end = match.span() + # Normalní text před značkou + if start > pos: + segments.append((text[pos:start], 0)) + token = match.group(0) + # Rozpoznání typu tokenu + if token.startswith("**") and token.endswith("**"): + # Bold – odstraníme dvojité hvězdičky + content = token[2:-2] + segments.append((content, curses.A_BOLD)) + elif token.startswith("*") and token.endswith("*"): + # Italic – odstraníme hvězdičky + content = token[1:-1] + segments.append((content, curses.A_UNDERLINE)) + elif token.startswith("`") and token.endswith("`"): + # Inline kód – odstraníme zpětné apostrofy a použijeme reverzní barvu + content = token[1:-1] + segments.append((content, curses.A_REVERSE)) + else: + segments.append((token, 0)) + pos = end + # Zbytek textu + if pos < len(text): + segments.append((text[pos:], 0)) + return segments + +if __name__ == "__main__": + # Jednoduchý test + sample = "Toto je **tučný text**, toto je *kurzíva* a toto je `kód`." + segments = parse_markdown(sample) + for seg, attr in segments: + print(f"Segment: '{seg}', Attr: {attr}") diff --git a/ui.py b/ui.py index 0f3905f..73629fd 100644 --- a/ui.py +++ b/ui.py @@ -11,10 +11,11 @@ import logging import api_interface import shell_functions +import markdown_parser logger = logging.getLogger("robovojtik.ui") -# Definujeme globálnĂ­ promÄ›nnou automode zde +# Definujeme globálnĂ­ promÄ›nnou automode automode = False def main_curses(stdscr): @@ -87,8 +88,11 @@ def main_curses(stdscr): chat_history = [] def add_to_chat(text): - chat_history.append(text) - chat_win.addstr(text + "\n") + # PouĹľijeme markdown_parser pro formátovánĂ­ + segments = markdown_parser.parse_markdown(text) + for seg_text, attr in segments: + chat_win.addstr(seg_text, attr) + chat_win.addstr("\n") chat_win.refresh() add_to_chat("Historie chatu:")