""" 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}")