misc: strip emojis from buttons (#76405) #228

Merged
fpeters merged 1 commits from wip/76405-a11y-emoji-buttons into main 2023-04-14 10:54:47 +02:00
4 changed files with 34 additions and 3 deletions

1
debian/control vendored
View File

@ -22,6 +22,7 @@ Depends: graphviz,
python3-django-ckeditor,
python3-django-ratelimit,
python3-dnspython,
python3-emoji,

Le module est packagé pour bookworm : https://packages.debian.org/bookworm/python3-emoji et le paquet s'installe et fonctionne sur buster. J'ai hésité à faire sans et juste utiliser une regex un peu large ou moche mais comme c'était disponible, autant l'exploiter.

Aussi, ça permettrait ailleurs de fournir un filtre de remplacement (et/ou suppression) des emojis, qui pourrait être utilisé lors d'envoi vers des systèmes qui plantent sur ces caractères (par exemple https://dev.entrouvert.org/issues/75166, ou https://dev.entrouvert.org/issues/54028 précédemment).

Le module est packagé pour bookworm : https://packages.debian.org/bookworm/python3-emoji et le paquet s'installe et fonctionne sur buster. J'ai hésité à faire sans et juste utiliser une regex un peu large ou moche mais comme c'était disponible, autant l'exploiter. Aussi, ça permettrait ailleurs de fournir un filtre de remplacement (et/ou suppression) des emojis, qui pourrait être utilisé lors d'envoi vers des systèmes qui plantent sur ces caractères (par exemple https://dev.entrouvert.org/issues/75166, ou https://dev.entrouvert.org/issues/54028 précédemment).
python3-hobo,
python3-lasso,
python3-lxml,

View File

@ -203,6 +203,7 @@ setup(
'requests',
'setproctitle',
'phonenumbers',
'emoji',
],
package_dir={'wcs': 'wcs'},
packages=find_packages(),

View File

@ -4,6 +4,7 @@ import shutil
import mechanize
import pytest
from pyquery import PyQuery
from quixote import cleanup, get_response
from quixote.http_request import parse_query
@ -1409,3 +1410,26 @@ def test_condition_widget_no_python():
assert widget.get_error() == "syntax error: Could not parse the remainder: '{{' from '{{'"
pub.site_options.set('options', 'disable-python-expressions', 'false')
def test_emoji_button():
# textual button
form = Form(use_tokens=False)
form.add_submit('submit', 'Submit')
assert PyQuery(str(form.render()))('button').attr.name == 'submit'
assert not PyQuery(str(form.render()))('button').attr['aria-label']
assert PyQuery(str(form.render()))('button').text() == 'Submit'
# emoji + text
form = Form(use_tokens=False)
form.add_submit('submit', '✅ Submit')
assert PyQuery(str(form.render()))('button').attr.name == 'submit'
assert PyQuery(str(form.render()))('button').attr['aria-label'] == 'Submit'
assert PyQuery(str(form.render()))('button').text() == '✅ Submit'
# single emoji (do not do this) (no empty aria-label)
form = Form(use_tokens=False)
form.add_submit('submit', '')

Il y aurait à communiquer des bonnes pratiques sur l'utilisation des emojis dans les boutons, au moins :

  • celle notée ici de ne pas juste utiliser un emoji,
  • mais aussi déconseiller les emojis dont les couleurs ne fonctionnent pas sur fond sombre, cf l'exemple donné en lien dans le ticket, "Les emojis et sont peu visibles sur fond sombre."
Il y aurait à communiquer des bonnes pratiques sur l'utilisation des emojis dans les boutons, au moins : * celle notée ici de ne pas juste utiliser un emoji, * mais aussi déconseiller les emojis dont les couleurs ne fonctionnent pas sur fond sombre, cf l'exemple donné en lien dans le ticket, "Les emojis ➕ et ➖ sont peu visibles sur fond sombre."
assert PyQuery(str(form.render()))('button').attr.name == 'submit'
assert not PyQuery(str(form.render()))('button').attr['aria-label']
assert PyQuery(str(form.render()))('button').text() == ''

View File

@ -37,6 +37,7 @@ from functools import partial
import dns
import dns.exception
import dns.resolver
import emoji
from bleach import Cleaner
from bleach.linkifier import LinkifyFilter
from PIL import Image
@ -208,10 +209,14 @@ class SubmitWidget(quixote.form.widget.SubmitWidget):
def render_content(self):
if self.name in ('cancel', 'previous', 'save-draft'):
self.attrs['formnovalidate'] = 'formnovalidate'
value = htmlescape(self.label) if self.label else None
label = self.label or ''
if label and 'aria-label' not in self.attrs:
cleaned_label = emoji.replace_emoji(label, replace='').strip()
Outdated
Review

J'ai dû aller voir la doc pour comprendre que le replace en fait efface les emojis. Je serais pour qu'on ajoute ici la valeur par défault replace='' dans l'appel


cleaned_label = emoji.replace_emoji(label, replace='').strip()
J'ai dû aller voir la doc pour comprendre que le replace en fait efface les emojis. Je serais pour qu'on ajoute ici la valeur par défault replace='' dans l'appel ``` cleaned_label = emoji.replace_emoji(label, replace='').strip() ```

Voilà.

Voilà.
if cleaned_label and cleaned_label != label:
self.attrs['aria-label'] = cleaned_label
return (
htmltag('button', name=self.name, value=value, **self.attrs)
+ str(self.label)
htmltag('button', name=self.name, value=htmlescape(label), **self.attrs)
+ str(label)
+ htmltext('</button>')
)