feat(a11y): allow trusted markdown (FAQ) to set any custom attributes in img

This commit is contained in:
Colin Darie 2024-07-24 19:12:50 +02:00
parent bb89c03679
commit efa5122ce0
No known key found for this signature in database
GPG key ID: 4FB865FDBCA4BCC4
3 changed files with 26 additions and 3 deletions

View file

@ -34,8 +34,26 @@ module Redcarpet
end end
end end
def image(link, title, alt) def image(link, title, alt_text)
view_context.image_tag(link, title:, alt:, loading: :lazy) # Extrait les attributs personnalisés s'ils existent sous la forme { aria-hidden=true } dans les []
custom_attributes = {}
if alt_text =~ /\s*\{(.+)\}$/
attr_string = Regexp.last_match(1)
alt_text = alt_text.sub(/\s*\{.+\}$/, '').strip
attr_string.split(' ').each do |attr|
key, value = attr.split('=')
custom_attributes[key.strip] = value.strip.delete('"')
end
end
# Combine les attributs standard et personnalisés
image_options = {
alt: alt_text,
title:,
loading: :lazy
}.merge(custom_attributes)
view_context.image_tag(link, image_options)
end end
# rubocop:disable Rails/OutputSafety # rubocop:disable Rails/OutputSafety

View file

@ -21,7 +21,7 @@ Pour appliquer un filtre à une liste de dossiers :
4. Sélectionnez ensuite la valeur à filtrer. 4. Sélectionnez ensuite la valeur à filtrer.
5. Cliquez enfin sur **« Ajouter le filtre »**. 5. Cliquez enfin sur **« Ajouter le filtre »**.
![Capture décran de linterface de saisie dun filtre](faq/instructeur-filtres-dropdown.png) ![Capture décran de linterface de saisie dun filtre {aria-hidden="true"}](faq/instructeur-filtres-dropdown.png)
![Capture décran de toutes les colonnes filtres](faq/instructeur-filtres-list.png) ![Capture décran de toutes les colonnes filtres](faq/instructeur-filtres-list.png)

View file

@ -19,6 +19,11 @@ RSpec.describe Redcarpet::TrustedRenderer do
markdown = "![A cute cat](http://example.com/cat.jpg)" markdown = "![A cute cat](http://example.com/cat.jpg)"
expect(renderer.render(markdown)).to include('<img alt="A cute cat" loading="lazy" src="http://example.com/cat.jpg" />') expect(renderer.render(markdown)).to include('<img alt="A cute cat" loading="lazy" src="http://example.com/cat.jpg" />')
end end
it 'renders additional attribute' do
markdown = "![A cute cat { aria-hidden=\"true\" }](http://example.com/cat.jpg)"
expect(renderer.render(markdown)).to include('<img alt="A cute cat" loading="lazy" aria-hidden="true" src="http://example.com/cat.jpg" />')
end
end end
context 'when autolinking' do context 'when autolinking' do