Packages

A robust, type-safe slugification library for Gleam that converts text into URL-friendly slugs

Current section

Files

Jump to
glugify src glugify@config.erl
Raw

src/glugify@config.erl

-module(glugify@config).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/glugify/config.gleam").
-export([default/0, with_separator/2, validate_config/1, with_lowercase/2, with_max_length/2, with_word_boundary/2, with_transliterate/2, with_allow_unicode/2, with_custom_replacements/2, with_stop_words/2, with_trim/2]).
-export_type([config/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-type config() :: {config,
binary(),
boolean(),
gleam@option:option(integer()),
boolean(),
boolean(),
boolean(),
list({binary(), binary()}),
boolean(),
boolean(),
list(binary()),
boolean()}.
-file("src/glugify/config.gleam", 56).
?DOC(
" Creates a default configuration with sensible defaults for most use cases.\n"
" \n"
" ## Default values:\n"
" \n"
" - Separator: `-`\n"
" - Lowercase: `True`\n"
" - Max length: `None` (unlimited)\n"
" - Word boundary: `False`\n"
" - Transliterate: `True`\n"
" - Allow unicode: `False`\n"
" - Custom replacements: `[]`\n"
" - Preserve leading underscore: `False`\n"
" - Preserve trailing dash: `False`\n"
" - Stop words: `[]`\n"
" - Trim: `True`\n"
" \n"
" ## Examples\n"
" \n"
" ```gleam\n"
" let config = default()\n"
" ```\n"
).
-spec default() -> config().
default() ->
{config,
<<"-"/utf8>>,
true,
none,
false,
true,
false,
[],
false,
false,
[],
true}.
-file("src/glugify/config.gleam", 81).
?DOC(
" Sets the separator character(s) used between words.\n"
" \n"
" ## Examples\n"
" \n"
" ```gleam\n"
" default()\n"
" |> with_separator(\"_\")\n"
" // Results in: \"hello_world\" instead of \"hello-world\"\n"
" ```\n"
).
-spec with_separator(config(), binary()) -> config().
with_separator(Config, Separator) ->
{config,
Separator,
erlang:element(3, Config),
erlang:element(4, Config),
erlang:element(5, Config),
erlang:element(6, Config),
erlang:element(7, Config),
erlang:element(8, Config),
erlang:element(9, Config),
erlang:element(10, Config),
erlang:element(11, Config),
erlang:element(12, Config)}.
-file("src/glugify/config.gleam", 91).
?DOC(
" Validates configuration parameters and returns an error if invalid.\n"
" \n"
" Currently validates:\n"
" - Separator length must be <= 10 characters\n"
" \n"
" Returns the same config if valid, or an error message if invalid.\n"
).
-spec validate_config(config()) -> {ok, config()} | {error, binary()}.
validate_config(Config) ->
case string:length(erlang:element(2, Config)) > 10 of
true ->
{error, <<"Separator too long (max 10 characters)"/utf8>>};
false ->
{ok, Config}
end.
-file("src/glugify/config.gleam", 107).
?DOC(
" Sets whether the output should be converted to lowercase.\n"
" \n"
" ## Examples\n"
" \n"
" ```gleam\n"
" default()\n"
" |> with_lowercase(False)\n"
" // Results in: \"Hello-World\" instead of \"hello-world\"\n"
" ```\n"
).
-spec with_lowercase(config(), boolean()) -> config().
with_lowercase(Config, Lowercase) ->
{config,
erlang:element(2, Config),
Lowercase,
erlang:element(4, Config),
erlang:element(5, Config),
erlang:element(6, Config),
erlang:element(7, Config),
erlang:element(8, Config),
erlang:element(9, Config),
erlang:element(10, Config),
erlang:element(11, Config),
erlang:element(12, Config)}.
-file("src/glugify/config.gleam", 123).
?DOC(
" Sets the maximum length for the generated slug.\n"
" \n"
" If the value is negative, the config remains unchanged.\n"
" Use with `with_word_boundary(True)` to truncate at word boundaries.\n"
" \n"
" ## Examples\n"
" \n"
" ```gleam\n"
" default()\n"
" |> with_max_length(10)\n"
" // Will truncate slugs to 10 characters maximum\n"
" ```\n"
).
-spec with_max_length(config(), integer()) -> config().
with_max_length(Config, Max_length) ->
case Max_length < 0 of
true ->
Config;
false ->
{config,
erlang:element(2, Config),
erlang:element(3, Config),
{some, Max_length},
erlang:element(5, Config),
erlang:element(6, Config),
erlang:element(7, Config),
erlang:element(8, Config),
erlang:element(9, Config),
erlang:element(10, Config),
erlang:element(11, Config),
erlang:element(12, Config)}
end.
-file("src/glugify/config.gleam", 143).
?DOC(
" Sets whether truncation should respect word boundaries.\n"
" \n"
" When `True`, truncation will not cut words in half.\n"
" Only applies when `max_length` is set.\n"
" \n"
" ## Examples\n"
" \n"
" ```gleam\n"
" default()\n"
" |> with_max_length(10)\n"
" |> with_word_boundary(True)\n"
" // \"hello world test\" -> \"hello\" (not \"hello worl\")\n"
" ```\n"
).
-spec with_word_boundary(config(), boolean()) -> config().
with_word_boundary(Config, Word_boundary) ->
{config,
erlang:element(2, Config),
erlang:element(3, Config),
erlang:element(4, Config),
Word_boundary,
erlang:element(6, Config),
erlang:element(7, Config),
erlang:element(8, Config),
erlang:element(9, Config),
erlang:element(10, Config),
erlang:element(11, Config),
erlang:element(12, Config)}.
-file("src/glugify/config.gleam", 160).
?DOC(
" Sets whether Unicode characters should be transliterated to ASCII.\n"
" \n"
" When `True`, characters like \"café\" become \"cafe\".\n"
" When `False`, Unicode characters are preserved or cause an error.\n"
" \n"
" ## Examples\n"
" \n"
" ```gleam\n"
" default()\n"
" |> with_transliterate(False)\n"
" |> with_allow_unicode(True)\n"
" // Preserves Unicode: \"café\" -> \"café\"\n"
" ```\n"
).
-spec with_transliterate(config(), boolean()) -> config().
with_transliterate(Config, Transliterate) ->
{config,
erlang:element(2, Config),
erlang:element(3, Config),
erlang:element(4, Config),
erlang:element(5, Config),
Transliterate,
erlang:element(7, Config),
erlang:element(8, Config),
erlang:element(9, Config),
erlang:element(10, Config),
erlang:element(11, Config),
erlang:element(12, Config)}.
-file("src/glugify/config.gleam", 177).
?DOC(
" Sets whether Unicode characters are allowed in the output.\n"
" \n"
" When `True`, Unicode characters are preserved in the output.\n"
" When `False`, only ASCII characters are allowed.\n"
" Usually used with `transliterate: False`.\n"
" \n"
" ## Examples\n"
" \n"
" ```gleam\n"
" default()\n"
" |> with_transliterate(False)\n"
" |> with_allow_unicode(True)\n"
" ```\n"
).
-spec with_allow_unicode(config(), boolean()) -> config().
with_allow_unicode(Config, Allow_unicode) ->
{config,
erlang:element(2, Config),
erlang:element(3, Config),
erlang:element(4, Config),
erlang:element(5, Config),
erlang:element(6, Config),
Allow_unicode,
erlang:element(8, Config),
erlang:element(9, Config),
erlang:element(10, Config),
erlang:element(11, Config),
erlang:element(12, Config)}.
-file("src/glugify/config.gleam", 197).
?DOC(
" Sets custom string replacements to apply before other processing.\n"
" \n"
" Each tuple contains `#(from, to)` where `from` is replaced with `to`.\n"
" Replacements are applied in the order provided.\n"
" \n"
" ## Examples\n"
" \n"
" ```gleam\n"
" default()\n"
" |> with_custom_replacements([\n"
" #(\"&\", \" and \"),\n"
" #(\"@\", \" at \"),\n"
" #(\"%\", \" percent \")\n"
" ])\n"
" // \"Cats & Dogs @ 100%\" -> \"cats-and-dogs-at-100-percent\"\n"
" ```\n"
).
-spec with_custom_replacements(config(), list({binary(), binary()})) -> config().
with_custom_replacements(Config, Replacements) ->
{config,
erlang:element(2, Config),
erlang:element(3, Config),
erlang:element(4, Config),
erlang:element(5, Config),
erlang:element(6, Config),
erlang:element(7, Config),
Replacements,
erlang:element(9, Config),
erlang:element(10, Config),
erlang:element(11, Config),
erlang:element(12, Config)}.
-file("src/glugify/config.gleam", 216).
?DOC(
" Sets a list of stop words to remove from the slug.\n"
" \n"
" Stop words are removed after other processing but before final cleanup.\n"
" Matching is case-insensitive.\n"
" \n"
" ## Examples\n"
" \n"
" ```gleam\n"
" default()\n"
" |> with_stop_words([\"the\", \"a\", \"an\", \"and\", \"or\"])\n"
" // \"The Quick Brown Fox and the Lazy Dog\" -> \"quick-brown-fox-lazy-dog\"\n"
" ```\n"
).
-spec with_stop_words(config(), list(binary())) -> config().
with_stop_words(Config, Stop_words) ->
{config,
erlang:element(2, Config),
erlang:element(3, Config),
erlang:element(4, Config),
erlang:element(5, Config),
erlang:element(6, Config),
erlang:element(7, Config),
erlang:element(8, Config),
erlang:element(9, Config),
erlang:element(10, Config),
Stop_words,
erlang:element(12, Config)}.
-file("src/glugify/config.gleam", 231).
?DOC(
" Sets whether to trim leading and trailing whitespace from the input.\n"
" \n"
" This is applied early in the processing pipeline.\n"
" \n"
" ## Examples\n"
" \n"
" ```gleam\n"
" default()\n"
" |> with_trim(False)\n"
" // Preserves leading/trailing spaces in processing\n"
" ```\n"
).
-spec with_trim(config(), boolean()) -> config().
with_trim(Config, Trim) ->
{config,
erlang:element(2, Config),
erlang:element(3, Config),
erlang:element(4, Config),
erlang:element(5, Config),
erlang:element(6, Config),
erlang:element(7, Config),
erlang:element(8, Config),
erlang:element(9, Config),
erlang:element(10, Config),
erlang:element(11, Config),
Trim}.