« get me outta code hell

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:
Diffstat (limited to 'src/util')
-rw-r--r--src/util/html.js27
1 files changed, 26 insertions, 1 deletions
diff --git a/src/util/html.js b/src/util/html.js
index c7157a8b..28ee50d7 100644
--- a/src/util/html.js
+++ b/src/util/html.js
@@ -82,6 +82,13 @@ export const noEdgeWhitespace = Symbol();
 // character).
 export const blockwrap = Symbol();
 
+// Don't pass this directly, use html.metatag('chunkwrap') instead.
+// Causes *contained* content to be split by the metatag's "split" attribute,
+// and each chunk to be considered its own unit for word wrapping. All these
+// units are *not* wrapped in any containing element, so only the chunks are
+// considered wrappable units, not the entire element!
+export const chunkwrap = Symbol();
+
 // Recursive helper function for isBlank, which basically flattens an array
 // and returns as soon as it finds any content - a non-blank case - and doesn't
 // traverse templates of its own accord. If it doesn't find directly non-blank
@@ -273,7 +280,7 @@ export function metatag(identifier, ...args) {
       args[0] instanceof Tag ||
       args[0] instanceof Template)
   ) {
-    opts = args[0];  /* eslint-disable-line no-unused-vars */
+    opts = args[0];
     content = args[1];
   } else {
     content = args[0];
@@ -283,6 +290,9 @@ export function metatag(identifier, ...args) {
     case 'blockwrap':
       return new Tag(null, {[blockwrap]: true}, content);
 
+    case 'chunkwrap':
+      return new Tag(null, {[chunkwrap]: true, ...opts}, content);
+
     default:
       throw new Error(`Unknown metatag "${identifier}"`);
   }
@@ -479,6 +489,21 @@ export class Tag {
     return this.#getAttributeFlag(blockwrap);
   }
 
+  set chunkwrap(value) {
+    this.#setAttributeFlag(chunkwrap, value);
+
+    try {
+      this.content = content;
+    } catch (error) {
+      this.#setAttributeFlag(chunkwrap, false);
+      throw error;
+    }
+  }
+
+  get chunkwrap() {
+    return this.#getAttributeFlag(chunkwrap);
+  }
+
   toString() {
     if (this.onlyIfContent && isBlank(this.content)) {
       return '';