React Syntax Highlighterで差分行をハイライト(diff highlight)する
やりたいこと
Reactでコードをシンタックスハイライトする際に、ライブラリの候補として挙がってくるreact-syntax-highlighter 。
行番号表示など十分な機能が揃ってはいるが、唯一差分のハイライト(diff highlight)機能は備わっていない。
しかしブログを書く上で上記のように差分を強調したい場面は数多くあるので、素のPrism.jsの差分ハイライト機能に似たものを下記の要件で実装してみる。
- コードブロックの言語名を
diff-xx
と指定することで有効になる +-
を文頭に付けることで差分行と判定
実装方法
まずSyntaxHighlighter
をラップしただけのコンポーネントを作成。
- 受け取ったコードを行ごとに分割し、文頭が
+-
であればその行数を記録- 自分の場合
+-
はCSSの擬似要素として表示したかったので、文字列からは除外している
- 自分の場合
lineProps
propsにて、差分行に専用のCSSクラスを付与lineNumber
を数値として受け取るにはshowLineNumbers
をtrue
にしないといけないらしい(指定しないと真偽値が返ってしまう)
あとは上記のように各propsを渡しつつコンポーネントを呼び出すだけ。
これで上記のように、差分行がハイライトされて表示されるようになった。