🔥

リッチテキストエディタ→Markdown変換ツールを作ってみた

に公開

はじめに

今回は、Next.jsとBlockNoteを組み合わせて開発した、NotionライクなリッチテキストエディタからMarkdown形式で記事を出力できるツールについて紹介します。

Markdownによる技術記事執筆を、より直感的で快適にすることを目的としたアプリケーションです。

https://to-md.vercel.app/

使用した技術

  • Next.js
  • Tailwind CSS
  • Block Note
  • supabase
  • shadcn/ui

ほか

プロジェクトについて

本プロジェクトは、BlockNoteで作成したリッチテキストを、Markdown形式に変換・出力できるツールです。

  • Notionのような操作性を持つBlockNoteエディタで、快適に記事を執筆できます。
  • 作成した記事は、BlockNote標準のMarkdown変換機能を活用し、QiitaやZennといった技術投稿メディア向けに出力可能です。

https://github.com/kami-kai0811/To-Md

作成の動機

私はエンジニアとして成長するために積極的に技術情報を発信し、多くのフィードバックを得たいと考えています。 QiitaやZennなどの技術投稿メディアは、記事の作成にMarkdownを使用します。 しかし、Markdownのみの執筆環境よりも、Notionのような直感的でリッチなエディタで記事を作成できたら、より効率的かつ快適に技術発信ができると考え、このアプリケーションを開発しました。

Block Noteとは

Reactで実装されたブロックベースのテキストエディタのライブラリです。

Notionのように、文章を「ブロック単位」で構造化し、視覚的かつ直感的に操作することができます。

特徴

  • デフォルトでNotionと遜色ないUXが設定されている。
  • カスタムブロックの追加が可能
  • 簡単に実装できる。

※※画像アップロードや埋め込みリンクなど一部機能は、独自にAPI連携などの実装が必要です。

実装方法(抜粋)

インストール

npm install @blocknote/core @blocknote/react @blocknote/mantine

Editor コンポーネントの作成(editor.tsx)

"use client"

import "@blocknote/core/fonts/inter.css";
import { BlockNoteView } from "@blocknote/mantine";
import "@blocknote/mantine/style.css";
import { useCreateBlockNote } from "@blocknote/react"; 
export default function App() { 
// Creates a new editor instance.  
const editor = useCreateBlockNote();   
// Renders the editor instance using a React component.  
return <BlockNoteView editor={editor} />;
}

クライアントサイドレンダリング(editor-csr.tsx)

"use client"; 
import dynamic from "next/dynamic"; 
export const Editor = dynamic(() => import("./Editor"), { ssr: false });
      

表示(page.tsx)

import { Editor } from "../components/DynamicEditor";
 
 
function App() {
  return (
    <div>
      <Editor />
    </div>
  );
}

Markdownの取得

editor.blocksToMarkdownLossy()

この関数でMarkdownを取得し、画面右側にリアルタイムで表示しています。

その他の実装

  • 埋め込みリンク
    カスタムブロックとして自作追加
  • 画像アップロード
    Supabaseストレージを使用して実装

詳細はgithubをご参照ください。

最後に

BlockNoteを用いることで、Notionライクな直感的インターフェースを持つエディタを簡単に構築できました。

今後はこのツールを活用して、より積極的に技術記事を発信していきたいと考えています。

ここまで読んでいただきありがとうございました。

参照リンク

Discussion