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