Repository: nifi-minifi-cpp Updated Branches: refs/heads/master 83f4ce88a -> 6a3faa392
MINIFICPP-446 Add escape/unescape HTML3 EL functions This closes #297. Signed-off-by: Bin Qiu <benqiu2...@gmail.com> Project: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/commit/6a3faa39 Tree: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/tree/6a3faa39 Diff: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/diff/6a3faa39 Branch: refs/heads/master Commit: 6a3faa392c38ab47089199a66c3171770bc468f9 Parents: 83f4ce8 Author: Andrew I. Christianson <a...@andyic.org> Authored: Wed Apr 11 11:46:13 2018 -0400 Committer: Bin Qiu <benqiu2...@gmail.com> Committed: Mon Apr 16 11:00:53 2018 -0700 ---------------------------------------------------------------------- extensions/expression-language/Expression.cpp | 270 +++++++++++++++++++ .../ExpressionLanguageTests.cpp | 24 ++ 2 files changed, 294 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/6a3faa39/extensions/expression-language/Expression.cpp ---------------------------------------------------------------------- diff --git a/extensions/expression-language/Expression.cpp b/extensions/expression-language/Expression.cpp index cd5199b..2590465 100644 --- a/extensions/expression-language/Expression.cpp +++ b/extensions/expression-language/Expression.cpp @@ -198,6 +198,272 @@ Value expr_unescapeJson(const std::vector<Value> &args) { } } +Value expr_escapeHtml3(const std::vector<Value> &args) { + return Value(utils::StringUtils::replaceMap( + args[0].asString(), + { + {"!", "!"}, + {"\"", """}, + {"#", "#"}, + {"$", "$"}, + {"%", "%"}, + {"&", "&"}, + {"'", "'"}, + {"(", "("}, + {")", ")"}, + {"*", "*"}, + {"+", "+"}, + {",", ","}, + {"-", "−"}, + {".", "."}, + {"/", "/"}, + {":", ":"}, + {";", ";"}, + {"<", "<"}, + {"=", "="}, + {">", ">"}, + {"?", "?"}, + {"@", "@"}, + {"[", "["}, + {"\\", "\"}, + {"]", "]"}, + {"^", "ˆ"}, + {"_", "_"}, + {"`", "`"}, + {"{", "{"}, + {"|", "|"}, + {"}", "}"}, + {"~", "˜"}, + {"¡", "¡"}, + {"¢", "¢"}, + {"£", "£"}, + {"¤", "¤"}, + {"Â¥", "¥"}, + {"¦", "&brkbar;"}, + {"§", "§"}, + {"¨", "¨"}, + {"©", "©"}, + {"ª", "ª"}, + {"«", "«"}, + {"¬", "¬"}, + {"®", "®"}, + {"¯", "¯"}, + {"°", "°"}, + {"±", "±"}, + {"²", "²"}, + {"³", "³"}, + {"´", "´"}, + {"µ", "µ"}, + {"¶", "¶"}, + {"·", "·"}, + {"¸", "¸"}, + {"¹", "¹"}, + {"º", "º"}, + {"»", "»;"}, + {"¼", "¼"}, + {"½", "½"}, + {"¾", "¾"}, + {"¿", "¿"}, + {"Ã", "À"}, + {"Ã", "Á"}, + {"Ã", "Â"}, + {"Ã", "Ã"}, + {"Ã", "Ä"}, + {"à ", "Å"}, + {"Ã", "Æ"}, + {"Ã", "Ç"}, + {"Ã", "È"}, + {"Ã", "É"}, + {"Ã", "Ê"}, + {"Ã", "Ë"}, + {"Ã", "Ì"}, + {"Ã", "Í"}, + {"Ã", "Î"}, + {"Ã", "Ï"}, + {"Ã", "Ð"}, + {"Ã", "Ñ"}, + {"Ã", "Ò"}, + {"Ã", "Ó"}, + {"Ã", "Ô"}, + {"Ã", "Õ"}, + {"Ã", "Ö"}, + {"Ã", "×"}, + {"Ã", "Ø"}, + {"Ã", "Ù;"}, + {"Ã", "Ú"}, + {"Ã", "Û"}, + {"Ã", "Ü"}, + {"Ã", "Ý"}, + {"Ã", "Þ"}, + {"Ã", "ß"}, + {"à ", "à"}, + {"á", "á"}, + {"â", "â"}, + {"ã", "ã"}, + {"ä", "ä"}, + {"Ã¥", "å"}, + {"æ", "æ"}, + {"ç", "ç"}, + {"è", "è"}, + {"é", "é"}, + {"ê", "ê"}, + {"ë", "ë"}, + {"ì", "ì"}, + {"Ã", "í"}, + {"î", "î"}, + {"ï", "ï"}, + {"ð", "ð"}, + {"ñ", "ñ"}, + {"ò", "ò"}, + {"ó", "ó"}, + {"ô", "ô"}, + {"õ", "õ"}, + {"ö", "ö"}, + {"÷", "÷"}, + {"ø", "ø"}, + {"ù", "ù"}, + {"ú", "ú"}, + {"û", "û"}, + {"ü", "ü"}, + {"ý", "ý"}, + {"þ", "þ"}, + {"ÿ", "ÿ"} + })); +} + +Value expr_unescapeHtml3(const std::vector<Value> &args) { + return Value(utils::StringUtils::replaceMap( + args[0].asString(), + { + {"!", "!"}, + {""", "\""}, + {"#", "#"}, + {"$", "$"}, + {"%", "%"}, + {"&", "&"}, + {"'", "'"}, + {"(", "("}, + {")", ")"}, + {"*", "*"}, + {"+", "+"}, + {",", ","}, + {"−", "-"}, + {".", "."}, + {"/", "/"}, + {":", ":"}, + {";", ";"}, + {"<", "<"}, + {"=", "="}, + {">", ">"}, + {"?", "?"}, + {"@", "@"}, + {"[", "["}, + {"\", "\\"}, + {"]", "]"}, + {"ˆ", "^"}, + {"_", "_"}, + {"`", "`"}, + {"{", "{"}, + {"|", "|"}, + {"}", "}"}, + {"˜", "~"}, + {"¡", "¡"}, + {"¢", "¢"}, + {"£", "£"}, + {"¤", "¤"}, + {"¥", "Â¥"}, + {"&brkbar;", "¦"}, + {"§", "§"}, + {"¨", "¨"}, + {"©", "©"}, + {"ª", "ª"}, + {"«", "«"}, + {"¬", "¬"}, + {"®", "®"}, + {"¯", "¯"}, + {"°", "°"}, + {"±", "±"}, + {"²", "²"}, + {"³", "³"}, + {"´", "´"}, + {"µ", "µ"}, + {"¶", "¶"}, + {"·", "·"}, + {"¸", "¸"}, + {"¹", "¹"}, + {"º", "º"}, + {"»;", "»"}, + {"¼", "¼"}, + {"½", "½"}, + {"¾", "¾"}, + {"¿", "¿"}, + {"À", "Ã"}, + {"Á", "Ã"}, + {"Â", "Ã"}, + {"Ã", "Ã"}, + {"Ä", "Ã"}, + {"Å", "à "}, + {"Æ", "Ã"}, + {"Ç", "Ã"}, + {"È", "Ã"}, + {"É", "Ã"}, + {"Ê", "Ã"}, + {"Ë", "Ã"}, + {"Ì", "Ã"}, + {"Í", "Ã"}, + {"Î", "Ã"}, + {"Ï", "Ã"}, + {"Ð", "Ã"}, + {"Ñ", "Ã"}, + {"Ò", "Ã"}, + {"Ó", "Ã"}, + {"Ô", "Ã"}, + {"Õ", "Ã"}, + {"Ö", "Ã"}, + {"×", "Ã"}, + {"Ø", "Ã"}, + {"Ù;", "Ã"}, + {"Ú", "Ã"}, + {"Û", "Ã"}, + {"Ü", "Ã"}, + {"Ý", "Ã"}, + {"Þ", "Ã"}, + {"ß", "Ã"}, + {"à", "à "}, + {"á", "á"}, + {"â", "â"}, + {"ã", "ã"}, + {"ä", "ä"}, + {"å", "Ã¥"}, + {"æ", "æ"}, + {"ç", "ç"}, + {"è", "è"}, + {"é", "é"}, + {"ê", "ê"}, + {"ë", "ë"}, + {"ì", "ì"}, + {"í", "Ã"}, + {"î", "î"}, + {"ï", "ï"}, + {"ð", "ð"}, + {"ñ", "ñ"}, + {"ò", "ò"}, + {"ó", "ó"}, + {"ô", "ô"}, + {"õ", "õ"}, + {"ö", "ö"}, + {"÷", "÷"}, + {"ø", "ø"}, + {"ù", "ù"}, + {"ú", "ú"}, + {"û", "û"}, + {"ü", "ü"}, + {"ý", "ý"}, + {"þ", "þ"}, + {"ÿ", "ÿ"} + })); +} + Value expr_escapeXml(const std::vector<Value> &args) { return Value(utils::StringUtils::replaceMap( args[0].asString(), @@ -606,6 +872,10 @@ Expression make_dynamic_function(const std::string &function_name, return make_dynamic_function_incomplete<expr_escapeXml>(function_name, args, 0); } else if (function_name == "unescapeXml") { return make_dynamic_function_incomplete<expr_unescapeXml>(function_name, args, 0); + } else if (function_name == "escapeHtml3") { + return make_dynamic_function_incomplete<expr_escapeHtml3>(function_name, args, 0); + } else if (function_name == "unescapeHtml3") { + return make_dynamic_function_incomplete<expr_unescapeHtml3>(function_name, args, 0); } else if (function_name == "escapeCsv") { return make_dynamic_function_incomplete<expr_escapeCsv>(function_name, args, 0); } else if (function_name == "unescapeCsv") { http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/6a3faa39/libminifi/test/expression-language-tests/ExpressionLanguageTests.cpp ---------------------------------------------------------------------- diff --git a/libminifi/test/expression-language-tests/ExpressionLanguageTests.cpp b/libminifi/test/expression-language-tests/ExpressionLanguageTests.cpp index 12c60ca..a2fc972 100644 --- a/libminifi/test/expression-language-tests/ExpressionLanguageTests.cpp +++ b/libminifi/test/expression-language-tests/ExpressionLanguageTests.cpp @@ -1065,6 +1065,30 @@ TEST_CASE("Encode Decode XML", "[expressionEncodeDecodeXML]") { // NOLINT REQUIRE("Zero > One < \"two!\" & 'true'" == expr({flow_file_a}).asString()); } +TEST_CASE("Encode HTML3", "[expressionEncodeHTML3]") { // NOLINT + auto expr = expression::compile("${message:escapeHtml3()}"); + + auto flow_file_a = std::make_shared<MockFlowFile>(); + flow_file_a->addAttribute("message", "Â¥ & < «"); + REQUIRE("¥ & < «" == expr({flow_file_a}).asString()); +} + +TEST_CASE("Decode HTML3", "[expressionDecodeHTML3]") { // NOLINT + auto expr = expression::compile("${message:unescapeHtml3()}"); + + auto flow_file_a = std::make_shared<MockFlowFile>(); + flow_file_a->addAttribute("message", "¥ & < «"); + REQUIRE("Â¥ & < «" == expr({flow_file_a}).asString()); +} + +TEST_CASE("Encode Decode HTML3", "[expressionEncodeDecodeHTML3]") { // NOLINT + auto expr = expression::compile("${message:escapeHtml3():unescapeHtml3()}"); + + auto flow_file_a = std::make_shared<MockFlowFile>(); + flow_file_a->addAttribute("message", "¥ & < «"); + REQUIRE("¥ & < «" == expr({flow_file_a}).asString()); +} + TEST_CASE("Encode CSV", "[expressionEncodeCSV]") { // NOLINT auto expr = expression::compile("${message:escapeCsv()}");