#include <cmath>
#include <boost/any.hpp>
+#include <boost/locale.hpp>
#include <common/log.h>
#include <common/except.h>
+ L" in " + str;
}
+boost::any as_binding(const boost::any& value);
+
template<typename T>
binding<T> require(const boost::any& value)
{
<< msg_info(L"animate() function requires three parameters: to_animate, duration, tweener"));
auto to_animate = require<double>(params.at(0));
- auto frame_counter = var_repo(L"frame").as<int64_t>().as<double>();
+ auto frame_counter = var_repo(L"frame").as<double>();
auto duration = require<double>(params.at(1));
auto tw = require<std::wstring>(params.at(2)).transformed([](const std::wstring& s) { return tweener(s); });
return angle.transformed([](double a) { return std::cos(a); });
}
+boost::any create_abs_function(const std::vector<boost::any>& params, const variable_repository& var_repo)
+{
+ if (params.size() != 1)
+ CASPAR_THROW_EXCEPTION(user_error()
+ << msg_info(L"abs() function requires one parameters: value"));
+
+ auto val = require<double>(params.at(0));
+
+ return val.transformed([](double v) { return std::abs(v); });
+}
+
+boost::any create_floor_function(const std::vector<boost::any>& params, const variable_repository& var_repo)
+{
+ if (params.size() != 1)
+ CASPAR_THROW_EXCEPTION(user_error()
+ << msg_info(L"floor() function requires one parameters: value"));
+
+ auto val = require<double>(params.at(0));
+
+ return val.transformed([](double v) { return std::floor(v); });
+}
+
+std::locale create_utf_locale()
+{
+ boost::locale::generator gen;
+ gen.categories(boost::locale::codepage_facet);
+ gen.categories(boost::locale::convert_facet);
+
+ return gen("");
+}
+
+boost::any create_to_lower_function(const std::vector<boost::any>& params, const variable_repository& var_repo)
+{
+ if (params.size() != 1)
+ CASPAR_THROW_EXCEPTION(user_error()
+ << msg_info(L"to_lower() function requires one parameters: str"));
+
+ auto str = require<std::wstring>(params.at(0));
+ auto locale = create_utf_locale();
+
+ return str.transformed([=](std::wstring v) { return boost::locale::to_lower(v, locale); });
+}
+
+boost::any create_to_upper_function(const std::vector<boost::any>& params, const variable_repository& var_repo)
+{
+ if (params.size() != 1)
+ CASPAR_THROW_EXCEPTION(user_error()
+ << msg_info(L"to_upper() function requires one parameters: str"));
+
+ auto str = require<std::wstring>(params.at(0));
+ auto locale = create_utf_locale();
+
+ return str.transformed([=](std::wstring v) { return boost::locale::to_upper(v, locale); });
+}
+
+boost::any create_length_function(const std::vector<boost::any>& params, const variable_repository& var_repo)
+{
+ if (params.size() != 1)
+ CASPAR_THROW_EXCEPTION(user_error()
+ << msg_info(L"length() function requires one parameters: str"));
+
+ auto str = require<std::wstring>(params.at(0));
+
+ return str.transformed([](std::wstring v) { return static_cast<double>(v.length()); });
+}
+
boost::any parse_function(
const std::wstring& function_name,
std::wstring::const_iterator& cursor,
{
static std::map<std::wstring, std::function<boost::any (const std::vector<boost::any>& params, const variable_repository& var_repo)>> FUNCTIONS
{
- {L"animate", create_animate_function },
- {L"sin", create_sin_function },
- {L"cos", create_cos_function }
+ { L"animate", create_animate_function },
+ { L"sin", create_sin_function },
+ { L"cos", create_cos_function },
+ { L"abs", create_abs_function },
+ { L"floor", create_floor_function },
+ { L"to_lower", create_to_lower_function },
+ { L"to_upper", create_to_upper_function },
+ { L"length", create_length_function }
};
auto function = FUNCTIONS.find(function_name);
auto cond = require<bool>(condition);
auto t = as_binding(true_value);
auto f = as_binding(false_value);
-
+
// double
if (is<binding<double>>(t) && is<binding<double>>(f))
return ternary(cond, as<binding<double>>(t), as<binding<double>>(f));