From 5b511911d81242457bfb5fc808a9b9f35fe9f7a2 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 3 Oct 2025 00:26:43 -0700 Subject: [PATCH] i don't like this chatgpt --- system/ui/widgets/html_render.py | 59 ++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/system/ui/widgets/html_render.py b/system/ui/widgets/html_render.py index 11163bd0aa..e3d87eb713 100644 --- a/system/ui/widgets/html_render.py +++ b/system/ui/widgets/html_render.py @@ -18,6 +18,7 @@ class ElementType(Enum): H5 = "h5" H6 = "h6" P = "p" + LI = "li" BR = "br" @@ -31,6 +32,7 @@ class HtmlElement: margin_top: int margin_bottom: int line_height: float = 1.2 + indent_level: int = 0 class HtmlRenderer(Widget): @@ -39,6 +41,7 @@ class HtmlRenderer(Widget): self.elements: list[HtmlElement] = [] self._normal_font = gui_app.font(FontWeight.NORMAL) self._bold_font = gui_app.font(FontWeight.BOLD) + self._list_indent_px = 40 self.styles: dict[ElementType, dict[str, Any]] = { ElementType.H1: {"size": 68, "weight": FontWeight.BOLD, "color": rl.BLACK, "margin_top": 20, "margin_bottom": 16}, @@ -48,6 +51,7 @@ class HtmlRenderer(Widget): ElementType.H5: {"size": 44, "weight": FontWeight.BOLD, "color": rl.BLACK, "margin_top": 12, "margin_bottom": 6}, ElementType.H6: {"size": 40, "weight": FontWeight.BOLD, "color": rl.BLACK, "margin_top": 10, "margin_bottom": 4}, ElementType.P: {"size": 38, "weight": FontWeight.NORMAL, "color": rl.Color(40, 40, 40, 255), "margin_top": 8, "margin_bottom": 12}, + ElementType.LI: {"size": 38, "weight": FontWeight.NORMAL, "color": rl.Color(40, 40, 40, 255), "margin_top": 6, "margin_bottom": 6}, ElementType.BR: {"size": 0, "weight": FontWeight.NORMAL, "color": rl.BLACK, "margin_top": 0, "margin_bottom": 12}, } @@ -72,30 +76,40 @@ class HtmlRenderer(Widget): # Remove DOCTYPE, html, head, body tags but keep their content html_content = re.sub(r']*>', '', html_content) html_content = re.sub(r']*>', '', html_content) + # Keep UL tags to track nesting/indent # Find all HTML elements - pattern = r'<(h[1-6]|p)(?:[^>]*)>(.*?)|' - matches = re.finditer(pattern, html_content, re.DOTALL | re.IGNORECASE) - - for match in matches: - if match.group(0).lower().startswith(']*>|)|<(h[1-6]|p|li)(?:[^>]*)>(.*?)|' + indent_level = 0 + for match in re.finditer(pattern, html_content, re.DOTALL | re.IGNORECASE): + whole = match.group(0) + ul_tag = match.group(1) + tag = match.group(2) + content = match.group(3) + + if whole.lower().startswith(' tags self._add_element(ElementType.BR, "") + elif ul_tag is not None: + if ul_tag.lower().startswith(' None: + t = tag.lower() + txt = (content or '').strip() + txt = re.sub(r'\s+', ' ', txt).strip() + if txt: + element_type = ElementType(t) + self._add_element(element_type, txt, indent_level=(indent_level if element_type == ElementType.LI else max(0, indent_level - 1))) + + def _add_element(self, element_type: ElementType, content: str, indent_level: int = 0) -> None: style = self.styles[element_type] + # Simple bullet support for list items + if element_type == ElementType.LI: + content = f"• {content}" + element = HtmlElement( type=element_type, content=content, @@ -104,6 +118,7 @@ class HtmlRenderer(Widget): color=style["color"], margin_top=style["margin_top"], margin_bottom=style["margin_bottom"], + indent_level=indent_level, ) self.elements.append(element) @@ -116,7 +131,7 @@ class HtmlRenderer(Widget): def _render_content(self, rect: rl.Rectangle, scroll_offset: float = 0) -> float: current_y = rect.y + scroll_offset padding = 20 - content_width = rect.width - (padding * 2) + base_content_width = rect.width - (padding * 2) for element in self.elements: if element.type == ElementType.BR: @@ -129,7 +144,8 @@ class HtmlRenderer(Widget): if element.content: font = self._get_font(element.font_weight) - wrapped_lines = wrap_text(font, element.content, element.font_size, int(content_width)) + indent_px = (element.indent_level * self._list_indent_px) if element.type == ElementType.LI else 0 + wrapped_lines = wrap_text(font, element.content, element.font_size, int(base_content_width - indent_px)) for line in wrapped_lines: if current_y < rect.y - element.font_size: @@ -139,7 +155,7 @@ class HtmlRenderer(Widget): if current_y > rect.y + rect.height: break - rl.draw_text_ex(font, line, rl.Vector2(rect.x + padding, current_y), element.font_size, 0, rl.WHITE) + rl.draw_text_ex(font, line, rl.Vector2(rect.x + padding + indent_px, current_y), element.font_size, 0, rl.WHITE) current_y += element.font_size * element.line_height @@ -162,7 +178,8 @@ class HtmlRenderer(Widget): if element.content: font = self._get_font(element.font_weight) - wrapped_lines = wrap_text(font, element.content, element.font_size, int(usable_width)) + indent_px = (element.indent_level * self._list_indent_px) if element.type == ElementType.LI else 0 + wrapped_lines = wrap_text(font, element.content, element.font_size, int(usable_width - indent_px)) for _ in wrapped_lines: total_height += element.font_size * element.line_height