diff --git a/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Themes/HighlightingDefinitions/ColorExtensions.cs b/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Themes/HighlightingDefinitions/ColorExtensions.cs index 042e868..2cf4d75 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Themes/HighlightingDefinitions/ColorExtensions.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Themes/HighlightingDefinitions/ColorExtensions.cs @@ -1,4 +1,21 @@ -using System; +// Copyright © 2017-2025 QL-Win Contributors +// +// This file is part of QuickLook program. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; using System.Globalization; using System.Windows.Media; diff --git a/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Themes/HighlightingDefinitions/CustomHighlightingDefinition.cs b/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Themes/HighlightingDefinitions/CustomHighlightingDefinition.cs index 162a2a7..657340d 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Themes/HighlightingDefinitions/CustomHighlightingDefinition.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Themes/HighlightingDefinitions/CustomHighlightingDefinition.cs @@ -1,5 +1,23 @@ -using ICSharpCode.AvalonEdit.Highlighting; +// Copyright © 2017-2025 QL-Win Contributors +// +// This file is part of QuickLook program. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using ICSharpCode.AvalonEdit.Highlighting; using ICSharpCode.AvalonEdit.Rendering; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Windows.Media; @@ -32,7 +50,8 @@ public class CustomHighlightingDefinition : ICustomHighlightingDefinition public virtual DocumentColorizingTransformer[] LineTransformers { get; } } -public class LightHighlightingDefinition : CustomHighlightingDefinition +[CustomHighlightingDefinition("Light")] +public abstract class LightHighlightingDefinition : CustomHighlightingDefinition { public override string Theme => "Light"; @@ -42,7 +61,8 @@ public class LightHighlightingDefinition : CustomHighlightingDefinition }; } -public class DarkHighlightingDefinition : CustomHighlightingDefinition +[CustomHighlightingDefinition("Dark")] +public abstract class DarkHighlightingDefinition : CustomHighlightingDefinition { public override string Theme => "Dark"; @@ -52,6 +72,18 @@ public class DarkHighlightingDefinition : CustomHighlightingDefinition }; } +public sealed class CustomHighlightingDefinitionAttribute(string theme) : Attribute +{ + public string Theme { get; } = theme; +} + +public sealed class CustomHighlightingDefinitionClass(ICustomHighlightingDefinition instance, string theme) +{ + public ICustomHighlightingDefinition Instance { get; } = instance; + + public string Theme { get; } = theme; +} + public interface ICustomHighlightingDefinition : IHighlightingDefinition { public string Theme { get; } diff --git a/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Themes/HighlightingDefinitions/Dark/PropertiesHighlightingDefinition.cs b/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Themes/HighlightingDefinitions/Dark/PropertiesHighlightingDefinition.cs index 7ecb4e6..4eed277 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Themes/HighlightingDefinitions/Dark/PropertiesHighlightingDefinition.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Themes/HighlightingDefinitions/Dark/PropertiesHighlightingDefinition.cs @@ -1,4 +1,21 @@ -using ICSharpCode.AvalonEdit.Document; +// Copyright © 2017-2025 QL-Win Contributors +// +// This file is part of QuickLook program. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using ICSharpCode.AvalonEdit.Document; using ICSharpCode.AvalonEdit.Highlighting; using ICSharpCode.AvalonEdit.Rendering; using System.Collections.Generic; diff --git a/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Themes/HighlightingDefinitions/Light/PropertiesHighlightingDefinition.cs b/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Themes/HighlightingDefinitions/Light/PropertiesHighlightingDefinition.cs index 094dd75..38afc09 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Themes/HighlightingDefinitions/Light/PropertiesHighlightingDefinition.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Themes/HighlightingDefinitions/Light/PropertiesHighlightingDefinition.cs @@ -1,9 +1,25 @@ -using ICSharpCode.AvalonEdit.Document; +// Copyright © 2017-2025 QL-Win Contributors +// +// This file is part of QuickLook program. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using ICSharpCode.AvalonEdit.Document; using ICSharpCode.AvalonEdit.Highlighting; using ICSharpCode.AvalonEdit.Rendering; using System.Collections.Generic; using System.Text.RegularExpressions; -using System.Windows; using System.Windows.Media; namespace QuickLook.Plugin.TextViewer.Themes.HighlightingDefinitions.Light; diff --git a/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Themes/HighlightingThemeManager.cs b/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Themes/HighlightingThemeManager.cs index 02f9a56..f5c8ad0 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Themes/HighlightingThemeManager.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.TextViewer/Themes/HighlightingThemeManager.cs @@ -21,13 +21,12 @@ using QuickLook.Common.Helpers; using QuickLook.Plugin.TextViewer.Detectors; using QuickLook.Plugin.TextViewer.Themes.HighlightingDefinitions; using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Xml; -using DarkHighlightingDefinition = QuickLook.Plugin.TextViewer.Themes.HighlightingDefinitions.Dark; -using LightHighlightingDefinition = QuickLook.Plugin.TextViewer.Themes.HighlightingDefinitions.Light; namespace QuickLook.Plugin.TextViewer.Themes; @@ -171,12 +170,36 @@ public class HighlightingThemeManager private static void InitCustomHighlighting() { - AddCustomHighlighting(Light, new LightHighlightingDefinition.PropertiesHighlightingDefinition()); + foreach (var definitionClass in LoadAllDefinitions()) + { + var hlm = definitionClass.Theme == nameof(Dark) ? Dark : Light; - AddCustomHighlighting(Dark, new DarkHighlightingDefinition.PropertiesHighlightingDefinition()); + AddCustomHighlighting(hlm, definitionClass.Instance); + } + + static IEnumerable LoadAllDefinitions() + { + var assembly = Assembly.GetExecutingAssembly(); + var types = assembly.GetTypes() + .Where(t => t.IsClass + && !t.IsAbstract + && typeof(ICustomHighlightingDefinition).IsAssignableFrom(t) + && t.GetConstructor(Type.EmptyTypes) != null); + + foreach (var type in types) + { + if (type.GetCustomAttribute() is CustomHighlightingDefinitionAttribute { } attr) + { + if (Activator.CreateInstance(type) is ICustomHighlightingDefinition instance) + { + yield return new CustomHighlightingDefinitionClass(instance, attr.Theme); + } + } + } + } } - private static void AddCustomHighlighting(HighlightingManager hlm, CustomHighlightingDefinition definition) + private static void AddCustomHighlighting(HighlightingManager hlm, ICustomHighlightingDefinition definition) { try {