import { htmlEscape } from '@vitebook/core/node'; import type { MarkdownHeader } from '../../../../shared'; import type { TocPluginOptions } from './tocPlugin'; type RenderHeadersFn = (headers: MarkdownHeader[]) => string; export const createRenderHeaders = ({ listTag, listClass, itemClass, linkTag, linkClass, }: Pick< Required, 'listTag' | 'listClass' | 'itemClass' | 'linkTag' | 'linkClass' >): RenderHeadersFn => { const listTagString = htmlEscape(listTag); const listClassString = listClass ? ` class="${htmlEscape(listClass)}"` : ''; const itemTagString = 'li'; const itemClassString = itemClass ? ` class="${htmlEscape(itemClass)}"` : ''; const linkTagString = htmlEscape(linkTag); const linkClassString = linkClass ? ` class="${htmlEscape(linkClass)}` : ''; const linkTo = (slug: string): string => linkTag === 'RouterLink' ? ` to="#${slug}" replace` : ` href="#${slug}"`; const renderHeaders: RenderHeadersFn = (headers) => `\ <${listTagString}${listClassString}>\ ${headers .map( (header) => `\ <${itemTagString}${itemClassString}${itemClassString}>\ <${linkTagString}${linkClassString}${linkTo(header.slug)}>\ ${header.title}\ \ ${header.children.length > 0 ? renderHeaders(header.children) : ''}\ \ `, ) .join('')}\ `; return renderHeaders; };