mirror of
https://github.com/discourse/discourse.git
synced 2024-11-29 05:53:38 +08:00
67 lines
1.7 KiB
Ruby
67 lines
1.7 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Onebox
|
||
|
module Engine
|
||
|
class StackExchangeOnebox
|
||
|
include Engine
|
||
|
include LayoutSupport
|
||
|
include JSON
|
||
|
|
||
|
def self.domains
|
||
|
%w[
|
||
|
stackexchange.com
|
||
|
stackoverflow.com
|
||
|
superuser.com
|
||
|
serverfault.com
|
||
|
askubuntu.com
|
||
|
stackapps.com
|
||
|
mathoverflow.net
|
||
|
].map { |domain| Regexp.escape(domain) }
|
||
|
end
|
||
|
|
||
|
matches_regexp(
|
||
|
%r{^https?://(?:(?:(?<subsubdomain>\w*)\.)?(?<subdomain>\w*)\.)?(?<domain>#{domains.join("|")})/((?:questions|q)/(?<question_id>\d*)(/.*/(?<answer_id1>\d*))?|(a/(?<answer_id2>\d*)))},
|
||
|
)
|
||
|
|
||
|
def always_https?
|
||
|
uri.host.split(".").length <= 3
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def match
|
||
|
@match ||= @url.match(@@matcher)
|
||
|
end
|
||
|
|
||
|
def url
|
||
|
domain = uri.host
|
||
|
question_id = match[:question_id]
|
||
|
answer_id = match[:answer_id2] || match[:answer_id1]
|
||
|
|
||
|
if answer_id
|
||
|
"https://api.stackexchange.com/2.2/answers/#{answer_id}?site=#{domain}&filter=!.FjueITQdx6-Rq3Ue9PWG.QZ2WNdW"
|
||
|
else
|
||
|
"https://api.stackexchange.com/2.2/questions/#{question_id}?site=#{domain}&filter=!5-duuxrJa-iw9oVvOA(JNimB5VIisYwZgwcfNI"
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def data
|
||
|
return @data if defined?(@data)
|
||
|
|
||
|
result = raw["items"][0]
|
||
|
if result
|
||
|
result["creation_date"] = Time.at(result["creation_date"].to_i).strftime(
|
||
|
"%I:%M%p - %d %b %y %Z",
|
||
|
)
|
||
|
|
||
|
result["tags"] = result["tags"].take(4).join(", ")
|
||
|
result["is_answer"] = result.key?("answer_id")
|
||
|
result["is_question"] = result.key?("question_id")
|
||
|
end
|
||
|
|
||
|
@data = result
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|