scribe/src/classes/embedded_converter.cr

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