Skip to content

Commit dbf42f8

Browse files
feat: support KaTex in notes (#2024)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
1 parent 0c25256 commit dbf42f8

File tree

4 files changed

+34
-24
lines changed

4 files changed

+34
-24
lines changed

packages/slidev/node/options.ts

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { getThemeMeta, resolveTheme } from './integrations/themes'
99
import { parser } from './parser'
1010
import { getRoots, resolveEntry, toAtFS } from './resolver'
1111
import setupIndexHtml from './setups/indexHtml'
12+
import setupKatex from './setups/katex'
1213
import setupShiki from './setups/shiki'
1314

1415
const debug = Debug('slidev:options')
@@ -82,6 +83,7 @@ export async function createDataUtils(resolved: Omit<ResolvedSlidevOptions, 'uti
8283

8384
return {
8485
...await setupShiki(resolved.roots),
86+
katexOptions: await setupKatex(resolved.roots),
8587
indexHtml: setupIndexHtml(resolved),
8688
define: getDefine(resolved),
8789
iconsResolvePath: [resolved.clientRoot, ...resolved.roots].reverse(),

packages/slidev/node/syntax/markdown-it/index.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,14 @@ import { taskLists as MarkdownItTaskList } from '@hedgedoc/markdown-it-plugins'
55
// @ts-expect-error missing types
66
import MarkdownItFootnote from 'markdown-it-footnote'
77
import MarkdownItMdc from 'markdown-it-mdc'
8-
import setupKatex from '../../setups/katex'
98
import MarkdownItEscapeInlineCode from './markdown-it-escape-code'
109
import MarkdownItKatex from './markdown-it-katex'
1110
import MarkdownItLink from './markdown-it-link'
1211
import MarkdownItShiki from './markdown-it-shiki'
1312
import MarkdownItVDrag from './markdown-it-v-drag'
1413

1514
export async function useMarkdownItPlugins(md: MarkdownIt, options: ResolvedSlidevOptions, markdownTransformMap: Map<string, MagicString>) {
16-
const { roots, data: { features, config } } = options
15+
const { data: { features, config }, utils: { katexOptions } } = options
1716

1817
if (config.highlighter === 'shiki') {
1918
md.use(await MarkdownItShiki(options))
@@ -24,7 +23,7 @@ export async function useMarkdownItPlugins(md: MarkdownIt, options: ResolvedSlid
2423
md.use(MarkdownItFootnote)
2524
md.use(MarkdownItTaskList, { enabled: true, lineNumber: true, label: true })
2625
if (features.katex)
27-
md.use(MarkdownItKatex, await setupKatex(roots))
26+
md.use(MarkdownItKatex, katexOptions)
2827
md.use(MarkdownItVDrag, markdownTransformMap)
2928
if (config.mdc)
3029
md.use(MarkdownItMdc)

packages/slidev/node/vite/loaders.ts

+28-21
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ import type { Plugin, ViteDevServer } from 'vite'
44
import { notNullish, range } from '@antfu/utils'
55
import * as parser from '@slidev/parser/fs'
66
import equal from 'fast-deep-equal'
7+
import MarkdownIt from 'markdown-it'
78
import YAML from 'yaml'
8-
import { sharedMd } from '../commands/shared'
99
import { createDataUtils } from '../options'
10+
import MarkdownItKatex from '../syntax/markdown-it/markdown-it-katex'
11+
import markdownItLink from '../syntax/markdown-it/markdown-it-link'
1012
import { getBodyJson, updateFrontmatterPatch } from '../utils'
1113
import { templates } from '../virtual'
1214
import { templateConfigs } from '../virtual/configs'
@@ -16,32 +18,17 @@ import { templateSlides, VIRTUAL_SLIDE_PREFIX } from '../virtual/slides'
1618
import { templateTitleRendererMd } from '../virtual/titles'
1719
import { regexSlideFacadeId, regexSlideReqPath, regexSlideSourceId } from './common'
1820

19-
function renderNote(text: string = '') {
20-
let clickCount = 0
21-
const html = sharedMd.render(text
22-
// replace [click] marker with span
23-
.replace(/\[click(?::(\d+))?\]/gi, (_, count = 1) => {
24-
clickCount += Number(count)
25-
return `<span class="slidev-note-click-mark" data-clicks="${clickCount}"></span>`
26-
}),
27-
)
28-
29-
return html
30-
}
31-
32-
function withRenderedNote(data: SlideInfo): SlideInfo {
33-
return {
34-
...data,
35-
noteHTML: renderNote(data?.note),
36-
}
37-
}
38-
3921
export function createSlidesLoader(
4022
options: ResolvedSlidevOptions,
4123
serverOptions: SlidevServerOptions,
4224
): Plugin {
4325
const { data, mode, utils } = options
4426

27+
const notesMd = MarkdownIt({ html: true })
28+
notesMd.use(markdownItLink)
29+
if (data.features.katex)
30+
notesMd.use(MarkdownItKatex, utils.katexOptions)
31+
4532
const hmrSlidesIndexes = new Set<number>()
4633
let server: ViteDevServer | undefined
4734
let skipHmr: { filePath: string, fileContent: string } | null = null
@@ -374,4 +361,24 @@ export function createSlidesLoader(
374361
return ''
375362
},
376363
}
364+
365+
function renderNote(text: string = '') {
366+
let clickCount = 0
367+
const html = notesMd.render(text
368+
// replace [click] marker with span
369+
.replace(/\[click(?::(\d+))?\]/gi, (_, count = 1) => {
370+
clickCount += Number(count)
371+
return `<span class="slidev-note-click-mark" data-clicks="${clickCount}"></span>`
372+
}),
373+
)
374+
375+
return html
376+
}
377+
378+
function withRenderedNote(data: SlideInfo): SlideInfo {
379+
return {
380+
...data,
381+
noteHTML: renderNote(data?.note),
382+
}
383+
}
377384
}

packages/types/src/options.ts

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { MarkdownItShikiOptions } from '@shikijs/markdown-it/index.mjs'
2+
import type { KatexOptions } from 'katex'
23
import type { HighlighterGeneric } from 'shiki/types.mjs'
34
import type { SlidevData } from './types'
45

@@ -58,6 +59,7 @@ export interface ResolvedSlidevOptions extends RootsInfo, SlidevEntryOptions {
5859
export interface ResolvedSlidevUtils {
5960
shiki: HighlighterGeneric<any, any>
6061
shikiOptions: MarkdownItShikiOptions
62+
katexOptions: KatexOptions | null
6163
indexHtml: string
6264
define: Record<string, string>
6365
iconsResolvePath: string[]

0 commit comments

Comments
 (0)