diff --git a/System/Libraries/Html/Renderer.HC b/System/Libraries/Html/Renderer.HC
index 10a13d0..5139c0f 100644
--- a/System/Libraries/Html/Renderer.HC
+++ b/System/Libraries/Html/Renderer.HC
@@ -904,7 +904,7 @@ pt_to_cstring_done:
return str;
}
-U0 @create_form_from_node(HtmlRenderer* renderer, @html_dom_node* node)
+U0 @create_form_from_node(@html_dom_node* node, HtmlRenderer* renderer)
{
if (!node || !node->attributes || !renderer)
return;
@@ -1321,84 +1321,16 @@ U0 @apply_attribute_values_to_node(@html_dom_node* node)
node->textAlign = CSS_TEXT_ALIGN_CENTER;
}
-U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer)
+U0 @handle_tag_specific_functions(@html_dom_node* node, HtmlRenderer* renderer)
{
- if (!node || !renderer)
- return;
-
- ++renderer->indent;
-
- I64 i;
- U8 buf[HTML_WORK_BUFFER_SIZE];
- U8* dump_text;
-
- Context2DWidget* block_widget;
- Context2DWidget* img_widget;
-
- if (StrICmp(node->tagName, "InternalTextNode"))
- if (!@apply_css_rules_to_node(node, renderer))
- return;
-
- @apply_attribute_values_to_node(node);
-
- // Insert a block widget for the element's opening tag
- if (node->display == CSS_DISPLAY_BLOCK || node->display == CSS_DISPLAY_INLINE_BLOCK) {
- block_widget = Gui.CreateWidget(renderer->win, WIDGET_TYPE_CONTEXT2D,
- U64_MAX, U64_MAX, 0, 0);
- if (node->widthDistanceType == CSS_DISTANCE_PIXELS && node->heightDistanceType == CSS_DISTANCE_PIXELS) {
- block_widget->ctx = NewContext2D(node->width, node->height)->fill(node->backgroundColor);
- block_widget->width = block_widget->ctx->width;
- block_widget->height = block_widget->ctx->height;
- block_widget->fast_copy = TRUE;
- }
- block_widget->data = node;
- }
-
- if (!StrICmp(node->tagName, "strike")) {
- node->linethroughColor = node->color;
- }
-
if (!StrICmp(node->tagName, "body")) {
renderer->background_ctx->width = Display.Width();
renderer->background_ctx->height = Display.Height();
renderer->background_ctx->fill(node->backgroundColor);
}
- if (!StrICmp(node->tagName, "form"))
- @create_form_from_node(renderer, node);
-
- if (!StrICmp(node->tagName, "input"))
- @render_form_element(node, renderer);
-
- if (!StrICmp(node->tagName, "InternalTextNode")) {
- node->text = @sanitize_node_text(renderer, node->text);
- if (!parent_nodes_excluded_from_text_rendering->contains(node->parentNode->tagName)) {
- if (renderer->debug) {
- @dump_node_indent(renderer);
- dump_text = StrNew(node->text);
- String.Trim(dump_text);
- "text: \"%s\"\n", dump_text;
- }
- @render_node_text(node, renderer);
- }
- if (!StrICmp(node->parentNode->tagName, "title")) {
- String.Trim(node->text);
- Gui.Window.SetTitle(renderer->win, node->text);
- MemSet(renderer->task->task_title, NULL, STR_LEN);
- MemCpy(renderer->task->task_title, node->text, STR_LEN - 1);
- renderer->current_title = StrNew(node->text, renderer->task);
- }
- }
-
- if (!StrICmp(node->tagName, "img")) {
- if (!node->widthDistanceType || !node->heightDistanceType) {
- node->width = 32;
- node->height = 32;
- }
- img_widget = Gui.CreateWidget(renderer->win, WIDGET_TYPE_CONTEXT2D,
- U64_MAX, U64_MAX, node->width, node->height);
- img_widget->data = node;
- @renderer_append_image(renderer, img_widget);
+ if (!StrICmp(node->tagName, "form")) {
+ @create_form_from_node(node, renderer);
}
if (!StrICmp(node->tagName, "li")) {
@@ -1419,6 +1351,82 @@ U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer)
}
}
+ if (!StrICmp(node->tagName, "strike")) {
+ node->linethroughColor = node->color;
+ }
+}
+
+U0 @render_internal_text_node(@html_dom_node* node, HtmlRenderer* renderer)
+{
+ U8* dump_text;
+ node->text = @sanitize_node_text(renderer, node->text);
+ if (!parent_nodes_excluded_from_text_rendering->contains(node->parentNode->tagName)) {
+ if (renderer->debug) {
+ @dump_node_indent(renderer);
+ dump_text = StrNew(node->text);
+ String.Trim(dump_text);
+ "text: \"%s\"\n", dump_text;
+ }
+ @render_node_text(node, renderer);
+ }
+ if (!StrICmp(node->parentNode->tagName, "title")) {
+ String.Trim(node->text);
+ Gui.Window.SetTitle(renderer->win, node->text);
+ MemSet(renderer->task->task_title, NULL, STR_LEN);
+ MemCpy(renderer->task->task_title, node->text, STR_LEN - 1);
+ renderer->current_title = StrNew(node->text, renderer->task);
+ }
+}
+
+U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer)
+{
+ if (!node || !renderer)
+ return;
+
+ ++renderer->indent;
+
+ if (!StrICmp(node->tagName, "InternalTextNode")) {
+ @render_internal_text_node(node, renderer);
+ goto render_node_return;
+ }
+
+ if (!@apply_css_rules_to_node(node, renderer))
+ goto render_node_return;
+
+ @apply_attribute_values_to_node(node);
+ @handle_tag_specific_functions(node, renderer);
+
+ I64 i;
+ Context2DWidget* block_widget = NULL;
+ Context2DWidget* img_widget = NULL;
+
+ // Insert a block widget for the element's opening tag
+ if (node->display == CSS_DISPLAY_BLOCK || node->display == CSS_DISPLAY_INLINE_BLOCK) {
+ block_widget = Gui.CreateWidget(renderer->win, WIDGET_TYPE_CONTEXT2D,
+ U64_MAX, U64_MAX, 0, 0);
+ if (node->widthDistanceType == CSS_DISTANCE_PIXELS && node->heightDistanceType == CSS_DISTANCE_PIXELS) {
+ block_widget->ctx = NewContext2D(node->width, node->height)->fill(node->backgroundColor);
+ block_widget->width = block_widget->ctx->width;
+ block_widget->height = block_widget->ctx->height;
+ block_widget->fast_copy = TRUE;
+ }
+ block_widget->data = node;
+ }
+
+ if (!StrICmp(node->tagName, "img")) {
+ if (!node->widthDistanceType || !node->heightDistanceType) {
+ node->width = 32;
+ node->height = 32;
+ }
+ img_widget = Gui.CreateWidget(renderer->win, WIDGET_TYPE_CONTEXT2D,
+ U64_MAX, U64_MAX, node->width, node->height);
+ img_widget->data = node;
+ @renderer_append_image(renderer, img_widget);
+ }
+
+ if (!StrICmp(node->tagName, "input"))
+ @render_form_element(node, renderer);
+
if (node->children->length) {
for (i = 0; i < node->children->length; i++)
@render_node_list(node->children->@(i), renderer);
@@ -1435,6 +1443,7 @@ U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer)
block_widget->data = node;
}
+render_node_return:
--renderer->indent;
}