41 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			41 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')) { | ||
|  |           const props = node.properties; | ||
|  |           const src = props.src; | ||
|  |           if (!src) { | ||
|  |             file.message('Missing src in image tag `' + source(node, file) + '`'); | ||
|  |           } else if (props.width === undefined && props.height === undefined) { | ||
|  |             try { | ||
|  |               const dimensions = getImageDimensions(addImageDimensionsImpl.basePath, src); | ||
|  |               props.width = '' + dimensions.width; | ||
|  |               props.height = '' + dimensions.height; | ||
|  |             } catch(e) { | ||
|  |               if (e.code === 'ENOENT') { | ||
|  |                 file.message('Unable to load src in image tag `' + source(node, file) + '`'); | ||
|  |               } else { | ||
|  |                 file.fail(e.message); | ||
|  |               } | ||
|  |             } | ||
|  |           } | ||
|  |         } | ||
|  |       }); | ||
|  |     }; | ||
|  |   }; | ||
|  | }; |