angular-cn/aio/tools/transforms/angular-base-package/post-processors/add-image-dimensions.js

46 lines
1.4 KiB
JavaScript

const visit = require('unist-util-visit');
const is = require('hast-util-is-element');
const source = require('unist-util-source');
/**
* Add the width and height of the image to the `img` tag if they are
* not already provided. This helps prevent jank when the page is
* rendered before the image has downloaded.
*
* If there is no `src` attribute on an image, or it is not possible
* to load the image file indicated by the `src` then a warning is emitted.
*/
module.exports = function addImageDimensions(getImageDimensions) {
return function addImageDimensionsImpl() {
return (ast, file) => {
visit(ast, node => {
if (!is(node, 'img')) {
return;
}
const props = node.properties;
const src = props.src;
if (!src) {
file.message('Missing src in image tag `' + source(node, file) + '`');
return;
}
try {
const dimensions = getImageDimensions(addImageDimensionsImpl.basePath, src);
if (props.width === undefined && props.height === undefined) {
props.width = '' + dimensions.width;
props.height = '' + dimensions.height;
}
} catch(e) {
if (e.code === 'ENOENT') {
file.fail('Unable to load src in image tag `' + source(node, file) + '`');
} else {
file.fail(e.message);
}
}
});
};
};
};