44 lines
1.3 KiB
TypeScript
44 lines
1.3 KiB
TypeScript
import { customElement, noShadowDOM } from "solid-element";
|
|
import {createEffect, onCleanup} from "solid-js";
|
|
import { resolvePath } from "./utils/path";
|
|
|
|
export interface BgProps {
|
|
fit?: 'cover' | 'contain' | 'fill' | 'none' | 'scale-down';
|
|
}
|
|
|
|
customElement("md-bg", { fit: "cover" }, (props, { element }) => {
|
|
noShadowDOM();
|
|
|
|
// 从 element 的 textContent 获取图片路径
|
|
const rawSrc = element?.textContent?.trim() || '';
|
|
|
|
// 隐藏原始文本内容
|
|
if (element) {
|
|
element.textContent = "";
|
|
}
|
|
|
|
// 从父节点 article 的 data-src 获取当前 markdown 文件完整路径
|
|
const articleEl = element?.closest('article') as HTMLElement;
|
|
const articlePath = articleEl?.getAttribute('data-src') || '';
|
|
|
|
// 解析相对路径
|
|
const resolvedSrc = resolvePath(articlePath, rawSrc);
|
|
|
|
createEffect(() => {
|
|
if(!articleEl) return;
|
|
articleEl.dataset.mdbg = resolvedSrc;
|
|
articleEl.style.backgroundImage = `url(${resolvedSrc})`;
|
|
articleEl.style.backgroundSize = props.fit || 'cover';
|
|
articleEl.style.backgroundPosition = 'center';
|
|
articleEl.style.backgroundRepeat = 'no-repeat';
|
|
});
|
|
|
|
onCleanup(() => {
|
|
if(articleEl?.dataset?.mdbg !== resolvedSrc)
|
|
return;
|
|
articleEl.style.backgroundImage = '';
|
|
});
|
|
|
|
return null;
|
|
});
|