Current section
Files
Jump to
Current section
Files
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_word_boundary/2, with_max_length/2, seo_preset/0, with_separator/2, validate_config/1, with_lowercase/2, with_transliterate/2, with_allow_unicode/2, with_custom_replacements/2, with_stop_words/2, with_preserve_leading_underscore/2, with_preserve_trailing_dash/2, with_locale/2, with_decamelize/2, with_decode_html_entities/2, with_ignore/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(),
glugify@locale:locale(),
boolean(),
boolean(),
list(binary())}.
-file("src/glugify/config.gleam", 65).
?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,
default,
false,
false,
[]}.
-file("src/glugify/config.gleam", 172).
?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),
erlang:element(13, Config),
erlang:element(14, Config),
erlang:element(15, Config),
erlang:element(16, Config)}.
-file("src/glugify/config.gleam", 152).
?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),
erlang:element(13, Config),
erlang:element(14, Config),
erlang:element(15, Config),
erlang:element(16, Config)}
end.
-file("src/glugify/config.gleam", 95).
?DOC(
" Creates a configuration tuned for SEO-friendly URLs.\n"
"\n"
" Same as `default()` but slugs are truncated to 60 characters at word\n"
" boundaries, following search engine guidance on URL length.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" let config = seo_preset()\n"
" ```\n"
).
-spec seo_preset() -> config().
seo_preset() ->
_pipe = default(),
_pipe@1 = with_max_length(_pipe, 60),
with_word_boundary(_pipe@1, true).
-file("src/glugify/config.gleam", 110).
?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),
erlang:element(13, Config),
erlang:element(14, Config),
erlang:element(15, Config),
erlang:element(16, Config)}.
-file("src/glugify/config.gleam", 120).
?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", 136).
?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),
erlang:element(13, Config),
erlang:element(14, Config),
erlang:element(15, Config),
erlang:element(16, Config)}.
-file("src/glugify/config.gleam", 189).
?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),
erlang:element(13, Config),
erlang:element(14, Config),
erlang:element(15, Config),
erlang:element(16, Config)}.
-file("src/glugify/config.gleam", 206).
?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),
erlang:element(13, Config),
erlang:element(14, Config),
erlang:element(15, Config),
erlang:element(16, Config)}.
-file("src/glugify/config.gleam", 226).
?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),
erlang:element(13, Config),
erlang:element(14, Config),
erlang:element(15, Config),
erlang:element(16, Config)}.
-file("src/glugify/config.gleam", 245).
?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),
erlang:element(13, Config),
erlang:element(14, Config),
erlang:element(15, Config),
erlang:element(16, Config)}.
-file("src/glugify/config.gleam", 261).
?DOC(
" Sets whether a leading underscore on the input is kept on the slug.\n"
"\n"
" Useful when slugifying identifiers where a leading underscore is\n"
" meaningful (private fields, hidden files).\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" default()\n"
" |> with_preserve_leading_underscore(True)\n"
" // \"_private notes\" -> \"_private-notes\"\n"
" ```\n"
).
-spec with_preserve_leading_underscore(config(), boolean()) -> config().
with_preserve_leading_underscore(Config, Preserve_leading_underscore) ->
{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),
Preserve_leading_underscore,
erlang:element(10, Config),
erlang:element(11, Config),
erlang:element(12, Config),
erlang:element(13, Config),
erlang:element(14, Config),
erlang:element(15, Config),
erlang:element(16, Config)}.
-file("src/glugify/config.gleam", 281).
?DOC(
" Sets whether a trailing dash on the input is kept on the slug as a\n"
" trailing separator.\n"
"\n"
" Useful for slug fields that update live while the user is still\n"
" typing, where \"draft-\" should not collapse to \"draft\".\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" default()\n"
" |> with_preserve_trailing_dash(True)\n"
" // \"draft-\" -> \"draft-\"\n"
" ```\n"
).
-spec with_preserve_trailing_dash(config(), boolean()) -> config().
with_preserve_trailing_dash(Config, Preserve_trailing_dash) ->
{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),
Preserve_trailing_dash,
erlang:element(11, Config),
erlang:element(12, Config),
erlang:element(13, Config),
erlang:element(14, Config),
erlang:element(15, Config),
erlang:element(16, Config)}.
-file("src/glugify/config.gleam", 299).
?DOC(
" Sets the locale used for language-specific transliteration rules.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" import glugify/locale\n"
"\n"
" default()\n"
" |> with_locale(locale.German)\n"
" // \"Über München\" -> \"ueber-muenchen\" (instead of \"uber-munchen\")\n"
" ```\n"
).
-spec with_locale(config(), glugify@locale:locale()) -> config().
with_locale(Config, Locale) ->
{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),
erlang:element(12, Config),
Locale,
erlang:element(14, Config),
erlang:element(15, Config),
erlang:element(16, Config)}.
-file("src/glugify/config.gleam", 313).
?DOC(
" Sets whether camelCase and PascalCase words are split before\n"
" slugification.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" default()\n"
" |> with_decamelize(True)\n"
" // \"myAwesomeXMLParser\" -> \"my-awesome-xml-parser\"\n"
" ```\n"
).
-spec with_decamelize(config(), boolean()) -> config().
with_decamelize(Config, Decamelize) ->
{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),
erlang:element(12, Config),
erlang:element(13, Config),
Decamelize,
erlang:element(15, Config),
erlang:element(16, Config)}.
-file("src/glugify/config.gleam", 329).
?DOC(
" Sets whether HTML entities (`&`, `&`, `&`) are decoded\n"
" before slugification.\n"
"\n"
" Useful when slugifying titles from CMS content or scraped HTML.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" default()\n"
" |> with_decode_html_entities(True)\n"
" // \"Tom & Jerry\" -> \"tom-and-jerry\"\n"
" ```\n"
).
-spec with_decode_html_entities(config(), boolean()) -> config().
with_decode_html_entities(Config, Decode_html_entities) ->
{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),
erlang:element(12, Config),
erlang:element(13, Config),
erlang:element(14, Config),
Decode_html_entities,
erlang:element(16, Config)}.
-file("src/glugify/config.gleam", 351).
?DOC(
" Sets graphemes that are kept verbatim in the slug: they are exempt\n"
" from transliteration, are not converted to separators, and survive\n"
" invalid-character removal.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" default()\n"
" |> with_ignore([\"#\"])\n"
" // \"C# rocks\" -> \"c#-rocks\"\n"
"\n"
" default()\n"
" |> with_ignore([\"嗨\"])\n"
" // \"嗨 hello\" -> \"嗨-hello\"\n"
" ```\n"
).
-spec with_ignore(config(), list(binary())) -> config().
with_ignore(Config, Ignore) ->
{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),
erlang:element(12, Config),
erlang:element(13, Config),
erlang:element(14, Config),
erlang:element(15, Config),
Ignore}.
-file("src/glugify/config.gleam", 366).
?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,
erlang:element(13, Config),
erlang:element(14, Config),
erlang:element(15, Config),
erlang:element(16, Config)}.