import { isFunction } from 'vuepress/shared';
import { resolveAttr } from '../utils/index.js';
/**
* Default title render function
*
* 默认标题渲染函数
*/
const defaultTitleRender = (title, code) => `\
`;
/**
* Add code block title functionality to markdown-it
*
* 为 markdown-it 添加代码块标题功能
*
* @param md - The markdown-it instance / markdown-it 实例
* @param options - Plugin options / 插件选项
*
* @example
* ```ts
* import { codeBlockTitle } from '@vuepress/highlighter-helper'
*
* md.use(codeBlockTitle, {
* codeBlockTitle: true
* })
* ```
*/
export const codeBlockTitle = (md, { codeBlockTitle: codeBlockTitleOptions = true, } = {}) => {
if (codeBlockTitleOptions === false)
return;
const titleRender = isFunction(codeBlockTitleOptions)
? codeBlockTitleOptions
: defaultTitleRender;
const rawFence = md.renderer.rules.fence;
md.renderer.rules.fence = (...args) => {
const [tokens, index] = args;
const token = tokens[index];
// get token info
const info = token.info ? md.utils.unescapeAll(token.info).trim() : '';
const rawCode = rawFence(...args);
const title = resolveAttr(info, 'title')?.trim();
if (!title)
return rawCode;
return titleRender(title, rawCode);
};
};