最近、Vue.jsとmarked.jsとhighlight.jsを使ってマークダウンエディタを作ったので、使い方等をBlogにまとめておこうと思います🙇
- はじめに
- まずはテンプレートを用意する。
- marked.jsを使ってマークダウンテキスト→HTML変換を行う
- highlight.jsを使ってシンタックスハイライト機能を追加する。
- おまけ:マークダウンのデザインを調整する
- おわりに
- 参考
はじめに
まず作ろうとしているのは、こんな感じです。
普通のコードシンタックスハイライト機能付きのマークダウンエディタというような形です👀
まずはテンプレートを用意する。
まずは、今回のマークダウンエディタ用のテンプレートを用意します。
入力用のテキストエディタ(#editor
)とプレビュー用(#preview
)の要素を持つ単一ファイルコンポーネントを下記に記載しました。
また、テキストエディタには入力値をバインドするためにv-model
を記載しています。※スタイルは割愛してます。
<template> <form id="post-form"> <div id="editor"> <textarea v-model="markdownText">input</textarea> </div> <div id="preview"> </div> </form> </template> <script> export default { name: 'postForm', data: function () { return { markdownText: '' } } } </script>
marked.jsを使ってマークダウンテキスト→HTML変換を行う
それでは、marked.js
を使って入力値をHTMLに変換していきます。
https://github.com/markedjs/marked
まずはmarked.js
をインストールしましょう。
$ npm install marked --save
私は上記コマンドで行いましたが、詳しいインストール方法は下記を参考してください。
https://marked.js.org/#/README.md#installation
インストールが終わったらmarked.js
をimport
します。
import marked from 'marked';
そして下記のcomputed
を追加します。marked
の引数に変換したい文字列を渡せば、それに応じたHTMLを返してくれます👀
computed: { compiledMarkdown: function () { return marked(this.markdownText) } },
あとは#preview
にv-html
使ってバインドしてあげればOKです🙌
<div id="preview"> <div v-html="compiledMarkdown"></div> </div>
最終的にはこんな感じになります、これでエディタに応じたHTMLがバインドされるようになりました!意外と簡単ですね✨
<template> <form id="post-form"> <div id="editor"> <textarea v-model="markdownText">input</textarea> </div> <div id="preview"> <div v-html="compiledMarkdown"></div> </div> </form> </template> <script> import marked from 'marked'; export default { name: 'postForm', data: function () { return { markdownText: '' } }, computed: { compiledMarkdown: function () { return marked(this.markdownText) } }, } </script>
highlight.jsを使ってシンタックスハイライト機能を追加する。
次にhighlight.js
を使ってコードシンタックスハイライト機能を追加していきましょう!
まずは先程と同様にhighlight.js
をインストールしましょう!
$ npm install highlight.js --save
私は上記コマンドで行いましたが、詳しいインストール方法は下記を参考してください。
https://highlightjs.org/usage/
インストールが終わったらhighlightjs
をimport
します。
import hljs from 'highlightjs';
まずは、created
の中でhighlight.js
を使うようにmarked
のオプションを変更します。
created: function () { marked.setOptions({ // code要素にdefaultで付くlangage-を削除 langPrefix: '', // highlightjsを使用したハイライト処理を追加 highlight: function(code, lang) { return hljs.highlightAuto(code, [lang]).value } }); },
最後にハイライトで使うスタイルシートを読み込みます。私は、github-gist.css
にしましたが、他にも色々あるようなのでお好きなスタイルを使ってみてください👀
<style src='highlightjs/styles/github-gist.css'></style>
最終的には、こんな感じになりました!これでハイライト機能が出来ました🙌
<template> <form id="post-form"> <div id="editor"> <textarea v-model="markdownText">input</textarea> </div> <div id="preview"> <div v-html="compiledMarkdown"></div> </div> </form> </template> <script> import marked from 'marked'; import hljs from 'highlightjs'; export default { name: 'postForm', created: function () { marked.setOptions({ langPrefix: '', highlight: function(code, lang) { return hljs.highlightAuto(code, [lang]).value } }); }, computed: { compiledMarkdown: function () { return marked(this.markdownText) } }, data: function () { return { markdownText: '' } } } </script> <style src='highlightjs/styles/github-gist.css'></style>
おまけ:マークダウンのデザインを調整する
マークダウン用のスタイルを設定するのがめんどくさい人は、公開されているマークダウン用のスタイルがあるみたいなので、それを使ってみるのもありかと思いました!
ちなみに私はライセンスフリーの下記を使ってみました👀
おわりに
ライブラリを使うと結構簡単にマークダウンエディタが作れるんですね👀マークダウンエディタはシンプルかつ、いろいろ自分のアイデアを組み込めるので、勉強には良さそうな気がしました🤔
ここから色々機能を追加して、フロントエンド関係の知識も身に着けていきたいですね💪