|
1 | 1 | import { cache } from "react"; |
2 | 2 |
|
| 3 | +// GitHub 相关工具方法:集中维护仓库常量与文档路径生成逻辑 |
| 4 | +const GITHUB_OWNER = "InvolutionHell"; |
| 5 | +const GITHUB_REPO = "involutionhell.github.io"; |
| 6 | +const DEFAULT_BRANCH = "main"; |
| 7 | +const DOCS_BASE = "app/docs"; |
| 8 | + |
| 9 | +const REPO_BASE_URL = `https://github.com/${GITHUB_OWNER}/${GITHUB_REPO}`; |
| 10 | + |
| 11 | +// 拼接路径并清理多余斜杠,避免出现 // 或首尾斜杠 |
| 12 | +function joinPath(...segments: (string | undefined)[]) { |
| 13 | + return segments |
| 14 | + .filter((segment) => (segment ?? "").trim().length > 0) |
| 15 | + .join("/") |
| 16 | + .replace(/\/+/g, "/") |
| 17 | + .replace(/^\/+/, "") |
| 18 | + .replace(/\/+$/, ""); |
| 19 | +} |
| 20 | + |
| 21 | +// 将路径逐段 URL 编码,处理中文等特殊字符 |
| 22 | +function encodeRepoPath(...segments: (string | undefined)[]) { |
| 23 | + const joined = joinPath(...segments); |
| 24 | + if (!joined) return ""; |
| 25 | + return joined |
| 26 | + .split("/") |
| 27 | + .map((segment) => encodeURIComponent(segment)) |
| 28 | + .join("/"); |
| 29 | +} |
| 30 | + |
| 31 | +// 构建文档的 GitHub 编辑链接 |
| 32 | +export function buildDocsEditUrl(relativeDocPath: string) { |
| 33 | + const encoded = encodeRepoPath(DOCS_BASE, relativeDocPath); |
| 34 | + return `${REPO_BASE_URL}/edit/${DEFAULT_BRANCH}/${encoded}`; |
| 35 | +} |
| 36 | + |
| 37 | +// 构建在 GitHub 新建文档的链接,附带 frontmatter 参数 |
| 38 | +export function buildDocsNewUrl(relativeDir: string, params: URLSearchParams) { |
| 39 | + const encodedDir = encodeRepoPath(DOCS_BASE, relativeDir); |
| 40 | + const query = params.toString(); |
| 41 | + const suffix = query ? `?${query}` : ""; |
| 42 | + return `${REPO_BASE_URL}/new/${DEFAULT_BRANCH}/${encodedDir}${suffix}`; |
| 43 | +} |
| 44 | + |
| 45 | +// 帮助预览完整 docs 路径(未编码) |
| 46 | +export function normalizeDocsPath(relative: string) { |
| 47 | + return joinPath(DOCS_BASE, relative); |
| 48 | +} |
| 49 | + |
| 50 | +// 暴露常量给其他场景复用 |
| 51 | +export const githubConstants = { |
| 52 | + owner: GITHUB_OWNER, |
| 53 | + repo: GITHUB_REPO, |
| 54 | + defaultBranch: DEFAULT_BRANCH, |
| 55 | + docsBase: DOCS_BASE, |
| 56 | + repoBaseUrl: REPO_BASE_URL, |
| 57 | +}; |
| 58 | + |
| 59 | + |
| 60 | + |
3 | 61 | // Define contributor data structure |
4 | 62 | interface Contributor { |
5 | 63 | login: string; |
|
0 commit comments