feat(ui): Integrate imgui_markdown and professional fonts for rich text rendering
This commit is contained in:
56
src/markdown_helper.py
Normal file
56
src/markdown_helper.py
Normal file
@@ -0,0 +1,56 @@
|
||||
# src/markdown_helper.py
|
||||
from __future__ import annotations
|
||||
from imgui_bundle import imgui_md, imgui, immapp
|
||||
import webbrowser
|
||||
import os
|
||||
from typing import Optional
|
||||
|
||||
class MarkdownRenderer:
|
||||
"""
|
||||
Wrapper for imgui_md to manage styling, callbacks, and specialized rendering
|
||||
(like syntax highlighting integration).
|
||||
"""
|
||||
def __init__(self):
|
||||
self.options = imgui_md.MarkdownOptions()
|
||||
# Use Inter as the base font for Markdown (matches professional theme)
|
||||
# It expects fonts like Inter-Regular.ttf, Inter-Bold.ttf, etc. in the assets folder
|
||||
self.options.font_options.font_base_path = "fonts/Inter"
|
||||
self.options.font_options.regular_size = 16.0
|
||||
|
||||
# Configure callbacks
|
||||
self.options.callbacks.on_open_link = self._on_open_link
|
||||
|
||||
# Note: Syntax highlighting will be integrated in Phase 2
|
||||
|
||||
def _on_open_link(self, url: str) -> None:
|
||||
"""Handle link clicks in Markdown."""
|
||||
# If it's a URL, open in browser
|
||||
if url.startswith("http"):
|
||||
webbrowser.open(url)
|
||||
else:
|
||||
# Handle local files or internal links
|
||||
# For now, just print. Could integrate with app_controller in Phase 4.
|
||||
print(f"Clicked local link: {url}")
|
||||
|
||||
def render(self, text: str) -> None:
|
||||
"""Render Markdown text using imgui_md."""
|
||||
imgui_md.render(text)
|
||||
|
||||
def render_unindented(self, text: str) -> None:
|
||||
"""Render Markdown text with automatic unindentation."""
|
||||
imgui_md.render_unindented(text)
|
||||
|
||||
# Global instance for easy access
|
||||
_renderer: Optional[MarkdownRenderer] = None
|
||||
|
||||
def get_renderer() -> MarkdownRenderer:
|
||||
global _renderer
|
||||
if _renderer is None:
|
||||
_renderer = MarkdownRenderer()
|
||||
return _renderer
|
||||
|
||||
def render(text: str) -> None:
|
||||
get_renderer().render(text)
|
||||
|
||||
def render_unindented(text: str) -> None:
|
||||
get_renderer().render_unindented(text)
|
||||
Reference in New Issue
Block a user