From 44bf2404f646dd169951673770b1279b2011daee Mon Sep 17 00:00:00 2001 From: Sebastian Kippe Date: Wed, 4 Jul 2018 09:27:03 +0200 Subject: [PATCH] Refactor icon parsing, add apple touch icons --- lib/manifique/web_client.rb | 24 ++++++++++++++++++++++++ spec/fixtures/mastodon-no-manifest.html | 1 + spec/manifique/web_client_spec.rb | 19 +++++++++++++++++-- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/lib/manifique/web_client.rb b/lib/manifique/web_client.rb index f5e0c54..fa58863 100644 --- a/lib/manifique/web_client.rb +++ b/lib/manifique/web_client.rb @@ -92,6 +92,12 @@ module Manifique end def parse_icons_from_html + parse_link_icons_from_html + parse_apple_touch_icons_from_html + parse_mask_icon_from_html + end + + def parse_link_icons_from_html if icon_links = @html.css("link[rel=icon]") icon_links.each do |link| icon = {} @@ -100,9 +106,26 @@ module Manifique icon["sizes"] = link.attributes["sizes"].value rescue nil icon["type"] = link.attributes["type"].value rescue get_icon_type(icon["src"]) @metadata.icons.push icon + @metadata.from_html.add "icons" end end + end + def parse_apple_touch_icons_from_html + if icon_links = @html.css("link[rel=apple-touch-icon]") + icon_links.each do |link| + icon = { "purpose" => "apple-touch-icon" } + icon["src"] = link.attributes["href"].value rescue nil + next if icon["src"].to_s.empty? + icon["sizes"] = link.attributes["sizes"].value rescue nil + icon["type"] = link.attributes["type"].value rescue get_icon_type(icon["src"]) + @metadata.icons.push icon + @metadata.from_html.add "icons" + end + end + end + + def parse_mask_icon_from_html if mask_icon_link = @html.at_css("link[rel=mask-icon]") icon = { "purpose" => "mask-icon" } icon["src"] = mask_icon_link.attributes["href"].value rescue nil @@ -110,6 +133,7 @@ module Manifique icon["type"] = link.attributes["type"].value rescue get_icon_type(icon["src"]) icon["color"] = mask_icon_link.attributes["color"].value rescue nil @metadata.icons.push icon + @metadata.from_html.add "icons" end end diff --git a/spec/fixtures/mastodon-no-manifest.html b/spec/fixtures/mastodon-no-manifest.html index fa7d0a5..633c264 100644 --- a/spec/fixtures/mastodon-no-manifest.html +++ b/spec/fixtures/mastodon-no-manifest.html @@ -6,6 +6,7 @@ + diff --git a/spec/manifique/web_client_spec.rb b/spec/manifique/web_client_spec.rb index bd8d9eb..58cf9de 100644 --- a/spec/manifique/web_client_spec.rb +++ b/spec/manifique/web_client_spec.rb @@ -160,16 +160,31 @@ RSpec.describe Manifique::WebClient do subject { web_client.fetch_metadata } - it "returns a metadata object with the HTML properties loaded" do + it "returns a metadata object" do expect(subject).to be_kind_of(Manifique::Metadata) + end + + it "loads properties from parsed HTML" do expect(subject.name).to eq("kosmos.social") expect(subject.description).to eq("A friendly place for tooting") expect(subject.theme_color).to eq("#282c37") expect(subject.display).to eq("standalone") + end + it "loads icons from link[rel=icon] elements" do png_icons = subject.icons.select{|i| i["type"] == "image/png"} - expect(png_icons.length).to eq(5) + expect(png_icons.length).to eq(7) expect(subject.icons.find{|i| i["sizes"] == "512x512"}["src"]).to eq( "/application_icon_x512.png") + end + + it "loads icons from link[rel=apple-touch-icon] elements" do + apple_touch_icons = subject.icons.select{|i| i["purpose"] == "apple-touch-icon"} + expect(apple_touch_icons.length).to eq(2) + expect(apple_touch_icons.first["type"]).to eq("image/png") + expect(apple_touch_icons.first["sizes"]).to eq("180x180") + end + + it "loads mask icons from link[rel=mask-icon] elements" do mask_icon = subject.icons.find{|i| i["purpose"] == "mask-icon"} expect(mask_icon["color"]).to eq("#2b90d9") expect(mask_icon["type"]).to eq("image/svg")