UNPKG

2.3 kBJavaScriptView Raw
1'use strict';
2const utils = require('handlebars-utils');
3const SafeString = require('handlebars').SafeString;
4const common = require('./../lib/common');
5
6function helper(paper) {
7 paper.handlebars.registerHelper('getImageSrcset', function(image, defaultImageUrl) {
8 // Regex to test size string is of the form 123x123 or 100w
9 const sizeRegex = /(^\d+w$)|(^(\d+?)x(\d+?)$)/;
10 // Regex to test to that srcset descriptor is of the form 1x 1.5x 2x OR 123w
11 const descriptorRegex = /(^\d+w$)|(^([0-9](\.[0-9]+)?)x)$/;
12
13 const options = arguments[arguments.length - 1];
14
15 if (utils.isUndefined(defaultImageUrl)) {
16 defaultImageUrl = '';
17 }
18
19 if (!utils.isObject(image) || !utils.isString (image.data)
20 || !common.isValidURL(image.data) || image.data.indexOf('{:size}') === -1) {
21 // return empty string if not a valid image object
22 defaultImageUrl = defaultImageUrl ? defaultImageUrl : '';
23 return utils.isString(image) ? image : defaultImageUrl;
24 }
25
26 let srcsets = {};
27
28 if (options.hash['use_default_sizes']) {
29 srcsets = {
30 '2560w': '2560w',
31 '1920w': '1920w',
32 '1280w': '1280w',
33 '960w': '960w',
34 '640w': '640w',
35 '320w': '320w',
36 '160w': '160w',
37 '80w': '80w',
38 };
39 } else {
40 srcsets = options.hash;
41 if (!utils.isObject(srcsets) || Object.keys(srcsets).some(descriptor => {
42 return !(descriptorRegex.test(descriptor) && sizeRegex.test(srcsets[descriptor]));
43 })) {
44 // return empty string if not valid srcset object
45 return ''
46 }
47 }
48
49 // If there's only one argument, return a `src` only (also works for `srcset`)
50 if (Object.keys(srcsets).length === 1) {
51 return new SafeString((image.data.replace('{:size}', srcsets[Object.keys(srcsets)[0]])));
52 }
53
54 return new SafeString(Object.keys(srcsets).reverse().map(descriptor => {
55 return ([image.data.replace('{:size}', srcsets[descriptor]), descriptor].join(' '));
56 }).join(', '));
57 });
58};
59
60module.exports = helper;