From de03b7be4740e07bb22a93d8fd8f75a5b907f64c Mon Sep 17 00:00:00 2001 From: Helge Norberg Date: Mon, 27 Feb 2017 16:18:57 +0100 Subject: [PATCH] [scene] #563 Added some string functions to expression language --- core/producer/scene/expression_parser.cpp | 58 +++++++++++++++++++++-- 1 file changed, 53 insertions(+), 5 deletions(-) diff --git a/core/producer/scene/expression_parser.cpp b/core/producer/scene/expression_parser.cpp index ae1e89656..27156db26 100644 --- a/core/producer/scene/expression_parser.cpp +++ b/core/producer/scene/expression_parser.cpp @@ -32,6 +32,7 @@ #include #include +#include #include #include @@ -169,6 +170,50 @@ boost::any create_floor_function(const std::vector& 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& 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(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& 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(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& 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(params.at(0)); + + return str.transformed([](std::wstring v) { return static_cast(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& 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); -- 2.39.2