URL slug generation with transliteration and uniqueness.
Project description
philiprehberger-slug
URL slug generation with transliteration and uniqueness.
Installation
pip install philiprehberger-slug
Usage
from philiprehberger_slug import slugify
slugify("Hello World!") # "hello-world"
slugify("Ünïcödé Têxt") # "unicode-text"
slugify("Straße nach München") # "strasse-nach-munchen"
Options
from philiprehberger_slug import slugify
slugify("Hello World", separator="_") # "hello_world"
slugify("Hello World", max_length=8) # "hello"
slugify("Hello World", lowercase=False) # "Hello-World"
Reserved Slug Blocking
from philiprehberger_slug import slugify, ReservedSlugError
try:
slugify("Admin", reserved=["admin", "api", "about"])
except ReservedSlugError as e:
print(e) # "Slug 'admin' is reserved. Reserved slugs: ['admin', 'api', 'about']"
Custom Transliteration
from philiprehberger_slug import slugify
slugify("Ölkörper", transliterate={"ö": "oe", "ü": "ue"}) # "oelkoerper"
Slug from Parts
from philiprehberger_slug import slug_from_parts
slug_from_parts("2026", "03", "my post title") # "2026-03-my-post-title"
slug_from_parts("Blog", "Straße & Weg") # "blog-strasse-and-weg"
Unique Slugs
from philiprehberger_slug import unique_slugify
existing = {"hello-world", "hello-world-2"}
unique_slugify("Hello World", existing) # "hello-world-3"
Validate a slug
from philiprehberger_slug import is_valid_slug
is_valid_slug("hello-world") # True
is_valid_slug("Hello World") # False
is_valid_slug("--bad--") # False
is_valid_slug("hello_world", separator="_") # True
Strip HTML
from philiprehberger_slug import strip_html
strip_html("<p>Hello <b>World</b></p>") # "Hello World"
Bulk Slugify
from philiprehberger_slug import slugify_bulk
titles = ["Hello World", "Über München", "C++ & Friends"]
slugify_bulk(titles)
# ["hello-world", "uber-munchen", "c-and-friends"]
# Cap length per slug
slugify_bulk(["Long article title here"], max_length=10)
# ["long"]
API
| Function / Class | Description |
|---|---|
slugify(text, separator, max_length, lowercase, reserved, transliterate) |
Generate a URL-safe slug from text |
slugify_bulk(texts, separator, max_length, lowercase, reserved, transliterate) |
Slugify a batch of strings with the same settings |
slug_from_parts(*parts, separator) |
Join multiple strings into a single slug |
unique_slugify(text, existing, separator, max_length) |
Generate a unique slug with numeric suffix |
is_valid_slug(text, separator) |
Return True if text is already in canonical slug form |
strip_html(text) |
Remove HTML tags from text |
ReservedSlugError |
Raised when a slug matches a reserved word |
Development
pip install -e .
python -m pytest tests/ -v
Support
If you find this project useful:
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
philiprehberger_slug-0.4.0.tar.gz
(181.2 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file philiprehberger_slug-0.4.0.tar.gz.
File metadata
- Download URL: philiprehberger_slug-0.4.0.tar.gz
- Upload date:
- Size: 181.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1db8a2f0aea6d32272fdc2edd6fab5bf47d21c0b8e2c96b557d90df5d21955b5
|
|
| MD5 |
5917da20cc53d423234f5094b5c6ba10
|
|
| BLAKE2b-256 |
721ad3be1e6c63a3218298cb10ce41017c94fe6655abc316a07d487ebed2af67
|
File details
Details for the file philiprehberger_slug-0.4.0-py3-none-any.whl.
File metadata
- Download URL: philiprehberger_slug-0.4.0-py3-none-any.whl
- Upload date:
- Size: 6.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a8bb1db88c08c0249899be130b925b37bc6e0d72b77479b893e7ed85386c0deb
|
|
| MD5 |
336910ac32050dbee0466145f092248c
|
|
| BLAKE2b-256 |
922a78c1f57cd7d9d12cc8a534acbbc7949a79179fdb84559476b9a1c68e2c75
|