From aa1484f5d431296d050e925f69fd6516d90d6cab Mon Sep 17 00:00:00 2001 From: Stone_Red <56473591+Stone-Red-Code@users.noreply.github.com> Date: Sat, 27 Apr 2024 20:11:25 +0200 Subject: [PATCH 1/9] Add Name and Description properties to `IContentProcessor` --- src/Markdowser/Processing/IContentProcessor.cs | 4 ++++ .../Processing/Processors/CommonImageProcessor.cs | 7 ++++++- src/Markdowser/Processing/Processors/HtmlProcessor.cs | 4 ++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/Markdowser/Processing/IContentProcessor.cs b/src/Markdowser/Processing/IContentProcessor.cs index 09c6412..cd8e4b8 100644 --- a/src/Markdowser/Processing/IContentProcessor.cs +++ b/src/Markdowser/Processing/IContentProcessor.cs @@ -9,6 +9,10 @@ namespace Markdowser.Processing; internal interface IContentProcessor { + string Name { get; } + + string Description { get; } + bool CanProcess(HttpContentHeaders httpContentHeaders); Task Process(HttpResponseMessage httpResponseMessage, IProgress progress); diff --git a/src/Markdowser/Processing/Processors/CommonImageProcessor.cs b/src/Markdowser/Processing/Processors/CommonImageProcessor.cs index 5364948..50e2522 100644 --- a/src/Markdowser/Processing/Processors/CommonImageProcessor.cs +++ b/src/Markdowser/Processing/Processors/CommonImageProcessor.cs @@ -7,8 +7,13 @@ using System.Net.Http.Headers; using System.Threading.Tasks; namespace Markdowser.Processing.Processors; + internal class CommonImageProcessor : IContentProcessor { + public string Name => "Common Image Processor"; + + public string Description => "Processes common image types (e.g. PNG, JPEG, GIF)"; + public bool CanProcess(HttpContentHeaders httpContentHeaders) { if (httpContentHeaders.ContentType?.MediaType == "image/svg+xml") @@ -23,4 +28,4 @@ internal class CommonImageProcessor : IContentProcessor { return new CommonImageContentViewModel(httpResponseMessage.RequestMessage?.RequestUri?.Host?.ToString() ?? "Image", await httpResponseMessage.Content.ReadAsStreamAsync()); } -} +} \ No newline at end of file diff --git a/src/Markdowser/Processing/Processors/HtmlProcessor.cs b/src/Markdowser/Processing/Processors/HtmlProcessor.cs index 66d6c7d..1de3f72 100644 --- a/src/Markdowser/Processing/Processors/HtmlProcessor.cs +++ b/src/Markdowser/Processing/Processors/HtmlProcessor.cs @@ -19,6 +19,10 @@ internal partial class HtmlProcessor : IContentProcessor { private readonly ReverseMarkdown.Converter markdownConverter = new(); + public string Name => "HTML Processor"; + + public string Description => "Processes HTML content"; + public HtmlProcessor() { markdownConverter.Config.UnknownTags = ReverseMarkdown.Config.UnknownTagsOption.Bypass; From f53eb36dd0382fe08a3e0d4df7ddb5632df14ef4 Mon Sep 17 00:00:00 2001 From: Stone_Red <56473591+Stone-Red-Code@users.noreply.github.com> Date: Sat, 27 Apr 2024 20:11:40 +0200 Subject: [PATCH 2/9] Add UserAgent setting --- src/Markdowser/Models/Settings.cs | 3 +++ src/Markdowser/ViewModels/MainWindowViewModel.cs | 8 +++++++- src/Markdowser/ViewModels/SettingsViewModel.cs | 6 ++++++ src/Markdowser/Views/SettingsView.axaml | 3 +++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/Markdowser/Models/Settings.cs b/src/Markdowser/Models/Settings.cs index 4179104..1188d85 100644 --- a/src/Markdowser/Models/Settings.cs +++ b/src/Markdowser/Models/Settings.cs @@ -1,6 +1,7 @@ using Markdowser.Utilities; using System.IO; +using System.Reflection; using System.Text.Json; namespace Markdowser.Models; @@ -15,6 +16,8 @@ public class Settings public string? HomeUrl { get; set; } + public string UserAgent { get; set; } = $"{Assembly.GetExecutingAssembly().GetName().Name}/{Assembly.GetExecutingAssembly().GetName().Version?.ToString()}"; + public static void SaveSettings() { if (!Directory.Exists(Configuration.ApplicationDataPath)) diff --git a/src/Markdowser/ViewModels/MainWindowViewModel.cs b/src/Markdowser/ViewModels/MainWindowViewModel.cs index 44fcc0c..78dbad7 100644 --- a/src/Markdowser/ViewModels/MainWindowViewModel.cs +++ b/src/Markdowser/ViewModels/MainWindowViewModel.cs @@ -161,7 +161,6 @@ public partial class MainWindowViewModel : ViewModelBase public MainWindowViewModel() { - httpClient.DefaultRequestHeaders.UserAgent.ParseAdd($"{nameof(Markdowser)}/{Assembly.GetExecutingAssembly().GetName().Version?.ToString()}"); httpClient.Timeout = TimeSpan.FromSeconds(10); content = DefaultContent; @@ -232,6 +231,13 @@ public partial class MainWindowViewModel : ViewModelBase } } + httpClient.DefaultRequestHeaders.UserAgent.Clear(); + if (!httpClient.DefaultRequestHeaders.UserAgent.TryParseAdd(Settings.Current.UserAgent)) + { + WindowNotificationManager.Show(new Notification("Invalid User Agent", "Failed to set user agent.", NotificationType.Error)); + return; + } + IsBusy = true; Progress = 0; diff --git a/src/Markdowser/ViewModels/SettingsViewModel.cs b/src/Markdowser/ViewModels/SettingsViewModel.cs index 7d80466..b4d9d9c 100644 --- a/src/Markdowser/ViewModels/SettingsViewModel.cs +++ b/src/Markdowser/ViewModels/SettingsViewModel.cs @@ -16,6 +16,12 @@ public class SettingsViewModel : ViewModelBase set => Settings.Current.SearchEngineUrl = value; } + public string UserAgent + { + get => Settings.Current.UserAgent; + set => Settings.Current.UserAgent = value; + } + public bool DarkMode { get => Settings.Current.DarkMode; diff --git a/src/Markdowser/Views/SettingsView.axaml b/src/Markdowser/Views/SettingsView.axaml index 53a8ff8..4135a5e 100644 --- a/src/Markdowser/Views/SettingsView.axaml +++ b/src/Markdowser/Views/SettingsView.axaml @@ -28,5 +28,8 @@ + + + \ No newline at end of file From cb8d13fe085e8bbc96c8531f0eda066e1b5f9e18 Mon Sep 17 00:00:00 2001 From: Stone_Red <56473591+Stone-Red-Code@users.noreply.github.com> Date: Tue, 30 Apr 2024 16:33:05 +0200 Subject: [PATCH 3/9] Fix closing tab causes browser to load the website of the first tab & some safety checks --- .../ViewModels/MainWindowViewModel.cs | 18 ++++++++- src/Markdowser/Views/MainWindow.axaml | 37 +++++++++++++++---- 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/src/Markdowser/ViewModels/MainWindowViewModel.cs b/src/Markdowser/ViewModels/MainWindowViewModel.cs index 78dbad7..2c70421 100644 --- a/src/Markdowser/ViewModels/MainWindowViewModel.cs +++ b/src/Markdowser/ViewModels/MainWindowViewModel.cs @@ -47,7 +47,7 @@ public partial class MainWindowViewModel : ViewModelBase _ = this.RaiseAndSetIfChanged(ref currentTab!, value); - Url = currentTab?.Tag?.ToString() ?? string.Empty; + Url = value?.Tag?.ToString() ?? string.Empty; FetchUrl(); } @@ -132,18 +132,32 @@ public partial class MainWindowViewModel : ViewModelBase public ICommand CloseTab => ReactiveCommand.Create(() => { + if (IsBusy) + { + WindowNotificationManager.Show(new Notification("Busy", "The browser is currently busy.", NotificationType.Warning)); + return; + } + if (Tabs.Count > 1) { int currentIndex = Tabs.IndexOf(CurrentTab); - _ = Tabs.Remove(CurrentTab); CurrentTab = currentIndex > 0 ? Tabs[currentIndex - 1] : Tabs[0]; + + Tabs.RemoveAt(currentIndex); + this.RaisePropertyChanged(nameof(CloseTabEnabled)); } }); public ICommand NewTab => ReactiveCommand.Create(() => { + if (IsBusy) + { + WindowNotificationManager.Show(new Notification("Busy", "The browser is currently busy.", NotificationType.Warning)); + return; + } + TabItem tab = new() { Header = "New Tab", Name = Guid.NewGuid().ToString() }; Tabs.Add(tab); CurrentTab = tab; diff --git a/src/Markdowser/Views/MainWindow.axaml b/src/Markdowser/Views/MainWindow.axaml index e634897..16f77a7 100644 --- a/src/Markdowser/Views/MainWindow.axaml +++ b/src/Markdowser/Views/MainWindow.axaml @@ -45,9 +45,16 @@ - - + + + -