`
* (the placeholder emitted by the TipTap atomic node) into the actual
* Hugging Face user profile card.
*
* Mirrors `app/src/components/HfUser.astro` from the upstream
* `research-article-template`:
*
*
* Falls back gracefully when only `username` is provided (no `name`/`url`):
* - `name` defaults to the username
* - `url` defaults to `https://huggingface.co/
`
*
* If `username` is missing entirely the placeholder div is removed - we don't
* want a broken empty card in the published page.
*/
export const hfUserTransformer: Transformer = {
name: "hfUser",
apply(document) {
for (const div of [...document.querySelectorAll('div[data-component="hfUser"]')]) {
const username = (div.getAttribute("username") || div.getAttribute("data-username") || "").trim();
const rawName = (div.getAttribute("name") || div.getAttribute("data-name") || "").trim();
const rawUrl = (div.getAttribute("url") || div.getAttribute("data-url") || "").trim();
if (!username) {
div.remove();
continue;
}
const displayName = rawName || username;
const profileUrl = rawUrl || `https://huggingface.co/${encodeURIComponent(username)}`;
const avatarSrc = `https://huggingface.co/api/users/${encodeURIComponent(username)}/avatar`;
const card = document.createElement("div");
card.className = "hf-user";
const left = document.createElement("div");
left.className = "hf-user__left";
const img = document.createElement("img");
img.className = "hf-user__avatar";
img.setAttribute("src", avatarSrc);
img.setAttribute("alt", `${displayName} avatar`);
img.setAttribute("width", "44");
img.setAttribute("height", "44");
img.setAttribute("loading", "lazy");
img.setAttribute("decoding", "async");
img.setAttribute("referrerpolicy", "no-referrer");
const text = document.createElement("span");
text.className = "hf-user__text";
const nameLink = document.createElement("a");
nameLink.className = "hf-user__name";
nameLink.setAttribute("href", profileUrl);
nameLink.setAttribute("target", "_blank");
nameLink.setAttribute("rel", "noopener noreferrer");
nameLink.textContent = displayName;
const row = document.createElement("span");
row.className = "hf-user__row";
const userLink = document.createElement("a");
userLink.className = "hf-user__username";
userLink.setAttribute("href", profileUrl);
userLink.setAttribute("target", "_blank");
userLink.setAttribute("rel", "noopener noreferrer");
userLink.textContent = `@${username}`;
row.appendChild(userLink);
text.appendChild(nameLink);
text.appendChild(row);
left.appendChild(img);
left.appendChild(text);
card.appendChild(left);
div.replaceWith(card);
}
},
};