UNPKG

3.17 kBJavaScriptView Raw
1'use strict';
2
3const utils = require('handlebars-utils');
4
5function helper(paper) {
6 paper.handlebars.registerHelper('unless', function () {
7 const options = arguments[arguments.length - 1];
8 arguments[arguments.length - 1] = Object.assign({}, options, {
9 fn: options.inverse || (() => false),
10 inverse: options.fn || (() => true),
11 hash: options.hash
12 });
13
14 return paper.handlebars.helpers['if'].apply(this, arguments);
15 });
16
17 paper.handlebars.registerHelper('if', function (lvalue, operator, rvalue) {
18 const options = arguments[arguments.length - 1];
19 let result;
20
21 // Only parameter
22 if (utils.isOptions(operator)) {
23 // If an array is passed as the only parameter
24 if (utils.isArray(lvalue)) {
25 result = !!lvalue.length;
26 }
27 // If an empty object is passed, treat as false
28 else if (utils.isEmpty(lvalue) && utils.isObject(lvalue)) {
29 result = false;
30 }
31 // Everything else
32 else {
33 result = !!lvalue;
34 }
35 } else {
36
37 if (utils.isOptions(rvalue)) {
38 // @TODO: this is block is for backwards compatibility with 'compare' helper
39 // Remove after operator='==' is removed from stencil theme
40 rvalue = operator;
41 operator = options.hash.operator || "==";
42 }
43
44 switch (operator) {
45 case '==':
46 result = (lvalue == rvalue);
47 break;
48
49 case '===':
50 result = (lvalue === rvalue);
51 break;
52
53 case '!=':
54 result = (lvalue != rvalue);
55 break;
56
57 case '!==':
58 result = (lvalue !== rvalue);
59 break;
60
61 case '<':
62 result = (lvalue < rvalue);
63 break;
64
65 case '>':
66 result = (lvalue > rvalue);
67 break;
68
69 case '<=':
70 result = (lvalue <= rvalue);
71 break;
72
73 case '>=':
74 result = (lvalue >= rvalue);
75 break;
76
77 case 'gtnum':
78 if (typeof lvalue === 'string' && typeof(rvalue) === 'string' && !isNaN(lvalue) && !isNaN(rvalue)) {
79 result = parseInt(lvalue) > parseInt(rvalue);
80 } else {
81 throw new Error("if gtnum only accepts numbers (as strings)");
82 }
83 break;
84
85 case 'typeof':
86 result = (typeof lvalue === rvalue);
87 break;
88
89 default:
90 throw new Error("Handlerbars Helper 'if' doesn't know the operator " + operator);
91 }
92 }
93
94 if (!options.fn || !options.inverse) {
95 options.fn = () => true;
96 options.inverse = () => false;
97 }
98
99 if (result) {
100 return options.fn(this);
101 } else {
102 return options.inverse(this);
103 }
104 });
105}
106
107module.exports = helper;