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);
							 | 
						||
| 
								 | 
							
								              }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								};
							 |