Commit: 5198a5c
Parent: 8b38979

Simplify content rendering

Mårten Åsberg committed on 2026-04-28 at 14:10
GitBrowser.SyntaxHighlighter/Syntax.cs +0 -4
diff --git a/GitBrowser.SyntaxHighlighter/Syntax.cs b/GitBrowser.SyntaxHighlighter/Syntax.cs
index 5f2d1f4..714141d 100644
@@ -4,10 +4,6 @@ namespace GitBrowser.SyntaxHighlighter;
public static partial class Syntax
{
[LibraryImport("syntax_highlighter", EntryPoint = "can_highlight_file", StringMarshalling = StringMarshalling.Utf8)]
[return: MarshalAs(UnmanagedType.Bool)]
public static partial bool CanHighlightFile(string extension);
[LibraryImport(
"syntax_highlighter",
EntryPoint = "highlight_syntax_html",
GitBrowser.SyntaxHighlighter/src/lib.rs +19 -21
diff --git a/GitBrowser.SyntaxHighlighter/src/lib.rs b/GitBrowser.SyntaxHighlighter/src/lib.rs
index 9051a2a..a7eece5 100644
@@ -1,44 +1,42 @@
use std::ffi::{CStr, CString, c_char};
use syntect::{highlighting::ThemeSet, html::highlighted_html_for_string, parsing::SyntaxSet};
#[unsafe(no_mangle)]
pub extern "C" fn can_highlight_file(file_extension: *const c_char) -> bool {
let Ok(ext) = unsafe { CStr::from_ptr(file_extension) }.to_str() else {
return false;
};
let ss = SyntaxSet::load_defaults_newlines();
ss.find_syntax_by_extension(ext.chars().skip(1).collect::<String>().as_str())
.is_some()
}
use syntect::{
highlighting::ThemeSet,
html::highlighted_html_for_string,
parsing::{SyntaxReference, SyntaxSet},
};
#[unsafe(no_mangle)]
pub extern "C" fn highlight_syntax_html(
file_extension: *const c_char,
text: *const c_char,
) -> *const c_char {
let Ok(ext) = unsafe { CStr::from_ptr(file_extension) }.to_str() else {
return CString::default().into_raw();
};
let Ok(text) = unsafe { CStr::from_ptr(text) }.to_str() else {
let Some((ss, syntax)) = get_syntax(file_extension) else {
return CString::default().into_raw();
};
let ss = SyntaxSet::load_defaults_newlines();
let Some(syntax) =
ss.find_syntax_by_extension(ext.chars().skip(1).collect::<String>().as_str())
else {
let Ok(text) = unsafe { CStr::from_ptr(text) }.to_str() else {
return CString::default().into_raw();
};
let ts = ThemeSet::load_defaults();
let github_theme = &ts.themes["base16-ocean.dark"];
let Ok(highlighted) = highlighted_html_for_string(text, &ss, syntax, github_theme) else {
let Ok(highlighted) = highlighted_html_for_string(text, &ss, &syntax, github_theme) else {
return CString::default().into_raw();
};
CString::new(highlighted)
.unwrap_or_else(|_| CString::default())
.into_raw()
}
fn get_syntax(file_extension: *const c_char) -> Option<(SyntaxSet, SyntaxReference)> {
let Ok(ext) = unsafe { CStr::from_ptr(file_extension) }.to_str() else {
return None;
};
let ss = SyntaxSet::load_defaults_newlines();
ss.find_syntax_by_extension(ext.chars().skip(1).collect::<String>().as_str())
.cloned()
.map(|syntax| (ss, syntax))
}
GitBrowser/Components/Shared/FilePreview.razor +7 -9
diff --git a/GitBrowser/Components/Shared/FilePreview.razor b/GitBrowser/Components/Shared/FilePreview.razor
index 1509fc1..b7b35e7 100644
@@ -56,17 +56,15 @@
filePreview = (MarkupString)$"<div class=\"markdown\">{Markdown.ToHtml(FileContent.GetContentText(),
markdownPipeline)}</div>";
}
else if (extension is not null && Syntax.CanHighlightFile(extension))
else if (extension is not null && !FileContent.IsBinary)
{
var content = FileContent.GetContentText();
var highlightedHtml = Syntax.HighlightSyntaxHtml(extension, content);
filePreview = (MarkupString)AddLineNumberGutter(highlightedHtml, content);
}
else if (!FileContent.IsBinary)
{
var content = FileContent.GetContentText();
var plainHtml = $"<pre class=\"plain\">{HttpUtility.HtmlEncode(content)}</pre>";
filePreview = (MarkupString)AddLineNumberGutter(plainHtml, content);
var html = Syntax.HighlightSyntaxHtml(extension, content);
if (string.IsNullOrWhiteSpace(html))
{
html = $"<pre class=\"plain\">{HttpUtility.HtmlEncode(content)}</pre>";
}
filePreview = (MarkupString)AddLineNumberGutter(html, content);
}
else
{