feat: expose `shikijiSetup` hook (#3344)

pull/3345/head
Anthony Fu 2 years ago committed by GitHub
parent 00eec7a4ef
commit d12e23ddf6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -31,7 +31,8 @@ import type {
ThemeRegistration, ThemeRegistration,
BuiltinTheme, BuiltinTheme,
LanguageInput, LanguageInput,
ShikijiTransformer ShikijiTransformer,
Highlighter
} from 'shikiji' } from 'shikiji'
export type { Header } from '../shared' export type { Header } from '../shared'
@ -103,6 +104,10 @@ export interface MarkdownOptions extends MarkdownIt.Options {
* @see https://github.com/antfu/shikiji#hast-transformers * @see https://github.com/antfu/shikiji#hast-transformers
*/ */
codeTransformers?: ShikijiTransformer[] codeTransformers?: ShikijiTransformer[]
/**
* Setup Shikiji instance
*/
shikijiSetup?: (shikiji: Highlighter) => void | Promise<void>
/* ==================== Markdown It Plugins ==================== */ /* ==================== Markdown It Plugins ==================== */
@ -176,16 +181,7 @@ export const createMarkdownRenderer = async (
const md = MarkdownIt({ const md = MarkdownIt({
html: true, html: true,
linkify: true, linkify: true,
highlight: highlight: options.highlight || (await highlight(theme, options, logger)),
options.highlight ||
(await highlight(
theme,
options.languages,
options.defaultHighlightLang,
logger,
options.codeTransformers,
options.languageAlias
)),
...options ...options
}) })

@ -1,6 +1,6 @@
import { customAlphabet } from 'nanoid' import { customAlphabet } from 'nanoid'
import c from 'picocolors' import c from 'picocolors'
import type { LanguageInput, ShikijiTransformer } from 'shikiji' import type { ShikijiTransformer } from 'shikiji'
import { import {
bundledLanguages, bundledLanguages,
getHighlighter, getHighlighter,
@ -9,7 +9,7 @@ import {
isSpecialLang isSpecialLang
} from 'shikiji' } from 'shikiji'
import type { Logger } from 'vite' import type { Logger } from 'vite'
import type { ThemeOptions } from '../markdown' import type { MarkdownOptions, ThemeOptions } from '../markdown'
import { import {
transformerCompactLineOptions, transformerCompactLineOptions,
transformerNotationDiff, transformerNotationDiff,
@ -55,21 +55,25 @@ const attrsToLines = (attrs: string): TransformerCompactLineOption[] => {
export async function highlight( export async function highlight(
theme: ThemeOptions, theme: ThemeOptions,
languages: LanguageInput[] = [], options: MarkdownOptions,
defaultLang: string = '', logger: Pick<Logger, 'warn'> = console
logger: Pick<Logger, 'warn'> = console,
userTransformers: ShikijiTransformer[] = [],
languageAlias: Record<string, string> = {}
): Promise<(str: string, lang: string, attrs: string) => string> { ): Promise<(str: string, lang: string, attrs: string) => string> {
const {
defaultHighlightLang: defaultLang = '',
codeTransformers: userTransformers = []
} = options
const highlighter = await getHighlighter({ const highlighter = await getHighlighter({
themes: themes:
typeof theme === 'string' || 'name' in theme typeof theme === 'string' || 'name' in theme
? [theme] ? [theme]
: [theme.light, theme.dark], : [theme.light, theme.dark],
langs: [...Object.keys(bundledLanguages), ...languages], langs: [...Object.keys(bundledLanguages), ...(options.languages || [])],
langAlias: languageAlias langAlias: options.languageAlias
}) })
await options?.shikijiSetup?.(highlighter)
const transformers: ShikijiTransformer[] = [ const transformers: ShikijiTransformer[] = [
transformerNotationDiff(), transformerNotationDiff(),
transformerNotationFocus({ transformerNotationFocus({

Loading…
Cancel
Save