From efa5122ce0dd8de8b5a94829a3e08387cce70b26 Mon Sep 17 00:00:00 2001 From: Colin Darie Date: Wed, 24 Jul 2024 19:12:50 +0200 Subject: [PATCH] feat(a11y): allow trusted markdown (FAQ) to set any custom attributes in img --- app/lib/redcarpet/trusted_renderer.rb | 22 +++++++++++++++++-- ...omment-filtrer-la-liste-des-dossiers.fr.md | 2 +- spec/lib/redcarpet/trusted_renderer_spec.rb | 5 +++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/app/lib/redcarpet/trusted_renderer.rb b/app/lib/redcarpet/trusted_renderer.rb index 850841135..db605c5b1 100644 --- a/app/lib/redcarpet/trusted_renderer.rb +++ b/app/lib/redcarpet/trusted_renderer.rb @@ -34,8 +34,26 @@ module Redcarpet end end - def image(link, title, alt) - view_context.image_tag(link, title:, alt:, loading: :lazy) + def image(link, title, alt_text) + # 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 # rubocop:disable Rails/OutputSafety diff --git a/doc/faqs/instructeur/comment-filtrer-la-liste-des-dossiers.fr.md b/doc/faqs/instructeur/comment-filtrer-la-liste-des-dossiers.fr.md index 40804127c..71074d42b 100644 --- a/doc/faqs/instructeur/comment-filtrer-la-liste-des-dossiers.fr.md +++ b/doc/faqs/instructeur/comment-filtrer-la-liste-des-dossiers.fr.md @@ -21,7 +21,7 @@ Pour appliquer un filtre à une liste de dossiers : 4. Sélectionnez ensuite la valeur à filtrer. 5. Cliquez enfin sur **« Ajouter le filtre »**. -![Capture d’écran de l’interface de saisie d’un filtre](faq/instructeur-filtres-dropdown.png) +![Capture d’écran de l’interface de saisie d’un filtre {aria-hidden="true"}](faq/instructeur-filtres-dropdown.png) ![Capture d’écran de toutes les colonnes filtres](faq/instructeur-filtres-list.png) diff --git a/spec/lib/redcarpet/trusted_renderer_spec.rb b/spec/lib/redcarpet/trusted_renderer_spec.rb index b0be7a94a..f3086f9a9 100644 --- a/spec/lib/redcarpet/trusted_renderer_spec.rb +++ b/spec/lib/redcarpet/trusted_renderer_spec.rb @@ -19,6 +19,11 @@ RSpec.describe Redcarpet::TrustedRenderer do markdown = "![A cute cat](http://example.com/cat.jpg)" expect(renderer.render(markdown)).to include('A cute cat') end + + it 'renders additional attribute' do + markdown = "![A cute cat { aria-hidden=\"true\" }](http://example.com/cat.jpg)" + expect(renderer.render(markdown)).to include('') + end end context 'when autolinking' do