在 Markdown 中,我们希望能够渲染一个特定的字符(如汉字),并且它会被一个圆圈包围。为了满足这一需求,我们需要做的工作是:

使用正则表达式匹配 Markdown 中的特定符号(如:o汉字o)。
将匹配到的字符替换为 HTML 元素(如:<span class="char-circle">汉字</span>)。
使用 CSS 为这个 HTML 元素添加样式,使得字符被圆圈包围。
对于这个需求,我们只需要扩展一下markdown语法即可,我们先来看看需求的实现。

实现思路
扩展 Markdown 配置:\
我们可以通过修改 vitepress 的 Markdown 配置来实现这一功能。在 vitepress 中,我们可以使用 config 函数来扩展 Markdown 渲染规则,修改默认的文本渲染方式。
CSS 样式:\
通过为匹配到的字符添加一个 span 标签,并为这个标签设置圆形边框和其他样式,实现字符的圆圈效果。
使用正则表达式:\
我们通过正则表达式来匹配包裹在 o 字符中的汉字,并将其转换为带有样式的 HTML 标签。
具体实现
如何扩展markdown配置
查阅官方文档,我们发现对于扩展markdown的描述很简单,只是提供了一个markdown属性,而我们就需要根据这个属性来做文章。

根据ts定义文件,这个属性提供了很多配置属性,接口定义如下:

interface Options$2 {

html?: boolean | undefined;
xhtmlOut?: boolean | undefined;
breaks?: boolean | undefined;
langPrefix?: string | undefined;
linkify?: boolean | undefined;
typographer?: boolean | undefined;
quotes?: string | string[];
highlight?: ((str: string, lang: string, attrs: string) => string) | null | undefined;

}
interface MarkdownOptions extends Options$2 {

preConfig?: (md: MarkdownIt) => void;
config?: (md: MarkdownIt) => void;
cache?: boolean;
externalLinks?: Record<string, string>;
theme?: ThemeOptions;
languages?: LanguageInput[];
languageAlias?: Record<string, string>;
lineNumbers?: boolean;
defaultHighlightLang?: string;
codeTransformers?: ShikiTransformer[];
shikiSetup?: (shiki: Highlighter) => void | Promise<void>;
codeCopyButtonTitle?: string;
anchor?: anchor.AnchorOptions;
attrs?: {
    leftDelimiter?: string;
    rightDelimiter?: string;
    allowedAttributes?: Array<string | RegExp>;
    disable?: boolean;
};
emoji?: {
    defs?: Record<string, string>;
    enabled?: string[];
    shortcuts?: Record<string, string | string[]>;
};
frontmatter?: FrontmatterPluginOptions;
headers?: HeadersPluginOptions | boolean;
sfc?: SfcPluginOptions;
toc?: TocPluginOptions;
component?: ComponentPluginOptions;
container?: ContainerOptions;
math?: boolean | any;
image?: Options$1;
gfmAlerts?: boolean;

}
如果将每一个属性都解释一下,那就可以另外写一篇文章了,所以这里暂时打住,这里我们需要用到的是config属性,它是一个函数,函数的第一个参数是一个md实例。由于vitepress底层采用的是markdown-it插件,因此想要了解md实例的具体属性,也需要我们去查看这个插件的文档了解api属性,这同样不在本文的范畴,因此这里只是固定告诉大家,我们需要用到md.renderer.rules.text属性,该属性接受一个返回格式化后的文本字符串。

相信读者能够猜到怎么回事了,对,没错,我将使用正则表达式来匹配这个字


用户bPdi9Qy
1 声望0 粉丝