| 1 | namespace AgentForge.Plugin.View.Components.Code; |
| 2 | |
| 3 | internal static class ForgeViewPathCrumb |
| 4 | { |
| 5 | internal static string Render(string repoName, string activeBranch, string? path, bool isBlob) |
| 6 | { |
| 7 | var normalized = (path ?? "").Trim().Replace('\\', '/').Trim('/'); |
| 8 | if (normalized.Length == 0) |
| 9 | return ForgeHtml.Span("path-root", ForgeHtml.Text("/")); |
| 10 | |
| 11 | var segments = normalized.Split('/', StringSplitOptions.RemoveEmptyEntries); |
| 12 | var parts = new List<string>(); |
| 13 | var cumulative = ""; |
| 14 | for (var i = 0; i < segments.Length; i++) |
| 15 | { |
| 16 | cumulative = string.IsNullOrEmpty(cumulative) ? segments[i] : $"{cumulative}/{segments[i]}"; |
| 17 | var isLast = i == segments.Length - 1; |
| 18 | if (isLast && isBlob) |
| 19 | { |
| 20 | parts.Add(ForgeHtml.Strong("path-current", ForgeHtml.Text(segments[i]))); |
| 21 | break; |
| 22 | } |
| 23 | |
| 24 | var href = BuildTreeHref(repoName, activeBranch, cumulative); |
| 25 | parts.Add(ForgeHtml.A(href, segments[i])); |
| 26 | parts.Add(ForgeHtml.Span("path-sep", ForgeHtml.Text("/"))); |
| 27 | } |
| 28 | |
| 29 | return ForgeHtml.Fragment([.. parts]); |
| 30 | } |
| 31 | |
| 32 | private static string BuildTreeHref(string repoName, string branch, string? path) |
| 33 | { |
| 34 | var href = $"/view/repos/{ForgeRepoNames.ToUrlPath(repoName)}/tree?branch={Uri.EscapeDataString(branch)}"; |
| 35 | if (!string.IsNullOrEmpty(path)) |
| 36 | href += $"&path={Uri.EscapeDataString(path)}"; |
| 37 | return href; |
| 38 | } |
| 39 | } |
| 40 | |