From 243557a31aec5012796821fda6f2702a5e1efdae Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Fri, 2 Aug 2024 18:48:04 +0300 Subject: [PATCH] Set og:image:alt OpenGraph property --- app/controllers/diary_entries_controller.rb | 1 + app/helpers/open_graph_helper.rb | 21 +++++++++---- app/views/layouts/_meta.html.erb | 2 +- .../diary_entries_controller_test.rb | 30 +++++++++++++++++++ 4 files changed, 47 insertions(+), 7 deletions(-) diff --git a/app/controllers/diary_entries_controller.rb b/app/controllers/diary_entries_controller.rb index eaf6ddf9c..9962c7efd 100644 --- a/app/controllers/diary_entries_controller.rb +++ b/app/controllers/diary_entries_controller.rb @@ -69,6 +69,7 @@ class DiaryEntriesController < ApplicationController if @entry @title = t ".title", :user => params[:display_name], :title => @entry.title @og_image = @entry.body.image + @og_image_alt = @entry.body.image_alt @comments = can?(:unhide, DiaryComment) ? @entry.comments : @entry.visible_comments else @title = t "diary_entries.no_such_entry.title", :id => params[:id] diff --git a/app/helpers/open_graph_helper.rb b/app/helpers/open_graph_helper.rb index a41831ca6..ad24c73b2 100644 --- a/app/helpers/open_graph_helper.rb +++ b/app/helpers/open_graph_helper.rb @@ -1,15 +1,16 @@ module OpenGraphHelper require "addressable/uri" - def opengraph_tags(title = nil, og_image = nil) + def opengraph_tags(title = nil, og_image = nil, og_image_alt = nil) tags = { "og:site_name" => t("layouts.project_name.title"), "og:title" => title || t("layouts.project_name.title"), "og:type" => "website", - "og:image" => og_image_url(og_image), "og:url" => url_for(:only_path => false), "og:description" => t("layouts.intro_text") - } + }.merge( + opengraph_image_properties(og_image, og_image_alt) + ) safe_join(tags.map do |property, content| tag.meta(:property => property, :content => content) @@ -18,12 +19,20 @@ module OpenGraphHelper private - def og_image_url(og_image) + def opengraph_image_properties(og_image, og_image_alt) begin - return Addressable::URI.join(root_url, og_image).normalize if og_image + if og_image + properties = {} + properties["og:image"] = Addressable::URI.join(root_url, og_image).normalize + properties["og:image:alt"] = og_image_alt if og_image_alt + return properties + end rescue Addressable::URI::InvalidURIError # return default image end - image_url("osm_logo_256.png") + { + "og:image" => image_url("osm_logo_256.png"), + "og:image:alt" => t("layouts.logo.alt_text") + } end end diff --git a/app/views/layouts/_meta.html.erb b/app/views/layouts/_meta.html.erb index 37afbb894..f09449761 100644 --- a/app/views/layouts/_meta.html.erb +++ b/app/views/layouts/_meta.html.erb @@ -21,7 +21,7 @@ <% end -%> <%= tag.link :rel => "search", :type => "application/opensearchdescription+xml", :title => "OpenStreetMap Search", :href => asset_path("osm.xml") %> <%= tag.meta :name => "description", :content => "OpenStreetMap is the free wiki world map." %> -<%= opengraph_tags(@title, @og_image) %> +<%= opengraph_tags(@title, @og_image, @og_image_alt) %> <% if flash[:matomo_goal] -%> <%= tag.meta :name => "matomo-goal", :content => flash[:matomo_goal] %> <% end -%> diff --git a/test/controllers/diary_entries_controller_test.rb b/test/controllers/diary_entries_controller_test.rb index 24475fc80..e3bbb490d 100644 --- a/test/controllers/diary_entries_controller_test.rb +++ b/test/controllers/diary_entries_controller_test.rb @@ -657,6 +657,9 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest assert_dom "head meta[property='og:image']" do assert_dom "> @content", ActionController::Base.helpers.image_url("osm_logo_256.png", :host => root_url) end + assert_dom "head meta[property='og:image:alt']" do + assert_dom "> @content", "OpenStreetMap logo" + end end def test_show_og_image @@ -668,6 +671,9 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest assert_dom "head meta[property='og:image']" do assert_dom "> @content", "https://example.com/picture.jpg" end + assert_dom "head meta[property='og:image:alt']" do + assert_dom "> @content", "some picture" + end end def test_show_og_image_with_relative_uri @@ -679,6 +685,9 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest assert_dom "head meta[property='og:image']" do assert_dom "> @content", "#{root_url}picture.jpg" end + assert_dom "head meta[property='og:image:alt']" do + assert_dom "> @content", "some local picture" + end end def test_show_og_image_with_spaces @@ -690,6 +699,9 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest assert_dom "head meta[property='og:image']" do assert_dom "> @content", "https://example.com/the%20picture.jpg" end + assert_dom "head meta[property='og:image:alt']" do + assert_dom "> @content", "some picture" + end end def test_show_og_image_with_relative_uri_and_spaces @@ -701,6 +713,9 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest assert_dom "head meta[property='og:image']" do assert_dom "> @content", "#{root_url}the%20picture.jpg" end + assert_dom "head meta[property='og:image:alt']" do + assert_dom "> @content", "some local picture" + end end def test_show_og_image_with_invalid_uri @@ -712,6 +727,21 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest assert_dom "head meta[property='og:image']" do assert_dom "> @content", ActionController::Base.helpers.image_url("osm_logo_256.png", :host => root_url) end + assert_dom "head meta[property='og:image:alt']" do + assert_dom "> @content", "OpenStreetMap logo" + end + end + + def test_show_og_image_without_alt + user = create(:user) + diary_entry = create(:diary_entry, :user => user, :body => "") + + get diary_entry_path(user, diary_entry) + assert_response :success + assert_dom "head meta[property='og:image']" do + assert_dom "> @content", "https://example.com/no_alt.gif" + end + assert_dom "head meta[property='og:image:alt']", :count => 0 end def test_hide -- 2.39.5