55 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| // vue compiler module for transforming `img:srcset` to a number of `require`s
 | |
| Object.defineProperty(exports, "__esModule", { value: true });
 | |
| const utils_1 = require("./utils");
 | |
| exports.default = (transformAssetUrlsOptions) => ({
 | |
|     postTransformNode: (node) => {
 | |
|         transform(node, transformAssetUrlsOptions);
 | |
|     }
 | |
| });
 | |
| // http://w3c.github.io/html/semantics-embedded-content.html#ref-for-image-candidate-string-5
 | |
| const escapedSpaceCharacters = /( |\\t|\\n|\\f|\\r)+/g;
 | |
| function transform(node, transformAssetUrlsOptions) {
 | |
|     const tags = ['img', 'source'];
 | |
|     if (tags.indexOf(node.tag) !== -1 && node.attrs) {
 | |
|         node.attrs.forEach(attr => {
 | |
|             if (attr.name === 'srcset') {
 | |
|                 // same logic as in transform-require.js
 | |
|                 const value = attr.value;
 | |
|                 const isStatic = value.charAt(0) === '"' && value.charAt(value.length - 1) === '"';
 | |
|                 if (!isStatic) {
 | |
|                     return;
 | |
|                 }
 | |
|                 const imageCandidates = value
 | |
|                     .substr(1, value.length - 2)
 | |
|                     .split(',')
 | |
|                     .map(s => {
 | |
|                     // The attribute value arrives here with all whitespace, except
 | |
|                     // normal spaces, represented by escape sequences
 | |
|                     const [url, descriptor] = s
 | |
|                         .replace(escapedSpaceCharacters, ' ')
 | |
|                         .trim()
 | |
|                         .split(' ', 2);
 | |
|                     return {
 | |
|                         require: utils_1.urlToRequire(url, transformAssetUrlsOptions),
 | |
|                         descriptor
 | |
|                     };
 | |
|                 });
 | |
|                 // "require(url1)"
 | |
|                 // "require(url1) 1x"
 | |
|                 // "require(url1), require(url2)"
 | |
|                 // "require(url1), require(url2) 2x"
 | |
|                 // "require(url1) 1x, require(url2)"
 | |
|                 // "require(url1) 1x, require(url2) 2x"
 | |
|                 const code = imageCandidates
 | |
|                     .map(({ require, descriptor }) => `${require} + "${descriptor ? ' ' + descriptor : ''}, " + `)
 | |
|                     .join('')
 | |
|                     .slice(0, -6)
 | |
|                     .concat('"')
 | |
|                     .replace(/ \+ ""$/, '');
 | |
|                 attr.value = code;
 | |
|             }
 | |
|         });
 | |
|     }
 | |
| }
 |