From 9f57832e6ef975352c520a2e3f1ab4c97af89539 Mon Sep 17 00:00:00 2001 From: _Kerman Date: Tue, 28 Jan 2025 16:05:14 +0800 Subject: [PATCH 1/2] feat: support KaTex in notes --- packages/slidev/node/options.ts | 2 + .../slidev/node/syntax/markdown-it/index.ts | 5 +- packages/slidev/node/vite/loaders.ts | 49 +++++++++++-------- packages/types/src/options.ts | 2 + 4 files changed, 34 insertions(+), 24 deletions(-) diff --git a/packages/slidev/node/options.ts b/packages/slidev/node/options.ts index e17d469604..d7fce6267f 100644 --- a/packages/slidev/node/options.ts +++ b/packages/slidev/node/options.ts @@ -9,6 +9,7 @@ import { getThemeMeta, resolveTheme } from './integrations/themes' import { parser } from './parser' import { getRoots, resolveEntry, toAtFS } from './resolver' import setupIndexHtml from './setups/indexHtml' +import setupKatex from './setups/katex' import setupShiki from './setups/shiki' const debug = Debug('slidev:options') @@ -82,6 +83,7 @@ export async function createDataUtils(resolved: Omit) { - const { roots, data: { features, config } } = options + const { data: { features, config }, utils: { katexOptions } } = options if (config.highlighter === 'shiki') { md.use(await MarkdownItShiki(options)) @@ -24,7 +23,7 @@ export async function useMarkdownItPlugins(md: MarkdownIt, options: ResolvedSlid md.use(MarkdownItFootnote) md.use(MarkdownItTaskList, { enabled: true, lineNumber: true, label: true }) if (features.katex) - md.use(MarkdownItKatex, await setupKatex(roots)) + md.use(MarkdownItKatex, katexOptions) md.use(MarkdownItVDrag, markdownTransformMap) if (config.mdc) md.use(MarkdownItMdc) diff --git a/packages/slidev/node/vite/loaders.ts b/packages/slidev/node/vite/loaders.ts index 91710c17a5..8fd890eef0 100644 --- a/packages/slidev/node/vite/loaders.ts +++ b/packages/slidev/node/vite/loaders.ts @@ -4,9 +4,11 @@ import type { Plugin, ViteDevServer } from 'vite' import { notNullish, range } from '@antfu/utils' import * as parser from '@slidev/parser/fs' import equal from 'fast-deep-equal' +import MarkdownIt from 'markdown-it' import YAML from 'yaml' -import { sharedMd } from '../commands/shared' import { createDataUtils } from '../options' +import MarkdownItKatex from '../syntax/markdown-it/markdown-it-katex' +import markdownItLink from '../syntax/markdown-it/markdown-it-link' import { getBodyJson, updateFrontmatterPatch } from '../utils' import { templates } from '../virtual' import { templateConfigs } from '../virtual/configs' @@ -16,32 +18,17 @@ import { templateSlides, VIRTUAL_SLIDE_PREFIX } from '../virtual/slides' import { templateTitleRendererMd } from '../virtual/titles' import { regexSlideFacadeId, regexSlideReqPath, regexSlideSourceId } from './common' -function renderNote(text: string = '') { - let clickCount = 0 - const html = sharedMd.render(text - // replace [click] marker with span - .replace(/\[click(?::(\d+))?\]/gi, (_, count = 1) => { - clickCount += Number(count) - return `` - }), - ) - - return html -} - -function withRenderedNote(data: SlideInfo): SlideInfo { - return { - ...data, - noteHTML: renderNote(data?.note), - } -} - export function createSlidesLoader( options: ResolvedSlidevOptions, serverOptions: SlidevServerOptions, ): Plugin { const { data, mode, utils } = options + const notesMd = MarkdownIt({ html: true }) + notesMd.use(markdownItLink) + if (data.features.katex) + notesMd.use(MarkdownItKatex, utils.katexOptions) + const hmrSlidesIndexes = new Set() let server: ViteDevServer | undefined let skipHmr: { filePath: string, fileContent: string } | null = null @@ -374,4 +361,24 @@ export function createSlidesLoader( return '' }, } + + function renderNote(text: string = '') { + let clickCount = 0 + const html = notesMd.render(text + // replace [click] marker with span + .replace(/\[click(?::(\d+))?\]/gi, (_, count = 1) => { + clickCount += Number(count) + return `` + }), + ) + + return html + } + + function withRenderedNote(data: SlideInfo): SlideInfo { + return { + ...data, + noteHTML: renderNote(data?.note), + } + } } diff --git a/packages/types/src/options.ts b/packages/types/src/options.ts index ec27d6cc40..55a5dc5ae6 100644 --- a/packages/types/src/options.ts +++ b/packages/types/src/options.ts @@ -1,4 +1,5 @@ import type { MarkdownItShikiOptions } from '@shikijs/markdown-it/index.mjs' +import type { KatexOptions } from 'katex' import type { HighlighterGeneric } from 'shiki/types.mjs' import type { SlidevData } from './types' @@ -53,6 +54,7 @@ export interface ResolvedSlidevOptions extends RootsInfo, SlidevEntryOptions { export interface ResolvedSlidevUtils { shiki: HighlighterGeneric shikiOptions: MarkdownItShikiOptions + katexOptions: KatexOptions | null indexHtml: string define: Record iconsResolvePath: string[] From 70976755e3f6f75c8354bd5267dd70ac318eb75e Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Tue, 28 Jan 2025 08:08:38 +0000 Subject: [PATCH 2/2] [autofix.ci] apply automated fixes --- packages/client/setup/code-runners.ts | 8 ++++---- packages/slidev/node/resolver.ts | 2 +- .../slidev/node/syntax/markdown-it/markdown-it-katex.ts | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/client/setup/code-runners.ts b/packages/client/setup/code-runners.ts index 519ec16ffa..063abb9721 100644 --- a/packages/client/setup/code-runners.ts +++ b/packages/client/setup/code-runners.ts @@ -131,10 +131,10 @@ function runJavaScript(code: string): CodeRunnerOutputs { // JSON.stringify omits any keys with a value of undefined. To get around this, we replace undefined with the text __undefined__ and then do a global replace using regex back to keyword undefined textRep = prefix - + JSON.stringify(arg, (_, value) => (value === undefined ? '__undefined__' : value), 2).replace( - /"__undefined__"/g, - 'undefined', - ) + + JSON.stringify(arg, (_, value) => (value === undefined ? '__undefined__' : value), 2).replace( + /"__undefined__"/g, + 'undefined', + ) textRep = String(textRep) } diff --git a/packages/slidev/node/resolver.ts b/packages/slidev/node/resolver.ts index 0ebbfa2113..d1d9a4a13f 100644 --- a/packages/slidev/node/resolver.ts +++ b/packages/slidev/node/resolver.ts @@ -231,7 +231,7 @@ export async function getRoots(entry?: string): Promise { const userRoot = dirname(entry) isInstalledGlobally.value = slash(relative(userRoot, process.argv[1])).includes('/.pnpm/') - || (await import('is-installed-globally')).default + || (await import('is-installed-globally')).default const clientRoot = await findPkgRoot('@slidev/client', cliRoot, true) const closestPkgRoot = dirname(await findClosestPkgJsonPath(userRoot) || userRoot) const userPkgJson = getUserPkgJson(closestPkgRoot) diff --git a/packages/slidev/node/syntax/markdown-it/markdown-it-katex.ts b/packages/slidev/node/syntax/markdown-it/markdown-it-katex.ts index 78f25db75a..6707846725 100644 --- a/packages/slidev/node/syntax/markdown-it/markdown-it-katex.ts +++ b/packages/slidev/node/syntax/markdown-it/markdown-it-katex.ts @@ -155,8 +155,8 @@ function math_block(state: any, start: number, end: number, silent: boolean) { const token = state.push('math_block', 'math', 0) token.block = true token.content = (firstLine && firstLine.trim() ? `${firstLine}\n` : '') - + state.getLines(start + 1, next, state.tShift[start], true) - + (lastLine && lastLine.trim() ? lastLine : '') + + state.getLines(start + 1, next, state.tShift[start], true) + + (lastLine && lastLine.trim() ? lastLine : '') token.map = [start, state.line] token.markup = '$$' return true