Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
West Village, New York
В своем прошлом промышленный район, потом район художников и богемы 20 века (привет Керуак и Эдит Уортон), сейчас просто престижный и богатый район. Уютненькие улочки (Bleecker Street, Charles Street, Waverly Place и Cornelia Street), кафешки, бутики, определенный стиль района. Мне напомнило Чикагский "Printers row" и быстрорастущий район "West Loop"
Нравится наблюдать как бывшие фабричные здания преображаются под жилые. Обычно такие апартаменты стоят дороже из-за своей уникальности, высоких потолков, атмосферы и пространства самих квартир
#NY
В понедельник супруга отправилась покорять Нью-Йорк на два дня. Целью было попасть на выставку в MET, заодно походить по городу. Как я, так и она не были во многих местах в НЙ, скорее, были только в туристическом Манхеттене и прилегающем Бруклине
Из нового ей удалось увидеть общественное пространство «Little Island» (парк на воде на ножках), созданное в 21 году и «The Vessel» (стеклянная башенка), созданное в 19. У Vessel печальная история. Проект изначально задуманный как красивое общественное пространство, но часто омрачался суицидами. На момент визита сооружение все также было закрыто, но обещают обезопасить и снова открыть
Каждый раз приезжая в НЙ открываются новые локации. Безумный город. С каждого нового визита задаюсь вопросом как меня в первый раз мог впечатлить туристический Times Square и другие популярные локации. Масштабно, да, но здесь столько всего удивительного!
Vessel сказала её лично в жизни не впечатлил, а мне на фотографии кажется очень симпатичным, а вам как?
#NY
#NY
Ура-ура! Первой прогулке в Нью-Йорке быть!
Зовем людей от 12 до 18 лет на пикник-знакомство в Prospect Park 11 мая в 4:00 pm.
Эта встреча - коллаборация двух проектов: питерских Прогулов ВСЕ ДЕЛА и израильских The Walks (то есть нас).
Идея провести встречу в Нью-Йорке витает в наших головах еще с прошлого лета. Сначала туда уехала Маша Д. (привет, Тель-Авивские прогулки!), потом мы познакомились с ведущими питерских прогулов, затем, в Нью-Йорк прилетела Саша (привет, Бат-Ямские прогулки!), а теперь в гости приехала и Фаня Капицкая (привет, Национальная библиотека Израиля и наши походики!).
Мы подумали, что это удивительная возможность создать такой мост между странами и городами, между библиотеками — Иерусалимской и Бруклинской, у которой мы и встретимся в субботу 11 мая. Погода нас ждет теплая, поэтому от библиотеки мы отправимся прямо в парк, где устроим пикник, познакомимся друг с другом и встретим предстоящее лето!
Приносите с собой что-то вкусное, подстилки, но самое главное - приходите!
P.S. Если у вас есть знакомые подростки в Нью-Йорке, поделитесь с ними этой информацией, пожалуйста. Со всеми вопросами можно писать @masha_dinor
Немного рандома с водопадов:
- Водопады находятся на границе с Канадой и, судя по всему, с другой стороны видок получше.
- С американской и канадской сторон отправляются кораблики к водопадам. Пассажиры от разных стран надевают дождевики определенного цвета. Можно увидеть кораблики с синими (США) человечками и розовыми (Канада).
- На карабликах поднимают флаг в зависимости от того какие человечки есть на корабле. Если только синие, то только флаг Штатов, если еще и розовые - два флага.
- Близлежайший город выглядит примерно как Адлер. 4Д кинотеатр, странный ТЦ, огромные баннеры из 2010, перебивающие друг-друга рекламные вывески, китайское барахло везде и всюду. Благо это чуть поодаль от парка.
- Последняя фотка как из мема.
#NY
Ниагарские водопады 🌊
Без сомнения, эпичное явление.
Само слово «водопад» в голове всегда визуализировалось примерно так. Теперь закрепил в реальности.
#NY
Trump will refund the money for the tunnel between New York and New Jersey on condition that Dulles Airport and Penn Station are named after him.
The Donald Trump administration has proposed to Senator Chuck Schumer that Dulles Airport and Penn Station be named after the president. In return, the White House is ready to unlock federal money for the construction of a tunnel between New York and New Jersey - Punchbowl News.
The administration halted funding for the Gateway project, worth about $16 billion, at the beginning of the fall shutdown. The money has not been received since the government resumed its work.
The project includes a new railroad tunnel under the Hudson River between New York and New Jersey. In 2024, the Joe Biden administration allocated an additional $6.9 billion for construction.
It is reported that Schumer did not accept the White House's offer. Experts remind us that according to the Constitution, the budget is distributed by Congress. The 1974 Impoundment Control Act explicitly prohibits the president from withholding funds that have already been approved.
#Trump#NY
👂More on Trump's Ear
⚠️
Social media platforms with infinite scrolling, auto-play and algorithmic feeds will be required to display warning labels about their potential harm to young users’ mental health under a new law, New York Governor Kathy Hochul announced on Friday.
"Keeping New Yorkers safe has been my top priority since taking office, and that includes protecting our kids from the potential harms of social media features that encourage excessive use," Hochul said in a statement.
#NY#Media
👂More on Trump's Ear
What is happening on the fifth floor of 26 Federal Plaza? That is the question New Yorkers are asking as their neighbors walk into the facility, but don’t come out.
For five months, amNewYork has documented ICE detainments of people attending their legally mandated court hearings on the 12th and 14th floors of the now infamous facility in Lower Manhattan. However, while these arrests continue to take place, the rate at which they occur has dramatically declined in recent weeks — at least the arrests that are visible to the public.
Volunteers who accompany immigrants to their court-mandated appointments at 26 Federal Plaza told amNewYork that federal agents seem to be apprehending more detainees on the fifth floor, which houses ICE check-ins, a mandatory appointment for individuals released from immigration custody who are awaiting a court hearing or other immigration proceedings.
#ICE#NY
👂More on Trump's Ear
ICE is trying to poach NYPD cops 🚓 and add New York’s funniest 🤡 to its controversial ranks, according to a new social media advertisement 📱.
Coming hot off the heels of a contentious mayoral election 🗳 and seemingly attempting to capitalize on fears some cops may have regarding their treatment under the new Mamdani administration 🏛, an ICE account on Instagram 📸 is calling on police officers to join their ranks 🔫.
“NYPD OFFICERS: Join an agency that respects you, your family, and your commitment to serving in law enforcement 👮♂️,” the post read before adding a recruitment link 🔗.
“Zero chill 😬,” one commenter wrote 💬. “Please protect our NYPD officers 🙏,” another wrote.
#NY#ICE
👂More on Trump's Ear
New York Governor Kathy Hochul criticized federal immigration officers who she said shoved and injured journalists at a New York City courthouse on Tuesday, the latest in a series of violent confrontations as tensions rise over President Donald Trump's crackdown on immigrants in the U.S. illegally.🚨
Hochul shared a video posted to X, opens new tab by a New York Daily News reporter that showed masked men boarding an elevator in a federal building in downtown Manhattan that houses immigration courts. Several of the men, one of whom appeared to be wearing a U.S. Immigration and Customs Enforcement badge, pushed photographers near the elevator, sending at least two people crashing to the floor.
#ICE#NY
👂More on Trump's Ear ⚠️