浏览代码

Feat: add toc to api doc (#5552)

### What problem does this PR solve?

the api doc is too long,  add a toc might be better

![CleanShot 2025-03-03 at 16 53
17](https://github.com/user-attachments/assets/9dfbc682-fdbf-4b37-8a01-87049db51f86)


### Type of change

- [ ] Bug Fix (non-breaking change which fixes an issue)
- [x] New Feature (non-breaking change which adds functionality)
- [ ] Documentation Update
- [ ] Refactoring
- [ ] Performance Improvement
- [ ] Other (please describe):
tags/v0.17.1
非法操作 8 个月前
父节点
当前提交
abac2ca2c5
没有帐户链接到提交者的电子邮件

+ 4
- 0
web/src/components/api-service/chat-overview-modal/api-content.tsx 查看文件

import ChatApiKeyModal from '../chat-api-key-modal'; import ChatApiKeyModal from '../chat-api-key-modal';
import { usePreviewChat } from '../hooks'; import { usePreviewChat } from '../hooks';
import BackendServiceApi from './backend-service-api'; import BackendServiceApi from './backend-service-api';
import MarkdownToc from './markdown-toc';


const ApiContent = ({ const ApiContent = ({
id, id,
</Flex> </Flex>
</Card> </Card>
)} )}
<div style={{ position: 'relative' }}>
<MarkdownToc content={apiDoc} />
</div>
<MarkdownPreview source={apiDoc}></MarkdownPreview> <MarkdownPreview source={apiDoc}></MarkdownPreview>
</Flex> </Flex>
{apiKeyVisible && ( {apiKeyVisible && (

+ 74
- 0
web/src/components/api-service/chat-overview-modal/markdown-toc.tsx 查看文件

import { Anchor } from 'antd';
import type { AnchorLinkItemProps } from 'antd/es/anchor/Anchor';
import React, { useEffect, useState } from 'react';

interface MarkdownTocProps {
content: string;
}

const MarkdownToc: React.FC<MarkdownTocProps> = ({ content }) => {
const [items, setItems] = useState<AnchorLinkItemProps[]>([]);

useEffect(() => {
const generateTocItems = () => {
const headings = document.querySelectorAll(
'.wmde-markdown h2, .wmde-markdown h3',
);
const tocItems: AnchorLinkItemProps[] = [];
let currentH2Item: AnchorLinkItemProps | null = null;

headings.forEach((heading) => {
const title = heading.textContent || '';
const id = heading.id;
const isH2 = heading.tagName.toLowerCase() === 'h2';

if (id && title) {
const item: AnchorLinkItemProps = {
key: id,
href: `#${id}`,
title,
};

if (isH2) {
currentH2Item = item;
tocItems.push(item);
} else {
if (currentH2Item) {
if (!currentH2Item.children) {
currentH2Item.children = [];
}
currentH2Item.children.push(item);
} else {
tocItems.push(item);
}
}
}
});

setItems(tocItems.slice(1));
};

setTimeout(generateTocItems, 100);
}, [content]);

return (
<div
className="markdown-toc"
style={{
position: 'fixed',
right: 20,
top: 100,
width: 200,
background: '#fff',
padding: '10px',
maxHeight: 'calc(100vh - 170px)',
overflowY: 'auto',
zIndex: 1000,
}}
>
<Anchor items={items} affix={false} />
</div>
);
};

export default MarkdownToc;

正在加载...
取消
保存