From e8d18ae19aa3f50ba6418a4aec9950e6ad9e73f8 Mon Sep 17 00:00:00 2001 From: DarkWiiPlayer Date: Sun, 26 Dec 2021 17:54:04 +0100 Subject: [PATCH] Extend skooma.text function to support template strings --- skooma.js | 15 ++++++++++++++- skooma.md | 9 +++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/skooma.js b/skooma.js index 4f8037e..c9f8c21 100644 --- a/skooma.js +++ b/skooma.js @@ -99,4 +99,17 @@ export const handle = fn => event => { event.preventDefault(); return fn(event) export const html = nameSpacedProxy({nameFilter: name => name.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase()}) export const svg = nameSpacedProxy({xmlns: "http://www.w3.org/2000/svg"}) -export const text = (data="") => document.createTextNode(data) +const textFromTemplate = (literals, items) => { + const fragment = new DocumentFragment() + for (const key in items) { + fragment.append(document.createTextNode(literals[key])) + fragment.append(items[key]) + } + fragment.append(document.createTextNode(literals.at(-1))) + return fragment +} + +export const text = (data="", ...items) => + typeof data == "string" + ? document.createTextNode(data) + : textFromTemplate(data, items) diff --git a/skooma.md b/skooma.md index 3baa9b9..3c9c74f 100644 --- a/skooma.md +++ b/skooma.md @@ -48,8 +48,17 @@ text() // Defaults to empty string instead of erroring text(null) // Non-string arguments still error + +text`Hello, World!` +// returns a new document fragment containing the text node "Hello, World!" +text`Hello, ${user}!` +// returns a document fragment containing 3 nodes: +// "Hello, ", the interpolated value of `user` and "!" ``` +When used with templates, `text` tries to append any interpolated values into +the document fragment as is and without checking them. + ## bind This function offers a generic mechanism for binding elements to dynamic state.