本稿では、以下の4つの機能を実装したアプリケーション「MD Slides (https://slides.deno.dev ) 」について紹介します。
従来のスライド作成のワークフローは以下のように、Markdownでスライドをつくってスライドと書き起しを共通化できても、最終段階の公開の部分やブログ貼り付け用のコードは手で作業する必要がありました。
このサービスによって Markdownの URLを渡すだけで、スライドも画像も貼り付け用コードもすべて自動生成してくれます。アップロードする必要もありません。
まずは、Markdown形式で資料を作成します。ページ区切りには--- を用います。
このMarkdownファイルを適当なウェブサイト(たとえば GitHub Gist)に投稿することで、発表用スライドの原稿として共有できます。
---marp:true---# MD Slides: お手軽スライド共有アプリby tani---# MD Slides: お手軽スライド共有アプリ以下の4つの機能を実装するアプリを作りました。- Markdown をスライド形式に変換して配信- スライドの特定のページを画像として配信- スライドごとに画像化して Markdown 形式に埋め込む- スライドごとに画像化して Scrapbox 形式に埋め込む---## Markdown をスライド形式に変換して配信適当なMarkdownを書きます。ページの区切りには`---` が採用されています。これを適当なウェブサイトに投稿しましょう。例えば、このmarkdownをGitHub Gistに投稿すれば発表スライドの原稿として共有可能です。GitHub Gistでは「Raw」ボタンから直接MarkdownへのURLを取得できます。このURLを本アプリに入力することで、スライドとして変換・配信できます。

MD Slides(https://slides.deno.dev )にアクセスし、MarkdownファイルのURLを入力後、「Generate」ボタンを押すとスライド配信用のURLが生成されます。

スライドは後述の通りMarpによりレンダリングされます。

この手順により、以下の2点が実現されます:
SNS等でのシェア目的で、スライドの一部ページだけを画像として抽出したい場合があります。その際は、MD Slidesにアクセスし、MarkdownファイルのURLを入力後、SVG形式と表示したいページを指定して「Generate」を押してください。画像として切り出されたページが配信用URLとして取得できます。

プレゼンテーション後に振り返り記事を執筆したい場合、各スライド画像をMarkdownに埋め込んだ形式で出力可能です。
この機能も、MD SlidesでMarkdownファイルのURLを指定し、「Generate」をクリックすることで利用できます。生成されたMarkdown形式のテキストをブログ記事等に貼り付けるだけで簡単に再利用可能です。

以下はGistに貼り付けた例です:

これでGistのPreviewでもスライドが表示されます。

Scrapbox(現 Cosense)ユーザー向けにも、各スライド画像をScrapbox(現 Cosense)形式で出力する機能を提供しています。
同様に、MD SlidesにMarkdownファイルのURLを入力し、「Generate」を押すと、Scrapbox(現 Cosense)形式のテキストが生成され、それをコピー&ペーストするだけで活用できます。

以下はScrapbox(現 Cosense)に貼り付けた例です:

本アプリは以下の技術スタックに基づいて構築されています:
以前はDenoとNodeの互換性が不十分であったためMarpが動作せず、このアイディアを保留していました。しかし現在では互換性が向上し、動作が確認できたため公開に至りました。
HTMLをPNG画像に変換するには、通常はPuppeteerのようなヘッドレスブラウザを使いますが、Deno Deployでは動作せず、リソース効率も良くありません。
そこで、SVG形式による画像化を採用しました。SVGはXMLベースのベクター形式であり、<foreignObject> 要素を使えばSVG内にHTMLを埋め込むことも可能です。
SVGがHTMLに埋め込めることを知っているひとは多いです。しかし、HTMLがSVGに埋め込めるのを意外に思う人は多いのではないのでしょうか。
これによりHTML文字列を<svg> と<foreignObject> で囲うだけで、そのまま画像データとして高速に配信できます。
<svg> と<foreignObject> でラップし、SVG形式として配信この方式ではラスタライズを介さずに済むため、非常に高速な画像配信が可能になりました。
<img>要素の制限についてWebページでSVGを表示する方法には以下があります:
<object><embed><iframe><img><img> 要素以外なら SVG画像を直接埋め込む様な挙動をしますが、<img> 要素ではセキュリティの観点から、SVG内の外部リソース(画像、フォント、スクリプト等)を読み込むことが制限されています。この仕様により、意図しない外部通信やスクリプト実行のリスクが抑えられます。
そのため、本アプリではCSS等を含むすべてのリソースをインライン化しており、外部リソースを必要としない構成を採用しています。
「MD Slides」を利用することで、1つのMarkdown文書から以下の用途に展開できます:
なお、Deno Deployには帯域制限があるため、気に入っていただけた場合には、GitHub Sponsors によるワンタイム支援をご検討いただけますと助かります!
バッジを受け取った著者にはZennから現金やAmazonギフトカードが還元されます。
