mirror of
https://github.com/discourse/discourse.git
synced 2024-11-25 09:42:07 +08:00
14d97f9cf1
Currently when generating a onebox for Discourse topics, some important context is missing such as categories and tags. This patch addresses this issue by introducing a new onebox engine dedicated to display this information when available. Indeed to get this new information, categories and tags are exposed in the topic metadata as opengraph tags.
59 lines
1.4 KiB
Ruby
59 lines
1.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Onebox
|
|
class OpenGraph < Normalizer
|
|
def initialize(doc)
|
|
@data = extract(doc)
|
|
end
|
|
|
|
def title
|
|
get(:title, 80)
|
|
end
|
|
|
|
def title_attr
|
|
!title.nil? ? "title='#{title}'" : ""
|
|
end
|
|
|
|
def secure_image_url
|
|
secure_url = URI(get(:image))
|
|
secure_url.scheme = "https"
|
|
secure_url.to_s
|
|
end
|
|
|
|
private
|
|
|
|
COLLECTIONS = %i[article_section article_section_color article_tag]
|
|
|
|
def extract(doc)
|
|
return {} if Onebox::Helpers.blank?(doc)
|
|
|
|
data = {}
|
|
|
|
doc
|
|
.css("meta")
|
|
.each do |m|
|
|
if (m["property"] && m["property"][/^(?:og|article|product):(.+)$/i]) ||
|
|
(m["name"] && m["name"][/^(?:og|article|product):(.+)$/i])
|
|
value = (m["content"] || m["value"]).to_s
|
|
next if Onebox::Helpers.blank?(value)
|
|
key = $1.tr("-:", "_").to_sym
|
|
data[key] ||= value
|
|
if key.in?(COLLECTIONS)
|
|
collection_name = "#{key}s".to_sym
|
|
data[collection_name] ||= []
|
|
data[collection_name] << value
|
|
end
|
|
end
|
|
end
|
|
|
|
# Attempt to retrieve the title from the meta tag
|
|
title_element = doc.at_css("title")
|
|
if title_element && title_element.text
|
|
data[:title] ||= title_element.text unless Onebox::Helpers.blank?(title_element.text)
|
|
end
|
|
|
|
data
|
|
end
|
|
end
|
|
end
|