Skip to content

Commit d540dc6

Browse files
committed
Add toc in /docs
1 parent f822066 commit d540dc6

39 files changed

+687
-432
lines changed

package.json

+3
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
"lint-staged": "^12.3.3",
4343
"prettier": "^2.5.1",
4444
"remark-gfm": "^4.0.0",
45+
"remark-toc": "^9.0.0",
4546
"typescript": "^5.3.3",
4647
"vite": "^4.0.0",
4748
"vite-plugin-svgr": "^2.4.0",
@@ -69,6 +70,7 @@
6970
"i18next-browser-languagedetector": "^7.0.1",
7071
"immer": "^10.0.1",
7172
"lodash-es": "^4.17.21",
73+
"mdast-util-toc": "^7.1.0",
7274
"pretty-bytes": "^6.1.1",
7375
"react": "^18.2.0",
7476
"react-dom": "^18.2.0",
@@ -78,6 +80,7 @@
7880
"react-transition-group": "^4.4.5",
7981
"rehype-parse": "^9.0.0",
8082
"rehype-stringify": "^10.0.0",
83+
"remark-parse": "^11.0.0",
8184
"remark-rehype": "^11.1.0",
8285
"rrweb-player": "^1.0.0-alpha.4",
8386
"shiki": "^0.14.3",

src/assets/locales/en.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"os": "OS",
1616
"browser": "Browser",
1717
"harmony": "HarmonyOS",
18+
"rn": "React Native",
1819
"miniprogram": "Mini Program",
1920
"mpwechat": "WeChat Mini Program",
2021
"mpqq": "QQ Mini Program",
@@ -46,7 +47,8 @@
4647
"copied": "Copied",
4748
"prev": "Previous",
4849
"next": "Next",
49-
"replay-lab": "Replay Lab"
50+
"replay-lab": "Replay Lab",
51+
"toc": "Table of Contents"
5052
},
5153
"error": {
5254
"oops": "Oops! Errors happened~",

src/assets/locales/ja.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"os": "オペレーティング システム",
1616
"browser": "ブラウザ",
1717
"harmony": "HarmonyOS",
18+
"rn": "React Native",
1819
"miniprogram": "Mini Program",
1920
"mpwechat": "WeChat Mini Program",
2021
"mpqq": "QQ Mini Program",
@@ -46,7 +47,8 @@
4647
"copied": "コピーされました",
4748
"prev": "前のページ",
4849
"next": "次のページ",
49-
"replay-lab": "リプレイラボ"
50+
"replay-lab": "リプレイラボ",
51+
"toc": "目次"
5052
},
5153
"error": {
5254
"oops": "おっと!エラーが発生しました。",

src/assets/locales/ko.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"os": "운영 체제",
1616
"browser": "브라우저",
1717
"harmony": "HarmonyOS",
18+
"rn": "React Native",
1819
"miniprogram": "Mini Program",
1920
"mpwechat": "WeChat Mini Program",
2021
"mpqq": "QQ Mini Program",
@@ -46,7 +47,8 @@
4647
"copied": "복사되었습니다",
4748
"prev": "이전 페이지",
4849
"next": "다음 페이지",
49-
"replay-lab": "리플레이 연구소"
50+
"replay-lab": "리플레이 연구소",
51+
"toc": "목차"
5052
},
5153
"error": {
5254
"oops": "이런! 오류가 발생했습니다.",

src/assets/locales/zh.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"os": "系统",
1616
"browser": "浏览器",
1717
"harmony": "鸿蒙",
18+
"rn": "React Native",
1819
"miniprogram": "小程序",
1920
"mpwechat": "微信小程序",
2021
"mpalipay": "支付宝小程序",
@@ -46,7 +47,8 @@
4647
"copied": "已复制",
4748
"prev": "上一页",
4849
"next": "下一页",
49-
"replay-lab": "回放实验室"
50+
"replay-lab": "回放实验室",
51+
"toc": "本页目录"
5052
},
5153
"error": {
5254
"oops": " 哎呀!发生错误~",

src/assets/style/initial.less

-4
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,4 @@ samp {
4040
--header-height: @header-height;
4141
--light-background: @light-bg;
4242
--dark-background: @dark-bg;
43-
44-
--doc-sidebar-width: @doc-sidebar-width;
45-
--doc-page-max-width: @doc-page-max-width;
46-
--doc-side-space: calc(100vw - var(--doc-page-max-width));
4743
}

src/assets/style/variable.less

-2
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,3 @@
3030
@header-height: 64px;
3131
@light-bg: rgba(255, 255, 255, 1);
3232
@dark-bg: rgba(26, 26, 26, 1);
33-
@doc-sidebar-width: 240px;
34-
@doc-page-max-width: 1024px;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { langType } from '@/utils/useLanguage';
2+
import React from 'react';
3+
import { DocNotFound } from '../../DocNotFound';
4+
5+
const modules = import.meta.glob('@/pages/Docs/md/*.mdx') as Record<
6+
string,
7+
() => Promise<any>
8+
>;
9+
10+
export const LOAD_DOC_EVENT = 'load-doc';
11+
12+
const lazyDocWithNotification =
13+
(doc: string, value: () => Promise<any>) => async () => {
14+
window.dispatchEvent(
15+
new CustomEvent(LOAD_DOC_EVENT, {
16+
detail: {
17+
doc,
18+
loading: true,
19+
},
20+
}),
21+
);
22+
const result = await value();
23+
setTimeout(() => {
24+
window.dispatchEvent(
25+
new CustomEvent(LOAD_DOC_EVENT, {
26+
detail: {
27+
doc,
28+
loading: false,
29+
},
30+
}),
31+
);
32+
}, 100);
33+
return result;
34+
};
35+
36+
const mdComponents = Object.entries(modules).reduce((acc, cur) => {
37+
const [key, value] = cur;
38+
const result = key.match(/md\/(.+)\.(zh|en|ja|ko)\.mdx$/);
39+
if (!result) return acc;
40+
const [, doc, lang] = result;
41+
const lazyDoc = lazyDocWithNotification(doc, value);
42+
if (!acc[doc]) {
43+
acc[doc] = { [lang]: React.lazy(lazyDoc) };
44+
} else {
45+
acc[doc][lang] = React.lazy(lazyDoc);
46+
}
47+
return acc;
48+
}, {} as Record<string, Record<string, React.LazyExoticComponent<any>>>);
49+
50+
export const getDocContent = (doc: string, lang: langType) => {
51+
const docData = mdComponents[doc][lang];
52+
if (!docData) {
53+
return DocNotFound;
54+
}
55+
return docData;
56+
};

0 commit comments

Comments
 (0)