34 lines
1.3 KiB
JavaScript
34 lines
1.3 KiB
JavaScript
import { visit } from "unist-util-visit";
|
|
function rehypeImages() {
|
|
return function(tree, file) {
|
|
if (!file.data.astro?.localImagePaths?.length && !file.data.astro?.remoteImagePaths?.length) {
|
|
return;
|
|
}
|
|
const imageOccurrenceMap = /* @__PURE__ */ new Map();
|
|
visit(tree, "element", (node) => {
|
|
if (node.tagName !== "img") return;
|
|
if (typeof node.properties?.src !== "string") return;
|
|
const src = decodeURI(node.properties.src);
|
|
let newProperties;
|
|
if (file.data.astro?.localImagePaths?.includes(src)) {
|
|
newProperties = { ...node.properties, src };
|
|
} else if (file.data.astro?.remoteImagePaths?.includes(src)) {
|
|
newProperties = {
|
|
// By default, markdown images won't have width and height set. However, just in case another user plugin does set these, we should respect them.
|
|
inferSize: "width" in node.properties && "height" in node.properties ? void 0 : true,
|
|
...node.properties,
|
|
src
|
|
};
|
|
} else {
|
|
return;
|
|
}
|
|
const index = imageOccurrenceMap.get(node.properties.src) || 0;
|
|
imageOccurrenceMap.set(node.properties.src, index + 1);
|
|
node.properties = { __ASTRO_IMAGE_: JSON.stringify({ ...newProperties, index }) };
|
|
});
|
|
};
|
|
}
|
|
export {
|
|
rehypeImages
|
|
};
|