+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()); });
+}
+