Load Custom Languages
See All Builtin Languages first.
You can load custom languages by passing a TextMate grammar object into the langs array.
ts
import { getHighlighter } from 'shikiji'
const myLang = JSON.parse(fs.readFileSync('my-lang.json', 'utf8'))
const highlighter = await getHighlighter({
langs: [myLang]
})
const html = highlighter.codeToHtml(code, {
lang: 'my-lang',
})You can also load languages after the highlighter has been created.
ts
import { getHighlighter } from 'shikiji'
const myLang = JSON.parse(fs.readFileSync('my-lang.json', 'utf8'))
const highlighter = await getHighlighter()
await highlighter.loadLanguage(myLang) // <--
const html = highlighter.codeToHtml(code, {
lang: 'my-lang',
})Migrate from Shiki
Since shikiji is environment agnostic, we don't have access to the file system. That means the path property shiki supports is not available in shikiji, and you must to read the files yourself and pass in the object.
For example, the following would not work:
ts
const highlighter = await getHighlighter({
langs: [
{
name: 'vue-vine',
scopeName: 'source.vue-vine',
// ‼️ This would not work!
path: join(__dirname, './vine-ts.tmLanguage.json'),
embeddedLangs: [
'vue-html',
'css',
'scss',
'sass',
'less',
'stylus',
],
},
]
})Instead, load that file yourself (via fs, import(), fetch(), etc.):
ts
const vineGrammar = JSON.parse(fs.readFileSync(join(__dirname, './vine-ts.tmLanguage.json'), 'utf8'))
const highlighter = await getHighlighter({
langs: [
{
name: 'vue-vine',
scopeName: 'source.vue-vine',
embeddedLangs: [
'vue-html',
'css',
'scss',
'sass',
'less',
'stylus',
],
...vineGrammar
},
]
})