5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ElixirAdvent Calendar 2024

Day 19

KinoSpeakerDeck で Livebook にスライドを表示する

Last updated at Posted at 2024-11-29

はじめに

SpeakerDeck はスライドを共有できるサービスです

例えばこんな感じに Web 上でスライドを表示できます

Livebook にもスライドを埋め込むため、 KinoSpeakerDeck を実装しました

ノートブックでの利用例はこちら

セットアップ

ノートブックのセットアップセルで KinoSpeakerDeck をインストールします

Mix.install([
  {:kino_speaker_deck, "~> 0.1"}
])

スライドの表示

SpeakerDeck のスライド URL を指定するだけで表示できます

KinoSpeakerDeck.new("https://speakerdeck.com/ryowakabayashi/livebookde-wei-xing-detawoxi-u")

kino_speaker_deck.gif

仕組み

SpeakerDeck は oEmbed という埋め込みのための共通仕様に対応しています

https://speakerdeck.com/oembed.json?url=<スライドURL> にアクセスすることで、埋め込み用の HTML が取得できます

defmodule KinoSpeakerDeck do
  @moduledoc """
  A simple Kino for display Speaker Deck presentations on Livebook.
  """
  use Kino.JS

  def new(deck_url, opts \\ []) do
    case Req.get("https://speakerdeck.com/oembed.json?url=#{deck_url}") do
      {:ok, %Req.Response{status: 200, body: body}} ->
        width = opts[:width] || "100%"
        height = opts[:height] || "auto"

        body
        |> Map.get("html")
        |> String.replace(~r/width="\d*"/, "width=\"#{width}\"")
        |> String.replace(~r/height="\d*"/, "height=\"#{height}\"")
        |> Kino.HTML.new()

      {:ok, _} ->
        Kino.HTML.new("Invalid URL")

      {:error, _} ->
        Kino.HTML.new("Something went wrong")
    end
  end

  asset "main.js" do
    """
    export function init(ctx, iframe) {
      ctx.root.innerHTML = iframe;
    }
    """
  end
end

まとめ

KinoSpeakerDeck で Livebook にスライドを埋め込むことができました

Livebook 上に動画やスライド、プロトタイプなどを埋め込むことで、プレゼンテーションの幅が広がりますね

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?