« get me outta code hell

infra: html: make deep Template resolving opt-in via utility - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/util
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2023-08-02 21:54:46 -0300
committer(quasar) nebula <qznebula@protonmail.com>2023-08-02 21:55:15 -0300
commitb149e73fcd30602fd2312e26aca86c2b769bbc01 (patch)
tree49f75db1ae730cc7b0c00160120afb1205338f7b /src/util
parent473740f69dcbad408b0d84567c2bb2de97e8a4aa (diff)
infra: html: make deep Template resolving opt-in via utility
Just always resolving was causing some bugs.
Diffstat (limited to 'src/util')
-rw-r--r--src/util/html.js30
1 files changed, 23 insertions, 7 deletions
diff --git a/src/util/html.js b/src/util/html.js
index 26dd649..d7d0373 100644
--- a/src/util/html.js
+++ b/src/util/html.js
@@ -494,6 +494,10 @@ export class Attributes {
   }
 }
 
+export function resolve(tagOrTemplate) {
+  return Template.resolve(tagOrTemplate);
+}
+
 export function template(description) {
   return new Template(description);
 }
@@ -785,13 +789,7 @@ export class Template {
       slots[slotName] = this.getSlotValue(slotName);
     }
 
-    // Get outta here with that recursive Template bollocks!
-    const content = this.description.content(slots);
-    if (content instanceof Template) {
-      return content.content;
-    } else {
-      return content;
-    }
+    return this.description.content(slots);
   }
 
   set description(_value) {
@@ -806,6 +804,24 @@ export class Template {
     return this.content.toString();
   }
 
+  static resolve(tagOrTemplate) {
+    // Flattens contents of a template, recursively "resolving" until a
+    // non-template is ready (or just returns a provided non-template
+    // argument as-is).
+
+    if (!(tagOrTemplate instanceof Template)) {
+      return tagOrTemplate;
+    }
+
+    let {content} = tagOrTemplate;
+
+    while (content instanceof Template) {
+      content = content.content;
+    }
+
+    return content;
+  }
+
   [inspect.custom]() {
     const {annotation} = this.description;
     if (annotation) {