From 9e0668d0e06f7d585d9a12bc984292d48c11be56 Mon Sep 17 00:00:00 2001 From: Alec Murphy Date: Sat, 12 Apr 2025 19:57:49 -0400 Subject: [PATCH] System/Libraries/Html/Renderer: Initial support for node->textAlign This only works for very simple cases, but it is enough for centering and right-align text on sites like Wiby, and a centered Google logo. :^) --- System/Libraries/Html/Renderer.HC | 32 +++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/System/Libraries/Html/Renderer.HC b/System/Libraries/Html/Renderer.HC index 4f90d6c..386655e 100644 --- a/System/Libraries/Html/Renderer.HC +++ b/System/Libraries/Html/Renderer.HC @@ -257,6 +257,7 @@ Bool @render_css_for_node(@html_dom_node* node, HtmlRenderer* renderer) node->color = node->parentNode->color; node->fontFamily = node->parentNode->fontFamily; node->fontSize = node->parentNode->fontSize; + node->textAlign = node->parentNode->textAlign; } for (i = 0; i < renderer->css_rules->length; i++) { @@ -750,6 +751,16 @@ U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer) } } + if (node->attributes->@("align")) { + if (!StrICmp(node->attributes->@("align"), "center")) + node->textAlign = CSS_TEXT_ALIGN_CENTER; + if (!StrICmp(node->attributes->@("align"), "right")) + node->textAlign = CSS_TEXT_ALIGN_RIGHT; + } + + if (!StrICmp(node->tagName, "center")) + node->textAlign = CSS_TEXT_ALIGN_CENTER; + Context2DWidget* block_widget; // FIXME: Resolve if display: block is set @@ -838,6 +849,8 @@ U0 @reflow_node_list(HtmlRenderer* renderer) } renderer->max_line_height = RENDERER_DEFAULT_MAX_LINE_HEIGHT; + I64 cumulative_widgets_width; + @window_widgets_list* cumulative_list_item; @window_widgets_list* widget_list_item = renderer->widgets_base->next; Widget* widget; @html_dom_node* node; @@ -853,6 +866,25 @@ U0 @reflow_node_list(HtmlRenderer* renderer) renderer->max_line_height = RENDERER_DEFAULT_MAX_LINE_HEIGHT; } + if (!renderer->render_x && node->textAlign) { + cumulative_list_item = widget_list_item->next; + cumulative_widgets_width = 0; + while (cumulative_list_item && cumulative_list_item->widget && !cumulative_list_item->widget->data(@html_dom_node*)->display_block) { + cumulative_widgets_width += cumulative_list_item->widget->width; + cumulative_list_item = cumulative_list_item->next; + } + switch (node->textAlign) { + case CSS_TEXT_ALIGN_CENTER: + renderer->render_x = (renderer->win->width / 2) - (cumulative_widgets_width / 2); + break; + case CSS_TEXT_ALIGN_RIGHT: + renderer->render_x = renderer->win->width - cumulative_widgets_width; + break; + default: + break; + } + } + widget->x = renderer->render_x; widget->y = renderer->render_y; if (@self_or_ancestor_matches_tag_name(node, "a")) {