Skip to content

Instantly share code, notes, and snippets.

@sidisinsane
Last active July 16, 2023 16:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sidisinsane/9591c6af358e269c570fc3503c1d6d0e to your computer and use it in GitHub Desktop.
Save sidisinsane/9591c6af358e269c570fc3503c1d6d0e to your computer and use it in GitHub Desktop.
String utilities (transliterate, slugify).
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