| 1 | namespace AgentForge.Plugin.View.Components.Code; |
| 2 | |
| 3 | public static class ForgeViewFileContent |
| 4 | { |
| 5 | public static string Render( |
| 6 | string content, |
| 7 | string? filePath, |
| 8 | int? highlightLine, |
| 9 | int? highlightEnd) |
| 10 | { |
| 11 | var language = ForgeSyntaxHighlighter.LanguageFromPath(filePath); |
| 12 | var lines = content.Replace("\r\n", "\n", StringComparison.Ordinal).Replace('\r', '\n').Split('\n'); |
| 13 | var start = highlightLine is > 0 ? highlightLine.Value : -1; |
| 14 | var end = highlightEnd is > 0 ? highlightEnd.Value : start; |
| 15 | if (end < start) |
| 16 | (start, end) = (end, start); |
| 17 | |
| 18 | var rows = new List<string>(lines.Length); |
| 19 | for (var i = 0; i < lines.Length; i++) |
| 20 | { |
| 21 | var lineNumber = i + 1; |
| 22 | var isHighlighted = start > 0 && lineNumber >= start && lineNumber <= end; |
| 23 | var rowClass = isHighlighted ? "file-line anchor-line" : "file-line"; |
| 24 | |
| 25 | rows.Add(ForgeHtml.Tr(rowClass, $"L{lineNumber}", |
| 26 | ForgeHtml.Td("file-num", |
| 27 | ForgeHtml.A($"#L{lineNumber}", lineNumber.ToString(), "file-num-link")), |
| 28 | ForgeHtml.Td("file-code", ForgeHtml.Raw(ForgeSyntaxHighlighter.HighlightLine(lines[i], language))))); |
| 29 | } |
| 30 | |
| 31 | return ForgeHtml.Div("file-view", |
| 32 | ForgeHtml.Table("file-table", |
| 33 | ForgeHtml.Tbody([.. rows]))); |
| 34 | } |
| 35 | } |
| 36 | |