From ee82b1bef4ad145441adbc66ca8bc72d01d84ac1 Mon Sep 17 00:00:00 2001 From: juju2143 Date: Mon, 2 Oct 2023 17:17:27 -0400 Subject: [PATCH] Add Gemini media handler --- Media/GeminiMediaHandler.cs | 80 +++++++++++++++++++++++++++++++++ Protocols/GeminiProtoHandler.cs | 7 +++ 2 files changed, 87 insertions(+) create mode 100644 Media/GeminiMediaHandler.cs diff --git a/Media/GeminiMediaHandler.cs b/Media/GeminiMediaHandler.cs new file mode 100644 index 0000000..f30916b --- /dev/null +++ b/Media/GeminiMediaHandler.cs @@ -0,0 +1,80 @@ +using System.Numerics; +using ImGuiNET; + +namespace Shoko; + +[MediaType("text/gemini")] +class GeminiMediaHandler : MediaHandler +{ + List lines; + public GeminiMediaHandler(ProtoHandler content) + { + Content = content; + lines = new List(); + } + + public override void Load() + { + Title = new UriBuilder(Content.URL).Path; + var reader = new StreamReader(Content.Content); + string line; + while((line = reader.ReadLine()) is not null) + { + lines.Add(line); + } + } + + public override void Render() + { + var formatting = true; + foreach(var line in lines) + { + if(line.StartsWith("```")) + { + formatting = !formatting; + } + else if(formatting) + { + if(line.StartsWith("=>")) + { + var parts = line[2..].Trim().Split(new char[]{' ', '\t'}, 2, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + var title = parts[parts.Length > 1 ? 1 : 0]; + var linkurl = new Uri(Content.URL, parts[0]).ToString(); + ImGui.TextColored(new Vector4(0,0,255,255), title.Trim()); + ImGui.SetItemTooltip(linkurl); + if(ImGui.IsItemClicked(ImGuiMouseButton.Left)) + Content.CurrentTab.Load(linkurl); + } + else if(line.StartsWith("#")) + { + var scale = 2f; + var heading = 1; + if(line.StartsWith("##")) (scale, heading) = (1.5f, 2); + if(line.StartsWith("###")) (scale, heading) = (1.25f, 3); + + var font = ImGui.GetFont(); + float oldScale = font.Scale; + font.Scale *= scale; + ImGui.PushFont(font); + + ImGui.TextUnformatted(line[heading..].Trim()); + + font.Scale = oldScale; + ImGui.PopFont(); + } + else if(line.StartsWith("* ")) + { + ImGui.BulletText(line[2..].Trim()); + } + else if(line.StartsWith(">")) + { + ImGui.TextDisabled(" "+line.Trim()); + } + else + ImGui.TextWrapped(line.Trim()); + } + else + ImGui.TextUnformatted(line); + } + } +} \ No newline at end of file diff --git a/Protocols/GeminiProtoHandler.cs b/Protocols/GeminiProtoHandler.cs index 83dd34d..41f66b7 100644 --- a/Protocols/GeminiProtoHandler.cs +++ b/Protocols/GeminiProtoHandler.cs @@ -44,7 +44,14 @@ class GeminiProtoHandler : ProtoHandler { byte[] content = new byte[]{}; if(meta.Length > 1) + { + if(Status.StartsWith('3')) + { + meta[1] = "=> "+meta[1]; + MediaType = "text/gemini"; + } content = Encoding.UTF8.GetBytes(meta[1]); + } Content = new MemoryStream(content); }