vue-markdown-shiki
Version:
A Vue 3 component library that provides integration with Shiki and Markdown-it.
78 lines (66 loc) • 1.85 kB
text/typescript
import type { BundledLanguage } from 'shiki'
import type { Processor, ProcessorContext, ProcessorResult } from './types'
/**
* Defines a processor.
*/
export function defineProcessor(processor: Processor): Processor {
return processor
}
/**
* Transforms code through the given processors.
*/
export function process<L = BundledLanguage>(processors: Processor<L>[], code: string, language: L, options: Record<string, any> = {}) {
const results: ProcessorResult[] = []
// 初始上下文
const context: ProcessorContext<L> = {
code,
language,
options
}
// 处理每个处理器
for (const processor of processors) {
if (processor.handler) {
const result = processor.handler(context)
if (result) {
if (Array.isArray(result)) {
results.push(...result)
} else {
results.push(result)
}
}
}
}
// 应用结果到代码
let finalCode = code
let lineOptions: any[] = []
for (const result of results) {
if (result.code !== undefined) {
finalCode = result.code
}
// 如果有适用于转换的处理器,处理lineOptions
if (result.options && result.options.transformLines) {
const lines = result.options.transformLines
lineOptions = [...lineOptions, ...lines]
}
}
return {
code: finalCode,
lineOptions
}
}
/**
* Transforms final code through the given processors.
*/
export function postProcess<L = BundledLanguage>(processors: Processor<L>[], code: string, language: L): string {
let result = code
// 后处理每个处理器
for (const processor of processors) {
if (processor.transformer) {
const transformed = processor.transformer(result, language, {})
if (transformed && transformed.code) {
result = transformed.code
}
}
}
return result
}