diff --git a/WikiPreview.Fluent.Plugin/QueryConfiguration.cs b/WikiPreview.Fluent.Plugin/QueryConfiguration.cs index 4110ad9..a995403 100644 --- a/WikiPreview.Fluent.Plugin/QueryConfiguration.cs +++ b/WikiPreview.Fluent.Plugin/QueryConfiguration.cs @@ -6,5 +6,6 @@ public class QueryConfiguration public int WikiNameSpace { get; set; } public int ResultsCount { get; set; } public int ImageSize { get; set; } + public bool LoadImage { get; set; } } } \ No newline at end of file diff --git a/WikiPreview.Fluent.Plugin/ResultGenerator.cs b/WikiPreview.Fluent.Plugin/ResultGenerator.cs new file mode 100644 index 0000000..5b2850c --- /dev/null +++ b/WikiPreview.Fluent.Plugin/ResultGenerator.cs @@ -0,0 +1,114 @@ +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Net.Http; +using System.Net.Http.Json; +using System.Reflection; +using System.Threading.Tasks; +using Blast.API.Search; +using Blast.Core.Results; +using static WikiPreview.Fluent.Plugin.WikiPreviewSearchApp; +using static WikiPreview.Fluent.Plugin.WikiResult; + +namespace WikiPreview.Fluent.Plugin +{ + /// + /// A static class that stores the common methods to generate search results. + /// Also stores and initializes WikipediaLogo which will be used as placeholder for Wiki Results with no images. + /// Stores the Image Size (set in FS Plugin Settings) and is used across multiple places. + /// + public static class ResultGenerator + { + private static readonly BitmapImageResult WikipediaLogo; + private static int _imageSizePrefs; + + static ResultGenerator() + { + var assembly = Assembly.GetExecutingAssembly(); + WikipediaLogo = + new BitmapImageResult( + assembly.GetManifestResourceStream("WikiPreview.Fluent.Plugin.Wikipedia-logo.png")); + } + + public static int GetImageSizePrefs() + { + return _imageSizePrefs; + } + + public static void SetImageSizePrefs(int size) + { + _imageSizePrefs = size; + } + + public static async ValueTask GenerateSearchResult(PageView value, + string searchedText, bool loadImage = true) + { + string displayedName = value?.Title; + string pageId = value?.PageId.ToString(); + if (string.IsNullOrWhiteSpace(pageId) || string.IsNullOrWhiteSpace(displayedName)) return null; + + string resultName = value.Extract; + if (string.IsNullOrWhiteSpace(resultName)) + resultName = "Description not available for this Search Result."; + + double score = displayedName.SearchTokens(searchedText); + string wikiUrl = displayedName.Replace(' ', '_'); + BitmapImageResult bitmapImageResult = null; + + if (loadImage && value.Thumbnail != null) + { + string imgUrl = value.Thumbnail.Source; + + using var imageClient = new HttpClient(); + imageClient.DefaultRequestHeaders.UserAgent.TryParseAdd(UserAgentString); + + await imageClient.GetStreamAsync(imgUrl).ContinueWith(task => + { + if (!task.IsCompletedSuccessfully) return; + var bitmap = + new Bitmap(task.Result); // Wiki Images are not working with AvaloniaBitmap as of now. + + if (!bitmap.Size.IsEmpty) + bitmapImageResult = new BitmapImageResult(bitmap); + }); + } + + bitmapImageResult ??= WikipediaLogo; + + return new WikiPreviewSearchResult(resultName) + { + Url = wikiUrl, + PreviewImage = bitmapImageResult, + DisplayedName = displayedName, + SearchedText = searchedText, + Score = score, + SearchObjectId = pageId, + PinUniqueId = pageId + }; + } + + public static async ValueTask GenerateOnDemand(string searchId, + bool isCustomPreview = false, + bool loadImage = true) + { + if (string.IsNullOrWhiteSpace(searchId)) + return default; + + string searchType = isCustomPreview ? "titles=" : "pageids="; + + string url = "https://en.wikipedia.org/w/api.php?action=query&prop=extracts|pageimages&" + searchType + + searchId + + "&explaintext&exintro&pilicense=any&pithumbsize=100&format=json"; + + using var httpClient = new HttpClient(); + httpClient.DefaultRequestHeaders.UserAgent.TryParseAdd(UserAgentString); + var wiki = await httpClient.GetFromJsonAsync(url, SerializerOptions); + + Dictionary.ValueCollection pages = wiki?.Query?.Pages?.Values; + if (pages is { Count: 0 }) return default; + + PageView pageView = pages?.First(); + return await GenerateSearchResult(pageView, pageView?.Title, loadImage); + } + } +} diff --git a/WikiPreview.Fluent.Plugin/WikiPreview.Fluent.Plugin.csproj b/WikiPreview.Fluent.Plugin/WikiPreview.Fluent.Plugin.csproj index 66e9b0b..284e2b6 100644 --- a/WikiPreview.Fluent.Plugin/WikiPreview.Fluent.Plugin.csproj +++ b/WikiPreview.Fluent.Plugin/WikiPreview.Fluent.Plugin.csproj @@ -1,18 +1,18 @@ - - net5.0-windows10.0.19041 - - None - - AnyCPU;x64 - 1.2.0.0 - + + net6.0 + AnyCPU;x64 + 1.3.0.0 + - - - - - + + + + + + + + diff --git a/WikiPreview.Fluent.Plugin/WikiPreviewSearchApp.cs b/WikiPreview.Fluent.Plugin/WikiPreviewSearchApp.cs index 74cf284..0f8c9e2 100644 --- a/WikiPreview.Fluent.Plugin/WikiPreviewSearchApp.cs +++ b/WikiPreview.Fluent.Plugin/WikiPreviewSearchApp.cs @@ -1,34 +1,32 @@ -using Blast.API.Core.Processes; -using Blast.API.Processes; -using Blast.API.Search; -using Blast.Core.Interfaces; -using Blast.Core.Objects; -using Blast.Core.Results; -using Dasync.Collections; -using System; +using System; using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Linq; using System.Net.Http; using System.Net.Http.Json; using System.Text.Json; using System.Threading; using System.Threading.Channels; using System.Threading.Tasks; +using Blast.API.Core.Processes; +using Blast.API.Processes; +using Blast.Core.Interfaces; +using Blast.Core.Objects; +using Blast.Core.Results; +using Dasync.Collections; using TextCopy; using static WikiPreview.Fluent.Plugin.WikiPreviewSearchResult; using static WikiPreview.Fluent.Plugin.WikiResult; +using static WikiPreview.Fluent.Plugin.ResultGenerator; namespace WikiPreview.Fluent.Plugin { internal class WikiPreviewSearchApp : ISearchApplication { - private const string SearchAppName = "WikiPreview"; + public const string SearchAppName = "WikiPreview"; public const string WikiSearchTagName = "Wiki"; - private const string UserAgentString = "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"; + public const string UserAgentString = "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"; + public static readonly JsonSerializerOptions SerializerOptions = new() { PropertyNameCaseInsensitive = true }; private readonly SearchApplicationInfo _applicationInfo; - private readonly JsonSerializerOptions _serializerOptions = new() {PropertyNameCaseInsensitive = true}; + private readonly WikiSettings _wikiSettings; public WikiPreviewSearchApp() { @@ -41,8 +39,11 @@ public WikiPreviewSearchApp() SearchTagOnly = true, ApplicationIconGlyph = SearchResultIcon, SearchAllTime = ApplicationSearchTime.Fast, - DefaultSearchTags = SearchTags + DefaultSearchTags = SearchTags, + PluginName = "Wikipedia Preview" }; + + _applicationInfo.SettingsPage = _wikiSettings = new WikiSettings(_applicationInfo); } public SearchApplicationInfo GetApplicationInfo() @@ -56,6 +57,7 @@ public ValueTask HandleSearchResult(ISearchResult searchResult) throw new InvalidCastException(nameof(WikiPreviewSearchResult)); string displayedName = wikiPreviewSearchResult.DisplayedName; + if (string.IsNullOrWhiteSpace(displayedName)) return new ValueTask(new HandleResult(true, false)); @@ -73,8 +75,19 @@ public ValueTask HandleSearchResult(ISearchResult searchResult) if (!string.IsNullOrWhiteSpace(actionUrl)) managerInstance.StartNewProcess(actionUrl); } + else if (wikiPreviewSearchResult.SelectedOperation.OperationName == CopyContentsStr) + { + string contents = wikiPreviewSearchResult.ResultName; + if (!string.IsNullOrWhiteSpace(contents)) + Clipboard.SetText(contents); + } else { + string pageUrl = wikiPreviewSearchResult.Url; + + if (string.IsNullOrWhiteSpace(pageUrl)) + return new ValueTask(new HandleResult(true, false)); + string wikiUrl = WikiRootUrl + wikiPreviewSearchResult.Url; Clipboard.SetText(wikiUrl); } @@ -84,6 +97,7 @@ public ValueTask HandleSearchResult(ISearchResult searchResult) public ValueTask LoadSearchApplicationAsync() { + SetImageSizePrefs(_wikiSettings.ImageSize); return ValueTask.CompletedTask; } @@ -94,20 +108,30 @@ public async IAsyncEnumerable SearchAsync(SearchRequest searchReq string searchedText = searchRequest.SearchedText; searchedText = searchedText.Trim(); - if (string.IsNullOrWhiteSpace(searchedTag) || + if (!string.IsNullOrWhiteSpace(searchedTag) && !searchedTag.Equals(WikiSearchTagName, StringComparison.OrdinalIgnoreCase) || string.IsNullOrWhiteSpace(searchedText)) yield break; + // Change ImageSize in Singleton Instance whenever User Settings has been changed. + int currentImageSize = GetImageSizePrefs(); + int userSetSize = _wikiSettings.ImageSize; + if (currentImageSize != userSetSize) SetImageSizePrefs(userSetSize); + + // Wiki Namespace set to 0 for searching in main articles only. QueryConfiguration queryConfiguration = new() - {SearchTerm = searchedText, WikiNameSpace = 0, ImageSize = 100, ResultsCount = 8}; + { + SearchTerm = searchedText, WikiNameSpace = 0, ImageSize = userSetSize, + ResultsCount = _wikiSettings.MaxResults, LoadImage = _wikiSettings.LoadImages + }; + string url = GetFormattedUrl(queryConfiguration); using var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.UserAgent.TryParseAdd(UserAgentString); var channel = Channel.CreateUnbounded(); - _ = httpClient.GetFromJsonAsync(url, _serializerOptions, cancellationToken).ContinueWith(task => + _ = httpClient.GetFromJsonAsync(url, SerializerOptions, cancellationToken).ContinueWith(task => { if (task.IsCompletedSuccessfully) _ = task.Result?.Query.Pages.ParallelForEachAsync(async entry => @@ -134,56 +158,7 @@ public async ValueTask GetSearchResultForId(object searchObjectId if (string.IsNullOrWhiteSpace(pageId)) return default; - string url = "https://en.wikipedia.org/w/api.php?action=query&prop=extracts|pageimages&pageids=" + - pageId + - "&explaintext&exintro&pilicense=any&pithumbsize=100&format=json"; - - using var httpClient = new HttpClient(); - httpClient.DefaultRequestHeaders.UserAgent.TryParseAdd(UserAgentString); - var wiki = await httpClient.GetFromJsonAsync(url, _serializerOptions); - if (wiki == null) return default; - - Dictionary.ValueCollection pages = wiki.Query.Pages.Values; - if (pages is {Count: 0}) return default; - - PageView pageView = pages.First(); - return await GenerateSearchResult(pageView, pageView?.Title); - } - - private static async ValueTask GenerateSearchResult(PageView value, - string searchedText) - { - string resultName = value.Extract; - string displayedName = value.Title; - double score = displayedName.SearchDistanceScore(searchedText); - string pageId = value.PageId.ToString(); - string wikiUrl = displayedName.Replace(' ', '_'); - BitmapImageResult bitmapImageResult; - - if (value.Thumbnail != null) - { - string imgUrl = value.Thumbnail.Source; - using var imageClient = new HttpClient(); - imageClient.DefaultRequestHeaders.UserAgent.TryParseAdd(UserAgentString); - Stream stream = await imageClient.GetStreamAsync(imgUrl); - bitmapImageResult = new BitmapImageResult(new Bitmap(stream)); - } - else - { - bitmapImageResult = null; - } - - return new WikiPreviewSearchResult - { - Url = wikiUrl, - PreviewImage = bitmapImageResult, - DisplayedName = displayedName, - ResultName = resultName, - SearchedText = searchedText, - Score = score, - SearchObjectId = pageId, - PinUniqueId = pageId - }; + return await GenerateOnDemand(pageId); } } -} +} \ No newline at end of file diff --git a/WikiPreview.Fluent.Plugin/WikiPreviewSearchOperation.cs b/WikiPreview.Fluent.Plugin/WikiPreviewSearchOperation.cs index 2710f0e..203fe5e 100644 --- a/WikiPreview.Fluent.Plugin/WikiPreviewSearchOperation.cs +++ b/WikiPreview.Fluent.Plugin/WikiPreviewSearchOperation.cs @@ -32,4 +32,4 @@ private WikiPreviewSearchOperation(ActionType actionType, string actionName, str public static WikiPreviewSearchOperation OpenGoogle { get; } = new(ActionType.GoogleSearch, "Search in Google", "Search with Google.", "\uE721"); } -} +} \ No newline at end of file diff --git a/WikiPreview.Fluent.Plugin/WikiPreviewSearchResult.cs b/WikiPreview.Fluent.Plugin/WikiPreviewSearchResult.cs index ab66356..3a9a797 100644 --- a/WikiPreview.Fluent.Plugin/WikiPreviewSearchResult.cs +++ b/WikiPreview.Fluent.Plugin/WikiPreviewSearchResult.cs @@ -1,5 +1,6 @@ using System.Collections.ObjectModel; using System.Text; +using Avalonia.Input; using Blast.API.Search.SearchOperations; using Blast.Core.Interfaces; using Blast.Core.Results; @@ -15,6 +16,7 @@ public sealed class WikiPreviewSearchResult : SearchResultBase public const string GoogleSearchUrl = "https://www.google.com/search?q="; public const string SearchResultIcon = "\uEDE4"; public const string TagDescription = "Search in Wikipedia"; + public const string CopyContentsStr = "Copy Contents"; public static readonly ObservableCollection SupportedOperationCollections = new() @@ -22,7 +24,9 @@ public static readonly ObservableCollection SupportedOperation OpenWiki, OpenWikiWand, OpenGoogle, - new CopySearchOperation("Copy URL") {Description = "Copies the Wikipedia Page URL to Clipboard."} + new CopySearchOperation("Copy URL") { Description = "Copies the Wikipedia Page URL to Clipboard." }, + new CopySearchOperation("Copy Contents") + { Description = "Copy the Contents of the Result.", KeyGesture = new KeyGesture(Key.None) } }; public static readonly ObservableCollection SearchTags = new() @@ -35,12 +39,16 @@ public static readonly ObservableCollection SupportedOperation } }; - public WikiPreviewSearchResult() + private readonly WikiResultPreviewControlBuilder _wikiResultPreviewControlBuilder = new(); + + public WikiPreviewSearchResult(string resultName) { Tags = SearchTags; SupportedOperations = SupportedOperationCollections; IconGlyph = SearchResultIcon; ResultType = WikiSearchTagName; + ResultName = resultName; + ResultPreviewControlBuilder = _wikiResultPreviewControlBuilder; } public string Url { get; set; } @@ -58,14 +66,22 @@ public static string GetFormattedUrl(QueryConfiguration queryConfiguration) builder.Append("&gsrlimit="); builder.Append(queryConfiguration.ResultsCount); - builder.Append("&prop=pageimages|extracts&exintro&explaintext&pilicense=any&format=json&pithumbsize="); - builder.Append(queryConfiguration.ImageSize); + if (queryConfiguration.LoadImage) + { + builder.Append("&prop=pageimages|extracts&exintro&explaintext&pilicense=any&format=json&pithumbsize="); + builder.Append(queryConfiguration.ImageSize); + } + else + { + builder.Append("&prop=extracts&exintro&explaintext&format=json"); + } return builder.ToString(); } protected override void OnSelectedSearchResultChanged() { + // Empty } } -} +} \ No newline at end of file diff --git a/WikiPreview.Fluent.Plugin/WikiResult.cs b/WikiPreview.Fluent.Plugin/WikiResult.cs index 1c0d76c..88ef5f3 100644 --- a/WikiPreview.Fluent.Plugin/WikiResult.cs +++ b/WikiPreview.Fluent.Plugin/WikiResult.cs @@ -2,7 +2,7 @@ namespace WikiPreview.Fluent.Plugin { - internal static class WikiResult + public static class WikiResult { public class PageView { diff --git a/WikiPreview.Fluent.Plugin/WikiResultPreviewControlBuilder.cs b/WikiPreview.Fluent.Plugin/WikiResultPreviewControlBuilder.cs new file mode 100644 index 0000000..5b0832b --- /dev/null +++ b/WikiPreview.Fluent.Plugin/WikiResultPreviewControlBuilder.cs @@ -0,0 +1,218 @@ +using System; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Avalonia; +using Avalonia.Controls; +using Avalonia.Controls.Primitives; +using Avalonia.Input; +using Avalonia.Interactivity; +using Avalonia.Layout; +using Avalonia.Markup.Xaml.MarkupExtensions; +using Avalonia.Media; +using Avalonia.Media.Imaging; +using Blast.API.Core.Processes; +using Blast.API.Graphics; +using Blast.API.Processes; +using Blast.Core.Interfaces; +using TextCopy; +using static WikiPreview.Fluent.Plugin.WikiPreviewSearchResult; +using static System.Environment; +using static WikiPreview.Fluent.Plugin.WikiPreviewSearchApp; +using static WikiPreview.Fluent.Plugin.ResultGenerator; + +namespace WikiPreview.Fluent.Plugin +{ + /// + /// Builds a custom preview for Wiki Results. + /// + public class WikiResultPreviewControlBuilder : IResultPreviewControlBuilder + { + private const string GoogleStr = "Search Google"; + private const string WikipediaStr = "Wikipedia"; + private const string CopyStr = "Copy Text"; + + public WikiResultPreviewControlBuilder() + { + PreviewBuilderDescriptor = new PreviewBuilderDescriptor + { + Name = "Wikipedia Preview", + Description = "Displays the Wikipedia Article Information within Fluent Search.", + ShowPreviewAutomatically = true + }; + } + + public bool CanBuildPreviewForResult(ISearchResult searchResult) + { + string appName = searchResult?.SearchApp; + if (string.Equals(appName, SearchAppName, + StringComparison.OrdinalIgnoreCase)) return true; + + string host = searchResult?.Context; + if (string.IsNullOrWhiteSpace(host)) return false; + + bool result = Uri.TryCreate(host, UriKind.Absolute, out Uri uri) + && uri.Scheme == Uri.UriSchemeHttps; + + if (!result) return false; + + host = uri.Host[3..]; + return host.StartsWith("wikipedia.org") && uri.Segments.Length == 3 && uri.Fragment.Length == 0; + } + + public ValueTask CreatePreviewControl(ISearchResult searchResult) + { + if (searchResult is WikiPreviewSearchResult result) + { + Control control = GeneratePreview(result); + return new ValueTask(control); + } + + string pageName = searchResult.Context.Split('/').Last(); + return GenerateFromTitle(pageName); + } + + public PreviewBuilderDescriptor PreviewBuilderDescriptor { get; } + + private static async ValueTask GenerateFromTitle(string pageName) + { + WikiPreviewSearchResult searchResult = await GenerateOnDemand(pageName, true); + + if (string.IsNullOrWhiteSpace(searchResult?.ResultName)) return default; + + Control control = GeneratePreview(searchResult); + return control; + } + + private static Control GeneratePreview(WikiPreviewSearchResult searchResult) + { + string text = searchResult.ResultName; + + // double the new lines for better reading. + text = Regex.Replace(text, @"\r\n?|\n", NewLine + NewLine); + + // StackPanel to store image and text. + var wikiDetails = new DockPanel(); + + // creates image control. + if (searchResult.PreviewImage is { IsEmpty: false }) + { + Bitmap wikiBitmap = searchResult.PreviewImage.ConvertToAvaloniaBitmap(); + + if (wikiBitmap is { Size: { IsDefault: false } }) + { + var imageControl = new Border + { + Background = new ImageBrush(wikiBitmap) + { + Stretch = Stretch.UniformToFill + }, + CornerRadius = new CornerRadius(5.0), + BorderThickness = new Thickness(5.0), + Height = wikiBitmap.Size.Height, + Width = wikiBitmap.Size.Width, + MaxHeight = GetImageSizePrefs(), + MaxWidth = GetImageSizePrefs() + }; + + wikiDetails.Children.Add(imageControl); + imageControl.SetValue(DockPanel.DockProperty, Dock.Top); + } + } + + // creates article content. + var wikiDescription = new TextBlock + { + Text = text, Padding = new Thickness(5, 10, 5, 0), TextWrapping = TextWrapping.Wrap, + TextTrimming = TextTrimming.WordEllipsis + }; + + wikiDetails.Children.Add(wikiDescription); + + var scrollViewer = new ScrollViewer + { + Content = wikiDetails, + VerticalScrollBarVisibility = ScrollBarVisibility.Hidden, + Margin = new Thickness(0, 0, 0, 5) + }; + + scrollViewer.PointerEnter += ScrollViewerOnPointerEnter; + scrollViewer.PointerLeave += ScrollViewerOnPointerLeave; + + // Create Parent Grid. + var grid = new Grid + { + Margin = new Thickness(10.0, 0, 10, 10) + }; + + grid.RowDefinitions.Add(new RowDefinition()); + grid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto }); + grid.Children.Add(scrollViewer); + + Button openWiki = CreateOperationButton(WikipediaStr, searchResult.Url); + Button searchGoogle = CreateOperationButton(GoogleStr, searchResult.DisplayedName); + Button copyContents = CreateOperationButton(CopyStr, text); + + var uniformGrid = new UniformGrid + { + Columns = 3, + Rows = 0 + }; + + uniformGrid.Children.Add(openWiki); + uniformGrid.Children.Add(searchGoogle); + uniformGrid.Children.Add(copyContents); + + // add buttons grid to the bottom row. + Grid.SetRow(uniformGrid, 1); + grid.Children.Add(uniformGrid); + + return grid; + } + + private static void ScrollViewerOnPointerLeave(object sender, PointerEventArgs e) + { + if (sender is ScrollViewer scrollViewer) + scrollViewer.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden; + } + + private static void ScrollViewerOnPointerEnter(object sender, PointerEventArgs e) + { + if (sender is ScrollViewer scrollViewer) + scrollViewer.VerticalScrollBarVisibility = ScrollBarVisibility.Auto; + } + + private static Button CreateOperationButton(string text, string tag) + { + var button = new Button + { + Content = text, + Margin = new Thickness(0, 0, 5, 0), + HorizontalAlignment = HorizontalAlignment.Stretch, + VerticalAlignment = VerticalAlignment.Stretch, + Tag = tag, + [!TemplatedControl.BackgroundProperty] = new DynamicResourceExtension("TextControlBackground") + }; + + button.Click += ExecuteOperations; + return button; + } + + private static void ExecuteOperations(object sender, RoutedEventArgs e) + { + var button = sender as Button; + string buttonContent = button?.Content.ToString(); + if (string.IsNullOrWhiteSpace(buttonContent)) return; + + string buttonTag = button.Tag?.ToString(); + if (string.IsNullOrWhiteSpace(buttonTag)) return; + + IProcessManager managerInstance = ProcessUtils.GetManagerInstance(); + if (buttonContent.Contains(WikipediaStr)) + managerInstance.StartNewProcess(WikiRootUrl + buttonTag); + else if (buttonContent.Contains(GoogleStr)) + managerInstance.StartNewProcess(GoogleSearchUrl + buttonTag); + else if (buttonContent.Contains(CopyStr)) Clipboard.SetText(buttonTag); + } + } +} diff --git a/WikiPreview.Fluent.Plugin/WikiSettings.cs b/WikiPreview.Fluent.Plugin/WikiSettings.cs new file mode 100644 index 0000000..2460f93 --- /dev/null +++ b/WikiPreview.Fluent.Plugin/WikiSettings.cs @@ -0,0 +1,28 @@ +using Blast.API.Settings; +using Blast.Core.Objects; +using static WikiPreview.Fluent.Plugin.WikiPreviewSearchResult; + +namespace WikiPreview.Fluent.Plugin +{ + public class WikiSettings : SearchApplicationSettingsPage + { + public WikiSettings(SearchApplicationInfo applicationInfo) : base(applicationInfo) + { + } + + [Setting(Name = "Max Results", Description = "Control number of results from Wikipedia", MinValue = 1, + MaxValue = 30, + DefaultValue = 8, IconGlyph = SearchResultIcon)] + public int MaxResults { get; set; } = 8; + + [Setting(Name = "Load Images", Description = "Whether to retrieve and load images from Wikipedia", + DefaultValue = true, IconGlyph = "\uEB9F")] + public bool LoadImages { get; set; } = true; + + [Setting(Name = "Max Image Size", + Description = "Sets the max image size shown in the Preview window", + DefaultValue = 150, IconGlyph = "\uE91B", MinValue = 80, MaxValue = 300, + IsAdvanced = true)] + public int ImageSize { get; set; } = 150; + } +} \ No newline at end of file diff --git a/WikiPreview.Fluent.Plugin/Wikipedia-logo.png b/WikiPreview.Fluent.Plugin/Wikipedia-logo.png new file mode 100644 index 0000000..0599207 Binary files /dev/null and b/WikiPreview.Fluent.Plugin/Wikipedia-logo.png differ diff --git a/pluginsInfo.json b/pluginsInfo.json index 09af6b2..f93bca9 100644 --- a/pluginsInfo.json +++ b/pluginsInfo.json @@ -1 +1 @@ -{"IsEnabled":true,"InstalledVersion":"1.2.0.0","Name":"WikiPreview","DisplayName":"Wikipedia Preview","Description":"Display Wikipedia Content in Fluent Search","PublisherName":"Makesh Vineeth","Version":"1.2.0.0","URL":"https://github.com/MakeshVineeth/WikiPreview.Fluent.Plugin","DownloadURL":"https://github.com/MakeshVineeth/WikiPreview.Fluent.Plugin/releases/","IconUrl":"","IconGlyph":"\uEDE4","PreviewImage":null} \ No newline at end of file +{"IsEnabled":true,"InstalledVersion":"1.3.0.0","Name":"WikiPreview","DisplayName":"Wikipedia Preview","Description":"Display Wikipedia Content in Fluent Search","PublisherName":"Makesh Vineeth","Version":"1.2.0.0","URL":"https://github.com/MakeshVineeth/WikiPreview.Fluent.Plugin","DownloadURL":"https://github.com/MakeshVineeth/WikiPreview.Fluent.Plugin/releases/","IconUrl":"","IconGlyph":"\uEDE4","PreviewImage":null} \ No newline at end of file