summaryrefslogtreecommitdiff
path: root/packages/markdown/remark/src/remark-collect-images.ts
blob: f09f1c580a3f2131eca7e1f6a6803c4491c7bca8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import type { Image, ImageReference } from 'mdast';
import { definitions } from 'mdast-util-definitions';
import { visit } from 'unist-util-visit';
import type { VFile } from 'vfile';

export function remarkCollectImages() {
	return function (tree: any, vfile: VFile) {
		if (typeof vfile?.path !== 'string') return;

		const definition = definitions(tree);
		const imagePaths = new Set<string>();
		visit(tree, ['image', 'imageReference'], (node: Image | ImageReference) => {
			if (node.type === 'image') {
				if (shouldOptimizeImage(node.url)) imagePaths.add(decodeURI(node.url));
			}
			if (node.type === 'imageReference') {
				const imageDefinition = definition(node.identifier);
				if (imageDefinition) {
					if (shouldOptimizeImage(imageDefinition.url))
						imagePaths.add(decodeURI(imageDefinition.url));
				}
			}
		});

		vfile.data.astro ??= {};
		vfile.data.astro.imagePaths = Array.from(imagePaths);
	};
}

function shouldOptimizeImage(src: string) {
	// Optimize anything that is NOT external or an absolute path to `public/`
	return !isValidUrl(src) && !src.startsWith('/');
}

function isValidUrl(str: string): boolean {
	try {
		new URL(str);
		return true;
	} catch {
		return false;
	}
}