Další vylepšení, zatím to zjevně nějak funguje. Základní podpora pro Markdown.
This commit is contained in:
parent
d619fc0f3d
commit
4e3d3466f1
62
markdown_parser.py
Normal file
62
markdown_parser.py
Normal file
@ -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}")
|
10
ui.py
10
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:")
|
||||
|
Loading…
x
Reference in New Issue
Block a user