Fix template condition evaluating to true for empty string from function

Fixes #2529
This commit is contained in:
Martynas Bagdonas 2022-04-11 12:21:23 +07:00
parent be0b0a7151
commit 2af7275968
2 changed files with 14 additions and 4 deletions

View file

@ -2230,11 +2230,20 @@ Zotero.Utilities.Internal = {
if (!level.executed) { if (!level.executed) {
level.condition = level.parentCondition && ( level.condition = level.parentCondition && (
args[2] args[2]
// If string variable is equal to the provided string
? vars[args[0]].toLowerCase() == args[2].toLowerCase() ? vars[args[0]].toLowerCase() == args[2].toLowerCase()
: ( : (
Array.isArray(vars[args[0]]) Array.isArray(vars[args[0]])
// Is array non empty
? !!vars[args[0]].length ? !!vars[args[0]].length
: !!vars[args[0]] : (
typeof vars[args[0]] === 'function'
// If function returns a value (only string is supported)
// Note: To keep things simple, this doesn't support function attributes
? !!vars[args[0]]()
// If string variable exists
: !!vars[args[0]]
)
) )
); );
level.executed = level.condition; level.executed = level.condition;

View file

@ -528,13 +528,14 @@ describe("Zotero.Utilities.Internal", function () {
var vars = { var vars = {
v1: '1', v1: '1',
v2: (pars) => pars.a1 + pars.a2 + pars.a3, v2: (pars) => pars.a1 + pars.a2 + pars.a3,
v3: () => undefined, v3: () => '',
v5: () => 'something',
ar1: [], ar1: [],
ar2: [1, 2] ar2: [1, 2]
}; };
var template = `{{ v1}}{{v2 a1= 1 a2 =' 2' a3 = "3 "}}{{v3}}{{v4}}{{if ar1}}ar1{{endif}}{{if ar2}}{{ar2}}{{endif}}`; var template = `{{ v1}}{{v2 a1= 1 a2 =' 2' a3 = "3 "}}{{v3}}{{v4}}{{if ar1}}ar1{{endif}}{{if ar2}}{{ar2}}{{endif}}{{if v5}}yes{{endif}}{{if v3}}no{{endif}}`;
var html = Zotero.Utilities.Internal.generateHTMLFromTemplate(template, vars); var html = Zotero.Utilities.Internal.generateHTMLFromTemplate(template, vars);
assert.equal(html, '11 23 1,2'); assert.equal(html, '11 23 1,2yes');
}); });
it("should support nested 'if' statements", function () { it("should support nested 'if' statements", function () {