discourse/lib/onebox/engine/github_folder_onebox.rb
Jarek Radosz 31b27b3712
FIX: Broken GitHub folder onebox logic (#15612)
1. `html_doc.css('.Box.md')` always returns a truthy value (e.g. `[]`) so the second branch of the if-elsif never ran
2. `node&.css('text()')` was invalid code that would raise an error
3. Matching on h3 elements is no longer correct with the current html structure returned by GitHub
2022-01-17 18:32:07 +01:00

69 lines
1.7 KiB
Ruby

# frozen_string_literal: true
module Onebox
module Engine
class GithubFolderOnebox
include Engine
include StandardEmbed
include LayoutSupport
matches_regexp(/^https?:\/\/(?:www\.)?(?:(?:\w)+\.)?(github)\.com[\:\d]*(\/[^\/]+){2}\/tree/)
always_https
private
def data
og = get_opengraph
max_length = 250
display_path = extract_path(og.url, max_length)
display_description = clean_description(og.description, og.title, max_length)
title = og.title
fragment = Addressable::URI.parse(url).fragment
if fragment
fragment = Addressable::URI.unencode(fragment)
# For links to markdown and rdoc
if html_doc.css(".Box.md, .Box.rdoc").present?
node = html_doc.css('a.anchor').find { |n| n['href'] == "##{fragment}" }
subtitle = node&.parent&.text
end
title = "#{title} - #{subtitle}" if subtitle
end
{
link: url,
title: Onebox::Helpers.truncate(title, 250),
path: display_path,
description: display_description,
favicon: get_favicon
}
end
def extract_path(root, max_length)
path = url.split('#')[0].split('?')[0]
path = path["#{root}/tree/".length..-1]
return unless path
path.length > max_length ? path[-max_length..-1] : path
end
def clean_description(description, title, max_length)
return unless description
desc_end = " - #{title}"
if description[-desc_end.length..-1] == desc_end
description = description[0...-desc_end.length]
end
Onebox::Helpers.truncate(description, max_length)
end
end
end
end