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