Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для URL, имени файла, имени объекта в каком-то софте и тд. Требования совместимости простые: в тексте должны быть только допустимые символы. Обычно это a-z, 0-9 и "_" или "-". То есть, только прописные буквы латинского алфавита и цифры (как пример).
Допустим, нам нужно название статьи в блоге преобразовать в slug для добавления его в URL этой статьи. Как это лучше всего сделать?
В Django по умолчанию есть готовая функция slugify для таких случаев.
Но я её никогда не использую. Почему? Потому что её недостаточно!
Приведём пример
>>> from django.utils.text import slugify
>>> slugify('This is a Title')
'this-is-a-title'
Пока всё отлично
>>> slugify('This is a "Title!"')
'this-is-a-title'
Спец символы удалились, всё хорошо.
>>> slugify('Это заголовок статьи')
''
Вот и приехали 😢. Если текст не английский то буквы просто игнорируются. Можно это поправить
>>> slugify('Это заголовок статьи', allow_unicode=True)
'это-заголовок-статьи'
Но тогда мы не вписываемся в условие. У нас появилась кириллица в тексте.
Так как я часто пишу сайты для русскоязычных пользователей эта проблема весьма актуальна. Я не использую стандартную функцию и всегда пишу свою.
Оригинал я не беру в расчёт и пишу полностью свою функцию. И так, по порядку:
🔸1. Исходный текст:
>>> text = 'Мой заголовок №10 😁!'
Взял специально посложней со специальными символами.
🔸2. Транслит
Необходимо сделать транслит всех символов в латиницу. Здесь очень выручает библиотека unidecode. Помимо простого транслита кириллицы в латиницу она умеет преобразовывать спец символы и иероглифы в текстовые аналоги.
from unidecode import unidecode
>>> unidecode("Ñ Σ ® µ ¶ ¼ 月 山")
'N S (r) u P 1/4 Yue Shan'
Очень крутая библиотека, советую👍
В нашем случае получаем такое преобразование:
>>> text = unidecode(text)
>>> print(text)
'Moi zagolovok No. 10 !'
Отличный транслит. Смайл просто удалился, хотя я ждал что-то вроде :). Ну и ладно, всë равно невалидные символы.
А еще наш код уже поддерживает любой язык, будь то хинди или корейский.
🔸4. Фильтр символов
Unidecode не занимается фильтрацией по недопустимым символам. Это мы делаем в следующем шаге через regex. Просто заменим все символы на "_" если они вне указанного диапазона.
>>> text = re.sub(r'[^a-zA-Z0-9]+', '_', text)
>>> print(text)
'Moi_zagolovok_No_10_'
Символ "+" в паттерне выручает когда несколько недопустимых символов идут рядом. Все они заменяются на один символ "_".
🔸5. Slugify
Осталось удалить лишние символы по краям и сделать нижний регистр
>>> text = text.strip('_').lower()
>>> print(text)
'moi_zagolovok_no_10'
Получаем отличный slug! 😎
🌎 Полный код в виде функции.
______________
PS. Проверку что в строке остался хоть один допустимый символ я бы вынес в отдельную функцию.
#libs#tricks#django
Celebrate Thanksgiving with Getgems NFT
#Getgems#TON
Getgems NFT invites its community to share a holiday toast in their Holiday Drinks collection this Thanksgiving. Participants can win prizes such as Bling Binky and Money Pots by submitting heartfelt comments before November 29. Comments cost 0.5 TON and will be manually approved.
Source: link
@tonlines
Getgems NFT: Selling Subdomains on Getgems
#Getgems#TON
Getgems NFT now allows TON DNS domain holders to create and sell collections of third-level domains on the Getgems platform. Domain owners can set prices, manage their mini marketplaces, and earn royalties from subdomain transactions. The first such collection has been launched with the Lost Dogs project using the woof.ton domain.
Source: link
@tonlines
Getgems NFT: The Rise of Subdomains
#TON#Getgems
Getgems NFT discusses the introduction of subdomains on TON DNS. These subdomains offer a new way for domain holders and projects to monetize and create distinct ecosystems. More details on pricing and launch will be shared soon.
Source: link
@tonlines
⚡️Getgems NFT: Gift Fest Launches an Exciting Prize Hunt
#Telegram#Getgems
Getgems NFT announces the launch of Gift Fest, the largest gift festival on Telegram, featuring 100,000 gifts valued at $400,000. Participants can join by using the festival mini-app to play, merge gifts, and enter weekly raffles, culminating in a main raffle on December 29.
Source: link
@tonlines
New Telegram Gifts at Getgems
#Telegram#Getgems
Getgems has launched new Telegram Gifts which are now tradable with 0% fees. Users can transfer or purchase items like Bling Binkies, Money Pots, and Pretty Posies through the mini app or website.
Source: link
@tonlines
Getgems NFT: Easter Giveaway for Easter Domain Holders
#Telegram#Getgems
Getgems NFT is hosting a Flash Easter Giveaway for all holders of Easter-themed Getgems Domains and Telegram Usernames. Participants have a chance to win one of 20 Telegram Gifts totaling 100 TON. Winners will be announced on April 21.
Source: link
@tonlines
⚡️Getgems NFT: Black Friday Raffle Announced
#Getgems#NFT
The Getgems NFT channel has launched a Black Friday raffle with unique black-background gifts. From November 28 to November 30, users can enter by importing specific collectible items, such as Instant Ramens or Money Pots, via @gemsrelayer. Winners will receive special editions of these items.
Source: link
@tonlines
New Commenting Features on Getgems NFT
#Getgems#NFT
Getgems NFT introduces a new feature allowing users to make announcements and comments on NFT collections. Messages undergo moderation and can cost 0.5 to 10 TON, depending on the type of collection.
Source: link
@tonlines
Getgems NFT: Celebrate with Your Collector Wrap
#Getgems#NFT
Getgems NFT celebrates its three-year anniversary by offering users a unique Collector Wrap experience on TON. Connect your wallet to explore your NFT journey, claim a limited-edition anniversary SBT, and create a custom avatar.
Source: link
@tonlines
Getgems NFT: Sticker Digest Unveiled
#TON#Getgems#NFT
Getgems NFT introduces the Sticker Digest, highlighting notable developments in the TON sticker market. Key updates include the trading success of Goodies with over 250K TON, the pioneering Sticker Pack collections, and recent collaborations within the ecosystem. Enhanced browsing with new filters is now available.
Source: link
@tonlines
Getgems NFT: Marketplace Technical Issues
#Getgems#marketplace
The Getgems NFT marketplace is currently facing technical difficulties. However, the team is actively working to resolve the issues, and the website will be operational shortly.
Source: link
@tonlines