.. _program_listing_file_include_util_function_text_Slugify.hpp: Program Listing for File Slugify.hpp ==================================== |exhale_lsh| :ref:`Return to documentation for file ` (``include\util\function\text\Slugify.hpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #pragma once #include "util/common/Result.hpp" #include "util/function/FunctionContext.hpp" #include #include namespace PDJE_UTIL::function { struct SlugifyArgs { std::string input; bool lowercase = true; char separator = '-'; }; inline common::Result slugify(const SlugifyArgs &args, EvalOptions options = {}) { (void)options; if (std::isalnum(static_cast(args.separator))) { return common::Result::failure( { common::StatusCode::invalid_argument, "SlugifyArgs.separator must be a non-alphanumeric delimiter." }); } std::string output; output.reserve(args.input.size()); bool previous_was_separator = true; for (unsigned char ch : args.input) { if (std::isalnum(ch)) { output.push_back(args.lowercase ? static_cast(std::tolower(ch)) : static_cast(ch)); previous_was_separator = false; } else if (!previous_was_separator && !output.empty()) { output.push_back(args.separator); previous_was_separator = true; } } while (!output.empty() && output.back() == args.separator) { output.pop_back(); } return common::Result::success(std::move(output)); } } // namespace PDJE_UTIL::function