highlight.js 対応しました
- カテゴリ:
- ブログ
- JavaScript
- コメント数:
- Comments: 0
◆ これで地道にコメント部分の色を変える手間がなくなる
◆ highlightjs の highlightBlock を使うとコードブロック内のタグを保持してハイライトしてくれる
◆ highlightjs の highlightBlock を使うとコードブロック内のタグを保持してハイライトしてくれる
記事内のコードがハイライトされます
Short の方では前から対応していたのですが こっちは昔からあるコードの関係で対応してませんでした過去記事のコードだとハイライトされることを考慮してないので見た目が崩れるかもしれないですし かといって 新しいコードだけ対応するのも統一性がなくなります
そう思って対応しないでいたのですが 新規コードのみハイライト対応することにしました
統一性を気にしても 文体やカラー・フォントウェイトの使い方などを考えると すでに統一性はそんなにないですし いまさら気にしなくて仕方ないですしね
パーサは highlightjs のもので カラーテーマは独自のものです
中身は適当に自分が使ってるエディタや IDE のカラーを混ぜた感じです
8 ~ 9 割は VSCode です
highlightjs がコード中のタグに対応してた
実はもうひとつ対応しない理由がありましたコード中に span タグなどを使って 強調表示などをしている記事もあります
今後もその機能は使いたいです
しかし ハイライト表示するとなると 内側の HTML は全部消えて強調表示との共存はできなくなる……と思っていました
highlightjs の highlightBlock を使えば 自動でハイライトコードと元の HTML をマージしてくれました
普段はハイライトさせたいコードを渡して ハイライトタグ付きの HTML を返してくれる highlight 関数しか使ってなかったので知りませんでした
すごく便利です
完全自動の initHighlightingOnLoad や initHighlighting も中では highlightBlock を使っているので コードブロック中に span などのタグがあっても大丈夫です
こんなことができます
function fn(){
for(const item of []){
item.map(e => [e["x"], e["y"]]).filter(e => e[1]).forEach(e => fn(e, 100))
}
}
ソースはこうなってます
<pre><code class="js">
function fn(){
for(const item of []){
<span style="background:linear-gradient(transparent 70%, #ffe5f8 75%);">item.map(e => [e["x"], e["y"]]).filter(e => e[1]).forEach(e => fn(e, 100))</span>
}
}
</code></pre>
注意するところは span の中にキーワードがあると span の内側に hljs-keyword クラスの span ができることです
そうなると .hljs-keyword のスタイルのほうが強くなるので 内側に hljs-*** クラスが来ることを想定した CSS を書くか 背景色をつけるなど上書きされないスタイルにするなど工夫が必要です
また 元の HTML の維持は 元の HTML とハイライト済み HTML をマージしているもので code タグの中に span がある状態でパースしているわけではないです
なので span の区切る位置によっては思い通りにならない場合があるかもしれません