GitBrowser/Components/Pages/Repo.razor
+1
-1
diff --git a/GitBrowser/Components/Pages/Repo.razor b/GitBrowser/Components/Pages/Repo.razor
index 25e22b9..2c02c76 100644
@@ -138,7 +138,7 @@
</div>
}
@if (fileContent?.Length is > 0)
@if (fileContent is not null)
{
<FilePreview IsReadme="@isReadme" FileName="@fileName" FileContent="@fileContent" />
}
GitBrowser/Components/Pages/Repo.razor.cs
+3
-5
diff --git a/GitBrowser/Components/Pages/Repo.razor.cs b/GitBrowser/Components/Pages/Repo.razor.cs
index 46f47d3..9b88cf2 100644
@@ -35,7 +35,7 @@ public sealed partial class Repo(
private string displayPath = "";
private string? cloneCommand;
private bool isViewingFile = false;
private Stream? fileContent = null;
private Blob? fileContent = null;
private string? fileName = null;
private bool isReadme = false;
private Repository? repo = null;
@@ -130,8 +130,7 @@ public sealed partial class Repo(
{
// It's a file - display it
isViewingFile = true;
var blob = (Blob)treeEntry.Target;
fileContent = blob.GetContentStream();
fileContent = (Blob)treeEntry.Target;
fileName = System.IO.Path.GetFileName(currentPath);
isReadme = false;
@@ -200,8 +199,7 @@ public sealed partial class Repo(
var readmeEntry = tree.FirstOrDefault(e => e.Name.Equals(readmeName, StringComparison.OrdinalIgnoreCase));
if (readmeEntry != null && readmeEntry.TargetType == TreeEntryTargetType.Blob)
{
var blob = (Blob)readmeEntry.Target;
fileContent = blob.GetContentStream();
fileContent = (Blob)readmeEntry.Target;
fileName = readmeEntry.Name;
isReadme = true;
break;
GitBrowser/Components/Shared/FilePreview.razor
+16
-10
diff --git a/GitBrowser/Components/Shared/FilePreview.razor b/GitBrowser/Components/Shared/FilePreview.razor
index 2adfaa4..f889ff5 100644
@@ -2,6 +2,7 @@
@using GitBrowser.SyntaxHighlighter
@using System.Web
@using System.Text
@using LibGit2Sharp
@using Markdig
<div class="file-viewer @(IsReadme ? "readme-viewer" : "")">
@@ -26,35 +27,40 @@
public required string FileName { get; set; }
[Parameter]
public required Stream FileContent { get; set; }
public required Blob FileContent { get; set; }
private MarkupString filePreview = (MarkupString)"";
protected override async Task OnInitializedAsync()
{
byte[] fileBytes;
using (var ms = new MemoryStream())
{
await FileContent.CopyToAsync(ms);
fileBytes = ms.ToArray();
}
var extension = Path.GetExtension(FileName);
if (MimeTypes.TryGetMimeType(FileName, out var mimeType) && mimeType.StartsWith("image/"))
{
byte[] fileBytes;
using (var ms = new MemoryStream())
using (var stream = FileContent.GetContentStream())
{
await stream.CopyToAsync(ms);
fileBytes = ms.ToArray();
}
filePreview = (MarkupString)$"<img src=\"data:{mimeType};base64,{Convert.ToBase64String(fileBytes)}\">";
}
else if (string.Equals(extension, ".md", StringComparison.OrdinalIgnoreCase))
{
filePreview = (MarkupString)$"<div class=\"markdown\">{Markdown.ToHtml(Encoding.UTF8.GetString(fileBytes), markdownPipeline)}</div>";
filePreview = (MarkupString)$"<div class=\"markdown\">{Markdown.ToHtml(FileContent.GetContentText(), markdownPipeline)}</div>";
}
else if (extension is not null && Syntax.CanHighlightFile(extension))
{
filePreview = (MarkupString)Syntax.HighlightSyntaxHtml(extension, Encoding.UTF8.GetString(fileBytes));
filePreview = (MarkupString)Syntax.HighlightSyntaxHtml(extension, FileContent.GetContentText());
}
else if (!FileContent.IsBinary)
{
filePreview = (MarkupString)$"<pre class=\"plain\">{HttpUtility.HtmlEncode(FileContent.GetContentText())}</pre>";
}
else
{
filePreview = (MarkupString)$"<pre class=\"plain\">{HttpUtility.HtmlEncode(Encoding.UTF8.GetString(fileBytes))}</pre>";
filePreview = (MarkupString)"<p class=\"binary\">Binary content</p>";
}
}
}
GitBrowser/Components/Shared/FilePreview.razor.css
+4
-0
diff --git a/GitBrowser/Components/Shared/FilePreview.razor.css b/GitBrowser/Components/Shared/FilePreview.razor.css
index 3a73348..502828a 100644
@@ -35,3 +35,7 @@
margin: 0;
padding: 1rem;
}
.file-content ::deep .binary {
text-align: center;
}