【JavaScript】EasyMDE で自作のカスタムツールバーを追加する方法
head_image

当ブログは WordPress などのCMSは使用せず、 Ruby on Rails を使用して作成しており、記事を書くためのエディタの実装に、「EasyMDE」というオープンソースのJavaScript製マークダウンエディタを使用しました。(ver2.16.1)

コピペorインポートするだけで簡単に高性能なマークダウンエディタが実装でき、またカスタム性も持っていて非常に便利なので紹介していきます。

EasyMDE とは

ものの数分でマークダウンエディタを実装できる有難いOSSです。

EasyMDE: A simple, beautiful, and embeddable JavaScript Markdown editor. Delightful editing for beginners and experts alike. Features built-in autosaving and spell checking.
引用元 (公式):https://github.com/Ionaru/easy-markdown-editor

<Google翻訳>
EasyMDE:シンプルで美しく、埋め込み可能なJavaScriptMarkdownエディター。
初心者にもエキスパートにも楽しい編集。組み込みの自動保存とスペルチェックを備えています。

ということです。デモサイトはこちら

EasyMDE の使い方

CDNを使用する場合を例に紹介。

1.以下のコードをhtmlファイルの<head>タグの中に記載する。

<link rel="stylesheet" href="https://unpkg.com/easymde/dist/easymde.min.css">
<script src="https://unpkg.com/easymde/dist/easymde.min.js"></script>

2.以下のコードをhtmlファイルの<body>タグの中に記載する。

<textarea id="my-text-area"></textarea>
<script>
    const easyMDE = new EasyMDE({element: document.getElementById('my-text-area')});
</script>

終了!
これだけで以下のように基本的なマークダウンエディタを実装できます。

easyMde

エディタに記事を記載してフォームとして送信すれば、マークダウンで記載された文字列をサーバに送信できます。
ただ、マークダウンで記載した記事をサイトに表示する場合は、マークダウン記法 → HTMLに変換する必要があるので注意です。(ちなみにRailsでは「redcarpet」というGemを使えば変換可能です。)

また、Javascriptでエディタ上の記事内容を取得したい場合は、以下のコードで取得が可能です。

<script>
    easyMDE.value();
</script>

EasyMDEの機能

EasyMDEに搭載された便利な機能をいくつか紹介します。

ツールバーのカスタマイズ

EasyMDEでは、ツールバーを好みにカスタマイズすることが可能です。

easyMde

デフォルトでいくつかツールバーアイコンが用意されているので、それらを自由にピックアップして追加することができます。
ツールバーをカスタマイズするには、EasyMDEのインスタンス生成時に、toolbarプロパティの配列値を弄ってあげます。

const easyMDE = new EasyMDE({
    toolbar: [
        "bold",            //ツールバーアイコンの名前のみ記載して追加
        "heading",
        "strikethrough",
        "|",               //ツールバーにセパレーターを追加
        {                  //連想配列による記載も可能
            name: "quote",
            action: EasyMDE.toggleBlockquote,
            className: "fa fa-quote-left",
            title: "Quote",
        },
        {
            name: "link", 
            action: EasyMDE.drawLink,
            className: "fa fa fa-link",
            title: "Link",
        }
    ]
});

デフォルトで用意されているツールバーアイコンは以下の表の通りです。
上記のコードに当てはめれば、簡単にツールバーを変更できます。

  • Name … ツールバーアイコンの名前
  • Action … ツールバーアイコンをクリックした際の動作
  • Class … fontawesome(4.7.0) の表示アイコン 表示アイコンを変えたい場合は fontawesome を参照
Name   Action  Class   説明  
bold   toggleBold fa fa-bold 太字
italic   toggleItalic fa fa-italic イタリック体
strikethrough   toggleStrikethrough fa fa-strikethrough 打ち消し線
heading   toggleHeadingSmaller fa fa-header 見出し#を追加
heading-smaller   toggleHeadingSmaller fa fa-header 見出し#を追加
heading-bigger   toggleHeadingBigger fa fa-lg fa-header 見出し#を6つ追加
heading-1   toggleHeading1 fa fa-header header-1 見出し#を1つ
heading-2   toggleHeading2 fa fa-header header-2 見出し#を2つ
heading-3   toggleHeading3 fa fa-header header-3 見出し#を3つ
code   toggleCodeBlock fa fa-code ソースコード
quote   toggleBlockquote fa fa-quote-left 引用
unordered-list   toggleUnorderedList fa fa-list-ul リスト(点)
ordered-list   toggleOrderedList fa fa-list-ol リスト(数値)
clean-block   cleanBlock fa fa-eraser 文字の装飾をキャンセルする
link   drawLink fa fa-link リンク
image   drawImage fa fa-picture-o 画像
table   drawTable fa fa-table テーブル
horizontal-rule   drawHorizontalRule fa fa-minus 水平罫線
preview   togglePreview fa fa-eye no-disable プレビューモード
side-by-side   toggleSideBySide fa fa-columns no-disable no-mobile エディタとプレビューを
並べて表示
fullscreen   toggleFullScreen fa fa-arrows-alt no-disable no-mobile フルスクリーン
guide   This link fa fa-question-circle マークダウンガイドのリンク
undo   undo fa fa-undo 操作取り消し
redo   redo fa fa-redo undoの取り消し

記載内容の自動保存

EasyMDEでは、記載内容の自動保存機能までもが備わっています。
自動保存についても、EasyMDEのインスタンス生成時に、以下のようにautosaveプロパティにtrue値を持たせてあげるだけでOK。

new EasyMDE({
    spellChecker: false,  //日本語はスペルチェックに引っかかるのでスペルチェックをオフ
    autosave: {            //自動保存
        enabled: true,     //有効化
        delay: 1000,       //毎秒
        uniqueId: 'mde-autosave-demo' //ローカルストレージのキーに使用
    },
    element: document.getElementById('mde-autosave-demo'),
    initialValue: '## Autosave \n内容を毎秒自動保存してくれます!' //エディタの初期値
});

自動保存はブラウザのローカルストレージに指定の時間ごとに保存してくれます。
なので、ページをリロードしようがタブを閉じようが、再表示したときに記載していた状態で表示されます。

easyMde

自作カスタムツールバーの導入方法

では、カスタムツールバーアイコンを追加する方法を紹介します。
サンプルとして、以下のYoutube動画を埋め込むコードを用意しました。

const easyMDE = new EasyMDE({
    toolbar: [
        "bold",
        "heading",
        "strikethrough",
        "|", 
        { 
            name: "emdet-insertYoutube",   
            action: insertYoutube,           //Javascriptの関数を呼び出す
            className: "fa fa-youtube-play", //fontawesome(4.7.0)より選択
            title: "Insert Youtube Video"
        },
        "side-by-side"
    ]
});

var _editor = {};

function insertYoutube(editor) {
    _editor = editor;
    var id = prompt("動画のIDを入力してください。", "");

    if (id !== null && id !== "") {
        var tag = '<div class="youtube-container"><iframe width="560" height="315" src="https://www.youtube.com/embed/' + id + '" frameborder="0" allowfullscreen></iframe></div>';
        var cm = _editor.codemirror;
        cm.replaceSelection(tag);
    }
}

簡単にコードの解説をしますと、こんな感じの流れです。

  1. toolbarプロパティのキーに任意の値を持たせており、actionの値に独自関数名を指定する。
  2. ツールバーのアイコンがクリックされたときに、独自に作成したinsertYoutube関数が発火し、promptメソッドにより入力ダイアログを表示する。
  3. 入力されたYoutubeの動画IDをHTMLのiframeタグに埋め込んでtag変数に格納する。
  4. insertYoutube関数の発火時に渡されるcodemirrorイベントのreplaceSelectionメソッドにより、tag変数のHTMLをエディタ上に書き込む。 (codemirrorイベントの一覧はこちら

実際に使ってみるとこんな感じです。

easyMde

カスタムツールバーのアイコンのクリック時に自作関数が発火できるので、カスタム性は非常に高いですね。本記事が少しでも参考になれば幸いです。
せっかくなので最後にお気に入りのYoutube動画を埋め込んで終わりたいと思います。笑


ABOUT

気ままにアウトプットをする場所です。

このブログについて
CATEGORY
TOP