System/Libraries/Html/Renderer: Refactor @render_node_list

This commit is contained in:
Alec Murphy 2025-04-13 14:39:24 -04:00
parent 3a55fce26a
commit 08313be27f

View file

@ -227,7 +227,7 @@ U32 @css_resolve_color_from_rrggbb(U8* str)
} }
} }
Bool @render_css_for_node(@html_dom_node* node, HtmlRenderer* renderer) Bool @apply_css_rules_to_node(@html_dom_node* node, HtmlRenderer* renderer)
{ {
I64 i, j, k; I64 i, j, k;
JsonObject* rule = NULL; JsonObject* rule = NULL;
@ -585,7 +585,7 @@ U0 @render_form_element(@html_dom_node* node, HtmlRenderer* renderer)
} }
JsonArray* parent_nodes_excluded_from_text_rendering = Json.Parse("[\"option\",\"script\",\"style\",\"title\"]", erythros_mem_task); JsonArray* parent_nodes_excluded_from_text_rendering = Json.Parse("[\"option\",\"script\",\"style\",\"title\"]", erythros_mem_task);
JsonArray* block_level_element_tag_names = Json.Parse("[\"address\",\"article\",\"aside\",\"blockquote\",\"br\",\"canvas\",\"dd\",\"div\",\"dl\",\"dt\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"hr\",\"li\",\"main\",\"nav\",\"noscript\",\"ol\",\"p\",\"pre\",\"section\",\"table\",\"tfoot\",\"ul\",\"video\"]", erythros_mem_task); JsonArray* block_level_element_tag_names = Json.Parse("[\"address\",\"article\",\"aside\",\"blockquote\",\"canvas\",\"dd\",\"div\",\"dl\",\"dt\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"hr\",\"li\",\"main\",\"nav\",\"noscript\",\"ol\",\"p\",\"pre\",\"section\",\"table\",\"tfoot\",\"ul\",\"video\"]", erythros_mem_task);
#define ADD_BYTE_TO_CODE_POINT_VALUE code_point = ((code_point << 6) | text[++i] & 0x3f); #define ADD_BYTE_TO_CODE_POINT_VALUE code_point = ((code_point << 6) | text[++i] & 0x3f);
#define ADD_TWO_BYTES_TO_CODE_POINT_VALUE ADD_BYTE_TO_CODE_POINT_VALUE ADD_BYTE_TO_CODE_POINT_VALUE #define ADD_TWO_BYTES_TO_CODE_POINT_VALUE ADD_BYTE_TO_CODE_POINT_VALUE ADD_BYTE_TO_CODE_POINT_VALUE
@ -723,19 +723,9 @@ U0 @renderer_append_image(HtmlRenderer* renderer, Context2DWidget* widget)
} }
} }
U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer) U0 @apply_attribute_values_to_node(@html_dom_node* node)
{ {
if (!node || !renderer) if (!node)
return;
I64 i;
U8 buf[HTML_WORK_BUFFER_SIZE];
I64 margin_top = 32; // FIXME: Derive these
I64 margin_bottom = 32;
if (StrICmp(node->tagName, "InternalTextNode"))
if (!@render_css_for_node(node, renderer))
return; return;
if (node->attributes->@("bgcolor")) { if (node->attributes->@("bgcolor")) {
@ -745,6 +735,7 @@ U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer)
node->backgroundColor = @css_resolve_color_from_rrggbb(node->attributes->@("bgcolor")); node->backgroundColor = @css_resolve_color_from_rrggbb(node->attributes->@("bgcolor"));
} }
} }
if (node->attributes->@("color")) { if (node->attributes->@("color")) {
if (@css_named_colors->@(node->attributes->@("color"))) { if (@css_named_colors->@(node->attributes->@("color"))) {
node->color = @css_resolve_color_from_rrggbb(@css_named_colors->@(node->attributes->@("color"))); node->color = @css_resolve_color_from_rrggbb(@css_named_colors->@(node->attributes->@("color")));
@ -762,8 +753,32 @@ U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer)
if (!StrICmp(node->tagName, "center")) if (!StrICmp(node->tagName, "center"))
node->textAlign = CSS_TEXT_ALIGN_CENTER; node->textAlign = CSS_TEXT_ALIGN_CENTER;
}
U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer)
{
if (!node || !renderer)
return;
I64 i;
U8 buf[HTML_WORK_BUFFER_SIZE];
Context2DWidget* block_widget;
Context2DWidget* img_widget;
// FIXME: Resolve if display: block is set
if (block_level_element_tag_names->contains(node->tagName)) {
node->display_block = TRUE;
}
if (StrICmp(node->tagName, "InternalTextNode"))
if (!@apply_css_rules_to_node(node, renderer))
return;
++renderer->indent; ++renderer->indent;
@apply_attribute_values_to_node(node);
if (renderer->debug && StrICmp(node->tagName, "InternalTextNode")) { if (renderer->debug && StrICmp(node->tagName, "InternalTextNode")) {
for (i = 0; i < renderer->indent; i++) for (i = 0; i < renderer->indent; i++)
" "; " ";
@ -771,13 +786,7 @@ U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer)
node->tagName, node->textAlign, node->width, node->height, node->backgroundColor, node->color, node->fontFamily, node->fontSize, node->display_block; node->tagName, node->textAlign, node->width, node->height, node->backgroundColor, node->color, node->fontFamily, node->fontSize, node->display_block;
} }
Context2DWidget* block_widget; // Insert a block widget for the element's opening tag
// FIXME: Resolve if display: block is set
if (block_level_element_tag_names->contains(node->tagName)) {
node->display_block = TRUE;
}
if (node->display_block) { if (node->display_block) {
block_widget = Gui.CreateWidget(renderer->win, WIDGET_TYPE_CONTEXT2D, block_widget = Gui.CreateWidget(renderer->win, WIDGET_TYPE_CONTEXT2D,
U64_MAX, U64_MAX, 0, 0); U64_MAX, U64_MAX, 0, 0);
@ -790,8 +799,6 @@ U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer)
renderer->background_widget->ctx->fill(@image_pixel_flip_rgb_bgr(node->backgroundColor)); renderer->background_widget->ctx->fill(@image_pixel_flip_rgb_bgr(node->backgroundColor));
} }
Context2DWidget* img_widget;
if (!StrICmp(node->tagName, "form")) if (!StrICmp(node->tagName, "form"))
@create_form_from_node(renderer, node); @create_form_from_node(renderer, node);
@ -828,11 +835,13 @@ U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer)
@render_node_list(node->children->@(i), renderer); @render_node_list(node->children->@(i), renderer);
} }
// Insert a block widget for the element's closing tag
if (node->display_block) { if (node->display_block) {
block_widget = Gui.CreateWidget(renderer->win, WIDGET_TYPE_CONTEXT2D, block_widget = Gui.CreateWidget(renderer->win, WIDGET_TYPE_CONTEXT2D,
U64_MAX, U64_MAX, 0, 0); U64_MAX, U64_MAX, 0, 0);
block_widget->data = node; block_widget->data = node;
} }
--renderer->indent; --renderer->indent;
} }