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 api_interface
|
||||||
import shell_functions
|
import shell_functions
|
||||||
|
import markdown_parser
|
||||||
|
|
||||||
logger = logging.getLogger("robovojtik.ui")
|
logger = logging.getLogger("robovojtik.ui")
|
||||||
|
|
||||||
# Definujeme globální proměnnou automode zde
|
# Definujeme globální proměnnou automode
|
||||||
automode = False
|
automode = False
|
||||||
|
|
||||||
def main_curses(stdscr):
|
def main_curses(stdscr):
|
||||||
@ -87,8 +88,11 @@ def main_curses(stdscr):
|
|||||||
|
|
||||||
chat_history = []
|
chat_history = []
|
||||||
def add_to_chat(text):
|
def add_to_chat(text):
|
||||||
chat_history.append(text)
|
# Použijeme markdown_parser pro formátování
|
||||||
chat_win.addstr(text + "\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()
|
chat_win.refresh()
|
||||||
|
|
||||||
add_to_chat("Historie chatu:")
|
add_to_chat("Historie chatu:")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user