@xt0rted/expressive-code-file-icons
Version:
Add Visual Studio Code file icons to Expressive Code frames
44 lines • 1.77 kB
JavaScript
import { addClassName, select, setProperty } from "@expressive-code/core/hast";
import { iconForFile } from "./icons.js";
import { isTerminal } from "./utils.js";
export function pluginFileIcons({ iconClass, titleClass } = {}) {
return {
name: "File icons",
hooks: {
preprocessMetadata({ codeBlock }) {
const { metaOptions, props } = codeBlock;
props.icon = metaOptions.getString("icon") ?? props.icon;
props.noIcon = metaOptions.getBoolean("no-icon") ?? props.noIcon;
},
postprocessRenderedBlock: async ({ codeBlock, renderData }) => {
if (codeBlock.props.noIcon) {
return;
}
if (isTerminal(renderData.blockAst)) {
return;
}
const titleText = codeBlock.props["title"]; // Comes from the frames plugin
if (!titleText) {
return;
}
const iconSvgElement = await iconForFile(titleText, codeBlock.language, codeBlock.props.icon);
if (!iconSvgElement) {
return;
}
setProperty(iconSvgElement, "aria-hidden", "true");
if (iconClass) {
addClassName(iconSvgElement, iconClass);
}
const title = select("figcaption > .title", renderData.blockAst);
if (!title) {
return;
}
title.children?.unshift(iconSvgElement);
if (titleClass) {
addClassName(title, titleClass);
}
},
},
};
}
//# sourceMappingURL=index.js.map