Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🚀🚀 Another massive profit made in Premium Group and this time it is#IP/USDT which crossed All the Profit Targets for an humongous gain of 420%
🗨Contact @futurechief to enter the Binance Futures/Bybit/Kucoin/OKX Premium Signal Group & Receive daily high quality signals by being in the Premium Group
Абз. 1 п. 1 ст. 1245 ГК:
Авторам, исполнителям, изготовителям фонограмм и аудиовизуальных произведений принадлежит право на вознаграждение за свободное воспроизведение фонограмм и аудиовизуальных произведений исключительно в личных целях. Такое вознаграждение имеет компенсационный характер и выплачивается правообладателям за счет средств, которые подлежат уплате изготовителями и импортерами оборудования и материальных носителей, используемых для такого воспроизведения.
В современном мире, будто бы, требуется пересмотр подхода к свободному использованию интеллектуальной собственности.
Так, в тг можно через команду @song найти множество песен. Отчисляет ли кому-то тг вознаграждение? Сомневаюсь.
UPD. Короче там другое. Ща разберёмся. Не ставьте дизлайки, мне и так тошно.
UPD 2. Я кажется понял. Воспроизведение в личных целях никак нельзя контролировать. Оно "не приводит к вовлечению оригинала или экземпляров в оборот, поэтому его нельзя признать авторско-правовым использованием произведения" (учебник ИЦЧП, С. 123). Об этом написано в ст. 1273 ГК. Статья же 1245я говорит про другое. "Вознаграждение поступает авторам и иным правообладателям не непосредственно от пользователей, а от изготовителей и импортёров оборудования и материальных носителей, которые могут использоваться для целей воспроизведения аудиовизуальных произведений и фонограмм в личных целях" (учебник ИЦЧП, С. 427).
#ip
Абз. 4 п. 2 ст. 1295 ГК:
Право на вознаграждение за служебное произведение неотчуждаемо и не переходит по наследству, однако права автора по договору, заключенному им с работодателем, и не полученные автором доходы переходят к наследникам.
IP+наследственное+трудовое. Гремучая смесь, не иначе. Ну и как и с моральным вредом неясно, почему такое требование не переходит по наследству, ведь оно денежное. Связь с личностью нужно искать не в основании возникновения обязательства, а в его содержании.
#ip
Сижу в общаге в тёплой пижаме и шерстяных носках. Чай пью, IP читаю. Пока готовлюсь к сессии на канале будут всякие сумбурные посты.
И начну с довольно странной позиции кодекса не признавать наименование некоммерческой организации в качестве интеллектуальной собственности. Показательно подсвечивает проблему спор между фондом "Подари жизнь" и его клоном. Давно слышал об этом деле (кажется, Александр Николаевич в лекции упоминал). Сейчас нашёл заметку на zakon.ru.
https://zakon.ru/discussion/2017/07/11/nekommercheskim_organizaciyam_dali_shans_na_zaschitu_naimenovaniya__grazhdanskaya_kollegiya_vs_rassm
В ПП ВС №10 от 23.04.2019 говорится следующее:
147. В силу пункта 4 статьи 54, пункта 1 статьи 1473 ГК РФ право на фирменное наименование возникает только у юридического лица, являющегося коммерческой организацией.
Наименования некоммерческих организаций (статья 4 Федерального закона "О некоммерческих организациях") не являются средством индивидуализации юридических лиц в смысле положений части четвертой ГК РФ, на них не распространяется правовая охрана, установленная параграфом 1 главы 76 ГК РФ.
Ввиду этого правила, предусмотренные статьей 1473 ГК РФ, в том числе запреты, содержащиеся в пункте 4 этой статьи, на некоммерческие организации не распространяются.
Вместе с тем право на наименование некоммерческой организации может быть защищено от действий третьих лиц, являющихся актом недобросовестной конкуренции или злоупотреблением правом, на основании положений статьи 10 ГК РФ, Федерального закона "О защите конкуренции", статьи 10.bis Парижской конвенции. Кроме того, наименованию некоммерческой организации может быть предоставлена правовая охрана как коммерческому обозначению в случаях, предусмотренных параграфом 4 главы 76 ГК РФ.
Не относятся к фирменным наименованиям в смысле положений ГК РФ наименования не являющихся юридическими лицами объединений юридических лиц.
То есть ВС буквально говорит, что защита наименованию НКО предоставляется, но защита иная (только в случаях недобросовестной конкуренции или злоупотреблением правом, а также когда НКО осуществляет коммерческую деятельность охраняется коммерческое обозначение (ст. 1538 ГК и далее)).
#ip
Python 3 has a std lib module for working with #IP addresses:
»> import ipaddress
»> ipaddress.ip_address('192.168.1.2')
IPv4Address('192.168.1.2')
»> ipaddress.ip_address('2001:af3::')
IPv6Address('2001:af3::')
Learn more here:
https://docs.python.org/3/library/ipaddress.html
🇺🇸Universal Settles with AI Music Platform Udio
Universal Music Group settled its copyright lawsuit against AI music generator Udio and announced a new joint venture to launch a licensed AI music platform in 2026.
The deal includes a financial settlement and licensing for UMG's catalog, with the future platform allowing users to remix songs and create in artists' styles. Artists who opt in to the coming platform will be compensated for both model training and when their songs are remixed.
#AI#IP