Skip to content

Commit

Permalink
feat: expose shikijiSetup hook (#3344)
Browse files Browse the repository at this point in the history
  • Loading branch information
antfu committed Dec 16, 2023
1 parent 00eec7a commit d12e23d
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 20 deletions.
18 changes: 7 additions & 11 deletions src/node/markdown/markdown.ts
Expand Up @@ -31,7 +31,8 @@ import type {
ThemeRegistration,
BuiltinTheme,
LanguageInput,
ShikijiTransformer
ShikijiTransformer,
Highlighter
} from 'shikiji'

export type { Header } from '../shared'
Expand Down Expand Up @@ -103,6 +104,10 @@ export interface MarkdownOptions extends MarkdownIt.Options {
* @see https://github.com/antfu/shikiji#hast-transformers
*/
codeTransformers?: ShikijiTransformer[]
/**
* Setup Shikiji instance
*/
shikijiSetup?: (shikiji: Highlighter) => void | Promise<void>

/* ==================== Markdown It Plugins ==================== */

Expand Down Expand Up @@ -176,16 +181,7 @@ export const createMarkdownRenderer = async (
const md = MarkdownIt({
html: true,
linkify: true,
highlight:
options.highlight ||
(await highlight(
theme,
options.languages,
options.defaultHighlightLang,
logger,
options.codeTransformers,
options.languageAlias
)),
highlight: options.highlight || (await highlight(theme, options, logger)),
...options
})

Expand Down
22 changes: 13 additions & 9 deletions src/node/markdown/plugins/highlight.ts
@@ -1,6 +1,6 @@
import { customAlphabet } from 'nanoid'
import c from 'picocolors'
import type { LanguageInput, ShikijiTransformer } from 'shikiji'
import type { ShikijiTransformer } from 'shikiji'
import {
bundledLanguages,
getHighlighter,
Expand All @@ -9,7 +9,7 @@ import {
isSpecialLang
} from 'shikiji'
import type { Logger } from 'vite'
import type { ThemeOptions } from '../markdown'
import type { MarkdownOptions, ThemeOptions } from '../markdown'
import {
transformerCompactLineOptions,
transformerNotationDiff,
Expand Down Expand Up @@ -55,21 +55,25 @@ const attrsToLines = (attrs: string): TransformerCompactLineOption[] => {

export async function highlight(
theme: ThemeOptions,
languages: LanguageInput[] = [],
defaultLang: string = '',
logger: Pick<Logger, 'warn'> = console,
userTransformers: ShikijiTransformer[] = [],
languageAlias: Record<string, string> = {}
options: MarkdownOptions,
logger: Pick<Logger, 'warn'> = console
): Promise<(str: string, lang: string, attrs: string) => string> {
const {
defaultHighlightLang: defaultLang = '',
codeTransformers: userTransformers = []
} = options

const highlighter = await getHighlighter({
themes:
typeof theme === 'string' || 'name' in theme
? [theme]
: [theme.light, theme.dark],
langs: [...Object.keys(bundledLanguages), ...languages],
langAlias: languageAlias
langs: [...Object.keys(bundledLanguages), ...(options.languages || [])],
langAlias: options.languageAlias
})

await options?.shikijiSetup?.(highlighter)

const transformers: ShikijiTransformer[] = [
transformerNotationDiff(),
transformerNotationFocus({
Expand Down

0 comments on commit d12e23d

Please sign in to comment.