Browse Source

Backport from xs.

default 1 year ago
parent
commit
b17aa7d522
2 changed files with 24 additions and 35 deletions
  1. 23 34
      xs_html.h
  2. 1 1
      xs_version.h

+ 23 - 34
xs_html.h

@@ -203,61 +203,50 @@ xs_html *_xs_html_container(xs_html *var[])
 void xs_html_render_f(xs_html *h, FILE *f)
 /* renders the tag and its subtags into a file */
 {
-    xs_html *st;
+    if (h == NULL)
+        return;
 
     switch (h->type) {
     case XS_HTML_TAG:
-    case XS_HTML_SCTAG:
         fprintf(f, "<%s", h->content);
 
-        /* render the attributes */
-        st = h->f_attr;
-        while (st) {
-            xs_html *nst = st->next;
-            xs_html_render_f(st, f);
-            st = nst;
-        }
+        /* attributes */
+        xs_html_render_f(h->f_attr, f);
 
-        if (h->type == XS_HTML_SCTAG) {
-            /* self-closing tags should not have subtags */
-            fprintf(f, "/>");
-        }
-        else {
-            fprintf(f, ">");
+        fprintf(f, ">");
 
-            /* render the subtags */
-            st = h->f_tag;
-            while (st) {
-                xs_html *nst = st->next;
-                xs_html_render_f(st, f);
-                st = nst;
-            }
+        /* sub-tags */
+        xs_html_render_f(h->f_tag, f);
 
-            fprintf(f, "</%s>", h->content);
-        }
+        fprintf(f, "</%s>", h->content);
+        break;
+
+    case XS_HTML_SCTAG:
+        fprintf(f, "<%s", h->content);
 
+        /* attributes */
+        xs_html_render_f(h->f_attr, f);
+
+        fprintf(f, "/>");
         break;
 
     case XS_HTML_CONTAINER:
-        /* render the subtags and nothing more */
-        st = h->f_tag;
-        while (st) {
-            xs_html *nst = st->next;
-            xs_html_render_f(st, f);
-            st = nst;
-        }
-
+        /* sub-tags */
+        xs_html_render_f(h->f_tag, f);
         break;
 
     case XS_HTML_ATTR:
-        fprintf(f, " %s", h->content);
-        break;
+        fprintf(f, " ");
+        /* fallthrough */
 
     case XS_HTML_TEXT:
         fprintf(f, "%s", h->content);
         break;
     }
 
+    /* follow the chain */
+    xs_html_render_f(h->next, f);
+
     xs_free(h->content);
     xs_free(h);
 }

+ 1 - 1
xs_version.h

@@ -1 +1 @@
-/* f27e092c79ca6e2e96f83e0d4c3dbc73d737ffaa 2023-12-03T17:12:47+01:00 */
+/* 1b21549513460489504a2caa4127607c914a10da 2023-12-03T23:45:32+01:00 */