基本設定 #
時隔多年,原先使用的 Prism.js
已經沒有再更新了
,最近把它更換成 highlight.js
。
首先把 hugo header 中有用到 Prism.js 的地方通通移除,感謝它這幾年的付出。
接著我把 highlight.js
設定寫在一個 partials/highlightjs.html
{{ $version := "11.9.0" }}
{{ $base_url := printf "https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@%s/build" $version }}
{{ $langs := slice "bash" "css" "elixir" "excel" "ini" "javascript" "markdown" "php" "python" "shell" "plaintext" "http" "json" }}
<link rel="stylesheet" href="{{ $base_url }}/styles/default.min.css">
<script defer src="{{ $base_url }}/highlight.min.js"></script>
{{ range $langs }}
<script defer src="{{ $base_url }}/languages/{{ . }}.min.js"></script>
{{ end }}
<script defer>
document.addEventListener('DOMContentLoaded', (event) => {
document.querySelectorAll('pre code').forEach((el) => {
hljs.highlightElement(el);
});
});
</script>
由於 highlight.js 並沒有 auto loader,所以必須把需要的語法通通加載上去。
我這裡是搭配 ripgrep 把有用到的語言都放進去
rg '```\w+' -oNI | sort -u | rg '\w+' -o
全部支援的語言列表可以前往 官方網站
查詢,或者是到他們 存放庫
裡面的 build/languages
。
最後在自訂 header 裡面只需要
{{ partial "highlightjs" . }}
更換顏色 #
highlight.js 可以 線上瀏覽 可用的語法色彩。
要更換就是把前面的 default.min.css
其中的 default
替換成想要的樣式名稱,例如我現在使用的 base16-gruvbox-dark-hard
- <link rel="stylesheet" href="{{ $base_url }}/styles/default.min.css">
+ <link rel="stylesheet" href="{{ $base_url }}/styles/base16/gruvbox-dark-hard.min.css">
另外注意,如果有用 base16-
開頭,它是放在 base16
資料夾底下。
詳細的資訊可以前往 存放庫
底下的 build/styles
程式碼複製功能 #
highlight.js 有支援擴充套件,所以可以自行撰寫套件或用別人的。
我這裡另外有用到 highlightjs-copy ,在程式碼區塊會浮現一個複製按鈕,就是它立大功。
一樣用 CDN 安裝,把上面的程式碼新增兩行:
<link
rel="stylesheet"
href="https://unpkg.com/highlightjs-copy/dist/highlightjs-copy.min.css"
/>
<script defer src="https://unpkg.com/highlightjs-copy/dist/highlightjs-copy.min.js" onload="hljs.addPlugin(new CopyButtonPlugin());"></script>
最後就變成:
{{ $version := "11.9.0" }}
{{ $base_url := printf "https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@%s/build" $version }}
{{ $langs := slice "bash" "css" "elixir" "excel" "ini" "javascript" "markdown" "php" "python" "shell" "plaintext" "http" "json" }}
<link rel="stylesheet" href="{{ $base_url }}/styles/default.min.css">
+ <link rel="stylesheet" href="https://unpkg.com/highlightjs-copy/dist/highlightjs-copy.min.css" />
<script defer src="{{ $base_url }}/highlight.min.js"></script>
+ <script defer src="https://unpkg.com/highlightjs-copy/dist/highlightjs-copy.min.js" onload="hljs.addPlugin(new CopyButtonPlugin());"></script>
{{ range $langs }}
<script defer src="{{ $base_url }}/languages/{{ . }}.min.js"></script>
{{ end }}
<script defer>
document.addEventListener('DOMContentLoaded', (event) => {
document.querySelectorAll('pre code').forEach((el) => {
hljs.highlightElement(el);
});
});
</script>