diff --git a/examples/website/src/components/Layouts/index/index.tsx b/examples/website/src/components/Layouts/index/index.tsx index a3e1917dd..90fb4e52b 100644 --- a/examples/website/src/components/Layouts/index/index.tsx +++ b/examples/website/src/components/Layouts/index/index.tsx @@ -6,7 +6,6 @@ import React, { useState, useEffect } from 'react' import { ConfigProvider, theme } from 'antd' import '@wcj/dark-mode'; import HomeFooter from './HomeFooter'; -import AnchorRight from '../Anchor'; export default function Layout(props: KktproPageProps) { const { pathname } = useLocation(); @@ -37,9 +36,6 @@ export default function Layout(props: KktproPageProps) {
-
- -
)} diff --git a/examples/website/src/components/Layouts/Anchor/hooks.js b/examples/website/src/components/Preview/Anchor/hooks.js similarity index 78% rename from examples/website/src/components/Layouts/Anchor/hooks.js rename to examples/website/src/components/Preview/Anchor/hooks.js index 75da23188..600582340 100644 --- a/examples/website/src/components/Layouts/Anchor/hooks.js +++ b/examples/website/src/components/Preview/Anchor/hooks.js @@ -7,8 +7,8 @@ export function useComponentMarkdown() { const componentName = pathname?.split('/').at(-1); if (componentName) { try { - const mdText = require(`../../../pages/${componentName}/README.md`) - ?.default?.source; + const mdText = require(`src/pages/${componentName}/README.md`)?.default + ?.source; return mdText; } catch {} } diff --git a/examples/website/src/components/Layouts/Anchor/index.jsx b/examples/website/src/components/Preview/Anchor/index.jsx similarity index 68% rename from examples/website/src/components/Layouts/Anchor/index.jsx rename to examples/website/src/components/Preview/Anchor/index.jsx index bb1f1af38..e913abc20 100644 --- a/examples/website/src/components/Layouts/Anchor/index.jsx +++ b/examples/website/src/components/Preview/Anchor/index.jsx @@ -1,13 +1,11 @@ import { Anchor } from 'antd'; import { useEffect, useState } from 'react'; import remark from 'remark'; -import { useComponentMarkdown } from './hooks'; -export default function Anchors() { - const markdownText = useComponentMarkdown(); +export default function Anchors({ markdownText }) { const [items, setItems] = useState([]); - function traverse(node, headers = []) { + function traverse(node, stack = [{ children: [] }]) { let currentHeader = null; if (node.type === 'heading') { @@ -15,40 +13,41 @@ export default function Anchors() { const text = node.children[0].value; const href = text ?.toLowerCase() - .replace(/^[^\w\u4e00-\u9fa5]+|[^\w\u4e00-\u9fa5]+$/g, '') - .replace(/\s+/g, '-') - .replace(/\./g, ''); + .replace(/^[^\w\u4e00-\u9fa5]+|[^\w\u4e00-\u9fa5]+$|[\n+/\/@\.]/g, '') + .replace(/\s+/g, '-'); const level = node.depth; currentHeader = { text, href, level, children: [] }; - if (level === 1) { - headers.push(currentHeader); - } else { - const parentHeader = headers[headers.length - 1]; - if (parentHeader) { - parentHeader.children.push(currentHeader); + let top = stack[stack.length - 1]; + + while (stack.length > level) { + stack.pop(); + top = stack[stack.length - 1]; + } + + if (level > stack.length) { + if (top.children.length > 0) { + stack.push(top.children[top.children.length - 1]); } } + + top.children.push(currentHeader); } if (node.children) { for (let i = 0; i < node.children.length; i++) { - traverse( - node.children[i], - currentHeader ? currentHeader.children : headers, - ); + traverse(node.children[i], stack); } } - return headers; + return stack[0].children; } useEffect(() => { const processor = remark(); const ast = processor.parse(markdownText); const headers = traverse(ast); - const items = createItems(headers); setItems(items); }, [markdownText]); @@ -73,6 +72,7 @@ export default function Anchors() { { + console.log('link: ', link); e.preventDefault(); const element = document.getElementById(link.href); element?.scrollIntoView({ behavior: 'instant', block: 'start' }); diff --git a/examples/website/src/components/Preview/index.tsx b/examples/website/src/components/Preview/index.tsx index 502976395..189b76030 100644 --- a/examples/website/src/components/Preview/index.tsx +++ b/examples/website/src/components/Preview/index.tsx @@ -17,6 +17,8 @@ import Loading from '../Loading'; import BackToUp from '@uiw/react-back-to-top'; import Footer from "../Footer" import './nodes/toc.less'; +import { useHyperlink } from './useHyperlink'; +import Anchors from './Anchor'; const Preview = CodeLayout.Preview; const Code = CodeLayout.Code; @@ -58,6 +60,7 @@ const Markdown = styled< const PreviewDocument = ({ path, editePath }: { path: MdDataHandle, editePath: string; }) => { const $dom = useRef(null); const { mdData, loading } = useMdData(path); + useHyperlink($dom.current); return ( @@ -151,6 +154,9 @@ const PreviewDocument = ({ path, editePath }: { path: MdDataHandle, editePath: s Top +
+ +
); }; diff --git a/examples/website/src/components/Preview/useHyperlink.tsx b/examples/website/src/components/Preview/useHyperlink.tsx index dc67b8b33..f73ecb8fa 100644 --- a/examples/website/src/components/Preview/useHyperlink.tsx +++ b/examples/website/src/components/Preview/useHyperlink.tsx @@ -43,7 +43,7 @@ export const useHyperlink = (dom: HTMLDivElement | null) => { target.classList.add('active'); } }; - const scrollFn = () => {}; + const scrollFn = () => { }; const scrollEndFn = () => { const $main = document.getElementsByTagName( 'main',