1 | 'use strict';
|
2 | const utils = require('handlebars-utils');
|
3 | const SafeString = require('handlebars').SafeString;
|
4 | const common = require('./../lib/common');
|
5 |
|
6 | function helper(paper) {
|
7 | paper.handlebars.registerHelper('getImageSrcset', function(image, defaultImageUrl) {
|
8 |
|
9 | const sizeRegex = /(^\d+w$)|(^(\d+?)x(\d+?)$)/;
|
10 |
|
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 |
|
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 |
|
45 | return ''
|
46 | }
|
47 | }
|
48 |
|
49 |
|
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 |
|
60 | module.exports = helper;
|