file

過去很長一段時間裡面,要講到在網頁上面標亮程式碼語法,一般無非就是 highlight.jsprism.js 兩大選項,但是到了最近我才知道還有一個比較新(雖說如此,其實也已經有幾年了)且更先進的 shiki 存在。跟前兩者是利用較簡單的正規表達式來分析程式碼不同地,shiki 的核心用的是跟 VS Code 一樣的 TextMate 文法系統,然後再用編譯成 WebAssembly 的 Oniguruma 程式庫來進行處理,從而可以達到跟 VS Code 完全一樣的語法理解與標亮效果。不難猜到,VS Code 和 TypeScript 的網站本身用的標亮系統就是 shiki。

上面這張圖片中可以看到 highlight.js(左)跟 shiki(右)的標亮效果對照,可以看得出來 shiki 能夠把 token 分類得更仔細、並加上更多的顏色。因為效果真的很有差,我就決定把網站的標亮系統整個換成 shiki 了。底下是我大致的作法:

<script src="https://unpkg.com/shiki@0.14.5/dist/index.unpkg.iife.js"></script>
<script>
    const langs = ["js", "ts", "cs", "html"]; // 固定載入的常用語言清單
    shiki
        .getHighlighter({ theme: "dark-plus", langs })
        .then(highlighter =>
            jQuery("pre code").each(async (_, n) => {
                // 抓出區塊的語言
                const lang = [...n.classList]
                    .find(c => c.match(/^language-/))?.substring(9);
                // 如果遇到常用語言之外的語言,就額外載入
                if(lang && !langs.includes(lang)) {
                    await highlighter.loadLanguage(lang);
                }
                // 進行轉換
                const code = highlighter.codeToHtml(n.innerText, { lang });
                n.parentNode.outerHTML = code;
            })
        )
</script>

對於有在發表程式相關文章的朋友來說,shiki 真的是非常值得推薦喔!


分享此頁至:
最後修改日期: 2023/11/08

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。您的留言可能會在審核之後才出現在頁面上。