Program Listing for File Slugify.hpp
↰ Return to documentation for file (include\util\function\text\Slugify.hpp)
#pragma once
#include "util/common/Result.hpp"
#include "util/function/FunctionContext.hpp"
#include <cctype>
#include <string>
namespace PDJE_UTIL::function {
struct SlugifyArgs {
std::string input;
bool lowercase = true;
char separator = '-';
};
inline common::Result<std::string>
slugify(const SlugifyArgs &args, EvalOptions options = {})
{
(void)options;
if (std::isalnum(static_cast<unsigned char>(args.separator))) {
return common::Result<std::string>::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<char>(std::tolower(ch))
: static_cast<char>(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<std::string>::success(std::move(output));
}
} // namespace PDJE_UTIL::function