Hexoには、highlight.jsとprismjsの2つのシンタックスハイライトライブラリが組み込まれています。このチュートリアルでは、Hexoの組み込みシンタックスハイライトをテンプレートに統合する方法を紹介します。
記事でのコードブロックの使用
Hexoは、コードブロックを書く2つの方法をサポートしています。タグプラグイン - コードブロックとタグプラグイン - バックティックコードブロックです:
{% codeblock [title] [lang:language] [url] [link text] [additional options] %} |
3番目の構文はMarkdownの囲みコードブロックの構文で、Hexoはそれを拡張してより多くの機能をサポートしています。利用可能なオプションを見つけるには、タグプラグインドキュメントをチェックしてください。
ヒント: Hexoは、対応するレンダラープラグインがインストールされていれば、どの形式で書かれた記事もサポートしています。それがmarkdown、ejs、swig、nunjucks、pug、asciidocなどであってもです。使用された形式に関係なく、これらの3つのコードブロック構文は常に利用可能です。
設定
v7.0.0より前:
# _config.yml |
v7.0.0以降:
# _config.yml |
上記のYAMLはHexoのデフォルト設定です。
無効化
v7.0.0より前:
# _config.yml |
v7.0.0以降:
# _config.yml |
highlight.enable
とprismjs.enable
がfalse
(v7.0.0より前)か、syntax_highlighter
が空(v7.0.0以降)の場合、コードブロックの出力HTMLは対応するレンダラーによって制御されます。例えば、marked.js
(Hexoのデフォルトのmarkdownレンダラーであるhexo-renderer-marked
に使用されています)は、<code>
のclass
に言語コードを追加します:
```yaml |
<pre> |
組み込みのシンタックスハイライトが有効になっていない場合は、サードパーティのシンタックスハイライトプラグインをインストールするか、ブラウザサイドのシンタックスハイライター(例: highlight.js
やprism.js
はブラウザで実行することをサポートしています)を使用できます。
Highlight.js
v7.0.0より前:
# _config.yml |
v7.0.0以降:
# _config.yml |
highlight.js
はデフォルトで有効になっており、Hexoでサーバーサイドのハイライトとして処理されます。ブラウザサイドでhighlight.js
を実行する場合、これを無効にする必要があります。
サーバーサイドとは、シンタックスハイライトが
hexo generate
またはhexo server
の間に生成されることを意味します。
auto_detect
auto_detect
は、コードブロックの言語を自動的に検出するhighlight.js
の機能です。
ヒント: “sublanguage highlight” を使用したい場合、
auto_detect
を有効にし、コードブロックで言語を無指定にします。
警告!
auto_detect
は非常に多くのリソースを消費します。”sublanguage highlight”が必要でコードブロックに言語を指定しない場合以外、有効にしないでください。
line_number
highlight.js
は行番号をサポートしていません。
Hexoは、出力を<figure>
と<table>
でラップし行番号を追加します:
<figure class="highlight yaml"> |
これはhighlight.js
の動作ではないため、<figure>
と<table>
要素のためのカスタムCSSが必要です。一部のテーマには組み込みのサポートがあります。
また、すべてのclass
にhljs-
の接頭辞がないことに気づくかもしれません。後の部分で後述します。
line_threshold (+6.1.0)
コードブロックの行数がこの閾値を超えた場合のみ、行番号を表示します。デフォルトは0
です。
tab_replace
コードブロック内のタブを指定した文字列で置き換えます。デフォルトは2スペースです。
exclude_languages (+6.1.0)
このオプションに一致する言語は、<pre><code class="lang"></code></pre>
でラップし、コンテンツのすべてのタグ(span
、br
)をレンダリングしません。
wrap
Hexoは、行番号をサポートするため出力を<figure>
と<table>
内に ラップ します。highlight.js
の元の振る舞いに戻すには、line_number
とwrap
の両方を無効にする必要があります:
<pre><code class="yaml"> |
警告!
line_number
機能はwrap
に依存しているため、line_number
が有効な場合はwrap
を無効にできません。line_number
をtrue
に設定すると、wrap
も自動的に有効になります。
hljs
hljs
がtrue
に設定されている場合、すべてのHTML出力にはhljs-
で接頭辞付きのclass
が付きます(wrap
が有効かは問いません):
<pre><code class="yaml hljs"> |
ヒント:
line_number
がfalse
、wrap
がfalse、hljs
がtrue
に設定されている場合のみ、highlight.js
のテーマを直接使用できます。
PrismJS
v7.0.0より前:
# _config.yml |
v7.0.0以降:
# _config.yml |
Prismjsはデフォルトで無効になっています。prismjsを有効にする前に、v7.0.0より前ではhighlight.enable
をfalse
に設定するか、v7.0.0以降ではsyntax_highlighter
をprismjs
に設定する必要があります。
preprocess
Hexoの組み込みprismjsは、ブラウザサイド(preprocess
をfalse
に設定)とサーバーサイド(preprocess
をtrue
に設定)の両方をサポートしています。
サーバーサイドモード(preprocess
をtrue
に設定)を使用する場合、ウェブサイトにはprismjsのテーマ(cssスタイルシート)のみロードします。ブラウザサイドを使用する場合(preprocess
をfalse
に設定)、javascriptライブラリもロードする必要があります。
Prismjsはブラウザで使用するように設計されているため、preprocess
モードでは限られたprismjsプラグインのみがサポートされます:
- Line Numbers:
prism-line-numbers.css
のみが必要です。prism-line-numbers.js
をロードする必要はありません。Hexoが必要なHTMLマークアップを生成します。 - Show Languages: コードブロックに言語が設定されている場合に限り、Hexoは
data-language
属性を追加します。 - 特別なHTMLマークアップを必要としない他のすべてのprismプラグインも同様にサポートされています。プラグインに応じたJavaScriptをロードしてください。
preprocess
がfalse
に設定されている場合、すべてのprismプラグインがサポートされます。その場合も、いくつか注意点があります:
- Line Numbers:
preprocess
がfalse
に設定されている場合、Hexoは必要なHTMLマークアップを生成しません。prism-line-numbers.css
とprism-line-numbers.js
の両方が必要です。 - Show Languages: コードブロックに言語が与えられている限り、Hexoは常に
data-language
属性を追加します。 - Line Highlight: Hexoのタグプラグイン - コードブロックとタグプラグイン - バックティックコードブロックは、行のハイライト構文(
mark
オプション)をサポートしています。mark
オプションが与えられた場合、Hexoは対応するHTMLマークアップを生成します。
line_number
preprocess
とline_number
の両方がtrue
の場合、行番号の表示にはprism-line-numbers.css
のみロードします。preprocess
とline_number
の両方をfalseに設定した場合、prism-line-numbers.css
とprism-line-numbers.js
の両方をロードする必要があります。
line_threshold (+6.1.0)
コードブロックの行数がこの閾値を超えた場合のみ、行番号を表示します。デフォルトは0
です。
tab_replace
コードブロック内の\t
を指定した文字列で置き換えます。デフォルトは2スペースです。
その他の有用な情報
Hexoのシンタックスハイライティングの背後にあるソースコードは、以下で利用可能です: