58 lines
1.5 KiB
Crystal
58 lines
1.5 KiB
Crystal
class EmbeddedConverter
|
|
include Nodes
|
|
|
|
GIST_HOST_AND_SCHEME = "https://#{GIST_HOST}"
|
|
|
|
getter paragraph : PostResponse::Paragraph
|
|
getter gist_store : GistStore | RateLimitedGistStore
|
|
|
|
def self.convert(
|
|
paragraph : PostResponse::Paragraph,
|
|
gist_store : GistStore | RateLimitedGistStore
|
|
) : Embedded | Empty
|
|
new(paragraph, gist_store).convert
|
|
end
|
|
|
|
def initialize(
|
|
@paragraph : PostResponse::Paragraph,
|
|
@gist_store : GistStore | RateLimitedGistStore
|
|
)
|
|
end
|
|
|
|
def convert : Embedded | Empty
|
|
Monads::Try(PostResponse::IFrame).new(->{ paragraph.iframe })
|
|
.to_maybe
|
|
.fmap(->(iframe : PostResponse::IFrame) { iframe.mediaResource })
|
|
.fmap(->media_to_embedded(PostResponse::MediaResource))
|
|
.value_or(Empty.new)
|
|
end
|
|
|
|
private def media_to_embedded(media : PostResponse::MediaResource) : Embedded
|
|
if media.iframeSrc.blank?
|
|
custom_embed(media)
|
|
else
|
|
EmbeddedContent.new(
|
|
src: media.iframeSrc,
|
|
originalWidth: media.iframeWidth,
|
|
originalHeight: media.iframeHeight,
|
|
caption: caption
|
|
)
|
|
end
|
|
end
|
|
|
|
private def caption : FigureCaption?
|
|
if !paragraph.text.blank?
|
|
children = [Text.new(paragraph.text || "")] of Child
|
|
FigureCaption.new(children: children)
|
|
end
|
|
end
|
|
|
|
private def custom_embed(media : PostResponse::MediaResource) : Embedded
|
|
if media.href.starts_with?(GIST_HOST_AND_SCHEME)
|
|
GithubGist.new(href: media.href, gist_store: gist_store)
|
|
else
|
|
EmbeddedLink.new(href: media.href)
|
|
end
|
|
end
|
|
end
|