やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

markdown-itのルビ記法プラグインをブラウザで使う方法

webpackを使う。

開発環境

前回まで

概要

  • HTML, CSS, JSファイルだけで作成したい。ローカルでもWebでも使いたい
  • MarkdownをHTMLに変換したい

パーサ

変換は既存ライブラリを使って楽をしたい。そこで、markdown-itというパーサを使う。

問題

npmモジュールがブラウザで使えない。

markdown-it-rubyのような拡張プラグインを使いたいが、npmモジュールとしてしか公開されていない。ブラウザで使いたいのにJSコードがない。

解決

webpackを使う。

フロントエンドというのがキーワードっぽい。

事前にNode.jsとnpmをインストールすること。

  1. Node.js, npm にて npmモジュール webpack, markdown-it, markdown-it-ruby をインストールする
  2. Node.js用のJSコードで markdown-it, markdown-it-ruby の利用コードを実装する
  3. webpack にて 2 をブラウザで使えるjsコードに変換する

参考

さらに詳しくは以下参考。

手順

webpackなどをインストールしたい任意ディレクトリを作成する。

$ mkdir /tmp/任意ディレクトリ

カレントディレクトリを任意ディレクトリにする。

$ cd /tmp/任意ディレクトリ

カレントディレクトリをnpmローカルパッケージとして初期化する。

$ npm init

各種パッケージをインストールする。

$ npm install webpack
$ npm install jquery
$ npm install markdown-it
$ npm install markdown-it-ruby
$ npm install markdown-it-anchor
$ npm install webpack

> uglifyjs-webpack-plugin@0.4.6 postinstall /tmp/env/node/markdonwnit/node_modules/uglifyjs-webpack-plugin
> node lib/post_install.js

npm WARN markdonwnit@1.0.0 No description
npm WARN markdonwnit@1.0.0 No repository field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.1.3 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.1.3: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"arm"})

+ webpack@3.10.0
added 251 packages in 97.437s
$ npm install jquery
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN markdonwnit@1.0.0 No description
npm WARN markdonwnit@1.0.0 No repository field.

+ jquery@3.3.1
added 1 package in 3.228s
$ npm install markdown-it
npm WARN markdonwnit@1.0.0 No description
npm WARN markdonwnit@1.0.0 No repository field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.1.3 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.1.3: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"arm"})

+ markdown-it@8.4.0
added 7 packages in 20.169s
$ npm install markdown-it-ruby
npm WARN markdonwnit@1.0.0 No description
npm WARN markdonwnit@1.0.0 No repository field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.1.3 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.1.3: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"arm"})

+ markdown-it-ruby@0.1.1
added 1 package in 15.76s
$ npm install markdown-it-anchor
npm WARN markdonwnit@1.0.0 No description
npm WARN markdonwnit@1.0.0 No repository field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.1.3 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.1.3: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"arm"})

+ markdown-it-anchor@4.0.0
added 2 packages in 16.053s

ローカルの.binを環境変数のパスに通す。

export PATH=$PATH:/tmp/任意ディレクトリ/node_modules/.bin

testcodeディレクトリをつくり、ソースコードを書く。

  • /tmp/任意ディレクトリ/
    • node_modules/
    • testcode/
      • front.js
      • index.html
      • webpack.config.js

front.js

$  = require("jquery")
md = require('markdown-it')().use(require('markdown-it-ruby'))
$(".markdown-body").html( md.render( $(".source").text() ) )

index.html

<meta charset="utf-8">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/github-markdown-css/2.2.1/github-markdown.css"/>
<div class=markdown-body></div>
<div class=source style="display: none">

# Hello {漢字|かん|じ}

[でんでんMarkdown書式におけるルビ記法](https://conv.denshochan.com/markdown#ruby)が使える。

{超電磁砲|レールガン}のような厨ニ病ルビも可。

</div>
<script src="bundle.js"></script>

webpack.config.js

module.exports = {
  entry: './front.js',
  output: {
    filename: './bundle.js'
  },
  devtool: 'source-map',
};

front.jsをbundle.jsに出力する。

$ webpack
Hash: 53335331efeadc3253c8
Version: webpack 3.10.0
Time: 5932ms
          Asset    Size  Chunks                    Chunk Names
    ./bundle.js  524 kB       0  [emitted]  [big]  main
./bundle.js.map  677 kB       0  [emitted]         main
  [12] ./front.js 147 bytes {0} [built]
    + 71 hidden modules

index.htmlをブラウザで開く。

f:id:ytyaru:20180128173657p:plain

ルビが表示される。{漢字|かん|じ}<ruby>のHTMLに動的変換されたようだ。成功!