filter_id = "strip"; // alias
}
JJ_DEBUG("Applying filter '%s' to %s", filter_id.c_str(), input->type().c_str());
+ // TODO: Refactor filters so this coercion can be done automatically
+ if (!input->is_undefined() && !is_val<value_string>(input) && (
+ filter_id == "capitalize" ||
+ filter_id == "lower" ||
+ filter_id == "replace" ||
+ filter_id == "strip" ||
+ filter_id == "title" ||
+ filter_id == "upper" ||
+ filter_id == "wordcount"
+ )) {
+ JJ_DEBUG("Coercing %s to String for '%s' filter", input->type().c_str(), filter_id.c_str());
+ input = mk_val<value_string>(input->as_string());
+ }
return try_builtin_func(ctx, filter_id, input)->invoke(func_args(ctx));
} else if (is_stmt<call_expression>(filter)) {
double val = static_cast<double>(args.get_pos(0)->as_int());
return mk_val<value_float>(val);
}},
- {"tojson", tojson},
+ {"safe", tojson},
{"string", tojson},
+ {"tojson", tojson},
};
return builtins;
}
int64_t val = static_cast<int64_t>(args.get_pos(0)->as_float());
return mk_val<value_int>(val);
}},
- {"tojson", tojson},
+ {"safe", tojson},
{"string", tojson},
+ {"tojson", tojson},
};
return builtins;
}
const func_builtins & value_bool_t::get_builtins() const {
+ static const func_handler tostring = [](const func_args & args) -> value {
+ args.ensure_vals<value_bool>();
+ bool val = args.get_pos(0)->as_bool();
+ return mk_val<value_string>(val ? "True" : "False");
+ };
static const func_builtins builtins = {
{"default", default_value},
{"int", [](const func_args & args) -> value {
bool val = args.get_pos(0)->as_bool();
return mk_val<value_float>(val ? 1.0 : 0.0);
}},
- {"string", [](const func_args & args) -> value {
- args.ensure_vals<value_bool>();
- bool val = args.get_pos(0)->as_bool();
- return mk_val<value_string>(val ? "True" : "False");
- }},
+ {"safe", tostring},
+ {"string", tostring},
{"tojson", tojson},
};
return builtins;
}
const func_builtins & value_none_t::get_builtins() const {
+ static const func_handler tostring = [](const func_args &) -> value {
+ return mk_val<value_string>("None");
+ };
static const func_builtins builtins = {
{"default", default_value},
{"tojson", tojson},
- {"string", [](const func_args &) -> value {
- return mk_val<value_string>("None");
- }},
- {"safe", [](const func_args &) -> value {
- return mk_val<value_string>("None");
- }},
- {"strip", [](const func_args &) -> value {
- return mk_val<value_string>("None");
- }},
+ {"string", tostring},
+ {"safe", tostring},
{"items", empty_value_fn<value_array>},
{"map", empty_value_fn<value_array>},
{"reject", empty_value_fn<value_array>},
"hello"
);
+ test_template(t, "upper array",
+ "{{ items|upper }}",
+ {{"items", json::array({"hello", "world"})}},
+ "['HELLO', 'WORLD']"
+ );
+
+ test_template(t, "upper dict",
+ "{{ items|upper }}",
+ {{"items", {{"hello", "world"}}}},
+ "{'HELLO': 'WORLD'}"
+ );
+
test_template(t, "capitalize",
"{{ 'heLlo World'|capitalize }}",
json::object(),