]> git.sesse.net Git - casparcg/commitdiff
[scene] #563 Added some string functions to expression language
authorHelge Norberg <helge.norberg@svt.se>
Mon, 27 Feb 2017 15:18:57 +0000 (16:18 +0100)
committerHelge Norberg <helge.norberg@svt.se>
Mon, 27 Feb 2017 15:18:57 +0000 (16:18 +0100)
core/producer/scene/expression_parser.cpp

index ae1e89656a84a597600b8e7f280d089a1f3b3ee6..27156db264b63574428e00283938487224ece864 100644 (file)
@@ -32,6 +32,7 @@
 #include <cmath>
 
 #include <boost/any.hpp>
+#include <boost/locale.hpp>
 
 #include <common/log.h>
 #include <common/except.h>
@@ -169,6 +170,50 @@ boost::any create_floor_function(const std::vector<boost::any>& params, const va
        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,
@@ -177,11 +222,14 @@ boost::any parse_function(
 {
        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"abs",                create_abs_function },
-               {L"floor",              create_floor_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);