{ lib }: rec { /** Create a URL-safe slug from any string */ slug = str: let # Replace non-alphanumeric characters with hyphens replaced = join "" ( builtins.map (c: if (c >= "a" && c <= "z") || (c >= "0" && c <= "9") then c else "-" ) (with lib; stringToCharacters (toLower str))); # Remove leading and trailing hyphens trimHyphens = s: let matched = builtins.match "(-*)([^-].*[^-]|[^-])(-*)" s; in with lib; optionalString (!isNull matched) (builtins.elemAt matched 1); collapseHyphens = s: let result = builtins.replaceStrings [ "--" ] [ "-" ] s; in if result == s then s else collapseHyphens result; in trimHyphens (collapseHyphens replaced); join = lib.concatStringsSep; splitLines = s: with builtins; filter (x: !isList x) (split "\n" s); indent = prefix: s: join "\n" (map (x: if x == "" then x else "${prefix}${x}") (splitLines s)); }