Если ваша основная задача - принудительное монохроматическое отображение, чтобы смайлы не слишком выделялись из текста, вам могут понадобиться фильтры CSS, либо отдельно, либо в сочетании с селектором вариантов Unicode.
p.gscale {
-webkit-filter: grayscale(100%);
filter: grayscale(100%);
}
a {
color: #999;
-webkit-filter: grayscale(100%) sepia(100%) saturate(400%) hue-rotate(170deg);
filter: grayscale(100%) sepia(100%) saturate(400%) hue-rotate(170deg);
}
<p class="gscale">You've now got emoji display on 🔒lockdown🔒.</p>
<p>External Link: <a href="https://knowyourmeme.com/memes/party-hard">celebrate 🎉</a></p>
В отличие от селектора вариантов, не должно иметь значения, как отображаются смайлики, потому что фильтры CSS применяются ко всему. (Я использую их для выделения значков типа ссылки в формате PNG в оттенках серого на гиперссылках, которые были изменены, чтобы указывать на Wayback Machine.)
Только помните о нюансе . Вы не можете переопределить фильтр родительского элемента в дочернем элементе, поэтому этот метод нельзя использовать для оттенков серого абзаца, а затем перекрашивать ссылки в нем. 😢
... тем не менее, это полезно в ситуациях, когда вы либо собираетесь сделать все это гиперссылкой, либо запретить расширенную разметку внутри нее. (например, названия и описания)
Однако это не сработает, если на самом деле CSS не будет применен, поэтому я дам второй вариант, который более надежен в <title>
элементах, чем селектор вариантов Unicode (я смотрю на вас, GitHub. Мне не нравятся поддельные значки в моем вкладки браузера):
Если вы помещаете в <title>
элемент строку, предоставленную пользователем , отфильтруйте смайлы вместе с жирным шрифтом / курсивом / подчеркиванием и т. Д. разметки. (Да, для тех, кто его пропустил, стандарт действительно требует, чтобы содержимое <title>
было простым текстом, за исключением экранирования амперсанда и браузеров, которые я тестировал, все теги интерпретируются как буквальный текст.)
Я могу думать о двух способах:
- Непосредственно используйте поддерживаемое вручную регулярное выражение, которое соответствует блокам, в которые новейшая версия Unicode помещает свои эмодзи и их модификаторы.
- Пройдитесь по кластерам графем и отбросьте все, которые содержат распознанные кодовые точки эмодзи. (Кластер графемы - это базовый глиф плюс все диакритические знаки и другие модификаторы, составляющие видимый символ. В примере, на который я ссылаюсь, используется механизм регулярных выражений Python для токенизации, а затем
emoji
пакет для базы данных, но Rust является хорошим примером языка где итерация кластеров графем выполняется быстро и легко с помощью такого ящика unicode-segmentation
.)