diff --git a/AideDeJeu/AideDeJeu/App.xaml.cs b/AideDeJeu/AideDeJeu/App.xaml.cs index 430cedba..740ba218 100644 --- a/AideDeJeu/AideDeJeu/App.xaml.cs +++ b/AideDeJeu/AideDeJeu/App.xaml.cs @@ -16,6 +16,7 @@ namespace AideDeJeu DependencyService.Register(); DependencyService.Register(); + DependencyService.Register(); var vm = DependencyService.Get(); var tabbeddPage = new AideDeJeu.Views.MainTabbedPage(); //var mainPage = new ItemDetailPage(new ItemDetailViewModel(new HomeItem()) { Title = "Haches & Dés" }); diff --git a/AideDeJeu/AideDeJeu/Markdig/MarkdownExtensions.cs b/AideDeJeu/AideDeJeu/Markdig/MarkdownExtensions.cs index e806d5c6..65c8a1e1 100644 --- a/AideDeJeu/AideDeJeu/Markdig/MarkdownExtensions.cs +++ b/AideDeJeu/AideDeJeu/Markdig/MarkdownExtensions.cs @@ -16,6 +16,7 @@ namespace AideDeJeu.Tools { public static class MarkdownExtensions { + /* public static Item ToItem(string md) { var pipeline = new MarkdownPipelineBuilder().UsePipeTables().Build(); @@ -216,7 +217,7 @@ namespace AideDeJeu.Tools } return null; } - + */ /* public static Item ToItem(string md) diff --git a/AideDeJeu/AideDeJeu/ViewModels/BaseViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/BaseViewModel.cs index 809f1dfb..af2e20b1 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/BaseViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/BaseViewModel.cs @@ -23,6 +23,13 @@ namespace AideDeJeu.ViewModels return DependencyService.Get(); } } + public StoreViewModel Store + { + get + { + return DependencyService.Get(); + } + } bool isBusy = false; public bool IsBusy diff --git a/AideDeJeu/AideDeJeu/ViewModels/DeepSearchViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/DeepSearchViewModel.cs index 23ed3775..ee8108e4 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/DeepSearchViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/DeepSearchViewModel.cs @@ -23,13 +23,13 @@ namespace AideDeJeu.ViewModels public async Task ExecuteSearchCommandAsync(string searchText) { Main.IsLoading = true; - await Task.Run(async () => await Main.PreloadAllItemsAsync()); - Items = await Task.Run(async () => await Main.DeepSearchAllItemsAsync(searchText)); + await Task.Run(async () => await Store.PreloadAllItemsAsync()); + Items = await Task.Run(async () => await DeepSearchAllItemsAsync(searchText)); Main.IsLoading = false; } - public IEnumerable _Items = null; - public IEnumerable Items + public IEnumerable _Items = null; + public IEnumerable Items { get { @@ -40,5 +40,47 @@ namespace AideDeJeu.ViewModels SetProperty(ref _Items, value); } } + + public class SearchedItem + { + public string Preview { get; set; } + public Item Item { get; set; } + } + + public async Task> DeepSearchAllItemsAsync(string searchText) + { + List primaryItems = new List(); + List secondaryItems = new List(); + var cleanSearchText = Tools.Helpers.RemoveDiacritics(searchText).ToLower(); + foreach (var allItem in Store._AllItems) + { + foreach (var item in allItem.Value.Anchors) + { + var name = item.Value.Name; + var cleanName = Tools.Helpers.RemoveDiacritics(name).ToLower(); + if (cleanName.Contains(cleanSearchText)) + { + primaryItems.Add(new SearchedItem() { Item = item.Value, Preview = name }); + } + else + { + var markdown = item.Value.Markdown; + var cleanMarkdown = Tools.Helpers.RemoveDiacritics(markdown).ToLower(); + if (cleanMarkdown.Contains(cleanSearchText)) + { + int position = cleanMarkdown.IndexOf(cleanSearchText); + int startPosition = Math.Max(0, position - 30); + int endPosition = Math.Min(markdown.Length, position + searchText.Length + 30); + var preview = markdown.Substring(startPosition, endPosition - startPosition - 1); + secondaryItems.Add(new SearchedItem() { Item = item.Value, Preview = preview }); + } + } + } + } + primaryItems.AddRange(secondaryItems); + return primaryItems; + } + + } } diff --git a/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs index b3103eb3..e7b8c3a2 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs @@ -18,7 +18,7 @@ namespace AideDeJeu.ViewModels get => _isLoading; set => SetProperty(ref _isLoading, value); } - + /* void AddAnchor(string source, Dictionary anchors, Item item) { if (item != null && item.Name != null) @@ -164,7 +164,7 @@ namespace AideDeJeu.ViewModels } return itemWithAnchors.Item; } - + */ public Command LoadItemsCommand { get; private set; } private Navigator _Navigator = null; diff --git a/AideDeJeu/AideDeJeu/ViewModels/Navigator.cs b/AideDeJeu/AideDeJeu/ViewModels/Navigator.cs index 13764e83..7623c030 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/Navigator.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/Navigator.cs @@ -147,7 +147,7 @@ namespace AideDeJeu.ViewModels var with = match.Groups["with"].Value; Main.IsBusy = true; Main.IsLoading = true; - var item = await Task.Run(async () => await Main.GetItemFromDataAsync(file, anchor)); + var item = await Task.Run(async () => await Store.GetItemFromDataAsync(file, anchor)); Main.IsBusy = false; Main.IsLoading = false; if (item != null) diff --git a/AideDeJeu/AideDeJeu/ViewModels/StoreViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/StoreViewModel.cs new file mode 100644 index 00000000..01572a73 --- /dev/null +++ b/AideDeJeu/AideDeJeu/ViewModels/StoreViewModel.cs @@ -0,0 +1,333 @@ +using AideDeJeu.Tools; +using AideDeJeuLib; +using Markdig; +using Markdig.Parsers; +using Markdig.Syntax; +using Markdig.Syntax.Inlines; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace AideDeJeu.ViewModels +{ + public class StoreViewModel : BaseViewModel + { + public static Item ToItem(string md) + { + var pipeline = new MarkdownPipelineBuilder().UsePipeTables().Build(); + var document = MarkdownParser.Parse(md, pipeline); + + var enumerator = document.GetEnumerator(); + try + { + enumerator.MoveNext(); + while (enumerator.Current != null) + { + var block = enumerator.Current; + + if (block is HtmlBlock) + { + if (IsNewItem(block)) + { + var item = ParseItem(ref enumerator); + return item; + } + } + enumerator.MoveNext(); + } + + } + finally + { + enumerator.Dispose(); + } + return null; + } + + public static Item ParseItem(ref ContainerBlock.Enumerator enumerator) + { + var currentItem = GetNewItem(enumerator.Current); + + if (currentItem != null) + { + enumerator.MoveNext(); + while (enumerator.Current != null) + { + var block = enumerator.Current; + + if (block is HtmlBlock) + { + if (IsClosingItem(block)) + { + return currentItem; + } + else if (IsNewItem(block)) + { + var subItem = ParseItem(ref enumerator); + + var propertyName = subItem.GetType().Name; + + if (currentItem.GetType().GetProperty(propertyName) != null) + { + PropertyInfo prop = currentItem.GetType().GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance); + if (null != prop && prop.CanWrite) + { + prop.SetValue(currentItem, subItem, null); + } + } + else if (currentItem is Items) + { + var items = currentItem as Items; + items.Add(subItem); + } + } + } + + else // if (block is ContainerBlock) + { + ParseItemProperties(currentItem, block); + } + + currentItem.Markdown += enumerator.Current.ToMarkdownString(); + + enumerator.MoveNext(); + } + } + + return currentItem; + } + + public static void ParseItemProperties(Item item, Block block) + { + switch (block) + { + case Markdig.Extensions.Tables.Table table: + ParseItemProperties(item, table); + break; + case ContainerBlock blocks: + ParseItemProperties(item, blocks); + break; + case LeafBlock leaf: + ParseItemProperties(item, leaf.Inline); + break; + } + } + + public static void ParseItemProperties(Item item, ContainerBlock blocks) + { + foreach (var block in blocks) + { + ParseItemProperties(item, block); + } + } + + public static void ParseItemProperties(Item item, ContainerInline inlines) + { + if (inlines == null) + { + return; + } + PropertyInfo prop = null; + foreach (var inline in inlines) + { + if (inline is HtmlInline) + { + var tag = (inline as HtmlInline).Tag; + if (tag == "" || tag == "
") + { + + } + else if (tag.StartsWith("" && tag != "
") + { + if (tag.StartsWith("" && tag != "
") + { + if (tag.StartsWith("" && tag != "
") + { + if (tag.StartsWith("