Last active
July 16, 2023 16:53
-
-
Save sidisinsane/9591c6af358e269c570fc3503c1d6d0e to your computer and use it in GitHub Desktop.
String utilities (transliterate, slugify).
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import re | |
import unicodedata | |
DIACRITICS_MAP = { | |
"À": "A", | |
"Ĕ": "E", | |
"Ļ": "L", | |
"Ś": "S", | |
"Ź": "Z", | |
"ē": "e", | |
"ľ": "l", | |
"ŝ": "s", | |
"Á": "A", | |
"Ė": "E", | |
"Ľ": "L", | |
"Ŝ": "S", | |
"Ż": "Z", | |
"ĕ": "e", | |
"ŀ": "l", | |
"ş": "s", | |
"Â": "A", | |
"Ę": "E", | |
"Ŀ": "L", | |
"Ş": "S", | |
"à": "a", | |
"ė": "e", | |
"ł": "l", | |
"ţ": "t", | |
"Ã": "A", | |
"Ĝ": "G", | |
"Ł": "L", | |
"Ţ": "T", | |
"á": "a", | |
"ę": "e", | |
"ñ": "n", | |
"ť": "t", | |
"Ä": "Ae", | |
"Ğ": "G", | |
"Ñ": "N", | |
"Ť": "T", | |
"â": "a", | |
"ĝ": "g", | |
"ń": "n", | |
"ŧ": "t", | |
"Å": "A", | |
"Ġ": "G", | |
"Ń": "N", | |
"Ŧ": "T", | |
"ã": "a", | |
"ğ": "g", | |
"ņ": "n", | |
"ù": "u", | |
"Ā": "A", | |
"Ģ": "G", | |
"Ņ": "N", | |
"Ù": "U", | |
"ä": "ae", | |
"ġ": "g", | |
"ň": "n", | |
"ú": "u", | |
"Ă": "A", | |
"Ĥ": "H", | |
"Ň": "N", | |
"Ú": "U", | |
"å": "a", | |
"ģ": "g", | |
"ò": "o", | |
"û": "u", | |
"Ą": "A", | |
"Ħ": "H", | |
"Ò": "O", | |
"Û": "U", | |
"ā": "a", | |
"ĥ": "h", | |
"ó": "o", | |
"ü": "ue", | |
"Ç": "C", | |
"Ì": "I", | |
"Ó": "O", | |
"Ü": "Ue", | |
"ă": "a", | |
"ħ": "h", | |
"ô": "o", | |
"ũ": "u", | |
"Ć": "C", | |
"Í": "I", | |
"Ô": "O", | |
"Ũ": "U", | |
"ą": "a", | |
"ì": "i", | |
"õ": "o", | |
"ū": "u", | |
"Ĉ": "C", | |
"Î": "I", | |
"Õ": "O", | |
"Ū": "U", | |
"ç": "c", | |
"í": "i", | |
"ö": "oe", | |
"ŭ": "u", | |
"Ċ": "C", | |
"Ï": "I", | |
"Ö": "Oe", | |
"Ŭ": "U", | |
"ć": "c", | |
"î": "i", | |
"ø": "o", | |
"ů": "u", | |
"Č": "C", | |
"Ĩ": "I", | |
"Ø": "O", | |
"Ů": "U", | |
"ĉ": "c", | |
"ï": "i", | |
"ō": "o", | |
"ű": "u", | |
"Ď": "D", | |
"Ī": "I", | |
"Ù": "O", | |
"Ű": "U", | |
"č": "c", | |
"ĩ": "i", | |
"õ": "o", | |
"ų": "u", | |
"Đ": "D", | |
"Ĭ": "I", | |
"Ù": "O", | |
"Ų": "U", | |
"ď": "d", | |
"ī": "i", | |
"ò": "o", | |
"ŵ": "w", | |
"Ē": "E", | |
"Į": "I", | |
"Ú": "O", | |
"Ŵ": "W", | |
"đ": "d", | |
"ĭ": "i", | |
"ó": "o", | |
"Ŷ": "Y", | |
"Ĕ": "E", | |
"İ": "I", | |
"Û": "O", | |
"Ŷ": "Y", | |
"ē": "e", | |
"į": "i", | |
"ô": "o", | |
"ŷ": "y", | |
"Ė": "E", | |
"Ý": "Y", | |
"Ÿ": "Y", | |
"ĕ": "e", | |
"õ": "o", | |
"ź": "z", | |
"Ę": "E", | |
"Ĵ": "J", | |
"ý": "y", | |
"Ź": "Z", | |
"ę": "e", | |
"ĵ": "j", | |
"ø": "o", | |
"ż": "z", | |
"Ě": "E", | |
"Ķ": "K", | |
"ÿ": "y", | |
"Ż": "Z", | |
"ě": "e", | |
"ķ": "k", | |
"Ō": "O", | |
"Ž": "Z", | |
"Ĝ": "G", | |
"Ĺ": "L", | |
"ĺ": "l", | |
"Ľ": "L", | |
"ľ": "l", | |
"ģ": "g", | |
"ŏ": "o", | |
"ž": "z", | |
"Ğ": "G", | |
"Ļ": "L", | |
"Ŀ": "L", | |
"ŀ": "l", | |
"ġ": "g", | |
"Ő": "O", | |
"Ÿ": "Y", | |
"Ġ": "G", | |
"Ľ": "L", | |
"Ŏ": "O", | |
"Ĥ": "H", | |
"Ŕ": "R", | |
"ŕ": "r", | |
"Ħ": "H", | |
"Ŗ": "R", | |
"Ś": "S", | |
"ś": "s", | |
"ĥ": "h", | |
"ŗ": "r", | |
"Ŝ": "S", | |
"ŝ": "s", | |
"Ĩ": "I", | |
"Ş": "S", | |
"Š": "S", | |
"Ş": "S", | |
"ĩ": "i", | |
"Ś": "S", | |
"ŝ": "s", | |
"š": "s", | |
"Ī": "I", | |
"Š": "S", | |
"Ţ": "T", | |
"ţ": "t", | |
"ī": "i", | |
"Ŝ": "S", | |
"ş": "s", | |
"ť": "t", | |
"Ĭ": "I", | |
"Ţ": "T", | |
"Ť": "T", | |
"ť": "t", | |
"ĭ": "i", | |
"ţ": "t", | |
"ť": "t", | |
"Ŧ": "T", | |
"Į": "I", | |
"Ť": "T", | |
"Ŧ": "T", | |
"į": "i", | |
"Ŧ": "T", | |
"ŧ": "t", | |
"Ũ": "U", | |
"Ū": "U", | |
"Ĵ": "J", | |
"ũ": "u", | |
"ū": "u", | |
"ĵ": "j", | |
"Ŭ": "U", | |
"Ŭ": "U", | |
"Ķ": "K", | |
"Ĺ": "L", | |
"ķ": "k", | |
"ĺ": "l", | |
"Ļ": "L", | |
"Ľ": "L", | |
"ļ": "l", | |
"ľ": "l", | |
"Ů": "U", | |
"Ŀ": "L", | |
"Ű": "U", | |
"Ų": "U", | |
"Ź": "Z", | |
"Ż": "Z", | |
"Ž": "Z", | |
"ſ": "s", | |
"ź": "z", | |
"ż": "z", | |
} | |
LIGATURES_MAP = { | |
"æ": "ae", | |
"Æ": "Ae", | |
"œ": "oe", | |
"Œ": "Oe", | |
"ß": "ss", | |
"ff": "ff", | |
"fi": "fi", | |
"fl": "fl", | |
"ffi": "ffi", | |
"ffl": "ffl", | |
"ſt": "ft", | |
"st": "st", | |
"ij": "ij", | |
"IJ": "Ij", | |
"ʒ": "ezh", | |
} | |
# Merge dictionaries by using the unpacking operator (`**`) | |
TRANSLITERATE_MAP = {**DIACRITICS_MAP, **LIGATURES_MAP} | |
def transliterate(text): | |
""" | |
Transliterates the given text by replacing diacritics and ligatures. | |
Args: | |
text (str): The input text to transliterate. | |
Returns: | |
str: The transliterated text. | |
Example: | |
>>> text = "ÀĔĻŚŹēľŝÁĖ" | |
>>> transliterate(text) | |
AELESZelsAE | |
""" | |
for char in TRANSLITERATE_MAP.keys(): | |
text = text.replace(char, TRANSLITERATE_MAP[char]) | |
text = unicodedata.normalize("NFKD", text).encode("ascii", "ignore").decode("utf-8") | |
return text | |
def slugify(str): | |
""" | |
Convert a string into a URL-friendly slug. | |
Args: | |
str (str): The input string to be slugified. | |
Returns: | |
str: The slugified string. | |
Example: | |
>>> slugify("Das Faß läuft... über!") | |
das-fass-laeuft-ueber | |
>>> slugify("Lorem Ipsum is simply dummy text.") | |
lorem-ipsum-is-simply-dummy-text | |
""" | |
# Replace diacritics and ligatures | |
str = transliterate(str) | |
# Convert to lowercase and remove leading/trailing spaces | |
str = str.lower().strip() | |
# Remove non-alphanumeric characters except spaces and hyphens | |
str = re.sub(r"[^\w\s-]", "", str) | |
# Replace consecutive spaces or hyphens with a single hyphen | |
str = re.sub(r"[\s_-]+", "-", str) | |
# Remove leading/trailing hyphens | |
str = re.sub(r"^-+|-+$", "", str) | |
return str |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment